Skip to content

Commit 1ecbfa8

Browse files
committed
Correctly set the start and end time to null, if this is what comes from the API
1 parent bc0672d commit 1ecbfa8

File tree

9 files changed

+55
-17
lines changed

9 files changed

+55
-17
lines changed

lib/helpers/json.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ TimeOfDay stringToTime(String? time) {
6262
return TimeOfDay.fromDateTime(DateTime.parse('2020-01-01 $out'));
6363
}
6464

65+
TimeOfDay? stringToTimeNull(String? time) {
66+
if (time == null) {
67+
return null;
68+
}
69+
70+
return TimeOfDay.fromDateTime(DateTime.parse('2020-01-01 $time'));
71+
}
72+
6573
/*
6674
* Converts a datetime to time.
6775
*/

lib/models/nutrition/meal.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class Meal {
3535
@JsonKey(name: 'plan')
3636
late int planId;
3737

38-
@JsonKey(toJson: timeToString, fromJson: stringToTime)
38+
@JsonKey(toJson: timeToString, fromJson: stringToTimeNull)
3939
TimeOfDay? time;
4040

4141
@JsonKey(name: 'name')

lib/models/nutrition/meal.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/models/workouts/session.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ class WorkoutSession {
4242
@JsonKey(required: false, defaultValue: '')
4343
late String notes;
4444

45-
@JsonKey(required: true, name: 'time_start', toJson: timeToString, fromJson: stringToTime)
45+
@JsonKey(required: true, name: 'time_start', toJson: timeToString, fromJson: stringToTimeNull)
4646
late TimeOfDay? timeStart;
4747

48-
@JsonKey(required: true, name: 'time_end', toJson: timeToString, fromJson: stringToTime)
48+
@JsonKey(required: true, name: 'time_end', toJson: timeToString, fromJson: stringToTimeNull)
4949
late TimeOfDay? timeEnd;
5050

5151
@JsonKey(required: false, includeToJson: false, defaultValue: [])

lib/models/workouts/session.g.dart

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/widgets/nutrition/forms.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class MealForm extends StatelessWidget {
7474
}
7575
},
7676
onSaved: (newValue) {
77-
_meal.time = stringToTime(newValue);
77+
_meal.time = stringToTimeNull(newValue);
7878
},
7979
),
8080
TextFormField(

lib/widgets/routines/gym_mode/gym_mode.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,12 @@ class _GymModeState extends ConsumerState<GymMode> {
7575
final validUntil = ref.read(gymStateProvider).validUntil;
7676
final currentPage = ref.read(gymStateProvider).currentPage;
7777
final savedDayId = ref.read(gymStateProvider).dayId;
78-
7978
final newDayId = widget._dayDataGym.day!.id!;
80-
final shouldReset =
81-
widget._dayDataGym.day!.id != savedDayId || validUntil.isBefore(DateTime.now());
82-
widget._logger.fine('Day ID mismatch or expired validUntil date. Resetting to page 0.');
79+
80+
final shouldReset = newDayId != savedDayId || validUntil.isBefore(DateTime.now());
81+
if (shouldReset) {
82+
widget._logger.fine('Day ID mismatch or expired validUntil date. Resetting to page 0.');
83+
}
8384
final initialPage = shouldReset ? 0 : currentPage;
8485

8586
WidgetsBinding.instance.addPostFrameCallback((_) {

lib/widgets/routines/gym_mode/session_page.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@ class SessionPage extends StatefulWidget {
3535
late WorkoutSession _session;
3636
final PageController _controller;
3737
final Map<Exercise, int> _exercisePages;
38+
final TimeOfDay _start;
3839

3940
SessionPage(
4041
this._routine,
4142
this._controller,
42-
start,
43+
this._start,
4344
this._exercisePages,
4445
) {
4546
_session = _routine.sessions.map((sessionApi) => sessionApi.session).firstWhere(
@@ -49,7 +50,7 @@ class SessionPage extends StatefulWidget {
4950
impression: DEFAULT_IMPRESSION,
5051
date: clock.now(),
5152
timeEnd: TimeOfDay.now(),
52-
timeStart: start,
53+
timeStart: _start,
5354
),
5455
);
5556
}
@@ -72,8 +73,8 @@ class _SessionPageState extends State<SessionPage> {
7273
void initState() {
7374
super.initState();
7475

75-
timeStartController.text = timeToString(widget._session.timeStart)!;
76-
timeEndController.text = timeToString(widget._session.timeEnd)!;
76+
timeStartController.text = timeToString(widget._session.timeStart ?? widget._start)!;
77+
timeEndController.text = timeToString(widget._session.timeEnd ?? TimeOfDay.now())!;
7778
notesController.text = widget._session.notes;
7879

7980
selectedImpression[widget._session.impression - 1] = true;

test/workout/gym_mode_session_screen_test.dart

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ import 'package:flutter_test/flutter_test.dart';
2222
import 'package:mockito/annotations.dart';
2323
import 'package:mockito/mockito.dart';
2424
import 'package:provider/provider.dart';
25+
import 'package:wger/helpers/json.dart';
2526
import 'package:wger/l10n/generated/app_localizations.dart';
27+
import 'package:wger/models/workouts/routine.dart';
2628
import 'package:wger/providers/routines.dart';
2729
import 'package:wger/widgets/routines/gym_mode/session_page.dart';
2830

@@ -32,8 +34,11 @@ import 'gym_mode_session_screen_test.mocks.dart';
3234
@GenerateMocks([RoutinesProvider])
3335
void main() {
3436
final mockRoutinesProvider = MockRoutinesProvider();
37+
late Routine testRoutine;
3538

36-
final testRoutine = getTestRoutine();
39+
setUp(() {
40+
testRoutine = getTestRoutine();
41+
});
3742

3843
Widget renderSessionPage({locale = 'en'}) {
3944
return ChangeNotifierProvider<RoutinesProvider>(
@@ -46,7 +51,7 @@ void main() {
4651
body: SessionPage(
4752
testRoutine,
4853
PageController(),
49-
const TimeOfDay(hour: 12, minute: 34),
54+
const TimeOfDay(hour: 13, minute: 35),
5055
const {},
5156
),
5257
),
@@ -65,6 +70,29 @@ void main() {
6570
});
6671
});
6772

73+
testWidgets('Test that data from session is loaded - null times', (WidgetTester tester) async {
74+
testRoutine.sessions[0].session.timeStart = null;
75+
testRoutine.sessions[0].session.timeEnd = null;
76+
final timeNow = timeToString(TimeOfDay.now())!;
77+
78+
withClock(Clock.fixed(DateTime(2021, 5, 1)), () async {
79+
await tester.pumpWidget(renderSessionPage());
80+
expect(find.text('13:35'), findsOneWidget);
81+
expect(find.text(timeNow), findsOneWidget);
82+
});
83+
});
84+
85+
testWidgets('Test correct default data (no existing session)', (WidgetTester tester) async {
86+
testRoutine.sessions = [];
87+
final timeNow = timeToString(TimeOfDay.now())!;
88+
89+
await tester.pumpWidget(renderSessionPage());
90+
expect(find.text('13:35'), findsOneWidget);
91+
expect(find.text(timeNow), findsOneWidget);
92+
final toggleButtons = tester.widget<ToggleButtons>(find.byType(ToggleButtons));
93+
expect(toggleButtons.isSelected[1], isTrue);
94+
});
95+
6896
testWidgets('Test that correct data is send to server', (WidgetTester tester) async {
6997
withClock(Clock.fixed(DateTime(2021, 5, 1)), () async {
7098
await tester.pumpWidget(renderSessionPage());

0 commit comments

Comments
 (0)