Skip to content

Commit bc7ff68

Browse files
committed
[fix](pnalvarez): using block listener to answer to storage saving errors
1 parent d37dc3c commit bc7ff68

6 files changed

Lines changed: 100 additions & 30 deletions

File tree

lib/core/designsystem/organisms/show_error_dialog.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Future<void> showErrorDialog(
77
String title,
88
String content,
99
String ctaText,
10+
Function()? onCtaPressed,
1011
) {
1112
return showDialog<void>(
1213
context: context,
@@ -22,8 +23,11 @@ Future<void> showErrorDialog(
2223
actions: [
2324
Center(
2425
child: PrimaryButton(
25-
title: title,
26-
onPressed: () => Navigator.of(context).pop(),
26+
title: ctaText,
27+
onPressed: () {
28+
onCtaPressed?.call();
29+
Navigator.of(context).pop();
30+
},
2731
),
2832
),
2933
],

lib/layers/presentation/screens/startreading/start_reading_event.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ class DidEditProgressEvent extends StartReadingEvent {
88
class DidClickConfirmEvent extends StartReadingEvent {}
99

1010
class DidClickFinishBookEvent extends StartReadingEvent {}
11+
12+
class DidClickSavingErrorDismissEvent extends StartReadingEvent {}

lib/layers/presentation/screens/startreading/start_reading_page.dart

Lines changed: 53 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:mibook/core/designsystem/molecules/buttons/secondary_button.dart
77
import 'package:mibook/core/designsystem/molecules/indicators/progress_stepper.dart';
88
import 'package:mibook/core/designsystem/molecules/inputfields/input_field.dart';
99
import 'package:mibook/core/designsystem/organisms/app_nav_bar.dart';
10+
import 'package:mibook/core/designsystem/organisms/show_error_dialog.dart';
1011
import 'package:mibook/core/di/di.dart';
1112
import 'package:mibook/core/utils/strings.dart';
1213
import 'package:mibook/core/utils/strings.dart' as strings;
@@ -15,6 +16,9 @@ import 'package:mibook/layers/presentation/screens/startreading/start_reading_ev
1516
import 'package:mibook/layers/presentation/screens/startreading/start_reading_state.dart';
1617
import 'package:mibook/layers/presentation/screens/startreading/start_reading_view_model.dart';
1718

19+
typedef _BlocListener = BlocListener<StartReadingViewModel, StartReadingState>;
20+
typedef _BlocBuilder = BlocBuilder<StartReadingViewModel, StartReadingState>;
21+
1822
@RoutePage()
1923
class StartReadingPage extends StatelessWidget {
2024
final BookDetailsUI book;
@@ -36,34 +40,57 @@ class StartReadingPage extends StatelessWidget {
3640
class _StartReadingScaffold extends StatelessWidget {
3741
@override
3842
Widget build(BuildContext context) {
39-
return Scaffold(
40-
appBar: AppNavBar(
41-
titleText: startReading,
42-
onBack: context.router.maybePop,
43-
),
44-
body: BlocBuilder<StartReadingViewModel, StartReadingState>(
45-
builder: (context, state) {
46-
final viewModel = context.read<StartReadingViewModel>();
47-
if (state.shouldNavigateBack) {
48-
context.router.maybePop();
49-
}
50-
return _StartReadingContent(
51-
book: viewModel.book,
52-
progress: state.progress,
53-
errorMessage: state.inputErrorMessage,
54-
onChangeProgressText: (progress) {
55-
viewModel.add(
56-
DidEditProgressEvent(progress: int.tryParse(progress) ?? 0),
57-
);
58-
},
59-
onClickStartReading: () {
60-
viewModel.add(DidClickConfirmEvent());
61-
},
62-
onClickFinishBook: () {
63-
viewModel.add(DidClickFinishBookEvent());
43+
final viewModel = context.read<StartReadingViewModel>();
44+
45+
return _BlocListener(
46+
bloc: viewModel,
47+
listenWhen: (previous, current) =>
48+
previous.shouldShowSavingError != current.shouldShowSavingError &&
49+
current.shouldShowSavingError,
50+
listener: (context, state) {
51+
WidgetsBinding.instance.addPostFrameCallback((_) {
52+
showErrorDialog(
53+
context,
54+
'Error',
55+
'An error occurred while saving your reading progress. Please try again.',
56+
'OK',
57+
() {
58+
viewModel.add(DidClickSavingErrorDismissEvent());
6459
},
6560
);
66-
},
61+
});
62+
},
63+
child: Scaffold(
64+
appBar: AppNavBar(
65+
titleText: startReading,
66+
onBack: context.router.maybePop,
67+
),
68+
body: _BlocBuilder(
69+
builder: (context, state) {
70+
final viewModel = context.read<StartReadingViewModel>();
71+
if (state.shouldNavigateBack) {
72+
context.router.maybePop();
73+
}
74+
return _StartReadingContent(
75+
book: viewModel.book,
76+
progress: state.progress,
77+
errorMessage: state.inputErrorMessage,
78+
onChangeProgressText: (progress) {
79+
viewModel.add(
80+
DidEditProgressEvent(
81+
progress: int.tryParse(progress) ?? 0,
82+
),
83+
);
84+
},
85+
onClickStartReading: () {
86+
viewModel.add(DidClickConfirmEvent());
87+
},
88+
onClickFinishBook: () {
89+
viewModel.add(DidClickFinishBookEvent());
90+
},
91+
);
92+
},
93+
),
6794
),
6895
);
6996
}

lib/layers/presentation/screens/startreading/start_reading_view_model.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ class StartReadingViewModel extends Bloc<StartReadingEvent, StartReadingState> {
3030
final response = await _didClickFinishBook();
3131
emit(response);
3232
});
33+
on<DidClickSavingErrorDismissEvent>((event, emit) {
34+
final response = _handleDidClickSavingErrorDismiss();
35+
emit(response);
36+
});
3337
}
3438

3539
// Event Handler to DidEditProgressEvent
@@ -62,7 +66,15 @@ class StartReadingViewModel extends Bloc<StartReadingEvent, StartReadingState> {
6266
bookThumb: book.thumbnail,
6367
progress: progress,
6468
);
65-
await _startReading(reading: reading);
66-
return state.copyWith(shouldNavigateBack: true);
69+
try {
70+
await _startReading(reading: reading);
71+
return state.copyWith(shouldNavigateBack: true);
72+
} catch (_) {
73+
print('Error saving reading for bookId: ${book.id}');
74+
return state.copyWith(shouldShowSavingError: true);
75+
}
6776
}
77+
78+
StartReadingState _handleDidClickSavingErrorDismiss() =>
79+
state.copyWith(shouldShowSavingError: false);
6880
}

pubspec.lock

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ packages:
4949
url: "https://pub.dev"
5050
source: hosted
5151
version: "9.2.2"
52+
auto_route_generator:
53+
dependency: "direct main"
54+
description:
55+
name: auto_route_generator
56+
sha256: c9086eb07271e51b44071ad5cff34e889f3156710b964a308c2ab590769e79e6
57+
url: "https://pub.dev"
58+
source: hosted
59+
version: "9.0.0"
5260
auto_size_text:
5361
dependency: "direct main"
5462
description:
@@ -672,6 +680,14 @@ packages:
672680
url: "https://pub.dev"
673681
source: hosted
674682
version: "2.3.0"
683+
petitparser:
684+
dependency: transitive
685+
description:
686+
name: petitparser
687+
sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1"
688+
url: "https://pub.dev"
689+
source: hosted
690+
version: "7.0.1"
675691
platform:
676692
dependency: transitive
677693
description:
@@ -1093,6 +1109,14 @@ packages:
10931109
url: "https://pub.dev"
10941110
source: hosted
10951111
version: "1.1.0"
1112+
xml:
1113+
dependency: transitive
1114+
description:
1115+
name: xml
1116+
sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025"
1117+
url: "https://pub.dev"
1118+
source: hosted
1119+
version: "6.6.1"
10961120
yaml:
10971121
dependency: transitive
10981122
description:

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ dependencies:
3232
shared_preferences: 2.5.3
3333
auto_size_text: 3.0.0
3434
path_provider: ^2.1.5
35+
auto_route_generator: ^9.0.0
3536

3637
dev_dependencies:
3738
flutter_test:

0 commit comments

Comments
 (0)