feat: implement notification abstraction package
This commit is contained in:
parent
792c3f774e
commit
bbfbf40126
@ -1,15 +1,12 @@
|
|||||||
import 'package:firebase_core/firebase_core.dart';
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
||||||
import 'package:notification_bloc_example/firebase_options.dart';
|
import 'package:notification_bloc_example/firebase_options.dart';
|
||||||
import 'package:wyatt_notification_bloc/wyatt_notification_bloc.dart';
|
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
await Firebase.initializeApp(
|
await Firebase.initializeApp(
|
||||||
options: DefaultFirebaseOptions.currentPlatform,
|
options: DefaultFirebaseOptions.currentPlatform,
|
||||||
);
|
);
|
||||||
print("Runnig App");
|
|
||||||
runApp(const MyApp());
|
runApp(const MyApp());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,19 +54,11 @@ class MyHomePage extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _MyHomePageState extends State<MyHomePage> {
|
class _MyHomePageState extends State<MyHomePage> {
|
||||||
String _content = 'No content';
|
|
||||||
|
|
||||||
void _handlerNotif(RemoteNotificationWrapper notif) {
|
|
||||||
setState(() {
|
|
||||||
_content = notif.data.toString();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final notificationFirebaseDataSource = FirebaseMessagingDataSourceImpl();
|
// final notificationFirebaseDataSource = FirebaseMessagingDataSourceImpl();
|
||||||
final notificationRepository = NotificationRepositoryImpl(
|
// final notificationRepository = NotificationRepositoryImpl(
|
||||||
notificationRemoteDataSource: notificationFirebaseDataSource);
|
// notificationRemoteDataSource: notificationFirebaseDataSource);
|
||||||
// This method is rerun every time setState is called, for instance as done
|
// This method is rerun every time setState is called, for instance as done
|
||||||
// by the _incrementCounter method above.
|
// by the _incrementCounter method above.
|
||||||
//
|
//
|
||||||
@ -82,8 +71,12 @@ class _MyHomePageState extends State<MyHomePage> {
|
|||||||
// the App.build method, and use it to set our appbar title.
|
// the App.build method, and use it to set our appbar title.
|
||||||
title: Text(widget.title),
|
title: Text(widget.title),
|
||||||
),
|
),
|
||||||
|
<<<<<<< HEAD
|
||||||
<<<<<<< HEAD
|
<<<<<<< HEAD
|
||||||
body: Center(
|
body: Center(
|
||||||
|
=======
|
||||||
|
body: const Center(
|
||||||
|
>>>>>>> 3dbc809 (feat: implement notification abstraction package)
|
||||||
// Center is a layout widget. It takes a single child and positions it
|
// Center is a layout widget. It takes a single child and positions it
|
||||||
// in the middle of the parent.
|
// in the middle of the parent.
|
||||||
child: Column(
|
child: Column(
|
||||||
@ -103,6 +96,7 @@ class _MyHomePageState extends State<MyHomePage> {
|
|||||||
// horizontal).
|
// horizontal).
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
|
<<<<<<< HEAD
|
||||||
const Text(
|
const Text(
|
||||||
'You have pushed the button this many times:',
|
'You have pushed the button this many times:',
|
||||||
),
|
),
|
||||||
@ -157,6 +151,15 @@ class _MyHomePageState extends State<MyHomePage> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
>>>>>>> 5da1cd0 (feat(notification_bloc): add base architecture and start impementing firebase messaging data source. Add example too (#33))
|
>>>>>>> 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)
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -33,7 +33,7 @@ dependencies:
|
|||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
flutter_bloc: ^8.1.1
|
flutter_bloc: ^8.1.1
|
||||||
wyatt_notification_bloc:
|
wyatt_cloud_messaging_bloc:
|
||||||
path: ../
|
path: ../
|
||||||
|
|
||||||
|
|
||||||
|
2
packages/wyatt_notification_bloc/lib/src/core/core.dart
Normal file
2
packages/wyatt_notification_bloc/lib/src/core/core.dart
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export './exceptions/notification_exeption.dart';
|
||||||
|
export './extensions/build_context_extension.dart';
|
@ -1,5 +0,0 @@
|
|||||||
enum NotificationStatus {
|
|
||||||
unknown,
|
|
||||||
authorized,
|
|
||||||
unauthorized,
|
|
||||||
}
|
|
@ -0,0 +1,5 @@
|
|||||||
|
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||||
|
|
||||||
|
class NotificationException extends AppException {
|
||||||
|
const NotificationException([super.message]);
|
||||||
|
}
|
@ -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<CloudmessagingCubit>();
|
||||||
|
}
|
@ -1,2 +1 @@
|
|||||||
export 'data_sources/remote/firebase_messaging_data_source_impl.dart';
|
|
||||||
export 'repositories/notification_repository_impl.dart';
|
export 'repositories/notification_repository_impl.dart';
|
||||||
|
@ -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<String> getToken() async {
|
|
||||||
final token = await _instance.getToken();
|
|
||||||
if (token != null && token.isNotEmpty) {
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
throw Exception('error on token');
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Stream<RemoteNotificationWrapper> onNotification() =>
|
|
||||||
FirebaseMessaging.onMessage
|
|
||||||
.map(RemoteNotificationWrapperModel.fromFirebaseModel);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Stream<RemoteNotificationWrapper> onNotificationOpened() =>
|
|
||||||
FirebaseMessaging.onMessageOpenedApp
|
|
||||||
.map(RemoteNotificationWrapperModel.fromFirebaseModel);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<RemoteNotificationWrapper?> getInitialMessage() =>
|
|
||||||
_instance.getInitialMessage().then<RemoteNotificationWrapper?>(
|
|
||||||
RemoteNotificationWrapperModel.fromFirebaseModel,
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> register() async {
|
|
||||||
await _instance.requestPermission();
|
|
||||||
await FirebaseMessaging.instance
|
|
||||||
.setForegroundNotificationPresentationOptions(
|
|
||||||
alert: true, // Required to display a heads up notification
|
|
||||||
badge: true,
|
|
||||||
sound: true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> subscribeToTopic(String topic) =>
|
|
||||||
_instance.subscribeToTopic(topic);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> unsubscribeFromTopic(String topic) =>
|
|
||||||
_instance.unsubscribeFromTopic(topic);
|
|
||||||
}
|
|
@ -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<String, dynamic>? 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,
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,7 +1,8 @@
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
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_cloud_messaging_bloc/src/core/exceptions/notification_exeption.dart';
|
||||||
import 'package:wyatt_notification_bloc/src/domain/entities/remote_notifications.dart';
|
import 'package:wyatt_cloud_messaging_bloc/src/domain/data_sources/remote/notification_remote_data_source.dart';
|
||||||
import 'package:wyatt_notification_bloc/src/domain/repositories/notification_repository.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';
|
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||||
|
|
||||||
class NotificationRepositoryImpl extends NotificationRepository {
|
class NotificationRepositoryImpl extends NotificationRepository {
|
||||||
@ -13,46 +14,68 @@ class NotificationRepositoryImpl extends NotificationRepository {
|
|||||||
@override
|
@override
|
||||||
FutureOrResult<void> register() => Result.tryCatchAsync(
|
FutureOrResult<void> register() => Result.tryCatchAsync(
|
||||||
_notificationRemoteDataSource.register,
|
_notificationRemoteDataSource.register,
|
||||||
(error) => ClientException(error.toString()),
|
(error) => error is AppException
|
||||||
|
? error
|
||||||
|
: NotificationException(error.toString()),
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<String> getToken() => Result.tryCatchAsync(
|
FutureOrResult<String> getToken() => Result.tryCatchAsync(
|
||||||
_notificationRemoteDataSource.getToken,
|
_notificationRemoteDataSource.getToken,
|
||||||
(error) => ClientException(error.toString()),
|
(error) => error is AppException
|
||||||
);
|
? error
|
||||||
|
: NotificationException(error.toString()),
|
||||||
@override
|
|
||||||
FutureOrResult<Stream<RemoteNotificationWrapper>> onNotification() =>
|
|
||||||
Result.tryCatch(
|
|
||||||
_notificationRemoteDataSource.onNotification,
|
|
||||||
(error) => ClientException(error.toString()),
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOrResult<RemoteNotificationWrapper?> getInitialMessage() =>
|
|
||||||
Result.tryCatchAsync(
|
|
||||||
_notificationRemoteDataSource.getInitialMessage,
|
|
||||||
(error) => ClientException(error.toString()),
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOrResult<Stream<RemoteNotificationWrapper>> onNotificationOpened() =>
|
|
||||||
Result.tryCatch(
|
|
||||||
_notificationRemoteDataSource.onNotificationOpened,
|
|
||||||
(error) => ClientException(error.toString()),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<void> subscribeToTopic(String topic) => Result.tryCatchAsync(
|
FutureOrResult<void> subscribeToTopic(String topic) => Result.tryCatchAsync(
|
||||||
() => _notificationRemoteDataSource.subscribeToTopic(topic),
|
() => _notificationRemoteDataSource.subscribeToTopic(topic),
|
||||||
(error) => ClientException(error.toString()),
|
(error) => error is AppException
|
||||||
|
? error
|
||||||
|
: NotificationException(error.toString()),
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<void> unsubscribeFromTopic(String topic) =>
|
FutureOrResult<void> unsubscribeFromTopic(String topic) =>
|
||||||
Result.tryCatchAsync(
|
Result.tryCatchAsync(
|
||||||
() => _notificationRemoteDataSource.unsubscribeFromTopic(topic),
|
() => _notificationRemoteDataSource.unsubscribeFromTopic(topic),
|
||||||
(error) => ClientException(error.toString()),
|
(error) => error is AppException
|
||||||
|
? error
|
||||||
|
: NotificationException(error.toString()),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOrResult<void> requestPermissions() => Result.tryCatchAsync(
|
||||||
|
_notificationRemoteDataSource.requestPermissions,
|
||||||
|
(error) => error is AppException
|
||||||
|
? error
|
||||||
|
: NotificationException(error.toString()),
|
||||||
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOrResult<Stream<RemoteNotification>> onNotificationAccepted() =>
|
||||||
|
Result.tryCatchAsync(
|
||||||
|
_notificationRemoteDataSource.onNotificationBackgroundAccepted,
|
||||||
|
(error) => error is AppException
|
||||||
|
? error
|
||||||
|
: NotificationException(error.toString()),
|
||||||
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOrResult<Stream<RemoteNotification>>
|
||||||
|
onNotificationBackgroundAccepted() => Result.tryCatchAsync(
|
||||||
|
_notificationRemoteDataSource.onNotificationBackgroundAccepted,
|
||||||
|
(error) => error is AppException
|
||||||
|
? error
|
||||||
|
: NotificationException(error.toString()),
|
||||||
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOrResult<Stream<RemoteNotification>>
|
||||||
|
onNotificationForegroundAccepted() => Result.tryCatchAsync(
|
||||||
|
_notificationRemoteDataSource.onNotificationForegroundAccepted,
|
||||||
|
(error) => error is AppException
|
||||||
|
? error
|
||||||
|
: NotificationException(error.toString()),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
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 {
|
abstract class NotificationRemoteDataSource extends BaseRepository {
|
||||||
Future<void> register();
|
Future<void> register();
|
||||||
|
|
||||||
Stream<RemoteNotificationWrapper> onNotification();
|
Future<Stream<RemoteNotification>> onNotificationAccepted();
|
||||||
|
|
||||||
Stream<RemoteNotificationWrapper> onNotificationOpened();
|
Future<Stream<RemoteNotification>> onNotificationBackgroundAccepted();
|
||||||
|
|
||||||
Future<RemoteNotificationWrapper?> getInitialMessage();
|
Future<Stream<RemoteNotification>> onNotificationForegroundAccepted();
|
||||||
|
|
||||||
|
Future<void> requestPermissions();
|
||||||
|
|
||||||
Future<String> getToken();
|
Future<String> getToken();
|
||||||
|
|
||||||
|
@ -1,9 +1,15 @@
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||||
|
|
||||||
abstract class RemoteNotificationWrapper extends Entity {
|
class RemoteNotification extends Entity {
|
||||||
const RemoteNotificationWrapper();
|
const RemoteNotification({
|
||||||
String? get senderId;
|
this.senderId,
|
||||||
String? get messageId;
|
this.messageId,
|
||||||
Map<String, dynamic>? get data;
|
this.data,
|
||||||
DateTime? get sentTime;
|
this.sentTime,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String? senderId;
|
||||||
|
final String? messageId;
|
||||||
|
final Map<String, dynamic>? data;
|
||||||
|
final DateTime? sentTime;
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,18 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
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 {
|
abstract class NotificationRepository extends BaseRepository {
|
||||||
FutureOrResult<void> register();
|
FutureOrResult<void> register();
|
||||||
|
|
||||||
FutureOrResult<Stream<RemoteNotificationWrapper>> onNotification();
|
FutureOrResult<Stream<RemoteNotification>> onNotificationAccepted();
|
||||||
|
|
||||||
FutureOrResult<Stream<RemoteNotificationWrapper>> onNotificationOpened();
|
FutureOrResult<Stream<RemoteNotification>> onNotificationBackgroundAccepted();
|
||||||
|
|
||||||
FutureOrResult<RemoteNotificationWrapper?> getInitialMessage();
|
FutureOrResult<Stream<RemoteNotification>> onNotificationForegroundAccepted();
|
||||||
|
|
||||||
|
FutureOrResult<void> requestPermissions();
|
||||||
|
|
||||||
FutureOrResult<String> getToken();
|
FutureOrResult<String> getToken();
|
||||||
|
|
||||||
|
@ -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<void, String> {
|
||||||
|
final NotificationRepository _notificationRepository;
|
||||||
|
|
||||||
|
GetCloudMessagingTokenUseCase({
|
||||||
|
required NotificationRepository notificationRepository,
|
||||||
|
}) : _notificationRepository = notificationRepository;
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOrResult<String> execute(void params) =>
|
||||||
|
_notificationRepository.getToken();
|
||||||
|
}
|
@ -1,14 +0,0 @@
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
|
||||||
import 'package:wyatt_notification_bloc/wyatt_notification_bloc.dart';
|
|
||||||
|
|
||||||
class GetInitialMessage
|
|
||||||
extends AsyncUseCase<NoParam, RemoteNotificationWrapper?> {
|
|
||||||
final NotificationRepository _notificationRepository;
|
|
||||||
|
|
||||||
GetInitialMessage({required NotificationRepository notificationRepository})
|
|
||||||
: _notificationRepository = notificationRepository;
|
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOrResult<RemoteNotificationWrapper?> call(NoParam? params) =>
|
|
||||||
_notificationRepository.getInitialMessage();
|
|
||||||
}
|
|
@ -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<NoParam, void> {
|
||||||
|
final NotificationRepository _notificationRepository;
|
||||||
|
|
||||||
|
InitCloudmessagingUseCase({
|
||||||
|
required NotificationRepository notificationRepository,
|
||||||
|
}) : _notificationRepository = notificationRepository;
|
||||||
|
@override
|
||||||
|
FutureOrResult<void> execute(NoParam? params) =>
|
||||||
|
_notificationRepository.register();
|
||||||
|
}
|
@ -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<NoParam, RemoteNotificationWrapper> {
|
|
||||||
final NotificationRepository _notificationRepository;
|
|
||||||
|
|
||||||
ListenNotification({required NotificationRepository notificationRepository})
|
|
||||||
: _notificationRepository = notificationRepository;
|
|
||||||
@override
|
|
||||||
FutureOrResult<Stream<RemoteNotificationWrapper>> call(NoParam? params) =>
|
|
||||||
_notificationRepository.onNotificationOpened();
|
|
||||||
}
|
|
@ -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<NoParam, RemoteNotification> {
|
||||||
|
final NotificationRepository _notificationRepository;
|
||||||
|
|
||||||
|
ListenNotification({required NotificationRepository notificationRepository})
|
||||||
|
: _notificationRepository = notificationRepository;
|
||||||
|
@override
|
||||||
|
FutureOrResult<Stream<RemoteNotification>> execute(NoParam? params) async {
|
||||||
|
Stream<RemoteNotification>? 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);
|
||||||
|
}
|
||||||
|
}
|
@ -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<NoParam, void> {
|
|
||||||
final NotificationRepository _notificationRepository;
|
|
||||||
|
|
||||||
Register({required NotificationRepository notificationRepository})
|
|
||||||
: _notificationRepository = notificationRepository;
|
|
||||||
@override
|
|
||||||
FutureOrResult<void> call(NoParam? params) async {
|
|
||||||
final registration = await _notificationRepository.register();
|
|
||||||
final userToken = await _notificationRepository.getToken();
|
|
||||||
print("User FCM Token : ${userToken.ok}");
|
|
||||||
return registration;
|
|
||||||
}
|
|
||||||
}
|
|
@ -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<void, void> {
|
||||||
|
final NotificationRepository _notificationRepository;
|
||||||
|
|
||||||
|
RequestCloudMessagingPermissionUseCase({
|
||||||
|
required NotificationRepository notificationRepository,
|
||||||
|
}) : _notificationRepository = notificationRepository;
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOrResult<void> execute(void params) =>
|
||||||
|
_notificationRepository.register();
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
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<String, void> {
|
class Subscribe extends AsyncUseCase<String, void> {
|
||||||
final NotificationRepository _notificationRepository;
|
final NotificationRepository _notificationRepository;
|
||||||
@ -9,14 +9,14 @@ class Subscribe extends AsyncUseCase<String, void> {
|
|||||||
Subscribe({required NotificationRepository notificationRepository})
|
Subscribe({required NotificationRepository notificationRepository})
|
||||||
: _notificationRepository = notificationRepository;
|
: _notificationRepository = notificationRepository;
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOrResult<void> call(String? params) =>
|
|
||||||
_notificationRepository.subscribeToTopic(params ?? '');
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOr<void> onStart(String? params) {
|
FutureOr<void> onStart(String? params) {
|
||||||
if (params == null) {
|
if (params == null) {
|
||||||
throw ClientException('Topic is not valid');
|
throw const ClientException('Topic is not valid');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOrResult<void> execute(String? params) =>
|
||||||
|
_notificationRepository.subscribeToTopic(params!);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
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<String, void> {
|
class Unsubscribe extends AsyncUseCase<String, void> {
|
||||||
final NotificationRepository _notificationRepository;
|
final NotificationRepository _notificationRepository;
|
||||||
@ -9,14 +9,14 @@ class Unsubscribe extends AsyncUseCase<String, void> {
|
|||||||
Unsubscribe({required NotificationRepository notificationRepository})
|
Unsubscribe({required NotificationRepository notificationRepository})
|
||||||
: _notificationRepository = notificationRepository;
|
: _notificationRepository = notificationRepository;
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOrResult<void> call(String? params) =>
|
|
||||||
_notificationRepository.unsubscribeFromTopic(params ?? '');
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOr<void> onStart(String? params) {
|
FutureOr<void> onStart(String? params) {
|
||||||
if (params == null) {
|
if (params == null) {
|
||||||
throw ClientException('Topic is not valid');
|
throw const ClientException('Topic is not valid');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOrResult<void> execute(String? params) =>
|
||||||
|
_notificationRepository.unsubscribeFromTopic(params!);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
export 'get_intitial_message.dart';
|
export './get_cloud_messaging_token_use_case.dart';
|
||||||
export 'listen_notification.dart';
|
export './init_cloud_messaging_use_case.dart';
|
||||||
export 'register.dart';
|
export './listen_notification_use_case.dart';
|
||||||
export 'subscribe.dart';
|
export './request_cloud_messaging_permission_use_case.dart';
|
||||||
export 'unsubscribe.dart';
|
export './subscribe.dart';
|
||||||
|
export './unsubscribe.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<CloudmessagingState> {
|
||||||
|
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<void> listenNotification() async {
|
||||||
|
final notificaitons = await _listenNotification.execute(const NoParam());
|
||||||
|
if (notificaitons.isOk) {
|
||||||
|
notificaitons.ok?.listen((notification) {
|
||||||
|
emit(CloudmessagingState(notification));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureOr<void> subscribe(String topic) => _subscribe.execute(topic);
|
||||||
|
|
||||||
|
FutureOr<void> unsubscribe(String topic) => _unsubscribe.execute(topic);
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
part of 'cloud_messaging_cubit.dart';
|
||||||
|
|
||||||
|
class CloudmessagingState extends Equatable {
|
||||||
|
final RemoteNotification? remoteNotification;
|
||||||
|
|
||||||
|
const CloudmessagingState([this.remoteNotification]);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [remoteNotification];
|
||||||
|
}
|
@ -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<NotificationState> {
|
|
||||||
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<void> 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<void> 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<void> subscribe(String topic) => _subscribe.execute(topic);
|
|
||||||
|
|
||||||
FutureOr<void> unsubscribe(String topic) => _unsubscribe.execute(topic);
|
|
||||||
}
|
|
@ -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<Object?> get props => [_notificationStatus];
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() => 'NotificationState(status: $notificationStatus)';
|
|
||||||
}
|
|
@ -1,3 +1,3 @@
|
|||||||
export 'data/data.dart';
|
export 'data/data.dart';
|
||||||
export 'domain/domain.dart';
|
export 'domain/domain.dart';
|
||||||
export 'features/notifications/bloc/notification_cubit.dart';
|
export 'features/notifications/bloc/cloud_messaging_cubit.dart';
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2022 WYATT GROUP
|
// Copyright (C) 2023 WYATT GROUP
|
||||||
// Please see the AUTHORS file for details.
|
// Please see the AUTHORS file for details.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify
|
// This program is free software: you can redistribute it and/or modify
|
||||||
@ -15,6 +15,6 @@
|
|||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
/// An notification library for BLoC.
|
/// An notification library for BLoC.
|
||||||
library wyatt_notification_bloc;
|
library wyatt_cloud_messaging_bloc;
|
||||||
|
|
||||||
export 'src/src.dart';
|
export 'src/src.dart';
|
@ -1,4 +1,4 @@
|
|||||||
name: wyatt_notification_bloc
|
name: wyatt_cloud_messaging_bloc
|
||||||
description: A starting point for Dart libraries or applications.
|
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
|
repository: https://git.wyatt-studio.fr/Wyatt-FOSS/wyatt-packages/src/branch/master/packages/wyatt_notification_bloc
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
@ -6,22 +6,26 @@ version: 1.0.0
|
|||||||
publish_to: none
|
publish_to: none
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.18.2 <3.0.0"
|
sdk: ">=3.0.0 <4.0.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
|
flutter:
|
||||||
|
sdk: flutter
|
||||||
equatable: ^2.0.5
|
equatable: ^2.0.5
|
||||||
firebase_messaging: ^14.1.1
|
firebase_messaging: ^14.1.1
|
||||||
flutter_bloc: ^8.1.1
|
flutter_bloc: ^8.1.1
|
||||||
|
rxdart: ^0.27.7
|
||||||
wyatt_architecture:
|
wyatt_architecture:
|
||||||
git:
|
hosted:
|
||||||
url: ssh://git@git.wyatt-studio.fr:993/Wyatt-FOSS/wyatt-packages.git
|
url: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
|
||||||
ref: feat/architecture/make_usecases_more_modular_and_adaptable
|
name: wyatt_architecture
|
||||||
path: packages/wyatt_architecture
|
version: ^0.2.0
|
||||||
|
|
||||||
wyatt_type_utils:
|
wyatt_type_utils:
|
||||||
hosted: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
|
hosted:
|
||||||
version: ^0.0.3+1
|
url: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
|
||||||
|
name: wyatt_type_utils
|
||||||
|
version: ^0.0.5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
@ -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
|
@ -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"
|
@ -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
|
@ -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"
|
Loading…
x
Reference in New Issue
Block a user