Skip to content

Commit

Permalink
Merge pull request #248 from OMZigak/feat/#241-timeAPI
Browse files Browse the repository at this point in the history
[feat] 준비/이동/도착 시간 업데이트 API 및 준비 현황 API 연결
  • Loading branch information
mmaybei authored Jul 19, 2024
2 parents e983f09 + 94f70fd commit 5821927
Show file tree
Hide file tree
Showing 4 changed files with 174 additions and 59 deletions.
5 changes: 4 additions & 1 deletion KkuMulKum/Network/TargetType/HomeTargetType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ enum HomeTargetType {
case updatePreparationStatus(promiseID: Int)
case updateDepartureStatus(promiseID: Int)
case updateArrivalStatus(promiseID: Int)
case fetchMyReadyStatus(promiseID: Int)
}

extension HomeTargetType: TargetType {
Expand All @@ -42,12 +43,14 @@ extension HomeTargetType: TargetType {
return "/api/v1/promises/\(promiseID)/departure"
case .updateArrivalStatus(let promiseID):
return "/api/v1/promises/\(promiseID)/arrival"
case .fetchMyReadyStatus(let promiseID):
return "/api/v1/promises/\(promiseID)/status"
}
}

var method: Moya.Method {
switch self {
case .fetchLoginUser, .fetchNearestPromise, .fetchUpcomingPromise:
case .fetchLoginUser, .fetchNearestPromise, .fetchUpcomingPromise, .fetchMyReadyStatus:
return .get
case .updatePreparationStatus, .updateDepartureStatus, .updateArrivalStatus:
return .patch
Expand Down
43 changes: 43 additions & 0 deletions KkuMulKum/Source/Home/ServiceType/HomeServiceType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,36 @@ protocol HomeServiceType {
func fetchLoginUser() async throws -> ResponseBodyDTO<LoginUserModel>?
func fetchNearestPromise() async throws -> ResponseBodyDTO<NearestPromiseModel>?
func fetchUpcomingPromise() async throws -> ResponseBodyDTO<UpcomingPromiseListModel>?
func fetchMyReadyStatus(with promiseID: Int) async throws -> ResponseBodyDTO<MyReadyStatusModel>?

func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO<EmptyModel>?
func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO<EmptyModel>?
func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO<EmptyModel>?
}

extension HomeService: HomeServiceType {
func fetchMyReadyStatus(with promiseID: Int) async throws -> ResponseBodyDTO<MyReadyStatusModel>? {
return try await request(with: .fetchMyReadyStatus(promiseID: promiseID))
}

func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO<EmptyModel>? {
return try await request(
with: .updatePreparationStatus(promiseID: promiseID)
)
}

func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO<EmptyModel>? {
return try await request(
with: .updateDepartureStatus(promiseID: promiseID)
)
}

func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO<EmptyModel>? {
return try await request(
with: .updateArrivalStatus(promiseID: promiseID)
)
}

func fetchLoginUser() async throws -> ResponseBodyDTO<LoginUserModel>? {
return try await request(with: .fetchLoginUser)
}
Expand All @@ -30,6 +57,22 @@ extension HomeService: HomeServiceType {
}

final class MockHomeService: HomeServiceType {
func fetchMyReadyStatus(with promiseID: Int) async throws -> ResponseBodyDTO<MyReadyStatusModel>? {
return nil
}

func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO<EmptyModel>? {
return nil
}

func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO<EmptyModel>? {
return nil
}

func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO<EmptyModel>? {
return nil
}

func fetchLoginUser() async throws -> ResponseBodyDTO<LoginUserModel>? {
let mockData = ResponseBodyDTO<LoginUserModel>(
success: true,
Expand Down
78 changes: 47 additions & 31 deletions KkuMulKum/Source/Home/ViewController/HomeViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,15 @@ class HomeViewController: BaseViewController {
updateUserInfo()
updateNearestPromise()
updateUpcomingPromise()

viewModel.requestLoginUser()
viewModel.requestNearestPromise()
viewModel.requestUpcomingPromise()
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.isNavigationBarHidden = true

viewModel.requestLoginUser()
viewModel.requestNearestPromise()
viewModel.requestUpcomingPromise()
}

override func setupAction() {
Expand Down Expand Up @@ -191,15 +191,17 @@ 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
DispatchQueue.main.async {
switch state {
case .prepare:
self?.setPrepareUI()
case .move:
self?.setMoveUI()
case .arrive:
self?.setArriveUI()
case .none:
break
}
}
}
}
Expand Down Expand Up @@ -341,6 +343,10 @@ private extension HomeViewController {
rootView.todayPromiseView.moveLabel.isHidden = false

rootView.todayPromiseView.prepareLineView.isHidden = false

rootView.todayPromiseView.prepareTimeLabel.setText(
self.viewModel.myReadyStatus.value?.data?.preparationStartAt ?? "", style: .caption02, color: .gray8
)
}

func setMoveUI() {
Expand All @@ -349,6 +355,7 @@ private extension HomeViewController {
setProgressButton(rootView.todayPromiseView.moveButton)
setEnableButton(rootView.todayPromiseView.arriveButton)

rootView.todayPromiseView.prepareButton.isEnabled = false
rootView.todayPromiseView.moveButton.isEnabled = false
rootView.todayPromiseView.arriveButton.isEnabled = true

Expand All @@ -360,14 +367,24 @@ private extension HomeViewController {
rootView.todayPromiseView.arriveLabel.isHidden = false

rootView.todayPromiseView.prepareCheckView.isHidden = false

rootView.todayPromiseView.prepareLineView.isHidden = false
rootView.todayPromiseView.moveLineView.isHidden = false

rootView.todayPromiseView.prepareTimeLabel.setText(
self.viewModel.myReadyStatus.value?.data?.preparationStartAt ?? "", style: .caption02, color: .gray8
)
rootView.todayPromiseView.moveTimeLabel.setText(
self.viewModel.myReadyStatus.value?.data?.departureAt ?? "", style: .caption02, color: .gray8
)
}

func setArriveUI() {
setCompleteButton(rootView.todayPromiseView.prepareButton)
setCompleteButton(rootView.todayPromiseView.moveButton)
setCompleteButton(rootView.todayPromiseView.arriveButton)

rootView.todayPromiseView.prepareButton.isEnabled = false
rootView.todayPromiseView.moveButton.isEnabled = false
rootView.todayPromiseView.arriveButton.isEnabled = false

Expand All @@ -379,9 +396,23 @@ private extension HomeViewController {
rootView.todayPromiseView.moveLabel.isHidden = true
rootView.todayPromiseView.arriveLabel.isHidden = true

rootView.todayPromiseView.prepareCheckView.isHidden = false
rootView.todayPromiseView.moveCheckView.isHidden = false
rootView.todayPromiseView.arriveCheckView.isHidden = false

rootView.todayPromiseView.prepareLineView.isHidden = false
rootView.todayPromiseView.moveLineView.isHidden = false
rootView.todayPromiseView.arriveLineView.isHidden = false

rootView.todayPromiseView.prepareTimeLabel.setText(
self.viewModel.myReadyStatus.value?.data?.preparationStartAt ?? "", style: .caption02, color: .gray8
)
rootView.todayPromiseView.moveTimeLabel.setText(
self.viewModel.myReadyStatus.value?.data?.departureAt ?? "", style: .caption02, color: .gray8
)
rootView.todayPromiseView.arriveTimeLabel.setText(
self.viewModel.myReadyStatus.value?.data?.arrivalAt ?? "", style: .caption02, color: .gray8
)
}


Expand All @@ -404,31 +435,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()
}
}
107 changes: 80 additions & 27 deletions KkuMulKum/Source/Home/ViewModel/HomeViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ final class HomeViewModel {
var loginUser = ObservablePattern<ResponseBodyDTO<LoginUserModel>?>(nil)
var nearestPromise = ObservablePattern<ResponseBodyDTO<NearestPromiseModel>?>(nil)
var upcomingPromiseList = ObservablePattern<ResponseBodyDTO<UpcomingPromiseListModel>?>(nil)
var myReadyStatus = ObservablePattern<ResponseBodyDTO<MyReadyStatusModel>?>(nil)

var levelName = ObservablePattern<String>("")
var levelCaption = ObservablePattern<String>("")
Expand All @@ -32,33 +33,8 @@ final class HomeViewModel {
self.service = service
}

var homePrepareTime: String = ""
var homeMoveTime: String = ""
var homeArriveTime: String = ""

private let dateFormatter = DateFormatter().then {
$0.dateFormat = "a hh:mm"
$0.amSymbol = "AM"
$0.pmSymbol = "PM"
}

func updateState(newState: ReadyState) {
currentState.value = newState
let currentTimeString = dateFormatter.string(from: Date())
switch newState {
case .prepare:
homePrepareTime = currentTimeString
case .move:
homeMoveTime = currentTimeString
case .arrive:
homeArriveTime = currentTimeString
case .none:
break
}
}

///서버에서 보내주는 level Int 값에 따른 levelName
func getLevelName(level: Int) -> String {
private func getLevelName(level: Int) -> String {
switch level {
case 1: return "빼꼼 꾸물이"
case 2: return "밍기적 꾸물이"
Expand All @@ -69,7 +45,7 @@ final class HomeViewModel {
}

///서버에서 보내주는 level Int 값에 따른 levelCaption
func getLevelCaption(level: Int) -> String {
private func getLevelCaption(level: Int) -> String {
switch level {
case 1:
return "꾸물꿈에 오신 것을 환영해요!\n정시 도착으로 캐릭터를 성장시켜 보세요."
Expand All @@ -84,6 +60,82 @@ final class HomeViewModel {
}
}

private func judgeReadyStatus() {
let data = myReadyStatus.value?.data
if data?.preparationStartAt == nil && data?.departureAt == nil && data?.arrivalAt == nil {
currentState.value = .none
} else if data?.preparationStartAt != nil && data?.departureAt == nil && data?.arrivalAt == nil {
currentState.value = .prepare
} else if data?.departureAt != nil && data?.arrivalAt == nil {
currentState.value = .move
} else if data?.arrivalAt != nil {
currentState.value = .arrive
}
}

func requestMyReadyStatus() {
Task {
do {
print(currentState.value)
myReadyStatus.value = try await service.fetchMyReadyStatus(
with: nearestPromise.value?.data?.promiseID ?? 1
)
judgeReadyStatus()
print(currentState.value)
} catch {
print(">>> \(error.localizedDescription) : \(#function)")
}
}
}

func updatePrepareStatus() {
Task {
do {
guard let responseBody = try await service.updatePreparationStatus(
with: nearestPromise.value?.data?.promiseID ?? 1
)
else {
return
}
currentState.value = .prepare
} catch {
print(">>> \(error.localizedDescription) : \(#function)")
}
}
}

func updateMoveStatus() {
Task {
do {
guard let responseBody = try await service.updateDepartureStatus(
with: nearestPromise.value?.data?.promiseID ?? 1
)
else {
return
}
currentState.value = .move
} catch {
print(">>> \(error.localizedDescription) : \(#function)")
}
}
}

func updateArriveStatus() {
Task {
do {
guard let responseBody = try await service.updateArrivalStatus(
with: nearestPromise.value?.data?.promiseID ?? 1
)
else {
return
}
currentState.value = .arrive
} catch {
print(">>> \(error.localizedDescription) : \(#function)")
}
}
}

func requestLoginUser() {
Task {
do {
Expand All @@ -100,6 +152,7 @@ final class HomeViewModel {
Task {
do {
nearestPromise.value = try await service.fetchNearestPromise()
requestMyReadyStatus()
} catch {
print(">>> \(error.localizedDescription) : \(#function)")
}
Expand Down

0 comments on commit 5821927

Please sign in to comment.