From 45679d28a9462f04b9b8acf74673c1c4d14b11b3 Mon Sep 17 00:00:00 2001 From: J0onYEong Date: Thu, 5 Sep 2024 12:19:20 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[IDLE-000]=20Feat,=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=A1=B0=ED=9A=8C=EC=8B=9C=20=EB=A1=9C=EC=BB=AC=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=EC=8B=9C=20=EC=BA=90?= =?UTF-8?q?=EC=8B=B1=EB=8D=B0=EC=9D=B4=ED=84=B0=20=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInfo/DefaultCenterProfileUseCase.swift | 8 +++++++- .../UserInfo/DefaultWorkerProfileUseCase.swift | 8 +++++++- .../WorkerRecruitmentPostBoardVM.swift | 12 ++++++++---- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/project/Projects/Domain/ConcreteUseCase/UserInfo/DefaultCenterProfileUseCase.swift b/project/Projects/Domain/ConcreteUseCase/UserInfo/DefaultCenterProfileUseCase.swift index e0d93d08..e7d44276 100644 --- a/project/Projects/Domain/ConcreteUseCase/UserInfo/DefaultCenterProfileUseCase.swift +++ b/project/Projects/Domain/ConcreteUseCase/UserInfo/DefaultCenterProfileUseCase.swift @@ -22,7 +22,13 @@ public class DefaultCenterProfileUseCase: CenterProfileUseCase { } public func getProfile(mode: ProfileMode) -> Single> { - convert(task: userProfileRepository.getCenterProfile(mode: mode)) + + if let cachedProfile = userInfoLocalRepository.getCurrentCenterData() { + // 캐쉬된 데이터 전송 + return .just(.success(cachedProfile)) + } + + return convert(task: userProfileRepository.getCenterProfile(mode: mode)) } public func updateProfile(phoneNumber: String?, introduction: String?, imageInfo: ImageUploadInfo?) -> Single> { diff --git a/project/Projects/Domain/ConcreteUseCase/UserInfo/DefaultWorkerProfileUseCase.swift b/project/Projects/Domain/ConcreteUseCase/UserInfo/DefaultWorkerProfileUseCase.swift index 9222d7a7..097b7474 100644 --- a/project/Projects/Domain/ConcreteUseCase/UserInfo/DefaultWorkerProfileUseCase.swift +++ b/project/Projects/Domain/ConcreteUseCase/UserInfo/DefaultWorkerProfileUseCase.swift @@ -22,7 +22,13 @@ public class DefaultWorkerProfileUseCase: WorkerProfileUseCase { } public func getProfile(mode: ProfileMode) -> Single> { - convert(task: userProfileRepository.getWorkerProfile(mode: mode)) + + if let cachedProfile = userInfoLocalRepository.getCurrentWorkerData() { + // Cache된 정보가 있는 경우 해당 값을 전달 + return .just(.success(cachedProfile)) + } + + return convert(task: userProfileRepository.getWorkerProfile(mode: mode)) } public func updateProfile(stateObject: WorkerProfileStateObject, imageInfo: ImageUploadInfo?) -> Single> { diff --git a/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift b/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift index 7920ae64..1196bd35 100644 --- a/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift +++ b/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift @@ -69,6 +69,7 @@ public class WorkerRecruitmentPostBoardVM: BaseViewModel, WorkerRecruitmentPostB // Init public weak var coordinator: WorkerRecruitmentBoardCoordinatable? public let recruitmentPostUseCase: RecruitmentPostUseCase + public let workerProfileUseCase: WorkerProfileUseCase // Paging /// 값이 nil이라면 요청을 보내지 않습니다. @@ -81,11 +82,13 @@ public class WorkerRecruitmentPostBoardVM: BaseViewModel, WorkerRecruitmentPostB public init( coordinator: WorkerRecruitmentBoardCoordinatable, - recruitmentPostUseCase: RecruitmentPostUseCase + recruitmentPostUseCase: RecruitmentPostUseCase, + workerProfileUseCase: WorkerProfileUseCase ) { self.coordinator = coordinator self.recruitmentPostUseCase = recruitmentPostUseCase + self.workerProfileUseCase = workerProfileUseCase super.init() @@ -94,9 +97,10 @@ public class WorkerRecruitmentPostBoardVM: BaseViewModel, WorkerRecruitmentPostB // MARK: 상단 위치정보 불러오기 workerLocationTitleText = requestWorkerLocation - .compactMap { [weak self] _ in - self?.fetchWorkerLocation() + .flatMap { [workerProfileUseCase] _ in + workerProfileUseCase.getProfile(mode: .myProfile) } + .map(<#T##transform: (Result) throws -> Result##(Result) throws -> Result#>) .asDriver(onErrorJustReturn: "위치정보확인불가") // MARK: 지원하기 @@ -283,7 +287,7 @@ public class WorkerRecruitmentPostBoardVM: BaseViewModel, WorkerRecruitmentPostB /// Test func fetchWorkerLocation() -> String { - "서울시 영등포구" + workerProfileUseCase.getProfile(mode: .myProfile) } } From de2ec913cf19776f8def6cf821a2a781020ad4f9 Mon Sep 17 00:00:00 2001 From: J0onYEong Date: Thu, 5 Sep 2024 12:32:14 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[IDLE-000]=20Feat,=20=EC=9A=94=EC=96=91?= =?UTF-8?q?=EB=B3=B4=ED=98=B8=EC=82=AC=20=EB=A9=94=EC=9D=B8=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=9C=84=EC=B9=98=20=ED=91=9C=EC=8B=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkerRecruitmentBoardCoordinator.swift | 3 +- .../WorkerRecruitmentPostBoardVM.swift | 28 +++++++++++++++---- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/project/Projects/App/Sources/RootCoordinator/Main/Worker/SubCoordinator/WorkerRecruitmentBoardCoordinator.swift b/project/Projects/App/Sources/RootCoordinator/Main/Worker/SubCoordinator/WorkerRecruitmentBoardCoordinator.swift index 2239c985..662d11bb 100644 --- a/project/Projects/App/Sources/RootCoordinator/Main/Worker/SubCoordinator/WorkerRecruitmentBoardCoordinator.swift +++ b/project/Projects/App/Sources/RootCoordinator/Main/Worker/SubCoordinator/WorkerRecruitmentBoardCoordinator.swift @@ -44,7 +44,8 @@ class WorkerRecruitmentBoardCoordinator: WorkerRecruitmentBoardCoordinatable { let vc = WorkerRecruitmentPostBoardVC() let vm = WorkerRecruitmentPostBoardVM( coordinator: self, - recruitmentPostUseCase: injector.resolve(RecruitmentPostUseCase.self) + recruitmentPostUseCase: injector.resolve(RecruitmentPostUseCase.self), + workerProfileUseCase: injector.resolve(WorkerProfileUseCase.self) ) vc.bind(viewModel: vm) viewControllerRef = vc diff --git a/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift b/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift index 1196bd35..7864bfa2 100644 --- a/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift +++ b/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift @@ -100,8 +100,18 @@ public class WorkerRecruitmentPostBoardVM: BaseViewModel, WorkerRecruitmentPostB .flatMap { [workerProfileUseCase] _ in workerProfileUseCase.getProfile(mode: .myProfile) } - .map(<#T##transform: (Result) throws -> Result##(Result) throws -> Result#>) - .asDriver(onErrorJustReturn: "위치정보확인불가") + .map { [weak self] result in + switch result { + case .success(let profileVO): + let address = profileVO.address.roadAddress + let locationText = self?.convertStringToLessThan3Words(target: address) + return locationText ?? "케어밋" + case .failure(let error): + printIfDebug("프로필 불러오기 실패", error.message) + return "케어밋" + } + } + .asDriver(onErrorJustReturn: "케어밋") // MARK: 지원하기 let applyRequest: PublishRelay = .init() @@ -285,9 +295,17 @@ public class WorkerRecruitmentPostBoardVM: BaseViewModel, WorkerRecruitmentPostB .disposed(by: dispostBag) } - /// Test - func fetchWorkerLocation() -> String { - workerProfileUseCase.getProfile(mode: .myProfile) + func convertStringToLessThan3Words(target: String) -> String { + let splited = target.split(separator: " ") + var resultParts: [String] = [] + for (index, part) in splited.enumerated() { + + if index >= 3 { break } + + let current = String(part) + resultParts.append(current) + } + return resultParts.joined(separator: " ") } } From c891e7f5bcd27e397436ed6ae24aa0712c8c6579 Mon Sep 17 00:00:00 2001 From: J0onYEong Date: Thu, 5 Sep 2024 12:44:36 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[IDLE-000]=20Feat,=20=EC=B9=B4=EB=93=9C=20C?= =?UTF-8?q?ell=EC=97=90=20=EB=8F=84=EB=B3=B4=EA=B1=B0=EB=A6=AC=20=ED=91=9C?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Card/Post/Worker/WorkerEmployCard.swift | 75 ++++++++++--------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/project/Projects/Presentation/DSKit/Sources/CommonUI/Card/Post/Worker/WorkerEmployCard.swift b/project/Projects/Presentation/DSKit/Sources/CommonUI/Card/Post/Worker/WorkerEmployCard.swift index d0639365..06711de3 100644 --- a/project/Projects/Presentation/DSKit/Sources/CommonUI/Card/Post/Worker/WorkerEmployCard.swift +++ b/project/Projects/Presentation/DSKit/Sources/CommonUI/Card/Post/Worker/WorkerEmployCard.swift @@ -13,10 +13,8 @@ import Entity public class WorkerNativeEmployCardRO { let showBiginnerTag: Bool - let showDayLeftTag: Bool - let dayLeftTagText: String? let titleText: String - let distanceFromWorkPlaceText: String + let timeDurationForWalkingText: String let targetInfoText: String let workDaysText: String let workTimeText: String @@ -25,10 +23,8 @@ public class WorkerNativeEmployCardRO { init( showBiginnerTag: Bool, - showDayLeftTag: Bool, - dayLeftTagText: String?, titleText: String, - distanceFromWorkPlaceText: String, + timeDurationForWalkingText: String, targetInfoText: String, workDaysText: String, workTimeText: String, @@ -36,10 +32,8 @@ public class WorkerNativeEmployCardRO { isFavorite: Bool ) { self.showBiginnerTag = showBiginnerTag - self.showDayLeftTag = showDayLeftTag - self.dayLeftTagText = dayLeftTagText self.titleText = titleText - self.distanceFromWorkPlaceText = distanceFromWorkPlaceText + self.timeDurationForWalkingText = timeDurationForWalkingText self.targetInfoText = targetInfoText self.workDaysText = workDaysText self.workTimeText = workTimeText @@ -49,13 +43,13 @@ public class WorkerNativeEmployCardRO { public static func create(vo: WorkerNativeEmployCardVO) -> WorkerNativeEmployCardRO { - var dayLeftTagText: String? = nil - var showDayLeftTag: Bool = false - - if (0...14).contains(vo.dayLeft) { - showDayLeftTag = true - dayLeftTagText = vo.dayLeft == 0 ? "D-Day" : "D-\(vo.dayLeft)" - } +// var dayLeftTagText: String? = nil +// var showDayLeftTag: Bool = false +// +// if (0...14).contains(vo.dayLeft) { +// showDayLeftTag = true +// dayLeftTagText = vo.dayLeft == 0 ? "D-Day" : "D-\(vo.dayLeft)" +// } let targetInfoText = "\(vo.careGrade.textForCellBtn)등급 \(vo.targetAge)세 \(vo.targetGender.twoLetterKoreanWord)" @@ -83,19 +77,12 @@ public class WorkerNativeEmployCardRO { let addressTitle = splittedAddress.joined(separator: " ") // distance는 미터단위입니다. - var distanceText: String = "\(vo.distanceFromWorkPlace)m" - - if vo.distanceFromWorkPlace >= 1000 { - let kilometers = Double(vo.distanceFromWorkPlace)/1000.0 - distanceText = String(format: "%.1fkm", kilometers) - } + let durationText = Self.timeForDistance(meter: vo.distanceFromWorkPlace) return .init( showBiginnerTag: vo.isBeginnerPossible, - showDayLeftTag: showDayLeftTag, - dayLeftTagText: dayLeftTagText, titleText: addressTitle, - distanceFromWorkPlaceText: distanceText, + timeDurationForWalkingText: durationText, targetInfoText: targetInfoText, workDaysText: workDaysText, workTimeText: workTimeText, @@ -106,16 +93,38 @@ public class WorkerNativeEmployCardRO { public static let `mock`: WorkerNativeEmployCardRO = .init( showBiginnerTag: true, - showDayLeftTag: true, - dayLeftTagText: "D-14", titleText: "사울시 강남동", - distanceFromWorkPlaceText: "1.1km", + timeDurationForWalkingText: "도보 15분 ~ 20분", targetInfoText: "1등급 54세 여성", workDaysText: "", workTimeText: "월, 화, 수", payText: "시급 5000원", isFavorite: true ) + + static func timeForDistance(meter: Int) -> String { + switch meter { + case 0..<200: + return "도보 5분 이내" + case 200..<400: + return "도보 5 ~ 10분" + case 400..<700: + return "도보 10 ~ 15분" + case 700..<1000: + return "도보 15 ~ 20분" + case 1000..<1250: + return "도보 20 ~ 25분" + case 1250..<1500: + return "도보 25 ~ 30분" + case 1500..<1750: + return "도보 30 ~ 35분" + case 1750..<2000: + return "도보 35 ~ 40분" + default: + return "도보 40분 ~" + } + } + } @@ -140,12 +149,12 @@ public class WorkerEmployCard: UIView { ) return tag }() - let dayLeftTag: TagLabel = { + let timeDurationForWorkingTag: TagLabel = { let tag = TagLabel( text: "", typography: .caption, textColor: DSKitAsset.Colors.gray300.color, - backgroundColor: DSKitAsset.Colors.gray100.color + backgroundColor: DSKitAsset.Colors.gray050.color ) return tag }() @@ -199,7 +208,7 @@ public class WorkerEmployCard: UIView { let tagStack = HStack( [ beginnerTag, - dayLeftTag + timeDurationForWorkingTag ], spacing: 4 ) @@ -345,10 +354,8 @@ public class WorkerEmployCard: UIView { public func bind(ro: WorkerNativeEmployCardRO) { beginnerTag.isHidden = !ro.showBiginnerTag - dayLeftTag.isHidden = !ro.showDayLeftTag - dayLeftTag.textString = ro.dayLeftTagText ?? "" + timeDurationForWorkingTag.textString = ro.timeDurationForWalkingText titleLabel.textString = ro.titleText - distanceFromWorkPlaceLabel.textString = ro.distanceFromWorkPlaceText serviceTargetInfoLabel.textString = ro.targetInfoText workDaysLabel.textString = ro.workDaysText workTimeLabel.textString = ro.workTimeText From 5515c36dfcbf72427e8863f52933ca28c1b51c37 Mon Sep 17 00:00:00 2001 From: J0onYEong Date: Thu, 5 Sep 2024 12:54:05 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[IDLE-000]=20Feat,=20=EB=B0=94=ED=85=80?= =?UTF-8?q?=EC=8B=9C=ED=8A=B8=20=EB=93=B1=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewController/BottomSheet/IdleBottomSheetVC.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/project/Projects/Presentation/Feature/Base/Sources/View/ViewController/BottomSheet/IdleBottomSheetVC.swift b/project/Projects/Presentation/Feature/Base/Sources/View/ViewController/BottomSheet/IdleBottomSheetVC.swift index 34a8a904..21ab2019 100644 --- a/project/Projects/Presentation/Feature/Base/Sources/View/ViewController/BottomSheet/IdleBottomSheetVC.swift +++ b/project/Projects/Presentation/Feature/Base/Sources/View/ViewController/BottomSheet/IdleBottomSheetVC.swift @@ -109,6 +109,13 @@ open class IdleBottomSheetVC: BaseViewController { /// 뷰 디스플레이 관련 extension IdleBottomSheetVC { + open override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + // 애니메이션 시작전에 해당뷰를 화면 밖으로 이동한다. + sheetView.transform = .init(translationX: 0, y: 1000) + } + /// viewDidAppear서브 뷰들의 레이아웃이 결정된 이후 시점(화면상에 나타난 시점)으로, frame, bounds에 근거있는 값들이 할당된 이후이다. public override func viewDidAppear(_ animated: Bool) { From 4cc52b7e25f9b4eff10a619a9115a7e59613c8e0 Mon Sep 17 00:00:00 2001 From: J0onYEong Date: Thu, 5 Sep 2024 13:07:48 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[IDLE-000]=20Refactor,=20=EC=84=BC=ED=84=B0?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=ED=99=94=EB=A9=B4=20=EB=84=A4?= =?UTF-8?q?=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entity/State/Profile/ProfileMode.swift | 2 +- .../Card/Post/Worker/WorkerEmployCard.swift | 20 +----- .../NativePostDetailForWorkerVM.swift | 3 +- .../Profile/CenterProfileViewController.swift | 68 ++++++------------- .../Profile/CenterProfileViewModel.swift | 17 ++++- .../RecruitmentPost/AppliedPostBoardVM.swift | 2 +- .../WorkerRecruitmentPostBoardVM.swift | 2 +- .../RecruitmentPost/StarredPostBoardVM.swift | 2 +- 8 files changed, 47 insertions(+), 69 deletions(-) diff --git a/project/Projects/Domain/Entity/State/Profile/ProfileMode.swift b/project/Projects/Domain/Entity/State/Profile/ProfileMode.swift index 89dbf706..0fcf8ee4 100644 --- a/project/Projects/Domain/Entity/State/Profile/ProfileMode.swift +++ b/project/Projects/Domain/Entity/State/Profile/ProfileMode.swift @@ -7,7 +7,7 @@ import Foundation -public enum ProfileMode { +public enum ProfileMode: Equatable { case myProfile case otherProfile(id: String) } diff --git a/project/Projects/Presentation/DSKit/Sources/CommonUI/Card/Post/Worker/WorkerEmployCard.swift b/project/Projects/Presentation/DSKit/Sources/CommonUI/Card/Post/Worker/WorkerEmployCard.swift index 06711de3..a55d154a 100644 --- a/project/Projects/Presentation/DSKit/Sources/CommonUI/Card/Post/Worker/WorkerEmployCard.swift +++ b/project/Projects/Presentation/DSKit/Sources/CommonUI/Card/Post/Worker/WorkerEmployCard.swift @@ -164,11 +164,6 @@ public class WorkerEmployCard: UIView { let label = IdleLabel(typography: .Subtitle2) return label }() - let distanceFromWorkPlaceLabel: IdleLabel = { - let label = IdleLabel(typography: .Body3) - label.attrTextColor = DSKitAsset.Colors.gray500.color - return label - }() let serviceTargetInfoLabel: IdleLabel = { let label = IdleLabel(typography: .Body2) @@ -229,16 +224,6 @@ public class WorkerEmployCard: UIView { starButton.heightAnchor.constraint(equalTo: starButton.widthAnchor), ]) - // MARK: Title & takenTimesForWalk - let titleStack = HStack( - [ - titleLabel, - distanceFromWorkPlaceLabel - ], - spacing: 8, - alignment: .bottom - ) - let divider = UIView() divider.backgroundColor = DSKitAsset.Colors.gray300.color @@ -310,7 +295,9 @@ public class WorkerEmployCard: UIView { tagStarStack, Spacer(height: 8), VStack( - [titleStack,serviceTargetInfoLabel], + [ + titleLabel, serviceTargetInfoLabel + ], spacing: 2, alignment: .leading ), @@ -345,7 +332,6 @@ public class WorkerEmployCard: UIView { public func setToPostAppearance() { titleLabel.typography = .Subtitle1 - distanceFromWorkPlaceLabel.isHidden = true serviceTargetInfoLabel.typography = .Body3 workDaysLabel.typography = .Body2 workTimeLabel.typography = .Body2 diff --git a/project/Projects/Presentation/Feature/Base/Sources/View/View/RecruitmentPost/Worker/Detail/ViewModel/NativePostDetailForWorkerVM.swift b/project/Projects/Presentation/Feature/Base/Sources/View/View/RecruitmentPost/Worker/Detail/ViewModel/NativePostDetailForWorkerVM.swift index 175e93da..f31632cd 100644 --- a/project/Projects/Presentation/Feature/Base/Sources/View/View/RecruitmentPost/Worker/Detail/ViewModel/NativePostDetailForWorkerVM.swift +++ b/project/Projects/Presentation/Feature/Base/Sources/View/View/RecruitmentPost/Worker/Detail/ViewModel/NativePostDetailForWorkerVM.swift @@ -269,7 +269,8 @@ public class NativePostDetailForWorkerVM: BaseViewModel ,NativePostDetailForWork } .asObservable() .subscribe(onNext: { [weak self] alertVO in - self?.alert.onNext(alertVO) + guard let self else { return } + alert.onNext(alertVO) }) diff --git a/project/Projects/Presentation/Feature/Center/Sources/View/Profile/CenterProfileViewController.swift b/project/Projects/Presentation/Feature/Center/Sources/View/Profile/CenterProfileViewController.swift index 1c3e6c58..9e01d47c 100644 --- a/project/Projects/Presentation/Feature/Center/Sources/View/Profile/CenterProfileViewController.swift +++ b/project/Projects/Presentation/Feature/Center/Sources/View/Profile/CenterProfileViewController.swift @@ -15,8 +15,9 @@ import BaseFeature public class CenterProfileViewController: BaseViewController { - let navigationBar: NavigationBarType1 = { - let bar = NavigationBarType1(navigationTitle: "내 센터 정보") + // View + lazy var navigationBar: IdleNavigationBar = { + let bar = IdleNavigationBar(innerViews: [profileEditButton, editingCompleteButton]) return bar }() @@ -27,7 +28,15 @@ public class CenterProfileViewController: BaseViewController { return btn }() - // View + let profileEditButton: TextButtonType2 = { + let button = TextButtonType2(labelText: "수정하기") + + button.label.typography = .Body3 + button.label.attrTextColor = DSKitAsset.Colors.gray300.color + button.layoutMargins = .init(top: 5.5, left:12, bottom: 5.5, right: 12) + button.layer.cornerRadius = 16 + return button + }() /// Center name label let centerNameLabel: IdleLabel = { @@ -48,16 +57,7 @@ public class CenterProfileViewController: BaseViewController { label.textString = "센터 상세 정보" return label }() - let profileEditButton: TextButtonType2 = { - let button = TextButtonType2(labelText: "수정하기") - - button.label.typography = .Body3 - button.label.attrTextColor = DSKitAsset.Colors.gray300.color - button.layoutMargins = .init(top: 5.5, left:12, bottom: 5.5, right: 12) - button.layer.cornerRadius = 16 - return button - }() - + /// ☑️ "전화번호" 라벨 ☑️ let centerPhoneNumeberTitleLabel: IdleLabel = { let label = IdleLabel(typography: .Subtitle4) @@ -134,26 +134,6 @@ public class CenterProfileViewController: BaseViewController { func setAutoLayout() { - // 상단 네비게이션바 세팅 - let navigationStack = HStack([ - navigationBar, - editingCompleteButton, - ]) - navigationStack.distribution = .equalSpacing - navigationStack.backgroundColor = .white - - let navigationStackBackground = UIView() - navigationStackBackground.addSubview(navigationStack) - navigationStack.translatesAutoresizingMaskIntoConstraints = false - navigationStackBackground.backgroundColor = .white - navigationStackBackground.layoutMargins = .init(top: 0, left: 12, bottom: 0, right: 28) - NSLayoutConstraint.activate([ - navigationStack.topAnchor.constraint(equalTo: navigationStackBackground.layoutMarginsGuide.topAnchor), - navigationStack.leadingAnchor.constraint(equalTo: navigationStackBackground.layoutMarginsGuide.leadingAnchor), - navigationStack.trailingAnchor.constraint(equalTo: navigationStackBackground.layoutMarginsGuide.trailingAnchor), - navigationStack.bottomAnchor.constraint(equalTo: navigationStackBackground.layoutMarginsGuide.bottomAnchor), - ]) - let locationIcon = UIImageView.locationMark locationIcon.tintColor = DSColor.gray700.color @@ -198,7 +178,6 @@ public class CenterProfileViewController: BaseViewController { divider, centerDetailLabel, - profileEditButton, centerPhoneNumberStack, @@ -212,23 +191,20 @@ public class CenterProfileViewController: BaseViewController { } [ - navigationStackBackground, + navigationBar, scrollView ].forEach { $0.translatesAutoresizingMaskIntoConstraints = false view.addSubview($0) } - // view 서브뷰 zindex설정 - navigationStackBackground.layer.zPosition = 1 - scrollView.layer.zPosition = 0 // 전체 뷰 NSLayoutConstraint.activate([ - navigationStackBackground.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), - navigationStackBackground.leadingAnchor.constraint(equalTo: view.leadingAnchor), - navigationStackBackground.trailingAnchor.constraint(equalTo: view.trailingAnchor), + navigationBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + navigationBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + navigationBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), - scrollView.topAnchor.constraint(equalTo: navigationStackBackground.bottomAnchor), + scrollView.topAnchor.constraint(equalTo: navigationBar.bottomAnchor), scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor), scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor), scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor) @@ -263,9 +239,6 @@ public class CenterProfileViewController: BaseViewController { centerDetailLabel.topAnchor.constraint(equalTo: divider.bottomAnchor, constant: 24), centerDetailLabel.leadingAnchor.constraint(equalTo: scrollView.layoutMarginsGuide.leadingAnchor), - profileEditButton.topAnchor.constraint(equalTo: divider.bottomAnchor, constant: 24), - profileEditButton.trailingAnchor.constraint(equalTo: scrollView.layoutMarginsGuide.trailingAnchor), - centerPhoneNumberStack.topAnchor.constraint(equalTo: centerDetailLabel.bottomAnchor, constant: 20), centerPhoneNumberStack.leadingAnchor.constraint(equalTo: scrollView.layoutMarginsGuide.leadingAnchor), centerPhoneNumberStack.trailingAnchor.constraint(equalTo: scrollView.layoutMarginsGuide.trailingAnchor), @@ -334,13 +307,16 @@ public class CenterProfileViewController: BaseViewController { } navigationBar - .eventPublisher + .backButton + .rx.tap .bind(to: input.exitButtonClicked) .disposed(by: disposeBag) // output guard let output = viewModel.output else { fatalError() } + navigationBar.titleLabel.textString = output.navigationBarTitle + output .centerName .drive(centerNameLabel.rx.textString) diff --git a/project/Projects/Presentation/Feature/Center/Sources/ViewModel/Profile/CenterProfileViewModel.swift b/project/Projects/Presentation/Feature/Center/Sources/ViewModel/Profile/CenterProfileViewModel.swift index 5fdf89ca..dcc753e5 100644 --- a/project/Projects/Presentation/Feature/Center/Sources/ViewModel/Profile/CenterProfileViewModel.swift +++ b/project/Projects/Presentation/Feature/Center/Sources/ViewModel/Profile/CenterProfileViewModel.swift @@ -40,6 +40,7 @@ public protocol CenterProfileInputable { } public protocol CenterProfileOutputable { + var navigationBarTitle: String { get } var centerName: Driver { get } var centerLocation: Driver { get } var centerPhoneNumber: Driver { get } @@ -269,7 +270,10 @@ public class CenterProfileViewModel: BaseViewModel, CenterProfileViewModelable { }) .disposed(by: disposeBag) + let navigationBarTitle = (mode == .myProfile ? "내 센터 정보" : "센터 정보") + self.output = .init( + navigationBarTitle: navigationBarTitle, centerName: centerNameDriver, centerLocation: centerAddressDriver, centerPhoneNumber: centerPhoneNumberDriver, @@ -306,6 +310,7 @@ public extension CenterProfileViewModel { class Output: CenterProfileOutputable { // 기본 데이터 + public let navigationBarTitle: String public var centerName: Driver public var centerLocation: Driver public var centerPhoneNumber: Driver @@ -318,7 +323,17 @@ public extension CenterProfileViewModel { // 요구사항 X public var editingValidation: Driver - init(centerName: Driver, centerLocation: Driver, centerPhoneNumber: Driver, centerIntroduction: Driver, displayingImage: Driver, isEditingMode: Driver, editingValidation: Driver) { + init( + navigationBarTitle: String, + centerName: Driver, + centerLocation: Driver, + centerPhoneNumber: Driver, + centerIntroduction: Driver, + displayingImage: Driver, + isEditingMode: Driver, + editingValidation: Driver + ) { + self.navigationBarTitle = navigationBarTitle self.centerName = centerName self.centerLocation = centerLocation self.centerPhoneNumber = centerPhoneNumber diff --git a/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/AppliedPostBoardVM.swift b/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/AppliedPostBoardVM.swift index 301b9177..aa49e317 100644 --- a/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/AppliedPostBoardVM.swift +++ b/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/AppliedPostBoardVM.swift @@ -149,7 +149,7 @@ public class AppliedPostBoardVM: BaseViewModel, WorkerPagablePostBoardVMable { Observable .merge(loadingEndObservables) - .delay(.milliseconds(500), scheduler: MainScheduler.instance) + .delay(.milliseconds(300), scheduler: MainScheduler.instance) .subscribe(self.dismissLoading) .disposed(by: disposeBag) } diff --git a/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift b/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift index 7864bfa2..d3ed925d 100644 --- a/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift +++ b/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/OnGoingPostBoard/WorkerRecruitmentPostBoardVM.swift @@ -290,7 +290,7 @@ public class WorkerRecruitmentPostBoardVM: BaseViewModel, WorkerRecruitmentPostB Observable .merge(loadingEndObservables) - .delay(.milliseconds(500), scheduler: MainScheduler.instance) + .delay(.milliseconds(300), scheduler: MainScheduler.instance) .subscribe(self.dismissLoading) .disposed(by: dispostBag) } diff --git a/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/StarredPostBoardVM.swift b/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/StarredPostBoardVM.swift index 7b57cb5c..6af08e59 100644 --- a/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/StarredPostBoardVM.swift +++ b/project/Projects/Presentation/Feature/Worker/Sources/ViewModel/RecruitmentPost/StarredPostBoardVM.swift @@ -190,7 +190,7 @@ public class StarredPostBoardVM: BaseViewModel, WorkerAppliablePostBoardVMable { Observable .merge(loadingEndObservables) - .delay(.milliseconds(500), scheduler: MainScheduler.instance) + .delay(.milliseconds(300), scheduler: MainScheduler.instance) .subscribe(self.dismissLoading) .disposed(by: disposeBag) }