From 6802a56bfc87929daacde5504121eafa26fabcf5 Mon Sep 17 00:00:00 2001 From: Hugo Pointcheval Date: Thu, 10 Nov 2022 13:31:15 -0500 Subject: [PATCH] doc(auth): update example router --- .../lib/core/dependency_injection/get_it.dart | 2 +- .../example_router/lib/core/utils/forms.dart | 21 ---- .../lib/presentation/features/app/app.dart | 62 ++++++++---- .../presentation/features/home/home_page.dart | 2 +- .../sign_in/widgets/sign_in_form.dart | 44 ++++----- .../sign_up/widgets/sign_up_form.dart | 95 ++++++++----------- .../example_router/pubspec.yaml | 6 ++ 7 files changed, 112 insertions(+), 120 deletions(-) delete mode 100644 packages/wyatt_authentication_bloc/example_router/lib/core/utils/forms.dart diff --git a/packages/wyatt_authentication_bloc/example_router/lib/core/dependency_injection/get_it.dart b/packages/wyatt_authentication_bloc/example_router/lib/core/dependency_injection/get_it.dart index 0466f831..f75d34df 100644 --- a/packages/wyatt_authentication_bloc/example_router/lib/core/dependency_injection/get_it.dart +++ b/packages/wyatt_authentication_bloc/example_router/lib/core/dependency_injection/get_it.dart @@ -25,7 +25,7 @@ abstract class GetItInitializer { ..registerLazySingleton( () => AuthenticationFirebaseDataSourceImpl(), ) - ..registerLazySingleton>( + ..registerLazySingleton>( () => AuthenticationCacheDataSourceImpl(), ); diff --git a/packages/wyatt_authentication_bloc/example_router/lib/core/utils/forms.dart b/packages/wyatt_authentication_bloc/example_router/lib/core/utils/forms.dart deleted file mode 100644 index ead7fb45..00000000 --- a/packages/wyatt_authentication_bloc/example_router/lib/core/utils/forms.dart +++ /dev/null @@ -1,21 +0,0 @@ -// Author: Hugo Pointcheval -// Email: git@pcl.ovh -// ----- -// File: forms.dart -// Created Date: 19/08/2022 12:00:31 -// Last Modified: 19/08/2022 16:35:52 -// ----- -// Copyright (c) 2022 - -import 'package:example_router/core/constants/form_field.dart'; -import 'package:wyatt_form_bloc/wyatt_form_bloc.dart'; - -class Forms { - static FormData getNormalData() => const FormData([ - FormInput( - AppFormField.confirmedPassword, - ConfirmedPassword.pure(), - metadata: FormInputMetadata(export: false), - ), - ]); -} diff --git a/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/app/app.dart b/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/app/app.dart index 0f503aa6..9bf7f5cd 100644 --- a/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/app/app.dart +++ b/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/app/app.dart @@ -3,33 +3,58 @@ // ----- // File: app.dart // Created Date: 19/08/2022 12:05:38 -// Last Modified: Wed Nov 09 2022 +// Last Modified: Thu Nov 10 2022 // ----- // Copyright (c) 2022 import 'dart:async'; +import 'dart:math'; +import 'package:example_router/core/constants/form_field.dart'; import 'package:example_router/core/dependency_injection/get_it.dart'; import 'package:example_router/core/routes/router.dart'; -import 'package:example_router/core/utils/forms.dart'; -import 'package:example_router/presentation/features/home/home_page.dart'; -import 'package:example_router/presentation/features/welcome/welcome_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart'; +import 'package:wyatt_form_bloc/wyatt_form_bloc.dart'; import 'package:wyatt_type_utils/wyatt_type_utils.dart'; +import 'package:wyatt_architecture/wyatt_architecture.dart'; + +FutureResult onSignUpSuccess( + Account? account, + WyattForm form, +) async { + const id = -1; + final confirmedPassword = + form.valueOf(AppFormField.confirmedPassword); + + debugPrint( + 'onSignUpSuccess: $account, generatedId: $id, extraFormData: $confirmedPassword'); + return const Ok(id); +} + +FutureResult onAccountChanges(Account? account) async { + final id = Random().nextInt(1000); + debugPrint('onAccountChanges: $account, generatedId: $id'); + return Ok(id); +} class App extends StatelessWidget { final AuthenticationRepository authenticationRepository = - AuthenticationRepositoryImpl(getIt>(), - getIt(), (account) async { - debugPrint('onSignUpSuccess: $account'); - return const Ok(null); - }, (account) async { - debugPrint('onAccountChanges: $account'); - return const Ok(null); - }); + AuthenticationRepositoryImpl( + authenticationCacheDataSource: getIt>(), + authenticationRemoteDataSource: getIt(), + onSignUpSuccess: onSignUpSuccess, + onAuthChange: onAccountChanges, + extraSignUpInputs: [ + FormInput( + AppFormField.confirmedPassword, + const ConfirmedPassword.pure(), + metadata: const FormInputMetadata(export: false), + ), + ], + ); App({Key? key}) : super(key: key); @@ -65,12 +90,12 @@ class App extends StatelessWidget { if (isOnboarding) { return null; } else { - return state.namedLocation(WelcomePage.pageName); + return '/'; } } else { debugPrint('Logged'); if (isOnboarding) { - return state.namedLocation(HomePage.pageName); + return '/home'; } else { return null; } @@ -91,13 +116,12 @@ class App extends StatelessWidget { BlocProvider>.value( value: authenticationCubit, ), - BlocProvider( + BlocProvider>( create: (_) => SignUpCubit( authenticationRepository: authenticationRepository, - formData: Forms.getNormalData(), ), ), - BlocProvider( + BlocProvider>( create: (_) => SignInCubit( authenticationRepository: authenticationRepository, ), @@ -106,9 +130,7 @@ class App extends StatelessWidget { child: MaterialApp.router( title: 'Demo Authentication', debugShowCheckedModeBanner: false, - routerDelegate: router.routerDelegate, - routeInformationParser: router.routeInformationParser, - routeInformationProvider: router.routeInformationProvider, + routerConfig: router, ), ), ); diff --git a/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/home/home_page.dart b/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/home/home_page.dart index bc980cd3..e271c7e1 100644 --- a/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/home/home_page.dart +++ b/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/home/home_page.dart @@ -36,7 +36,7 @@ class HomePage extends StatelessWidget { children: [ AuthenticationBuilder( authenticated: (context, accountWrapper) => - Text('Logged as ${accountWrapper.account?.email}'), + Text('Logged as ${accountWrapper.account?.email} | GeneratedId is ${accountWrapper.data}'), unauthenticated: (context) => const Text('Not logged (unauthenticated)'), unknown: (context) => const Text('Not logged (unknown)'), diff --git a/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/sign_in/widgets/sign_in_form.dart b/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/sign_in/widgets/sign_in_form.dart index 3f729ad1..7df70853 100644 --- a/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/sign_in/widgets/sign_in_form.dart +++ b/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/sign_in/widgets/sign_in_form.dart @@ -3,30 +3,31 @@ // ----- // File: sign_in_form.dart // Created Date: 19/08/2022 15:24:37 -// Last Modified: Wed Nov 09 2022 +// Last Modified: Thu Nov 10 2022 // ----- // Copyright (c) 2022 import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart'; +import 'package:wyatt_form_bloc/wyatt_form_bloc.dart'; class _EmailInput extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( - buildWhen: (previous, current) => previous.email != current.email, - builder: (context, state) { + return InputBuilder>( + field: AuthFormField.email, + builder: ((context, cubit, state, field, inputValid) { return TextField( - onChanged: (email) => context.read().emailChanged(email), + onChanged: (email) => cubit.emailChanged(email), keyboardType: TextInputType.emailAddress, decoration: InputDecoration( labelText: 'Email', helperText: '', - errorText: state.email.invalid ? 'Invalid email' : null, + errorText: !inputValid ? 'Invalid email' : null, ), ); - }, + }), ); } } @@ -34,21 +35,19 @@ class _EmailInput extends StatelessWidget { class _PasswordInput extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( - buildWhen: (previous, current) => previous.password != current.password, - builder: (context, state) { + return InputBuilder>( + field: AuthFormField.password, + builder: ((context, cubit, state, field, inputValid) { return TextField( - onChanged: (password) { - context.read().passwordChanged(password); - }, + onChanged: (pwd) => cubit.passwordChanged(pwd), obscureText: true, decoration: InputDecoration( labelText: 'Password', helperText: '', - errorText: state.password.invalid ? 'Invalid password' : null, + errorText: !inputValid ? 'Invalid password' : null, ), ); - }, + }), ); } } @@ -56,18 +55,15 @@ class _PasswordInput extends StatelessWidget { class _SignInButton extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - return state.status.isSubmissionInProgress + return SubmitBuilder>( + builder: ((context, cubit, status) { + return status.isSubmissionInProgress ? const CircularProgressIndicator() : ElevatedButton( - onPressed: state.status.isValidated - ? () => - context.read().signInWithEmailAndPassword() - : null, + onPressed: status.isValidated ? () => cubit.submit() : null, child: const Text('Sign in'), ); - }, + }), ); } } @@ -77,7 +73,7 @@ class SignInForm extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocListener( + return BlocListener, SignInState>( listener: (context, state) { if (state.status.isSubmissionFailure) { ScaffoldMessenger.of(context) diff --git a/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/sign_up/widgets/sign_up_form.dart b/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/sign_up/widgets/sign_up_form.dart index 4a7faf42..e01038ea 100644 --- a/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/sign_up/widgets/sign_up_form.dart +++ b/packages/wyatt_authentication_bloc/example_router/lib/presentation/features/sign_up/widgets/sign_up_form.dart @@ -3,12 +3,12 @@ // ----- // File: sign_up_form.dart // Created Date: 19/08/2022 14:41:08 -// Last Modified: Fri Aug 26 2022 +// Last Modified: Thu Nov 10 2022 // ----- // Copyright (c) 2022 import 'package:example_router/core/constants/form_field.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' hide FormField; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart'; import 'package:wyatt_form_bloc/wyatt_form_bloc.dart'; @@ -16,19 +16,19 @@ import 'package:wyatt_form_bloc/wyatt_form_bloc.dart'; class _EmailInput extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( - buildWhen: (previous, current) => previous.email != current.email, - builder: (context, state) { + return InputBuilder>( + field: AuthFormField.email, + builder: ((context, cubit, state, field, inputValid) { return TextField( - onChanged: (email) => context.read().emailChanged(email), + onChanged: (email) => cubit.emailChanged(email), keyboardType: TextInputType.emailAddress, decoration: InputDecoration( labelText: 'Email', helperText: '', - errorText: state.email.invalid ? 'Invalid email' : null, + errorText: !inputValid ? 'Invalid email' : null, ), ); - }, + }), ); } } @@ -36,33 +36,27 @@ class _EmailInput extends StatelessWidget { class _PasswordInput extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( - buildWhen: (previous, current) => previous.password != current.password, - builder: (context, state) { + return InputBuilder>( + field: AuthFormField.password, + builder: ((context, cubit, state, field, inputValid) { return TextField( - onChanged: (password) { - context.read().passwordChanged(password); - context.read().dataChanged( - AppFormField.confirmedPassword, - ConfirmedPassword.dirty( - password: password, - value: context - .read() - .state - .data - .valueOf( - AppFormField.confirmedPassword), - ), - ); + onChanged: (pwd) { + cubit.passwordChanged(pwd); + cubit.dataChanged( + AppFormField.confirmedPassword, + ConfirmedPassword.dirty( + password: pwd, + value: state.form + .valueOf(AppFormField.confirmedPassword))); }, obscureText: true, decoration: InputDecoration( labelText: 'Password', helperText: '', - errorText: state.password.invalid ? 'Invalid password' : null, + errorText: !inputValid ? 'Invalid password' : null, ), ); - }, + }), ); } } @@ -70,28 +64,27 @@ class _PasswordInput extends StatelessWidget { class _ConfirmPasswordInput extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { + return InputBuilder>( + field: AppFormField.confirmedPassword, + builder: ((context, cubit, state, field, inputValid) { return TextField( - onChanged: (confirmPassword) => context - .read() - .dataChanged( - AppFormField.confirmedPassword, - ConfirmedPassword.dirty( - password: context.read().state.password.value, - value: confirmPassword, - ), - ), + onChanged: (pwd) { + cubit.dataChanged( + field, + ConfirmedPassword.dirty( + password: + state.form.valueOf(AuthFormField.password) ?? '', + value: pwd), + ); + }, obscureText: true, decoration: InputDecoration( labelText: 'Confirm password', helperText: '', - errorText: state.data.isNotValid(AppFormField.confirmedPassword) - ? 'Passwords do not match' - : null, + errorText: !inputValid ? 'Passwords do not match' : null, ), ); - }, + }), ); } } @@ -99,17 +92,15 @@ class _ConfirmPasswordInput extends StatelessWidget { class _SignUpButton extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - return state.status.isSubmissionInProgress + return SubmitBuilder>( + builder: ((context, cubit, status) { + return status.isSubmissionInProgress ? const CircularProgressIndicator() : ElevatedButton( - onPressed: state.status.isValidated - ? () => context.read().signUpFormSubmitted() - : null, + onPressed: status.isValidated ? () => cubit.submit() : null, child: const Text('Sign up'), ); - }, + }), ); } } @@ -119,11 +110,9 @@ class SignUpForm extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocListener( + return BlocListener, SignUpState>( listener: (context, state) { - if (state.status.isSubmissionSuccess) { - Navigator.of(context).pop(); - } else if (state.status.isSubmissionFailure) { + if (state.status.isSubmissionFailure) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( diff --git a/packages/wyatt_authentication_bloc/example_router/pubspec.yaml b/packages/wyatt_authentication_bloc/example_router/pubspec.yaml index 98e04304..19c6e09e 100644 --- a/packages/wyatt_authentication_bloc/example_router/pubspec.yaml +++ b/packages/wyatt_authentication_bloc/example_router/pubspec.yaml @@ -41,6 +41,12 @@ dependencies: url: https://git.wyatt-studio.fr/Wyatt-FOSS/wyatt-packages ref: wyatt_form_bloc-v0.0.6 path: packages/wyatt_form_bloc + + wyatt_type_utils: + git: + url: https://git.wyatt-studio.fr/Wyatt-FOSS/wyatt-packages + ref: wyatt_type_utils-v0.0.3+1 + path: packages/wyatt_type_utils # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons.