diff --git a/Projects/Features/Falling/Src/Subviews/Cell/FallingUserCollectionViewCell.swift b/Projects/Features/Falling/Src/Subviews/Cell/FallingUserCollectionViewCell.swift index 165a8284..1c55d0b0 100644 --- a/Projects/Features/Falling/Src/Subviews/Cell/FallingUserCollectionViewCell.swift +++ b/Projects/Features/Falling/Src/Subviews/Cell/FallingUserCollectionViewCell.swift @@ -121,19 +121,30 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell { func bind( _ viewModel: FallingUserCollectionViewCellModel, - timerActiveTrigger: Driver, - timeOverSubject: PublishSubject, + timerActiveTrigger: Driver, + timeOverSubject: PublishSubject, profileDoubleTapTriggerObserver: PublishSubject, - fallingCellButtonAction: O + fallingCellButtonAction: O, + reportButtonTapTriggerObserver: PublishSubject ) where O: ObserverType, O.Element == FallingCellButtonAction { - let rejectButtonTrigger = userInfoBoxView.rejectButton.rx.tap.mapToVoid().asDriverOnErrorJustEmpty() + let infoButtonTapTrigger = userInfoBoxView.infoButton.rx.tap.asDriver() - let likeButtonTrigger = userInfoBoxView.likeButton.rx.tap.mapToVoid().asDriverOnErrorJustEmpty() + let rejectButtonTapTrigger = userInfoBoxView.rejectButton.rx.tap.mapToVoid().asDriverOnErrorJustEmpty() + + let likeButtonTapTrigger = userInfoBoxView.likeButton.rx.tap.asDriver() + + let reportButtonTapTrigger = userInfoView.reportButton.rx.tap.asDriver() + + let showUserInfoTrigger = Driver.merge(infoButtonTapTrigger, reportButtonTapTrigger).scan(true) { value, _ in + return !value + } let input = FallingUserCollectionViewCellModel.Input( timerActiveTrigger: timerActiveTrigger, - rejectButtonTrigger: rejectButtonTrigger, - likeButtonTrigger: likeButtonTrigger + showUserInfoTrigger: showUserInfoTrigger, + rejectButtonTapTrigger: rejectButtonTapTrigger, + likeButtonTapTrigger: likeButtonTapTrigger, + reportButtonTapTrigger: reportButtonTapTrigger ) let output = viewModel @@ -151,11 +162,8 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell { .drive(timeOverSubject) .disposed(by: disposeBag) - output.isTimerActive - .do(onNext: { _ in - self.profileCollectionView.hiddenDimView() - }) - .drive(pauseView.rx.isHidden) + output.timerActiveAction + .drive(self.rx.timerActiveAction) .disposed(by: disposeBag) let profileDoubleTapTrigger = self.profileCollectionView.rx @@ -179,18 +187,10 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell { .drive(profileDoubleTapTriggerObserver) .disposed(by: disposeBag) - profileCollectionView.rx.didEndDisplayingCell.asDriver() - .debug() - .drive(with: self) { owner, indexPath in - self.userInfoBoxView.pageControl.currentPage - } - .disposed(by: disposeBag) - - userInfoBoxView.infoButton.rx.tap.asDriver() - .scan(true) { value, _ in return !value } + output.showUserInfoAction .drive(userInfoView.rx.isHidden) .disposed(by: disposeBag) - + output.rejectButtonAction .compactMap { [weak self] _ in self?.indexPath } .map { FallingCellButtonAction.reject($0) } @@ -202,6 +202,10 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell { .map { FallingCellButtonAction.like($0) } .drive(fallingCellButtonAction) .disposed(by: disposeBag) + + output.reportButtonAction + .drive(reportButtonTapTriggerObserver) + .disposed(by: disposeBag) } func bind(userProfilePhotos: [UserProfilePhoto]) { @@ -276,10 +280,26 @@ extension Reactive where Base: FallingUserCollectionViewCell { } var user: Binder { - return Binder(self.base) { (base, user) in + return Binder(self.base) { base, user in base.bind(userProfilePhotos: user.userProfilePhotos) base.userInfoBoxView.bind(user) base.userInfoView.bind(user) } } + + var timerActiveAction: Binder { + return Binder(self.base) { base, action in + if action.state { + base.profileCollectionView.hiddenDimView() + base.pauseView.isHidden = true + } else { + switch action { + case .reportButtonTap, .DimViewTap: + base.pauseView.isHidden = true + case .viewWillDisAppear, .profileDoubleTap: + 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 09bc9106..5cad7e4f 100644 --- a/Projects/Features/Falling/Src/Subviews/Cell/FallinguserCollectionViewCellModel.swift +++ b/Projects/Features/Falling/Src/Subviews/Cell/FallinguserCollectionViewCellModel.swift @@ -132,18 +132,22 @@ final class FallingUserCollectionViewCellModel: ViewModelType { var disposeBag: DisposeBag = DisposeBag() struct Input { - let timerActiveTrigger: Driver - let rejectButtonTrigger: Driver - let likeButtonTrigger: Driver + let timerActiveTrigger: Driver + let showUserInfoTrigger: Driver + let rejectButtonTapTrigger: Driver + let likeButtonTapTrigger: Driver + let reportButtonTapTrigger: Driver } struct Output { let user: Driver let timeState: Driver - let timeZero: Driver - let isTimerActive: Driver + let timeZero: Driver + let timerActiveAction: Driver let rejectButtonAction: Driver let likeButtonAction: Driver + let showUserInfoAction: Driver + let reportButtonAction: Driver } func transform(input: Input) -> Output { @@ -152,17 +156,17 @@ final class FallingUserCollectionViewCellModel: ViewModelType { let timerActiveTrigger = input.timerActiveTrigger - let rejectButtonAction = input.rejectButtonTrigger + let rejectButtonAction = input.rejectButtonTapTrigger .do(onNext: { _ in timer.pause() timer.currentTime.accept(-1.0) // reject 시에는 0.5초 후에 넘어 가야하는 제약이 있어서, 0초로 설정하지 않았고, reject 버튼 이벤트에 대한 처리는 상위 뷰에서 따로 처리하고 있음. }) - let likeButtonAction = input.likeButtonTrigger + let likeButtonAction = input.likeButtonTapTrigger let timeActiveAction = timerActiveTrigger - .do { value in - if !value { + .do { action in + if !action.state { timer.pause() } else { timer.start() @@ -172,16 +176,23 @@ final class FallingUserCollectionViewCellModel: ViewModelType { let time = timer.currentTime.asDriver(onErrorJustReturn: 0.0) let timeState = time.map { TimeState(rawValue: $0) } - let timeZero = time.filter { $0 == 0.0 }.map { _ in } - let isTimerActive = timeActiveAction.asDriver(onErrorJustReturn: true) + let timeZero = time.filter { $0 == 0.0 }.flatMapLatest { _ in Driver.just(AnimationAction.scroll) } + let timerActiveAction = timeActiveAction.asDriver(onErrorJustReturn: + .profileDoubleTap(true)) + + let showUserInfoAction = input.showUserInfoTrigger + + let reportButtonTapTrigger = input.reportButtonTapTrigger return Output( user: user, timeState: timeState, timeZero: timeZero, - isTimerActive: isTimerActive, + timerActiveAction: timerActiveAction, rejectButtonAction: rejectButtonAction, - likeButtonAction: likeButtonAction + likeButtonAction: likeButtonAction, + showUserInfoAction: showUserInfoAction, + reportButtonAction: reportButtonTapTrigger ) } }