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;
}