diff --git a/Projects/Features/Falling/Src/Home/FallingHomeViewController.swift b/Projects/Features/Falling/Src/Home/FallingHomeViewController.swift index c8d7ff65..24e5344f 100644 --- a/Projects/Features/Falling/Src/Home/FallingHomeViewController.swift +++ b/Projects/Features/Falling/Src/Home/FallingHomeViewController.swift @@ -17,20 +17,6 @@ enum FallingCellButtonAction { case like(IndexPath) } -enum TimerActiveAction { - case viewWillDisAppear(Bool) - case profileDoubleTap(Bool) - case reportButtonTap(Bool) - case DimViewTap(Bool) - - var state: Bool { - switch self { - case .viewWillDisAppear(let flag), .profileDoubleTap(let flag), .reportButtonTap(let flag), .DimViewTap(let flag): - return flag - } - } -} - enum AnimationAction { case scroll, delete } @@ -40,6 +26,8 @@ final class FallingHomeViewController: TFBaseViewController { private var dataSource: DataSource! private lazy var homeView = FallingHomeView() + private lazy var alertContentView = TFAlertContentView() + init(viewModel: FallingHomeViewModel) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) @@ -74,15 +62,15 @@ final class FallingHomeViewController: TFBaseViewController { let fallingCellButtonAction = PublishSubject() let viewWillDisAppearTrigger = self.rx.viewWillDisAppear.map { _ in - return TimerActiveAction.viewWillDisAppear(false) + return false }.asDriverOnErrorJustEmpty() - let timerActiveRelay = BehaviorRelay(value: .profileDoubleTap(true)) + let timerActiveRelay = BehaviorRelay(value: true) let profileDoubleTapTriggerObserver = PublishSubject() let profileDoubleTapTrigger = profileDoubleTapTriggerObserver .withLatestFrom(timerActiveRelay) { - return TimerActiveAction.profileDoubleTap(!$1.state) + return !$1 } .asDriverOnErrorJustEmpty() @@ -90,7 +78,7 @@ final class FallingHomeViewController: TFBaseViewController { let reportButtonTapTrigger = reportButtonTapTriggerObserver .withLatestFrom(timerActiveRelay) { _, _ in - return TimerActiveAction.reportButtonTap(false) + return false } .asDriverOnErrorJustEmpty() @@ -101,6 +89,8 @@ final class FallingHomeViewController: TFBaseViewController { let complaintsButtonTapTrigger = PublishRelay() let blockButtonTapTrigger = PublishRelay() + let deleteCellTrigger = Driver.merge(complaintsButtonTapTrigger.asDriverOnErrorJustEmpty(), blockButtonTapTrigger.asDriverOnErrorJustEmpty()) + let input = FallingHomeViewModel.Input( initialTrigger: initialTrigger, timeOverTrigger: timerOverTrigger, @@ -125,7 +115,8 @@ final class FallingHomeViewController: TFBaseViewController { timeOverSubject: timeOverSubject, profileDoubleTapTriggerObserver: profileDoubleTapTriggerObserver, fallingCellButtonAction: fallingCellButtonAction, - reportButtonTapTriggerObserver: reportButtonTapTriggerObserver + reportButtonTapTriggerObserver: reportButtonTapTriggerObserver, + deleteCellTrigger: deleteCellTrigger ) } @@ -186,28 +177,51 @@ final class FallingHomeViewController: TFBaseViewController { } .disposed(by: disposeBag) + Driver.merge( + alertContentView.unpleasantPhotoButton.rx.tap.asDriver(), + alertContentView.fakeProfileButton.rx.tap.asDriver(), + alertContentView.photoTheftButton.rx.tap.asDriver(), + alertContentView.profanityButton.rx.tap.asDriver(), + alertContentView.sharingIllegalFootageButton.rx.tap.asDriver()) + .do { _ in + complaintsButtonTapTrigger.accept(()) + + self.homeView.makeToast("신고하기가 완료되었습니다. 해당 사용자와\n서로 차단되며, 신고 사유는 검토 후 처리됩니다.", duration: 3.0, position: .bottom) + + UIWindow.keyWindow?.rootViewController?.dismiss(animated: false) + } + .drive() + .disposed(by: disposeBag) + reportButtonTapTriggerObserver.asDriverOnErrorJustEmpty() .do { _ in self.showAlert( - leftActionTitle: "신고하기", - rightActionTitle: "차단하기", - leftActionCompletion: { - self.showAlert(action: .complaints) + topActionTitle: "신고하기", + bottomActionTitle: "차단하기", + dimColor: DSKitAsset.Color.clear.color, + topActionCompletion: { + self.showAlert( + contentView: self.alertContentView, + topActionTitle: nil, + dimColor: DSKitAsset.Color.clear.color, + bottomActionCompletion: { timerActiveRelay.accept(true) }, + dimActionCompletion: { timerActiveRelay.accept(true) } + ) }, - rightActionCompletion: { + bottomActionCompletion: { self.showAlert( action: .block, - leftActionCompletion: { + dimColor: DSKitAsset.Color.clear.color, + topActionCompletion: { blockButtonTapTrigger.accept(()) + + self.homeView.makeToast("차단하기가 완료되었습니다. 해당 사용자와\n서로 차단되며 설정에서 확인 가능합니다.", duration: 3.0, position: .bottom) }, - rightActionCompletion: { - timerActiveRelay.accept(.DimViewTap(true)) - } + bottomActionCompletion: { timerActiveRelay.accept(true) }, + dimActionCompletion: { timerActiveRelay.accept(true) } ) }, - dimActionCompletion: { - timerActiveRelay.accept(.DimViewTap(true)) - } + dimActionCompletion: { timerActiveRelay.accept(true) } ) } .drive() @@ -215,16 +229,14 @@ final class FallingHomeViewController: TFBaseViewController { Driver.merge(output.complaintsAction, output.blockAction) .do { indexPath in -// timerActiveRelay.accept(.DimViewTap(true)) + guard let _ = self.homeView.collectionView.cellForItem(at: indexPath) as? FallingUserCollectionViewCell else { return } + self.deleteItems(indexPath) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { timeOverSubject.onNext(.delete) - timerActiveRelay.accept(.DimViewTap(true)) + timerActiveRelay.accept(true) } - -// timerActiveRelay.accept(.DimViewTap(true)) - - } .drive() .disposed(by: disposeBag) diff --git a/Projects/Features/Falling/Src/Subviews/Cell/FallingUserCollectionViewCell.swift b/Projects/Features/Falling/Src/Subviews/Cell/FallingUserCollectionViewCell.swift index 1c55d0b0..330d1638 100644 --- a/Projects/Features/Falling/Src/Subviews/Cell/FallingUserCollectionViewCell.swift +++ b/Projects/Features/Falling/Src/Subviews/Cell/FallingUserCollectionViewCell.swift @@ -121,11 +121,12 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell { func bind( _ viewModel: FallingUserCollectionViewCellModel, - timerActiveTrigger: Driver, + timerActiveTrigger: Driver, timeOverSubject: PublishSubject, profileDoubleTapTriggerObserver: PublishSubject, fallingCellButtonAction: O, - reportButtonTapTriggerObserver: PublishSubject + reportButtonTapTriggerObserver: PublishSubject, + deleteCellTrigger: Driver ) where O: ObserverType, O.Element == FallingCellButtonAction { let infoButtonTapTrigger = userInfoBoxView.infoButton.rx.tap.asDriver() @@ -144,7 +145,8 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell { showUserInfoTrigger: showUserInfoTrigger, rejectButtonTapTrigger: rejectButtonTapTrigger, likeButtonTapTrigger: likeButtonTapTrigger, - reportButtonTapTrigger: reportButtonTapTrigger + reportButtonTapTrigger: reportButtonTapTrigger, + deleteCellTrigger: deleteCellTrigger ) let output = viewModel @@ -204,7 +206,18 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell { .disposed(by: disposeBag) output.reportButtonAction - .drive(reportButtonTapTriggerObserver) + .drive(with: self) { owner, _ in + reportButtonTapTriggerObserver.onNext(()) + owner.pauseView.ImageContainerView.isHidden = true + owner.pauseView.titleLabel.isHidden = true + } + .disposed(by: disposeBag) + + output.deleteCellAction + .drive(with: self) { owner, _ in + owner.pauseView.isHidden = true + owner.profileCollectionView.showDimView() + } .disposed(by: disposeBag) } @@ -287,18 +300,15 @@ extension Reactive where Base: FallingUserCollectionViewCell { } } - var timerActiveAction: Binder { - return Binder(self.base) { base, action in - if action.state { + var timerActiveAction: Binder { + return Binder(self.base) { base, value in + if value { base.profileCollectionView.hiddenDimView() base.pauseView.isHidden = true } else { - switch action { - case .reportButtonTap, .DimViewTap: - base.pauseView.isHidden = true - case .viewWillDisAppear, .profileDoubleTap: - base.pauseView.isHidden = false - } + base.pauseView.ImageContainerView.isHidden = false + base.pauseView.titleLabel.isHidden = false + base.pauseView.isHidden = false } } } diff --git a/Projects/Features/Falling/Src/Subviews/Cell/FallinguserCollectionViewCellModel.swift b/Projects/Features/Falling/Src/Subviews/Cell/FallinguserCollectionViewCellModel.swift index 5cad7e4f..2c428d1a 100644 --- a/Projects/Features/Falling/Src/Subviews/Cell/FallinguserCollectionViewCellModel.swift +++ b/Projects/Features/Falling/Src/Subviews/Cell/FallinguserCollectionViewCellModel.swift @@ -103,6 +103,7 @@ final private class Timer { func start() { guard disposable == nil else { return } + if startTime < 0 { startTime = 13.0 } disposable = Observable.interval(.milliseconds(10), scheduler: MainScheduler.instance) @@ -132,22 +133,24 @@ final class FallingUserCollectionViewCellModel: ViewModelType { var disposeBag: DisposeBag = DisposeBag() struct Input { - let timerActiveTrigger: Driver + let timerActiveTrigger: Driver let showUserInfoTrigger: Driver let rejectButtonTapTrigger: Driver let likeButtonTapTrigger: Driver let reportButtonTapTrigger: Driver + let deleteCellTrigger: Driver } struct Output { let user: Driver let timeState: Driver let timeZero: Driver - let timerActiveAction: Driver + let timerActiveAction: Driver let rejectButtonAction: Driver let likeButtonAction: Driver let showUserInfoAction: Driver let reportButtonAction: Driver + let deleteCellAction: Driver } func transform(input: Input) -> Output { @@ -165,8 +168,8 @@ final class FallingUserCollectionViewCellModel: ViewModelType { let likeButtonAction = input.likeButtonTapTrigger let timeActiveAction = timerActiveTrigger - .do { action in - if !action.state { + .do { value in + if !value { timer.pause() } else { timer.start() @@ -178,12 +181,18 @@ final class FallingUserCollectionViewCellModel: ViewModelType { let timeState = time.map { TimeState(rawValue: $0) } let timeZero = time.filter { $0 == 0.0 }.flatMapLatest { _ in Driver.just(AnimationAction.scroll) } let timerActiveAction = timeActiveAction.asDriver(onErrorJustReturn: - .profileDoubleTap(true)) + true) let showUserInfoAction = input.showUserInfoTrigger let reportButtonTapTrigger = input.reportButtonTapTrigger + let deleteCellAction = input.deleteCellTrigger + .do(onNext: { + timer.pause() + timer.currentTime.accept(-1.0) + }) + return Output( user: user, timeState: timeState, @@ -192,7 +201,8 @@ final class FallingUserCollectionViewCellModel: ViewModelType { rejectButtonAction: rejectButtonAction, likeButtonAction: likeButtonAction, showUserInfoAction: showUserInfoAction, - reportButtonAction: reportButtonTapTrigger + reportButtonAction: reportButtonTapTrigger, + deleteCellAction: deleteCellAction ) } }