Compare commits

...

6 Commits

Author SHA1 Message Date
a4c73421d2 fix(authentication_bloc): upgrade google sign to his major v
Some checks failed
continuous-integration/drone/pr Build is failing
2023-08-28 09:00:59 +00:00
227158725d fix: apply dart format 2023-08-28 09:00:59 +00:00
cc41b7b589 fix: apply dart fix --apply 2023-08-28 09:00:59 +00:00
e74346b655 fix(authentication_bloc): go router version refactoring 2023-08-28 09:00:59 +00:00
54bd147e87 chore: upgrade deps to major versions 2023-08-28 09:00:59 +00:00
543b9421ca docs(cloud_messaging_bloc): add reamde
Some checks failed
continuous-integration/drone/pr Build is failing
2023-08-28 08:37:23 +00:00
55 changed files with 270 additions and 198 deletions

View File

@ -25,7 +25,7 @@ class AlbumMockDataSourceImpl extends AlbumRemoteDataSource {
id: 1,
userId: 1,
title: 'Album 1',
)
),
};
@override

View File

@ -58,8 +58,8 @@ class PhotosGridThumbnail
bottom: 10,
right: 10,
child: Icon(Icons.favorite),
)
]
),
],
],
),
);

View File

@ -71,7 +71,8 @@ class App extends StatelessWidget {
if (authState.status != previous?.status) {
previous = authState;
// Checking if current path is onboarding or not
final isOnboarding = AppRouter.publicRoutes.contains(state.subloc);
final isOnboarding =
AppRouter.publicRoutes.contains(state.matchedLocation);
if (authState.status == AuthenticationStatus.unauthenticated) {
debugPrint('Not logged');
if (!isOnboarding) {

View File

@ -30,11 +30,11 @@ dependencies:
flutter:
sdk: flutter
go_router: ^5.1.5
go_router: ^10.1.0
firebase_core: ^2.1.1
flutter_bloc: ^8.1.1
firebase_auth: ^4.2.0
google_sign_in: ^5.4.2
google_sign_in: ^6.1.4
get_it: ^7.2.0
wyatt_authentication_bloc:

View File

@ -33,7 +33,7 @@ abstract class Forms {
FormInput(
AuthFormField.password,
customPasswordValidator ?? const Password.pure(),
)
),
],
name: AuthFormName.signInForm,
);
@ -55,7 +55,7 @@ abstract class Forms {
AuthFormField.password,
customPasswordValidator ?? const Password.pure(),
),
...extraSignUpInputs ?? []
...extraSignUpInputs ?? [],
],
name: AuthFormName.signUpForm,
);
@ -93,7 +93,7 @@ abstract class Forms {
customPasswordValidator ?? const Password.pure(),
metadata: const FormInputMetadata(isRequired: false),
),
...extraEditAccountInputs ?? []
...extraEditAccountInputs ?? [],
],
validationStrategy: const OnlyRequiredInputValidator(),
name: AuthFormName.editAccountForm,

View File

@ -32,8 +32,8 @@ class AuthenticationMockCacheDataSourceImpl<Data>
@override
Future<Account?> getCachedAccount() async {
await Future<void>.delayed(const Duration(milliseconds: 200));
return null;
return null;
}
@override

View File

@ -15,7 +15,7 @@ dependencies:
flutter_bloc: ^8.1.1
equatable: ^2.0.5
firebase_auth: ^4.2.0
google_sign_in: ^5.4.2
google_sign_in: ^6.1.4
rxdart: ^0.27.7
wyatt_form_bloc:
@ -30,12 +30,12 @@ dependencies:
hosted: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
version: ^0.0.5
flutter_secure_storage: ^8.0.0
http: ^0.13.5
http: ^1.1.0
dev_dependencies:
flutter_test: { sdk: flutter }
bloc_test: ^9.1.0
mocktail: ^0.3.0
mocktail: ^1.0.0
wyatt_analysis:
hosted: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/

View File

@ -46,7 +46,7 @@ void main() {
AuthenticationSession.fromEvent(
SignedInFromCacheEvent(account: account),
data: 10,
)
),
]),
);
@ -113,7 +113,7 @@ void main() {
),
const EmailVerificationState(
status: FormStatus.submissionSuccess,
)
),
],
);
@ -135,7 +135,7 @@ void main() {
const EmailVerificationState(
errorMessage: 'erreur',
status: FormStatus.submissionFailure,
)
),
],
);
});
@ -192,7 +192,7 @@ void main() {
const EmailVerificationState(
isVerified: true,
status: FormStatus.submissionSuccess,
)
),
],
);
@ -214,7 +214,7 @@ void main() {
),
const EmailVerificationState(
status: FormStatus.submissionSuccess,
)
),
],
);
@ -236,7 +236,7 @@ void main() {
const EmailVerificationState(
errorMessage: 'erreur',
status: FormStatus.submissionFailure,
)
),
],
);
});

View File

@ -41,7 +41,7 @@ void main() {
final WyattForm form = WyattFormImpl(
[
FormInput(AuthFormField.email, const Email.pure()),
FormInput(AuthFormField.password, const Password.pure())
FormInput(AuthFormField.password, const Password.pure()),
],
name: AuthFormName.passwordResetForm,
);
@ -260,7 +260,7 @@ void main() {
name: AuthFormName.passwordResetForm,
),
status: FormStatus.submissionSuccess,
)
),
],
);
@ -327,7 +327,7 @@ void main() {
name: AuthFormName.passwordResetForm,
),
status: FormStatus.submissionFailure,
)
),
],
);
});

View File

@ -46,7 +46,7 @@ void main() {
final WyattForm form = WyattFormImpl(
[
FormInput(AuthFormField.email, const Email.pure()),
FormInput(AuthFormField.password, const Password.pure())
FormInput(AuthFormField.password, const Password.pure()),
],
name: AuthFormName.signInForm,
);
@ -102,7 +102,7 @@ void main() {
AuthFormField.email,
const Email.dirty(invalidEmailString),
),
FormInput(AuthFormField.password, const Password.pure())
FormInput(AuthFormField.password, const Password.pure()),
],
name: AuthFormName.signInForm,
),
@ -126,7 +126,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -145,7 +145,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -163,7 +163,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -191,7 +191,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(invalidPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -215,7 +215,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.pure(),
)
),
],
name: AuthFormName.signInForm,
),
@ -234,7 +234,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.pure(),
)
),
],
name: AuthFormName.signInForm,
),
@ -252,7 +252,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -287,7 +287,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -312,7 +312,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -331,7 +331,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -364,7 +364,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -383,7 +383,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -401,7 +401,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -417,12 +417,12 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
status: FormStatus.submissionSuccess,
)
),
],
);
@ -448,7 +448,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -467,7 +467,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -485,7 +485,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -501,12 +501,12 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
status: FormStatus.submissionFailure,
)
),
],
);
});
@ -527,7 +527,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -566,7 +566,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -584,7 +584,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.pure(),
)
),
],
name: AuthFormName.signInForm,
),
@ -600,12 +600,12 @@ void main() {
FormInput(
AuthFormField.password,
const Password.pure(),
)
),
],
name: AuthFormName.signInForm,
),
status: FormStatus.submissionSuccess,
)
),
],
);
@ -630,7 +630,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signInForm,
),
@ -648,7 +648,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.pure(),
)
),
],
name: AuthFormName.signInForm,
),
@ -664,12 +664,12 @@ void main() {
FormInput(
AuthFormField.password,
const Password.pure(),
)
),
],
name: AuthFormName.signInForm,
),
status: FormStatus.submissionFailure,
)
),
],
);
});

View File

@ -22,7 +22,7 @@ void main() {
final WyattForm form = WyattFormImpl(
[
FormInput(AuthFormField.email, const Email.pure()),
FormInput(AuthFormField.password, const Password.pure())
FormInput(AuthFormField.password, const Password.pure()),
],
name: AuthFormName.signInForm,
);

View File

@ -46,7 +46,7 @@ void main() {
final WyattForm form = WyattFormImpl(
[
FormInput(AuthFormField.email, const Email.pure()),
FormInput(AuthFormField.password, const Password.pure())
FormInput(AuthFormField.password, const Password.pure()),
],
name: AuthFormName.signUpForm,
);
@ -98,7 +98,7 @@ void main() {
AuthFormField.email,
const Email.dirty(invalidEmailString),
),
FormInput(AuthFormField.password, const Password.pure())
FormInput(AuthFormField.password, const Password.pure()),
],
name: AuthFormName.signUpForm,
),
@ -122,7 +122,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -141,7 +141,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -159,7 +159,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -187,7 +187,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(invalidPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -211,7 +211,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.pure(),
)
),
],
name: AuthFormName.signUpForm,
),
@ -230,7 +230,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.pure(),
)
),
],
name: AuthFormName.signUpForm,
),
@ -248,7 +248,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -283,7 +283,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -302,7 +302,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -335,7 +335,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -354,7 +354,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -372,7 +372,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -388,12 +388,12 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
status: FormStatus.submissionSuccess,
)
),
],
);
@ -419,7 +419,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -438,7 +438,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -456,7 +456,7 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
@ -472,12 +472,12 @@ void main() {
FormInput(
AuthFormField.password,
const Password.dirty(validPasswordString),
)
),
],
name: AuthFormName.signUpForm,
),
status: FormStatus.submissionFailure,
)
),
],
);
});
@ -487,7 +487,7 @@ void main() {
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>,
dynamic>>[
FormInput(AuthFormField.email, const Email.pure()),
FormInput(AuthFormField.password, const Password.pure())
FormInput(AuthFormField.password, const Password.pure()),
];
final inputsB = <

View File

@ -22,7 +22,7 @@ void main() {
final WyattForm form = WyattFormImpl(
[
FormInput(AuthFormField.email, const Email.pure()),
FormInput(AuthFormField.password, const Password.pure())
FormInput(AuthFormField.password, const Password.pure()),
],
name: AuthFormName.signInForm,
);

View File

@ -31,7 +31,7 @@ class ExampleCubit extends Cubit<CrudState> {
'DATA LOADED 1',
'DATA LOADED 2',
'DATA LOADED 3',
'DATA LOADED 4'
'DATA LOADED 4',
]),
);
await Future<void>.delayed(const Duration(seconds: 1));

View File

@ -11,29 +11,124 @@ and the Flutter guide for
[developing packages and plugins](https://flutter.dev/developing-packages).
-->
TODO: Put a short description of the package here that helps potential users
know whether this package might be useful for them.
# 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
TODO: List what your package can do. Maybe include images, gifs, or videos.
* 🧐 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
TODO: List prerequisites and provide or point to information on how to
start using the package.
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
TODO: Include short and useful examples for package users. Add longer examples
to `/example` folder.
### 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
const like = 'sample';
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
TODO: Tell users more about the package: where to find more information, how to
contribute to the package, how to file issues, what response they can expect
from the package authors, and more.
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!);
}
}
}
```

View File

@ -53,7 +53,8 @@ class DefaultFirebaseOptions {
messagingSenderId: '100151285458',
projectId: 'wyatt-notification-example',
storageBucket: 'wyatt-notification-example.appspot.com',
iosClientId: '100151285458-a9notq1k1padf0vk9ove8ll3amjgi7mn.apps.googleusercontent.com',
iosClientId:
'100151285458-a9notq1k1padf0vk9ove8ll3amjgi7mn.apps.googleusercontent.com',
iosBundleId: 'com.example.notificationBlocExample',
);
}

View File

@ -22,11 +22,10 @@ import 'package:wyatt_cloud_messaging_bloc_base/src/domain/repositories/cloud_me
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
class CloudMessagingRepositoryImpl extends CloudMessagingRepository {
final CloudMessagingRemoteDataSource _notificationRemoteDataSource;
CloudMessagingRepositoryImpl({
required CloudMessagingRemoteDataSource notificationRemoteDataSource,
}) : _notificationRemoteDataSource = notificationRemoteDataSource;
final CloudMessagingRemoteDataSource _notificationRemoteDataSource;
@override
FutureOrResult<String?> getToken() => Result.tryCatchAsync(

View File

@ -18,11 +18,10 @@ import 'package:wyatt_architecture/wyatt_architecture.dart';
import 'package:wyatt_cloud_messaging_bloc_base/src/domain/repositories/cloud_messaging_repository.dart';
class GetCloudMessagingTokenUseCase extends AsyncUseCase<void, String?> {
final CloudMessagingRepository _notificationRepository;
GetCloudMessagingTokenUseCase({
required CloudMessagingRepository notificationRepository,
}) : _notificationRepository = notificationRepository;
final CloudMessagingRepository _notificationRepository;
@override
FutureOrResult<String?> execute(void params) =>

View File

@ -18,11 +18,10 @@ import 'package:wyatt_architecture/wyatt_architecture.dart';
import 'package:wyatt_cloud_messaging_bloc_base/src/domain/repositories/cloud_messaging_repository.dart';
class InitCloudmessagingUseCase extends AsyncUseCase<NoParam, void> {
final CloudMessagingRepository _notificationRepository;
InitCloudmessagingUseCase({
required CloudMessagingRepository notificationRepository,
}) : _notificationRepository = notificationRepository;
final CloudMessagingRepository _notificationRepository;
@override
FutureOrResult<void> execute(NoParam? params) =>
_notificationRepository.init();

View File

@ -25,11 +25,10 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart';
class ListenNotificationUseCase
extends StreamUseCase<NoParam, RemoteNotification> {
final CloudMessagingRepository _notificationRepository;
ListenNotificationUseCase({
required CloudMessagingRepository notificationRepository,
}) : _notificationRepository = notificationRepository;
final CloudMessagingRepository _notificationRepository;
@override
FutureOrResult<Stream<RemoteNotification>> execute(NoParam? params) async {
Stream<RemoteNotification>? notificationStream;

View File

@ -18,11 +18,10 @@ import 'package:wyatt_architecture/wyatt_architecture.dart';
import 'package:wyatt_cloud_messaging_bloc_base/src/domain/repositories/cloud_messaging_repository.dart';
class RequestCloudMessagingPermissionUseCase extends AsyncUseCase<void, void> {
final CloudMessagingRepository _notificationRepository;
RequestCloudMessagingPermissionUseCase({
required CloudMessagingRepository notificationRepository,
}) : _notificationRepository = notificationRepository;
final CloudMessagingRepository _notificationRepository;
@override
FutureOrResult<void> execute(void params) =>

View File

@ -20,11 +20,10 @@ import 'package:wyatt_architecture/wyatt_architecture.dart';
import 'package:wyatt_cloud_messaging_bloc_base/src/domain/repositories/cloud_messaging_repository.dart';
class SubscribeToNotificationTopicUseCase extends AsyncUseCase<String, void> {
final CloudMessagingRepository _notificationRepository;
SubscribeToNotificationTopicUseCase({
required CloudMessagingRepository notificationRepository,
}) : _notificationRepository = notificationRepository;
final CloudMessagingRepository _notificationRepository;
@override
FutureOr<void> onStart(String? params) {

View File

@ -21,11 +21,10 @@ import 'package:wyatt_cloud_messaging_bloc_base/src/domain/repositories/cloud_me
class UnsubscribeFromNotificationTopicUseCase
extends AsyncUseCase<String, void> {
final CloudMessagingRepository _notificationRepository;
UnsubscribeFromNotificationTopicUseCase({
required CloudMessagingRepository notificationRepository,
}) : _notificationRepository = notificationRepository;
final CloudMessagingRepository _notificationRepository;
@override
FutureOr<void> onStart(String? params) {

View File

@ -30,11 +30,6 @@ part 'cloud_messaging_state.dart';
typedef OnNotification = void Function(RemoteNotification);
class CloudMessagingCubit extends Cubit<CloudmessagingState> {
final ListenNotificationUseCase _listenNotification;
final SubscribeToNotificationTopicUseCase? _subscribe;
final UnsubscribeFromNotificationTopicUseCase? _unsubscribe;
final OnNotification? handleNotification;
CloudMessagingCubit({
required ListenNotificationUseCase listenNotification,
SubscribeToNotificationTopicUseCase? subscribe,
@ -44,6 +39,11 @@ class CloudMessagingCubit extends Cubit<CloudmessagingState> {
_subscribe = subscribe,
_unsubscribe = unsubscribe,
super(const CloudmessagingState());
final ListenNotificationUseCase _listenNotification;
final SubscribeToNotificationTopicUseCase? _subscribe;
final UnsubscribeFromNotificationTopicUseCase? _unsubscribe;
final OnNotification? handleNotification;
Future<void> listenNotification() async {
final notificaitons = await _listenNotification.execute(const NoParam());

View File

@ -17,9 +17,8 @@
part of 'cloud_messaging_cubit.dart';
class CloudmessagingState extends Equatable {
final RemoteNotification? remoteNotification;
const CloudmessagingState([this.remoteNotification]);
final RemoteNotification? remoteNotification;
@override
List<Object?> get props => [remoteNotification];

View File

@ -18,39 +18,25 @@
# Flutter - Cloud Messaging Bloc Firebase
# Cloud Messaging Bloc Firebase Implementation
<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>
A
## Features
TODO: List what your package can do. Maybe include images, gifs, or videos.
## Getting started
TODO: List prerequisites and provide or point to information on how to
start using the package.
## Usage
TODO: Include short and useful examples for package users. Add longer examples
to `/example` folder.
Simply add `wyatt_cloud_messaging_bloc_firebase` in `pubspec.yaml` , then
```dart
const like = 'sample';
import 'package:wyatt_cloud_messaging_bloc_firebase/wyatt_cloud_messaging_bloc_fiebase.dart';
```
## Additional information
TODO: Tell users more about the package: where to find more information, how to
contribute to the package, how to file issues, what response they can expect
from the package authors, and more.
- This package includes the implementation of the `CloudMessagingRemoteDataSource` found in the [Wyatt Cloud Messaging Bloc Base](https://git.wyatt-studio.fr/Wyatt-FOSS/-/packages/pub/wyatt_cloud_messaging_bloc_base) package, enabling the utilization of Firebase Cloud Messaging.
- It's worth noting that this package exports [Wyatt Cloud Messaging Bloc Base](https://git.wyatt-studio.fr/Wyatt-FOSS/-/packages/pub/wyatt_cloud_messaging_bloc_base), so there's no need to import both packages.
- This implementation is kept separate from the package to enhance dependency management efficiency.
- All the instructions for using this package are provided in the [Wyatt Cloud Messaging Bloc Base](https://git.wyatt-studio.fr/Wyatt-FOSS/-/packages/pub/wyatt_cloud_messaging_bloc_base) package's readme.

View File

@ -11,7 +11,7 @@ environment:
dependencies:
build: ^2.3.1
source_gen: ^1.2.7
analyzer: ^5.4.0
analyzer: ^6.2.0
wyatt_component_copy_with_extension:
hosted: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub

View File

@ -33,8 +33,7 @@ class CrudFirestoreDataSourceImpl<Model extends ObjectModel, Entity>
required Model Function(
DocumentSnapshot<Map<String, dynamic>>,
SnapshotOptions?,
)
fromFirestore,
) fromFirestore,
/// The function that converts a [Model] to a [Map<String, Object?>].
required Map<String, Object?> Function(Model, SetOptions?) toFirestore,

View File

@ -289,7 +289,7 @@ abstract class CrudAdvancedCubit<Model extends ObjectModel>
WhereQueryType.whereIn,
'id',
ids,
)
),
]);
if (result.isOk) {
return CrudListLoaded<Model?>(result.ok ?? []);

View File

@ -353,7 +353,7 @@ abstract class CrudCubit<Model extends ObjectModel> extends CrudBaseCubit {
WhereQueryType.whereIn,
'id',
ids,
)
),
]);
if (result.isOk) {
return CrudListLoaded<Model?>(result.ok ?? []);

View File

@ -26,9 +26,8 @@ class FormDifference extends FormOperation {
@override
WyattForm call(WyattForm a, WyattForm b) {
final inputs = <
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>,
dynamic>>[];
final inputs = <FormInput<dynamic,
FormInputValidator<dynamic, ValidationError>, dynamic>>[];
for (final i in a.inputs) {
if (!b.containsKey(i.key)) {

View File

@ -26,9 +26,8 @@ class FormIntersection extends FormOperation {
@override
WyattForm call(WyattForm a, WyattForm b) {
final inputs = <
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>,
dynamic>>[];
final inputs = <FormInput<dynamic,
FormInputValidator<dynamic, ValidationError>, dynamic>>[];
for (final i in a.inputs) {
if (b.containsKey(i.key)) {

View File

@ -26,9 +26,8 @@ class FormUnion extends FormOperation {
@override
WyattForm call(WyattForm a, WyattForm b) {
final inputs = <
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>,
dynamic>>[];
final inputs = <FormInput<dynamic,
FormInputValidator<dynamic, ValidationError>, dynamic>>[];
for (final i in a.inputs) {
inputs.add(i);

View File

@ -46,7 +46,7 @@ abstract class Convert {
map.forEach(
(key, value) => pairs.add([
Uri.encodeQueryComponent(key, encoding: encoding ?? utf8),
Uri.encodeQueryComponent(value, encoding: encoding ?? utf8)
Uri.encodeQueryComponent(value, encoding: encoding ?? utf8),
]),
);
return pairs.map((pair) => '${pair[0]}=${pair[1]}').join('&');

View File

@ -10,7 +10,7 @@ environment:
dependencies:
crypto: ^3.0.2
http: ^0.13.4
http: ^1.1.0
dev_dependencies:
wyatt_analysis:

View File

@ -44,7 +44,7 @@ class App extends StatelessWidget {
),
),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
GlobalWidgetsLocalizations.delegate,
],
home: Scaffold(
appBar: AppBar(

View File

@ -93,7 +93,7 @@ class I18nFileParser extends Parser<String, String> {
String selectToString(Select token) {
final Map<Object, String> cases = {
for (var e in token.options.map(
for (final e in token.options.map(
(o) => MapEntry(
o.name,
o.value.map(parsedElementToString).join(),

View File

@ -27,7 +27,7 @@ environment:
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
http: ^0.13.4
http: ^1.1.0
wyatt_type_utils:
path: "../"

View File

@ -30,7 +30,7 @@ abstract class BottomNavigationBarComponent extends Component
this.items = const <BottomNavigationBarItem>[],
super.key,
});
final int currentIndex;
final void Function(BuildContext, int)? onTap;
final List<BottomNavigationBarItem> items;

View File

@ -27,7 +27,7 @@ class Bars extends DemoPage {
),
),
actions: [
IconButton(onPressed: () {}, icon: const Icon(Icons.menu))
IconButton(onPressed: () {}, icon: const Icon(Icons.menu)),
],
),
const Gap(20),
@ -54,13 +54,13 @@ class Bars extends DemoPage {
),
ListTile(
title: Text('Votre programme'),
)
),
],
actions: [
IconButton(
onPressed: () {},
icon: const Icon(Icons.clear),
)
),
],
),
const Gap(20),
@ -81,7 +81,7 @@ class Bars extends DemoPage {
TextWrapper('ACCUEIL'),
TextWrapper('VOTRE PROGRAMME'),
TextWrapper('LE STUDIO'),
TextWrapper('SAVOIR FAIRE')
TextWrapper('SAVOIR FAIRE'),
],
),
],

View File

@ -50,7 +50,7 @@ class Buttons extends DemoPage {
Gap(20),
SimpleIconButtons(),
Gap(20),
FileSelectionButtons()
FileSelectionButtons(),
],
),
],

View File

@ -43,12 +43,12 @@ class PortfolioCards extends StatelessWidget {
'assets/images/mockup_1.png',
alignment: Alignment.topCenter,
fit: BoxFit.cover,
)
),
],
keywords: const [
TextWrapper('UI Design'),
TextWrapper('Developpement'),
TextWrapper('Deploiement')
TextWrapper('Deploiement'),
],
),
const Gap(20),
@ -78,9 +78,9 @@ class PortfolioCards extends StatelessWidget {
'assets/images/mockup_1.png',
alignment: Alignment.topCenter,
fit: BoxFit.cover,
)
),
],
)
),
],
),
const Gap(20),
@ -118,12 +118,12 @@ class PortfolioCards extends StatelessWidget {
'assets/images/mockup_1.png',
alignment: Alignment.topCenter,
fit: BoxFit.cover,
)
),
],
keywords: const [
TextWrapper('UI Design'),
TextWrapper('Developpement'),
TextWrapper('Deploiement')
TextWrapper('Deploiement'),
],
),
const Gap(20),
@ -168,12 +168,12 @@ class PortfolioCards extends StatelessWidget {
'assets/images/mockup_1.png',
alignment: Alignment.topCenter,
fit: BoxFit.cover,
)
),
],
keywords: const [
TextWrapper('UI Design'),
TextWrapper('Developpement'),
TextWrapper('Deploiement')
TextWrapper('Deploiement'),
],
),
],

View File

@ -47,7 +47,7 @@ class SkillCards extends StatelessWidget {
gradientColors:
const MultiColor([Colors.red, Colors.orange]),
),
)
),
],
bulletColors: const MultiColor([Colors.red, Colors.orange]),
title: const TextWrapper('Lorem Ipsum'),
@ -78,7 +78,7 @@ class SkillCards extends StatelessWidget {
gradientColors:
const MultiColor([Colors.blue, Colors.green]),
),
)
),
],
bulletColors: const MultiColor([Colors.blue, Colors.green]),
title: const TextWrapper('Lorem Ipsum'),

View File

@ -15,8 +15,8 @@ dependencies:
flutter_bloc: ^8.1.2
flutter_localizations: { sdk: flutter }
gap: ^2.0.1
google_fonts: ^4.0.3
gap: ^3.0.1
google_fonts: ^5.1.0
wyatt_ui_components:
hosted: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub

View File

@ -63,7 +63,7 @@ class NavigationItem extends StatelessWidget {
.themeExtension<TopBarThemeExtension>()
?.selectedIndicatorColors,
TopBarThemeExtensionDefault.from(Theme.of(context))
.selectedIndicatorColors
.selectedIndicatorColors,
],
valueValidator: (value) => value?.isGradient,
transform: (value) =>
@ -75,7 +75,7 @@ class NavigationItem extends StatelessWidget {
.themeExtension<TopBarThemeExtension>()
?.selectedIndicatorColors,
TopBarThemeExtensionDefault.from(Theme.of(context))
.selectedIndicatorColors
.selectedIndicatorColors,
],
valueValidator: (value) => value?.isColor,
transform: (value) => value?.color,

View File

@ -177,7 +177,7 @@ class FileSelectionButtonScreen
)
: null,
boxShadow: [
if (style.shadow != null) ...[style.shadow!]
if (style.shadow != null) ...[style.shadow!],
],
borderRadius: style.radius,
),
@ -214,7 +214,7 @@ class FileSelectionButtonScreen
GradientText.fromWrapper(
title!,
gradientColors: style.foregroundColors,
)
),
],
/// Choose color

View File

@ -156,7 +156,7 @@ class FlatButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
: null,
boxShadow: [
if (style.shadow != null) ...[style.shadow!]
if (style.shadow != null) ...[style.shadow!],
],
borderRadius: style.radius,
),
@ -174,7 +174,7 @@ class FlatButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
if (prefix != null &&
(prefix is Icon?) &&
((prefix as Icon?)?.color != null)) ...[
prefix!
prefix!,
] else if (style.foregroundColors?.color != null &&
prefix != null) ...[
ColorFiltered(
@ -183,9 +183,9 @@ class FlatButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
BlendMode.srcIn,
),
child: prefix,
)
),
] else ...[
prefix ?? const SizedBox.shrink()
prefix ?? const SizedBox.shrink(),
],
Gap(style.padding?.vertical ?? 10),
@ -204,13 +204,13 @@ class FlatButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
label!,
style: style.labelStyle,
gradientColors: style.foregroundColors,
)
),
],
Gap(style.padding?.vertical ?? 10),
if (suffix != null &&
(suffix is Icon?) &&
((suffix as Icon?)?.color != null)) ...[
suffix!
suffix!,
] else if (style.foregroundColors?.colors != null &&
style.foregroundColors!.colors.isNotEmpty &&
suffix != null) ...[
@ -220,7 +220,7 @@ class FlatButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
BlendMode.srcIn,
),
child: suffix,
)
),
] else if (style.foregroundColors?.color != null &&
suffix != null) ...[
ColorFiltered(
@ -229,9 +229,9 @@ class FlatButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
BlendMode.srcIn,
),
child: suffix,
)
),
] else ...[
suffix ?? const SizedBox.shrink()
suffix ?? const SizedBox.shrink(),
],
],
),

View File

@ -152,7 +152,7 @@ class SimpleIconButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
)
: null,
boxShadow: [
if (style.shadow != null) ...[style.shadow!]
if (style.shadow != null) ...[style.shadow!],
],
borderRadius: style.radius,
),

View File

@ -181,7 +181,7 @@ class SymbolButtonScreen
)
: null,
boxShadow: [
if (style.shadow != null) ...[style.shadow!]
if (style.shadow != null) ...[style.shadow!],
],
borderRadius: style.radius,
),

View File

@ -102,7 +102,7 @@ class PricingCardTitles extends StatelessWidget {
],
),
const Gap(_bodyTopSpacing),
]
],
],
RichText(
text: TextSpan(
@ -111,7 +111,7 @@ class PricingCardTitles extends StatelessWidget {
TextSpan(
text: price.text.data,
style: price.text.style,
)
),
],
if (pricing?.hasAsterisk ?? false) ...[
WidgetSpan(
@ -128,7 +128,7 @@ class PricingCardTitles extends StatelessWidget {
TextSpan(
text: period.text.data,
style: period.text.style,
)
),
],
],
),

View File

@ -134,7 +134,7 @@ class QuoteCard extends QuoteCardComponent with $QuoteCardCWMixin {
],
],
),
)
),
],
),
],

View File

@ -147,7 +147,7 @@ class CardWrapper extends StatelessWidget {
[
radius,
Theme.of(context).extension<CardThemeExtension>()?.radius,
CardThemeExtensionDefault.from(Theme.of(context)).radius
CardThemeExtensionDefault.from(Theme.of(context)).radius,
],
);
@ -155,7 +155,7 @@ class CardWrapper extends StatelessWidget {
[
minSize,
Theme.of(context).extension<CardThemeExtension>()?.minSize,
CardThemeExtensionDefault.from(Theme.of(context)).minSize
CardThemeExtensionDefault.from(Theme.of(context)).minSize,
],
);
@ -163,7 +163,7 @@ class CardWrapper extends StatelessWidget {
[
maxSize,
Theme.of(context).extension<CardThemeExtension>()?.maxSize,
CardThemeExtensionDefault.from(Theme.of(context)).maxSize
CardThemeExtensionDefault.from(Theme.of(context)).maxSize,
],
);
@ -178,7 +178,8 @@ class CardWrapper extends StatelessWidget {
Theme.of(context)
.extension<CardThemeExtension>()
?.backgroundColors,
CardThemeExtensionDefault.from(Theme.of(context)).backgroundColors
CardThemeExtensionDefault.from(Theme.of(context))
.backgroundColors,
],
valueValidator: (multiColor) => multiColor?.isGradient,
transform: (multiColor) =>

View File

@ -12,9 +12,9 @@ dependencies:
dotted_border: ^2.0.0+3
equatable: ^2.0.5
flutter: { sdk: flutter }
flutter_animate: ^3.0.0
flutter_animate: ^4.2.0+1
flutter_bloc: ^8.1.2
gap: ^2.0.1
gap: ^3.0.1
meta: ^1.8.0
wyatt_bloc_helper:
hosted:

View File

@ -32,7 +32,7 @@ dependencies:
wyatt_ui_layout:
path: "../"
go_router: ^5.0.1
go_router: ^10.1.0
wyatt_ui_components:
hosted: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub

View File

@ -10,7 +10,7 @@ environment:
dependencies:
flutter: { sdk: flutter }
gap: ^2.0.1
gap: ^3.0.1
wyatt_ui_components:
hosted: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub