From 865df2334c8ab07518b3acf561c830c2e93fa09f Mon Sep 17 00:00:00 2001 From: Melt Date: Fri, 28 Apr 2023 19:53:11 +0900 Subject: [PATCH] =?UTF-8?q?[Conflict]=20=ED=8C=8C=EC=9D=BC=EB=B3=B5?= =?UTF-8?q?=EA=B5=AC2=20=EB=B3=B5=EB=B6=99=ED=95=98=EA=B8=B0=20#8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthScene/ViewModel/SignInViewModel.swift | 84 +++++++++++++++++++ .../Utility/DesignPattern/Observable.swift | 34 ++++++++ .../SOPTving/Utility/Extension/String+.swift | 16 ++++ 3 files changed, 134 insertions(+) diff --git a/SOPTving/SOPTving/Presentation/AuthScene/ViewModel/SignInViewModel.swift b/SOPTving/SOPTving/Presentation/AuthScene/ViewModel/SignInViewModel.swift index 3396656..846bffa 100644 --- a/SOPTving/SOPTving/Presentation/AuthScene/ViewModel/SignInViewModel.swift +++ b/SOPTving/SOPTving/Presentation/AuthScene/ViewModel/SignInViewModel.swift @@ -6,3 +6,87 @@ // import Foundation + +enum AuthError: Error { + case invalidEmail + case invlidPassword + case invalidUser + + var message: String { + switch self { + + case .invalidEmail: + return "이메일형식을 잘못 입력하셨습니다." + case .invlidPassword: + return "비밀번호를 8자 이상 입력해주세요." + case .invalidUser: + return "존재하지 않는 회원입니다." + } + } +} + +protocol SignInViewModelInput { + func emailTextFieldDidChangeEvent(_ text: String) + func passwordTextFieldDidChangeEvent(_ text: String) + func signInButtonDidTapEvent() +} + +protocol SignInViewModelOutput { + var ableToSignIn: Observable { get } + var isSuccessLogin: Observable> { get } +} + +protocol SignInViewModel: SignInViewModelInput, SignInViewModelOutput { } + +final class DefaultSignInViewModel: SignInViewModel { + + private var email: String + private var password: String + + //MARK: - Output + + var ableToSignIn: Observable = Observable(false) + var isSuccessLogin: Observable> = Observable(.failure(.invalidEmail)) + + //MARK: - Init + + init(email: String, password: String) { + self.email = email + self.password = password + } + +} + +extension DefaultSignInViewModel { + + func emailTextFieldDidChangeEvent(_ text: String) { + self.email = text + self.ableToSignIn.value = email.hasText && password.hasText + } + + func passwordTextFieldDidChangeEvent(_ text: String) { + self.password = text + self.ableToSignIn.value = email.hasText && password.hasText + } + + func signInButtonDidTapEvent() { + let isValidEmail = email.isEmailFormat + let isValidPassword = password.isMoreThan(8) + let isExistedUser = true // 나중에 서버 통신 후 해당 값 isExistedUser에 대입. 임시적으로 true + + guard isValidEmail else { + isSuccessLogin.value = .failure(.invalidEmail) + return + } + guard isValidPassword else { + isSuccessLogin.value = .failure(.invlidPassword) + return + } + guard isExistedUser else { + isSuccessLogin.value = .failure(.invalidUser) + return + } + + isSuccessLogin.value = .success(true) + } +} diff --git a/SOPTving/SOPTving/Utility/DesignPattern/Observable.swift b/SOPTving/SOPTving/Utility/DesignPattern/Observable.swift index 33bee14..3df3c52 100644 --- a/SOPTving/SOPTving/Utility/DesignPattern/Observable.swift +++ b/SOPTving/SOPTving/Utility/DesignPattern/Observable.swift @@ -6,3 +6,37 @@ // import Foundation + +final class Observable { + + struct Observer { + weak var observer: AnyObject? + let block: (T) -> Void + } + + private var observers = [Observer]() + + var value: T { + didSet { notifyObservers() } + } + + init(_ value: T) { + self.value = value + } + + func observe(on observer: AnyObject, observerBlock: @escaping (T) -> Void) { + observers.append(Observer(observer: observer, block: observerBlock)) + observerBlock(self.value) + } + + func remove(observer: AnyObject) { + observers = observers.filter { $0.observer !== observer } + } + + private func notifyObservers() { + for observer in observers { + observer.block(self.value) + } + } +} + diff --git a/SOPTving/SOPTving/Utility/Extension/String+.swift b/SOPTving/SOPTving/Utility/Extension/String+.swift index d510d3b..1555c76 100644 --- a/SOPTving/SOPTving/Utility/Extension/String+.swift +++ b/SOPTving/SOPTving/Utility/Extension/String+.swift @@ -6,3 +6,19 @@ // import Foundation + +extension String { + + var isEmailFormat: Bool { + let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}" + return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: self) + } + + var hasText: Bool { + return !isEmpty + } + + func isMoreThan(_ length: Int) -> Bool { + return self.count > length + } +}