From 871c52f54d2052afbf4b53675be90b1e37440c15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Fri, 18 Aug 2023 15:57:58 +0200 Subject: [PATCH] fix: fix notifs listeners --- .../extensions/build_context_extension.dart | 2 +- .../cloud_messaging_repository_impl.dart | 2 +- .../listen_notification_use_case.dart | 12 +++--- ...cribe_to_notification_topic_use_case.dart} | 7 ++-- ...ibe_from_notification_topic_use_case.dart} | 8 ++-- .../lib/src/domain/usecases/usecases.dart | 4 +- .../lib/src/features/features.dart | 2 + .../bloc/cloud_messaging_cubit.dart | 39 ++++++++--------- .../screens/cloud_messaging_screen.dart | 42 +++++++++++++++++++ .../lib/src/src.dart | 1 + .../pubspec.yaml | 3 ++ .../cloud_messaging_firebase_data_source.dart | 1 + .../lib/src/src.dart | 1 + .../wyatt_cloud_messaging_bloc_firebase.dart | 1 + 14 files changed, 91 insertions(+), 34 deletions(-) rename packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/{subscribe.dart => subscribe_to_notification_topic_use_case.dart} (83%) rename packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/{unsubscribe.dart => unsubscribe_from_notification_topic_use_case.dart} (83%) create mode 100644 packages/wyatt_cloud_messaging_bloc_base/lib/src/features/features.dart create mode 100644 packages/wyatt_cloud_messaging_bloc_base/lib/src/features/notifications/screens/cloud_messaging_screen.dart create mode 100644 packages/wyatt_cloud_messaging_bloc_firebase/lib/src/src.dart diff --git a/packages/wyatt_cloud_messaging_bloc_base/lib/src/core/extensions/build_context_extension.dart b/packages/wyatt_cloud_messaging_bloc_base/lib/src/core/extensions/build_context_extension.dart index 541a8842..ed00ecf3 100644 --- a/packages/wyatt_cloud_messaging_bloc_base/lib/src/core/extensions/build_context_extension.dart +++ b/packages/wyatt_cloud_messaging_bloc_base/lib/src/core/extensions/build_context_extension.dart @@ -19,5 +19,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:wyatt_cloud_messaging_bloc_base/wyatt_cloud_messaging_bloc.dart'; extension BuildContextExtension on BuildContext { - CloudmessagingCubit get cloudMessaging => read(); + CloudMessagingCubit get cloudMessaging => read(); } diff --git a/packages/wyatt_cloud_messaging_bloc_base/lib/src/data/repositories/cloud_messaging_repository_impl.dart b/packages/wyatt_cloud_messaging_bloc_base/lib/src/data/repositories/cloud_messaging_repository_impl.dart index 31267357..4bc629d2 100644 --- a/packages/wyatt_cloud_messaging_bloc_base/lib/src/data/repositories/cloud_messaging_repository_impl.dart +++ b/packages/wyatt_cloud_messaging_bloc_base/lib/src/data/repositories/cloud_messaging_repository_impl.dart @@ -64,7 +64,7 @@ class CloudMessagingRepositoryImpl extends CloudMessagingRepository { @override FutureOrResult> onNotification() => Result.tryCatchAsync( - _notificationRemoteDataSource.onNotificationBackground, + _notificationRemoteDataSource.onNotification, (error) => error is AppException ? error : NotificationException(error.toString()), diff --git a/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/listen_notification_use_case.dart b/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/listen_notification_use_case.dart index 657f0c4d..c2fc004f 100644 --- a/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/listen_notification_use_case.dart +++ b/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/listen_notification_use_case.dart @@ -23,11 +23,13 @@ import 'package:wyatt_cloud_messaging_bloc_base/src/domain/entities/remote_notif import 'package:wyatt_cloud_messaging_bloc_base/src/domain/repositories/cloud_messaging_repository.dart'; import 'package:wyatt_type_utils/wyatt_type_utils.dart'; -class ListenNotification extends StreamUseCase { +class ListenNotificationUseCase + extends StreamUseCase { final CloudMessagingRepository _notificationRepository; - ListenNotification({required CloudMessagingRepository notificationRepository}) - : _notificationRepository = notificationRepository; + ListenNotificationUseCase({ + required CloudMessagingRepository notificationRepository, + }) : _notificationRepository = notificationRepository; @override FutureOrResult> execute(NoParam? params) async { Stream? notificationStream; @@ -53,11 +55,11 @@ class ListenNotification extends StreamUseCase { await _notificationRepository.onNotificationForeground(); if (notificationForegroundStreamResponse.isErr) { - return Err(notificationBackgroundStreamResponse.err!); + return Err(notificationForegroundStreamResponse.err!); } notificationStream = Rx.merge([ - notificationBackgroundStreamResponse.ok!, + notificationForegroundStreamResponse.ok!, notificationBackgroundStreamResponse.ok!, ]); } diff --git a/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/subscribe.dart b/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/subscribe_to_notification_topic_use_case.dart similarity index 83% rename from packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/subscribe.dart rename to packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/subscribe_to_notification_topic_use_case.dart index b5ce21b4..b3a364ca 100644 --- a/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/subscribe.dart +++ b/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/subscribe_to_notification_topic_use_case.dart @@ -19,11 +19,12 @@ import 'dart:async'; import 'package:wyatt_architecture/wyatt_architecture.dart'; import 'package:wyatt_cloud_messaging_bloc_base/src/domain/repositories/cloud_messaging_repository.dart'; -class Subscribe extends AsyncUseCase { +class SubscribeToNotificationTopicUseCase extends AsyncUseCase { final CloudMessagingRepository _notificationRepository; - Subscribe({required CloudMessagingRepository notificationRepository}) - : _notificationRepository = notificationRepository; + SubscribeToNotificationTopicUseCase({ + required CloudMessagingRepository notificationRepository, + }) : _notificationRepository = notificationRepository; @override FutureOr onStart(String? params) { diff --git a/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/unsubscribe.dart b/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/unsubscribe_from_notification_topic_use_case.dart similarity index 83% rename from packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/unsubscribe.dart rename to packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/unsubscribe_from_notification_topic_use_case.dart index 3d552caa..1bd13f9c 100644 --- a/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/unsubscribe.dart +++ b/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/unsubscribe_from_notification_topic_use_case.dart @@ -19,11 +19,13 @@ import 'dart:async'; import 'package:wyatt_architecture/wyatt_architecture.dart'; import 'package:wyatt_cloud_messaging_bloc_base/src/domain/repositories/cloud_messaging_repository.dart'; -class Unsubscribe extends AsyncUseCase { +class UnsubscribeFromNotificationTopicUseCase + extends AsyncUseCase { final CloudMessagingRepository _notificationRepository; - Unsubscribe({required CloudMessagingRepository notificationRepository}) - : _notificationRepository = notificationRepository; + UnsubscribeFromNotificationTopicUseCase({ + required CloudMessagingRepository notificationRepository, + }) : _notificationRepository = notificationRepository; @override FutureOr onStart(String? params) { diff --git a/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/usecases.dart b/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/usecases.dart index 5fb4d927..5c25fc1d 100644 --- a/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/usecases.dart +++ b/packages/wyatt_cloud_messaging_bloc_base/lib/src/domain/usecases/usecases.dart @@ -18,5 +18,5 @@ export './get_cloud_messaging_token_use_case.dart'; export './init_cloud_messaging_use_case.dart'; export './listen_notification_use_case.dart'; export './request_cloud_messaging_permission_use_case.dart'; -export './subscribe.dart'; -export './unsubscribe.dart'; +export 'subscribe_to_notification_topic_use_case.dart'; +export 'unsubscribe_from_notification_topic_use_case.dart'; diff --git a/packages/wyatt_cloud_messaging_bloc_base/lib/src/features/features.dart b/packages/wyatt_cloud_messaging_bloc_base/lib/src/features/features.dart new file mode 100644 index 00000000..2799e3e5 --- /dev/null +++ b/packages/wyatt_cloud_messaging_bloc_base/lib/src/features/features.dart @@ -0,0 +1,2 @@ +export './notifications/bloc/cloud_messaging_cubit.dart'; +export './notifications/screens/cloud_messaging_screen.dart'; diff --git a/packages/wyatt_cloud_messaging_bloc_base/lib/src/features/notifications/bloc/cloud_messaging_cubit.dart b/packages/wyatt_cloud_messaging_bloc_base/lib/src/features/notifications/bloc/cloud_messaging_cubit.dart index ec601339..1c298478 100644 --- a/packages/wyatt_cloud_messaging_bloc_base/lib/src/features/notifications/bloc/cloud_messaging_cubit.dart +++ b/packages/wyatt_cloud_messaging_bloc_base/lib/src/features/notifications/bloc/cloud_messaging_cubit.dart @@ -1,11 +1,3 @@ -import 'dart:async'; - -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:wyatt_architecture/wyatt_architecture.dart'; -import 'package:wyatt_cloud_messaging_bloc_base/src/domain/entities/remote_notifications.dart'; -import 'package:wyatt_cloud_messaging_bloc_base/src/domain/usecases/listen_notification_use_case.dart'; -import 'package:wyatt_cloud_messaging_bloc_base/src/domain/usecases/subscribe.dart'; // Copyright (C) 2023 WYATT GROUP // Please see the AUTHORS file for details. // @@ -22,22 +14,31 @@ import 'package:wyatt_cloud_messaging_bloc_base/src/domain/usecases/subscribe.da // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import 'package:wyatt_cloud_messaging_bloc_base/src/domain/usecases/unsubscribe.dart'; +import 'dart:async'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:wyatt_architecture/wyatt_architecture.dart'; +import 'package:wyatt_cloud_messaging_bloc_base/src/domain/entities/remote_notifications.dart'; +import 'package:wyatt_cloud_messaging_bloc_base/src/domain/usecases/listen_notification_use_case.dart'; +import 'package:wyatt_cloud_messaging_bloc_base/src/domain/usecases/subscribe_to_notification_topic_use_case.dart'; + +import 'package:wyatt_cloud_messaging_bloc_base/src/domain/usecases/unsubscribe_from_notification_topic_use_case.dart'; part 'cloud_messaging_state.dart'; typedef OnNotification = void Function(RemoteNotification); -class CloudmessagingCubit extends Cubit { - final ListenNotification _listenNotification; - final Subscribe _subscribe; - final Unsubscribe _unsubscribe; +class CloudMessagingCubit extends Cubit { + final ListenNotificationUseCase _listenNotification; + final SubscribeToNotificationTopicUseCase? _subscribe; + final UnsubscribeFromNotificationTopicUseCase? _unsubscribe; final OnNotification? handleNotification; - CloudmessagingCubit({ - required ListenNotification listenNotification, - required Subscribe subscribe, - required Unsubscribe unsubscribe, + CloudMessagingCubit({ + required ListenNotificationUseCase listenNotification, + SubscribeToNotificationTopicUseCase? subscribe, + UnsubscribeFromNotificationTopicUseCase? unsubscribe, this.handleNotification, }) : _listenNotification = listenNotification, _subscribe = subscribe, @@ -53,7 +54,7 @@ class CloudmessagingCubit extends Cubit { } } - FutureOr subscribe(String topic) => _subscribe.execute(topic); + FutureOr subscribe(String topic) => _subscribe?.execute(topic); - FutureOr unsubscribe(String topic) => _unsubscribe.execute(topic); + FutureOr unsubscribe(String topic) => _unsubscribe?.execute(topic); } diff --git a/packages/wyatt_cloud_messaging_bloc_base/lib/src/features/notifications/screens/cloud_messaging_screen.dart b/packages/wyatt_cloud_messaging_bloc_base/lib/src/features/notifications/screens/cloud_messaging_screen.dart new file mode 100644 index 00000000..b77fae3b --- /dev/null +++ b/packages/wyatt_cloud_messaging_bloc_base/lib/src/features/notifications/screens/cloud_messaging_screen.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart'; +import 'package:wyatt_cloud_messaging_bloc_base/src/src.dart'; + +class CloudMessagingWrapperScreen + extends CubitScreen { + const CloudMessagingWrapperScreen({ + required this.child, + required this.onNotification, + required this.listenNotificationUseCase, + this.subscribeToNotificationTopicUseCase, + this.unsubscribeFromNotificationTopicUseCase, + super.key, + }); + + final ListenNotificationUseCase listenNotificationUseCase; + final SubscribeToNotificationTopicUseCase? + subscribeToNotificationTopicUseCase; + final UnsubscribeFromNotificationTopicUseCase? + unsubscribeFromNotificationTopicUseCase; + + final OnNotification onNotification; + + final Widget child; + + @override + CloudMessagingCubit create(BuildContext context) => CloudMessagingCubit( + listenNotification: listenNotificationUseCase, + subscribe: subscribeToNotificationTopicUseCase, + unsubscribe: unsubscribeFromNotificationTopicUseCase, + )..listenNotification(); + + @override + void onListen(BuildContext context, CloudmessagingState state) { + if (state.remoteNotification != null) { + onNotification.call(state.remoteNotification!); + } + } + + @override + Widget onBuild(BuildContext context, CloudmessagingState state) => child; +} diff --git a/packages/wyatt_cloud_messaging_bloc_base/lib/src/src.dart b/packages/wyatt_cloud_messaging_bloc_base/lib/src/src.dart index 0f86562b..37f11eda 100644 --- a/packages/wyatt_cloud_messaging_bloc_base/lib/src/src.dart +++ b/packages/wyatt_cloud_messaging_bloc_base/lib/src/src.dart @@ -16,4 +16,5 @@ export 'data/data.dart'; export 'domain/domain.dart'; +export 'features/features.dart'; export 'features/notifications/bloc/cloud_messaging_cubit.dart'; diff --git a/packages/wyatt_cloud_messaging_bloc_base/pubspec.yaml b/packages/wyatt_cloud_messaging_bloc_base/pubspec.yaml index b37d4c57..f1d60ba4 100644 --- a/packages/wyatt_cloud_messaging_bloc_base/pubspec.yaml +++ b/packages/wyatt_cloud_messaging_bloc_base/pubspec.yaml @@ -25,6 +25,9 @@ dependencies: url: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/ name: wyatt_type_utils version: ^0.0.5 + wyatt_bloc_helper: + hosted: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/ + version: 2.0.1 diff --git a/packages/wyatt_cloud_messaging_bloc_firebase/lib/src/data/data_sources/cloud_messaging_firebase_data_source.dart b/packages/wyatt_cloud_messaging_bloc_firebase/lib/src/data/data_sources/cloud_messaging_firebase_data_source.dart index 86aa9cf6..fd5ba217 100644 --- a/packages/wyatt_cloud_messaging_bloc_firebase/lib/src/data/data_sources/cloud_messaging_firebase_data_source.dart +++ b/packages/wyatt_cloud_messaging_bloc_firebase/lib/src/data/data_sources/cloud_messaging_firebase_data_source.dart @@ -102,6 +102,7 @@ class CloudMessagingFirebaseDataSource extends CloudMessagingRemoteDataSource { final notification = RemoteNotification( title: message.notification?.title, body: message.notification?.body, + data: message.data, ); final android = message.notification?.android; diff --git a/packages/wyatt_cloud_messaging_bloc_firebase/lib/src/src.dart b/packages/wyatt_cloud_messaging_bloc_firebase/lib/src/src.dart new file mode 100644 index 00000000..136287e7 --- /dev/null +++ b/packages/wyatt_cloud_messaging_bloc_firebase/lib/src/src.dart @@ -0,0 +1 @@ +export './data/data_sources/cloud_messaging_firebase_data_source.dart'; diff --git a/packages/wyatt_cloud_messaging_bloc_firebase/lib/wyatt_cloud_messaging_bloc_firebase.dart b/packages/wyatt_cloud_messaging_bloc_firebase/lib/wyatt_cloud_messaging_bloc_firebase.dart index 51b2a005..9d32522b 100644 --- a/packages/wyatt_cloud_messaging_bloc_firebase/lib/wyatt_cloud_messaging_bloc_firebase.dart +++ b/packages/wyatt_cloud_messaging_bloc_firebase/lib/wyatt_cloud_messaging_bloc_firebase.dart @@ -20,3 +20,4 @@ library wyatt_cloud_messaging_bloc_firebase; export 'package:wyatt_cloud_messaging_bloc_base/wyatt_cloud_messaging_bloc.dart'; export 'src/cloud_messaging_bloc_firebase.dart'; +export 'src/src.dart';