Skip to content

Commit

Permalink
[Conflict] 파일복구2 복붙하기 #8
Browse files Browse the repository at this point in the history
  • Loading branch information
meltsplit committed Apr 28, 2023
1 parent 7340e32 commit 865df23
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Bool> { get }
var isSuccessLogin: Observable<Result<Bool,AuthError>> { get }
}

protocol SignInViewModel: SignInViewModelInput, SignInViewModelOutput { }

final class DefaultSignInViewModel: SignInViewModel {

private var email: String
private var password: String

//MARK: - Output

var ableToSignIn: Observable<Bool> = Observable(false)
var isSuccessLogin: Observable<Result<Bool,AuthError>> = 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)
}
}
34 changes: 34 additions & 0 deletions SOPTving/SOPTving/Utility/DesignPattern/Observable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,37 @@
//

import Foundation

final class Observable<T> {

struct Observer<T> {
weak var observer: AnyObject?
let block: (T) -> Void
}

private var observers = [Observer<T>]()

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

16 changes: 16 additions & 0 deletions SOPTving/SOPTving/Utility/Extension/String+.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}

0 comments on commit 865df23

Please sign in to comment.