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 531c94b4..b8cc1358 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 @@ -14,55 +14,96 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; +import 'dart:async'; + +import 'package:wyatt_authentication_bloc/src/core/constants/form_field.dart'; +import 'package:wyatt_authentication_bloc/src/core/constants/form_name.dart'; import 'package:wyatt_authentication_bloc/src/domain/repositories/authentication_repository.dart'; import 'package:wyatt_form_bloc/wyatt_form_bloc.dart'; +import 'package:wyatt_type_utils/wyatt_type_utils.dart'; part 'sign_in_state.dart'; -class SignInCubit extends Cubit { +class SignInCubit extends FormDataCubit { final AuthenticationRepository _authenticationRepository; - - final FormValidator _validationStrategy; + FormRepository get _formRepository => + _authenticationRepository.formRepository; SignInCubit({ required AuthenticationRepository authenticationRepository, - FormValidator validationStrategy = const EveryInputValidator(), }) : _authenticationRepository = authenticationRepository, - _validationStrategy = validationStrategy, - super(const SignInState()); + super( + SignInState( + form: authenticationRepository.formRepository + .accessForm(AuthFormName.signInForm), + ), + ); + + @override + String get formName => AuthFormName.signInForm; void emailChanged(String value) { final Email email = Email.dirty(value); - emit( - state.copyWith( - email: email, - status: _validationStrategy.rawValidate([email, state.password]), - ), - ); + dataChanged(AuthFormField.email, email); } void passwordChanged(String value) { final Password password = Password.dirty(value); + dataChanged(AuthFormField.password, password); + } + + @override + FutureOr dataChanged( + String key, + FormInputValidator dirtyValue, + ) { + final form = _formRepository.accessForm(formName).clone(); + + try { + form.updateValidator(key, dirtyValue); + _formRepository.updateForm(form); + } catch (e) { + rethrow; + } + emit( - state.copyWith( - password: password, - status: _validationStrategy.rawValidate([state.email, password]), - ), + state.copyWith(form: form, status: form.validate()), ); } - Future signInWithEmailAndPassword() async { + @override + FutureOr reset() { + final form = state.form.reset(); + _formRepository.updateForm(form); + emit( + state.copyWith(form: form, status: form.validate()), + ); + } + + @override + FutureOr submit() async { if (!state.status.isValidated) { return; } emit(state.copyWith(status: FormStatus.submissionInProgress)); + final form = _formRepository.accessForm(formName); + final email = form.valueOf(AuthFormField.email); + final password = form.valueOf(AuthFormField.password); + + if (email.isNullOrEmpty || password.isNullOrEmpty) { + emit( + state.copyWith( + errorMessage: 'An error occured while retrieving data from the form.', + status: FormStatus.submissionFailure, + ), + ); + } + final uid = await _authenticationRepository.signInWithEmailAndPassword( - email: state.email.value, - password: state.password.value, + email: email!, + password: password!, ); emit( @@ -75,4 +116,30 @@ class SignInCubit extends Cubit { ), ); } + + @override + FutureOr update( + WyattForm form, { + SetOperation operation = SetOperation.replace, + }) { + final WyattForm current = _formRepository.accessForm(formName).clone(); + final WyattForm newForm = operation.operation.call(current, form); + _formRepository.updateForm(newForm); + + emit( + state.copyWith( + form: newForm, + status: newForm.validate(), + ), + ); + } + + @override + FutureOr validate() { + emit( + state.copyWith( + status: _formRepository.accessForm(formName).validate(), + ), + ); + } } diff --git a/packages/wyatt_authentication_bloc/lib/src/features/sign_in/cubit/sign_in_state.dart b/packages/wyatt_authentication_bloc/lib/src/features/sign_in/cubit/sign_in_state.dart index 0e407276..85e4edb1 100644 --- a/packages/wyatt_authentication_bloc/lib/src/features/sign_in/cubit/sign_in_state.dart +++ b/packages/wyatt_authentication_bloc/lib/src/features/sign_in/cubit/sign_in_state.dart @@ -16,28 +16,23 @@ part of 'sign_in_cubit.dart'; -class SignInState extends Equatable { - final Email email; - final Password password; - final FormStatus status; - final String? errorMessage; +class SignInState extends FormDataState { + Email get email => form.validatorOf(AuthFormField.email); + Password get password => form.validatorOf(AuthFormField.password); const SignInState({ - this.email = const Email.pure(), - this.password = const Password.pure(), - this.status = FormStatus.pure, - this.errorMessage, + required super.form, + super.status = FormStatus.pure, + super.errorMessage, }); SignInState copyWith({ - Email? email, - Password? password, + WyattForm? form, FormStatus? status, String? errorMessage, }) => SignInState( - email: email ?? this.email, - password: password ?? this.password, + form: form ?? this.form, status: status ?? this.status, errorMessage: errorMessage ?? this.errorMessage, ); @@ -46,10 +41,6 @@ class SignInState extends Equatable { List get props => [email, password, status]; @override - String toString() => ''' - email: $email, - password: $password, - status: $status, - errorMessage: $errorMessage, - '''; + String toString() => 'SignInState(status: ${status.name} ' + '${(errorMessage != null) ? " [$errorMessage]" : ""}, $form)'; } 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 5d338498..9abdf146 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 @@ -16,132 +16,94 @@ import 'dart:async'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:wyatt_authentication_bloc/src/core/constants/form_field.dart'; +import 'package:wyatt_authentication_bloc/src/core/constants/form_name.dart'; import 'package:wyatt_authentication_bloc/src/domain/repositories/authentication_repository.dart'; import 'package:wyatt_form_bloc/wyatt_form_bloc.dart'; +import 'package:wyatt_type_utils/wyatt_type_utils.dart'; part 'sign_up_state.dart'; -class SignUpCubit extends Cubit { +class SignUpCubit extends FormDataCubit { final AuthenticationRepository _authenticationRepository; - - final FormValidator _validationStrategy; + FormRepository get _formRepository => + _authenticationRepository.formRepository; SignUpCubit({ required AuthenticationRepository authenticationRepository, - required FormData formData, - FormValidator validationStrategy = const EveryInputValidator(), }) : _authenticationRepository = authenticationRepository, - _validationStrategy = validationStrategy, - super(SignUpState(data: formData)); + super( + SignUpState( + form: authenticationRepository.formRepository + .accessForm(AuthFormName.signUpForm), + ), + ); + + @override + String get formName => AuthFormName.signUpForm; void emailChanged(String value) { final Email email = Email.dirty(value); - - final List> toValidate = [ - email, - state.password, - ...state.data.validators(), - ]; - - emit( - state.copyWith( - email: email, - status: _validationStrategy.rawValidate(toValidate), - ), - ); + dataChanged(AuthFormField.email, email); } void passwordChanged(String value) { final Password password = Password.dirty(value); - - final List> toValidate = [ - state.email, - password, - ...state.data.validators(), - ]; - - emit( - state.copyWith( - password: password, - status: _validationStrategy.rawValidate(toValidate), - ), - ); + dataChanged(AuthFormField.password, password); } - // Take from wyatt_form_bloc/wyatt_form_bloc.dart - void dataChanged( - String field, - FormInputValidator dirtyValue, + @override + FutureOr dataChanged( + String key, + FormInputValidator dirtyValue, ) { - final form = state.data.clone(); + final form = _formRepository.accessForm(formName).clone(); - if (form.contains(field)) { - form.updateValidator(field, dirtyValue); - } else { - throw Exception('Form field $field not found'); + try { + form.updateValidator(key, dirtyValue); + _formRepository.updateForm(form); + } catch (e) { + rethrow; } emit( - state.copyWith( - data: form, - status: _validationStrategy.rawValidate( - [ - state.email, - state.password, - ...state.data.validators(), - ], - ), - ), + state.copyWith(form: form, status: form.validate()), ); } - // Take from wyatt_form_bloc/wyatt_form_bloc.dart - void updateFormData( - FormData data, { - SetOperation operation = SetOperation.replace, - }) { - FormData form = data; - - switch (operation) { - case SetOperation.replace: - form = data; - break; - case SetOperation.difference: - form = state.data.difference(data); - break; - case SetOperation.intersection: - form = state.data.intersection(data); - break; - case SetOperation.union: - form = state.data.union(data); - break; - } - + @override + FutureOr reset() { + final form = state.form.reset(); + _formRepository.updateForm(form); emit( - state.copyWith( - data: form, - status: _validationStrategy.rawValidate( - [ - state.email, - state.password, - ...state.data.validators(), - ], - ), - ), + state.copyWith(form: form, status: form.validate()), ); } - Future signUpFormSubmitted() async { + @override + FutureOr submit() async { if (!state.status.isValidated) { return; } + emit(state.copyWith(status: FormStatus.submissionInProgress)); + final form = _formRepository.accessForm(formName); + final email = form.valueOf(AuthFormField.email); + final password = form.valueOf(AuthFormField.password); + + if (email.isNullOrEmpty || password.isNullOrEmpty) { + emit( + state.copyWith( + errorMessage: 'An error occured while retrieving data from the form.', + status: FormStatus.submissionFailure, + ), + ); + } + final uid = await _authenticationRepository.signUp( - email: state.email.value, - password: state.password.value, + email: email!, + password: password!, ); emit( @@ -154,4 +116,30 @@ class SignUpCubit extends Cubit { ), ); } + + @override + FutureOr update( + WyattForm form, { + SetOperation operation = SetOperation.replace, + }) { + final WyattForm current = _formRepository.accessForm(formName).clone(); + final WyattForm newForm = operation.operation.call(current, form); + _formRepository.updateForm(newForm); + + emit( + state.copyWith( + form: newForm, + status: newForm.validate(), + ), + ); + } + + @override + FutureOr validate() { + emit( + state.copyWith( + status: _formRepository.accessForm(formName).validate(), + ), + ); + } } diff --git a/packages/wyatt_authentication_bloc/lib/src/features/sign_up/cubit/sign_up_state.dart b/packages/wyatt_authentication_bloc/lib/src/features/sign_up/cubit/sign_up_state.dart index fefe5325..d6ba26c3 100644 --- a/packages/wyatt_authentication_bloc/lib/src/features/sign_up/cubit/sign_up_state.dart +++ b/packages/wyatt_authentication_bloc/lib/src/features/sign_up/cubit/sign_up_state.dart @@ -16,40 +16,32 @@ part of 'sign_up_cubit.dart'; -class SignUpState extends Equatable { - final Email email; - final Password password; - final FormStatus status; - final FormData data; - final String? errorMessage; +class SignUpState extends FormDataState { + Email get email => form.validatorOf(AuthFormField.email); + Password get password => form.validatorOf(AuthFormField.password); const SignUpState({ - required this.data, - this.email = const Email.pure(), - this.password = const Password.pure(), - this.status = FormStatus.pure, - this.errorMessage, + required super.form, + super.status = FormStatus.pure, + super.errorMessage, }); SignUpState copyWith({ - Email? email, - Password? password, + WyattForm? form, FormStatus? status, - FormData? data, String? errorMessage, }) => SignUpState( - email: email ?? this.email, - password: password ?? this.password, + form: form ?? this.form, status: status ?? this.status, - data: data ?? this.data, errorMessage: errorMessage ?? this.errorMessage, ); @override - String toString() => 'SignUpState(email: $email, password: $password, ' - 'status: $status, data: $data, errorMessage: $errorMessage)'; + List get props => [email, password, status, form]; @override - List get props => [email, password, status, data, errorMessage]; + @override + String toString() => 'SignUpState(status: ${status.name} ' + '${(errorMessage != null) ? " [$errorMessage]" : ""}, $form)'; }