-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHomeViewModel.swift
More file actions
91 lines (67 loc) · 2.39 KB
/
HomeViewModel.swift
File metadata and controls
91 lines (67 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//
// HomeViewModel.swift
// Smashing-Assignment
//
// Created by JIN on 12/30/25.
//
import UIKit
import Combine
protocol InputOutputProtocol {
associatedtype Input
associatedtype Output
func transform(input: AnyPublisher<Input, Never>) -> AnyPublisher<Output, Never>
}
final class HomeViewModel: InputOutputProtocol {
enum Input {
case textFieldChanged(String)
case textField2Changed(String)
case submitButtonTapped
}
enum Output {
case updateButtonState(isEnabled: Bool)
case updateMessage(String)
case clearTextFields
}
// MARK: - Properties
private let output: PassthroughSubject<Output, Never> = .init()
private var cancellables = Set<AnyCancellable>()
private let text1Subject = CurrentValueSubject<String, Never>("")
private let text2Subject = CurrentValueSubject<String, Never>("")
// MARK: - Transform
func transform(input: AnyPublisher<Input, Never>) -> AnyPublisher<Output, Never> {
input.sink { [weak self] event in
guard let self = self else { return }
switch event {
case .textFieldChanged(let text):
self.text1Subject.send(text)
case .textField2Changed(let text):
self.text2Subject.send(text)
case .submitButtonTapped:
self.handleSubmitButtonTapped()
}
}.store(in: &cancellables)
Publishers.CombineLatest(text1Subject, text2Subject)
.map { text1, text2 in
return text1.count >= 5 && text2.count >= 5
}
.removeDuplicates()
.sink { [weak self] isValid in
guard let self = self else { return }
self.output.send(.updateButtonState(isEnabled: isValid))
if isValid {
self.output.send(.updateMessage("입력 완료"))
} else {
self.output.send(.updateMessage("두 필드 모두 5글자 이상 입력해주세요"))
}
}
.store(in: &cancellables)
return output.eraseToAnyPublisher()
}
// MARK: - Private Methods
private func handleSubmitButtonTapped() {
text1Subject.send("")
text2Subject.send("")
output.send(.clearTextFields)
output.send(.updateMessage("5글자 이상 입력해주세요"))
}
}