feat: implement notification abstraction package

This commit is contained in:
Malo Léon 2023-08-17 19:43:58 +02:00
parent 792c3f774e
commit bbfbf40126
34 changed files with 333 additions and 321 deletions

View File

@ -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<MyHomePage> {
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<MyHomePage> {
// 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<MyHomePage> {
// horizontal).
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
<<<<<<< HEAD
const Text(
'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))
=======
Text(
'content of notification :',
),
Text(
'Notif',
),
],
>>>>>>> 3dbc809 (feat: implement notification abstraction package)
),
),
);

View File

@ -33,7 +33,7 @@ dependencies:
sdk: flutter
flutter_bloc: ^8.1.1
wyatt_notification_bloc:
wyatt_cloud_messaging_bloc:
path: ../

View File

@ -0,0 +1,2 @@
export './exceptions/notification_exeption.dart';
export './extensions/build_context_extension.dart';

View File

@ -1,5 +0,0 @@
enum NotificationStatus {
unknown,
authorized,
unauthorized,
}

View File

@ -0,0 +1,5 @@
import 'package:wyatt_architecture/wyatt_architecture.dart';
class NotificationException extends AppException {
const NotificationException([super.message]);
}

View File

@ -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>();
}

View File

@ -1,2 +1 @@
export 'data_sources/remote/firebase_messaging_data_source_impl.dart';
export 'repositories/notification_repository_impl.dart';

View File

@ -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);
}

View File

@ -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,
);
}

View File

@ -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<void> register() => Result.tryCatchAsync(
_notificationRemoteDataSource.register,
(error) => ClientException(error.toString()),
(error) => error is AppException
? error
: NotificationException(error.toString()),
);
@override
FutureOrResult<String> getToken() => Result.tryCatchAsync(
_notificationRemoteDataSource.getToken,
(error) => ClientException(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()),
(error) => error is AppException
? error
: NotificationException(error.toString()),
);
@override
FutureOrResult<void> subscribeToTopic(String topic) => Result.tryCatchAsync(
() => _notificationRemoteDataSource.subscribeToTopic(topic),
(error) => ClientException(error.toString()),
(error) => error is AppException
? error
: NotificationException(error.toString()),
);
@override
FutureOrResult<void> unsubscribeFromTopic(String topic) =>
Result.tryCatchAsync(
() => _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()),
);
}

View File

@ -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<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();

View File

@ -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<String, dynamic>? 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<String, dynamic>? data;
final DateTime? sentTime;
}

View File

@ -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<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();

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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();
}

View File

@ -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<String, void> {
final NotificationRepository _notificationRepository;
@ -9,14 +9,14 @@ class Subscribe extends AsyncUseCase<String, void> {
Subscribe({required NotificationRepository notificationRepository})
: _notificationRepository = notificationRepository;
@override
FutureOrResult<void> call(String? params) =>
_notificationRepository.subscribeToTopic(params ?? '');
@override
FutureOr<void> onStart(String? params) {
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!);
}

View File

@ -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<String, void> {
final NotificationRepository _notificationRepository;
@ -9,14 +9,14 @@ class Unsubscribe extends AsyncUseCase<String, void> {
Unsubscribe({required NotificationRepository notificationRepository})
: _notificationRepository = notificationRepository;
@override
FutureOrResult<void> call(String? params) =>
_notificationRepository.unsubscribeFromTopic(params ?? '');
@override
FutureOr<void> onStart(String? params) {
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!);
}

View File

@ -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';

View File

@ -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);
}

View File

@ -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];
}

View File

@ -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);
}

View File

@ -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)';
}

View File

@ -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';

View File

@ -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 <https://www.gnu.org/licenses/>.
/// An notification library for BLoC.
library wyatt_notification_bloc;
library wyatt_cloud_messaging_bloc;
export 'src/src.dart';

View File

@ -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:

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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"