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