From fe4ce3cbbc63150a60726927915aad6a4249f108 Mon Sep 17 00:00:00 2001 From: Hugo Pointcheval Date: Wed, 28 Dec 2022 18:27:23 +0100 Subject: [PATCH] refactor: make signup/in, passwordreset cubit extendable --- .../authentication_repository_impl.dart | 11 ++++++ .../cubit/authentication_cubit.dart | 18 +++++----- .../cubit/email_verification_cubit.dart | 14 ++++---- .../cubit/password_reset_cubit.dart | 26 +++++++------- .../features/sign_in/cubit/sign_in_cubit.dart | 34 +++++++++---------- .../features/sign_up/cubit/sign_up_cubit.dart | 30 ++++++++-------- 6 files changed, 69 insertions(+), 64 deletions(-) diff --git a/packages/wyatt_authentication_bloc/lib/src/data/repositories/authentication_repository_impl.dart b/packages/wyatt_authentication_bloc/lib/src/data/repositories/authentication_repository_impl.dart index e2687ea8..287b4171 100644 --- a/packages/wyatt_authentication_bloc/lib/src/data/repositories/authentication_repository_impl.dart +++ b/packages/wyatt_authentication_bloc/lib/src/data/repositories/authentication_repository_impl.dart @@ -91,6 +91,17 @@ class AuthenticationRepositoryImpl ], name: AuthFormName.signUpForm, ), + ) + ..registerForm( + WyattFormImpl( + [ + FormInput( + AuthFormField.email, + customEmailValidator ?? const Email.pure(), + ), + ], + name: AuthFormName.passwordResetForm, + ), ); } final AuthenticationCacheDataSource _authenticationLocalDataSource; diff --git a/packages/wyatt_authentication_bloc/lib/src/features/authentication/cubit/authentication_cubit.dart b/packages/wyatt_authentication_bloc/lib/src/features/authentication/cubit/authentication_cubit.dart index eab1ffbb..32b00997 100644 --- a/packages/wyatt_authentication_bloc/lib/src/features/authentication/cubit/authentication_cubit.dart +++ b/packages/wyatt_authentication_bloc/lib/src/features/authentication/cubit/authentication_cubit.dart @@ -27,27 +27,26 @@ part 'authentication_state.dart'; class AuthenticationCubit extends Cubit> { AuthenticationCubit({ - required AuthenticationRepository authenticationRepository, - }) : _authenticationRepository = authenticationRepository, - super(const AuthenticationState.unknown()) { + required this.authenticationRepository, + }) : super(const AuthenticationState.unknown()) { _listenForAuthenticationChanges(); } - final AuthenticationRepository _authenticationRepository; + final AuthenticationRepository authenticationRepository; void _listenForAuthenticationChanges() { - _authenticationRepository.streamAccount().listen((accountFutureResult) { + authenticationRepository.streamAccount().listen((accountFutureResult) { accountFutureResult.fold( (value) { if (value.account.isNotNull) { emit(AuthenticationState.authenticated(value)); return; } - _authenticationRepository.destroyCache(); + authenticationRepository.destroyCache(); emit(AuthenticationState.unauthenticated()); return; }, (error) { - _authenticationRepository.destroyCache(); + authenticationRepository.destroyCache(); emit(AuthenticationState.unauthenticated()); return; }, @@ -58,7 +57,7 @@ class AuthenticationCubit extends Cubit> { /// If authenticated, re-emits state with data freshly loaded from cache. FutureOr reloadCache() async { if (state.status == AuthenticationStatus.authenticated) { - final data = await _authenticationRepository.getCache(); + final data = await authenticationRepository.getCache(); emit( data.fold( AuthenticationState.authenticated, @@ -69,7 +68,6 @@ class AuthenticationCubit extends Cubit> { } FutureOr signOut() { - // TODO(hpcl): maybe force unauthenticated by emitting an event - _authenticationRepository.signOut(); + authenticationRepository.signOut(); } } diff --git a/packages/wyatt_authentication_bloc/lib/src/features/email_verification/cubit/email_verification_cubit.dart b/packages/wyatt_authentication_bloc/lib/src/features/email_verification/cubit/email_verification_cubit.dart index 132dafd2..bb40411b 100644 --- a/packages/wyatt_authentication_bloc/lib/src/features/email_verification/cubit/email_verification_cubit.dart +++ b/packages/wyatt_authentication_bloc/lib/src/features/email_verification/cubit/email_verification_cubit.dart @@ -25,14 +25,14 @@ part 'email_verification_state.dart'; class EmailVerificationCubit extends Cubit { EmailVerificationCubit({ - required AuthenticationRepository authenticationRepository, - }) : _authenticationRepository = authenticationRepository, - super(const EmailVerificationState()); - final AuthenticationRepository _authenticationRepository; + required this.authenticationRepository, + }) : super(const EmailVerificationState()); + + final AuthenticationRepository authenticationRepository; FutureOr sendEmailVerification() async { emit(state.copyWith(status: FormStatus.submissionInProgress)); - final response = await _authenticationRepository.sendEmailVerification(); + final response = await authenticationRepository.sendEmailVerification(); emit( response.fold( (value) => state.copyWith(status: FormStatus.submissionSuccess), @@ -47,7 +47,7 @@ class EmailVerificationCubit extends Cubit { FutureOr checkEmailVerification() async { emit(state.copyWith(status: FormStatus.submissionInProgress)); - final refresh = await _authenticationRepository.refresh(); + final refresh = await authenticationRepository.refresh(); if (refresh.isErr) { final refreshError = refresh.err!; emit( @@ -59,7 +59,7 @@ class EmailVerificationCubit extends Cubit { return; } - final currentAccount = await _authenticationRepository.getAccount(); + final currentAccount = await authenticationRepository.getAccount(); emit( currentAccount.fold( (value) => state.copyWith( diff --git a/packages/wyatt_authentication_bloc/lib/src/features/password_reset/cubit/password_reset_cubit.dart b/packages/wyatt_authentication_bloc/lib/src/features/password_reset/cubit/password_reset_cubit.dart index 9ecfe309..fd942bdf 100644 --- a/packages/wyatt_authentication_bloc/lib/src/features/password_reset/cubit/password_reset_cubit.dart +++ b/packages/wyatt_authentication_bloc/lib/src/features/password_reset/cubit/password_reset_cubit.dart @@ -26,17 +26,17 @@ part 'password_reset_state.dart'; class PasswordResetCubit extends FormDataCubit { PasswordResetCubit({ - required AuthenticationRepository authenticationRepository, - }) : _authenticationRepository = authenticationRepository, + required this.authenticationRepository, + }) : super( PasswordResetState( form: authenticationRepository.formRepository .accessForm(AuthFormName.passwordResetForm), ), ); - final AuthenticationRepository _authenticationRepository; - FormRepository get _formRepository => - _authenticationRepository.formRepository; + final AuthenticationRepository authenticationRepository; + FormRepository get formRepository => + authenticationRepository.formRepository; @override String get formName => AuthFormName.passwordResetForm; @@ -51,11 +51,11 @@ class PasswordResetCubit extends FormDataCubit { String key, FormInputValidator dirtyValue, ) { - final form = _formRepository.accessForm(formName).clone(); + final form = formRepository.accessForm(formName).clone(); try { form.updateValidator(key, dirtyValue); - _formRepository.updateForm(form); + formRepository.updateForm(form); } catch (e) { rethrow; } @@ -68,7 +68,7 @@ class PasswordResetCubit extends FormDataCubit { @override FutureOr reset() { final form = state.form.reset(); - _formRepository.updateForm(form); + formRepository.updateForm(form); emit( state.copyWith(form: form, status: form.validate()), ); @@ -82,7 +82,7 @@ class PasswordResetCubit extends FormDataCubit { emit(state.copyWith(status: FormStatus.submissionInProgress)); - final form = _formRepository.accessForm(formName); + final form = formRepository.accessForm(formName); final email = form.valueOf(AuthFormField.email); if (email.isNullOrEmpty) { @@ -94,7 +94,7 @@ class PasswordResetCubit extends FormDataCubit { ); } - final response = await _authenticationRepository.sendPasswordResetEmail( + final response = await authenticationRepository.sendPasswordResetEmail( email: email!, ); @@ -114,9 +114,9 @@ class PasswordResetCubit extends FormDataCubit { WyattForm form, { SetOperation operation = SetOperation.replace, }) { - final WyattForm current = _formRepository.accessForm(formName).clone(); + final WyattForm current = formRepository.accessForm(formName).clone(); final WyattForm newForm = operation.operation.call(current, form); - _formRepository.updateForm(newForm); + formRepository.updateForm(newForm); emit( state.copyWith( @@ -130,7 +130,7 @@ class PasswordResetCubit extends FormDataCubit { FutureOr validate() { emit( state.copyWith( - status: _formRepository.accessForm(formName).validate(), + status: formRepository.accessForm(formName).validate(), ), ); } diff --git a/packages/wyatt_authentication_bloc/lib/src/features/sign_in/cubit/sign_in_cubit.dart b/packages/wyatt_authentication_bloc/lib/src/features/sign_in/cubit/sign_in_cubit.dart index 91262ce3..5c7e460c 100644 --- a/packages/wyatt_authentication_bloc/lib/src/features/sign_in/cubit/sign_in_cubit.dart +++ b/packages/wyatt_authentication_bloc/lib/src/features/sign_in/cubit/sign_in_cubit.dart @@ -24,23 +24,21 @@ part 'sign_in_state.dart'; class SignInCubit extends FormDataCubit { SignInCubit({ - required AuthenticationRepository authenticationRepository, - }) : _authenticationRepository = authenticationRepository, - super( + required this.authenticationRepository, + }) : super( SignInState( form: authenticationRepository.formRepository .accessForm(AuthFormName.signInForm), ), ); - final AuthenticationRepository _authenticationRepository; - FormRepository get _formRepository => - _authenticationRepository.formRepository; + final AuthenticationRepository authenticationRepository; + FormRepository get formRepository => authenticationRepository.formRepository; @override String get formName => AuthFormName.signInForm; void emailChanged(String value) { - final emailValidatorType = _formRepository + final emailValidatorType = formRepository .accessForm(formName) .validatorOf(AuthFormField.email) .runtimeType; @@ -54,7 +52,7 @@ class SignInCubit extends FormDataCubit { } void passwordChanged(String value) { - final passwordValidatorType = _formRepository + final passwordValidatorType = formRepository .accessForm(formName) .validatorOf(AuthFormField.password) .runtimeType; @@ -91,11 +89,11 @@ class SignInCubit extends FormDataCubit { String key, FormInputValidator dirtyValue, ) { - final form = _formRepository.accessForm(formName).clone(); + final form = formRepository.accessForm(formName).clone(); try { form.updateValidator(key, dirtyValue); - _formRepository.updateForm(form); + formRepository.updateForm(form); } catch (e) { rethrow; } @@ -108,7 +106,7 @@ class SignInCubit extends FormDataCubit { @override FutureOr reset() { final form = state.form.reset(); - _formRepository.updateForm(form); + formRepository.updateForm(form); emit( state.copyWith(form: form, status: form.validate()), ); @@ -125,9 +123,9 @@ class SignInCubit extends FormDataCubit { WyattForm form, { SetOperation operation = SetOperation.replace, }) { - final WyattForm current = _formRepository.accessForm(formName).clone(); + final WyattForm current = formRepository.accessForm(formName).clone(); final WyattForm newForm = operation.operation.call(current, form); - _formRepository.updateForm(newForm); + formRepository.updateForm(newForm); emit( state.copyWith( @@ -141,7 +139,7 @@ class SignInCubit extends FormDataCubit { FutureOr validate() { emit( state.copyWith( - status: _formRepository.accessForm(formName).validate(), + status: formRepository.accessForm(formName).validate(), ), ); } @@ -157,7 +155,7 @@ class SignInCubit extends FormDataCubit { emit(state.copyWith(status: FormStatus.submissionInProgress)); - final form = _formRepository.accessForm(formName); + final form = formRepository.accessForm(formName); final email = form.valueOf(AuthFormField.email); final password = form.valueOf(AuthFormField.password); @@ -170,7 +168,7 @@ class SignInCubit extends FormDataCubit { ); } - final uid = await _authenticationRepository.signInWithEmailAndPassword( + final uid = await authenticationRepository.signInWithEmailAndPassword( email: email!, password: password!, ); @@ -193,7 +191,7 @@ class SignInCubit extends FormDataCubit { emit(state.copyWith(status: FormStatus.submissionInProgress)); - final uid = await _authenticationRepository.signInAnonymously(); + final uid = await authenticationRepository.signInAnonymously(); emit( uid.fold( @@ -213,7 +211,7 @@ class SignInCubit extends FormDataCubit { // TODO(wyatt): maybe emit new state (to not carry an old errorMessage) emit(state.copyWith(status: FormStatus.submissionInProgress)); - final uid = await _authenticationRepository.signInWithGoogle(); + final uid = await authenticationRepository.signInWithGoogle(); emit( uid.fold( diff --git a/packages/wyatt_authentication_bloc/lib/src/features/sign_up/cubit/sign_up_cubit.dart b/packages/wyatt_authentication_bloc/lib/src/features/sign_up/cubit/sign_up_cubit.dart index 2d7ed28b..8d41b000 100644 --- a/packages/wyatt_authentication_bloc/lib/src/features/sign_up/cubit/sign_up_cubit.dart +++ b/packages/wyatt_authentication_bloc/lib/src/features/sign_up/cubit/sign_up_cubit.dart @@ -26,23 +26,21 @@ part 'sign_up_state.dart'; class SignUpCubit extends FormDataCubit { SignUpCubit({ - required AuthenticationRepository authenticationRepository, - }) : _authenticationRepository = authenticationRepository, - super( + required this.authenticationRepository, + }) : super( SignUpState( form: authenticationRepository.formRepository .accessForm(AuthFormName.signUpForm), ), ); - final AuthenticationRepository _authenticationRepository; - FormRepository get _formRepository => - _authenticationRepository.formRepository; + final AuthenticationRepository authenticationRepository; + FormRepository get formRepository => authenticationRepository.formRepository; @override String get formName => AuthFormName.signUpForm; void emailChanged(String value) { - final emailValidatorType = _formRepository + final emailValidatorType = formRepository .accessForm(formName) .validatorOf(AuthFormField.email) .runtimeType; @@ -56,7 +54,7 @@ class SignUpCubit extends FormDataCubit { } void passwordChanged(String value) { - final passwordValidatorType = _formRepository + final passwordValidatorType = formRepository .accessForm(formName) .validatorOf(AuthFormField.password) .runtimeType; @@ -93,11 +91,11 @@ class SignUpCubit extends FormDataCubit { String key, FormInputValidator dirtyValue, ) { - final form = _formRepository.accessForm(formName).clone(); + final form = formRepository.accessForm(formName).clone(); try { form.updateValidator(key, dirtyValue); - _formRepository.updateForm(form); + formRepository.updateForm(form); } catch (e) { rethrow; } @@ -110,7 +108,7 @@ class SignUpCubit extends FormDataCubit { @override FutureOr reset() { final form = state.form.reset(); - _formRepository.updateForm(form); + formRepository.updateForm(form); emit( state.copyWith(form: form, status: form.validate()), ); @@ -124,7 +122,7 @@ class SignUpCubit extends FormDataCubit { emit(state.copyWith(status: FormStatus.submissionInProgress)); - final form = _formRepository.accessForm(formName); + final form = formRepository.accessForm(formName); final email = form.valueOf(AuthFormField.email); final password = form.valueOf(AuthFormField.password); @@ -137,7 +135,7 @@ class SignUpCubit extends FormDataCubit { ); } - final uid = await _authenticationRepository.signUp( + final uid = await authenticationRepository.signUp( email: email!, password: password!, ); @@ -158,9 +156,9 @@ class SignUpCubit extends FormDataCubit { WyattForm form, { SetOperation operation = SetOperation.replace, }) { - final WyattForm current = _formRepository.accessForm(formName).clone(); + final WyattForm current = formRepository.accessForm(formName).clone(); final WyattForm newForm = operation.operation.call(current, form); - _formRepository.updateForm(newForm); + formRepository.updateForm(newForm); emit( state.copyWith( @@ -174,7 +172,7 @@ class SignUpCubit extends FormDataCubit { FutureOr validate() { emit( state.copyWith( - status: _formRepository.accessForm(formName).validate(), + status: formRepository.accessForm(formName).validate(), ), ); }