Skip to content

Commit

Permalink
Merge pull request #347 from School-of-Company/346-fix-regular-expres…
Browse files Browse the repository at this point in the history
…sion

[#346] 이메일 비밀번호 유효성 검사 추가
  • Loading branch information
uuuunseo authored Jun 16, 2024
2 parents 09253b1 + 46bf69a commit d82dd7b
Show file tree
Hide file tree
Showing 17 changed files with 967 additions and 299 deletions.
950 changes: 736 additions & 214 deletions App/Sources/Application/NeedleGenerated.swift

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -30,26 +30,23 @@ struct ChangePasswordView: View {
VStack(spacing: 0) {
BitgouelTextField(
"현재 비밀번호 입력",
text: Binding(
get: { viewModel.currentPassword },
set: { newValue in viewModel.currentPassword = newValue }
)
text: $viewModel.currentPassword,
helpMessage: viewModel.currentPasswordHelpMessage,
isError: viewModel.isCurrentPasswordErrorOccurred
)

BitgouelTextField(
"새 비밀번호 입력",
text: Binding(
get: { viewModel.newPassword },
set: { newValue in viewModel.newPassword = newValue }
)
text: $viewModel.newPassword,
helpMessage: viewModel.newPasswordHelpMessage,
isError: viewModel.isNewPasswordErrorOccurred
)

BitgouelTextField(
"새 비밀번호 확인",
text: Binding(
get: { viewModel.checkNewPassword },
set: { newValue in viewModel.checkNewPassword = newValue }
)
text: $viewModel.checkNewPassword,
helpMessage: viewModel.newPasswordHelpMessage,
isError: viewModel.isNewPasswordErrorOccurred
)

Spacer()
Expand Down Expand Up @@ -79,5 +76,14 @@ struct ChangePasswordView: View {
.onTapGesture {
hideKeyboard()
}
.onChange(of: viewModel.currentPassword) { _ in
viewModel.updateIsCurrentPasswordErrorOccurred(isErrorOccurred: false)
}
.onChange(of: viewModel.newPassword) { _ in
viewModel.updateIsNewPasswordErrorOccurred(isErrorOccurred: false)
}
.onChange(of: viewModel.checkNewPassword) { _ in
viewModel.updateIsNewPasswordErrorOccurred(isErrorOccurred: false)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,60 @@ final class ChangePasswordViewModel: BaseViewModel {
@Published var newPassword: String = ""
@Published var checkNewPassword: String = ""
@Published var isPresentedSuccessView: Bool = false
@Published var isCurrentPasswordErrorOccurred: Bool = false
@Published var isNewPasswordErrorOccurred: Bool = false

private let changePasswordUseCase: any ChangePasswordUseCase

init(changePasswordUseCase: any ChangePasswordUseCase) {
self.changePasswordUseCase = changePasswordUseCase
}

var currentPasswordHelpMessage: String {
if isCurrentPasswordErrorOccurred {
return "잘못된 비밀번호입니다."
} else {
return ""
}
}

var newPasswordHelpMessage: String {
if isNewPasswordErrorOccurred {
return "8~24자 이내의 영문 / 숫자, 특수문자 1개 이상"
} else {
return ""
}
}

func updateIsPresentedSuccessView(isPresented: Bool) {
isPresentedSuccessView = isPresented
}

func checkPassword(_ password: String) -> Bool {
let passwordRegex = "^(?=.*[a-zA-Z0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$%^&*]{8,24}$"
return NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: password)
}

func updateIsCurrentPasswordErrorOccurred(isErrorOccurred: Bool) {
isCurrentPasswordErrorOccurred = isErrorOccurred
}

func updateIsNewPasswordErrorOccurred(isErrorOccurred: Bool) {
isNewPasswordErrorOccurred = isErrorOccurred
}

@MainActor
func changePasswordButtonDidTap() {
guard newPassword == checkNewPassword else {
errorMessage = "비밀번호를 다시 입력해 주세요!"
errorMessage = "비밀번호가 일치하지 않습니다."
return isErrorOccurred = true
}
guard checkPassword(currentPassword) else {
return updateIsCurrentPasswordErrorOccurred(isErrorOccurred: true)
}
guard checkPassword(newPassword) && checkPassword(checkNewPassword) else {
return updateIsNewPasswordErrorOccurred(isErrorOccurred: true)
}

Task {
do {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ struct FindPasswordView: View {

BitgouelTextField(
"이메일",
text: $viewModel.email
text: $viewModel.email,
helpMessage: viewModel.emailHelpMessage,
isError: viewModel.isEmailErrorOccurred
)
.padding(.top, 32)

Expand All @@ -59,7 +61,7 @@ struct FindPasswordView: View {
to: SendEmailView(
email: viewModel.email,
nextToButtonAction: {
viewModel.nextToButtonAction()
viewModel.checkEmailVertificationStatus()
}
),
when: Binding(
Expand All @@ -82,6 +84,9 @@ struct FindPasswordView: View {
text: viewModel.errorMessage,
isShowing: $viewModel.isErrorOccurred
)
.onChange(of: viewModel.email) { _ in
viewModel.updateIsEmailErrorOccurred(isErrorOccurred: false)
}
}
.onTapGesture {
hideKeyboard()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@ final class FindPasswordViewModel: BaseViewModel {
@Published var email: String = ""
@Published var isPresentedSendEmailPage: Bool = false
@Published var isPresentedNewPasswordPage: Bool = false
var isEmailEmpty: Bool {
email.isEmpty
}
@Published var isEmailErrorOccurred: Bool = false

private let sendEmailCertificationLinkUseCase: any SendEmailCertificationLinkUseCase
private let fetchEmailVertificationStatusUseCase: any FetchEmailVertificationStatusUseCase
Expand All @@ -20,6 +18,20 @@ final class FindPasswordViewModel: BaseViewModel {
self.fetchEmailVertificationStatusUseCase = fetchEmailVertificationStatusUseCase
}

var isEmailEmpty: Bool {
email.isEmpty
}

var emailHelpMessage: String {
if isEmailErrorOccurred {
guard checkEmail(email) else { return "잘못된 이메일입니다." }

return "이메일로 가입된 유저를 찾을 수 없습니다."
} else {
return ""
}
}

func updateIsPresentedSendEmailPage(isPresented: Bool) {
isPresentedSendEmailPage = isPresented
}
Expand All @@ -28,21 +40,34 @@ final class FindPasswordViewModel: BaseViewModel {
isPresentedNewPasswordPage = isPresented
}

func updateIsEmailErrorOccurred(isErrorOccurred: Bool) {
isEmailErrorOccurred = isErrorOccurred
}

func checkEmail(_ email: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
}

@MainActor
func nextToButtonDidTap(_ success: @escaping () -> Void) {
guard checkEmail(email) else {
return updateIsEmailErrorOccurred(isErrorOccurred: true)
}

Task {
do {
try await sendEmailCertificationLinkUseCase(req: EmailRequestDTO(email: email))

success()
} catch {
errorMessage = error.userDomainErrorMessage()
isErrorOccurred = true
updateIsEmailErrorOccurred(isErrorOccurred: true)
}
}
}

@MainActor
func nextToButtonAction() {
func checkEmailVertificationStatus() {
Task {
do {
let isAuthentication = try await fetchEmailVertificationStatusUseCase(email: email)
Expand Down
6 changes: 6 additions & 0 deletions App/Sources/Feature/LoginFeature/Sources/LoginView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,12 @@ struct LoginView: View {
text: viewModel.errorMessage,
isShowing: $viewModel.isErrorOccurred
)
.onChange(of: viewModel.email) { _ in
viewModel.updateIsEmailErrorOccured(isErrorOccured: false)
}
.onChange(of: viewModel.password) { _ in
viewModel.updateIsPasswordErrorOccured(isErrorOccured: false)
}
}
.onTapGesture {
hideKeyboard()
Expand Down
46 changes: 15 additions & 31 deletions App/Sources/Feature/LoginFeature/Sources/LoginViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ final class LoginViewModel: BaseViewModel {
@Published var password = ""
@Published var isPresentedSignupPage: Bool = false
@Published var isPresentedFindPasswordPage: Bool = false
@Published var isSuccessSignin = false
@Published var isSuccessSignin: Bool = false
@Published var isEmailErrorOccured: Bool = false
@Published var isPasswordErrorOcuured: Bool = false
private let loginUseCase: any LoginUseCase
private let saveUserAuthority: any SaveUserAuthorityUseCase

Expand All @@ -22,30 +24,6 @@ final class LoginViewModel: BaseViewModel {
email.isEmpty || password.isEmpty
}

var isEmailErrorOccured: Bool {
if email.isEmpty {
return false
}

if checkEmail(email) {
return false
} else {
return true
}
}

var isPasswordErrorOcuured: Bool {
if password.isEmpty {
return false
}

if checkPassword(password) {
return false
} else {
return true
}
}

var emailHelpMessage: String {
if isEmailErrorOccured {
return "잘못된 이메일입니다."
Expand Down Expand Up @@ -75,19 +53,25 @@ final class LoginViewModel: BaseViewModel {
}

func updateIsPresentedSignupPage(isPresented: Bool) {
self.isPresentedSignupPage = isPresented
isPresentedSignupPage = isPresented
}

func updateIsPresentedFindPasswordPage(isPresented: Bool) {
self.isPresentedFindPasswordPage = isPresented
isPresentedFindPasswordPage = isPresented
}

func updateIsEmailErrorOccured(isErrorOccured: Bool) {
isEmailErrorOccured = isErrorOccured
}

func updateIsPasswordErrorOccured(isErrorOccured: Bool) {
isPasswordErrorOcuured = isErrorOccured
}

@MainActor
func login() {
guard checkEmail(email) && checkPassword(password) else {
errorMessage = "이메일, 비밀번호를 제대로 작성했는지 확인해주세요."
return isErrorOccurred = true
}
guard checkEmail(email) else { return updateIsEmailErrorOccured(isErrorOccured: true) }
guard checkPassword(password) else { return updateIsPasswordErrorOccured(isErrorOccured: true) }

Task {
do {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,21 +79,25 @@ final class MyPageViewModel: BaseViewModel {
}
}

func logout(_ success: () -> Void) {
@MainActor
func logout(_ success: @escaping () -> Void) {
Task {
do {
try await logoutUseCase()
success()
} catch {
errorMessage = error.authDomainErrorMessage()
isErrorOccurred = true
}
}
}

func withdraw(_ success: () -> Void) {
@MainActor
func withdraw(_ success: @escaping () -> Void) {
Task {
do {
try await withdrawalUseCase()
success()
} catch {
errorMessage = error.authDomainErrorMessage()
isErrorOccurred = true
Expand Down
Loading

0 comments on commit d82dd7b

Please sign in to comment.