<!-- 
This README describes the package. If you publish this package to pub.dev,
this README's contents appear on the landing page for your package.

For information about how to write a good package README, see the guide for
[writing package pages](https://dart.dev/guides/libraries/writing-package-pages). 

For general information about developing packages, see the Dart guide for
[creating packages](https://dart.dev/guides/libraries/create-library-packages)
and the Flutter guide for
[developing packages and plugins](https://flutter.dev/developing-packages). 
-->

# Cloud Messaging BLoC Base

<p align="left">
  <a href="https://git.wyatt-studio.fr/Wyatt-FOSS/wyatt-packages/src/branch/master/packages/wyatt_analysis"><img src="https://img.shields.io/badge/Style-Wyatt%20Analysis-blue.svg?style=flat-square" alt="Style: Wyatt Analysis" /></a>
  <img src="https://img.shields.io/badge/SDK-Flutter-blue?style=flat-square" alt="SDK: Flutter" />
</p>

This package serves as an abstraction for managing notifications within Flutter applications. It does not include a built-in data source implementation. Therefore, it is essential to provide your own implementation or utilize one of our various implementations listed below:

- [Firebase Cloud Messaging ](https://git.wyatt-studio.fr/Wyatt-FOSS/-/packages/pub/wyatt_cloud_messaging_bloc_base/0.1.1+1)


This package enables you to easily integrate your data source, allowing the package to handle business logic, error management, and state logic seamlessly.

## Features

* 🧐 Wyatt Architecture
* 🧱 Entities
    - `RemoteNotification` -> Contains notification innformations
* 🧊 Cubits, why make it complicated when you can make it simple?
    - Goes to the essential
* 📐 Consistent
    - Every class have same naming convention

## Getting started

Simply add `wyatt_cloud_messaging_bloc_base` in `pubspec.yaml` , then

```dart
import 'package:wyatt_cloud_messaging_bloc_base/wyatt_cloud_messaging_bloc_base.dart';
```


## Usage

### Data source

The initial step involves furnishing a data source, presenting you with two options:
- You can select from our provided implementations, which are listed above.
- Alternatively, you can craft a custom implementation by extending the `CloudMessagingRemoteDataSource` class and implementing all of its methods.

In this example, we will use the Firebase Cloud Messaging implementation.

```dart
getIt.registerLazySingleton<CloudMessagingRemoteDataSource>(
    () => CloudMessagingFirebaseDataSource())
```

> Here we use GetIt.

### Repository

Do the same for the repository. This one is already developed, you just need to inject it.

```dart
getIt.registerLazySingleton<CloudMessagingRepository>(
    () => CloudMessagingRepositoryImpl(
        notificationRemoteDataSource: getIt(),
    ),
)
```

### Use cases

Do the same for use cases. Select an inject the ones you need in your app. Here are avalaible use cases: 

- `GetCloudMessagingTokenUsCase`
- `InitCloudmessagingUseCase`
- `ListenCloudMessagingUseCase`
- `RequestCloudMessagingPermissionUseCase`
- `SubscribeToNotificationTopicUseCase`
- `UnsubscribeFromNotificationTopicUseCase`

Here is an example with some usecase.

```dart
getIt
    ..registerLazySingleton<ListenNotificationUseCase>(
      () => ListenNotificationUseCase(
        notificationRepository: getIt(),
      ),
    )
    ..registerLazySingleton<GetCloudMessagingTokenUseCase>(
      () => GetCloudMessagingTokenUseCase(
        notificationRepository: getIt(),
      ),
    )
    ..registerLazySingleton<RequestCloudMessagingPermissionUseCase>(
      () => RequestCloudMessagingPermissionUseCase(
        notificationRepository: getIt(),
      ),
    );
```

### Widgets

From this point onward, your task simply involves enveloping your app within the `CloudMessagingWrapperScreen`. Subsequently, you can proceed to implement your desired actions for handling incoming notifications.

## Additional information

If necessary, you can access data sources, repositories, and use cases through `getIt`. Here's a helpful example:

```dart
abstract class CloudMessagingHelper {
  static Future<void> initMessaging() async {
    await getIt<RequestCloudMessagingPermissionUseCase>().call(null);

    final token = await getIt<GetCloudMessagingTokenUseCase>().call(null);
    if (token.isOk) {
      await notifLocalDataSource.storeToken(token: token.ok!);
    }
  }

  static dataProcess(String? path) {
    if (PageEnum.values.where((element) => (element.path == path)).isNotEmpty) {
      AppRouter.goRouterNavigatorKey.currentState?.context.push(path!);
    }
  }
}
```

