Skip to content

Commit

Permalink
[Refactor] MVVM 패턴으로 이메일 형식, 비밀번호 형식 유효할때 로그인버튼 활성화 #10
Browse files Browse the repository at this point in the history
  • Loading branch information
meltsplit committed Apr 27, 2023
1 parent 5e188ff commit 0c06cd7
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@ final class AuthTextField : UITextField {

//MARK: - Properties

typealias handler = (() -> Void)
typealias handler = ((String) -> Void)
private var updateHandler: handler?

enum TextFieldType {
case id
case email
case password

var isSecureTextEntry: Bool {
switch self {
case .id: return false
case .email: return false
case .password: return true
}
}
Expand Down Expand Up @@ -71,7 +71,7 @@ final class AuthTextField : UITextField {

//MARK: - Life Cycle

init(viewType: TextFieldType = .id) {
init(viewType: TextFieldType = .email) {
self.textFieldType = viewType
super.init(frame: .zero)

Expand Down Expand Up @@ -164,7 +164,8 @@ extension AuthTextField: UITextFieldDelegate {

func textFieldDidChangeSelection(_ textField: UITextField) {
updateClearButtonUI()
updateHandler?()
guard let text = textField.text else { return}
updateHandler?(text)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ extension OnboardingVC {

@objc
private func startButtonDidTap() {
let signInVC = SignInVC(viewModel: DefaultSignInViewModel())
let signInVC = SignInVC(viewModel: DefaultSignInViewModel(email: "", password: ""))
present(signInVC, animated: true)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ final class SignInVC: UIViewController {
// 그냥 TextField에 프로퍼티 줄어든 버전이랄까
// 기본 프로퍼티만 추가할땐 그닥 효율성 못느낌.
// addRightButton 과 같은 함수 추가할땐 좋은 패턴인듯.
private let idTextField = AuthTextFieldBuilder(viewType: .id)
private let emailTextField = AuthTextFieldBuilder(viewType: .email)
.setText(color: .white, font: .tvingSemiBold(ofSize: 16))
.setPlaceholder(text: "아이디", color: .tvingLightGray)
.setLeftPaddingAmount(22)
Expand Down Expand Up @@ -73,7 +73,6 @@ final class SignInVC: UIViewController {
style()
hierarchy()
layout()
updateSignInButtonUI()
}

required init?(coder: NSCoder) {
Expand All @@ -86,26 +85,31 @@ final class SignInVC: UIViewController {
extension SignInVC {

private func target() {
idTextField.setUpdateHandler { [weak self] in
emailTextField.setUpdateHandler { [weak self] text in
guard let self else { return }
self.updateSignInButtonUI()
self.viewModel.idTextFieldDidChangeEvent(text)
}

passwordTextField.setUpdateHandler { [weak self] in
passwordTextField.setUpdateHandler { [weak self] text in
guard let self else { return }
self.updateSignInButtonUI()
self.viewModel.passwordTextFieldDidChangeEvent(text)
}
}

private func binding() {

viewModel.isValidEmail.observe(on: self) { bool in

}
viewModel.isValidPassword
viewModel.ableToLogin.observe(on: self) { isEnabled in
print("🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏")
self.updateSignInButtonUI(isEnabled)
}
}

// 이부분을 뷰모델이 했으면 좋겠다
private func updateSignInButtonUI() {
let isEnabled = idTextField.hasText && passwordTextField.hasText


private func updateSignInButtonUI(_ isEnabled: Bool) {

let backgroundColor: UIColor = isEnabled ? .tvingRed : .black
let borderColor: UIColor = isEnabled ? .tvingRed : .tvingLightGray

Expand Down Expand Up @@ -139,7 +143,7 @@ extension SignInVC {
private func hierarchy() {
view.addSubviews(backButton,
titleLabel,
idTextField,
emailTextField,
passwordTextField,
signInButton)
}
Expand All @@ -157,16 +161,16 @@ extension SignInVC {
$0.top.equalToSuperview().offset(50)
}

idTextField.snp.makeConstraints {
emailTextField.snp.makeConstraints {
$0.top.equalTo(titleLabel.snp.bottom).offset(31)
$0.leading.trailing.equalToSuperview().inset(20)
$0.height.equalTo(52)
}

passwordTextField.snp.makeConstraints {
$0.top.equalTo(idTextField.snp.bottom).offset(10)
$0.leading.trailing.equalTo(idTextField)
$0.height.equalTo(idTextField)
$0.top.equalTo(emailTextField.snp.bottom).offset(10)
$0.leading.trailing.equalTo(emailTextField)
$0.height.equalTo(emailTextField)
}

signInButton.snp.makeConstraints {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
//
// SignInViewModel.swift
// SOPTving
//
// Created by 장석우 on 2023/04/28.
//

import Foundation

protocol SignInViewModelInput {
func idTextFieldDidChangeEvent(_ text: String)
func passwordTextFieldDidChangeEvent(_ text: String)
}

protocol SignInViewModelOutput {
var isValidEmail: Observable<Bool> { get }
var isValidPassword: Observable<Bool> { get }
var ableToLogin: Observable<Bool> { get }
}

protocol SignInViewModel: SignInViewModelInput, SignInViewModelOutput { }

final class DefaultSignInViewModel: SignInViewModel {

private var email: String
private var password: String

//MARK: - Output

var isValidEmail: Observable<Bool> = Observable(false)
var isValidPassword: Observable<Bool> = Observable(false)
var ableToLogin: Observable<Bool> = Observable(false)

//MARK: - Init

init(email: String, password: String) {
self.email = email
self.password = password
}

}

extension DefaultSignInViewModel {

func idTextFieldDidChangeEvent(_ text: String) {
self.isValidEmail.value = text.isEmailFormat && text.isMoreThan(8)
self.ableToLogin.value = isValidEmail.value && isValidPassword.value
}

func passwordTextFieldDidChangeEvent(_ text: String) {
self.isValidPassword.value = text.isMoreThan(8)
self.ableToLogin.value = isValidEmail.value && isValidPassword.value
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ final class AuthTextFieldDirector {

func buildIDTextField() -> AuthTextField {

builder = AuthTextFieldBuilder(viewType: .id)
builder = AuthTextFieldBuilder(viewType: .email)
.setLeftPaddingAmount(20)
.setText(color: .white, font: .tvingMedium(ofSize: 16))
.setPlaceholder(text: "아이디", color: .tvingLightGray)
Expand Down
8 changes: 8 additions & 0 deletions SOPTving/SOPTving/Utility/Extension/String+.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,12 @@ extension String {
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 0c06cd7

Please sign in to comment.