diff --git a/packages/wyatt_notification_bloc/example/lib/main.dart b/packages/wyatt_notification_bloc/example/lib/main.dart index 485105f8..982ff213 100644 --- a/packages/wyatt_notification_bloc/example/lib/main.dart +++ b/packages/wyatt_notification_bloc/example/lib/main.dart @@ -1,15 +1,12 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:notification_bloc_example/firebase_options.dart'; -import 'package:wyatt_notification_bloc/wyatt_notification_bloc.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); - print("Runnig App"); runApp(const MyApp()); } @@ -57,19 +54,11 @@ class MyHomePage extends StatefulWidget { } class _MyHomePageState extends State { - String _content = 'No content'; - - void _handlerNotif(RemoteNotificationWrapper notif) { - setState(() { - _content = notif.data.toString(); - }); - } - @override Widget build(BuildContext context) { - final notificationFirebaseDataSource = FirebaseMessagingDataSourceImpl(); - final notificationRepository = NotificationRepositoryImpl( - notificationRemoteDataSource: notificationFirebaseDataSource); + // final notificationFirebaseDataSource = FirebaseMessagingDataSourceImpl(); + // final notificationRepository = NotificationRepositoryImpl( + // notificationRemoteDataSource: notificationFirebaseDataSource); // This method is rerun every time setState is called, for instance as done // by the _incrementCounter method above. // @@ -82,8 +71,12 @@ class _MyHomePageState extends State { // the App.build method, and use it to set our appbar title. title: Text(widget.title), ), +<<<<<<< HEAD <<<<<<< HEAD body: Center( +======= + body: const Center( +>>>>>>> 3dbc809 (feat: implement notification abstraction package) // Center is a layout widget. It takes a single child and positions it // in the middle of the parent. child: Column( @@ -103,6 +96,7 @@ class _MyHomePageState extends State { // horizontal). mainAxisAlignment: MainAxisAlignment.center, children: [ +<<<<<<< HEAD const Text( 'You have pushed the button this many times:', ), @@ -157,6 +151,15 @@ class _MyHomePageState extends State { ], ), >>>>>>> 5da1cd0 (feat(notification_bloc): add base architecture and start impementing firebase messaging data source. Add example too (#33)) +======= + Text( + 'content of notification :', + ), + Text( + 'Notif', + ), + ], +>>>>>>> 3dbc809 (feat: implement notification abstraction package) ), ), ); diff --git a/packages/wyatt_notification_bloc/example/pubspec.yaml b/packages/wyatt_notification_bloc/example/pubspec.yaml index d50e7e86..123161ad 100644 --- a/packages/wyatt_notification_bloc/example/pubspec.yaml +++ b/packages/wyatt_notification_bloc/example/pubspec.yaml @@ -33,7 +33,7 @@ dependencies: sdk: flutter flutter_bloc: ^8.1.1 - wyatt_notification_bloc: + wyatt_cloud_messaging_bloc: path: ../ diff --git a/packages/wyatt_notification_bloc/lib/src/core/core.dart b/packages/wyatt_notification_bloc/lib/src/core/core.dart new file mode 100644 index 00000000..3388e49f --- /dev/null +++ b/packages/wyatt_notification_bloc/lib/src/core/core.dart @@ -0,0 +1,2 @@ +export './exceptions/notification_exeption.dart'; +export './extensions/build_context_extension.dart'; diff --git a/packages/wyatt_notification_bloc/lib/src/core/enum/notification_status.dart b/packages/wyatt_notification_bloc/lib/src/core/enum/notification_status.dart deleted file mode 100644 index 42b26a12..00000000 --- a/packages/wyatt_notification_bloc/lib/src/core/enum/notification_status.dart +++ /dev/null @@ -1,5 +0,0 @@ -enum NotificationStatus { - unknown, - authorized, - unauthorized, -} diff --git a/packages/wyatt_notification_bloc/lib/src/core/exceptions/notification_exeption.dart b/packages/wyatt_notification_bloc/lib/src/core/exceptions/notification_exeption.dart new file mode 100644 index 00000000..edb9d27d --- /dev/null +++ b/packages/wyatt_notification_bloc/lib/src/core/exceptions/notification_exeption.dart @@ -0,0 +1,5 @@ +import 'package:wyatt_architecture/wyatt_architecture.dart'; + +class NotificationException extends AppException { + const NotificationException([super.message]); +} diff --git a/packages/wyatt_notification_bloc/lib/src/core/extensions/build_context_extension.dart b/packages/wyatt_notification_bloc/lib/src/core/extensions/build_context_extension.dart new file mode 100644 index 00000000..2c32ec27 --- /dev/null +++ b/packages/wyatt_notification_bloc/lib/src/core/extensions/build_context_extension.dart @@ -0,0 +1,7 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:wyatt_cloud_messaging_bloc/wyatt_cloud_messaging_bloc.dart'; + +extension BuildContextExtension on BuildContext { + CloudmessagingCubit get cloudMessaging => read(); +} diff --git a/packages/wyatt_notification_bloc/lib/src/data/data.dart b/packages/wyatt_notification_bloc/lib/src/data/data.dart index 44f22f57..720cb191 100644 --- a/packages/wyatt_notification_bloc/lib/src/data/data.dart +++ b/packages/wyatt_notification_bloc/lib/src/data/data.dart @@ -1,2 +1 @@ -export 'data_sources/remote/firebase_messaging_data_source_impl.dart'; export 'repositories/notification_repository_impl.dart'; diff --git a/packages/wyatt_notification_bloc/lib/src/data/data_sources/remote/firebase_messaging_data_source_impl.dart b/packages/wyatt_notification_bloc/lib/src/data/data_sources/remote/firebase_messaging_data_source_impl.dart deleted file mode 100644 index 83d1f27e..00000000 --- a/packages/wyatt_notification_bloc/lib/src/data/data_sources/remote/firebase_messaging_data_source_impl.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:wyatt_notification_bloc/src/data/models/remote_notification_wrapper_model.dart'; -import 'package:wyatt_notification_bloc/src/domain/data_sources/remote/notification_remote_data_source.dart'; -import 'package:wyatt_notification_bloc/src/domain/entities/remote_notifications.dart'; - -class FirebaseMessagingDataSourceImpl extends NotificationRemoteDataSource { - final _instance = FirebaseMessaging.instance; - - @override - Future getToken() async { - final token = await _instance.getToken(); - if (token != null && token.isNotEmpty) { - return token; - } - throw Exception('error on token'); - } - - @override - Stream onNotification() => - FirebaseMessaging.onMessage - .map(RemoteNotificationWrapperModel.fromFirebaseModel); - - @override - Stream onNotificationOpened() => - FirebaseMessaging.onMessageOpenedApp - .map(RemoteNotificationWrapperModel.fromFirebaseModel); - - @override - Future getInitialMessage() => - _instance.getInitialMessage().then( - RemoteNotificationWrapperModel.fromFirebaseModel, - ); - - @override - Future register() async { - await _instance.requestPermission(); - await FirebaseMessaging.instance - .setForegroundNotificationPresentationOptions( - alert: true, // Required to display a heads up notification - badge: true, - sound: true, - ); - } - - @override - Future subscribeToTopic(String topic) => - _instance.subscribeToTopic(topic); - - @override - Future unsubscribeFromTopic(String topic) => - _instance.unsubscribeFromTopic(topic); -} diff --git a/packages/wyatt_notification_bloc/lib/src/data/models/remote_notification_wrapper_model.dart b/packages/wyatt_notification_bloc/lib/src/data/models/remote_notification_wrapper_model.dart deleted file mode 100644 index 9860676e..00000000 --- a/packages/wyatt_notification_bloc/lib/src/data/models/remote_notification_wrapper_model.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:wyatt_notification_bloc/src/domain/entities/remote_notifications.dart'; - -class RemoteNotificationWrapperModel extends RemoteNotificationWrapper { - @override - final String? senderId; - @override - final String? messageId; - @override - final Map? data; - @override - final DateTime? sentTime; - - const RemoteNotificationWrapperModel({ - this.senderId, - this.messageId, - this.data, - this.sentTime, - }); - - factory RemoteNotificationWrapperModel.fromFirebaseModel( - RemoteMessage? message, - ) => - RemoteNotificationWrapperModel( - senderId: message?.senderId, - messageId: message?.senderId, - data: message?.data, - sentTime: message?.sentTime, - ); -} diff --git a/packages/wyatt_notification_bloc/lib/src/data/repositories/notification_repository_impl.dart b/packages/wyatt_notification_bloc/lib/src/data/repositories/notification_repository_impl.dart index 8261c84d..071f2aee 100644 --- a/packages/wyatt_notification_bloc/lib/src/data/repositories/notification_repository_impl.dart +++ b/packages/wyatt_notification_bloc/lib/src/data/repositories/notification_repository_impl.dart @@ -1,7 +1,8 @@ import 'package:wyatt_architecture/wyatt_architecture.dart'; -import 'package:wyatt_notification_bloc/src/domain/data_sources/remote/notification_remote_data_source.dart'; -import 'package:wyatt_notification_bloc/src/domain/entities/remote_notifications.dart'; -import 'package:wyatt_notification_bloc/src/domain/repositories/notification_repository.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/core/exceptions/notification_exeption.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/data_sources/remote/notification_remote_data_source.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/entities/remote_notifications.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/repositories/notification_repository.dart'; import 'package:wyatt_type_utils/wyatt_type_utils.dart'; class NotificationRepositoryImpl extends NotificationRepository { @@ -13,46 +14,68 @@ class NotificationRepositoryImpl extends NotificationRepository { @override FutureOrResult register() => Result.tryCatchAsync( _notificationRemoteDataSource.register, - (error) => ClientException(error.toString()), + (error) => error is AppException + ? error + : NotificationException(error.toString()), ); @override FutureOrResult getToken() => Result.tryCatchAsync( _notificationRemoteDataSource.getToken, - (error) => ClientException(error.toString()), - ); - - @override - FutureOrResult> onNotification() => - Result.tryCatch( - _notificationRemoteDataSource.onNotification, - (error) => ClientException(error.toString()), - ); - - @override - FutureOrResult getInitialMessage() => - Result.tryCatchAsync( - _notificationRemoteDataSource.getInitialMessage, - (error) => ClientException(error.toString()), - ); - - @override - FutureOrResult> onNotificationOpened() => - Result.tryCatch( - _notificationRemoteDataSource.onNotificationOpened, - (error) => ClientException(error.toString()), + (error) => error is AppException + ? error + : NotificationException(error.toString()), ); @override FutureOrResult subscribeToTopic(String topic) => Result.tryCatchAsync( () => _notificationRemoteDataSource.subscribeToTopic(topic), - (error) => ClientException(error.toString()), + (error) => error is AppException + ? error + : NotificationException(error.toString()), ); @override FutureOrResult unsubscribeFromTopic(String topic) => Result.tryCatchAsync( () => _notificationRemoteDataSource.unsubscribeFromTopic(topic), - (error) => ClientException(error.toString()), + (error) => error is AppException + ? error + : NotificationException(error.toString()), ); + + @override + FutureOrResult requestPermissions() => Result.tryCatchAsync( + _notificationRemoteDataSource.requestPermissions, + (error) => error is AppException + ? error + : NotificationException(error.toString()), + ); + + @override + FutureOrResult> onNotificationAccepted() => + Result.tryCatchAsync( + _notificationRemoteDataSource.onNotificationBackgroundAccepted, + (error) => error is AppException + ? error + : NotificationException(error.toString()), + ); + + @override + FutureOrResult> + onNotificationBackgroundAccepted() => Result.tryCatchAsync( + _notificationRemoteDataSource.onNotificationBackgroundAccepted, + (error) => error is AppException + ? error + : NotificationException(error.toString()), + ); + + @override + FutureOrResult> + onNotificationForegroundAccepted() => Result.tryCatchAsync( + _notificationRemoteDataSource.onNotificationForegroundAccepted, + (error) => error is AppException + ? error + : NotificationException(error.toString()), + ); } diff --git a/packages/wyatt_notification_bloc/lib/src/domain/data_sources/remote/notification_remote_data_source.dart b/packages/wyatt_notification_bloc/lib/src/domain/data_sources/remote/notification_remote_data_source.dart index 2d2c1212..a2426d87 100644 --- a/packages/wyatt_notification_bloc/lib/src/domain/data_sources/remote/notification_remote_data_source.dart +++ b/packages/wyatt_notification_bloc/lib/src/domain/data_sources/remote/notification_remote_data_source.dart @@ -1,14 +1,16 @@ import 'package:wyatt_architecture/wyatt_architecture.dart'; -import 'package:wyatt_notification_bloc/src/domain/entities/remote_notifications.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/entities/remote_notifications.dart'; abstract class NotificationRemoteDataSource extends BaseRepository { Future register(); - Stream onNotification(); + Future> onNotificationAccepted(); - Stream onNotificationOpened(); + Future> onNotificationBackgroundAccepted(); - Future getInitialMessage(); + Future> onNotificationForegroundAccepted(); + + Future requestPermissions(); Future getToken(); diff --git a/packages/wyatt_notification_bloc/lib/src/domain/entities/remote_notifications.dart b/packages/wyatt_notification_bloc/lib/src/domain/entities/remote_notifications.dart index 6b4b58f9..9b279c7a 100644 --- a/packages/wyatt_notification_bloc/lib/src/domain/entities/remote_notifications.dart +++ b/packages/wyatt_notification_bloc/lib/src/domain/entities/remote_notifications.dart @@ -1,9 +1,15 @@ import 'package:wyatt_architecture/wyatt_architecture.dart'; -abstract class RemoteNotificationWrapper extends Entity { - const RemoteNotificationWrapper(); - String? get senderId; - String? get messageId; - Map? get data; - DateTime? get sentTime; +class RemoteNotification extends Entity { + const RemoteNotification({ + this.senderId, + this.messageId, + this.data, + this.sentTime, + }); + + final String? senderId; + final String? messageId; + final Map? data; + final DateTime? sentTime; } diff --git a/packages/wyatt_notification_bloc/lib/src/domain/repositories/notification_repository.dart b/packages/wyatt_notification_bloc/lib/src/domain/repositories/notification_repository.dart index ae396869..dd9f3b54 100644 --- a/packages/wyatt_notification_bloc/lib/src/domain/repositories/notification_repository.dart +++ b/packages/wyatt_notification_bloc/lib/src/domain/repositories/notification_repository.dart @@ -1,16 +1,18 @@ import 'dart:async'; import 'package:wyatt_architecture/wyatt_architecture.dart'; -import 'package:wyatt_notification_bloc/src/domain/entities/remote_notifications.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/entities/remote_notifications.dart'; abstract class NotificationRepository extends BaseRepository { FutureOrResult register(); - FutureOrResult> onNotification(); + FutureOrResult> onNotificationAccepted(); - FutureOrResult> onNotificationOpened(); + FutureOrResult> onNotificationBackgroundAccepted(); - FutureOrResult getInitialMessage(); + FutureOrResult> onNotificationForegroundAccepted(); + + FutureOrResult requestPermissions(); FutureOrResult getToken(); diff --git a/packages/wyatt_notification_bloc/lib/src/domain/usecases/get_cloud_messaging_token_use_case.dart b/packages/wyatt_notification_bloc/lib/src/domain/usecases/get_cloud_messaging_token_use_case.dart new file mode 100644 index 00000000..2fb03544 --- /dev/null +++ b/packages/wyatt_notification_bloc/lib/src/domain/usecases/get_cloud_messaging_token_use_case.dart @@ -0,0 +1,14 @@ +import 'package:wyatt_architecture/wyatt_architecture.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/repositories/notification_repository.dart'; + +class GetCloudMessagingTokenUseCase extends AsyncUseCase { + final NotificationRepository _notificationRepository; + + GetCloudMessagingTokenUseCase({ + required NotificationRepository notificationRepository, + }) : _notificationRepository = notificationRepository; + + @override + FutureOrResult execute(void params) => + _notificationRepository.getToken(); +} diff --git a/packages/wyatt_notification_bloc/lib/src/domain/usecases/get_intitial_message.dart b/packages/wyatt_notification_bloc/lib/src/domain/usecases/get_intitial_message.dart deleted file mode 100644 index 04c4e99c..00000000 --- a/packages/wyatt_notification_bloc/lib/src/domain/usecases/get_intitial_message.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:wyatt_architecture/wyatt_architecture.dart'; -import 'package:wyatt_notification_bloc/wyatt_notification_bloc.dart'; - -class GetInitialMessage - extends AsyncUseCase { - final NotificationRepository _notificationRepository; - - GetInitialMessage({required NotificationRepository notificationRepository}) - : _notificationRepository = notificationRepository; - - @override - FutureOrResult call(NoParam? params) => - _notificationRepository.getInitialMessage(); -} diff --git a/packages/wyatt_notification_bloc/lib/src/domain/usecases/init_cloud_messaging_use_case.dart b/packages/wyatt_notification_bloc/lib/src/domain/usecases/init_cloud_messaging_use_case.dart new file mode 100644 index 00000000..1716bb89 --- /dev/null +++ b/packages/wyatt_notification_bloc/lib/src/domain/usecases/init_cloud_messaging_use_case.dart @@ -0,0 +1,13 @@ +import 'package:wyatt_architecture/wyatt_architecture.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/repositories/notification_repository.dart'; + +class InitCloudmessagingUseCase extends AsyncUseCase { + final NotificationRepository _notificationRepository; + + InitCloudmessagingUseCase({ + required NotificationRepository notificationRepository, + }) : _notificationRepository = notificationRepository; + @override + FutureOrResult execute(NoParam? params) => + _notificationRepository.register(); +} diff --git a/packages/wyatt_notification_bloc/lib/src/domain/usecases/listen_notification.dart b/packages/wyatt_notification_bloc/lib/src/domain/usecases/listen_notification.dart deleted file mode 100644 index 45ba23e5..00000000 --- a/packages/wyatt_notification_bloc/lib/src/domain/usecases/listen_notification.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:wyatt_architecture/wyatt_architecture.dart'; -import 'package:wyatt_notification_bloc/src/domain/entities/remote_notifications.dart'; -import 'package:wyatt_notification_bloc/src/domain/repositories/notification_repository.dart'; - -class ListenNotification - extends StreamUseCase { - final NotificationRepository _notificationRepository; - - ListenNotification({required NotificationRepository notificationRepository}) - : _notificationRepository = notificationRepository; - @override - FutureOrResult> call(NoParam? params) => - _notificationRepository.onNotificationOpened(); -} diff --git a/packages/wyatt_notification_bloc/lib/src/domain/usecases/listen_notification_use_case.dart b/packages/wyatt_notification_bloc/lib/src/domain/usecases/listen_notification_use_case.dart new file mode 100644 index 00000000..0f93fd56 --- /dev/null +++ b/packages/wyatt_notification_bloc/lib/src/domain/usecases/listen_notification_use_case.dart @@ -0,0 +1,51 @@ +import 'dart:async'; + +import 'package:rxdart/rxdart.dart'; +import 'package:wyatt_architecture/wyatt_architecture.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/core/exceptions/notification_exeption.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/entities/remote_notifications.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/repositories/notification_repository.dart'; +import 'package:wyatt_type_utils/wyatt_type_utils.dart'; + +class ListenNotification extends StreamUseCase { + final NotificationRepository _notificationRepository; + + ListenNotification({required NotificationRepository notificationRepository}) + : _notificationRepository = notificationRepository; + @override + FutureOrResult> execute(NoParam? params) async { + Stream? notificationStream; + + final notificationStreamResponse = + await _notificationRepository.onNotificationAccepted(); + + if (notificationStreamResponse.isOk) { + notificationStream = notificationStreamResponse.ok; + } else if (notificationStreamResponse.isErr) { + final notificationBackgroundStreamResponse = + await _notificationRepository.onNotificationBackgroundAccepted(); + + if (notificationBackgroundStreamResponse.isErr) { + return Err(notificationBackgroundStreamResponse.err!); + } + + final notificationForegroundStreamResponse = + await _notificationRepository.onNotificationForegroundAccepted(); + + if (notificationForegroundStreamResponse.isErr) { + return Err(notificationBackgroundStreamResponse.err!); + } + + notificationStream = Rx.merge([ + notificationBackgroundStreamResponse.ok!, + notificationBackgroundStreamResponse.ok!, + ]); + } + + if (notificationStream == null) { + return const Err(NotificationException('Cannot listen notifications')); + } + + return Ok(notificationStream); + } +} diff --git a/packages/wyatt_notification_bloc/lib/src/domain/usecases/register.dart b/packages/wyatt_notification_bloc/lib/src/domain/usecases/register.dart deleted file mode 100644 index ee1c9a7d..00000000 --- a/packages/wyatt_notification_bloc/lib/src/domain/usecases/register.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:wyatt_architecture/wyatt_architecture.dart'; -import 'package:wyatt_notification_bloc/src/domain/repositories/notification_repository.dart'; - -class Register extends AsyncUseCase { - final NotificationRepository _notificationRepository; - - Register({required NotificationRepository notificationRepository}) - : _notificationRepository = notificationRepository; - @override - FutureOrResult call(NoParam? params) async { - final registration = await _notificationRepository.register(); - final userToken = await _notificationRepository.getToken(); - print("User FCM Token : ${userToken.ok}"); - return registration; - } -} diff --git a/packages/wyatt_notification_bloc/lib/src/domain/usecases/request_cloud_messaging_permission_use_case.dart b/packages/wyatt_notification_bloc/lib/src/domain/usecases/request_cloud_messaging_permission_use_case.dart new file mode 100644 index 00000000..5e235d1d --- /dev/null +++ b/packages/wyatt_notification_bloc/lib/src/domain/usecases/request_cloud_messaging_permission_use_case.dart @@ -0,0 +1,14 @@ +import 'package:wyatt_architecture/wyatt_architecture.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/repositories/notification_repository.dart'; + +class RequestCloudMessagingPermissionUseCase extends AsyncUseCase { + final NotificationRepository _notificationRepository; + + RequestCloudMessagingPermissionUseCase({ + required NotificationRepository notificationRepository, + }) : _notificationRepository = notificationRepository; + + @override + FutureOrResult execute(void params) => + _notificationRepository.register(); +} diff --git a/packages/wyatt_notification_bloc/lib/src/domain/usecases/subscribe.dart b/packages/wyatt_notification_bloc/lib/src/domain/usecases/subscribe.dart index b7fe35d6..f3be9614 100644 --- a/packages/wyatt_notification_bloc/lib/src/domain/usecases/subscribe.dart +++ b/packages/wyatt_notification_bloc/lib/src/domain/usecases/subscribe.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:wyatt_architecture/wyatt_architecture.dart'; -import 'package:wyatt_notification_bloc/src/domain/repositories/notification_repository.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/repositories/notification_repository.dart'; class Subscribe extends AsyncUseCase { final NotificationRepository _notificationRepository; @@ -9,14 +9,14 @@ class Subscribe extends AsyncUseCase { Subscribe({required NotificationRepository notificationRepository}) : _notificationRepository = notificationRepository; - @override - FutureOrResult call(String? params) => - _notificationRepository.subscribeToTopic(params ?? ''); - @override FutureOr onStart(String? params) { if (params == null) { - throw ClientException('Topic is not valid'); + throw const ClientException('Topic is not valid'); } } + + @override + FutureOrResult execute(String? params) => + _notificationRepository.subscribeToTopic(params!); } diff --git a/packages/wyatt_notification_bloc/lib/src/domain/usecases/unsubscribe.dart b/packages/wyatt_notification_bloc/lib/src/domain/usecases/unsubscribe.dart index d8fdffef..b9c62bb6 100644 --- a/packages/wyatt_notification_bloc/lib/src/domain/usecases/unsubscribe.dart +++ b/packages/wyatt_notification_bloc/lib/src/domain/usecases/unsubscribe.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:wyatt_architecture/wyatt_architecture.dart'; -import 'package:wyatt_notification_bloc/src/domain/repositories/notification_repository.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/repositories/notification_repository.dart'; class Unsubscribe extends AsyncUseCase { final NotificationRepository _notificationRepository; @@ -9,14 +9,14 @@ class Unsubscribe extends AsyncUseCase { Unsubscribe({required NotificationRepository notificationRepository}) : _notificationRepository = notificationRepository; - @override - FutureOrResult call(String? params) => - _notificationRepository.unsubscribeFromTopic(params ?? ''); - @override FutureOr onStart(String? params) { if (params == null) { - throw ClientException('Topic is not valid'); + throw const ClientException('Topic is not valid'); } } + + @override + FutureOrResult execute(String? params) => + _notificationRepository.unsubscribeFromTopic(params!); } diff --git a/packages/wyatt_notification_bloc/lib/src/domain/usecases/usecases.dart b/packages/wyatt_notification_bloc/lib/src/domain/usecases/usecases.dart index f26f1f95..dedbd5c8 100644 --- a/packages/wyatt_notification_bloc/lib/src/domain/usecases/usecases.dart +++ b/packages/wyatt_notification_bloc/lib/src/domain/usecases/usecases.dart @@ -1,5 +1,6 @@ -export 'get_intitial_message.dart'; -export 'listen_notification.dart'; -export 'register.dart'; -export 'subscribe.dart'; -export 'unsubscribe.dart'; +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'; diff --git a/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/cloud_messaging_cubit.dart b/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/cloud_messaging_cubit.dart new file mode 100644 index 00000000..883abbc8 --- /dev/null +++ b/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/cloud_messaging_cubit.dart @@ -0,0 +1,43 @@ +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/src/domain/entities/remote_notifications.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/usecases/listen_notification_use_case.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/usecases/subscribe.dart'; +import 'package:wyatt_cloud_messaging_bloc/src/domain/usecases/unsubscribe.dart'; + +part 'cloud_messaging_state.dart'; + +typedef OnNotification = void Function(RemoteNotification); + +class CloudmessagingCubit extends Cubit { + final ListenNotification _listenNotification; + final Subscribe _subscribe; + final Unsubscribe _unsubscribe; + + final OnNotification? handleNotification; + CloudmessagingCubit({ + required ListenNotification listenNotification, + required Subscribe subscribe, + required Unsubscribe unsubscribe, + this.handleNotification, + }) : _listenNotification = listenNotification, + _subscribe = subscribe, + _unsubscribe = unsubscribe, + super(const CloudmessagingState()); + + Future listenNotification() async { + final notificaitons = await _listenNotification.execute(const NoParam()); + if (notificaitons.isOk) { + notificaitons.ok?.listen((notification) { + emit(CloudmessagingState(notification)); + }); + } + } + + FutureOr subscribe(String topic) => _subscribe.execute(topic); + + FutureOr unsubscribe(String topic) => _unsubscribe.execute(topic); +} diff --git a/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/cloud_messaging_state.dart b/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/cloud_messaging_state.dart new file mode 100644 index 00000000..addb2ea6 --- /dev/null +++ b/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/cloud_messaging_state.dart @@ -0,0 +1,10 @@ +part of 'cloud_messaging_cubit.dart'; + +class CloudmessagingState extends Equatable { + final RemoteNotification? remoteNotification; + + const CloudmessagingState([this.remoteNotification]); + + @override + List get props => [remoteNotification]; +} diff --git a/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/notification_cubit.dart b/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/notification_cubit.dart deleted file mode 100644 index 274f37c1..00000000 --- a/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/notification_cubit.dart +++ /dev/null @@ -1,71 +0,0 @@ -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_notification_bloc/src/core/enum/notification_status.dart'; -import 'package:wyatt_notification_bloc/src/domain/entities/remote_notifications.dart'; -import 'package:wyatt_notification_bloc/src/domain/usecases/get_intitial_message.dart'; -import 'package:wyatt_notification_bloc/src/domain/usecases/listen_notification.dart'; -import 'package:wyatt_notification_bloc/src/domain/usecases/register.dart'; -import 'package:wyatt_notification_bloc/src/domain/usecases/subscribe.dart'; -import 'package:wyatt_notification_bloc/src/domain/usecases/unsubscribe.dart'; - -part 'notification_state.dart'; - -typedef OnNotification = void Function(RemoteNotificationWrapper); - -class NotificationCubit extends Cubit { - final Register _register; - final ListenNotification _listenNotification; - final Subscribe _subscribe; - final Unsubscribe _unsubscribe; - final GetInitialMessage _getInitialMessage; - - final OnNotification? handleNotification; - NotificationCubit({ - required Register register, - required GetInitialMessage getInitialMessage, - required ListenNotification listenNotification, - required Subscribe subscribe, - required Unsubscribe unsubscribe, - this.handleNotification, - }) : _register = register, - _getInitialMessage = getInitialMessage, - _listenNotification = listenNotification, - _subscribe = subscribe, - _unsubscribe = unsubscribe, - super(const NotificationState.unknown()); - - FutureOr register() async { - print("Registering Threw cubit\n"); - final response = await _register.execute(const NoParam()); - - print(response); - if (response.isOk) { - emit(const NotificationState.authorized()); - - final initialMessage = await _getInitialMessage.execute(const NoParam()); - if (initialMessage.isOk && initialMessage.ok != null) { - handleNotification?.call(initialMessage.ok!); - } - } else if (response.isErr) { - emit(const NotificationState.unauthorized()); - } - } - - Future listenNotification() async { - print("Listening for notifications\n"); - final notificaitons = await _listenNotification.execute(const NoParam()); - if (notificaitons.isOk) { - print("Get notifications ready to listen"); - notificaitons.ok?.listen((_) { - print("New notif !!\n"); - }); - } - } - - FutureOr subscribe(String topic) => _subscribe.execute(topic); - - FutureOr unsubscribe(String topic) => _unsubscribe.execute(topic); -} diff --git a/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/notification_state.dart b/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/notification_state.dart deleted file mode 100644 index 10205279..00000000 --- a/packages/wyatt_notification_bloc/lib/src/features/notifications/bloc/notification_state.dart +++ /dev/null @@ -1,31 +0,0 @@ -part of 'notification_cubit.dart'; - -class NotificationState extends Equatable { - final NotificationStatus _notificationStatus; - - const NotificationState._({required NotificationStatus notificationStatus}) - : _notificationStatus = notificationStatus; - - const NotificationState.unknown() - : this._( - notificationStatus: NotificationStatus.unknown, - ); - - const NotificationState.authorized() - : this._( - notificationStatus: NotificationStatus.authorized, - ); - - const NotificationState.unauthorized() - : this._( - notificationStatus: NotificationStatus.unauthorized, - ); - - NotificationStatus get notificationStatus => _notificationStatus; - - @override - List get props => [_notificationStatus]; - - @override - String toString() => 'NotificationState(status: $notificationStatus)'; -} diff --git a/packages/wyatt_notification_bloc/lib/src/src.dart b/packages/wyatt_notification_bloc/lib/src/src.dart index 29f0dbb0..c3537a44 100644 --- a/packages/wyatt_notification_bloc/lib/src/src.dart +++ b/packages/wyatt_notification_bloc/lib/src/src.dart @@ -1,3 +1,3 @@ export 'data/data.dart'; export 'domain/domain.dart'; -export 'features/notifications/bloc/notification_cubit.dart'; +export 'features/notifications/bloc/cloud_messaging_cubit.dart'; diff --git a/packages/wyatt_notification_bloc/lib/wyatt_notification_bloc.dart b/packages/wyatt_notification_bloc/lib/wyatt_cloud_messaging_bloc.dart similarity index 91% rename from packages/wyatt_notification_bloc/lib/wyatt_notification_bloc.dart rename to packages/wyatt_notification_bloc/lib/wyatt_cloud_messaging_bloc.dart index 5bb40618..f58724c3 100644 --- a/packages/wyatt_notification_bloc/lib/wyatt_notification_bloc.dart +++ b/packages/wyatt_notification_bloc/lib/wyatt_cloud_messaging_bloc.dart @@ -1,4 +1,4 @@ -// Copyright (C) 2022 WYATT GROUP +// Copyright (C) 2023 WYATT GROUP // Please see the AUTHORS file for details. // // This program is free software: you can redistribute it and/or modify @@ -15,6 +15,6 @@ // along with this program. If not, see . /// An notification library for BLoC. -library wyatt_notification_bloc; +library wyatt_cloud_messaging_bloc; export 'src/src.dart'; diff --git a/packages/wyatt_notification_bloc/pubspec.yaml b/packages/wyatt_notification_bloc/pubspec.yaml index d7085ea6..d1cd1a17 100644 --- a/packages/wyatt_notification_bloc/pubspec.yaml +++ b/packages/wyatt_notification_bloc/pubspec.yaml @@ -1,4 +1,4 @@ -name: wyatt_notification_bloc +name: wyatt_cloud_messaging_bloc description: A starting point for Dart libraries or applications. repository: https://git.wyatt-studio.fr/Wyatt-FOSS/wyatt-packages/src/branch/master/packages/wyatt_notification_bloc version: 1.0.0 @@ -6,22 +6,26 @@ version: 1.0.0 publish_to: none environment: - sdk: ">=2.18.2 <3.0.0" + sdk: ">=3.0.0 <4.0.0" dependencies: + flutter: + sdk: flutter equatable: ^2.0.5 firebase_messaging: ^14.1.1 flutter_bloc: ^8.1.1 - + rxdart: ^0.27.7 wyatt_architecture: - git: - url: ssh://git@git.wyatt-studio.fr:993/Wyatt-FOSS/wyatt-packages.git - ref: feat/architecture/make_usecases_more_modular_and_adaptable - path: packages/wyatt_architecture - + hosted: + url: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/ + name: wyatt_architecture + version: ^0.2.0 wyatt_type_utils: - hosted: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/ - version: ^0.0.3+1 + hosted: + url: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/ + name: wyatt_type_utils + version: ^0.0.5 + dev_dependencies: diff --git a/packages/wyatt_ui_kit/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/wyatt_ui_kit/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 00000000..8510d2fe --- /dev/null +++ b/packages/wyatt_ui_kit/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/maloleon/Library/flutter +FLUTTER_APPLICATION_PATH=/Users/maloleon/Studio/wyatt-packages/packages/wyatt_ui_kit/example +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1.0.0 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/wyatt_ui_kit/example/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/wyatt_ui_kit/example/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100755 index 00000000..11d11978 --- /dev/null +++ b/packages/wyatt_ui_kit/example/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/maloleon/Library/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/maloleon/Studio/wyatt-packages/packages/wyatt_ui_kit/example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1.0.0" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/wyatt_ui_layout/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/wyatt_ui_layout/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 00000000..a59a9b7e --- /dev/null +++ b/packages/wyatt_ui_layout/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/maloleon/Library/flutter +FLUTTER_APPLICATION_PATH=/Users/maloleon/Studio/wyatt-packages/packages/wyatt_ui_layout/example +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/wyatt_ui_layout/example/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/wyatt_ui_layout/example/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100755 index 00000000..4883d2d9 --- /dev/null +++ b/packages/wyatt_ui_layout/example/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/maloleon/Library/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/maloleon/Studio/wyatt-packages/packages/wyatt_ui_layout/example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json"