@@ -17,6 +17,24 @@ enum FallingCellButtonAction {
17
17
case like( IndexPath )
18
18
}
19
19
20
+ enum TimerActiveAction {
21
+ case viewWillDisAppear( Bool )
22
+ case profileDoubleTap( Bool )
23
+ case reportButtonTap( Bool )
24
+ case DimViewTap( Bool )
25
+
26
+ var state : Bool {
27
+ switch self {
28
+ case . viewWillDisAppear( let flag) , . profileDoubleTap( let flag) , . reportButtonTap( let flag) , . DimViewTap( let flag) :
29
+ return flag
30
+ }
31
+ }
32
+ }
33
+
34
+ enum AnimationAction {
35
+ case scroll, delete
36
+ }
37
+
20
38
final class FallingHomeViewController : TFBaseViewController {
21
39
private let viewModel : FallingHomeViewModel
22
40
private var dataSource : DataSource !
@@ -49,28 +67,46 @@ final class FallingHomeViewController: TFBaseViewController {
49
67
}
50
68
51
69
override func bindViewModel( ) {
52
- let timeOverSubject = PublishSubject < Void > ( )
70
+ let timeOverSubject = PublishSubject < AnimationAction > ( )
53
71
54
72
let initialTrigger = Driver< Void> . just( ( ) )
55
73
let timerOverTrigger = timeOverSubject. asDriverOnErrorJustEmpty ( )
56
74
let fallingCellButtonAction = PublishSubject < FallingCellButtonAction > ( )
57
75
58
- let viewWillDisAppearTrigger = self . rx. viewWillDisAppear. map { _ in false } . asDriverOnErrorJustEmpty ( )
59
- let timerActiveRelay = BehaviorRelay ( value : true )
60
- let profileDoubleTapTriggerObserver = PublishSubject < Void > ( )
76
+ let viewWillDisAppearTrigger = self . rx. viewWillDisAppear. map { _ in
77
+ return TimerActiveAction . viewWillDisAppear ( false )
78
+ } . asDriverOnErrorJustEmpty ( )
61
79
80
+ let timerActiveRelay = BehaviorRelay < TimerActiveAction > ( value: . profileDoubleTap( true ) )
81
+
82
+ let profileDoubleTapTriggerObserver = PublishSubject < Void > ( )
62
83
let profileDoubleTapTrigger = profileDoubleTapTriggerObserver
63
- . withLatestFrom ( timerActiveRelay) { !$1 }
84
+ . withLatestFrom ( timerActiveRelay) {
85
+ return TimerActiveAction . profileDoubleTap ( !$1. state)
86
+ }
87
+ . asDriverOnErrorJustEmpty ( )
88
+
89
+ let reportButtonTapTriggerObserver = PublishSubject < Void > ( )
90
+
91
+ let reportButtonTapTrigger = reportButtonTapTriggerObserver
92
+ . withLatestFrom ( timerActiveRelay) { _, _ in
93
+ return TimerActiveAction . reportButtonTap ( false )
94
+ }
64
95
. asDriverOnErrorJustEmpty ( )
65
96
66
- Driver . merge ( profileDoubleTapTrigger, viewWillDisAppearTrigger)
97
+ Driver . merge ( reportButtonTapTrigger , profileDoubleTapTrigger, viewWillDisAppearTrigger)
67
98
. drive ( timerActiveRelay)
68
99
. disposed ( by: disposeBag)
69
100
101
+ let complaintsButtonTapTrigger = PublishRelay < Void > ( )
102
+ let blockButtonTapTrigger = PublishRelay < Void > ( )
103
+
70
104
let input = FallingHomeViewModel . Input (
71
105
initialTrigger: initialTrigger,
72
106
timeOverTrigger: timerOverTrigger,
73
- cellButtonAction: fallingCellButtonAction. asDriverOnErrorJustEmpty ( )
107
+ cellButtonAction: fallingCellButtonAction. asDriverOnErrorJustEmpty ( ) ,
108
+ complaintsButtonTapTrigger: complaintsButtonTapTrigger. asDriverOnErrorJustEmpty ( ) ,
109
+ blockButtonTapTrigger: blockButtonTapTrigger. asDriverOnErrorJustEmpty ( )
74
110
)
75
111
76
112
let output = viewModel. transform ( input: input)
@@ -88,7 +124,8 @@ final class FallingHomeViewController: TFBaseViewController {
88
124
timerActiveTrigger: timerActiveTrigger,
89
125
timeOverSubject: timeOverSubject,
90
126
profileDoubleTapTriggerObserver: profileDoubleTapTriggerObserver,
91
- fallingCellButtonAction: fallingCellButtonAction
127
+ fallingCellButtonAction: fallingCellButtonAction,
128
+ reportButtonTapTriggerObserver: reportButtonTapTriggerObserver
92
129
)
93
130
}
94
131
@@ -124,7 +161,8 @@ final class FallingHomeViewController: TFBaseViewController {
124
161
at: indexPath,
125
162
at: . top,
126
163
animated: true
127
- ) } )
164
+ )
165
+ } )
128
166
. disposed ( by: self . disposeBag)
129
167
130
168
output. infoButtonAction
@@ -142,10 +180,53 @@ final class FallingHomeViewController: TFBaseViewController {
142
180
cell. rejectLottieView. isHidden = false
143
181
cell. rejectLottieView. play ( )
144
182
183
+ DispatchQueue . main. asyncAfter ( deadline: . now( ) + 1.0 ) {
184
+ timeOverSubject. onNext ( . scroll)
185
+ }
186
+ }
187
+ . disposed ( by: disposeBag)
188
+
189
+ reportButtonTapTriggerObserver. asDriverOnErrorJustEmpty ( )
190
+ . do { _ in
191
+ self . showAlert (
192
+ leftActionTitle: " 신고하기 " ,
193
+ rightActionTitle: " 차단하기 " ,
194
+ leftActionCompletion: {
195
+ self . showAlert ( action: . complaints)
196
+ } ,
197
+ rightActionCompletion: {
198
+ self . showAlert (
199
+ action: . block,
200
+ leftActionCompletion: {
201
+ blockButtonTapTrigger. accept ( ( ) )
202
+ } ,
203
+ rightActionCompletion: {
204
+ timerActiveRelay. accept ( . DimViewTap( true ) )
205
+ }
206
+ )
207
+ } ,
208
+ dimActionCompletion: {
209
+ timerActiveRelay. accept ( . DimViewTap( true ) )
210
+ }
211
+ )
212
+ }
213
+ . drive ( )
214
+ . disposed ( by: disposeBag)
215
+
216
+ Driver . merge ( output. complaintsAction, output. blockAction)
217
+ . do { indexPath in
218
+ // timerActiveRelay.accept(.DimViewTap(true))
219
+ self . deleteItems ( indexPath)
145
220
DispatchQueue . main. asyncAfter ( deadline: . now( ) + 0.5 ) {
146
- timeOverSubject. onNext ( ( ) )
221
+ timeOverSubject. onNext ( . delete)
222
+ timerActiveRelay. accept ( . DimViewTap( true ) )
147
223
}
224
+
225
+ // timerActiveRelay.accept(.DimViewTap(true))
226
+
227
+
148
228
}
229
+ . drive ( )
149
230
. disposed ( by: disposeBag)
150
231
}
151
232
}
@@ -158,6 +239,21 @@ extension FallingHomeViewController {
158
239
typealias SectionType = FallingProfileSection
159
240
typealias DataSource = UICollectionViewDiffableDataSource < SectionType , ModelType >
160
241
typealias Snapshot = NSDiffableDataSourceSnapshot < SectionType , ModelType >
242
+
243
+ private func deleteItems( _ indexPath: IndexPath ) {
244
+ guard
245
+ let item = self . dataSource. itemIdentifier ( for: indexPath) ,
246
+ let cell = self . homeView. collectionView. cellForItem ( at: indexPath) as? FallingUserCollectionViewCell else { return }
247
+ var snapshot = self . dataSource. snapshot ( )
248
+ snapshot. deleteItems ( [ item] )
249
+ UIView . animate ( withDuration: 0.5 , delay: 0 , options: . curveEaseOut) {
250
+ cell. transform = cell. transform. rotated ( by: - . pi / 6 ) . concatenating ( cell. transform. translatedBy ( x: cell. frame. minX - self . homeView. collectionView. frame. width, y: 37.62 ) )
251
+ } completion: { [ weak self] _ in
252
+ guard let self = self else { return }
253
+
254
+ // self.dataSource.apply(snapshot)
255
+ }
256
+ }
161
257
}
162
258
163
259
//#if DEBUG
0 commit comments