mirror of
https://github.com/wger-project/flutter.git
synced 2026-02-18 00:17:48 +01:00
Merge conflicts
This commit is contained in:
@@ -11,7 +11,7 @@ import 'package:wger/screens/routine_screen.dart';
|
||||
import 'package:wger/theme/theme.dart';
|
||||
import 'package:wger/widgets/routines/gym_mode/summary.dart';
|
||||
|
||||
import '../test/routine/gym_mode/gym_mode_test.mocks.dart';
|
||||
// import '../test/routine/gym_mode/gym_mode_test.mocks.dart';
|
||||
import '../test_data/exercises.dart';
|
||||
import '../test_data/routines.dart';
|
||||
|
||||
@@ -68,7 +68,7 @@ Widget createGymModeResultsScreen({String locale = 'en'}) {
|
||||
|
||||
final key = GlobalKey<NavigatorState>();
|
||||
final routine = getTestRoutine(exercises: getScreenshotExercises());
|
||||
routine.sessions.first.session.date = clock.now();
|
||||
routine.sessions.first.date = clock.now();
|
||||
|
||||
final mockRoutinesProvider = MockRoutinesProvider();
|
||||
final mockExerciseProvider = MockExercisesProvider();
|
||||
|
||||
@@ -17,8 +17,10 @@
|
||||
*/
|
||||
|
||||
import 'package:drift/drift.dart' as drift;
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:wger/database/powersync/database.dart';
|
||||
import 'package:wger/helpers/consts.dart';
|
||||
import 'package:wger/helpers/i18n.dart';
|
||||
import 'package:wger/helpers/misc.dart';
|
||||
import 'package:wger/models/exercises/exercise.dart';
|
||||
import 'package:wger/models/workouts/repetition_unit.dart';
|
||||
|
||||
@@ -18,11 +18,10 @@
|
||||
|
||||
import 'package:drift/drift.dart' as drift;
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:wger/database/powersync/database.dart';
|
||||
import 'package:wger/models/exercises/exercise.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:wger/helpers/json.dart';
|
||||
import 'package:wger/l10n/generated/app_localizations.dart';
|
||||
import 'package:wger/models/exercises/exercise.dart';
|
||||
import 'package:wger/models/workouts/log.dart';
|
||||
|
||||
const IMPRESSION_MAP = {1: 'bad', 2: 'neutral', 3: 'good'};
|
||||
@@ -103,7 +102,7 @@ class WorkoutSession {
|
||||
/// Get total volume of the session for metric and imperial units
|
||||
/// (i.e. sets that have "repetitions" as units and weight in kg or lbs).
|
||||
/// Other combinations such as "seconds" are ignored.
|
||||
Map<String, Object> get volume {
|
||||
Map<String, num> get volume {
|
||||
final volumeMetric = logs.fold<double>(0, (sum, log) => sum + log.volume(metric: true));
|
||||
final volumeImperial = logs.fold<double>(0, (sum, log) => sum + log.volume(metric: false));
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ final class GymStateNotifierProvider extends $NotifierProvider<GymStateNotifier,
|
||||
}
|
||||
}
|
||||
|
||||
String _$gymStateNotifierHash() => r'449bd80d3b534f68af4f0dbb8556c7f093f3b918';
|
||||
String _$gymStateNotifierHash() => r'8474afce33638bf67570fd64b64e9b5d171804d3';
|
||||
|
||||
abstract class _$GymStateNotifier extends $Notifier<GymModeState> {
|
||||
GymModeState build();
|
||||
|
||||
@@ -115,7 +115,7 @@ class RoutinesRiverpod extends _$RoutinesRiverpod {
|
||||
return created;
|
||||
}
|
||||
|
||||
Future<void> fetchAndSetRoutineFull(int routineId) async {
|
||||
Future<Routine> fetchAndSetRoutineFull(int routineId) async {
|
||||
final repo = ref.read(routinesRepositoryProvider);
|
||||
final exercises = await ref.read(exercisesProvider.future);
|
||||
final repetitionUnits = await ref.read(routineRepetitionUnitProvider.future);
|
||||
@@ -153,6 +153,8 @@ class RoutinesRiverpod extends _$RoutinesRiverpod {
|
||||
updatedRoutines.add(routine);
|
||||
}
|
||||
state = state.copyWith(routines: updatedRoutines);
|
||||
|
||||
return routine;
|
||||
}
|
||||
|
||||
Future<void> deleteRoutine(int routineId) async {
|
||||
|
||||
@@ -118,7 +118,7 @@ final class RoutinesRiverpodProvider extends $NotifierProvider<RoutinesRiverpod,
|
||||
}
|
||||
}
|
||||
|
||||
String _$routinesRiverpodHash() => r'734c6d30a0888420c443932a552058a1f389627a';
|
||||
String _$routinesRiverpodHash() => r'7a097555c9718249a21328ac16234ef26e23c453';
|
||||
|
||||
abstract class _$RoutinesRiverpod extends $Notifier<RoutinesState> {
|
||||
RoutinesState build();
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:wger/core/wide_screen_wrapper.dart';
|
||||
import 'package:wger/providers/routines.dart';
|
||||
import 'package:wger/widgets/routines/gym_mode/gym_mode.dart';
|
||||
|
||||
class GymModeArguments {
|
||||
@@ -43,10 +42,7 @@ class GymModeScreen extends ConsumerWidget {
|
||||
// backgroundColor: Theme.of(context).cardColor,
|
||||
// primary: false,
|
||||
body: SafeArea(
|
||||
child: WidescreenWrapper(
|
||||
child: GymMode(args),
|
||||
),
|
||||
),
|
||||
child: WidescreenWrapper(child: GymMode(args)),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -155,15 +155,15 @@ class _DashboardCalendarWidgetState extends riverpod.ConsumerState<DashboardCale
|
||||
time = '(${timeToString(session.timeStart)} - ${timeToString(session.timeEnd)})';
|
||||
}
|
||||
|
||||
// Add events to lists
|
||||
// Add events to lists
|
||||
newEvents[date]?.add(
|
||||
Event(
|
||||
EventType.session,
|
||||
'${i18n.impression}: ${session.impressionAsString(context)} $time',
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
Event(
|
||||
EventType.session,
|
||||
'${i18n.impression}: ${session.impressionAsString(context)} $time',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (!mounted) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -21,9 +21,6 @@ import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:wger/models/exercises/exercise.dart';
|
||||
import 'package:wger/models/workouts/day_data.dart';
|
||||
import 'package:wger/providers/exercise_state_notifier.dart';
|
||||
import 'package:wger/providers/gym_state.dart';
|
||||
import 'package:wger/providers/routines.dart';
|
||||
import 'package:wger/screens/gym_mode.dart';
|
||||
@@ -66,9 +63,11 @@ class _GymModeState extends ConsumerState<GymMode> {
|
||||
|
||||
Future<int> _loadGymState() async {
|
||||
widget._logger.fine('Loading gym state');
|
||||
final routine = await context.read<RoutinesProvider>().fetchAndSetRoutineFull(
|
||||
widget._args.routineId,
|
||||
);
|
||||
final routine = await ref
|
||||
.read(routinesRiverpodProvider.notifier)
|
||||
.fetchAndSetRoutineFull(
|
||||
widget._args.routineId,
|
||||
);
|
||||
final gymViewModel = ref.read(gymStateProvider.notifier);
|
||||
final initialPage = gymViewModel.initData(
|
||||
routine,
|
||||
|
||||
@@ -99,7 +99,7 @@ class _LogPageState extends ConsumerState<LogPage> {
|
||||
return Column(
|
||||
children: [
|
||||
NavigationHeader(
|
||||
log.exercise.getTranslation(Localizations.localeOf(context).languageCode).name,
|
||||
log.exerciseObj.getTranslation(Localizations.localeOf(context).languageCode).name,
|
||||
widget._controller,
|
||||
),
|
||||
|
||||
@@ -141,15 +141,15 @@ class _LogPageState extends ConsumerState<LogPage> {
|
||||
),
|
||||
),
|
||||
),
|
||||
if (log.exercise.showPlateCalculator) const LogsPlatesWidget(),
|
||||
if (log.exerciseObj.showPlateCalculator) const LogsPlatesWidget(),
|
||||
if (slotEntryPage.setConfigData!.comment.isNotEmpty)
|
||||
Text(slotEntryPage.setConfigData!.comment, textAlign: TextAlign.center),
|
||||
const SizedBox(height: 10),
|
||||
Expanded(
|
||||
child: (state.routine.filterLogsByExercise(log.exercise.id!).isNotEmpty)
|
||||
child: (state.routine.filterLogsByExercise(log.exerciseId).isNotEmpty)
|
||||
? LogsPastLogsWidget(
|
||||
log: log,
|
||||
pastLogs: state.routine.filterLogsByExercise(log.exercise.id!),
|
||||
pastLogs: state.routine.filterLogsByExercise(log.exerciseId),
|
||||
onCopy: (pastLog) {
|
||||
_logFormKey.currentState?.copyFromPastLog(pastLog);
|
||||
},
|
||||
@@ -693,13 +693,12 @@ class _LogFormWidgetState extends ConsumerState<LogFormWidget> {
|
||||
});
|
||||
_form.currentState!.save();
|
||||
|
||||
try {
|
||||
final gymState = ref.read(gymStateProvider);
|
||||
final gymProvider = ref.read(gymStateProvider.notifier);
|
||||
final gymState = ref.read(gymStateProvider);
|
||||
final gymProvider = ref.read(gymStateProvider.notifier);
|
||||
|
||||
logProvider.addEntry(_log);
|
||||
final page = gymState.getSlotEntryPageByIndex()!;
|
||||
gymProvider.markSlotPageAsDone(page.uuid, isDone: true);
|
||||
logProvider.addEntry(_log);
|
||||
final page = gymState.getSlotEntryPageByIndex()!;
|
||||
gymProvider.markSlotPageAsDone(page.uuid, isDone: true);
|
||||
|
||||
if (mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
|
||||
@@ -35,19 +35,17 @@ class SessionPage extends ConsumerWidget {
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final state = ref.watch(gymStateProvider);
|
||||
|
||||
final session = state.routine.sessions
|
||||
.map((sessionApi) => sessionApi.session)
|
||||
.firstWhere(
|
||||
(session) => session.date.isSameDayAs(clock.now()),
|
||||
orElse: () => WorkoutSession(
|
||||
dayId: state.dayId,
|
||||
routineId: state.routine.id,
|
||||
impression: DEFAULT_IMPRESSION,
|
||||
date: clock.now(),
|
||||
timeStart: state.startTime,
|
||||
timeEnd: TimeOfDay.fromDateTime(clock.now()),
|
||||
),
|
||||
);
|
||||
final session = state.routine.sessions.firstWhere(
|
||||
(session) => session.date.isSameDayAs(clock.now()),
|
||||
orElse: () => WorkoutSession(
|
||||
dayId: state.dayId,
|
||||
routineId: state.routine.id,
|
||||
impression: DEFAULT_IMPRESSION,
|
||||
date: clock.now(),
|
||||
timeStart: state.startTime,
|
||||
timeEnd: TimeOfDay.fromDateTime(clock.now()),
|
||||
),
|
||||
);
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
@@ -59,7 +57,7 @@ class SessionPage extends ConsumerWidget {
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 15),
|
||||
child: SessionForm(
|
||||
state.routine.id,
|
||||
state.routine.id!,
|
||||
onSaved: () => _controller.nextPage(
|
||||
duration: DEFAULT_ANIMATION_DURATION,
|
||||
curve: DEFAULT_ANIMATION_CURVE,
|
||||
|
||||
@@ -21,11 +21,10 @@ import 'package:collection/collection.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:wger/helpers/date.dart';
|
||||
import 'package:wger/l10n/generated/app_localizations.dart';
|
||||
import 'package:wger/models/workouts/routine.dart';
|
||||
import 'package:wger/models/workouts/session_api.dart';
|
||||
import 'package:wger/models/workouts/session.dart';
|
||||
import 'package:wger/providers/gym_state.dart';
|
||||
import 'package:wger/providers/routines.dart';
|
||||
import 'package:wger/widgets/core/progress_indicator.dart';
|
||||
@@ -59,9 +58,11 @@ class _WorkoutSummaryState extends ConsumerState<WorkoutSummary> {
|
||||
widget._logger.fine('Loading routine data');
|
||||
final gymState = ref.read(gymStateProvider);
|
||||
|
||||
_routine = await context.read<RoutinesProvider>().fetchAndSetRoutineFull(
|
||||
gymState.routine.id!,
|
||||
);
|
||||
_routine = await ref
|
||||
.read(routinesRiverpodProvider.notifier)
|
||||
.fetchAndSetRoutineFull(
|
||||
gymState.routine.id!,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -84,7 +85,7 @@ class _WorkoutSummaryState extends ConsumerState<WorkoutSummary> {
|
||||
} else if (snapshot.connectionState == ConnectionState.done) {
|
||||
return WorkoutSessionStats(
|
||||
_routine.sessions.firstWhereOrNull(
|
||||
(s) => s.session.date.isSameDayAs(clock.now()),
|
||||
(s) => s.date.isSameDayAs(clock.now()),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -101,15 +102,15 @@ class _WorkoutSummaryState extends ConsumerState<WorkoutSummary> {
|
||||
|
||||
class WorkoutSessionStats extends ConsumerWidget {
|
||||
final _logger = Logger('WorkoutSessionStats');
|
||||
final WorkoutSessionApi? _sessionApi;
|
||||
final WorkoutSession? _session;
|
||||
|
||||
WorkoutSessionStats(this._sessionApi, {super.key});
|
||||
WorkoutSessionStats(this._session, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final i18n = AppLocalizations.of(context);
|
||||
|
||||
if (_sessionApi == null) {
|
||||
if (_session == null) {
|
||||
return Center(
|
||||
child: Text(
|
||||
'Nothing logged yet.',
|
||||
@@ -118,9 +119,8 @@ class WorkoutSessionStats extends ConsumerWidget {
|
||||
);
|
||||
}
|
||||
|
||||
final session = _sessionApi.session;
|
||||
final sessionDuration = session.duration;
|
||||
final totalVolume = _sessionApi.volume;
|
||||
final sessionDuration = _session.duration;
|
||||
final totalVolume = _session.volume;
|
||||
|
||||
/// We assume that users will do exercises (mostly) either in metric or imperial
|
||||
/// units so we just display the higher one.
|
||||
@@ -166,9 +166,9 @@ class WorkoutSessionStats extends ConsumerWidget {
|
||||
// color: theme.colorScheme.tertiaryContainer,
|
||||
// ),
|
||||
const SizedBox(height: 10),
|
||||
MuscleGroupsCard(_sessionApi.logs),
|
||||
MuscleGroupsCard(_session.logs),
|
||||
const SizedBox(height: 10),
|
||||
ExercisesCard(_sessionApi),
|
||||
ExercisesCard(_session),
|
||||
FilledButton(
|
||||
onPressed: () {
|
||||
ref.read(gymStateProvider.notifier).clear();
|
||||
|
||||
@@ -33,16 +33,16 @@ class DayLogWidget extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final sessionApi = _routine.sessions.firstWhere(
|
||||
(sessionApi) => sessionApi.session.date.isSameDayAs(_date),
|
||||
final session = _routine.sessions.firstWhere(
|
||||
(s) => s.date.isSameDayAs(_date),
|
||||
);
|
||||
final exercises = sessionApi.exercises;
|
||||
final exercises = session.exercises;
|
||||
|
||||
return Column(
|
||||
spacing: 10,
|
||||
children: [
|
||||
Card(child: SessionInfo(sessionApi.session)),
|
||||
MuscleGroupsCard(sessionApi.logs),
|
||||
Card(child: SessionInfo(session)),
|
||||
MuscleGroupsCard(session.logs),
|
||||
|
||||
Column(
|
||||
spacing: 10,
|
||||
@@ -60,7 +60,7 @@ class DayLogWidget extends StatelessWidget {
|
||||
translation.name,
|
||||
style: Theme.of(context).textTheme.titleLarge,
|
||||
),
|
||||
...sessionApi.logs
|
||||
...session.logs
|
||||
.where((l) => l.exerciseId == exercise.id)
|
||||
.map(
|
||||
(log) => Row(
|
||||
@@ -71,7 +71,7 @@ class DayLogWidget extends StatelessWidget {
|
||||
icon: const Icon(Icons.delete),
|
||||
key: ValueKey('delete-log-${log.id}'),
|
||||
onPressed: () {
|
||||
showDeleteDialog(context, translation.name, log);
|
||||
showDeleteLogDialog(context, translation.name, log);
|
||||
},
|
||||
),
|
||||
],
|
||||
|
||||
@@ -21,10 +21,10 @@ import 'package:wger/helpers/i18n.dart';
|
||||
import 'package:wger/l10n/generated/app_localizations.dart';
|
||||
import 'package:wger/models/exercises/exercise.dart';
|
||||
import 'package:wger/models/workouts/log.dart';
|
||||
import 'package:wger/models/workouts/session_api.dart';
|
||||
import 'package:wger/models/workouts/session.dart';
|
||||
|
||||
class ExercisesCard extends StatelessWidget {
|
||||
final WorkoutSessionApi session;
|
||||
final WorkoutSession session;
|
||||
|
||||
const ExercisesCard(this.session, {super.key});
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ class MuscleGroupsCard extends StatelessWidget {
|
||||
|
||||
List<MuscleGroup> _getMuscleGroups(BuildContext context) {
|
||||
final allMuscles = logs
|
||||
.expand((log) => [...log.exercise.muscles, ...log.exercise.musclesSecondary])
|
||||
.expand((log) => [...log.exerciseObj.muscles, ...log.exerciseObj.musclesSecondary])
|
||||
.toList();
|
||||
if (allMuscles.isEmpty) {
|
||||
return [];
|
||||
|
||||
@@ -74,7 +74,9 @@ class _SessionInfoState extends State<SessionInfo> {
|
||||
),
|
||||
SessionRow(
|
||||
label: i18n.notes,
|
||||
value: widget._session.notes.isNotEmpty ? widget._session.notes : '-/-',
|
||||
value: (widget._session.notes != null && widget._session.notes!.isNotEmpty)
|
||||
? widget._session.notes!
|
||||
: '-/-',
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -474,7 +474,7 @@ packages:
|
||||
source: hosted
|
||||
version: "8.4.0"
|
||||
flex_seed_scheme:
|
||||
dependency: "direct main"
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flex_seed_scheme
|
||||
sha256: a3183753bbcfc3af106224bff3ab3e1844b73f58062136b7499919f49f3667e7
|
||||
|
||||
@@ -72,6 +72,7 @@ dependencies:
|
||||
stream_transform: ^2.1.1
|
||||
state_notifier: ^1.0.0
|
||||
connectivity_plus: ^7.0.0
|
||||
powersync: ^1.16.2
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
||||
@@ -920,6 +920,39 @@ class MockAppLocalizations extends _i1.Mock implements _i2.AppLocalizations {
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get impressionGood =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#impressionGood),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#impressionGood),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get impressionNeutral =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#impressionNeutral),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#impressionNeutral),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get impressionBad =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#impressionBad),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#impressionBad),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get impression =>
|
||||
(super.noSuchMethod(
|
||||
@@ -1074,6 +1107,127 @@ class MockAppLocalizations extends _i1.Mock implements _i2.AppLocalizations {
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get gymModeShowExercises =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#gymModeShowExercises),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#gymModeShowExercises),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get gymModeShowTimer =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#gymModeShowTimer),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#gymModeShowTimer),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get gymModeTimerType =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#gymModeTimerType),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#gymModeTimerType),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get gymModeTimerTypeHelText =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#gymModeTimerTypeHelText),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#gymModeTimerTypeHelText),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get countdown =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#countdown),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#countdown),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get stopwatch =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#stopwatch),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#stopwatch),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get gymModeDefaultCountdownTime =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#gymModeDefaultCountdownTime),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#gymModeDefaultCountdownTime),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get gymModeNotifyOnCountdownFinish =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#gymModeNotifyOnCountdownFinish),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#gymModeNotifyOnCountdownFinish),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get duration =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#duration),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#duration),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get volume =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#volume),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#volume),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get workoutCompleted =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#workoutCompleted),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#workoutCompleted),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get plateCalculator =>
|
||||
(super.noSuchMethod(
|
||||
@@ -2858,6 +3012,17 @@ class MockAppLocalizations extends _i1.Mock implements _i2.AppLocalizations {
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get superset =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#superset),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.getter(#superset),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String get setHasProgression =>
|
||||
(super.noSuchMethod(
|
||||
@@ -3667,6 +3832,17 @@ class MockAppLocalizations extends _i1.Mock implements _i2.AppLocalizations {
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String durationHoursMinutes(int? hours, int? minutes) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#durationHoursMinutes, [hours, minutes]),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.method(#durationHoursMinutes, [hours, minutes]),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String chartAllTimeTitle(String? name) =>
|
||||
(super.noSuchMethod(
|
||||
@@ -3755,6 +3931,17 @@ class MockAppLocalizations extends _i1.Mock implements _i2.AppLocalizations {
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String formMinMaxValues(int? min, int? max) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#formMinMaxValues, [min, max]),
|
||||
returnValue: _i3.dummyValue<String>(
|
||||
this,
|
||||
Invocation.method(#formMinMaxValues, [min, max]),
|
||||
),
|
||||
)
|
||||
as String);
|
||||
|
||||
@override
|
||||
String enterMinCharacters(String? min) =>
|
||||
(super.noSuchMethod(
|
||||
|
||||
@@ -15,7 +15,6 @@ void main() {
|
||||
late PlateCalculatorNotifier notifier;
|
||||
late ProviderContainer container;
|
||||
late MockSharedPreferencesAsync mockPrefs;
|
||||
late ProviderContainer container;
|
||||
|
||||
setUp(() {
|
||||
mockPrefs = MockSharedPreferencesAsync();
|
||||
|
||||
@@ -21,6 +21,7 @@ import 'package:shared_preferences/src/shared_preferences_async.dart' as _i2;
|
||||
// ignore_for_file: unnecessary_parenthesis
|
||||
// ignore_for_file: camel_case_types
|
||||
// ignore_for_file: subtype_of_sealed_class
|
||||
// ignore_for_file: invalid_use_of_internal_member
|
||||
|
||||
/// A class which mocks [SharedPreferencesAsync].
|
||||
///
|
||||
|
||||
@@ -20,14 +20,11 @@ import 'package:clock/clock.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart' as riverpod;
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart';
|
||||
import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart';
|
||||
import 'package:wger/l10n/generated/app_localizations.dart';
|
||||
import 'package:wger/providers/base_provider.dart';
|
||||
import 'package:wger/providers/exercises.dart';
|
||||
import 'package:wger/models/exercises/exercise.dart';
|
||||
import 'package:wger/providers/exercise_data.dart';
|
||||
import 'package:wger/providers/routines.dart';
|
||||
import 'package:wger/screens/gym_mode.dart';
|
||||
import 'package:wger/screens/routine_screen.dart';
|
||||
@@ -43,54 +40,38 @@ import 'package:wger/widgets/routines/gym_mode/timer.dart';
|
||||
|
||||
import '../../../test_data/exercises.dart';
|
||||
import '../../../test_data/routines.dart';
|
||||
import 'gym_mode_test.mocks.dart';
|
||||
|
||||
@GenerateMocks([WgerBaseProvider, ExercisesProvider, RoutinesProvider])
|
||||
void main() {
|
||||
final key = GlobalKey<NavigatorState>();
|
||||
|
||||
final mockRoutinesProvider = MockRoutinesProvider();
|
||||
final mockExerciseProvider = MockExercisesProvider();
|
||||
final testRoutine = getTestRoutine();
|
||||
final testExercises = getTestExercises();
|
||||
|
||||
setUp(() {
|
||||
when(mockRoutinesProvider.findById(any)).thenReturn(testRoutine);
|
||||
when(mockRoutinesProvider.items).thenReturn([testRoutine]);
|
||||
when(mockRoutinesProvider.repetitionUnits).thenReturn(testRepetitionUnits);
|
||||
when(mockRoutinesProvider.findRepetitionUnitById(1)).thenReturn(testRepetitionUnit1);
|
||||
when(mockRoutinesProvider.weightUnits).thenReturn(testWeightUnits);
|
||||
when(mockRoutinesProvider.findWeightUnitById(1)).thenReturn(testWeightUnit1);
|
||||
when(
|
||||
mockRoutinesProvider.fetchAndSetRoutineFull(any),
|
||||
).thenAnswer((_) => Future.value(testRoutine));
|
||||
|
||||
SharedPreferencesAsyncPlatform.instance = InMemorySharedPreferencesAsync.empty();
|
||||
});
|
||||
|
||||
Widget renderGymMode({locale = 'en'}) {
|
||||
return ChangeNotifierProvider<RoutinesProvider>(
|
||||
create: (context) => mockRoutinesProvider,
|
||||
child: ChangeNotifierProvider<ExercisesProvider>(
|
||||
create: (context) => mockExerciseProvider,
|
||||
child: riverpod.ProviderScope(
|
||||
child: MaterialApp(
|
||||
locale: Locale(locale),
|
||||
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||||
supportedLocales: AppLocalizations.supportedLocales,
|
||||
navigatorKey: key,
|
||||
home: TextButton(
|
||||
onPressed: () => key.currentState!.push(
|
||||
MaterialPageRoute<void>(
|
||||
settings: const RouteSettings(arguments: GymModeArguments(1, 1, 1)),
|
||||
builder: (_) => const GymModeScreen(),
|
||||
),
|
||||
),
|
||||
child: const SizedBox(),
|
||||
return riverpod.ProviderScope(
|
||||
overrides: [
|
||||
routinesRiverpodProvider.overrideWithValue(RoutinesState(routines: [testRoutine])),
|
||||
exercisesProvider.overrideWith((ref) => Stream<List<Exercise>>.value(<Exercise>[])),
|
||||
],
|
||||
child: MaterialApp(
|
||||
locale: Locale(locale),
|
||||
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||||
supportedLocales: AppLocalizations.supportedLocales,
|
||||
navigatorKey: key,
|
||||
home: TextButton(
|
||||
onPressed: () => key.currentState!.push(
|
||||
MaterialPageRoute<void>(
|
||||
settings: const RouteSettings(arguments: GymModeArguments(1, 1, 1)),
|
||||
builder: (_) => const GymModeScreen(),
|
||||
),
|
||||
routes: {RoutineScreen.routeName: (ctx) => const RoutineScreen()},
|
||||
),
|
||||
child: const SizedBox(),
|
||||
),
|
||||
routes: {RoutineScreen.routeName: (ctx) => const RoutineScreen()},
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -98,15 +79,6 @@ void main() {
|
||||
testWidgets(
|
||||
'Test the widgets on the gym mode screen',
|
||||
(WidgetTester tester) async {
|
||||
when(mockExerciseProvider.findExerciseById(1)).thenReturn(testExercises[0]);
|
||||
when(mockExerciseProvider.findExerciseById(6)).thenReturn(testExercises[5]);
|
||||
when(
|
||||
mockExerciseProvider.findExercisesByVariationId(
|
||||
null,
|
||||
exerciseIdToExclude: anyNamed('exerciseIdToExclude'),
|
||||
),
|
||||
).thenReturn([]);
|
||||
|
||||
await withClock(Clock.fixed(DateTime(2025, 3, 29, 14, 33)), () async {
|
||||
await tester.pumpWidget(renderGymMode());
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ void main() {
|
||||
);
|
||||
notifier.calculatePages();
|
||||
when(mockRoutinesProvider.editSession(any)).thenAnswer(
|
||||
(_) => Future.value(testRoutine.sessions[0].session),
|
||||
(_) => Future.value(testRoutine.sessions[0]),
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user