Skip to content

Commit

Permalink
[#74]Feat: 차단, 신고 시, .none 상태로 업데이트 후, 다음 셀로 스크롤 구현
Browse files Browse the repository at this point in the history
- user info box 팝업에서 report(느낌표) 버튼 클릭 시, 멈춤 화면 디자인 반영
- 차단 or 신고 팝업 표시 시, 멈춤 화면에서 이미지, 텍스트 히든
- 중지했을 때의 동작을 enum으로 나눠서 처리할 필요 없는 거 같아서 bool로 변경
- 차단 or 신고 시, 멈춤 화면 없애고 dim view 표시 후, none 상태로 설정
  • Loading branch information
Minny27 committed May 23, 2024
1 parent 2e47221 commit 8b061eb
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 56 deletions.
86 changes: 49 additions & 37 deletions Projects/Features/Falling/Src/Home/FallingHomeViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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)
Expand Down Expand Up @@ -74,23 +62,23 @@ final class FallingHomeViewController: TFBaseViewController {
let fallingCellButtonAction = PublishSubject<FallingCellButtonAction>()

let viewWillDisAppearTrigger = self.rx.viewWillDisAppear.map { _ in
return TimerActiveAction.viewWillDisAppear(false)
return false
}.asDriverOnErrorJustEmpty()

let timerActiveRelay = BehaviorRelay<TimerActiveAction>(value: .profileDoubleTap(true))
let timerActiveRelay = BehaviorRelay<Bool>(value: true)

let profileDoubleTapTriggerObserver = PublishSubject<Void>()
let profileDoubleTapTrigger = profileDoubleTapTriggerObserver
.withLatestFrom(timerActiveRelay) {
return TimerActiveAction.profileDoubleTap(!$1.state)
return !$1
}
.asDriverOnErrorJustEmpty()

let reportButtonTapTriggerObserver = PublishSubject<Void>()

let reportButtonTapTrigger = reportButtonTapTriggerObserver
.withLatestFrom(timerActiveRelay) { _, _ in
return TimerActiveAction.reportButtonTap(false)
return false
}
.asDriverOnErrorJustEmpty()

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

let deleteCellTrigger = Driver.merge(complaintsButtonTapTrigger.asDriverOnErrorJustEmpty(), blockButtonTapTrigger.asDriverOnErrorJustEmpty())

let input = FallingHomeViewModel.Input(
initialTrigger: initialTrigger,
timeOverTrigger: timerOverTrigger,
Expand All @@ -125,7 +115,8 @@ final class FallingHomeViewController: TFBaseViewController {
timeOverSubject: timeOverSubject,
profileDoubleTapTriggerObserver: profileDoubleTapTriggerObserver,
fallingCellButtonAction: fallingCellButtonAction,
reportButtonTapTriggerObserver: reportButtonTapTriggerObserver
reportButtonTapTriggerObserver: reportButtonTapTriggerObserver,
deleteCellTrigger: deleteCellTrigger
)
}

Expand Down Expand Up @@ -186,45 +177,66 @@ 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()
.disposed(by: disposeBag)

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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,12 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell {

func bind<O>(
_ viewModel: FallingUserCollectionViewCellModel,
timerActiveTrigger: Driver<TimerActiveAction>,
timerActiveTrigger: Driver<Bool>,
timeOverSubject: PublishSubject<AnimationAction>,
profileDoubleTapTriggerObserver: PublishSubject<Void>,
fallingCellButtonAction: O,
reportButtonTapTriggerObserver: PublishSubject<Void>
reportButtonTapTriggerObserver: PublishSubject<Void>,
deleteCellTrigger: Driver<Void>
) where O: ObserverType, O.Element == FallingCellButtonAction {
let infoButtonTapTrigger = userInfoBoxView.infoButton.rx.tap.asDriver()

Expand All @@ -144,7 +145,8 @@ final class FallingUserCollectionViewCell: TFBaseCollectionViewCell {
showUserInfoTrigger: showUserInfoTrigger,
rejectButtonTapTrigger: rejectButtonTapTrigger,
likeButtonTapTrigger: likeButtonTapTrigger,
reportButtonTapTrigger: reportButtonTapTrigger
reportButtonTapTrigger: reportButtonTapTrigger,
deleteCellTrigger: deleteCellTrigger
)

let output = viewModel
Expand Down Expand Up @@ -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)
}

Expand Down Expand Up @@ -287,18 +300,15 @@ extension Reactive where Base: FallingUserCollectionViewCell {
}
}

var timerActiveAction: Binder<TimerActiveAction> {
return Binder(self.base) { base, action in
if action.state {
var timerActiveAction: Binder<Bool> {
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
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ final private class Timer {

func start() {
guard disposable == nil else { return }
if startTime < 0 { startTime = 13.0 }

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

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

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

func transform(input: Input) -> Output {
Expand All @@ -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()
Expand All @@ -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,
Expand All @@ -192,7 +201,8 @@ final class FallingUserCollectionViewCellModel: ViewModelType {
rejectButtonAction: rejectButtonAction,
likeButtonAction: likeButtonAction,
showUserInfoAction: showUserInfoAction,
reportButtonAction: reportButtonTapTrigger
reportButtonAction: reportButtonTapTrigger,
deleteCellAction: deleteCellAction
)
}
}

0 comments on commit 8b061eb

Please sign in to comment.