Skip to content

Commit 4e39d10

Browse files
authored
Merge pull request #564 from DevKor-github/feature/replace-error-snackbars-with-modal
[codex] Show error modal instead of snackbar
2 parents bf2b83e + 6ef1fc1 commit 4e39d10

7 files changed

Lines changed: 95 additions & 53 deletions

File tree

lib/presentation/my_page/my_page_modal/delete_user_modal.dart

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:on_time_front/domain/use-cases/delete_user_use_case.dart';
88
import 'package:on_time_front/l10n/app_localizations.dart';
99
import 'package:on_time_front/presentation/shared/components/custom_alert_dialog.dart';
1010
import 'package:on_time_front/presentation/shared/components/modal_wide_button.dart';
11+
import 'package:on_time_front/presentation/shared/components/two_action_dialog.dart';
1112
import 'package:on_time_front/presentation/shared/components/two_button_delete_dialog.dart';
1213

1314
class DeleteUserModal {
@@ -259,9 +260,21 @@ class _DeleteFeedbackDialogState extends State<_DeleteFeedbackDialog> {
259260
return;
260261
}
261262

262-
ScaffoldMessenger.of(context).showSnackBar(
263-
SnackBar(content: Text(AppLocalizations.of(context)!.error)),
263+
final l10n = AppLocalizations.of(context)!;
264+
await showTwoActionDialog(
265+
context,
266+
config: TwoActionDialogConfig(
267+
title: l10n.error,
268+
primaryAction: DialogActionConfig(
269+
label: l10n.ok,
270+
variant: ModalWideButtonVariant.destructive,
271+
),
272+
),
264273
);
274+
if (!mounted) {
275+
return;
276+
}
277+
265278
setState(() {
266279
_isDeleting = false;
267280
});

lib/presentation/my_page/preparation_spare_time_edit/preparation_spare_time_edit_screen.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import 'package:on_time_front/presentation/my_page/preparation_spare_time_edit/b
77
import 'package:on_time_front/l10n/app_localizations.dart';
88
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/bloc/preparation_form_bloc.dart';
99
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/components/preparation_form_create_list.dart';
10+
import 'package:on_time_front/presentation/shared/components/modal_wide_button.dart';
1011
import 'package:on_time_front/presentation/shared/components/time_stepper.dart';
12+
import 'package:on_time_front/presentation/shared/components/two_action_dialog.dart';
1113

1214
class PreparationSpareTimeEditScreen extends StatelessWidget {
1315
const PreparationSpareTimeEditScreen({super.key});
@@ -51,10 +53,14 @@ class _PreparationSpareTimeEditView extends StatelessWidget {
5153
Navigator.of(context).pop();
5254
} else if (state.status ==
5355
DefaultPreparationSpareTimeStatus.error) {
54-
ScaffoldMessenger.of(context).showSnackBar(
55-
SnackBar(
56-
content: Text(
57-
state.errorMessage ?? AppLocalizations.of(context)!.error,
56+
final l10n = AppLocalizations.of(context)!;
57+
showTwoActionDialog(
58+
context,
59+
config: TwoActionDialogConfig(
60+
title: state.errorMessage ?? l10n.error,
61+
primaryAction: DialogActionConfig(
62+
label: l10n.ok,
63+
variant: ModalWideButtonVariant.destructive,
5864
),
5965
),
6066
);

lib/presentation/onboarding/screens/onboarding_screen.dart

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import 'package:on_time_front/presentation/onboarding/schedule_spare_time/cubit/
1212
import 'package:on_time_front/presentation/onboarding/schedule_spare_time/screens/schedule_spare_time_form.dart';
1313
import 'package:on_time_front/presentation/onboarding/cubit/onboarding_cubit.dart';
1414
import 'package:on_time_front/presentation/onboarding/preparation_order/cubit/preparation_order_cubit.dart';
15+
import 'package:on_time_front/presentation/shared/components/modal_wide_button.dart';
1516
import 'package:on_time_front/presentation/shared/components/step_progress.dart';
17+
import 'package:on_time_front/presentation/shared/components/two_action_dialog.dart';
1618
import 'package:on_time_front/l10n/app_localizations.dart';
1719

1820
class OnboardingScreen extends StatelessWidget {
@@ -22,10 +24,7 @@ class OnboardingScreen extends StatelessWidget {
2224
Widget build(BuildContext context) {
2325
return BlocProvider(
2426
create: (context) => getIt.get<OnboardingCubit>(),
25-
child: Scaffold(
26-
resizeToAvoidBottomInset: false,
27-
body: _OnboardingForm(),
28-
),
27+
child: Scaffold(resizeToAvoidBottomInset: false, body: _OnboardingForm()),
2928
);
3029
}
3130
}
@@ -91,47 +90,50 @@ class _OnboardingFormState extends State<_OnboardingForm>
9190
),
9291
),
9392
],
94-
child: Builder(builder: (context) {
95-
return Column(
96-
children: <Widget>[
97-
_AppBar(
98-
tabController: _tabController,
99-
onUpdateCurrentPageIndex: _updateCurrentPageIndex,
100-
),
101-
Expanded(
102-
child: PageView(
103-
physics: const NeverScrollableScrollPhysics(),
104-
controller: _pageViewController,
105-
onPageChanged: _handlePageViewChanged,
106-
children: <Widget>[
107-
PreparationNameForm(),
108-
PreparationOrderForm(),
109-
PreparationTimeForm(),
110-
ScheduleSpareTimeForm(),
111-
],
93+
child: Builder(
94+
builder: (context) {
95+
return Column(
96+
children: <Widget>[
97+
_AppBar(
98+
tabController: _tabController,
99+
onUpdateCurrentPageIndex: _updateCurrentPageIndex,
100+
),
101+
Expanded(
102+
child: PageView(
103+
physics: const NeverScrollableScrollPhysics(),
104+
controller: _pageViewController,
105+
onPageChanged: _handlePageViewChanged,
106+
children: <Widget>[
107+
PreparationNameForm(),
108+
PreparationOrderForm(),
109+
PreparationTimeForm(),
110+
ScheduleSpareTimeForm(),
111+
],
112+
),
112113
),
113-
),
114-
SizedBox(
114+
SizedBox(
115115
height: 58,
116116
width: double.infinity,
117117
child: ElevatedButton(
118-
onPressed: !_isSubmitting &&
119-
context.select((OnboardingCubit cubit) =>
120-
cubit.state.isValid)
118+
onPressed:
119+
!_isSubmitting &&
120+
context.select(
121+
(OnboardingCubit cubit) => cubit.state.isValid,
122+
)
121123
? () => _onNextPageButtonClicked(context)
122124
: null,
123125
child: _isSubmitting
124126
? const SizedBox.square(
125127
dimension: 24,
126-
child: CircularProgressIndicator(
127-
strokeWidth: 2,
128-
),
128+
child: CircularProgressIndicator(strokeWidth: 2),
129129
)
130130
: Text(AppLocalizations.of(context)!.next),
131-
)),
132-
],
133-
);
134-
}),
131+
),
132+
),
133+
],
134+
);
135+
},
136+
),
135137
),
136138
),
137139
);
@@ -162,9 +164,15 @@ class _OnboardingFormState extends State<_OnboardingForm>
162164
await context.read<OnboardingCubit>().onboardingFormSubmitted();
163165
} catch (_) {
164166
if (!context.mounted) return;
165-
ScaffoldMessenger.of(context).showSnackBar(
166-
SnackBar(
167-
content: Text(AppLocalizations.of(context)!.error),
167+
final l10n = AppLocalizations.of(context)!;
168+
await showTwoActionDialog(
169+
context,
170+
config: TwoActionDialogConfig(
171+
title: l10n.error,
172+
primaryAction: DialogActionConfig(
173+
label: l10n.ok,
174+
variant: ModalWideButtonVariant.destructive,
175+
),
168176
),
169177
);
170178
} finally {
@@ -242,9 +250,7 @@ class _AppBar extends StatelessWidget {
242250
),
243251
),
244252
),
245-
SizedBox(
246-
width: iconButtonSize,
247-
)
253+
SizedBox(width: iconButtonSize),
248254
],
249255
);
250256
}

lib/presentation/schedule_create/components/schedule_multi_page_form.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import 'package:on_time_front/presentation/schedule_create/schedule_place_moving
1111
import 'package:on_time_front/presentation/schedule_create/schedule_place_moving_time/screens/schedule_place_moving_time_form.dart';
1212
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/cubit/schedule_form_spare_time_cubit.dart';
1313
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/screens/schedule_spare_and_preparing_time_form.dart';
14+
import 'package:on_time_front/presentation/shared/components/modal_wide_button.dart';
1415
import 'package:on_time_front/presentation/shared/components/step_progress.dart';
16+
import 'package:on_time_front/presentation/shared/components/two_action_dialog.dart';
1517
import 'package:on_time_front/l10n/app_localizations.dart';
1618

1719
class ScheduleMultiPageForm extends StatefulWidget {
@@ -56,10 +58,14 @@ class _ScheduleMultiPageFormState extends State<ScheduleMultiPageForm>
5658
Navigator.of(context).pop(true);
5759
} else if (state.submissionStatus ==
5860
ScheduleFormSubmissionStatus.failure) {
59-
ScaffoldMessenger.of(context).showSnackBar(
60-
SnackBar(
61-
content: Text(
62-
state.submissionError ?? AppLocalizations.of(context)!.error,
61+
final l10n = AppLocalizations.of(context)!;
62+
showTwoActionDialog(
63+
context,
64+
config: TwoActionDialogConfig(
65+
title: state.submissionError ?? l10n.error,
66+
primaryAction: DialogActionConfig(
67+
label: l10n.ok,
68+
variant: ModalWideButtonVariant.destructive,
6369
),
6470
),
6571
);

test/presentation/my_page/delete_user_modal_test.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:on_time_front/domain/repositories/user_repository.dart';
88
import 'package:on_time_front/domain/use-cases/delete_user_use_case.dart';
99
import 'package:on_time_front/l10n/app_localizations.dart';
1010
import 'package:on_time_front/presentation/my_page/my_page_modal/delete_user_modal.dart';
11+
import 'package:on_time_front/presentation/shared/components/two_action_dialog.dart';
1112
import 'package:on_time_front/presentation/shared/theme/theme.dart';
1213

1314
void main() {
@@ -144,10 +145,18 @@ void main() {
144145
await _openFeedbackDialog(tester);
145146

146147
await tester.tap(find.text('의견 보내고 탈퇴하기'));
147-
await tester.pumpAndSettle();
148+
await tester.pump();
149+
await tester.pump(const Duration(milliseconds: 200));
148150

151+
expect(find.byType(TwoActionDialog), findsOneWidget);
149152
expect(find.text('오류'), findsOneWidget);
150153
expect(find.text('더 좋은 서비스로 다시 만나요'), findsOneWidget);
154+
155+
await tester.tap(find.text('확인'));
156+
await tester.pumpAndSettle();
157+
158+
expect(find.byType(TwoActionDialog), findsNothing);
159+
expect(find.text('더 좋은 서비스로 다시 만나요'), findsOneWidget);
151160
expect(find.byType(CircularProgressIndicator), findsNothing);
152161
expect(repository.didSignOut, isFalse);
153162
expect(didConfirm, isFalse);

test/presentation/my_page/preparation_spare_time_edit/preparation_spare_time_edit_screen_test.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:on_time_front/presentation/app/bloc/auth/auth_bloc.dart';
1717
import 'package:on_time_front/presentation/my_page/preparation_spare_time_edit/bloc/default_preparation_spare_time_form_bloc.dart';
1818
import 'package:on_time_front/presentation/my_page/preparation_spare_time_edit/preparation_spare_time_edit_screen.dart';
1919
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/bloc/preparation_form_bloc.dart';
20+
import 'package:on_time_front/presentation/shared/components/two_action_dialog.dart';
2021
import 'package:on_time_front/presentation/shared/theme/theme.dart';
2122

2223
void main() {
@@ -85,7 +86,7 @@ void main() {
8586
await tester.pumpAndSettle();
8687

8788
expect(find.byType(PreparationSpareTimeEditScreen), findsOneWidget);
88-
expect(find.byType(SnackBar), findsOneWidget);
89+
expect(find.byType(TwoActionDialog), findsOneWidget);
8990
expect(find.textContaining('save failed'), findsOneWidget);
9091
});
9192

test/presentation/schedule_create/components/schedule_multi_page_form_test.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import 'package:on_time_front/presentation/schedule_create/components/top_bar.da
3333
import 'package:on_time_front/presentation/schedule_create/schedule_date_time/cubit/schedule_date_time_cubit.dart';
3434
import 'package:on_time_front/presentation/schedule_create/screens/schedule_create_screen.dart';
3535
import 'package:on_time_front/presentation/schedule_create/screens/schedule_edit_screen.dart';
36+
import 'package:on_time_front/presentation/shared/components/two_action_dialog.dart';
3637

3738
class StubAuthBloc extends Mock implements AuthBloc {
3839
StubAuthBloc(this._state);
@@ -471,7 +472,7 @@ void main() {
471472
await tester.pumpAndSettle();
472473

473474
expect(find.byType(ScheduleMultiPageForm), findsOneWidget);
474-
expect(find.byType(SnackBar), findsOneWidget);
475+
expect(find.byType(TwoActionDialog), findsOneWidget);
475476
});
476477

477478
testWidgets('edited name and place are submitted from form steps', (

0 commit comments

Comments
 (0)