From 81f9369ca70df2e246355255c7b39323cd4900a7 Mon Sep 17 00:00:00 2001 From: mmaybei Date: Fri, 19 Jul 2024 08:12:59 +0900 Subject: [PATCH] =?UTF-8?q?feat/#241=20=EC=A4=80=EB=B9=84/=EC=9D=B4?= =?UTF-8?q?=EB=8F=99/=EB=8F=84=EC=B0=A9=20=EC=8B=9C=EA=B0=84=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20API=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/ServiceType/HomeServiceType.swift | 34 +++++++++ .../ViewController/HomeViewController.swift | 73 +++++++++++-------- .../Source/Home/ViewModel/HomeViewModel.swift | 57 ++++++++++++++- .../ViewModel/SetReadyInfoViewModel.swift | 1 - 4 files changed, 130 insertions(+), 35 deletions(-) diff --git a/KkuMulKum/Source/Home/ServiceType/HomeServiceType.swift b/KkuMulKum/Source/Home/ServiceType/HomeServiceType.swift index d7a4f77a..17a63586 100644 --- a/KkuMulKum/Source/Home/ServiceType/HomeServiceType.swift +++ b/KkuMulKum/Source/Home/ServiceType/HomeServiceType.swift @@ -13,9 +13,31 @@ protocol HomeServiceType { func fetchLoginUser() async throws -> ResponseBodyDTO? func fetchNearestPromise() async throws -> ResponseBodyDTO? func fetchUpcomingPromise() async throws -> ResponseBodyDTO? + + func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? + func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? + func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? } extension HomeService: HomeServiceType { + func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .updatePreparationStatus(promiseID: promiseID) + ) + } + + func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .updateDepartureStatus(promiseID: promiseID) + ) + } + + func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .updateArrivalStatus(promiseID: promiseID) + ) + } + func fetchLoginUser() async throws -> ResponseBodyDTO? { return try await request(with: .fetchLoginUser) } @@ -30,6 +52,18 @@ extension HomeService: HomeServiceType { } final class MockHomeService: HomeServiceType { + func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + return nil + } + + func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + return nil + } + + func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + return nil + } + func fetchLoginUser() async throws -> ResponseBodyDTO? { let mockData = ResponseBodyDTO( success: true, diff --git a/KkuMulKum/Source/Home/ViewController/HomeViewController.swift b/KkuMulKum/Source/Home/ViewController/HomeViewController.swift index 97231eb7..1fce438e 100644 --- a/KkuMulKum/Source/Home/ViewController/HomeViewController.swift +++ b/KkuMulKum/Source/Home/ViewController/HomeViewController.swift @@ -48,8 +48,6 @@ class HomeViewController: BaseViewController { view.backgroundColor = .maincolor register() - updateUI() - updateUserInfo() updateNearestPromise() updateUpcomingPromise() @@ -57,6 +55,8 @@ class HomeViewController: BaseViewController { viewModel.requestLoginUser() viewModel.requestNearestPromise() viewModel.requestUpcomingPromise() + + bindViewModel() } override func viewWillAppear(_ animated: Bool) { @@ -188,17 +188,43 @@ private extension HomeViewController { ) } - func updateUI() { - viewModel.currentState.bind { [weak self] state in - switch state { - case .prepare: - self?.setPrepareUI() - case .move: - self?.setMoveUI() - case .arrive: - self?.setArriveUI() - case .none: - break + func bindViewModel() { + viewModel.isPreapreSucceedToSave.bind { [weak self] _ in + if self?.viewModel.isPreapreSucceedToSave.value == true { + DispatchQueue.main.async { + self?.setPrepareUI() + self?.rootView.todayPromiseView.prepareTimeLabel.setText( + self?.viewModel.homePrepareTime ?? "", + style: .caption02, + color: .gray8 + ) + } + } + } + + viewModel.isMoveSucceedToSave.bind { [weak self] _ in + if self?.viewModel.isMoveSucceedToSave.value == true { + DispatchQueue.main.async { + self?.setMoveUI() + self?.rootView.todayPromiseView.moveTimeLabel.setText( + self?.viewModel.homeMoveTime ?? "", + style: .caption02, + color: .gray8 + ) + } + } + } + + viewModel.isArriveSucceedToSave.bind { [weak self] _ in + if self?.viewModel.isArriveSucceedToSave.value == true { + DispatchQueue.main.async { + self?.setArriveUI() + self?.rootView.todayPromiseView.arriveTimeLabel.setText( + self?.viewModel.homeArriveTime ?? "", + style: .caption02, + color: .gray8 + ) + } } } } @@ -402,31 +428,16 @@ private extension HomeViewController { @objc func prepareButtonDidTap(_ sender: UIButton) { - viewModel.updateState(newState: .prepare) - rootView.todayPromiseView.prepareTimeLabel.setText( - viewModel.homePrepareTime, - style: .caption02, - color: .gray8 - ) + viewModel.updatePrepareStatus() } @objc func moveButtonDidTap(_ sender: UIButton) { - viewModel.updateState(newState: .move) - rootView.todayPromiseView.moveTimeLabel.setText( - viewModel.homeMoveTime, - style: .caption02, - color: .gray8 - ) + viewModel.updateMoveStatus() } @objc func arriveButtonDidTap(_ sender: UIButton) { - viewModel.updateState(newState: .arrive) - rootView.todayPromiseView.arriveTimeLabel.setText( - viewModel.homeArriveTime, - style: .caption02, - color: .gray8 - ) + viewModel.updateArriveStatus() } } diff --git a/KkuMulKum/Source/Home/ViewModel/HomeViewModel.swift b/KkuMulKum/Source/Home/ViewModel/HomeViewModel.swift index aa791aba..5ddde271 100644 --- a/KkuMulKum/Source/Home/ViewModel/HomeViewModel.swift +++ b/KkuMulKum/Source/Home/ViewModel/HomeViewModel.swift @@ -17,7 +17,7 @@ enum ReadyState { } final class HomeViewModel { - var currentState = ObservablePattern(.none) + var promiseID = ObservablePattern?(nil) var loginUser = ObservablePattern?>(nil) var nearestPromise = ObservablePattern?>(nil) @@ -26,6 +26,10 @@ final class HomeViewModel { var levelName = ObservablePattern("") var levelCaption = ObservablePattern("") + var isPreapreSucceedToSave = ObservablePattern(false) + var isMoveSucceedToSave = ObservablePattern(false) + var isArriveSucceedToSave = ObservablePattern(false) + private let service: HomeServiceType init(service: HomeServiceType) { @@ -42,8 +46,7 @@ final class HomeViewModel { $0.pmSymbol = "PM" } - func updateState(newState: ReadyState) { - currentState.value = newState + private func updateState(newState: ReadyState) { let currentTimeString = dateFormatter.string(from: Date()) switch newState { case .prepare: @@ -84,6 +87,54 @@ final class HomeViewModel { } } + func updatePrepareStatus() { + Task { + do { + guard let responseBody = try await service.updatePreparationStatus(with: nearestPromise.value?.data?.promiseID ?? 1) + else { + isPreapreSucceedToSave.value = false + return + } + isPreapreSucceedToSave.value = responseBody.success + updateState(newState: .prepare) + } catch { + print(">>> \(error.localizedDescription) : \(#function)") + } + } + } + + func updateMoveStatus() { + Task { + do { + guard let responseBody = try await service.updateDepartureStatus(with: nearestPromise.value?.data?.promiseID ?? 1) + else { + isMoveSucceedToSave.value = false + return + } + isMoveSucceedToSave.value = responseBody.success + updateState(newState: .move) + } catch { + print(">>> \(error.localizedDescription) : \(#function)") + } + } + } + + func updateArriveStatus() { + Task { + do { + guard let responseBody = try await service.updateArrivalStatus(with: nearestPromise.value?.data?.promiseID ?? 1) + else { + isArriveSucceedToSave.value = false + return + } + isArriveSucceedToSave.value = responseBody.success + updateState(newState: .arrive) + } catch { + print(">>> \(error.localizedDescription) : \(#function)") + } + } + } + func requestLoginUser() { Task { do { diff --git a/KkuMulKum/Source/Promise/ReadyStatus/ViewModel/SetReadyInfoViewModel.swift b/KkuMulKum/Source/Promise/ReadyStatus/ViewModel/SetReadyInfoViewModel.swift index d1fb8bcd..a18fae31 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/ViewModel/SetReadyInfoViewModel.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/ViewModel/SetReadyInfoViewModel.swift @@ -20,7 +20,6 @@ final class SetReadyInfoViewModel { let moveMinute = ObservablePattern("") let isSucceedToSave = ObservablePattern(false) - // TODO: 준비 및 이동 시간 분 단위로 계산 var readyTime: Int = 0 var moveTime: Int = 0