onTapSignupButton method Null safety

void onTapSignupButton(
  1. BuildContext context
)

Implementation

void onTapSignupButton(BuildContext context) async {
  if (_isSubmitting) return;

  _isSubmitting = true;

  final username = usernameController.text.trim();
  // final email = emailController.text.trim();
  final pass = passController.text.trim();
  final repass = repassController.text.trim();
  final name = nameController.text.trim();
  String phone = phoneNumberController.text.trim();
  final birth = birthController.text.trim();

  EventService().eventBus.fire(PopupEvent(type: PopupType.loading, action: PopupAction.show));

  String errTitle = "";
  String errContent = "";
  if (username.isEmpty) {
    errTitle = "아이디 누락";
    errContent = "아이디를 입력하세요.";
  }
  if (username.length < 4) {
    errTitle = "아이디 길이";
    errContent = "아이디는 최소 4자 이상이어야 합니다.";
  }
  final regExpUsername = RegExp(r'^[a-z][a-z0-9]{3,20}$');
  if (!regExpUsername.hasMatch(username)) {
    errTitle = "아이디 오류";
    errContent = "아이디는 영문(소문자), 숫자만 가능하며 숫자로 시작할 수 없습니다. \n아이디는 최소 5자 이상이어야 합니다.";
  }

  // if (email.isEmpty) {
  //   errTitle = "이메일 누락";
  //   errContent = "이메일을 입력하세요.";
  // }

  if (pass.isEmpty) {
    errTitle = "비밀번호 누락";
    errContent = "비밀번호를 입력하세요.";
  }
  if (pass.length < 8) {
    errTitle = "비밀번호 길이";
    errContent = "비밀번호는 최소 8자 이상이어야 합니다.";
  }

  if (repass.isEmpty) {
    errTitle = "비밀번호확인 누락";
    errContent = "비밀번호확인을 입력하세요.";
  }
  if (repass.length < 8) {
    errTitle = "비밀번호 길이";
    errContent = "비밀번호 확인은 최소 8자 이상이어야 합니다.";
  }

  if (pass != repass) {
    errTitle = "비밀번호 불일치";
    errContent = "비밀번호와 확인 비밀번호가 일치하지 않습니다.";
  }

  if (name.isEmpty) {
    errTitle = "이름 누락";
    errContent = "이름을 입력하세요.";
  }

  if (phone.isEmpty) {
    errTitle = "올바른 핸드폰 번호";
    errContent = "올바른 핸드폰 번호를 입력하세요. 계정 인증에 꼭 필요합니다.";
  }

  if (Validators.phoneNumberValidator(phone)) {
    phone = "+82" + phone.substring(1);
    phone = phone.replaceAll("-", "");
  } else {
    errTitle = "올바른 핸드폰 번호";
    errContent = "올바른 핸드폰 번호를 입력하세요.";
  }

  // if (birth.isEmpty) {
  //   errTitle = "생년월일 누락";
  //   errContent = "생년월일을 선택하세요.";
  // }

  if (!(isAgreeTerm && isAgreePrivateInfo)) {
    errTitle = "동의사항 체크";
    errContent = "약관, 개인정보 취급방침,  체크하셔야 서비스이용이 가능합니다.";
  }

  if (errTitle != "" || errContent != "") {
    EventService().eventBus.fire(
          PopupEvent(
            type: PopupType.alert,
            action: PopupAction.show,
            data: {"title": errTitle, "content": errContent},
            onClose: () {
              Navigator.of(context, rootNavigator: true).popUntil((route) => !route.settings.name!.startsWith(PopupScreen.routeName));
            },
          ),
        );
    _isSubmitting = false;
    return;
  }

  final accountType = isCheckedOwner ? 'owner' : 'worker';

  try {
    Map<CognitoUserAttributeKey, String> userAttributes = {
      CognitoUserAttributeKey.birthdate: birth,
      CognitoUserAttributeKey.name: name,
      CognitoUserAttributeKey.phoneNumber: phone,
      // "email": email,
      CognitoUserAttributeKey.custom("account_type"): accountType,
    };
    SignUpResult res = await Amplify.Auth.signUp(
      username: username,
      password: pass,
      options: CognitoSignUpOptions(userAttributes: userAttributes),
    );

    // 문제가 있어 오류가나면 팝업메시지 표시
    if (res.nextStep.signUpStep != "CONFIRM_SIGN_UP_STEP") {
      LogManager().addLog(res.toString(), screen: runtimeType.toString());
      EventService().eventBus.fire(
            PopupEvent(
              type: PopupType.alert,
              action: PopupAction.show,
              data: {
                "title": "회원등록실패",
                "content": "회원등록에 실패했습니다.",
              },
              onClose: () {
                Navigator.of(context, rootNavigator: true).popUntil((route) => !route.settings.name!.startsWith(PopupScreen.routeName));
              },
            ),
          );
      return;
    }

    // 입력값에 문제가 없고 사용자 생성이 되면 휴대폰 인증코드 화면으로 이동
    Navigator.of(context, rootNavigator: true).popUntil((route) => route.settings.name == SignupScreen.routeName);
    Navigator.of(context, rootNavigator: true).pushNamed(PhoneAuthScreen.routeName, arguments: PhoneAuthScreenArguments(username: username));
  } on AuthException catch (e) {
    LogManager().addLog("회원가입 오류", screen: runtimeType.toString());
    LogManager().addLog(e.message.toString(), screen: runtimeType.toString());

    // username(아이디)이 이미 존재하는 경우에만 실행
    if (e.message == "Username already exists in the system.") {
      try {
        // username은 이미 등록이 되어있는데 휴대폰 인증을 받지 않은 상태일때 인증코드 재전송
        await Amplify.Auth.resendSignUpCode(username: username);
        LogManager().addLog("휴대폰 인증을 받지않아 인증코드 재전송", screen: runtimeType.toString());

        // 인증코드 재전송이 성공적으로 보내지면 화면이동
        Navigator.of(context, rootNavigator: true).popUntil((route) => route.settings.name == SignupScreen.routeName);
        Navigator.of(context, rootNavigator: true).pushNamed(PhoneAuthScreen.routeName, arguments: PhoneAuthScreenArguments(username: username));
      } on AuthException catch (e) {
        LogManager().addLog("휴대폰 인증을 이미 받았으므로 오류메시지 표시", screen: runtimeType.toString());
        LogManager().addLog(e.toString(), screen: runtimeType.toString());
        EventService().eventBus.fire(
              PopupEvent(
                type: PopupType.alert,
                action: PopupAction.show,
                data: {"title": "오류", "content": "아이디가 이미 존재합니다."},
                onClose: () {
                  Navigator.of(context, rootNavigator: true).popUntil((route) => !route.settings.name!.startsWith(PopupScreen.routeName));
                },
              ),
            );
      }

      _isSubmitting = false;
      return;
    }

    // 아이디가 이미 존재하는 오류가 아닌 그 외 오류가 발생하면 아래 팝업이 실행됨
    EventService().eventBus.fire(
          PopupEvent(
            type: PopupType.alert,
            action: PopupAction.show,
            data: {"title": "오류", "content": e.message},
            onClose: () {
              Navigator.of(context, rootNavigator: true).popUntil((route) => !route.settings.name!.startsWith(PopupScreen.routeName));
            },
          ),
        );
  }
  _isSubmitting = false;
}