mirror of
https://github.com/wger-project/flutter.git
synced 2026-02-18 00:17:48 +01:00
Further work on reworking the exercise provider
This commit is contained in:
@@ -20,11 +20,10 @@ import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:wger/models/exercises/category.dart';
|
||||
import 'package:wger/models/exercises/comment.dart';
|
||||
import 'package:wger/models/exercises/equipment.dart';
|
||||
import 'package:wger/models/exercises/exercise.dart';
|
||||
import 'package:wger/models/exercises/image.dart';
|
||||
import 'package:wger/models/exercises/muscle.dart';
|
||||
|
||||
import 'exercise2.dart';
|
||||
|
||||
part 'base.g.dart';
|
||||
|
||||
@JsonSerializable(explicitToJson: true)
|
||||
@@ -69,7 +68,7 @@ class ExerciseBase {
|
||||
List<ExerciseImage> images = [];
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
List<Exercise2> exercises = [];
|
||||
List<Exercise> exercises = [];
|
||||
|
||||
ExerciseBase(
|
||||
{required this.id,
|
||||
|
||||
@@ -17,22 +17,33 @@
|
||||
*/
|
||||
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:wger/models/exercises/base.dart';
|
||||
import 'package:wger/models/exercises/category.dart';
|
||||
import 'package:wger/models/exercises/comment.dart';
|
||||
import 'package:wger/models/exercises/equipment.dart';
|
||||
import 'package:wger/models/exercises/image.dart';
|
||||
import 'package:wger/models/exercises/language.dart';
|
||||
import 'package:wger/models/exercises/muscle.dart';
|
||||
|
||||
part 'exercise.g.dart';
|
||||
|
||||
@JsonSerializable(explicitToJson: true)
|
||||
@JsonSerializable()
|
||||
class Exercise {
|
||||
@JsonKey(required: true)
|
||||
final int id;
|
||||
|
||||
@JsonKey(required: true, name: 'exercise_base')
|
||||
final int baseId;
|
||||
|
||||
@JsonKey(required: true)
|
||||
final String uuid;
|
||||
|
||||
@JsonKey(required: true, name: 'language')
|
||||
final int languageId;
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
late Language language;
|
||||
|
||||
@JsonKey(required: true, name: 'creation_date')
|
||||
final DateTime creationDate;
|
||||
|
||||
@@ -42,62 +53,37 @@ class Exercise {
|
||||
@JsonKey(required: true)
|
||||
final String description;
|
||||
|
||||
@JsonKey(required: false, ignore: true)
|
||||
late int categoryId;
|
||||
@JsonKey(ignore: true)
|
||||
late ExerciseBase base;
|
||||
|
||||
@JsonKey(required: true, name: 'category')
|
||||
late final ExerciseCategory categoryObj;
|
||||
|
||||
@JsonKey(required: true)
|
||||
List<Muscle> muscles = [];
|
||||
|
||||
@JsonKey(required: true, name: 'muscles_secondary')
|
||||
List<Muscle> musclesSecondary = [];
|
||||
|
||||
@JsonKey(required: true)
|
||||
List<Equipment> equipment = [];
|
||||
|
||||
@JsonKey(required: true)
|
||||
List<ExerciseImage> images = [];
|
||||
|
||||
@JsonKey(required: true, name: 'comments')
|
||||
@JsonKey(ignore: true)
|
||||
List<Comment> tips = [];
|
||||
|
||||
Exercise(
|
||||
{required this.id,
|
||||
required this.baseId,
|
||||
required this.uuid,
|
||||
required this.creationDate,
|
||||
required this.languageId,
|
||||
required this.name,
|
||||
required this.description,
|
||||
List<Muscle>? muscles,
|
||||
List<Muscle>? musclesSecondary,
|
||||
List<Equipment>? equipment,
|
||||
List<ExerciseImage>? images,
|
||||
List<Comment>? tips,
|
||||
ExerciseCategory? category}) {
|
||||
this.tips = tips ?? [];
|
||||
this.images = images ?? [];
|
||||
this.equipment = equipment ?? [];
|
||||
this.musclesSecondary = musclesSecondary ?? [];
|
||||
this.muscles = muscles ?? [];
|
||||
if (category != null) {
|
||||
this.categoryObj = category;
|
||||
this.categoryId = category.id;
|
||||
base,
|
||||
language}) {
|
||||
if (base != null) {
|
||||
this.base = base;
|
||||
}
|
||||
|
||||
if (language != null) {
|
||||
this.language = language;
|
||||
}
|
||||
}
|
||||
|
||||
ExerciseImage? get getMainImage {
|
||||
try {
|
||||
return images.firstWhere((image) => image.isMain);
|
||||
} on StateError catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
set category(ExerciseCategory category) {
|
||||
this.categoryId = category.id;
|
||||
this.categoryObj = category;
|
||||
}
|
||||
ExerciseImage? get getMainImage => base.getMainImage;
|
||||
ExerciseCategory get category => base.category;
|
||||
List<ExerciseImage> get images => base.images;
|
||||
List<Equipment> get equipment => base.equipment;
|
||||
List<Muscle> get muscles => base.muscles;
|
||||
List<Muscle> get musclesSecondary => base.musclesSecondary;
|
||||
|
||||
// Boilerplate
|
||||
factory Exercise.fromJson(Map<String, dynamic> json) => _$ExerciseFromJson(json);
|
||||
|
||||
@@ -9,53 +9,30 @@ part of 'exercise.dart';
|
||||
Exercise _$ExerciseFromJson(Map<String, dynamic> json) {
|
||||
$checkKeys(json, requiredKeys: const [
|
||||
'id',
|
||||
'exercise_base',
|
||||
'uuid',
|
||||
'language',
|
||||
'creation_date',
|
||||
'name',
|
||||
'description',
|
||||
'category',
|
||||
'muscles',
|
||||
'muscles_secondary',
|
||||
'equipment',
|
||||
'images',
|
||||
'comments'
|
||||
'description'
|
||||
]);
|
||||
return Exercise(
|
||||
id: json['id'] as int,
|
||||
baseId: json['exercise_base'] as int,
|
||||
uuid: json['uuid'] as String,
|
||||
creationDate: DateTime.parse(json['creation_date'] as String),
|
||||
languageId: json['language'] as int,
|
||||
name: json['name'] as String,
|
||||
description: json['description'] as String,
|
||||
muscles: (json['muscles'] as List<dynamic>?)
|
||||
?.map((e) => Muscle.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
musclesSecondary: (json['muscles_secondary'] as List<dynamic>?)
|
||||
?.map((e) => Muscle.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
equipment: (json['equipment'] as List<dynamic>?)
|
||||
?.map((e) => Equipment.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
images: (json['images'] as List<dynamic>?)
|
||||
?.map((e) => ExerciseImage.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
tips: (json['comments'] as List<dynamic>?)
|
||||
?.map((e) => Comment.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
)..categoryObj =
|
||||
ExerciseCategory.fromJson(json['category'] as Map<String, dynamic>);
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> _$ExerciseToJson(Exercise instance) => <String, dynamic>{
|
||||
'id': instance.id,
|
||||
'exercise_base': instance.baseId,
|
||||
'uuid': instance.uuid,
|
||||
'language': instance.languageId,
|
||||
'creation_date': instance.creationDate.toIso8601String(),
|
||||
'name': instance.name,
|
||||
'description': instance.description,
|
||||
'category': instance.categoryObj.toJson(),
|
||||
'muscles': instance.muscles.map((e) => e.toJson()).toList(),
|
||||
'muscles_secondary':
|
||||
instance.musclesSecondary.map((e) => e.toJson()).toList(),
|
||||
'equipment': instance.equipment.map((e) => e.toJson()).toList(),
|
||||
'images': instance.images.map((e) => e.toJson()).toList(),
|
||||
'comments': instance.tips.map((e) => e.toJson()).toList(),
|
||||
};
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
/*
|
||||
* This file is part of wger Workout Manager <https://github.com/wger-project>.
|
||||
* Copyright (C) 2020, 2021 wger Team
|
||||
*
|
||||
* wger Workout Manager is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:wger/models/exercises/base.dart';
|
||||
import 'package:wger/models/exercises/category.dart';
|
||||
import 'package:wger/models/exercises/comment.dart';
|
||||
import 'package:wger/models/exercises/equipment.dart';
|
||||
import 'package:wger/models/exercises/image.dart';
|
||||
import 'package:wger/models/exercises/language.dart';
|
||||
import 'package:wger/models/exercises/muscle.dart';
|
||||
|
||||
part 'exercise2.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class Exercise2 {
|
||||
@JsonKey(required: true)
|
||||
final int id;
|
||||
|
||||
@JsonKey(required: true, name: 'exercise_base')
|
||||
final int baseId;
|
||||
|
||||
@JsonKey(required: true)
|
||||
final String uuid;
|
||||
|
||||
@JsonKey(required: true, name: 'language')
|
||||
final int languageId;
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
late Language language;
|
||||
|
||||
@JsonKey(required: true, name: 'creation_date')
|
||||
final DateTime creationDate;
|
||||
|
||||
@JsonKey(required: true)
|
||||
final String name;
|
||||
|
||||
@JsonKey(required: true)
|
||||
final String description;
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
late ExerciseBase base;
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
List<Comment> tips = [];
|
||||
|
||||
Exercise2(
|
||||
{required this.id,
|
||||
required this.baseId,
|
||||
required this.uuid,
|
||||
required this.creationDate,
|
||||
required this.languageId,
|
||||
required this.name,
|
||||
required this.description,
|
||||
base,
|
||||
language}) {
|
||||
if (base != null) {
|
||||
this.base = base;
|
||||
}
|
||||
|
||||
if (language != null) {
|
||||
this.language = language;
|
||||
}
|
||||
}
|
||||
|
||||
ExerciseImage? get getMainImage => base.getMainImage;
|
||||
ExerciseCategory get category => base.category;
|
||||
List<Equipment> get equipment => base.equipment;
|
||||
List<Muscle> get muscles => base.muscles;
|
||||
List<Muscle> get musclesSecondary => base.musclesSecondary;
|
||||
|
||||
// Boilerplate
|
||||
factory Exercise2.fromJson(Map<String, dynamic> json) => _$Exercise2FromJson(json);
|
||||
Map<String, dynamic> toJson() => _$Exercise2ToJson(this);
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'exercise2.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
Exercise2 _$Exercise2FromJson(Map<String, dynamic> json) {
|
||||
$checkKeys(json, requiredKeys: const [
|
||||
'id',
|
||||
'exercise_base',
|
||||
'uuid',
|
||||
'language',
|
||||
'creation_date',
|
||||
'name',
|
||||
'description'
|
||||
]);
|
||||
return Exercise2(
|
||||
id: json['id'] as int,
|
||||
baseId: json['exercise_base'] as int,
|
||||
uuid: json['uuid'] as String,
|
||||
creationDate: DateTime.parse(json['creation_date'] as String),
|
||||
languageId: json['language'] as int,
|
||||
name: json['name'] as String,
|
||||
description: json['description'] as String,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> _$Exercise2ToJson(Exercise2 instance) => <String, dynamic>{
|
||||
'id': instance.id,
|
||||
'exercise_base': instance.baseId,
|
||||
'uuid': instance.uuid,
|
||||
'language': instance.languageId,
|
||||
'creation_date': instance.creationDate.toIso8601String(),
|
||||
'name': instance.name,
|
||||
'description': instance.description,
|
||||
};
|
||||
@@ -21,6 +21,7 @@ import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:wger/exceptions/no_such_entry_exception.dart';
|
||||
@@ -29,7 +30,6 @@ import 'package:wger/models/exercises/base.dart';
|
||||
import 'package:wger/models/exercises/category.dart';
|
||||
import 'package:wger/models/exercises/equipment.dart';
|
||||
import 'package:wger/models/exercises/exercise.dart';
|
||||
import 'package:wger/models/exercises/exercise2.dart';
|
||||
import 'package:wger/models/exercises/language.dart';
|
||||
import 'package:wger/models/exercises/muscle.dart';
|
||||
import 'package:wger/providers/base_provider.dart';
|
||||
@@ -37,7 +37,7 @@ import 'package:wger/providers/base_provider.dart';
|
||||
class ExercisesProvider with ChangeNotifier {
|
||||
final WgerBaseProvider baseProvider;
|
||||
|
||||
static const daysToCache = 7;
|
||||
static const EXERCISE_CACHE_DAYS = 7;
|
||||
|
||||
static const _exerciseInfoUrlPath = 'exerciseinfo';
|
||||
static const _exerciseBaseUrlPath = 'exercise-base';
|
||||
@@ -51,6 +51,7 @@ class ExercisesProvider with ChangeNotifier {
|
||||
static const _equipmentUrlPath = 'equipment';
|
||||
static const _languageUrlPath = 'language';
|
||||
|
||||
List<ExerciseBase> _exerciseBases = [];
|
||||
List<Exercise> _exercises = [];
|
||||
List<ExerciseCategory> _categories = [];
|
||||
List<Muscle> _muscles = [];
|
||||
@@ -97,13 +98,22 @@ class ExercisesProvider with ChangeNotifier {
|
||||
|
||||
// Filter by exercise category and equipment (REPLACE WITH HTTP REQUEST)
|
||||
return items
|
||||
.where((exercise) => filters!.exerciseCategories.selected.contains(exercise.categoryObj))
|
||||
.where((exercise) => filters!.exerciseCategories.selected.contains(exercise.category))
|
||||
.toList();
|
||||
}
|
||||
|
||||
/// Clears all lists
|
||||
clear() {
|
||||
_equipment = [];
|
||||
_muscles = [];
|
||||
_categories = [];
|
||||
_languages = [];
|
||||
_exerciseBases = [];
|
||||
}
|
||||
|
||||
List<Exercise> findByCategory(ExerciseCategory? category) {
|
||||
if (category == null) return this.items;
|
||||
return this.items.where((exercise) => exercise.categoryObj == category).toList();
|
||||
return this.items.where((exercise) => exercise.category == category).toList();
|
||||
}
|
||||
|
||||
/// Find exercise by ID
|
||||
@@ -198,70 +208,90 @@ class ExercisesProvider with ChangeNotifier {
|
||||
Future<Exercise> fetchAndSetExercise(int exerciseId) async {
|
||||
try {
|
||||
return findExerciseById(exerciseId);
|
||||
} on StateError {
|
||||
} on NoSuchEntryException {
|
||||
// Get exercise from the server and save to cache
|
||||
|
||||
final data =
|
||||
await baseProvider.fetch(baseProvider.makeUrl(_exerciseInfoUrlPath, id: exerciseId));
|
||||
final exercise = Exercise.fromJson(data);
|
||||
_exercises.add(exercise);
|
||||
// TODO: do this right (and save to cache)
|
||||
final exerciseTranslationData = await baseProvider.fetch(
|
||||
baseProvider.makeUrl(
|
||||
_exerciseUrlPath,
|
||||
id: exerciseId,
|
||||
),
|
||||
);
|
||||
final exercise = Exercise.fromJson(exerciseTranslationData);
|
||||
|
||||
final exerciseBaseData = await baseProvider.fetch(
|
||||
baseProvider.makeUrl(_exerciseBaseUrlPath, id: exercise.baseId),
|
||||
);
|
||||
final base = ExerciseBase.fromJson(exerciseBaseData);
|
||||
setExerciseBaseData(base, [exercise]);
|
||||
|
||||
/*
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
final exerciseData = json.decode(prefs.getString(PREFS_EXERCISES)!);
|
||||
exerciseData['exercises'].add(exercise.toJson());
|
||||
prefs.setString(PREFS_EXERCISES, json.encode(exerciseData));
|
||||
log("Saved exercise '${exercise.name}' to cache.");
|
||||
return exercise;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> fetchAndSetExercisesTEST() async {
|
||||
// Load categories, muscles, equipment and languages
|
||||
await Future.wait([
|
||||
fetchAndSetCategories(),
|
||||
fetchAndSetMuscles(),
|
||||
fetchAndSetEquipment(),
|
||||
fetchAndSetLanguages(),
|
||||
]);
|
||||
|
||||
final exercisesData = await baseProvider.fetch(
|
||||
baseProvider.makeUrl(_exerciseBaseUrlPath, query: {'limit': '10'}),
|
||||
);
|
||||
|
||||
exercisesData['results'].forEach((e) async {
|
||||
var base = ExerciseBase.fromJson(e);
|
||||
|
||||
base.category = findCategoryById(base.categoryId);
|
||||
base.muscles = base.musclesIds.map((e) => findMuscleById(e)).toList();
|
||||
base.musclesSecondary = base.musclesSecondaryIds.map((e) => findMuscleById(e)).toList();
|
||||
base.equipment = base.equipmentIds.map((e) => findEquipmentById(e)).toList();
|
||||
|
||||
final exerciseTranslationData = await baseProvider.fetch(
|
||||
baseProvider.makeUrl(
|
||||
_exerciseUrlPath,
|
||||
query: {'limit': '10', 'exercise_base': base.id.toString()},
|
||||
id: exerciseId,
|
||||
),
|
||||
);
|
||||
|
||||
exerciseTranslationData['results'].forEach((e) async {
|
||||
var exercise = Exercise2.fromJson(e);
|
||||
exercise.base = base;
|
||||
exercise.language = findLanguageById(exercise.languageId);
|
||||
base.exercises.add(exercise);
|
||||
});
|
||||
final exercise = Exercise.fromJson(exerciseTranslationData);
|
||||
final exerciseBaseData = await baseProvider.fetch(
|
||||
baseProvider.makeUrl(_exerciseBaseUrlPath, id: exercise.baseId),
|
||||
);
|
||||
|
||||
final base = setExerciseBaseData(ExerciseBase.fromJson(exerciseBaseData), [exercise]);
|
||||
|
||||
//exerciseData['exercises'].add(exercise.toJson());
|
||||
//prefs.setString(PREFS_EXERCISES, json.encode(exerciseData));
|
||||
//log("Saved exercise '${exercise.name}' to cache.");
|
||||
|
||||
*/
|
||||
return exercise;
|
||||
}
|
||||
}
|
||||
|
||||
/// Helper function that sets different objects such as category, etc.
|
||||
ExerciseBase setExerciseBaseData(ExerciseBase base, List<Exercise> exercises) {
|
||||
base.category = findCategoryById(base.categoryId);
|
||||
base.muscles = base.musclesIds.map((e) => findMuscleById(e)).toList();
|
||||
base.musclesSecondary = base.musclesSecondaryIds.map((e) => findMuscleById(e)).toList();
|
||||
base.equipment = base.equipmentIds.map((e) => findEquipmentById(e)).toList();
|
||||
|
||||
exercises.forEach((e) {
|
||||
e.base = base;
|
||||
e.language = findLanguageById(e.languageId);
|
||||
});
|
||||
base.exercises = [];
|
||||
base.exercises = exercises;
|
||||
|
||||
return base;
|
||||
}
|
||||
|
||||
Future<void> fetchAndSetExercises() async {
|
||||
// Load exercises from cache, if available
|
||||
this.clear();
|
||||
print(Intl.getCurrentLocale());
|
||||
print(Intl.shortLocale(Intl.getCurrentLocale()));
|
||||
print('---------');
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
|
||||
if (prefs.containsKey(PREFS_EXERCISES)) {
|
||||
final exerciseData = json.decode(prefs.getString(PREFS_EXERCISES)!);
|
||||
if (DateTime.parse(exerciseData['expiresIn']).isAfter(DateTime.now())) {
|
||||
exerciseData['exercises'].forEach((e) => _exercises.add(Exercise.fromJson(e)));
|
||||
exerciseData['equipment'].forEach((e) => _equipment.add(Equipment.fromJson(e)));
|
||||
exerciseData['muscles'].forEach((e) => _muscles.add(Muscle.fromJson(e)));
|
||||
exerciseData['categories'].forEach((e) => _categories.add(ExerciseCategory.fromJson(e)));
|
||||
log("Read ${exerciseData['exercises'].length} exercises from cache. Valid till ${exerciseData['expiresIn']}");
|
||||
final cacheData = json.decode(prefs.getString(PREFS_EXERCISES)!);
|
||||
if (DateTime.parse(cacheData['expiresIn']).isAfter(DateTime.now())) {
|
||||
cacheData['equipment'].forEach((e) => _equipment.add(Equipment.fromJson(e)));
|
||||
cacheData['muscles'].forEach((e) => _muscles.add(Muscle.fromJson(e)));
|
||||
cacheData['categories'].forEach((e) => _categories.add(ExerciseCategory.fromJson(e)));
|
||||
cacheData['languages'].forEach((e) => _languages.add(Language.fromJson(e)));
|
||||
cacheData['exercise-translations'].forEach((e) => _exercises.add(Exercise.fromJson(e)));
|
||||
cacheData['bases'].forEach((e) {
|
||||
var base = setExerciseBaseData(
|
||||
ExerciseBase.fromJson(e),
|
||||
_exercises.where((element) => element.baseId == e['id']).toList(),
|
||||
);
|
||||
_exerciseBases.add(base);
|
||||
});
|
||||
log("Read ${_exerciseBases.length} exercises from cache. Valid till ${cacheData['expiresIn']}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -274,26 +304,49 @@ class ExercisesProvider with ChangeNotifier {
|
||||
fetchAndSetLanguages(),
|
||||
]);
|
||||
|
||||
final exercisesData = await baseProvider.fetch(
|
||||
baseProvider.makeUrl(_exerciseInfoUrlPath, query: {'limit': '1000'}),
|
||||
final exerciseBaseData = await baseProvider.fetch(
|
||||
baseProvider.makeUrl(_exerciseBaseUrlPath, query: {'limit': '1000'}),
|
||||
);
|
||||
final exerciseTranslationData = await baseProvider.fetch(
|
||||
baseProvider.makeUrl(
|
||||
_exerciseUrlPath,
|
||||
query: {'limit': '1000'},
|
||||
),
|
||||
);
|
||||
|
||||
List<Exercise> exerciseTranslation = exerciseTranslationData['results'].map<Exercise>((e) {
|
||||
return Exercise.fromJson(e);
|
||||
}).toList();
|
||||
|
||||
for (var e in exerciseBaseData['results']) {
|
||||
var base = setExerciseBaseData(
|
||||
ExerciseBase.fromJson(e),
|
||||
exerciseTranslation.where((element) => element.baseId == e['id']).toList(),
|
||||
);
|
||||
_exerciseBases.add(base);
|
||||
}
|
||||
|
||||
try {
|
||||
// Load exercises
|
||||
exercisesData['results'].forEach((e) => _exercises.add(Exercise.fromJson(e)));
|
||||
List<Exercise> exerciseTranslations = [];
|
||||
_exerciseBases.forEach((base) {
|
||||
base.exercises.forEach((exercise) {
|
||||
exerciseTranslations.add(exercise);
|
||||
});
|
||||
});
|
||||
|
||||
// Save the result to the cache
|
||||
final exerciseData = {
|
||||
final cacheData = {
|
||||
'date': DateTime.now().toIso8601String(),
|
||||
'expiresIn': DateTime.now().add(Duration(days: daysToCache)).toIso8601String(),
|
||||
'exercises': _exercises.map((e) => e.toJson()).toList(),
|
||||
'expiresIn': DateTime.now().add(Duration(days: EXERCISE_CACHE_DAYS)).toIso8601String(),
|
||||
'equipment': _equipment.map((e) => e.toJson()).toList(),
|
||||
'categories': _categories.map((e) => e.toJson()).toList(),
|
||||
'muscles': _muscles.map((e) => e.toJson()).toList(),
|
||||
'languages': _languages.map((e) => e.toJson()).toList(),
|
||||
'exercise-translations': exerciseTranslations.map((e) => e.toJson()).toList(),
|
||||
'bases': _exerciseBases.map((e) => e.toJson()).toList(),
|
||||
};
|
||||
log("Saved ${_exercises.length} exercises from cache. Valid till ${exerciseData['expiresIn']}");
|
||||
|
||||
prefs.setString(PREFS_EXERCISES, json.encode(exerciseData));
|
||||
log("Saved ${_exerciseBases.length} exercises to cache. Valid till ${cacheData['expiresIn']}");
|
||||
prefs.setString(PREFS_EXERCISES, json.encode(cacheData));
|
||||
notifyListeners();
|
||||
} on MissingRequiredKeysException catch (error) {
|
||||
log(error.missingKeys.toString());
|
||||
|
||||
@@ -42,7 +42,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
Provider.of<ExercisesProvider>(context, listen: false).fetchAndSetExercisesTEST();
|
||||
Provider.of<ExercisesProvider>(context, listen: false).fetchAndSetExercises();
|
||||
},
|
||||
icon: Icon(Icons.update),
|
||||
),
|
||||
|
||||
@@ -32,7 +32,6 @@ import 'package:wger/providers/workout_plans.dart';
|
||||
import 'package:wger/screens/dashboard.dart';
|
||||
import 'package:wger/screens/exercises_screen.dart';
|
||||
import 'package:wger/screens/gallery_screen.dart';
|
||||
import 'package:wger/screens/nutritional_plans_screen.dart';
|
||||
import 'package:wger/screens/weight_screen.dart';
|
||||
import 'package:wger/screens/workout_plans_screen.dart';
|
||||
import 'package:wger/theme/theme.dart';
|
||||
|
||||
@@ -39,7 +39,7 @@ class ExerciseDetail extends StatelessWidget {
|
||||
AppLocalizations.of(context).category,
|
||||
style: Theme.of(context).textTheme.headline6,
|
||||
),
|
||||
Text(_exercise.categoryObj.name),
|
||||
Text(_exercise.category.name),
|
||||
SizedBox(height: 8),
|
||||
|
||||
// Equipment
|
||||
|
||||
@@ -38,7 +38,7 @@ class ExerciseListTile extends StatelessWidget {
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Text(
|
||||
exercise.categoryObj.name,
|
||||
exercise.category.name,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
|
||||
@@ -409,7 +409,7 @@ class _SetFormWidgetState extends State<SetFormWidget> {
|
||||
),
|
||||
title: Text(exercise.name),
|
||||
subtitle: Text(
|
||||
'${exercise.categoryObj.name} / ${exercise.equipment.map((e) => e.name).join(', ')}'),
|
||||
'${exercise.category.name} / ${exercise.equipment.map((e) => e.name).join(', ')}'),
|
||||
);
|
||||
},
|
||||
transitionBuilder: (context, suggestionsBox, controller) {
|
||||
@@ -639,7 +639,7 @@ class ExerciseSetting extends StatelessWidget {
|
||||
_exercise.name,
|
||||
style: Theme.of(context).textTheme.headline6,
|
||||
),
|
||||
subtitle: Text(_exercise.categoryObj.name),
|
||||
subtitle: Text(_exercise.category.name),
|
||||
contentPadding: EdgeInsets.zero,
|
||||
leading: ExerciseImageWidget(image: _exercise.getMainImage),
|
||||
trailing: IconButton(
|
||||
|
||||
@@ -658,7 +658,7 @@ class ExerciseOverview extends StatelessWidget {
|
||||
padding: EdgeInsets.symmetric(horizontal: 15),
|
||||
children: [
|
||||
Text(
|
||||
_exercise.categoryObj.name,
|
||||
_exercise.category.name,
|
||||
style: Theme.of(context).textTheme.headline6,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
|
||||
@@ -31,7 +31,7 @@ main() {
|
||||
supportedLocales: AppLocalizations.supportedLocales,
|
||||
navigatorKey: GlobalKey<NavigatorState>(),
|
||||
home: Scaffold(
|
||||
body: ExerciseDetail(exercise1),
|
||||
body: ExerciseDetail(getExercise()[0]),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -19,34 +19,45 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:wger/models/workouts/workout_plan.dart';
|
||||
import 'package:wger/providers/exercises.dart';
|
||||
import 'package:wger/providers/workout_plans.dart';
|
||||
import 'package:wger/screens/gym_mode.dart';
|
||||
import 'package:wger/screens/workout_plan_screen.dart';
|
||||
import 'package:wger/widgets/workouts/forms.dart';
|
||||
import 'package:wger/widgets/workouts/gym_mode.dart';
|
||||
|
||||
import '../test_data/exercises.dart';
|
||||
import '../test_data/workouts.dart';
|
||||
import 'base_provider_test.mocks.dart';
|
||||
import 'gym_mode_screen_test.mocks.dart';
|
||||
import 'utils.dart';
|
||||
|
||||
@GenerateMocks([ExercisesProvider])
|
||||
void main() {
|
||||
Widget createHomeScreen({locale = 'en'}) {
|
||||
final key = GlobalKey<NavigatorState>();
|
||||
final client = MockClient();
|
||||
|
||||
final mockExerciseProvider = MockExercisesProvider();
|
||||
WorkoutPlan workoutPlan = getWorkout();
|
||||
|
||||
when(mockExerciseProvider.findExerciseById(1)).thenReturn(getExercise()[0]);
|
||||
when(mockExerciseProvider.findExerciseById(2)).thenReturn(getExercise()[1]);
|
||||
when(mockExerciseProvider.findExerciseById(3)).thenReturn(getExercise()[2]);
|
||||
|
||||
return ChangeNotifierProvider<WorkoutPlansProvider>(
|
||||
create: (context) => WorkoutPlansProvider(
|
||||
testAuthProvider,
|
||||
testExercisesProvider,
|
||||
mockExerciseProvider,
|
||||
[workoutPlan],
|
||||
client,
|
||||
),
|
||||
child: ChangeNotifierProvider(
|
||||
create: (context) => testExercisesProvider,
|
||||
child: ChangeNotifierProvider<ExercisesProvider>(
|
||||
create: (context) => mockExerciseProvider,
|
||||
child: MaterialApp(
|
||||
locale: Locale(locale),
|
||||
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||||
|
||||
156
test/gym_mode_screen_test.mocks.dart
Normal file
156
test/gym_mode_screen_test.mocks.dart
Normal file
@@ -0,0 +1,156 @@
|
||||
// Mocks generated by Mockito 5.0.15 from annotations
|
||||
// in wger/test/gym_mode_screen_test.dart.
|
||||
// Do not manually edit this file.
|
||||
|
||||
import 'dart:async' as _i10;
|
||||
import 'dart:ui' as _i11;
|
||||
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:wger/models/exercises/base.dart' as _i8;
|
||||
import 'package:wger/models/exercises/category.dart' as _i4;
|
||||
import 'package:wger/models/exercises/equipment.dart' as _i5;
|
||||
import 'package:wger/models/exercises/exercise.dart' as _i3;
|
||||
import 'package:wger/models/exercises/language.dart' as _i7;
|
||||
import 'package:wger/models/exercises/muscle.dart' as _i6;
|
||||
import 'package:wger/providers/base_provider.dart' as _i2;
|
||||
import 'package:wger/providers/exercises.dart' as _i9;
|
||||
|
||||
// ignore_for_file: avoid_redundant_argument_values
|
||||
// ignore_for_file: avoid_setters_without_getters
|
||||
// ignore_for_file: comment_references
|
||||
// ignore_for_file: implementation_imports
|
||||
// ignore_for_file: invalid_use_of_visible_for_testing_member
|
||||
// ignore_for_file: prefer_const_constructors
|
||||
// ignore_for_file: unnecessary_parenthesis
|
||||
|
||||
class _FakeWgerBaseProvider_0 extends _i1.Fake implements _i2.WgerBaseProvider {
|
||||
}
|
||||
|
||||
class _FakeExercise_1 extends _i1.Fake implements _i3.Exercise {}
|
||||
|
||||
class _FakeExerciseCategory_2 extends _i1.Fake implements _i4.ExerciseCategory {
|
||||
}
|
||||
|
||||
class _FakeEquipment_3 extends _i1.Fake implements _i5.Equipment {}
|
||||
|
||||
class _FakeMuscle_4 extends _i1.Fake implements _i6.Muscle {}
|
||||
|
||||
class _FakeLanguage_5 extends _i1.Fake implements _i7.Language {}
|
||||
|
||||
class _FakeExerciseBase_6 extends _i1.Fake implements _i8.ExerciseBase {}
|
||||
|
||||
/// A class which mocks [ExercisesProvider].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockExercisesProvider extends _i1.Mock implements _i9.ExercisesProvider {
|
||||
MockExercisesProvider() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i2.WgerBaseProvider get baseProvider =>
|
||||
(super.noSuchMethod(Invocation.getter(#baseProvider),
|
||||
returnValue: _FakeWgerBaseProvider_0()) as _i2.WgerBaseProvider);
|
||||
@override
|
||||
List<_i3.Exercise> get items => (super.noSuchMethod(Invocation.getter(#items),
|
||||
returnValue: <_i3.Exercise>[]) as List<_i3.Exercise>);
|
||||
@override
|
||||
List<_i4.ExerciseCategory> get categories =>
|
||||
(super.noSuchMethod(Invocation.getter(#categories),
|
||||
returnValue: <_i4.ExerciseCategory>[]) as List<_i4.ExerciseCategory>);
|
||||
@override
|
||||
bool get hasListeners =>
|
||||
(super.noSuchMethod(Invocation.getter(#hasListeners), returnValue: false)
|
||||
as bool);
|
||||
@override
|
||||
void initFilters() => super.noSuchMethod(Invocation.method(#initFilters, []),
|
||||
returnValueForMissingStub: null);
|
||||
@override
|
||||
List<_i3.Exercise> findByFilters() =>
|
||||
(super.noSuchMethod(Invocation.method(#findByFilters, []),
|
||||
returnValue: <_i3.Exercise>[]) as List<_i3.Exercise>);
|
||||
@override
|
||||
List<_i3.Exercise> findByCategory(_i4.ExerciseCategory? category) =>
|
||||
(super.noSuchMethod(Invocation.method(#findByCategory, [category]),
|
||||
returnValue: <_i3.Exercise>[]) as List<_i3.Exercise>);
|
||||
@override
|
||||
_i3.Exercise findExerciseById(int? id) =>
|
||||
(super.noSuchMethod(Invocation.method(#findExerciseById, [id]),
|
||||
returnValue: _FakeExercise_1()) as _i3.Exercise);
|
||||
@override
|
||||
_i4.ExerciseCategory findCategoryById(int? id) =>
|
||||
(super.noSuchMethod(Invocation.method(#findCategoryById, [id]),
|
||||
returnValue: _FakeExerciseCategory_2()) as _i4.ExerciseCategory);
|
||||
@override
|
||||
_i5.Equipment findEquipmentById(int? id) =>
|
||||
(super.noSuchMethod(Invocation.method(#findEquipmentById, [id]),
|
||||
returnValue: _FakeEquipment_3()) as _i5.Equipment);
|
||||
@override
|
||||
_i6.Muscle findMuscleById(int? id) =>
|
||||
(super.noSuchMethod(Invocation.method(#findMuscleById, [id]),
|
||||
returnValue: _FakeMuscle_4()) as _i6.Muscle);
|
||||
@override
|
||||
_i7.Language findLanguageById(int? id) =>
|
||||
(super.noSuchMethod(Invocation.method(#findLanguageById, [id]),
|
||||
returnValue: _FakeLanguage_5()) as _i7.Language);
|
||||
@override
|
||||
_i10.Future<void> fetchAndSetCategories() => (super.noSuchMethod(
|
||||
Invocation.method(#fetchAndSetCategories, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i10.Future<void>);
|
||||
@override
|
||||
_i10.Future<void> fetchAndSetMuscles() => (super.noSuchMethod(
|
||||
Invocation.method(#fetchAndSetMuscles, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i10.Future<void>);
|
||||
@override
|
||||
_i10.Future<void> fetchAndSetEquipment() => (super.noSuchMethod(
|
||||
Invocation.method(#fetchAndSetEquipment, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i10.Future<void>);
|
||||
@override
|
||||
_i10.Future<void> fetchAndSetLanguages() => (super.noSuchMethod(
|
||||
Invocation.method(#fetchAndSetLanguages, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i10.Future<void>);
|
||||
@override
|
||||
_i10.Future<_i3.Exercise> fetchAndSetExercise(int? exerciseId) =>
|
||||
(super.noSuchMethod(Invocation.method(#fetchAndSetExercise, [exerciseId]),
|
||||
returnValue: Future<_i3.Exercise>.value(_FakeExercise_1()))
|
||||
as _i10.Future<_i3.Exercise>);
|
||||
@override
|
||||
_i8.ExerciseBase setExerciseBaseData(
|
||||
_i8.ExerciseBase? base, List<_i3.Exercise>? exercises) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#setExerciseBaseData, [base, exercises]),
|
||||
returnValue: _FakeExerciseBase_6()) as _i8.ExerciseBase);
|
||||
@override
|
||||
_i10.Future<void> fetchAndSetExercises() => (super.noSuchMethod(
|
||||
Invocation.method(#fetchAndSetExercises, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i10.Future<void>);
|
||||
@override
|
||||
_i10.Future<List<dynamic>> searchExercise(String? name,
|
||||
[String? languageCode = r'en']) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#searchExercise, [name, languageCode]),
|
||||
returnValue: Future<List<dynamic>>.value(<dynamic>[]))
|
||||
as _i10.Future<List<dynamic>>);
|
||||
@override
|
||||
String toString() => super.toString();
|
||||
@override
|
||||
void addListener(_i11.VoidCallback? listener) =>
|
||||
super.noSuchMethod(Invocation.method(#addListener, [listener]),
|
||||
returnValueForMissingStub: null);
|
||||
@override
|
||||
void removeListener(_i11.VoidCallback? listener) =>
|
||||
super.noSuchMethod(Invocation.method(#removeListener, [listener]),
|
||||
returnValueForMissingStub: null);
|
||||
@override
|
||||
void dispose() => super.noSuchMethod(Invocation.method(#dispose, []),
|
||||
returnValueForMissingStub: null);
|
||||
@override
|
||||
void notifyListeners() =>
|
||||
super.noSuchMethod(Invocation.method(#notifyListeners, []),
|
||||
returnValueForMissingStub: null);
|
||||
}
|
||||
@@ -27,16 +27,16 @@ void main() {
|
||||
final workout = getWorkout();
|
||||
|
||||
expect(workout.logs.length, 3);
|
||||
final logExercise1 = workout.filterLogsByExercise(exercise1);
|
||||
final logExercise1 = workout.filterLogsByExercise(getExercise()[0]);
|
||||
expect(logExercise1.length, 2);
|
||||
expect(logExercise1[0].id, 1);
|
||||
expect(logExercise1[1].id, 2);
|
||||
|
||||
final logExercise2 = workout.filterLogsByExercise(exercise2);
|
||||
final logExercise2 = workout.filterLogsByExercise(getExercise()[1]);
|
||||
expect(logExercise2.length, 1);
|
||||
expect(logExercise2[0].id, 3);
|
||||
|
||||
expect(workout.filterLogsByExercise(exercise3).length, 0);
|
||||
expect(workout.filterLogsByExercise(getExercise()[2]).length, 0);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2,16 +2,18 @@
|
||||
// in wger/test/workout_set_form_test.dart.
|
||||
// Do not manually edit this file.
|
||||
|
||||
import 'dart:async' as _i8;
|
||||
import 'dart:ui' as _i9;
|
||||
import 'dart:async' as _i10;
|
||||
import 'dart:ui' as _i11;
|
||||
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:wger/models/exercises/base.dart' as _i8;
|
||||
import 'package:wger/models/exercises/category.dart' as _i4;
|
||||
import 'package:wger/models/exercises/equipment.dart' as _i5;
|
||||
import 'package:wger/models/exercises/exercise.dart' as _i3;
|
||||
import 'package:wger/models/exercises/language.dart' as _i7;
|
||||
import 'package:wger/models/exercises/muscle.dart' as _i6;
|
||||
import 'package:wger/providers/base_provider.dart' as _i2;
|
||||
import 'package:wger/providers/exercises.dart' as _i7;
|
||||
import 'package:wger/providers/exercises.dart' as _i9;
|
||||
|
||||
// ignore_for_file: avoid_redundant_argument_values
|
||||
// ignore_for_file: avoid_setters_without_getters
|
||||
@@ -33,10 +35,14 @@ class _FakeEquipment_3 extends _i1.Fake implements _i5.Equipment {}
|
||||
|
||||
class _FakeMuscle_4 extends _i1.Fake implements _i6.Muscle {}
|
||||
|
||||
class _FakeLanguage_5 extends _i1.Fake implements _i7.Language {}
|
||||
|
||||
class _FakeExerciseBase_6 extends _i1.Fake implements _i8.ExerciseBase {}
|
||||
|
||||
/// A class which mocks [ExercisesProvider].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockExercisesProvider extends _i1.Mock implements _i7.ExercisesProvider {
|
||||
class MockExercisesProvider extends _i1.Mock implements _i9.ExercisesProvider {
|
||||
MockExercisesProvider() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
@@ -84,50 +90,60 @@ class MockExercisesProvider extends _i1.Mock implements _i7.ExercisesProvider {
|
||||
(super.noSuchMethod(Invocation.method(#findMuscleById, [id]),
|
||||
returnValue: _FakeMuscle_4()) as _i6.Muscle);
|
||||
@override
|
||||
_i8.Future<void> fetchAndSetCategories() =>
|
||||
(super.noSuchMethod(Invocation.method(#fetchAndSetCategories, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i8.Future<void>);
|
||||
_i7.Language findLanguageById(int? id) =>
|
||||
(super.noSuchMethod(Invocation.method(#findLanguageById, [id]),
|
||||
returnValue: _FakeLanguage_5()) as _i7.Language);
|
||||
@override
|
||||
_i8.Future<void> fetchAndSetMuscles() =>
|
||||
(super.noSuchMethod(Invocation.method(#fetchAndSetMuscles, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i8.Future<void>);
|
||||
_i10.Future<void> fetchAndSetCategories() => (super.noSuchMethod(
|
||||
Invocation.method(#fetchAndSetCategories, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i10.Future<void>);
|
||||
@override
|
||||
_i8.Future<void> fetchAndSetEquipment() =>
|
||||
(super.noSuchMethod(Invocation.method(#fetchAndSetEquipment, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i8.Future<void>);
|
||||
_i10.Future<void> fetchAndSetMuscles() => (super.noSuchMethod(
|
||||
Invocation.method(#fetchAndSetMuscles, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i10.Future<void>);
|
||||
@override
|
||||
_i8.Future<_i3.Exercise> fetchAndSetExercise(int? exerciseId) =>
|
||||
_i10.Future<void> fetchAndSetEquipment() => (super.noSuchMethod(
|
||||
Invocation.method(#fetchAndSetEquipment, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i10.Future<void>);
|
||||
@override
|
||||
_i10.Future<void> fetchAndSetLanguages() => (super.noSuchMethod(
|
||||
Invocation.method(#fetchAndSetLanguages, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i10.Future<void>);
|
||||
@override
|
||||
_i10.Future<_i3.Exercise> fetchAndSetExercise(int? exerciseId) =>
|
||||
(super.noSuchMethod(Invocation.method(#fetchAndSetExercise, [exerciseId]),
|
||||
returnValue: Future<_i3.Exercise>.value(_FakeExercise_1()))
|
||||
as _i8.Future<_i3.Exercise>);
|
||||
as _i10.Future<_i3.Exercise>);
|
||||
@override
|
||||
_i8.Future<void> fetchAndSetExercisesTEST() =>
|
||||
(super.noSuchMethod(Invocation.method(#fetchAndSetExercisesTEST, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i8.Future<void>);
|
||||
_i8.ExerciseBase setExerciseBaseData(
|
||||
_i8.ExerciseBase? base, List<_i3.Exercise>? exercises) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#setExerciseBaseData, [base, exercises]),
|
||||
returnValue: _FakeExerciseBase_6()) as _i8.ExerciseBase);
|
||||
@override
|
||||
_i8.Future<void> fetchAndSetExercises() =>
|
||||
(super.noSuchMethod(Invocation.method(#fetchAndSetExercises, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i8.Future<void>);
|
||||
_i10.Future<void> fetchAndSetExercises() => (super.noSuchMethod(
|
||||
Invocation.method(#fetchAndSetExercises, []),
|
||||
returnValue: Future<void>.value(),
|
||||
returnValueForMissingStub: Future<void>.value()) as _i10.Future<void>);
|
||||
@override
|
||||
_i8.Future<List<dynamic>> searchExercise(String? name,
|
||||
_i10.Future<List<dynamic>> searchExercise(String? name,
|
||||
[String? languageCode = r'en']) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#searchExercise, [name, languageCode]),
|
||||
returnValue: Future<List<dynamic>>.value(<dynamic>[]))
|
||||
as _i8.Future<List<dynamic>>);
|
||||
as _i10.Future<List<dynamic>>);
|
||||
@override
|
||||
String toString() => super.toString();
|
||||
@override
|
||||
void addListener(_i9.VoidCallback? listener) =>
|
||||
void addListener(_i11.VoidCallback? listener) =>
|
||||
super.noSuchMethod(Invocation.method(#addListener, [listener]),
|
||||
returnValueForMissingStub: null);
|
||||
@override
|
||||
void removeListener(_i9.VoidCallback? listener) =>
|
||||
void removeListener(_i11.VoidCallback? listener) =>
|
||||
super.noSuchMethod(Invocation.method(#removeListener, [listener]),
|
||||
returnValueForMissingStub: null);
|
||||
@override
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import 'package:wger/models/exercises/base.dart';
|
||||
import 'package:wger/models/exercises/category.dart';
|
||||
import 'package:wger/models/exercises/equipment.dart';
|
||||
import 'package:wger/models/exercises/exercise.dart';
|
||||
@@ -32,38 +33,67 @@ const category3 = ExerciseCategory(id: 3, name: 'Abs');
|
||||
const equipment1 = Equipment(id: 1, name: 'Bench');
|
||||
const equipment2 = Equipment(id: 1, name: 'Dumbbell');
|
||||
|
||||
final exercise1 = Exercise(
|
||||
id: 1,
|
||||
uuid: 'uuid',
|
||||
creationDate: DateTime(2021, 1, 15),
|
||||
name: 'test exercise 1',
|
||||
description: 'add clever text',
|
||||
category: category1,
|
||||
muscles: [muscle1, muscle2],
|
||||
musclesSecondary: [muscle3],
|
||||
equipment: [equipment1, equipment2],
|
||||
);
|
||||
List<Exercise> getExercise() {
|
||||
final base1 = ExerciseBase(
|
||||
id: 1,
|
||||
uuid: 'uuid1',
|
||||
creationDate: DateTime(2021, 09, 01),
|
||||
updateDate: DateTime(2021, 09, 10),
|
||||
category: category1,
|
||||
equipment: [equipment1, equipment2],
|
||||
muscles: [muscle1, muscle2],
|
||||
musclesSecondary: [muscle3],
|
||||
);
|
||||
|
||||
final exercise2 = Exercise(
|
||||
id: 2,
|
||||
uuid: '111-2222-44444',
|
||||
creationDate: DateTime(2021, 1, 15),
|
||||
name: 'test exercise 2',
|
||||
description: 'Lorem ipsum etc',
|
||||
category: category2,
|
||||
muscles: [muscle1],
|
||||
musclesSecondary: [muscle2],
|
||||
equipment: [equipment2],
|
||||
);
|
||||
final exercise1 = Exercise(
|
||||
id: 1,
|
||||
baseId: 1,
|
||||
uuid: 'uuid',
|
||||
languageId: 1,
|
||||
creationDate: DateTime(2021, 1, 15),
|
||||
name: 'test exercise 1',
|
||||
description: 'add clever text',
|
||||
base: base1);
|
||||
|
||||
final exercise3 = Exercise(
|
||||
id: 3,
|
||||
uuid: 'a3b6c7bb-9d22-4119-a5fc-818584d5e9bc',
|
||||
creationDate: DateTime(2021, 4, 1),
|
||||
name: 'test exercise 3',
|
||||
description: 'The man in black fled across the desert, and the gunslinger followed',
|
||||
category: category3,
|
||||
muscles: [muscle1],
|
||||
musclesSecondary: [muscle2],
|
||||
equipment: [equipment2],
|
||||
);
|
||||
final base2 = ExerciseBase(
|
||||
id: 2,
|
||||
uuid: 'uuid2',
|
||||
creationDate: DateTime(2021, 08, 01),
|
||||
updateDate: DateTime(2021, 08, 10),
|
||||
category: category2,
|
||||
equipment: [equipment2],
|
||||
muscles: [muscle1],
|
||||
musclesSecondary: [muscle2],
|
||||
);
|
||||
final exercise2 = Exercise(
|
||||
id: 2,
|
||||
baseId: 2,
|
||||
uuid: '111-2222-44444',
|
||||
languageId: 2,
|
||||
creationDate: DateTime(2021, 1, 15),
|
||||
name: 'test exercise 2',
|
||||
description: 'Lorem ipsum etc',
|
||||
base: base2);
|
||||
|
||||
final base3 = ExerciseBase(
|
||||
id: 3,
|
||||
uuid: 'uuid3',
|
||||
creationDate: DateTime(2021, 08, 01),
|
||||
updateDate: DateTime(2021, 08, 01),
|
||||
category: category3,
|
||||
equipment: [equipment2],
|
||||
muscles: [muscle1],
|
||||
musclesSecondary: [muscle2],
|
||||
);
|
||||
final exercise3 = Exercise(
|
||||
id: 3,
|
||||
baseId: 2,
|
||||
uuid: 'a3b6c7bb-9d22-4119-a5fc-818584d5e9bc',
|
||||
languageId: 2,
|
||||
creationDate: DateTime(2021, 4, 1),
|
||||
name: 'test exercise 3',
|
||||
description: 'The man in black fled across the desert, and the gunslinger followed',
|
||||
base: base3);
|
||||
|
||||
return [exercise1, exercise2, exercise3];
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ WorkoutPlan getWorkout() {
|
||||
);
|
||||
setting1.repetitionUnit = repetitionUnit1;
|
||||
setting1.weightUnit = weightUnit1;
|
||||
setting1.exercise = exercise1;
|
||||
setting1.exercise = getExercise()[0];
|
||||
setting1.weight = 10;
|
||||
|
||||
var log1 = Log.empty()
|
||||
@@ -55,7 +55,7 @@ WorkoutPlan getWorkout() {
|
||||
..date = DateTime(2021, 5, 1)
|
||||
..reps = 10
|
||||
..workoutPlan = 1;
|
||||
log1.exercise = exercise1;
|
||||
log1.exercise = getExercise()[0];
|
||||
log1.weightUnit = weightUnit1;
|
||||
log1.repetitionUnit = repetitionUnit1;
|
||||
|
||||
@@ -66,7 +66,7 @@ WorkoutPlan getWorkout() {
|
||||
..date = DateTime(2021, 5, 1)
|
||||
..reps = 12
|
||||
..workoutPlan = 1;
|
||||
log2.exercise = exercise1;
|
||||
log2.exercise = getExercise()[0];
|
||||
log2.weightUnit = weightUnit1;
|
||||
log2.repetitionUnit = repetitionUnit1;
|
||||
|
||||
@@ -77,7 +77,7 @@ WorkoutPlan getWorkout() {
|
||||
..date = DateTime(2021, 5, 2)
|
||||
..reps = 8
|
||||
..workoutPlan = 1;
|
||||
log3.exercise = exercise2;
|
||||
log3.exercise = getExercise()[1];
|
||||
log3.weightUnit = weightUnit1;
|
||||
log3.repetitionUnit = repetitionUnit1;
|
||||
|
||||
@@ -88,7 +88,7 @@ WorkoutPlan getWorkout() {
|
||||
order: 1,
|
||||
comment: 'Important to do exercises correctly',
|
||||
);
|
||||
set1.addExercise(exercise1);
|
||||
set1.addExercise(getExercise()[0]);
|
||||
set1.settings.add(setting1);
|
||||
set1.settingsComputed = [setting1, setting1];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user