Skip to content

Commit 3085b71

Browse files
committed
fix: preserve local onboarding state
1 parent 6fd1db3 commit 3085b71

4 files changed

Lines changed: 89 additions & 23 deletions

File tree

‎lib/presentation/my_page/my_page_screen.dart‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,7 @@ class _DetailedNotificationTile extends StatefulWidget {
9797
_DetailedNotificationTileState();
9898
}
9999

100-
class _DetailedNotificationTileState
101-
extends State<_DetailedNotificationTile> {
100+
class _DetailedNotificationTileState extends State<_DetailedNotificationTile> {
102101
bool _enabled = false;
103102
bool _loading = true;
104103

@@ -402,8 +401,8 @@ class _FrameView extends StatelessWidget {
402401
Widget build(BuildContext context) {
403402
final textTheme = Theme.of(context).textTheme;
404403
final colorScheme = Theme.of(context).colorScheme;
405-
return Container(
406-
decoration: BoxDecoration(color: Theme.of(context).colorScheme.surface),
404+
return Material(
405+
color: Theme.of(context).colorScheme.surface,
407406
child: Padding(
408407
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 19),
409408
child: Column(

‎lib/presentation/onboarding/preparation_order/cubit/preparation_order_cubit.dart‎

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,27 @@ class PreparationOrderCubit extends Cubit<PreparationOrderState> {
3131
}
3232

3333
void preparationOrderSaved() {
34-
final newList = state.toOnboardingState().preparationStepList;
35-
final oldList = onboardingCubit.state.preparationStepList;
36-
37-
assert(newList.length == oldList.length);
38-
39-
for (int i = 0; i < oldList.length; i++) {
40-
for (int j = 0; i < oldList.length; j++) {
41-
if (oldList[j].id == newList[i].id) {
42-
oldList[j] = oldList[j].copyWith(
43-
nextPreparationId: newList[i].nextPreparationId,
34+
final orderedList = state.toOnboardingState().preparationStepList;
35+
final existingSteps = {
36+
for (final step in onboardingCubit.state.preparationStepList)
37+
step.id: step,
38+
};
39+
40+
assert(orderedList.length == existingSteps.length);
41+
42+
final reorderedSteps = orderedList
43+
.map((step) {
44+
final existingStep = existingSteps[step.id];
45+
return OnboardingPreparationStepState(
46+
id: step.id,
47+
preparationName: step.preparationName,
48+
preparationTime:
49+
existingStep?.preparationTime ?? step.preparationTime,
50+
nextPreparationId: step.nextPreparationId,
4451
);
45-
break;
46-
}
47-
}
48-
}
49-
onboardingCubit.onboardingFormChanged(preparationStepList: newList);
52+
})
53+
.toList(growable: false);
54+
55+
onboardingCubit.onboardingFormChanged(preparationStepList: reorderedSteps);
5056
}
5157
}

‎test/presentation/onboarding/cubit/onboarding_cubit_test.dart‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:on_time_front/domain/repositories/preparation_repository.dart';
44
import 'package:on_time_front/domain/repositories/user_repository.dart';
55
import 'package:on_time_front/domain/use-cases/onboard_use_case.dart';
66
import 'package:on_time_front/presentation/onboarding/cubit/onboarding_cubit.dart';
7+
import 'package:on_time_front/presentation/onboarding/preparation_order/cubit/preparation_order_cubit.dart';
78

89
void main() {
910
test(
@@ -86,6 +87,57 @@ void main() {
8687
);
8788
},
8889
);
90+
91+
test(
92+
'PreparationOrderCubit reorders immutable steps without losing durations',
93+
() {
94+
final onboardingCubit = OnboardingCubit(_FakeOnboardUseCase());
95+
addTearDown(onboardingCubit.close);
96+
onboardingCubit.onboardingFormChanged(
97+
preparationStepList: const [
98+
OnboardingPreparationStepState(
99+
id: 'step-1',
100+
preparationName: 'Shower',
101+
preparationTime: Duration(minutes: 10),
102+
nextPreparationId: 'step-2',
103+
),
104+
OnboardingPreparationStepState(
105+
id: 'step-2',
106+
preparationName: 'Pack',
107+
preparationTime: Duration(minutes: 5),
108+
),
109+
],
110+
);
111+
final orderCubit = PreparationOrderCubit(
112+
onboardingCubit: onboardingCubit,
113+
);
114+
addTearDown(orderCubit.close);
115+
116+
orderCubit.preparationOrderChanged(0, 2);
117+
orderCubit.preparationOrderSaved();
118+
119+
expect(
120+
onboardingCubit.state.preparationStepList
121+
.map((step) => step.id)
122+
.toList(),
123+
['step-2', 'step-1'],
124+
);
125+
expect(
126+
onboardingCubit.state.preparationStepList
127+
.map((step) => step.preparationTime)
128+
.toList(),
129+
const [Duration(minutes: 5), Duration(minutes: 10)],
130+
);
131+
expect(
132+
onboardingCubit.state.preparationStepList.first.nextPreparationId,
133+
'step-1',
134+
);
135+
expect(
136+
onboardingCubit.state.preparationStepList.last.nextPreparationId,
137+
isNull,
138+
);
139+
},
140+
);
89141
}
90142

91143
class _OnboardingSubmission {

‎test/presentation/onboarding/screens/onboarding_screen_test.dart‎

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,10 @@ void main() {
8181
await tester.pumpAndSettle();
8282

8383
expect(
84-
find.text('Please select your usual preparation process.'),
84+
find.text(
85+
'Please select your usual preparation process.',
86+
findRichText: true,
87+
),
8588
findsOneWidget,
8689
);
8790
expect(_nextButton(tester).onPressed, isNull);
@@ -92,12 +95,15 @@ void main() {
9295

9396
await tester.tap(find.widgetWithText(ElevatedButton, 'Next'));
9497
await tester.pumpAndSettle();
95-
expect(find.textContaining('order'), findsOneWidget);
98+
expect(find.textContaining('order', findRichText: true), findsOneWidget);
9699

97100
await tester.tap(find.widgetWithText(ElevatedButton, 'Next'));
98101
await tester.pumpAndSettle();
99102
expect(
100-
find.text('Please tell us the time required for each step.'),
103+
find.text(
104+
'Please tell us the time required for each step.',
105+
findRichText: true,
106+
),
101107
findsOneWidget,
102108
);
103109
expect(_nextButton(tester).onPressed, isNull);
@@ -112,7 +118,10 @@ void main() {
112118

113119
await tester.tap(find.widgetWithText(ElevatedButton, 'Next'));
114120
await tester.pumpAndSettle();
115-
expect(find.text('Set your spare time'), findsOneWidget);
121+
expect(
122+
find.text('Set your spare time', findRichText: true),
123+
findsOneWidget,
124+
);
116125

117126
await tester.tap(find.widgetWithText(ElevatedButton, 'Next'));
118127
await tester.pumpAndSettle();

0 commit comments

Comments
 (0)