Skip to content

Commit

Permalink
[#74]Feat: TimerActiveAction 추가 -> 멈추는 이벤트에 따라 케이스를 나눔
Browse files Browse the repository at this point in the history
- 프로필 더블 클릭, 다른 화면으로 이동할 때는 pauseView를 표시해야하고
- report 버튼을 클릭할 때는 pauseView를 표시하지 않아야 해서
- TimerActiveAction 케이스를 기준으로 Timer를 재개, 멈춤 구현
- info button tap, report button tap 합성 -> infoView를 hidden 시키는 두 가지 액션 처리
  • Loading branch information
Minny27 committed Apr 23, 2024
1 parent 951ad75 commit 4d4c330
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -121,19 +121,30 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell {

func bind<O>(
_ viewModel: FallingUserCollectionViewCellModel,
timerActiveTrigger: Driver<Bool>,
timeOverSubject: PublishSubject<Void>,
timerActiveTrigger: Driver<TimerActiveAction>,
timeOverSubject: PublishSubject<AnimationAction>,
profileDoubleTapTriggerObserver: PublishSubject<Void>,
fallingCellButtonAction: O
fallingCellButtonAction: O,
reportButtonTapTriggerObserver: PublishSubject<Void>
) 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
Expand All @@ -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
Expand All @@ -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) }
Expand All @@ -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]) {
Expand Down Expand Up @@ -276,10 +280,26 @@ extension Reactive where Base: FallingUserCollectionViewCell {
}

var user: Binder<FallingUser> {
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<TimerActiveAction> {
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
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -132,18 +132,22 @@ final class FallingUserCollectionViewCellModel: ViewModelType {
var disposeBag: DisposeBag = DisposeBag()

struct Input {
let timerActiveTrigger: Driver<Bool>
let rejectButtonTrigger: Driver<Void>
let likeButtonTrigger: Driver<Void>
let timerActiveTrigger: Driver<TimerActiveAction>
let showUserInfoTrigger: Driver<Bool>
let rejectButtonTapTrigger: Driver<Void>
let likeButtonTapTrigger: Driver<Void>
let reportButtonTapTrigger: Driver<Void>
}

struct Output {
let user: Driver<FallingUser>
let timeState: Driver<TimeState>
let timeZero: Driver<Void>
let isTimerActive: Driver<Bool>
let timeZero: Driver<AnimationAction>
let timerActiveAction: Driver<TimerActiveAction>
let rejectButtonAction: Driver<Void>
let likeButtonAction: Driver<Void>
let showUserInfoAction: Driver<Bool>
let reportButtonAction: Driver<Void>
}

func transform(input: Input) -> Output {
Expand All @@ -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()
Expand All @@ -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
)
}
}

0 comments on commit 4d4c330

Please sign in to comment.