onInit method

  1. @override
void onInit()
override

Called immediately after the widget is allocated in memory. You might use this to initialize something for the controller.

Implementation

@override
void onInit() {
  login = TextFieldState(
    text: _myUser?.num.toString(),
    onChanged: (_) {
      password.error.value = null;
      password.unsubmit();
      repeatPassword.unsubmit();
    },
    onSubmitted: (s) {
      password.focus.requestFocus();
      s.unsubmit();
    },
  );

  password = TextFieldState(
    onFocus: (s) => s.unsubmit(),
    onChanged: (_) {
      password.error.value = null;
      password.unsubmit();
      repeatPassword.error.value = null;
      repeatPassword.unsubmit();
    },
    onSubmitted: (s) => signIn(),
  );

  recovery = TextFieldState(onSubmitted: (s) => recoverAccess());

  recoveryCode = TextFieldState(onSubmitted: (s) => validateCode());

  newPassword = TextFieldState(
    onChanged: (_) {
      repeatPassword.error.value = null;
      repeatPassword.unsubmit();
    },
    onSubmitted: (s) {
      repeatPassword.focus.requestFocus();
      s.unsubmit();
    },
  );

  repeatPassword = TextFieldState(
    onFocus: (s) {
      switch (stage.value) {
        case LoginViewStage.signUpWithPassword:
          if (s.text != password.text && password.isValidated) {
            s.error.value = 'err_passwords_mismatch'.l10n;
          }
          break;

        default:
          if (s.text != newPassword.text && newPassword.isValidated) {
            s.error.value = 'err_passwords_mismatch'.l10n;
          }
          break;
      }
    },
    onSubmitted: (s) async {
      switch (stage.value) {
        case LoginViewStage.signUpWithPassword:
          final userLogin = UserLogin.tryParse(login.text);
          final userPassword = UserPassword.tryParse(password.text);

          if (userLogin == null) {
            login.error.value = 'err_incorrect_login_input'.l10n;
            return;
          }

          if (userPassword == null) {
            password.error.value = 'err_password_incorrect'.l10n;
            return;
          }

          try {
            await register(login: userLogin, password: userPassword);
          } on SignUpException catch (e) {
            login.error.value = e.toMessage();
          } catch (e) {
            password.error.value = 'err_data_transfer'.l10n;
            rethrow;
          }
          break;

        default:
          await resetUserPassword();
          break;
      }
    },
  );

  email = TextFieldState(
    onFocus: (s) {
      if (s.text.trim().isNotEmpty) {
        try {
          UserEmail(s.text.toLowerCase());
        } on FormatException {
          s.error.value = 'err_incorrect_email'.l10n;
        }
      }
    },
    onSubmitted: (s) async {
      final UserEmail? email = UserEmail.tryParse(s.text.toLowerCase());

      if (email == null) {
        s.error.value = 'err_incorrect_email'.l10n;
      } else {
        emailCode.clear();

        final LoginViewStage previous = stage.value;

        stage.value = switch (stage.value) {
          LoginViewStage.signInWithEmail =>
            LoginViewStage.signInWithEmailCode,
          (_) => LoginViewStage.signUpWithEmailCode,
        };

        try {
          await _authService.createConfirmationCode(email: email);
          s.unsubmit();
        } on AddUserEmailException catch (e) {
          s.error.value = e.toMessage();
          _setResendEmailTimer(false);

          stage.value = previous;
        } catch (_) {
          s.resubmitOnError.value = true;
          s.error.value = 'err_data_transfer'.l10n;
          _setResendEmailTimer(false);
          s.unsubmit();

          stage.value = previous;
          rethrow;
        }
      }
    },
  );

  emailCode = TextFieldState(
    onSubmitted: (s) async {
      s.status.value = RxStatus.loading();

      try {
        UserLogin? userLogin;
        UserNum? userNum;
        UserEmail? userEmail;
        UserPhone? userPhone;

        switch (stage.value) {
          case LoginViewStage.signUpWithEmailCode:
            userEmail = UserEmail.tryParse(email.text);
            break;

          default:
            userLogin = UserLogin.tryParse(identifier.text);
            userNum = UserNum.tryParse(identifier.text);
            userEmail = UserEmail.tryParse(identifier.text);
            userPhone = UserPhone.tryParse(identifier.text);
            break;
        }

        await _authService.signIn(
          email: userEmail,
          login: userLogin,
          num: userNum,
          phone: userPhone,
          code: ConfirmationCode(emailCode.text),
        );

        (onSuccess ?? router.home)(signedUp: true);
      } on CreateSessionException catch (e) {
        switch (e.code) {
          case CreateSessionErrorCode.wrongCode:
            s.error.value = e.toMessage();

            ++codeAttempts;
            if (codeAttempts >= 3) {
              codeAttempts = 0;
              _setCodeTimer();
            }
            s.status.value = RxStatus.empty();
            break;

          default:
            s.error.value = 'err_wrong_code'.l10n;
            break;
        }
      } on FormatException catch (_) {
        s.error.value = 'err_wrong_code'.l10n;
        s.status.value = RxStatus.empty();
        ++codeAttempts;
        if (codeAttempts >= 3) {
          codeAttempts = 0;
          _setCodeTimer();
        }
      } catch (_) {
        s.resubmitOnError.value = true;
        s.error.value = 'err_data_transfer'.l10n;
        s.status.value = RxStatus.empty();
        s.unsubmit();
        rethrow;
      }
    },
  );

  identifier = TextFieldState(
    onSubmitted: (s) async {
      final UserLogin? userLogin = UserLogin.tryParse(s.text);
      final UserNum? userNum = UserNum.tryParse(s.text);
      final UserEmail? userEmail = UserEmail.tryParse(s.text);
      final UserPhone? userPhone = UserPhone.tryParse(s.text);

      emailCode.clear();

      final LoginViewStage previous = stage.value;

      stage.value = switch (stage.value) {
        LoginViewStage.signInWithEmail => LoginViewStage.signInWithEmailCode,
        (_) => LoginViewStage.signUpWithEmailCode,
      };

      _setResendEmailTimer();

      try {
        if (userLogin != null ||
            userNum != null ||
            userEmail != null ||
            userPhone != null) {
          await _authService.createConfirmationCode(
            email: userEmail,
            login: userLogin,
            num: userNum,
            phone: userPhone,
          );
        }

        s.unsubmit();
      } on AddUserEmailException catch (e) {
        s.error.value = e.toMessage();
        _setResendEmailTimer(false);

        stage.value = previous;
      } catch (_) {
        s.resubmitOnError.value = true;
        s.error.value = 'err_data_transfer'.l10n;
        _setResendEmailTimer(false);
        s.unsubmit();

        stage.value = previous;
        rethrow;
      }
    },
  );

  super.onInit();
}