Skip to content

Commit

Permalink
fix/#388 준비 현황 뷰 준비 정보, 우리들의 준비 현황 분기 처리 및 데이터 바인딩
Browse files Browse the repository at this point in the history
  • Loading branch information
youz2me committed Sep 18, 2024
1 parent e8e34b8 commit 3c9b8bf
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ class ReadyPlanInfoView: BaseView {
// MARK: Property

let readyTimeLabel: UILabel = UILabel().then {
$0.setText("12시 30분에 준비하고,\n1시에 이동을 시작해야 해요", style: .body03)
$0.setHighlightText("12시 30분", "1시", style: .body03, color: .maincolor)
$0.setText("--시 --분에 준비하고,\n-시에 이동을 시작해야 해요", style: .body03)
$0.setHighlightText("--시 --분", "-시", style: .body03, color: .maincolor)
}

let requestReadyTimeLabel: UILabel = UILabel().then {
$0.setText("준비 소요 시간: 30분", style: .label02, color: .gray8)
$0.setText("준비 소요 시간: --분", style: .label02, color: .gray8)
}

let requestMoveTimeLabel: UILabel = UILabel().then {
$0.setText("이동 소요 시간: 1시간 30분", style: .label02, color: .gray8)
$0.setText("이동 소요 시간: --분", style: .label02, color: .gray8)
}

let editButton: UIButton = UIButton().then {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ class ReadyStatusViewController: BaseViewController {

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)

viewModel.fetchTardyInfo()
viewModel.fetchPromiseInfo()
viewModel.fetchMyReadyStatus()
viewModel.fetchPromiseParticipantList()
}

override func viewDidLayoutSubviews() {
Expand Down Expand Up @@ -93,7 +98,41 @@ class ReadyStatusViewController: BaseViewController {

extension ReadyStatusViewController {
func setupBinding() {
viewModel.participantList.bindOnMain(with: self) { owner, _ in
owner.rootView.ourReadyStatusCollectionView.reloadData()
}

viewModel.isPastDue.bindOnMain(with: self) { owner, isPastDue in
guard let isPastDue else { return }

owner.rootView.readyPlanInfoView.editButton.isHidden = isPastDue
}

viewModel.promiseInfo.bindOnMain(with: self) { owner, info in
guard let promiseInfo = info else { return }

owner.rootView.do {
$0.enterReadyButtonView.isHidden = owner.viewModel.isReadyInfoEntered()
$0.readyPlanInfoView.isHidden = !$0.enterReadyButtonView.isHidden
$0.enterReadyButtonView.isUserInteractionEnabled = promiseInfo.isParticipant
}
}

viewModel.myReadyInfo.bindOnMain(with: self) { owner, status in
owner.rootView.do {
$0.enterReadyButtonView.isHidden = owner.viewModel.isReadyInfoEntered()
$0.readyPlanInfoView.isHidden = !$0.enterReadyButtonView.isHidden
}
}

viewModel.requestReadyTime.bindOnMain(with: self) { owner, time in
owner.rootView.do {
$0.readyPlanInfoView.readyTimeLabel.setText("\(time[0])에 준비하고,\n\(time[1])에 이동을 시작해야 해요", style: .body03)
$0.readyPlanInfoView.readyTimeLabel.setHighlightText("\(time[0])","\(time[1])", style: .body03, color: .maincolor)
$0.readyPlanInfoView.requestReadyTimeLabel.setText("준비 소요 시간: \(time[2])", style: .label02, color: .gray8)
$0.readyPlanInfoView.requestMoveTimeLabel.setText("이동 소요 시간: \(time[3])", style: .label02, color: .gray8)
}
}
}

@objc
Expand All @@ -113,12 +152,47 @@ extension ReadyStatusViewController {

@objc
func editReadyButtonDidTap() {
guard let promiseName = viewModel.promiseInfo.value?.promiseName,
let promiseTime = viewModel.myReadyInfo.value?.promiseTime,
let preparationTime = viewModel.myReadyInfo.value?.preparationTime,
let travelTime = viewModel.myReadyInfo.value?.travelTime else {
return
}

let viewModel = SetReadyInfoViewModel(
promiseID: viewModel.promiseID,
promiseTime: promiseTime,
promiseName: promiseName,
service: PromiseService()
)

viewModel.storedReadyHour = preparationTime / 60
viewModel.storedReadyMinute = preparationTime % 60
viewModel.storedMoveHour = travelTime / 60
viewModel.storedMoveMinute = travelTime % 60

let viewController = SetReadyInfoViewController(viewModel: viewModel)

navigationController?.pushViewController(viewController, animated: true)
}

@objc
func enterReadyButtonDidTap() {
guard let promiseName = viewModel.promiseInfo.value?.promiseName,
let readyInfo = viewModel.myReadyInfo.value else {
return
}

let viewController = SetReadyInfoViewController(
viewModel: SetReadyInfoViewModel(
promiseID: viewModel.promiseID,
promiseTime: readyInfo.promiseTime,
promiseName: promiseName,
service: PromiseService()
)
)

navigationController?.pushViewController(viewController, animated: true)
}
}

Expand All @@ -130,7 +204,7 @@ extension ReadyStatusViewController: UICollectionViewDataSource {
_ collectionView: UICollectionView,
numberOfItemsInSection section: Int
) -> Int {
return 0
return viewModel.participantList.value.count
}

func collectionView(
Expand All @@ -145,6 +219,27 @@ extension ReadyStatusViewController: UICollectionViewDataSource {
return UICollectionViewCell()
}

let info = viewModel.participantList.value[indexPath.row]

switch info.state {
case "꾸물중":
cell.readyStatusButton.setupButton("꾸물중", .none)
case "준비중":
cell.readyStatusButton.setupButton("준비중", .ready)
case "이동중":
cell.readyStatusButton.setupButton("이동중", .move)
case "도착":
cell.readyStatusButton.setupButton("도착", .done)
default:
break
}

cell.nameLabel.text = info.name
cell.profileImageView.kf.setImage(
with: URL(string: info.profileImageURL ?? ""),
placeholder: UIImage.imgProfile
)

return cell
}
}
44 changes: 43 additions & 1 deletion KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@ class PromiseViewModel {
let promiseID: Int
let currentPageIndex = ObservablePattern<Int>(0)
let promiseInfo = ObservablePattern<PromiseInfoModel?>(nil)
let myReadyInfo = ObservablePattern<MyReadyStatusModel?>(nil)
let isPastDue = ObservablePattern<Bool?>(nil)
let penalty = ObservablePattern<String?>(nil)
let dDay = ObservablePattern<Int?>(nil)
let requestReadyTime = ObservablePattern<[String]>(["", "", "", ""])
let participantList = ObservablePattern<[Participant]>([])
let tardyList = ObservablePattern<[Comer]>([])

let isFinishSuccess = ObservablePattern<Bool?>(nil)
let errorMessage = ObservablePattern<String?>(nil)

Expand Down Expand Up @@ -62,6 +63,33 @@ private extension PromiseViewModel {

dDay.value = components.day
}

func calculateReadyInfo() {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "HH시 mm분"

guard let promiseTime = myReadyInfo.value?.promiseTime,
let promiseDate = dateFormatter.date(from: promiseTime),
let preparationTime = myReadyInfo.value?.preparationTime,
let travelTime = myReadyInfo.value?.travelTime else {
return
}

let readyStartTime = promiseDate.addingTimeInterval(-TimeInterval(preparationTime + travelTime + 10) * 60)
let moveStartTime = promiseDate.addingTimeInterval(-TimeInterval(travelTime + 10) * 60)
let preparationHours = preparationTime / 60
let preparationMinutes = preparationTime % 60
let travelHours = travelTime / 60
let travelMinutes = travelTime % 60

requestReadyTime.value[0] = timeFormatter.string(from: readyStartTime)
requestReadyTime.value[1] = timeFormatter.string(from: moveStartTime)
requestReadyTime.value[2] = preparationHours == 0 ? "\(preparationMinutes)" : "\(preparationHours)시간 \(preparationMinutes)"
requestReadyTime.value[3] = travelHours == 0 ? "\(travelMinutes)" : "\(travelHours)시간 \(travelMinutes)"
}
}

extension PromiseViewModel {
Expand All @@ -75,6 +103,16 @@ extension PromiseViewModel {
return !(isParticipant && !isPastDue)
}

func isReadyInfoEntered() -> Bool {
guard let isParticipant = promiseInfo.value?.isParticipant,
let _ = myReadyInfo.value?.preparationTime,
let _ = myReadyInfo.value?.travelTime else {
return false
}

return isParticipant
}

func showTardyScreen() -> TardyScreen {
guard let isPastDue = isPastDue.value else { return .tardyEmptyView }
let hasTardy = !tardyList.value.isEmpty
Expand Down Expand Up @@ -164,6 +202,10 @@ extension PromiseViewModel {
print(">>>>> \(String(describing: result)) : \(#function)")
return
}

myReadyInfo.value = result?.data

calculateReadyInfo()
} catch {
print(">>>>> \(error.localizedDescription) : \(#function)")
}
Expand Down

0 comments on commit 3c9b8bf

Please sign in to comment.