Compare commits
6 Commits
bc57974896
...
a4c73421d2
Author | SHA1 | Date | |
---|---|---|---|
a4c73421d2 | |||
227158725d | |||
cc41b7b589 | |||
e74346b655 | |||
54bd147e87 | |||
543b9421ca |
@ -25,7 +25,7 @@ class AlbumMockDataSourceImpl extends AlbumRemoteDataSource {
|
||||
id: 1,
|
||||
userId: 1,
|
||||
title: 'Album 1',
|
||||
)
|
||||
),
|
||||
};
|
||||
|
||||
@override
|
||||
|
@ -58,8 +58,8 @@ class PhotosGridThumbnail
|
||||
bottom: 10,
|
||||
right: 10,
|
||||
child: Icon(Icons.favorite),
|
||||
)
|
||||
]
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
|
@ -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) {
|
||||
|
@ -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:
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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/
|
||||
|
@ -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,
|
||||
)
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
@ -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,
|
||||
)
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
@ -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,
|
||||
)
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
@ -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,
|
||||
);
|
||||
|
@ -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 = <
|
||||
|
@ -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,
|
||||
);
|
||||
|
@ -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));
|
||||
|
@ -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!);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -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',
|
||||
);
|
||||
}
|
||||
|
@ -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(
|
||||
|
@ -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) =>
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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) =>
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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());
|
||||
|
@ -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];
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -289,7 +289,7 @@ abstract class CrudAdvancedCubit<Model extends ObjectModel>
|
||||
WhereQueryType.whereIn,
|
||||
'id',
|
||||
ids,
|
||||
)
|
||||
),
|
||||
]);
|
||||
if (result.isOk) {
|
||||
return CrudListLoaded<Model?>(result.ok ?? []);
|
||||
|
@ -353,7 +353,7 @@ abstract class CrudCubit<Model extends ObjectModel> extends CrudBaseCubit {
|
||||
WhereQueryType.whereIn,
|
||||
'id',
|
||||
ids,
|
||||
)
|
||||
),
|
||||
]);
|
||||
if (result.isOk) {
|
||||
return CrudListLoaded<Model?>(result.ok ?? []);
|
||||
|
@ -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)) {
|
||||
|
@ -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)) {
|
||||
|
@ -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);
|
||||
|
@ -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('&');
|
||||
|
@ -10,7 +10,7 @@ environment:
|
||||
|
||||
dependencies:
|
||||
crypto: ^3.0.2
|
||||
http: ^0.13.4
|
||||
http: ^1.1.0
|
||||
|
||||
dev_dependencies:
|
||||
wyatt_analysis:
|
||||
|
@ -44,7 +44,7 @@ class App extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
GlobalWidgetsLocalizations.delegate
|
||||
GlobalWidgetsLocalizations.delegate,
|
||||
],
|
||||
home: Scaffold(
|
||||
appBar: AppBar(
|
||||
|
@ -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(),
|
||||
|
@ -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: "../"
|
||||
|
@ -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;
|
||||
|
@ -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'),
|
||||
],
|
||||
),
|
||||
],
|
||||
|
@ -50,7 +50,7 @@ class Buttons extends DemoPage {
|
||||
Gap(20),
|
||||
SimpleIconButtons(),
|
||||
Gap(20),
|
||||
FileSelectionButtons()
|
||||
FileSelectionButtons(),
|
||||
],
|
||||
),
|
||||
],
|
||||
|
@ -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'),
|
||||
],
|
||||
),
|
||||
],
|
||||
|
@ -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'),
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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(),
|
||||
],
|
||||
],
|
||||
),
|
||||
|
@ -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,
|
||||
),
|
||||
|
@ -181,7 +181,7 @@ class SymbolButtonScreen
|
||||
)
|
||||
: null,
|
||||
boxShadow: [
|
||||
if (style.shadow != null) ...[style.shadow!]
|
||||
if (style.shadow != null) ...[style.shadow!],
|
||||
],
|
||||
borderRadius: style.radius,
|
||||
),
|
||||
|
@ -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,
|
||||
)
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
|
@ -134,7 +134,7 @@ class QuoteCard extends QuoteCardComponent with $QuoteCardCWMixin {
|
||||
],
|
||||
],
|
||||
),
|
||||
)
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
|
@ -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) =>
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user