Skip to content

Commit b7c0d5b

Browse files
Minny27ibcylon
authored andcommitted
[#74]Feat: 차단, 신고 시, .none 상태로 업데이트 후, 다음 셀로 스크롤 구현
- user info box 팝업에서 report(느낌표) 버튼 클릭 시, 멈춤 화면 디자인 반영 - 차단 or 신고 팝업 표시 시, 멈춤 화면에서 이미지, 텍스트 히든 - 중지했을 때의 동작을 enum으로 나눠서 처리할 필요 없는 거 같아서 bool로 변경 - 차단 or 신고 시, 멈춤 화면 없애고 dim view 표시 후, none 상태로 설정
1 parent 694c854 commit b7c0d5b

File tree

3 files changed

+88
-56
lines changed

3 files changed

+88
-56
lines changed

Projects/Features/Falling/Src/Home/FallingHomeViewController.swift

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,6 @@ enum FallingCellButtonAction {
1717
case like(IndexPath)
1818
}
1919

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-
3420
enum AnimationAction {
3521
case scroll, delete
3622
}
@@ -40,6 +26,8 @@ final class FallingHomeViewController: TFBaseViewController {
4026
private var dataSource: DataSource!
4127
private lazy var homeView = FallingHomeView()
4228

29+
private lazy var alertContentView = TFAlertContentView()
30+
4331
init(viewModel: FallingHomeViewModel) {
4432
self.viewModel = viewModel
4533
super.init(nibName: nil, bundle: nil)
@@ -74,23 +62,23 @@ final class FallingHomeViewController: TFBaseViewController {
7462
let fallingCellButtonAction = PublishSubject<FallingCellButtonAction>()
7563

7664
let viewWillDisAppearTrigger = self.rx.viewWillDisAppear.map { _ in
77-
return TimerActiveAction.viewWillDisAppear(false)
65+
return false
7866
}.asDriverOnErrorJustEmpty()
7967

80-
let timerActiveRelay = BehaviorRelay<TimerActiveAction>(value: .profileDoubleTap(true))
68+
let timerActiveRelay = BehaviorRelay<Bool>(value: true)
8169

8270
let profileDoubleTapTriggerObserver = PublishSubject<Void>()
8371
let profileDoubleTapTrigger = profileDoubleTapTriggerObserver
8472
.withLatestFrom(timerActiveRelay) {
85-
return TimerActiveAction.profileDoubleTap(!$1.state)
73+
return !$1
8674
}
8775
.asDriverOnErrorJustEmpty()
8876

8977
let reportButtonTapTriggerObserver = PublishSubject<Void>()
9078

9179
let reportButtonTapTrigger = reportButtonTapTriggerObserver
9280
.withLatestFrom(timerActiveRelay) { _, _ in
93-
return TimerActiveAction.reportButtonTap(false)
81+
return false
9482
}
9583
.asDriverOnErrorJustEmpty()
9684

@@ -101,6 +89,8 @@ final class FallingHomeViewController: TFBaseViewController {
10189
let complaintsButtonTapTrigger = PublishRelay<Void>()
10290
let blockButtonTapTrigger = PublishRelay<Void>()
10391

92+
let deleteCellTrigger = Driver.merge(complaintsButtonTapTrigger.asDriverOnErrorJustEmpty(), blockButtonTapTrigger.asDriverOnErrorJustEmpty())
93+
10494
let input = FallingHomeViewModel.Input(
10595
initialTrigger: initialTrigger,
10696
timeOverTrigger: timerOverTrigger,
@@ -125,7 +115,8 @@ final class FallingHomeViewController: TFBaseViewController {
125115
timeOverSubject: timeOverSubject,
126116
profileDoubleTapTriggerObserver: profileDoubleTapTriggerObserver,
127117
fallingCellButtonAction: fallingCellButtonAction,
128-
reportButtonTapTriggerObserver: reportButtonTapTriggerObserver
118+
reportButtonTapTriggerObserver: reportButtonTapTriggerObserver,
119+
deleteCellTrigger: deleteCellTrigger
129120
)
130121
}
131122

@@ -186,45 +177,66 @@ final class FallingHomeViewController: TFBaseViewController {
186177
}
187178
.disposed(by: disposeBag)
188179

180+
Driver.merge(
181+
alertContentView.unpleasantPhotoButton.rx.tap.asDriver(),
182+
alertContentView.fakeProfileButton.rx.tap.asDriver(),
183+
alertContentView.photoTheftButton.rx.tap.asDriver(),
184+
alertContentView.profanityButton.rx.tap.asDriver(),
185+
alertContentView.sharingIllegalFootageButton.rx.tap.asDriver())
186+
.do { _ in
187+
complaintsButtonTapTrigger.accept(())
188+
189+
self.homeView.makeToast("신고하기가 완료되었습니다. 해당 사용자와\n서로 차단되며, 신고 사유는 검토 후 처리됩니다.", duration: 3.0, position: .bottom)
190+
191+
UIWindow.keyWindow?.rootViewController?.dismiss(animated: false)
192+
}
193+
.drive()
194+
.disposed(by: disposeBag)
195+
189196
reportButtonTapTriggerObserver.asDriverOnErrorJustEmpty()
190197
.do { _ in
191198
self.showAlert(
192-
leftActionTitle: "신고하기",
193-
rightActionTitle: "차단하기",
194-
leftActionCompletion: {
195-
self.showAlert(action: .complaints)
199+
topActionTitle: "신고하기",
200+
bottomActionTitle: "차단하기",
201+
dimColor: DSKitAsset.Color.clear.color,
202+
topActionCompletion: {
203+
self.showAlert(
204+
contentView: self.alertContentView,
205+
topActionTitle: nil,
206+
dimColor: DSKitAsset.Color.clear.color,
207+
bottomActionCompletion: { timerActiveRelay.accept(true) },
208+
dimActionCompletion: { timerActiveRelay.accept(true) }
209+
)
196210
},
197-
rightActionCompletion: {
211+
bottomActionCompletion: {
198212
self.showAlert(
199213
action: .block,
200-
leftActionCompletion: {
214+
dimColor: DSKitAsset.Color.clear.color,
215+
topActionCompletion: {
201216
blockButtonTapTrigger.accept(())
217+
218+
self.homeView.makeToast("차단하기가 완료되었습니다. 해당 사용자와\n서로 차단되며 설정에서 확인 가능합니다.", duration: 3.0, position: .bottom)
202219
},
203-
rightActionCompletion: {
204-
timerActiveRelay.accept(.DimViewTap(true))
205-
}
220+
bottomActionCompletion: { timerActiveRelay.accept(true) },
221+
dimActionCompletion: { timerActiveRelay.accept(true) }
206222
)
207223
},
208-
dimActionCompletion: {
209-
timerActiveRelay.accept(.DimViewTap(true))
210-
}
224+
dimActionCompletion: { timerActiveRelay.accept(true) }
211225
)
212226
}
213227
.drive()
214228
.disposed(by: disposeBag)
215229

216230
Driver.merge(output.complaintsAction, output.blockAction)
217231
.do { indexPath in
218-
// timerActiveRelay.accept(.DimViewTap(true))
232+
guard let _ = self.homeView.collectionView.cellForItem(at: indexPath) as? FallingUserCollectionViewCell else { return }
233+
219234
self.deleteItems(indexPath)
235+
220236
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
221237
timeOverSubject.onNext(.delete)
222-
timerActiveRelay.accept(.DimViewTap(true))
238+
timerActiveRelay.accept(true)
223239
}
224-
225-
// timerActiveRelay.accept(.DimViewTap(true))
226-
227-
228240
}
229241
.drive()
230242
.disposed(by: disposeBag)

Projects/Features/Falling/Src/Subviews/Cell/FallingUserCollectionViewCell.swift

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,12 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell {
121121

122122
func bind<O>(
123123
_ viewModel: FallingUserCollectionViewCellModel,
124-
timerActiveTrigger: Driver<TimerActiveAction>,
124+
timerActiveTrigger: Driver<Bool>,
125125
timeOverSubject: PublishSubject<AnimationAction>,
126126
profileDoubleTapTriggerObserver: PublishSubject<Void>,
127127
fallingCellButtonAction: O,
128-
reportButtonTapTriggerObserver: PublishSubject<Void>
128+
reportButtonTapTriggerObserver: PublishSubject<Void>,
129+
deleteCellTrigger: Driver<Void>
129130
) where O: ObserverType, O.Element == FallingCellButtonAction {
130131
let infoButtonTapTrigger = userInfoBoxView.infoButton.rx.tap.asDriver()
131132

@@ -144,7 +145,8 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell {
144145
showUserInfoTrigger: showUserInfoTrigger,
145146
rejectButtonTapTrigger: rejectButtonTapTrigger,
146147
likeButtonTapTrigger: likeButtonTapTrigger,
147-
reportButtonTapTrigger: reportButtonTapTrigger
148+
reportButtonTapTrigger: reportButtonTapTrigger,
149+
deleteCellTrigger: deleteCellTrigger
148150
)
149151

150152
let output = viewModel
@@ -204,7 +206,18 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell {
204206
.disposed(by: disposeBag)
205207

206208
output.reportButtonAction
207-
.drive(reportButtonTapTriggerObserver)
209+
.drive(with: self) { owner, _ in
210+
reportButtonTapTriggerObserver.onNext(())
211+
owner.pauseView.ImageContainerView.isHidden = true
212+
owner.pauseView.titleLabel.isHidden = true
213+
}
214+
.disposed(by: disposeBag)
215+
216+
output.deleteCellAction
217+
.drive(with: self) { owner, _ in
218+
owner.pauseView.isHidden = true
219+
owner.profileCollectionView.showDimView()
220+
}
208221
.disposed(by: disposeBag)
209222
}
210223

@@ -287,18 +300,15 @@ extension Reactive where Base: FallingUserCollectionViewCell {
287300
}
288301
}
289302

290-
var timerActiveAction: Binder<TimerActiveAction> {
291-
return Binder(self.base) { base, action in
292-
if action.state {
303+
var timerActiveAction: Binder<Bool> {
304+
return Binder(self.base) { base, value in
305+
if value {
293306
base.profileCollectionView.hiddenDimView()
294307
base.pauseView.isHidden = true
295308
} else {
296-
switch action {
297-
case .reportButtonTap, .DimViewTap:
298-
base.pauseView.isHidden = true
299-
case .viewWillDisAppear, .profileDoubleTap:
300-
base.pauseView.isHidden = false
301-
}
309+
base.pauseView.ImageContainerView.isHidden = false
310+
base.pauseView.titleLabel.isHidden = false
311+
base.pauseView.isHidden = false
302312
}
303313
}
304314
}

Projects/Features/Falling/Src/Subviews/Cell/FallinguserCollectionViewCellModel.swift

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ final private class Timer {
103103

104104
func start() {
105105
guard disposable == nil else { return }
106+
if startTime < 0 { startTime = 13.0 }
106107

107108
disposable = Observable<Int>.interval(.milliseconds(10),
108109
scheduler: MainScheduler.instance)
@@ -132,22 +133,24 @@ final class FallingUserCollectionViewCellModel: ViewModelType {
132133
var disposeBag: DisposeBag = DisposeBag()
133134

134135
struct Input {
135-
let timerActiveTrigger: Driver<TimerActiveAction>
136+
let timerActiveTrigger: Driver<Bool>
136137
let showUserInfoTrigger: Driver<Bool>
137138
let rejectButtonTapTrigger: Driver<Void>
138139
let likeButtonTapTrigger: Driver<Void>
139140
let reportButtonTapTrigger: Driver<Void>
141+
let deleteCellTrigger: Driver<Void>
140142
}
141143

142144
struct Output {
143145
let user: Driver<FallingUser>
144146
let timeState: Driver<TimeState>
145147
let timeZero: Driver<AnimationAction>
146-
let timerActiveAction: Driver<TimerActiveAction>
148+
let timerActiveAction: Driver<Bool>
147149
let rejectButtonAction: Driver<Void>
148150
let likeButtonAction: Driver<Void>
149151
let showUserInfoAction: Driver<Bool>
150152
let reportButtonAction: Driver<Void>
153+
let deleteCellAction: Driver<Void>
151154
}
152155

153156
func transform(input: Input) -> Output {
@@ -165,8 +168,8 @@ final class FallingUserCollectionViewCellModel: ViewModelType {
165168
let likeButtonAction = input.likeButtonTapTrigger
166169

167170
let timeActiveAction = timerActiveTrigger
168-
.do { action in
169-
if !action.state {
171+
.do { value in
172+
if !value {
170173
timer.pause()
171174
} else {
172175
timer.start()
@@ -178,12 +181,18 @@ final class FallingUserCollectionViewCellModel: ViewModelType {
178181
let timeState = time.map { TimeState(rawValue: $0) }
179182
let timeZero = time.filter { $0 == 0.0 }.flatMapLatest { _ in Driver.just(AnimationAction.scroll) }
180183
let timerActiveAction = timeActiveAction.asDriver(onErrorJustReturn:
181-
.profileDoubleTap(true))
184+
true)
182185

183186
let showUserInfoAction = input.showUserInfoTrigger
184187

185188
let reportButtonTapTrigger = input.reportButtonTapTrigger
186189

190+
let deleteCellAction = input.deleteCellTrigger
191+
.do(onNext: {
192+
timer.pause()
193+
timer.currentTime.accept(-1.0)
194+
})
195+
187196
return Output(
188197
user: user,
189198
timeState: timeState,
@@ -192,7 +201,8 @@ final class FallingUserCollectionViewCellModel: ViewModelType {
192201
rejectButtonAction: rejectButtonAction,
193202
likeButtonAction: likeButtonAction,
194203
showUserInfoAction: showUserInfoAction,
195-
reportButtonAction: reportButtonTapTrigger
204+
reportButtonAction: reportButtonTapTrigger,
205+
deleteCellAction: deleteCellAction
196206
)
197207
}
198208
}

0 commit comments

Comments
 (0)