Skip to content

Commit 0b82cfb

Browse files
Create notification module for notification management
1 parent 377b635 commit 0b82cfb

28 files changed

+632
-50
lines changed

.idea/flutter-base.iml

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

.idea/libraries/Dart_SDK.xml

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

app/lib/main/app.dart

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:app/presentation/themes/local_theme.dart';
12
import 'package:common/core/resource.dart';
23
import 'package:flutter/material.dart';
34
import 'package:domain/bloc/app/app_cubit.dart';
@@ -11,6 +12,10 @@ import 'package:app/presentation/utils/lang_extensions.dart';
1112
import 'package:flutter_bloc/flutter_bloc.dart';
1213
import 'package:flutter_localizations/flutter_localizations.dart';
1314
import 'package:go_router/go_router.dart';
15+
import 'package:notifications/bloc/notification_cubit.dart';
16+
import 'package:notifications/presentation/notification_widget.dart';
17+
import 'package:notifications/service/notification_service.dart';
18+
import 'package:notifications/utils/notification_constants.dart';
1419

1520
import 'init.dart';
1621

@@ -25,6 +30,9 @@ class App extends StatelessWidget {
2530
providers: [
2631
BlocProvider(create: (_) => getIt<AppCubit>()),
2732
BlocProvider(create: (_) => getIt<AuthCubit>()),
33+
BlocProvider.value(
34+
value: getIt<NotificationService>().notificationCubit,
35+
),
2836
],
2937
child: BlocBuilder<AppCubit, AppState>(
3038
builder: (context, state) {
@@ -51,7 +59,64 @@ class App extends StatelessWidget {
5159
}
5260
}
5361
},
54-
child: child,
62+
child: Stack(
63+
children: [
64+
child ?? const SizedBox.shrink(),
65+
BlocBuilder<NotificationCubit, NotificationState?>(
66+
buildWhen: (previous, current) => previous != current,
67+
builder: (context, state) {
68+
return state?.message?.isNotEmpty ?? false
69+
? Positioned(
70+
top: NotificationConstants
71+
.notificationButtonPadding,
72+
child: SizedBox(
73+
width: MediaQuery.of(context).size.width,
74+
child: Row(
75+
children: [
76+
const Spacer(),
77+
// Change according on project needs
78+
NotificationWidget(
79+
onClose: () {
80+
getIt<NotificationService>()
81+
.clearNotification();
82+
},
83+
message: state!.message!,
84+
style: Theme.of(context)
85+
.textTheme
86+
.headlineMedium
87+
?.copyWith(
88+
color: context
89+
.colors.neutralVariant.v0,
90+
),
91+
status: state.status,
92+
maxWidth:
93+
NotificationConstants.toastMaxWidth,
94+
progressBarColor: switch (
95+
state.status) {
96+
NotificationStatus.idle =>
97+
context.colors.primary.v10,
98+
NotificationStatus.information =>
99+
context.colors.primary.v99,
100+
NotificationStatus.success =>
101+
context.colors.primary.v0,
102+
NotificationStatus.error =>
103+
context.colors.error.v40,
104+
},
105+
progressBarBorderColor:
106+
context.colors.neutral.v0,
107+
progressBarBackgroundColor:
108+
context.colors.neutral.v0,
109+
),
110+
const Spacer(),
111+
],
112+
),
113+
),
114+
)
115+
: const SizedBox.shrink();
116+
},
117+
),
118+
],
119+
),
55120
);
56121
},
57122
routerConfig: _goRouter,

app/lib/main/init.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:example_domain/init.dart';
66
import 'package:example_data/init.dart';
77
import 'package:flutter/material.dart';
88
import 'package:get_it/get_it.dart';
9+
import 'package:notifications/init.dart';
910
import 'package:url_strategy/url_strategy.dart';
1011

1112
void init() async {
@@ -21,6 +22,7 @@ Future<void> initialize() async {
2122
await CommonInit.initialize(getIt);
2223
await DataInit.initialize(getIt);
2324
await DomainInit.initialize(getIt);
25+
await NotificationsInit.initialize(getIt);
2426

2527
// Example Module init
2628
await ExampleDomainInit.initialize(getIt);

app/lib/presentation/ui/pages/login/login_page.dart

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
import 'package:app/main/init.dart';
22
import 'package:app/presentation/themes/app_themes.dart';
3-
import 'package:app/presentation/themes/local_theme.dart';
4-
import 'package:app/presentation/themes/resources/app_theme_data.dart';
53
import 'package:common/core/resource.dart';
64
import 'package:domain/bloc/auth/auth_cubit.dart';
75
import 'package:domain/services/AuthService.dart';
86
import 'package:flutter/material.dart';
97
import 'package:app/presentation/ui/custom/app_theme_switch.dart';
108
import 'package:app/presentation/ui/custom/loading_screen.dart';
119
import 'package:flutter_bloc/flutter_bloc.dart';
10+
import 'package:notifications/service/notification_service.dart';
1211

1312
class LoginPage extends StatelessWidget {
1413
AuthService get _authService => getIt();
1514

15+
NotificationService get _notificationService => getIt();
16+
1617
const LoginPage({Key? key}) : super(key: key);
1718

1819
@override
@@ -41,6 +42,45 @@ class LoginPage extends StatelessWidget {
4142
},
4243
),
4344
),
45+
const SizedBox(height: 16),
46+
SizedBox(
47+
width: double.maxFinite,
48+
child: ElevatedButton(
49+
child: const Text('Success notification'),
50+
onPressed: () {
51+
_notificationService.notify(
52+
'Success message',
53+
NotificationStatus.success,
54+
);
55+
},
56+
),
57+
),
58+
const SizedBox(height: 16),
59+
SizedBox(
60+
width: double.maxFinite,
61+
child: ElevatedButton(
62+
child: const Text('Error notification'),
63+
onPressed: () {
64+
_notificationService.notify(
65+
'Error message',
66+
NotificationStatus.error,
67+
);
68+
},
69+
),
70+
),
71+
const SizedBox(height: 16),
72+
SizedBox(
73+
width: double.maxFinite,
74+
child: ElevatedButton(
75+
child: const Text('Information notification'),
76+
onPressed: () {
77+
_notificationService.notify(
78+
'Information message',
79+
NotificationStatus.information,
80+
);
81+
},
82+
),
83+
),
4484
],
4585
),
4686
),

app/pubspec.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ dependencies:
4747
path: ../modules/common
4848
data:
4949
path: ../modules/data
50+
notifications:
51+
path: ../modules/notifications
5052

5153
# Remove example dependencies
5254
example_data:

modules/common/.flutter-plugins

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# This is a generated file; do not edit or check into version control.
2-
package_info_plus=/Users/fabianvalencia/.pub-cache/hosted/pub.dev/package_info_plus-4.2.0/
3-
permission_handler=/Users/fabianvalencia/.pub-cache/hosted/pub.dev/permission_handler-10.4.5/
4-
permission_handler_android=/Users/fabianvalencia/.pub-cache/hosted/pub.dev/permission_handler_android-10.3.6/
5-
permission_handler_apple=/Users/fabianvalencia/.pub-cache/hosted/pub.dev/permission_handler_apple-9.1.4/
6-
permission_handler_windows=/Users/fabianvalencia/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.3/
2+
package_info_plus=/Users/juanrodriguez/.pub-cache/hosted/pub.dev/package_info_plus-8.3.0/
3+
permission_handler=/Users/juanrodriguez/.pub-cache/hosted/pub.dev/permission_handler-11.4.0/
4+
permission_handler_android=/Users/juanrodriguez/.pub-cache/hosted/pub.dev/permission_handler_android-12.1.0/
5+
permission_handler_apple=/Users/juanrodriguez/.pub-cache/hosted/pub.dev/permission_handler_apple-9.4.7/
6+
permission_handler_html=/Users/juanrodriguez/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5/
7+
permission_handler_windows=/Users/juanrodriguez/.pub-cache/hosted/pub.dev/permission_handler_windows-0.2.1/
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"package_info_plus","path":"/Users/fabianvalencia/.pub-cache/hosted/pub.dev/package_info_plus-4.2.0/","native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/fabianvalencia/.pub-cache/hosted/pub.dev/permission_handler_apple-9.1.4/","native_build":true,"dependencies":[]}],"android":[{"name":"package_info_plus","path":"/Users/fabianvalencia/.pub-cache/hosted/pub.dev/package_info_plus-4.2.0/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/fabianvalencia/.pub-cache/hosted/pub.dev/permission_handler_android-10.3.6/","native_build":true,"dependencies":[]}],"macos":[{"name":"package_info_plus","path":"/Users/fabianvalencia/.pub-cache/hosted/pub.dev/package_info_plus-4.2.0/","native_build":true,"dependencies":[]}],"linux":[{"name":"package_info_plus","path":"/Users/fabianvalencia/.pub-cache/hosted/pub.dev/package_info_plus-4.2.0/","native_build":false,"dependencies":[]}],"windows":[{"name":"package_info_plus","path":"/Users/fabianvalencia/.pub-cache/hosted/pub.dev/package_info_plus-4.2.0/","native_build":false,"dependencies":[]},{"name":"permission_handler_windows","path":"/Users/fabianvalencia/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.3/","native_build":true,"dependencies":[]}],"web":[{"name":"package_info_plus","path":"/Users/fabianvalencia/.pub-cache/hosted/pub.dev/package_info_plus-4.2.0/","dependencies":[]}]},"dependencyGraph":[{"name":"package_info_plus","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]}],"date_created":"2024-05-02 16:35:44.210631","version":"3.19.3"}
1+
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"package_info_plus","path":"/Users/juanrodriguez/.pub-cache/hosted/pub.dev/package_info_plus-8.3.0/","native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/juanrodriguez/.pub-cache/hosted/pub.dev/permission_handler_apple-9.4.7/","native_build":true,"dependencies":[]}],"android":[{"name":"package_info_plus","path":"/Users/juanrodriguez/.pub-cache/hosted/pub.dev/package_info_plus-8.3.0/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/juanrodriguez/.pub-cache/hosted/pub.dev/permission_handler_android-12.1.0/","native_build":true,"dependencies":[]}],"macos":[{"name":"package_info_plus","path":"/Users/juanrodriguez/.pub-cache/hosted/pub.dev/package_info_plus-8.3.0/","native_build":true,"dependencies":[]}],"linux":[{"name":"package_info_plus","path":"/Users/juanrodriguez/.pub-cache/hosted/pub.dev/package_info_plus-8.3.0/","native_build":false,"dependencies":[]}],"windows":[{"name":"package_info_plus","path":"/Users/juanrodriguez/.pub-cache/hosted/pub.dev/package_info_plus-8.3.0/","native_build":false,"dependencies":[]},{"name":"permission_handler_windows","path":"/Users/juanrodriguez/.pub-cache/hosted/pub.dev/permission_handler_windows-0.2.1/","native_build":true,"dependencies":[]}],"web":[{"name":"package_info_plus","path":"/Users/juanrodriguez/.pub-cache/hosted/pub.dev/package_info_plus-8.3.0/","dependencies":[]},{"name":"permission_handler_html","path":"/Users/juanrodriguez/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5/","dependencies":[]}]},"dependencyGraph":[{"name":"package_info_plus","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_html","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_html","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]}],"date_created":"2025-07-31 12:46:11.975084","version":"3.24.5","swift_package_manager_enabled":false}

0 commit comments

Comments
 (0)