Skip to content

Commit

Permalink
Merge pull request #244 from OMZigak/feat/#240-promise-detail
Browse files Browse the repository at this point in the history
[feat] 약속 정보 및 지각 현황 API 연결
  • Loading branch information
youz2me authored Jul 19, 2024
2 parents d77b403 + f6197c4 commit aede74c
Show file tree
Hide file tree
Showing 24 changed files with 427 additions and 142 deletions.
22 changes: 16 additions & 6 deletions KkuMulKum.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@
DD3F9DD22C485753008E1FF7 /* UtilService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DD12C485753008E1FF7 /* UtilService.swift */; };
DD3F9DD42C4858A3008E1FF7 /* UtilTargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DD32C4858A3008E1FF7 /* UtilTargetType.swift */; };
DD3F9DD62C4988E2008E1FF7 /* RegisterMeetingsResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DD52C4988E2008E1FF7 /* RegisterMeetingsResponseModel.swift */; };
DD3F9DD82C49C25D008E1FF7 /* PagePromiseServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DD72C49C25D008E1FF7 /* PagePromiseServiceType.swift */; };
DD3F9DDA2C49F34D008E1FF7 /* ReadyStatusServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD86265D2C4606A300E4F980 /* ReadyStatusServiceType.swift */; };
DD41BEFA2C41D4160095A068 /* TardyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD41BEF92C41D4160095A068 /* TardyView.swift */; };
DD41BEFC2C41D54D0095A068 /* TardyPenaltyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD41BEFB2C41D54D0095A068 /* TardyPenaltyView.swift */; };
DD41BEFF2C41DAA40095A068 /* TardyEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD41BEFE2C41DAA40095A068 /* TardyEmptyView.swift */; };
Expand All @@ -135,7 +137,6 @@
DD8626672C4606A300E4F980 /* SetReadyInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8626592C4606A300E4F980 /* SetReadyInfoView.swift */; };
DD8626682C4606A300E4F980 /* ReadyStatusButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD86265A2C4606A300E4F980 /* ReadyStatusButton.swift */; };
DD8626692C4606A300E4F980 /* ReadyStatusProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD86265B2C4606A300E4F980 /* ReadyStatusProgressView.swift */; };
DD86266A2C4606A300E4F980 /* MockReadyStatusService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD86265D2C4606A300E4F980 /* MockReadyStatusService.swift */; };
DD86266B2C4606A300E4F980 /* ReadyStatusViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD86265F2C4606A300E4F980 /* ReadyStatusViewController.swift */; };
DD86266C2C4606A300E4F980 /* SetReadyInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8626602C4606A300E4F980 /* SetReadyInfoViewController.swift */; };
DD931B6E2C3DA27F00526452 /* ParticipantCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B6D2C3DA27F00526452 /* ParticipantCollectionViewCell.swift */; };
Expand Down Expand Up @@ -304,6 +305,7 @@
DD3F9DD12C485753008E1FF7 /* UtilService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilService.swift; sourceTree = "<group>"; };
DD3F9DD32C4858A3008E1FF7 /* UtilTargetType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilTargetType.swift; sourceTree = "<group>"; };
DD3F9DD52C4988E2008E1FF7 /* RegisterMeetingsResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterMeetingsResponseModel.swift; sourceTree = "<group>"; };
DD3F9DD72C49C25D008E1FF7 /* PagePromiseServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PagePromiseServiceType.swift; sourceTree = "<group>"; };
DD41BEF92C41D4160095A068 /* TardyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyView.swift; sourceTree = "<group>"; };
DD41BEFB2C41D54D0095A068 /* TardyPenaltyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyPenaltyView.swift; sourceTree = "<group>"; };
DD41BEFE2C41DAA40095A068 /* TardyEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyEmptyView.swift; sourceTree = "<group>"; };
Expand All @@ -328,7 +330,7 @@
DD8626592C4606A300E4F980 /* SetReadyInfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetReadyInfoView.swift; sourceTree = "<group>"; };
DD86265A2C4606A300E4F980 /* ReadyStatusButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadyStatusButton.swift; sourceTree = "<group>"; };
DD86265B2C4606A300E4F980 /* ReadyStatusProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadyStatusProgressView.swift; sourceTree = "<group>"; };
DD86265D2C4606A300E4F980 /* MockReadyStatusService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockReadyStatusService.swift; sourceTree = "<group>"; };
DD86265D2C4606A300E4F980 /* ReadyStatusServiceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadyStatusServiceType.swift; sourceTree = "<group>"; };
DD86265F2C4606A300E4F980 /* ReadyStatusViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadyStatusViewController.swift; sourceTree = "<group>"; };
DD8626602C4606A300E4F980 /* SetReadyInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetReadyInfoViewController.swift; sourceTree = "<group>"; };
DD931B6D2C3DA27F00526452 /* ParticipantCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantCollectionViewCell.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -764,6 +766,7 @@
DD39768D2C41CA0700E2A4C4 /* PagePromise */ = {
isa = PBXGroup;
children = (
DD3F9DD92C49CF05008E1FF7 /* Service */,
DD39768E2C41CABE00E2A4C4 /* ViewController */,
DD39768F2C41CAC700E2A4C4 /* ViewModel */,
DD3976902C41CACF00E2A4C4 /* View */,
Expand Down Expand Up @@ -855,6 +858,14 @@
path = ServiceType;
sourceTree = "<group>";
};
DD3F9DD92C49CF05008E1FF7 /* Service */ = {
isa = PBXGroup;
children = (
DD3F9DD72C49C25D008E1FF7 /* PagePromiseServiceType.swift */,
);
path = Service;
sourceTree = "<group>";
};
DD41BEFD2C41D85F0095A068 /* View */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -1036,7 +1047,7 @@
DD86265C2C4606A300E4F980 /* Service */ = {
isa = PBXGroup;
children = (
DD86265D2C4606A300E4F980 /* MockReadyStatusService.swift */,
DD86265D2C4606A300E4F980 /* ReadyStatusServiceType.swift */,
A39F2B202C499CE5008DA5F5 /* SetReadyStatusInfoServiceType.swift */,
);
path = Service;
Expand Down Expand Up @@ -1696,6 +1707,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
DD3F9DDA2C49F34D008E1FF7 /* ReadyStatusServiceType.swift in Sources */,
DDE7D2CC2C47F073005A921F /* PlaceModel.swift in Sources */,
DEFBEBD12C46B33000437188 /* SelectCapsuleButton.swift in Sources */,
DED5DBF22C34534A006ECE7E /* BaseCollectionReusableView.swift in Sources */,
Expand Down Expand Up @@ -1766,6 +1778,7 @@
DD3F9DD02C48571A008E1FF7 /* MeetingListServiceType.swift in Sources */,
A39F2B212C499CE5008DA5F5 /* SetReadyStatusInfoServiceType.swift in Sources */,
DE6D4D132C3F14D80005584B /* MeetingMemberCell.swift in Sources */,
DD3F9DD82C49C25D008E1FF7 /* PagePromiseServiceType.swift in Sources */,
DDAF1C932C3D6E3D008A37D3 /* PagePromiseViewController.swift in Sources */,
789D73BE2C47FE0F00C7077D /* AuthInterceptor.swift in Sources */,
789D73B32C47CC6D00C7077D /* LocalNotificationManager.swift in Sources */,
Expand Down Expand Up @@ -1800,7 +1813,6 @@
DECB845E2C4442AF0022A003 /* FindPlaceView.swift in Sources */,
DE6D4D0F2C3F14D80005584B /* MeetingInfoService.swift in Sources */,
DD3F9DD62C4988E2008E1FF7 /* RegisterMeetingsResponseModel.swift in Sources */,
DDE7D2C32C470A58005A921F /* ProfileTargetType.swift in Sources */,
DD3F9DCC2C485614008E1FF7 /* HomeServiceType.swift in Sources */,
DD39768A2C41C2AD00E2A4C4 /* HomeViewController.swift in Sources */,
DED5DBF42C34539A006ECE7E /* BaseTableViewCell.swift in Sources */,
Expand Down Expand Up @@ -1851,9 +1863,7 @@
DE0137D32C43C5E50088C777 /* MyPageView.swift in Sources */,
DE558C592C45954B008DAC4A /* SelectMemberViewController.swift in Sources */,
DD4909962C440CDC003ED304 /* ArriveView.swift in Sources */,
DD86266A2C4606A300E4F980 /* MockReadyStatusService.swift in Sources */,
789196342C486F6B00FF8CDF /* KeychainAccessible.swift in Sources */,
DD86266A2C4606A300E4F980 /* MockReadyStatusService.swift in Sources */,
DE254AB02C31195B00A4015E /* NSAttributedString+.swift in Sources */,
DD43937B2C412F4500EC1799 /* CreateMeetingViewController.swift in Sources */,
DD86266C2C4606A300E4F980 /* SetReadyInfoViewController.swift in Sources */,
Expand Down
2 changes: 1 addition & 1 deletion KkuMulKum/Application/SceneDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
DispatchQueue.main.async {
if success {
print("Auto login successful, showing main screen")
self?.showLoginScreen()
self?.showMainScreen()
} else {
print("Auto login failed, showing login screen")
self?.showLoginScreen()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import Foundation

struct MyReadyStatusModel: ResponseModelType {
let promiseTime: String
let preparationTime: Int
let travelTime: Int
let preparationStartAt: String
let departureAt: String
let arrivalAt: String
let preparationTime: Int?
let travelTime: Int?
let preparationStartAt: String?
let departureAt: String?
let arrivalAt: String?
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ import Foundation

struct PromiseInfoModel: ResponseModelType {
let promiseID: Int
let placeName, address, roadAddress, time, dressUpLevel, penalty: String
let promiseName, placeName, address, roadAddress, time, dressUpLevel, penalty: String

enum CodingKeys: String, CodingKey {
case promiseID = "promiseId"
case promiseName
case placeName
case address
case roadAddress
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ final class AddPromiseCompleteViewController: BaseViewController {
rootViewController.navigationController?.pushViewController(
PagePromiseViewController(
promiseViewModel: PagePromiseViewModel(
promiseID: self.promiseID
promiseID: self.promiseID,
service: PromiseService()
)
),
animated: true
Expand Down
6 changes: 4 additions & 2 deletions KkuMulKum/Source/Home/ViewController/HomeViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ extension HomeViewController: UICollectionViewDelegateFlowLayout {
) {
let pagePromiseViewController = PagePromiseViewController(
promiseViewModel: PagePromiseViewModel(
promiseID: viewModel.upcomingPromiseList.value?.data?.promises[indexPath.item].promiseID ?? 0
promiseID: viewModel.upcomingPromiseList.value?.data?.promises[indexPath.item].promiseID ?? 0,
service: PromiseService()
)
)

Expand Down Expand Up @@ -390,7 +391,8 @@ private extension HomeViewController {
func todayButtonDidTap(_ sender: UIButton) {
let viewController = PagePromiseViewController(
promiseViewModel: PagePromiseViewModel(
promiseID: viewModel.nearestPromise.value?.data?.promiseID ?? 0
promiseID: viewModel.nearestPromise.value?.data?.promiseID ?? 0,
service: PromiseService()
)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@ extension MeetingInfoViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let pagePromiseViewController = PagePromiseViewController(
promiseViewModel: PagePromiseViewModel(
promiseID: viewModel.meetingPromises[indexPath.item].promiseID
promiseID: viewModel.meetingPromises[indexPath.item].promiseID,
service: PromiseService()
)
)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//
// PagePromiseServiceType.swift
// KkuMulKum
//
// Created by YOUJIM on 7/19/24.
//

import Foundation

protocol PagePromiseServiceType {
func fetchPromiseInfo(with promiseId: Int) async throws -> ResponseBodyDTO<PromiseInfoModel>?
}

extension PromiseService: PagePromiseServiceType {
func fetchPromiseInfo(with promiseId: Int) async throws -> ResponseBodyDTO<PromiseInfoModel>? {
return try await request(
with: .fetchPromiseInfo(
promiseID: promiseId
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,16 @@ class PagePromiseViewController: BaseViewController {

private let promiseViewModel: PagePromiseViewModel

// TODO: 서버 연결 시 데이터 바인딩 필요
private var promiseViewControllerList: [BaseViewController] = []

private let promiseInfoViewController: PromiseInfoViewController

private let promiseInfoViewModel: PromiseInfoViewModel

private let readyStatusViewController: ReadyStatusViewController

private let readyStatusViewModel: ReadyStatusViewModel

private let tardyViewController: TardyViewController

private lazy var promiseSegmentedControl = PagePromiseSegmentedControl(
Expand All @@ -30,53 +35,36 @@ class PagePromiseViewController: BaseViewController {
navigationOrientation: .vertical
)

override func viewDidLoad() {
super.viewDidLoad()

setupNavigationBarBackButton()
}

// MARK: - LifeCycle

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

navigationController?.isNavigationBarHidden = false

}

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

navigationController?.isNavigationBarHidden = true
}


// MARK: Initialize
// MARK: Initializer

init(promiseViewModel: PagePromiseViewModel) {
self.promiseViewModel = promiseViewModel

// TODO: 네트워크 통신 필요
promiseViewModel.fetchPromiseInfo(promiseID: promiseViewModel.promiseID)

promiseInfoViewModel = PromiseInfoViewModel(
promiseID: promiseViewModel.promiseID,
promiseInfoService: PromiseService()
)

promiseInfoViewController = PromiseInfoViewController(
promiseInfoViewModel: PromiseInfoViewModel(
promiseInfoService: MockPromiseInfoService(),
promiseID: promiseViewModel.promiseID.value
)
promiseInfoViewModel: promiseInfoViewModel
)

readyStatusViewModel = ReadyStatusViewModel(
readyStatusService: PromiseService(),
promiseID: promiseViewModel.promiseID
)

readyStatusViewController = ReadyStatusViewController(
readyStatusViewModel: ReadyStatusViewModel(
readyStatusService: MockReadyStatusService(),
promiseID: promiseViewModel.promiseID.value
)
readyStatusViewModel: readyStatusViewModel
)

tardyViewController = TardyViewController(
tardyViewModel: TardyViewModel(
tardyService: MockTardyService(),
promiseID: promiseViewModel.promiseID.value
promiseID: promiseViewModel.promiseID
)
)

Expand All @@ -94,6 +82,30 @@ class PagePromiseViewController: BaseViewController {
}


// MARK: - LifeCycle

override func viewDidLoad() {
super.viewDidLoad()

setupNavigationBarBackButton()
setupBindings()
}


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

navigationController?.isNavigationBarHidden = false

}

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

navigationController?.isNavigationBarHidden = true
}


// MARK: - Setup

override func setupView() {
Expand Down Expand Up @@ -148,7 +160,6 @@ class PagePromiseViewController: BaseViewController {
}

override func setupDelegate() {
promisePageViewController.delegate = self
promisePageViewController.dataSource = self
}
}
Expand Down Expand Up @@ -186,14 +197,6 @@ extension PagePromiseViewController {
}



// MARK: - UIPageViewControllerDelegate

extension PagePromiseViewController: UIPageViewControllerDelegate {

}


// MARK: - UIPageViewControllerDataSource

extension PagePromiseViewController: UIPageViewControllerDataSource {
Expand All @@ -211,3 +214,16 @@ extension PagePromiseViewController: UIPageViewControllerDataSource {
return nil
}
}

private extension PagePromiseViewController {
func setupBindings() {
promiseViewModel.promiseInfo.bind { [weak self] model in
guard let model else { return }
DispatchQueue.main.async {
self?.setupNavigationBarTitle(with: model.promiseName)
self?.promiseInfoViewModel.promiseInfo.value = model
self?.readyStatusViewModel.promiseName.value = model.promiseName
}
}
}
}
Loading

0 comments on commit aede74c

Please sign in to comment.