8
8
import Foundation
9
9
import UserNotifications
10
10
11
+ import RxCocoa
12
+ import RxSwift
13
+
14
+ enum Time {
15
+ case hour
16
+ case minute
17
+ }
18
+
11
19
final class SetReadyInfoViewModel {
12
20
let promiseID : Int
13
21
let promiseName : String
14
22
let promiseTime : String
15
23
16
24
let isValid = ObservablePattern < Bool > ( false )
17
- let errMessage = ObservablePattern < String > ( " " )
18
25
let isSucceedToSave = ObservablePattern < Bool > ( false )
19
26
27
+ var errMessage : String = " "
28
+
29
+ let readyHourRelay = BehaviorRelay < Int > ( value: 0 )
30
+ let readyMinuteRelay = BehaviorRelay < Int > ( value: 0 )
31
+ let moveHourRelay = BehaviorRelay < Int > ( value: 0 )
32
+ let moveMinuteRelay = BehaviorRelay < Int > ( value: 0 )
20
33
21
34
var readyHour = ObservablePattern < String > ( " " )
22
35
var readyMinute = ObservablePattern < String > ( " " )
@@ -53,15 +66,6 @@ final class SetReadyInfoViewModel {
53
66
self . notificationManager = notificationManager
54
67
}
55
68
56
- private func validTime( time: Int , range: ClosedRange < Int > , defaultValue: String ) -> String {
57
- if range. contains ( time) {
58
- return String ( time)
59
- } else {
60
- errMessage. value = " 시간은 23시간 59분까지만 입력할 수 있어요! "
61
- return defaultValue
62
- }
63
- }
64
-
65
69
private func calculateTimes( ) {
66
70
let readyHours = Int ( readyHour. value) ?? storedReadyHour
67
71
let readyMinutes = Int ( readyMinute. value) ?? storedReadyMinute
@@ -72,25 +76,6 @@ final class SetReadyInfoViewModel {
72
76
moveTime = moveHours * 60 + moveMinutes
73
77
}
74
78
75
- func updateTime( textField: String , time: String ) {
76
- guard let time = Int ( time) else { return }
77
-
78
- switch textField {
79
- case " readyHour " :
80
- readyHour. value = validTime ( time: time, range: 0 ... 23 , defaultValue: " 23 " )
81
- case " readyMinute " :
82
- readyMinute. value = validTime ( time: time, range: 0 ... 59 , defaultValue: " 59 " )
83
- case " moveHour " :
84
- moveHour. value = validTime ( time: time, range: 0 ... 23 , defaultValue: " 23 " )
85
- case " moveMinute " :
86
- moveMinute. value = validTime ( time: time, range: 0 ... 59 , defaultValue: " 59 " )
87
- default :
88
- break
89
- }
90
-
91
- calculateTimes ( )
92
- }
93
-
94
79
func checkValid( readyHourText: String ,
95
80
readyMinuteText: String ,
96
81
moveHourText: String ,
@@ -209,3 +194,76 @@ final class SetReadyInfoViewModel {
209
194
}
210
195
}
211
196
}
197
+
198
+ extension SetReadyInfoViewModel : ViewModelType {
199
+ struct Input {
200
+ let readyHourText : Observable < String >
201
+ let readyMinuteText : Observable < String >
202
+ let moveHourText : Observable < String >
203
+ let moveMinuteText : Observable < String >
204
+ }
205
+
206
+ struct Output {
207
+ let readyHourText : Driver < String >
208
+ let readyMinuteText : Driver < String >
209
+ let moveHourText : Driver < String >
210
+ let moveMinuteText : Driver < String >
211
+ }
212
+
213
+ func transform( input: Input , disposeBag: RxSwift . DisposeBag ) -> Output {
214
+ input. readyHourText
215
+ . distinctUntilChanged ( )
216
+ . compactMap { Int ( $0) }
217
+ . bind ( to: readyHourRelay)
218
+ . disposed ( by: disposeBag)
219
+
220
+ input. readyMinuteText
221
+ . distinctUntilChanged ( )
222
+ . compactMap { Int ( $0) }
223
+ . bind ( to: readyMinuteRelay)
224
+ . disposed ( by: disposeBag)
225
+
226
+ input. moveHourText
227
+ . distinctUntilChanged ( )
228
+ . compactMap { Int ( $0) }
229
+ . bind ( to: moveHourRelay)
230
+ . disposed ( by: disposeBag)
231
+
232
+ input. moveMinuteText
233
+ . distinctUntilChanged ( )
234
+ . compactMap { Int ( $0) }
235
+ . bind ( to: moveMinuteRelay)
236
+ . disposed ( by: disposeBag)
237
+
238
+ let readyHourText = checkValidTime ( time: . hour, relay: readyHourRelay)
239
+ let readyMinuteText = checkValidTime ( time: . minute, relay: readyMinuteRelay)
240
+ let moveHourText = checkValidTime ( time: . hour, relay: moveHourRelay)
241
+ let moveMinuteText = checkValidTime ( time: . minute, relay: moveMinuteRelay)
242
+
243
+ let output = Output (
244
+ readyHourText: readyHourText,
245
+ readyMinuteText: readyMinuteText,
246
+ moveHourText: moveHourText,
247
+ moveMinuteText: moveMinuteText
248
+ )
249
+
250
+ return output
251
+ }
252
+ }
253
+
254
+ private extension SetReadyInfoViewModel {
255
+ func checkValidTime( time: Time , relay: BehaviorRelay < Int > ) -> Driver < String > {
256
+ let range : ClosedRange < Int > = time == . hour ? 0 ... 23 : 0 ... 59
257
+ return relay
258
+ . map { value in
259
+ if range. contains ( value) {
260
+ return value. description
261
+ } else {
262
+ self . errMessage = " 시간은 23시간 59분까지만 입력할 수 있어요! "
263
+ print ( self . errMessage)
264
+ return String ( range. upperBound)
265
+ }
266
+ }
267
+ . asDriver ( onErrorJustReturn: " 0 " )
268
+ }
269
+ }
0 commit comments