From b3e8332c6210ccc394b231592c5ee13ff3a92282 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor <128480641+SungMinCho-Kor@users.noreply.github.com> Date: Fri, 22 Dec 2023 15:39:44 +0900 Subject: [PATCH 001/231] docs : make issue templates --- .github/ISSUE_TEMPLATE/issue-template.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/issue-template.md diff --git a/.github/ISSUE_TEMPLATE/issue-template.md b/.github/ISSUE_TEMPLATE/issue-template.md new file mode 100644 index 00000000..af52db4b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue-template.md @@ -0,0 +1,10 @@ +--- +name: issue template +about: issue template +title: '' +labels: '' +assignees: '' + +--- + +## ๐Ÿ“‹ Description From 8e037780a08abde6c37a3403befa670c7e8279e1 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor <128480641+SungMinCho-Kor@users.noreply.github.com> Date: Fri, 22 Dec 2023 15:40:23 +0900 Subject: [PATCH 002/231] chore : delete issue template --- .github/ISSUE_TEMPLATE/issue_template.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .github/ISSUE_TEMPLATE/issue_template.md diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md deleted file mode 100644 index d3947460..00000000 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ /dev/null @@ -1 +0,0 @@ -## ๐Ÿ“‹ Description From 3378eda140bf3aa2b4f137e1df44bb3ad9b2ebd0 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor <128480641+SungMinCho-Kor@users.noreply.github.com> Date: Fri, 22 Dec 2023 15:43:25 +0900 Subject: [PATCH 003/231] chore : update pull request template directory --- .../pull_request_template.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{PULL_REQUEST_TEMPLEATE => PULL_REQUEST_TEMPLATE}/pull_request_template.md (100%) diff --git a/.github/PULL_REQUEST_TEMPLEATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md similarity index 100% rename from .github/PULL_REQUEST_TEMPLEATE/pull_request_template.md rename to .github/PULL_REQUEST_TEMPLATE/pull_request_template.md From aba056db15393c2025004b8e7a95ae9ba305b15a Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor <128480641+SungMinCho-Kor@users.noreply.github.com> Date: Fri, 22 Dec 2023 15:44:58 +0900 Subject: [PATCH 004/231] chore : update pull request template directory --- .github/{PULL_REQUEST_TEMPLATE => }/pull_request_template.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{PULL_REQUEST_TEMPLATE => }/pull_request_template.md (100%) diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/pull_request_template.md similarity index 100% rename from .github/PULL_REQUEST_TEMPLATE/pull_request_template.md rename to .github/pull_request_template.md From 74627c91c51a71261e3cc3783274d09f559bde88 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor <128480641+SungMinCho-Kor@users.noreply.github.com> Date: Mon, 25 Dec 2023 08:41:38 +0900 Subject: [PATCH 005/231] chore : change issue number form --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c7951abc..64841c21 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,7 +1,7 @@ ## โญ๏ธ Issue Number -#number +- #number ## ๐Ÿšฉ Summary From 67800a313b06cdd812b085ef5c3770cf92f42664 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor <128480641+SungMinCho-Kor@users.noreply.github.com> Date: Mon, 25 Dec 2023 10:15:29 +0900 Subject: [PATCH 006/231] Update pull_request_template.md --- .github/pull_request_template.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 64841c21..6f35e0db 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -17,6 +17,11 @@ Content Content +## ๐Ÿ™‚ To Reviewr + +- Review Point +- Caution Point + ## ๐Ÿ“‹ To Do - From 8b8208f2807066fb7f9cc7187f1686a0209e7cab Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor <128480641+SungMinCho-Kor@users.noreply.github.com> Date: Mon, 25 Dec 2023 10:17:55 +0900 Subject: [PATCH 007/231] docs : Update PR template --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6f35e0db..dda41d08 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -17,7 +17,7 @@ Content Content -## ๐Ÿ™‚ To Reviewr +## ๐Ÿ™‚ To Reviwer - Review Point - Caution Point From 6a73acf7be3f85b56da6783faa82173707c33b4e Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Tue, 23 Jan 2024 01:34:54 +0900 Subject: [PATCH 008/231] =?UTF-8?q?build=20:=20Team=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=20(#100)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index c9c0eb34..c13d7c1e 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -985,7 +985,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = MMM58CZBQF; + DEVELOPMENT_TEAM = 7CQAR4CYZX; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = KCS/Resource/Info.plist; @@ -1020,7 +1020,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = MMM58CZBQF; + DEVELOPMENT_TEAM = 7CQAR4CYZX; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = KCS/Resource/Info.plist; From bedae37fcfb68c3786c53f27b7803538281d3157 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Tue, 23 Jan 2024 03:07:28 +0900 Subject: [PATCH 009/231] =?UTF-8?q?build=20:=20=EC=88=98=EC=B6=9C=20?= =?UTF-8?q?=EA=B7=9C=EC=A0=95=20=EC=A7=88=EB=AC=B8=20=EB=B0=A9=EC=A7=80=20?= =?UTF-8?q?=EB=B0=8F=20Secret=20=EC=B6=94=EA=B0=80=20(#100)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 1 + KCS/KCS/Resource/Info.plist | 2 ++ 2 files changed, 3 insertions(+) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index c13d7c1e..478a0285 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -923,6 +923,7 @@ }; 591A888C2B384E610059E40F /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 5986DCE82B390A8D005AE43B /* Secret.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; diff --git a/KCS/KCS/Resource/Info.plist b/KCS/KCS/Resource/Info.plist index 389f5f20..642871e0 100644 --- a/KCS/KCS/Resource/Info.plist +++ b/KCS/KCS/Resource/Info.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + DEV_SERVER_URL $(DEV_SERVER_URL) NMAP_CLIENT_ID From 35c75a958eaafa861da54f10d1eab682aab5226e Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 24 Jan 2024 01:14:04 +0900 Subject: [PATCH 010/231] =?UTF-8?q?refactor=20:=20summary=20view=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 20 +++-- .../Home/View/HomeViewController.swift | 4 +- .../Home/View/StoreInformationView.swift | 75 +++++++++++++++++++ ...ler.swift => SummaryInformationView.swift} | 62 +++++++-------- .../StoreInformationViewModelImpl.swift | 2 +- ...wift => SummaryInformationViewModel.swift} | 4 +- 6 files changed, 117 insertions(+), 50 deletions(-) create mode 100644 KCS/KCS/Presentation/Home/View/StoreInformationView.swift rename KCS/KCS/Presentation/Home/View/{StoreInformationViewController.swift => SummaryInformationView.swift} (77%) rename KCS/KCS/Presentation/Home/ViewModel/protocol/{StoreInformationViewModel.swift => SummaryInformationViewModel.swift} (82%) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 478a0285..00dde6dd 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -68,14 +68,15 @@ A81EFBC72B5D597400D0C0D7 /* Pretendard-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBBE2B5D597400D0C0D7 /* Pretendard-Bold.ttf */; }; A81EFBC82B5D597400D0C0D7 /* Pretendard-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */; }; A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */; }; + A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */; }; A89087042B4E7F3500767225 /* FilterButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087032B4E7F3500767225 /* FilterButton.swift */; }; A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; - A890870F2B4F836C00767225 /* StoreInformationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870E2B4F836C00767225 /* StoreInformationViewController.swift */; }; + A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870E2B4F836C00767225 /* SummaryInformationView.swift */; }; A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */; }; A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DA2B58B51A00540BD1 /* Date+.swift */; }; A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */; }; - A8ACB7DF2B594F4B00540BD1 /* StoreInformationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DE2B594F4B00540BD1 /* StoreInformationViewModel.swift */; }; + A8ACB7DF2B594F4B00540BD1 /* SummaryInformationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DE2B594F4B00540BD1 /* SummaryInformationViewModel.swift */; }; A8ACB7E22B594F7400540BD1 /* StoreInformationViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E12B594F7400540BD1 /* StoreInformationViewModelImpl.swift */; }; A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */; }; A8ACB7EA2B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */; }; @@ -164,14 +165,15 @@ A81EFBBE2B5D597400D0C0D7 /* Pretendard-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.ttf"; sourceTree = ""; }; A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Light.ttf"; sourceTree = ""; }; A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = ""; }; + A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationView.swift; sourceTree = ""; }; A89087032B4E7F3500767225 /* FilterButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterButton.swift; sourceTree = ""; }; A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; - A890870E2B4F836C00767225 /* StoreInformationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewController.swift; sourceTree = ""; }; + A890870E2B4F836C00767225 /* SummaryInformationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryInformationView.swift; sourceTree = ""; }; A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepositoryError.swift; sourceTree = ""; }; A8ACB7DA2B58B51A00540BD1 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedType.swift; sourceTree = ""; }; - A8ACB7DE2B594F4B00540BD1 /* StoreInformationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewModel.swift; sourceTree = ""; }; + A8ACB7DE2B594F4B00540BD1 /* SummaryInformationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryInformationViewModel.swift; sourceTree = ""; }; A8ACB7E12B594F7400540BD1 /* StoreInformationViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewModelImpl.swift; sourceTree = ""; }; A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetOpenClosedUseCase.swift; sourceTree = ""; }; A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetOpenClosedUseCaseImpl.swift; sourceTree = ""; }; @@ -357,11 +359,12 @@ isa = PBXGroup; children = ( 591A88802B384E600059E40F /* HomeViewController.swift */, - A890870E2B4F836C00767225 /* StoreInformationViewController.swift */, + A890870E2B4F836C00767225 /* SummaryInformationView.swift */, 59C306A32B4D7EBA00862625 /* Marker.swift */, A89087032B4E7F3500767225 /* FilterButton.swift */, A802D1F52B5277620091FDE7 /* CertificationLabel.swift */, 5977BE572B5524D500725C90 /* RefreshButton.swift */, + A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */, ); path = View; sourceTree = ""; @@ -515,7 +518,7 @@ isa = PBXGroup; children = ( 5977BE602B55374000725C90 /* HomeViewModel.swift */, - A8ACB7DE2B594F4B00540BD1 /* StoreInformationViewModel.swift */, + A8ACB7DE2B594F4B00540BD1 /* SummaryInformationViewModel.swift */, ); path = protocol; sourceTree = ""; @@ -766,7 +769,7 @@ files = ( A81EFBB52B5D477600D0C0D7 /* UILabel+.swift in Sources */, 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */, - A890870F2B4F836C00767225 /* StoreInformationViewController.swift in Sources */, + A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */, A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */, 5977BE612B55374000725C90 /* HomeViewModel.swift in Sources */, A89087042B4E7F3500767225 /* FilterButton.swift in Sources */, @@ -788,6 +791,7 @@ A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */, 5977BE9E2B59ACE800725C90 /* ImageCache.swift in Sources */, 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */, + A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */, 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, @@ -811,7 +815,7 @@ 59C306AD2B4FFAC700862625 /* StoreDTO.swift in Sources */, 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */, 5977BE982B5999E000725C90 /* FetchStoresUseCaseImpl.swift in Sources */, - A8ACB7DF2B594F4B00540BD1 /* StoreInformationViewModel.swift in Sources */, + A8ACB7DF2B594F4B00540BD1 /* SummaryInformationViewModel.swift in Sources */, A8ACB7F12B5AEBE300540BD1 /* GetStoreInformationUseCase.swift in Sources */, 591A887F2B384E600059E40F /* SceneDelegate.swift in Sources */, A8ACB7EF2B5AEBB900540BD1 /* GetStoreInformationUseCaseImpl.swift in Sources */, diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index a907458a..bfbc4595 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -173,7 +173,7 @@ final class HomeViewController: UIViewController { private var activatedFilter: [CertificationType] = [] - private var storeInformationViewController: StoreInformationViewController? + private var storeInformationViewController: SummaryInformationView? private let dismissObserver = PublishRelay() @@ -303,7 +303,7 @@ private extension HomeViewController { fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) ) let contentHeightObserver = PublishRelay() - storeInformationViewController = StoreInformationViewController( + storeInformationViewController = SummaryInformationView( viewModel: storeViewModel, contentHeightObserver: contentHeightObserver, dismissObserver: dismissObserver diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift new file mode 100644 index 00000000..4db8e9c4 --- /dev/null +++ b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift @@ -0,0 +1,75 @@ +// +// StoreInformationView.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 1/24/24. +// + +import UIKit + +final class StoreInformationView: UIView { + + lazy var summaryView: SummaryInformationView = { + let view = SummaryInformationView(viewModel: self.summaryViewModel) + view.translatesAutoresizingMaskIntoConstraints = false + + return view + }() + + let summaryViewModel: SummaryInformationViewModel + + init(summaryViewModel: SummaryInformationViewModel) { + self.summaryViewModel = summaryViewModel + super.init() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension StoreInformationView { + + func addUIComponents() { + addSubview(summaryView) + } + + func configureConstraints() { + + NSLayoutConstraint.activate([ + summaryView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor), + summaryView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor), + summaryView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor), + summaryView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor) + ]) + + } + +} + +//@objc +//extension StoreInformationView { +// +// func customViewDrag(_ recognizer: UIPanGestureRecognizer) { +// let transition = recognizer.translation(in: summaryView) +// let height = summaryView.bounds.height - transition.y +// +// recognizer.setTranslation(.zero, in: summaryView) +// +// if height > 230 && height < 620 { +// heightConstraint.constant = height +// } +// if recognizer.state == .ended { +// if heightConstraint.constant > 400 { +// heightConstraint.constant = 600 +// } else { +// heightConstraint.constant = 250 +// } +// UIView.animate(withDuration: 0.3) { [weak self] in +// self?.view.layoutIfNeeded() +// } +// } +// } +// +//} diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationViewController.swift b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift similarity index 77% rename from KCS/KCS/Presentation/Home/View/StoreInformationViewController.swift rename to KCS/KCS/Presentation/Home/View/SummaryInformationView.swift index 61e3e2f2..84739a25 100644 --- a/KCS/KCS/Presentation/Home/View/StoreInformationViewController.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift @@ -1,5 +1,5 @@ // -// StoreInformationViewController.swift +// SummaryInformationView.swift // KCS // // Created by ๊น€์˜ํ˜„ on 1/11/24. @@ -9,7 +9,7 @@ import UIKit import RxSwift import RxCocoa -final class StoreInformationViewController: UIViewController { +final class SummaryInformationView: UIView { private let disposeBag = DisposeBag() @@ -91,15 +91,11 @@ final class StoreInformationViewController: UIViewController { return view }() - private let viewModel: StoreInformationViewModel - private let contentHeightObserver: PublishRelay - private let dismissObserver: PublishRelay + private let viewModel: SummaryInformationViewModel - init(viewModel: StoreInformationViewModel, contentHeightObserver: PublishRelay, dismissObserver: PublishRelay) { + init(viewModel: SummaryInformationViewModel) { self.viewModel = viewModel - self.contentHeightObserver = contentHeightObserver - self.dismissObserver = dismissObserver - super.init(nibName: nil, bundle: nil) + super.init() setBackgroundColor() addUIComponents() @@ -107,16 +103,12 @@ final class StoreInformationViewController: UIViewController { bind() } - override func viewDidDisappear(_ animated: Bool) { - dismissObserver.accept(()) - } - required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } -private extension StoreInformationViewController { +private extension SummaryInformationView { func bind() { viewModel.thumbnailImageOutput @@ -135,25 +127,25 @@ private extension StoreInformationViewController { } func setBackgroundColor() { - view.backgroundColor = .white + backgroundColor = .white } func addUIComponents() { - view.addSubview(storeTitle) - view.addSubview(certificationStackView) - view.addSubview(category) - view.addSubview(storeOpenClosed) - view.addSubview(openingHour) - view.addSubview(storeImageView) - view.addSubview(storeCallButton) - view.addSubview(dismissIndicatorView) + addSubview(storeTitle) + addSubview(certificationStackView) + addSubview(category) + addSubview(storeOpenClosed) + addSubview(openingHour) + addSubview(storeImageView) + addSubview(storeCallButton) + addSubview(dismissIndicatorView) } func configureConstraints() { NSLayoutConstraint.activate([ - storeTitle.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 27), - storeTitle.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 16), - storeTitle.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -156) + storeTitle.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 27), + storeTitle.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor, constant: 16), + storeTitle.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -156) ]) NSLayoutConstraint.activate([ @@ -178,21 +170,22 @@ private extension StoreInformationViewController { NSLayoutConstraint.activate([ storeCallButton.topAnchor.constraint(equalTo: storeOpenClosed.bottomAnchor, constant: 21), + storeCallButton.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor), storeCallButton.leadingAnchor.constraint(equalTo: storeTitle.leadingAnchor), storeCallButton.widthAnchor.constraint(equalToConstant: 69), storeCallButton.heightAnchor.constraint(equalToConstant: 40) ]) NSLayoutConstraint.activate([ - storeImageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 27), - storeImageView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -16), + storeImageView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 27), + storeImageView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -16), storeImageView.widthAnchor.constraint(equalToConstant: 132), storeImageView.heightAnchor.constraint(equalToConstant: 132) ]) NSLayoutConstraint.activate([ - dismissIndicatorView.topAnchor.constraint(equalTo: view.topAnchor, constant: 8), - dismissIndicatorView.centerXAnchor.constraint(equalTo: view.centerXAnchor), + dismissIndicatorView.topAnchor.constraint(equalTo: topAnchor, constant: 8), + dismissIndicatorView.centerXAnchor.constraint(equalTo: centerXAnchor), dismissIndicatorView.widthAnchor.constraint(equalToConstant: 35), dismissIndicatorView.heightAnchor.constraint(equalToConstant: 4) ]) @@ -200,7 +193,7 @@ private extension StoreInformationViewController { } -extension StoreInformationViewController { +extension SummaryInformationView { func setUIContents(store: Store) { storeTitle.text = store.title @@ -224,16 +217,11 @@ extension StoreInformationViewController { openingHour: store.openingHour, url: store.localPhotos.first) ) - if storeTitle.numberOfVisibleLines > 1 { - contentHeightObserver.accept(253) - } else { - contentHeightObserver.accept(230) - } } } -private extension StoreInformationViewController { +private extension SummaryInformationView { func removeStackView() { let subviews = certificationStackView.arrangedSubviews diff --git a/KCS/KCS/Presentation/Home/ViewModel/StoreInformationViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/StoreInformationViewModelImpl.swift index 73758c9f..0369e48c 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/StoreInformationViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/StoreInformationViewModelImpl.swift @@ -8,7 +8,7 @@ import RxSwift import RxRelay -final class StoreInformationViewModelImpl: StoreInformationViewModel { +final class StoreInformationViewModelImpl: SummaryInformationViewModel { private let disposeBag = DisposeBag() diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/StoreInformationViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryInformationViewModel.swift similarity index 82% rename from KCS/KCS/Presentation/Home/ViewModel/protocol/StoreInformationViewModel.swift rename to KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryInformationViewModel.swift index 19bb156f..ed83c4da 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/StoreInformationViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryInformationViewModel.swift @@ -1,5 +1,5 @@ // -// StoreInformationViewModel.swift +// SummaryInformationViewModel.swift // KCS // // Created by ๊น€์˜ํ˜„ on 1/18/24. @@ -8,7 +8,7 @@ import RxSwift import RxRelay -protocol StoreInformationViewModel: StoreInformationViewModelInput, StoreInformationViewModelOutput { +protocol SummaryInformationViewModel: StoreInformationViewModelInput, StoreInformationViewModelOutput { var getOpenClosedUseCase: GetOpenClosedUseCase { get } var fetchImageUseCase: FetchImageUseCase { get } From a5a7eede7b40632efe2fb4000ee3ef99ab40b102 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 24 Jan 2024 03:02:10 +0900 Subject: [PATCH 011/231] =?UTF-8?q?refactor=20:=20UISheetPresentationViewC?= =?UTF-8?q?ontroller=20->=20UIView=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 8 +- KCS/KCS/Application/SceneDelegate.swift | 6 +- .../Home/View/HomeViewController.swift | 145 +++++++----------- .../Home/View/StoreInformationView.swift | 35 +++-- .../Home/View/SummaryInformationView.swift | 18 ++- ... => SummaryInformationViewModelImpl.swift} | 6 +- 6 files changed, 109 insertions(+), 109 deletions(-) rename KCS/KCS/Presentation/Home/ViewModel/{StoreInformationViewModelImpl.swift => SummaryInformationViewModelImpl.swift} (89%) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 00dde6dd..464b0b3f 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -77,7 +77,7 @@ A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DA2B58B51A00540BD1 /* Date+.swift */; }; A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */; }; A8ACB7DF2B594F4B00540BD1 /* SummaryInformationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DE2B594F4B00540BD1 /* SummaryInformationViewModel.swift */; }; - A8ACB7E22B594F7400540BD1 /* StoreInformationViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E12B594F7400540BD1 /* StoreInformationViewModelImpl.swift */; }; + A8ACB7E22B594F7400540BD1 /* SummaryInformationViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E12B594F7400540BD1 /* SummaryInformationViewModelImpl.swift */; }; A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */; }; A8ACB7EA2B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */; }; A8ACB7ED2B59647400540BD1 /* OpeningHourError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7EC2B59647400540BD1 /* OpeningHourError.swift */; }; @@ -174,7 +174,7 @@ A8ACB7DA2B58B51A00540BD1 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedType.swift; sourceTree = ""; }; A8ACB7DE2B594F4B00540BD1 /* SummaryInformationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryInformationViewModel.swift; sourceTree = ""; }; - A8ACB7E12B594F7400540BD1 /* StoreInformationViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewModelImpl.swift; sourceTree = ""; }; + A8ACB7E12B594F7400540BD1 /* SummaryInformationViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryInformationViewModelImpl.swift; sourceTree = ""; }; A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetOpenClosedUseCase.swift; sourceTree = ""; }; A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetOpenClosedUseCaseImpl.swift; sourceTree = ""; }; A8ACB7EC2B59647400540BD1 /* OpeningHourError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHourError.swift; sourceTree = ""; }; @@ -270,7 +270,7 @@ A8ACB7E02B594F5F00540BD1 /* protocol */, 5977BE652B553BA800725C90 /* HomeViewModelImpl.swift */, 5977BE672B553C8300725C90 /* HomeDependency.swift */, - A8ACB7E12B594F7400540BD1 /* StoreInformationViewModelImpl.swift */, + A8ACB7E12B594F7400540BD1 /* SummaryInformationViewModelImpl.swift */, ); path = ViewModel; sourceTree = ""; @@ -795,7 +795,7 @@ 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, - A8ACB7E22B594F7400540BD1 /* StoreInformationViewModelImpl.swift in Sources */, + A8ACB7E22B594F7400540BD1 /* SummaryInformationViewModelImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */, A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */, diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 97758015..636394b6 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -24,7 +24,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { fetchStoresUseCase: FetchStoresUseCaseImpl(repository: repository), getStoreInformationUseCase: GetStoreInformationUseCaseImpl(repository: repository) ) - window?.rootViewController = HomeViewController(viewModel: viewModel) + let summaryInformationViewModel = SummaryInformationViewModelImpl( + getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), + fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) + ) + window?.rootViewController = HomeViewController(viewModel: viewModel, summaryInformationViewModel: summaryInformationViewModel) window?.makeKeyAndVisible() } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index bfbc4595..61a9a1c6 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -101,15 +101,6 @@ final class HomeViewController: UIViewController { return map }() - - private lazy var locationBottomConstraint = locationButton.bottomAnchor.constraint( - equalTo: mapView.safeAreaLayoutGuide.bottomAnchor, - constant: -16 - ) - private lazy var refreshBottomConstraint = refreshButton.bottomAnchor.constraint( - equalTo: mapView.safeAreaLayoutGuide.bottomAnchor, - constant: -17 - ) private let requestLocationServiceAlert: UIAlertController = { let alertController = UIAlertController( @@ -171,16 +162,36 @@ final class HomeViewController: UIViewController { return button }() - private var activatedFilter: [CertificationType] = [] - - private var storeInformationViewController: SummaryInformationView? - - private let dismissObserver = PublishRelay() + private lazy var storeInformationView: StoreInformationView = { + let view = StoreInformationView( + summaryViewModel: summaryInformationViewModel, + summaryInformationHeightObserver: summaryInformationHeightObserver + ) + view.translatesAutoresizingMaskIntoConstraints = false + + return view + }() + private var activatedFilter: [CertificationType] = [] private let viewModel: HomeViewModel + private let summaryInformationViewModel: SummaryInformationViewModel + private lazy var storeInformationHeightConstraint = storeInformationView.heightAnchor.constraint(equalToConstant: 0) + private lazy var locationButtonBottomConstraint = locationButton.bottomAnchor.constraint( + equalTo: storeInformationView.topAnchor, + constant: -37 + ) + private lazy var refreshButtonBottomConstraint = refreshButton.bottomAnchor.constraint( + equalTo: storeInformationView.topAnchor, + constant: -37 + ) + private let summaryInformationHeightObserver = PublishRelay() - init(viewModel: HomeViewModel) { + init( + viewModel: HomeViewModel, + summaryInformationViewModel: SummaryInformationViewModel + ) { self.viewModel = viewModel + self.summaryInformationViewModel = summaryInformationViewModel super.init(nibName: nil, bundle: nil) } @@ -212,17 +223,26 @@ private extension HomeViewController { self.setMarker(marker: Marker(certificationType: filteredStore.type, position: location), tag: UInt($0.id)) } } - storeInformationViewController?.dismiss(animated: true) + storeInformationViewDismiss() } .disposed(by: disposeBag) viewModel.getStoreInformationOutput .bind { [weak self] store in guard let self = self else { return } - presentStoreView() - storeInformationViewController?.setUIContents(store: store) + storeInformationView.setUIContents(store: store) } .disposed(by: disposeBag) + + summaryInformationHeightObserver.bind { [weak self] height in + self?.storeInformationHeightConstraint.constant = height + self?.locationButtonBottomConstraint.constant = -16 + self?.refreshButtonBottomConstraint.constant = -16 + UIView.animate(withDuration: 0.3) { [weak self] in + self?.view.layoutIfNeeded() + } + } + .disposed(by: disposeBag) } func bindFilterButton(button: FilterButton, type: CertificationType) { @@ -266,9 +286,8 @@ private extension HomeViewController { if let clickedMarker = self?.clickedMarker { if clickedMarker == marker { return true } if clickedMarker.isSelected { - self?.storeInformationViewController?.dismiss(animated: true) { [weak self] in - self?.markerSelected(marker: marker) - } + self?.storeInformationViewDismiss() + self?.markerSelected(marker: marker) } else { self?.markerSelected(marker: marker) } @@ -288,47 +307,14 @@ private extension HomeViewController { clickedMarker = marker } - func markerClicked(height: CGFloat) { - mapView.mapView.logoMargin = UIEdgeInsets(top: 0, left: 0, bottom: height, right: 0) - locationBottomConstraint.constant = -height - refreshBottomConstraint.constant = -height - UIView.animate(withDuration: 0.3) { - self.view.layoutIfNeeded() - } - } - - func presentStoreView() { - let storeViewModel = StoreInformationViewModelImpl( - getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), - fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) - ) - let contentHeightObserver = PublishRelay() - storeInformationViewController = SummaryInformationView( - viewModel: storeViewModel, - contentHeightObserver: contentHeightObserver, - dismissObserver: dismissObserver - ) - storeInformationViewController?.transitioningDelegate = self - - if let viewController = storeInformationViewController { - contentHeightObserver - .bind { [weak self] contentHeight in - guard let self = self else { return } - let bottomSafeArea: CGFloat = 34 - let height = contentHeight - bottomSafeArea - if let sheet = viewController.sheetPresentationController { - let detentIdentifier = UISheetPresentationController.Detent.Identifier("detent") - let detent = UISheetPresentationController.Detent.custom(identifier: detentIdentifier) { _ in - return height - } - sheet.detents = [detent] - sheet.largestUndimmedDetentIdentifier = detentIdentifier - sheet.preferredCornerRadius = 15 - } - markerClicked(height: contentHeight - bottomSafeArea + 16) - } - .disposed(by: disposeBag) - present(viewController, animated: true) + func storeInformationViewDismiss() { + clickedMarker?.isSelected = false + clickedMarker = nil + storeInformationHeightConstraint.constant = 0 + locationButtonBottomConstraint.constant = -37 + refreshButtonBottomConstraint.constant = -37 + UIView.animate(withDuration: 0.3) { [weak self] in + self?.view.layoutIfNeeded() } } @@ -366,6 +352,7 @@ private extension HomeViewController { mapView.addSubview(locationButton) mapView.addSubview(filterButtonStackView) mapView.addSubview(refreshButton) + mapView.addSubview(storeInformationView) } func configureConstraints() { @@ -380,7 +367,7 @@ private extension HomeViewController { locationButton.leadingAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.leadingAnchor, constant: 16), locationButton.widthAnchor.constraint(equalToConstant: 48), locationButton.heightAnchor.constraint(equalToConstant: 48), - locationBottomConstraint + locationButtonBottomConstraint ]) NSLayoutConstraint.activate([ @@ -390,7 +377,14 @@ private extension HomeViewController { NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), - refreshBottomConstraint + refreshButtonBottomConstraint + ]) + + NSLayoutConstraint.activate([ + storeInformationView.leadingAnchor.constraint(equalTo: mapView.leadingAnchor, constant: 0), + storeInformationView.trailingAnchor.constraint(equalTo: mapView.trailingAnchor, constant: 0), + storeInformationView.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: 0), + storeInformationHeightConstraint ]) } @@ -454,28 +448,7 @@ extension HomeViewController: NMFMapViewCameraDelegate { extension HomeViewController: NMFMapViewTouchDelegate { func mapView(_ mapView: NMFMapView, didTapMap latlng: NMGLatLng, point: CGPoint) { - storeInformationViewController?.dismiss(animated: true) - } - -} - -extension HomeViewController: UIViewControllerTransitioningDelegate { - - func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { - dismissObserver - .bind { [weak self] in - guard let self = self else { return } - clickedMarker?.isSelected = false - mapView.mapView.logoMargin = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) - locationBottomConstraint.constant = -16 - refreshBottomConstraint.constant = -17 - UIView.animate(withDuration: 0.3) { - self.view.layoutIfNeeded() - } - } - .disposed(by: disposeBag) - - return nil + storeInformationViewDismiss() } } diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift index 4db8e9c4..c153751b 100644 --- a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift @@ -6,21 +6,30 @@ // import UIKit +import RxRelay final class StoreInformationView: UIView { - lazy var summaryView: SummaryInformationView = { - let view = SummaryInformationView(viewModel: self.summaryViewModel) + private lazy var summaryView: SummaryInformationView = { + let view = SummaryInformationView( + viewModel: summaryViewModel, + summaryInformationHeightObserver: summaryInformationHeightObserver + ) view.translatesAutoresizingMaskIntoConstraints = false return view }() - let summaryViewModel: SummaryInformationViewModel + private let summaryViewModel: SummaryInformationViewModel + private let summaryInformationHeightObserver: PublishRelay - init(summaryViewModel: SummaryInformationViewModel) { + init(summaryViewModel: SummaryInformationViewModel, summaryInformationHeightObserver: PublishRelay) { self.summaryViewModel = summaryViewModel - super.init() + self.summaryInformationHeightObserver = summaryInformationHeightObserver + super.init(frame: .zero) + + addUIComponents() + configureConstraints() } required init?(coder: NSCoder) { @@ -31,6 +40,14 @@ final class StoreInformationView: UIView { extension StoreInformationView { + func setUIContents(store: Store) { + summaryView.setUIContents(store: store) + } + +} + +private extension StoreInformationView { + func addUIComponents() { addSubview(summaryView) } @@ -38,10 +55,10 @@ extension StoreInformationView { func configureConstraints() { NSLayoutConstraint.activate([ - summaryView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor), - summaryView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor), - summaryView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor), - summaryView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor) + summaryView.topAnchor.constraint(equalTo: topAnchor), + summaryView.bottomAnchor.constraint(equalTo: bottomAnchor), + summaryView.leadingAnchor.constraint(equalTo: leadingAnchor), + summaryView.trailingAnchor.constraint(equalTo: trailingAnchor) ]) } diff --git a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift index 84739a25..3a499a2d 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift @@ -92,10 +92,12 @@ final class SummaryInformationView: UIView { }() private let viewModel: SummaryInformationViewModel + private let summaryInformationHeightObserver: PublishRelay - init(viewModel: SummaryInformationViewModel) { + init(viewModel: SummaryInformationViewModel, summaryInformationHeightObserver: PublishRelay) { self.viewModel = viewModel - super.init() + self.summaryInformationHeightObserver = summaryInformationHeightObserver + super.init(frame: .zero) setBackgroundColor() addUIComponents() @@ -143,9 +145,9 @@ private extension SummaryInformationView { func configureConstraints() { NSLayoutConstraint.activate([ - storeTitle.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 27), - storeTitle.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor, constant: 16), - storeTitle.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -156) + storeTitle.topAnchor.constraint(equalTo: topAnchor, constant: 27), + storeTitle.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + storeTitle.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -156) ]) NSLayoutConstraint.activate([ @@ -170,7 +172,6 @@ private extension SummaryInformationView { NSLayoutConstraint.activate([ storeCallButton.topAnchor.constraint(equalTo: storeOpenClosed.bottomAnchor, constant: 21), - storeCallButton.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor), storeCallButton.leadingAnchor.constraint(equalTo: storeTitle.leadingAnchor), storeCallButton.widthAnchor.constraint(equalToConstant: 69), storeCallButton.heightAnchor.constraint(equalToConstant: 40) @@ -217,6 +218,11 @@ extension SummaryInformationView { openingHour: store.openingHour, url: store.localPhotos.first) ) + if storeTitle.numberOfVisibleLines == 1 { + summaryInformationHeightObserver.accept(230) + } else { + summaryInformationHeightObserver.accept(253) + } } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/StoreInformationViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/SummaryInformationViewModelImpl.swift similarity index 89% rename from KCS/KCS/Presentation/Home/ViewModel/StoreInformationViewModelImpl.swift rename to KCS/KCS/Presentation/Home/ViewModel/SummaryInformationViewModelImpl.swift index 0369e48c..df509558 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/StoreInformationViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/SummaryInformationViewModelImpl.swift @@ -1,5 +1,5 @@ // -// StoreInformationViewModelImpl.swift +// SummaryInformationViewModelImpl.swift // KCS // // Created by ๊น€์˜ํ˜„ on 1/18/24. @@ -8,7 +8,7 @@ import RxSwift import RxRelay -final class StoreInformationViewModelImpl: SummaryInformationViewModel { +final class SummaryInformationViewModelImpl: SummaryInformationViewModel { private let disposeBag = DisposeBag() @@ -35,7 +35,7 @@ final class StoreInformationViewModelImpl: SummaryInformationViewModel { } -private extension StoreInformationViewModelImpl { +private extension SummaryInformationViewModelImpl { func setOpenClosed( openingHour: [RegularOpeningHours] From 37aabe4a3c1c74060e36fbb9e38d623577017b5c Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 24 Jan 2024 04:40:27 +0900 Subject: [PATCH 012/231] =?UTF-8?q?feat=20:=20StoreInformationView?= =?UTF-8?q?=EC=97=90=20=EC=A0=9C=EC=8A=A4=EC=B3=90=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 49 +++++++++++++++++-- .../Home/View/StoreInformationView.swift | 27 +--------- .../Home/View/SummaryInformationView.swift | 1 + 3 files changed, 46 insertions(+), 31 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 61a9a1c6..cf11721e 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -168,6 +168,7 @@ final class HomeViewController: UIViewController { summaryInformationHeightObserver: summaryInformationHeightObserver ) view.translatesAutoresizingMaskIntoConstraints = false + view.addGestureRecognizer(panGesture) return view }() @@ -185,6 +186,8 @@ final class HomeViewController: UIViewController { constant: -37 ) private let summaryInformationHeightObserver = PublishRelay() + private lazy var panGesture = UIPanGestureRecognizer(target: self, action: #selector(customViewDrag)) + private var storeInformationOriginalHeight: CGFloat = 0 init( viewModel: HomeViewModel, @@ -235,12 +238,10 @@ private extension HomeViewController { .disposed(by: disposeBag) summaryInformationHeightObserver.bind { [weak self] height in - self?.storeInformationHeightConstraint.constant = height + self?.storeInformationOriginalHeight = height self?.locationButtonBottomConstraint.constant = -16 self?.refreshButtonBottomConstraint.constant = -16 - UIView.animate(withDuration: 0.3) { [weak self] in - self?.view.layoutIfNeeded() - } + self?.setNewConstraints(storeInformationHeight: height) } .disposed(by: disposeBag) } @@ -310,9 +311,13 @@ private extension HomeViewController { func storeInformationViewDismiss() { clickedMarker?.isSelected = false clickedMarker = nil - storeInformationHeightConstraint.constant = 0 locationButtonBottomConstraint.constant = -37 refreshButtonBottomConstraint.constant = -37 + setNewConstraints(storeInformationHeight: 0) + } + + func setNewConstraints(storeInformationHeight: CGFloat) { + storeInformationHeightConstraint.constant = storeInformationHeight UIView.animate(withDuration: 0.3) { [weak self] in self?.view.layoutIfNeeded() } @@ -320,6 +325,40 @@ private extension HomeViewController { } +@objc +private extension HomeViewController { + + func customViewDrag(_ recognizer: UIPanGestureRecognizer) { + let transition = recognizer.translation(in: storeInformationView) + let height = storeInformationHeightConstraint.constant - transition.y + + recognizer.setTranslation(.zero, in: storeInformationView) + + if height > 230 && height < 620 { + storeInformationHeightConstraint.constant = height + } + if recognizer.state == .ended { + if storeInformationHeightConstraint.constant > 420 { + setNewConstraints(storeInformationHeight: 600) + } else { + setNewConstraints(storeInformationHeight: storeInformationOriginalHeight) + } + } + if recognizer.state == .changed { + if storeInformationHeightConstraint.constant > 420 { + // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. + locationButtonBottomConstraint.constant = storeInformationHeightConstraint.constant - 441 + refreshButtonBottomConstraint.constant = storeInformationHeightConstraint.constant - 441 + } else { + locationButtonBottomConstraint.constant = -16 + refreshButtonBottomConstraint.constant = -16 + } + } + + } + +} + private extension HomeViewController { func checkUserCurrentLocationAuthorization() { diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift index c153751b..508f2516 100644 --- a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift @@ -28,6 +28,7 @@ final class StoreInformationView: UIView { self.summaryInformationHeightObserver = summaryInformationHeightObserver super.init(frame: .zero) +// setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) addUIComponents() configureConstraints() } @@ -64,29 +65,3 @@ private extension StoreInformationView { } } - -//@objc -//extension StoreInformationView { -// -// func customViewDrag(_ recognizer: UIPanGestureRecognizer) { -// let transition = recognizer.translation(in: summaryView) -// let height = summaryView.bounds.height - transition.y -// -// recognizer.setTranslation(.zero, in: summaryView) -// -// if height > 230 && height < 620 { -// heightConstraint.constant = height -// } -// if recognizer.state == .ended { -// if heightConstraint.constant > 400 { -// heightConstraint.constant = 600 -// } else { -// heightConstraint.constant = 250 -// } -// UIView.animate(withDuration: 0.3) { [weak self] in -// self?.view.layoutIfNeeded() -// } -// } -// } -// -//} diff --git a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift index 3a499a2d..f8f495bf 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift @@ -100,6 +100,7 @@ final class SummaryInformationView: UIView { super.init(frame: .zero) setBackgroundColor() + setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) addUIComponents() configureConstraints() bind() From b0ded7c92a4352b928bd94859164c1b5b52a0313 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 24 Jan 2024 04:55:50 +0900 Subject: [PATCH 013/231] =?UTF-8?q?fix=20:=20minimum=20deployments=2015.0?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 464b0b3f..55ce1db9 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -914,7 +914,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -972,7 +972,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -1000,7 +1000,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1035,7 +1035,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1063,7 +1063,7 @@ ENABLE_APP_SANDBOX = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MACOSX_DEPLOYMENT_TARGET = 14.0; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = KoreaCertifiedStore.KCSUnitTest; @@ -1088,7 +1088,7 @@ ENABLE_APP_SANDBOX = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MACOSX_DEPLOYMENT_TARGET = 14.0; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = KoreaCertifiedStore.KCSUnitTest; From 59df66381f99ee04bef1269cac405f2407e7c4df Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 24 Jan 2024 05:21:17 +0900 Subject: [PATCH 014/231] =?UTF-8?q?refactor=20:=20=EA=B2=B9=EC=B9=98?= =?UTF-8?q?=EB=8A=94=20=EC=BD=94=EB=93=9C=EB=A5=BC=20=EC=A4=84=EC=9D=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=ED=95=A8=EC=88=98=ED=99=94=20?= =?UTF-8?q?(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index cf11721e..9bb63d67 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -239,9 +239,8 @@ private extension HomeViewController { summaryInformationHeightObserver.bind { [weak self] height in self?.storeInformationOriginalHeight = height - self?.locationButtonBottomConstraint.constant = -16 - self?.refreshButtonBottomConstraint.constant = -16 - self?.setNewConstraints(storeInformationHeight: height) + self?.setBottomConstraints(constraint: -16) + self?.setHeightConstraint(height: height) } .disposed(by: disposeBag) } @@ -311,13 +310,17 @@ private extension HomeViewController { func storeInformationViewDismiss() { clickedMarker?.isSelected = false clickedMarker = nil - locationButtonBottomConstraint.constant = -37 - refreshButtonBottomConstraint.constant = -37 - setNewConstraints(storeInformationHeight: 0) + setBottomConstraints(constraint: -37) + setHeightConstraint(height: 0) } - func setNewConstraints(storeInformationHeight: CGFloat) { - storeInformationHeightConstraint.constant = storeInformationHeight + func setBottomConstraints(constraint: CGFloat) { + locationButtonBottomConstraint.constant = constraint + refreshButtonBottomConstraint.constant = constraint + } + + func setHeightConstraint(height: CGFloat) { + storeInformationHeightConstraint.constant = height UIView.animate(withDuration: 0.3) { [weak self] in self?.view.layoutIfNeeded() } @@ -339,19 +342,18 @@ private extension HomeViewController { } if recognizer.state == .ended { if storeInformationHeightConstraint.constant > 420 { - setNewConstraints(storeInformationHeight: 600) + setBottomConstraints(constraint: storeInformationHeightConstraint.constant - 441) + setHeightConstraint(height: 600) } else { - setNewConstraints(storeInformationHeight: storeInformationOriginalHeight) + setHeightConstraint(height: storeInformationOriginalHeight) } } if recognizer.state == .changed { if storeInformationHeightConstraint.constant > 420 { // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. - locationButtonBottomConstraint.constant = storeInformationHeightConstraint.constant - 441 - refreshButtonBottomConstraint.constant = storeInformationHeightConstraint.constant - 441 + setBottomConstraints(constraint: storeInformationHeightConstraint.constant - 441) } else { - locationButtonBottomConstraint.constant = -16 - refreshButtonBottomConstraint.constant = -16 + setBottomConstraints(constraint: -16) } } From fc476ff3d927bae80b4182b37f3dcd37e9a88330 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 24 Jan 2024 05:29:27 +0900 Subject: [PATCH 015/231] =?UTF-8?q?fix=20:=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=EB=82=98=20=EC=A0=84=ED=99=94=EB=B2=88=ED=98=B8=EA=B0=80=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EA=B0=80=EA=B2=8C=EC=9D=98=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EA=B8=B0=EB=B3=B8=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EB=84=A3=EA=B8=B0=20=EB=B0=8F=20=EC=A0=84=ED=99=94=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20enabled=20(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/SummaryInformationView.swift | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift index f8f495bf..f2ad9306 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift @@ -209,16 +209,23 @@ extension SummaryInformationView { certificationStackView.addArrangedSubview($0) } if let phoneNum = store.phoneNumber { + storeCallButton.isEnabled = true storeCallButton.rx.tap .bind { [weak self] _ in self?.callButtonTapped(phoneNum: phoneNum) } .disposed(by: disposeBag) + } else { + storeCallButton.isEnabled = false + } + if let url = store.localPhotos.first { + viewModel.action(input: .setInformationView( + openingHour: store.openingHour, + url: store.localPhotos.first) + ) + } else { + storeImageView.image = UIImage.basicStore } - viewModel.action(input: .setInformationView( - openingHour: store.openingHour, - url: store.localPhotos.first) - ) if storeTitle.numberOfVisibleLines == 1 { summaryInformationHeightObserver.accept(230) } else { From e8406d741051058006985a2e4ab1af45311d8df2 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 24 Jan 2024 05:51:09 +0900 Subject: [PATCH 016/231] =?UTF-8?q?fix=20:=20=EC=A4=91=EA=B0=84=EC=97=90?= =?UTF-8?q?=EC=84=9C=20view=EB=A5=BC=20=EB=86=93=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=ED=98=84=EC=9C=84=EC=B9=98=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9E=AC=EA=B2=80=EC=83=89=20=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=EC=9D=B4=20view=EC=97=90=20=EA=B1=B8=EC=B9=98=EB=8A=94=20?= =?UTF-8?q?=EC=9D=B4=EC=8A=88=20=ED=95=B4=EA=B2=B0=20(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 15 +++++++-------- .../Home/View/StoreInformationView.swift | 1 - 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 9bb63d67..d39c1559 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -340,23 +340,22 @@ private extension HomeViewController { if height > 230 && height < 620 { storeInformationHeightConstraint.constant = height } - if recognizer.state == .ended { + if recognizer.state == .changed { if storeInformationHeightConstraint.constant > 420 { + // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. setBottomConstraints(constraint: storeInformationHeightConstraint.constant - 441) - setHeightConstraint(height: 600) } else { - setHeightConstraint(height: storeInformationOriginalHeight) + setBottomConstraints(constraint: -16) } } - if recognizer.state == .changed { + if recognizer.state == .ended { if storeInformationHeightConstraint.constant > 420 { - // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. - setBottomConstraints(constraint: storeInformationHeightConstraint.constant - 441) + setBottomConstraints(constraint: 600 - 441) + setHeightConstraint(height: 600) } else { - setBottomConstraints(constraint: -16) + setHeightConstraint(height: storeInformationOriginalHeight) } } - } } diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift index 508f2516..b4a75eb0 100644 --- a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift @@ -28,7 +28,6 @@ final class StoreInformationView: UIView { self.summaryInformationHeightObserver = summaryInformationHeightObserver super.init(frame: .zero) -// setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) addUIComponents() configureConstraints() } From c01062237adf8c3b4e1177f0f46deb07b2d398bb Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 24 Jan 2024 06:11:49 +0900 Subject: [PATCH 017/231] =?UTF-8?q?refactor=20:=20PR=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index d39c1559..4243443c 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -287,13 +287,9 @@ private extension HomeViewController { if clickedMarker == marker { return true } if clickedMarker.isSelected { self?.storeInformationViewDismiss() - self?.markerSelected(marker: marker) - } else { - self?.markerSelected(marker: marker) } - } else { - self?.markerSelected(marker: marker) } + self?.markerSelected(marker: marker) return true } @@ -340,21 +336,24 @@ private extension HomeViewController { if height > 230 && height < 620 { storeInformationHeightConstraint.constant = height } - if recognizer.state == .changed { + + switch recognizer.state { + case .changed: if storeInformationHeightConstraint.constant > 420 { // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. setBottomConstraints(constraint: storeInformationHeightConstraint.constant - 441) } else { setBottomConstraints(constraint: -16) } - } - if recognizer.state == .ended { + case .ended: if storeInformationHeightConstraint.constant > 420 { setBottomConstraints(constraint: 600 - 441) setHeightConstraint(height: 600) } else { setHeightConstraint(height: storeInformationOriginalHeight) } + default: + return } } From 5b56a670d01279efb39e0c0023d71193ae304706 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor <128480641+SungMinCho-Kor@users.noreply.github.com> Date: Wed, 24 Jan 2024 17:41:01 +0900 Subject: [PATCH 018/231] docs : Update issue templates --- .github/ISSUE_TEMPLATE/issue-template.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/issue-template.md diff --git a/.github/ISSUE_TEMPLATE/issue-template.md b/.github/ISSUE_TEMPLATE/issue-template.md new file mode 100644 index 00000000..095d4a28 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue-template.md @@ -0,0 +1,10 @@ +--- +name: Issue Template +about: ๊ธฐ๋ณธ ์ด์Šˆ ํ…œ +title: '' +labels: '' +assignees: '' + +--- + +## ๐Ÿ“‹ Description From f9cd100f140ab404b0781042d5c65a8c1e17612a Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor <128480641+SungMinCho-Kor@users.noreply.github.com> Date: Wed, 24 Jan 2024 17:50:23 +0900 Subject: [PATCH 019/231] docs : Update pull_request_template.md --- .github/pull_request_template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c7951abc..8fe498c8 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,11 +1,11 @@ ## โญ๏ธ Issue Number -#number +- #number ## ๐Ÿšฉ Summary - +- ## ๐Ÿ› ๏ธ Technical Concerns From 65f7c427177d713a1c4450ddb261767160bc17ab Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 24 Jan 2024 17:58:17 +0900 Subject: [PATCH 020/231] =?UTF-8?q?docs=20:=20Podfile=EC=97=90=20RxGesture?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20(#109)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/Podfile | 1 + KCS/Podfile.lock | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/KCS/Podfile b/KCS/Podfile index 8e0e1bc0..39029484 100644 --- a/KCS/Podfile +++ b/KCS/Podfile @@ -10,6 +10,7 @@ target 'KCS' do pod 'RxSwift', '6.6.0' pod 'RxCocoa', '6.6.0' + pod 'RxGesture' pod 'Alamofire' pod 'SwiftLint' pod 'NMapsMap' diff --git a/KCS/Podfile.lock b/KCS/Podfile.lock index 79c58045..0f242d65 100644 --- a/KCS/Podfile.lock +++ b/KCS/Podfile.lock @@ -8,6 +8,9 @@ PODS: - RxCocoa (6.6.0): - RxRelay (= 6.6.0) - RxSwift (= 6.6.0) + - RxGesture (4.0.4): + - RxCocoa (~> 6.0) + - RxSwift (~> 6.0) - RxRelay (6.6.0): - RxSwift (= 6.6.0) - RxSwift (6.6.0) @@ -20,6 +23,7 @@ DEPENDENCIES: - NMapsMap - RxBlocking - RxCocoa (= 6.6.0) + - RxGesture - RxSwift (= 6.6.0) - RxTest - SwiftLint @@ -31,6 +35,7 @@ SPEC REPOS: - NMapsMap - RxBlocking - RxCocoa + - RxGesture - RxRelay - RxSwift - RxTest @@ -42,11 +47,12 @@ SPEC CHECKSUMS: NMapsMap: a5b909a31b6f3d27a670f6eb2ddc913c38975474 RxBlocking: fbd1f8501443024f686e556f36dac79b0d5f4d7c RxCocoa: 44a80de90e25b739b5aeaae3c8c371a32e3343cc + RxGesture: f3efb47ed2d26a8082f7b660d4a59970e275a7f8 RxRelay: 45eaa5db8ee4fb50e5ebd57deec0159e97fa51e6 RxSwift: a4b44f7d24599f674deebd1818eab82e58410632 RxTest: a23f26bb53a5e146a0a69db4f0fa0b69001ce7f4 SwiftLint: c1de071d9d08c8aba837545f6254315bc900e211 -PODFILE CHECKSUM: 0f88675320ac9cb6ad8c84bdece01c7160cd9d79 +PODFILE CHECKSUM: 529859231e49f63fa881147a916b977cb8f574df COCOAPODS: 1.14.3 From f4469b9305b6e6b5fb62fc3eab88354c052922a3 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 24 Jan 2024 19:10:48 +0900 Subject: [PATCH 021/231] =?UTF-8?q?feat=20:=20RxGesture=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20=EB=B0=8F=20Swipe=20=EA=B5=AC=ED=98=84=20(#109)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 85 +++++++++++-------- 1 file changed, 48 insertions(+), 37 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 4243443c..26446577 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -10,6 +10,7 @@ import NMapsMap import CoreLocation import RxSwift import RxCocoa +import RxGesture final class HomeViewController: UIViewController { @@ -168,8 +169,51 @@ final class HomeViewController: UIViewController { summaryInformationHeightObserver: summaryInformationHeightObserver ) view.translatesAutoresizingMaskIntoConstraints = false - view.addGestureRecognizer(panGesture) + view.rx.panGesture() + .when(.changed) + .subscribe(onNext: { [weak self] recognizer in + guard let self = self else { return } + let transition = recognizer.translation(in: storeInformationView) + let height = storeInformationHeightConstraint.constant - transition.y + + recognizer.setTranslation(.zero, in: storeInformationView) + + if height > 230 && height < 620 { + storeInformationHeightConstraint.constant = height + } + + if storeInformationHeightConstraint.constant > 420 { + // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. + setBottomConstraints(constraint: storeInformationHeightConstraint.constant - 441) + } else { + setBottomConstraints(constraint: -16) + } + }) + .disposed(by: disposeBag) + + view.rx.panGesture() + .when(.ended) + .subscribe(onNext: { [weak self] recognizer in + guard let self = self else { return } + if recognizer.velocity(in: view).y < -1000 { + setBottomConstraints(constraint: 600 - 441) + setHeightConstraint(height: 600) + } else if recognizer.velocity(in: view).y > 1000 { + setBottomConstraints(constraint: -16) + setHeightConstraint(height: storeInformationOriginalHeight) + } + + if storeInformationHeightConstraint.constant > 420 { + setBottomConstraints(constraint: 600 - 441) + setHeightConstraint(height: 600) + } else { + setBottomConstraints(constraint: -16) + setHeightConstraint(height: storeInformationOriginalHeight) + } + }) + .disposed(by: disposeBag) + return view }() @@ -186,7 +230,6 @@ final class HomeViewController: UIViewController { constant: -37 ) private let summaryInformationHeightObserver = PublishRelay() - private lazy var panGesture = UIPanGestureRecognizer(target: self, action: #selector(customViewDrag)) private var storeInformationOriginalHeight: CGFloat = 0 init( @@ -313,6 +356,9 @@ private extension HomeViewController { func setBottomConstraints(constraint: CGFloat) { locationButtonBottomConstraint.constant = constraint refreshButtonBottomConstraint.constant = constraint + UIView.animate(withDuration: 0.3) { [weak self] in + self?.view.layoutIfNeeded() + } } func setHeightConstraint(height: CGFloat) { @@ -324,41 +370,6 @@ private extension HomeViewController { } -@objc -private extension HomeViewController { - - func customViewDrag(_ recognizer: UIPanGestureRecognizer) { - let transition = recognizer.translation(in: storeInformationView) - let height = storeInformationHeightConstraint.constant - transition.y - - recognizer.setTranslation(.zero, in: storeInformationView) - - if height > 230 && height < 620 { - storeInformationHeightConstraint.constant = height - } - - switch recognizer.state { - case .changed: - if storeInformationHeightConstraint.constant > 420 { - // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. - setBottomConstraints(constraint: storeInformationHeightConstraint.constant - 441) - } else { - setBottomConstraints(constraint: -16) - } - case .ended: - if storeInformationHeightConstraint.constant > 420 { - setBottomConstraints(constraint: 600 - 441) - setHeightConstraint(height: 600) - } else { - setHeightConstraint(height: storeInformationOriginalHeight) - } - default: - return - } - } - -} - private extension HomeViewController { func checkUserCurrentLocationAuthorization() { From 4441ee9e38ddcc2bdfc01707b6a49feb4eebd3b0 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 24 Jan 2024 20:10:10 +0900 Subject: [PATCH 022/231] =?UTF-8?q?feat=20:=20DetailView=20=ED=8B=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20(#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 12 ++ .../Presentation/Home/View/DetailView.swift | 195 ++++++++++++++++++ .../Home/View/HomeViewController.swift | 1 + .../Home/ViewModel/DetailViewModelImpl.swift | 16 ++ .../ViewModel/protocol/DetailViewModel.swift | 28 +++ 5 files changed, 252 insertions(+) create mode 100644 KCS/KCS/Presentation/Home/View/DetailView.swift create mode 100644 KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift create mode 100644 KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 55ce1db9..dbe071bb 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -13,6 +13,9 @@ 591A88812B384E600059E40F /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 591A88802B384E600059E40F /* HomeViewController.swift */; }; 591A88862B384E610059E40F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 591A88852B384E610059E40F /* Assets.xcassets */; }; 591A88892B384E610059E40F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 591A88872B384E610059E40F /* LaunchScreen.storyboard */; }; + 592262242B61203000CA5A11 /* DetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262232B61203000CA5A11 /* DetailView.swift */; }; + 592262262B61232F00CA5A11 /* DetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262252B61232F00CA5A11 /* DetailViewModel.swift */; }; + 592262282B6124C400CA5A11 /* DetailViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */; }; 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE572B5524D500725C90 /* RefreshButton.swift */; }; 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE5B2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift */; }; 5977BE5E2B5535C700725C90 /* FetchRefreshStoresUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE5D2B5535C700725C90 /* FetchRefreshStoresUseCase.swift */; }; @@ -107,6 +110,9 @@ 591A88852B384E610059E40F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 591A88882B384E610059E40F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 591A888A2B384E610059E40F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 592262232B61203000CA5A11 /* DetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailView.swift; sourceTree = ""; }; + 592262252B61232F00CA5A11 /* DetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewModel.swift; sourceTree = ""; }; + 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewModelImpl.swift; sourceTree = ""; }; 5977BE572B5524D500725C90 /* RefreshButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshButton.swift; sourceTree = ""; }; 5977BE5B2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchRefreshStoresUseCaseImpl.swift; sourceTree = ""; }; 5977BE5D2B5535C700725C90 /* FetchRefreshStoresUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchRefreshStoresUseCase.swift; sourceTree = ""; }; @@ -271,6 +277,7 @@ 5977BE652B553BA800725C90 /* HomeViewModelImpl.swift */, 5977BE672B553C8300725C90 /* HomeDependency.swift */, A8ACB7E12B594F7400540BD1 /* SummaryInformationViewModelImpl.swift */, + 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */, ); path = ViewModel; sourceTree = ""; @@ -365,6 +372,7 @@ A802D1F52B5277620091FDE7 /* CertificationLabel.swift */, 5977BE572B5524D500725C90 /* RefreshButton.swift */, A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */, + 592262232B61203000CA5A11 /* DetailView.swift */, ); path = View; sourceTree = ""; @@ -519,6 +527,7 @@ children = ( 5977BE602B55374000725C90 /* HomeViewModel.swift */, A8ACB7DE2B594F4B00540BD1 /* SummaryInformationViewModel.swift */, + 592262252B61232F00CA5A11 /* DetailViewModel.swift */, ); path = protocol; sourceTree = ""; @@ -774,6 +783,8 @@ 5977BE612B55374000725C90 /* HomeViewModel.swift in Sources */, A89087042B4E7F3500767225 /* FilterButton.swift in Sources */, 59F478B12B59BB00002FEF9E /* ImageRepositoryError.swift in Sources */, + 592262282B6124C400CA5A11 /* DetailViewModelImpl.swift in Sources */, + 592262262B61232F00CA5A11 /* DetailViewModel.swift in Sources */, 59C306C92B501B9D00862625 /* RegularOpeningHours.swift in Sources */, 59F478B52B59BE0B002FEF9E /* FetchImageUseCase.swift in Sources */, 59C306BF2B50109100862625 /* Location.swift in Sources */, @@ -793,6 +804,7 @@ 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */, A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */, 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, + 592262242B61203000CA5A11 /* DetailView.swift in Sources */, A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, A8ACB7E22B594F7400540BD1 /* SummaryInformationViewModelImpl.swift in Sources */, diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift new file mode 100644 index 00000000..dbd3916e --- /dev/null +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -0,0 +1,195 @@ +// +// DetailView.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/24/24. +// + +import UIKit +import RxSwift + +final class DetailView: UIView { + + private let disposeBag = DisposeBag() + + private lazy var storeTitle: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 22, weight: .bold) + label.textColor = UIColor.primary2 + label.numberOfLines = 2 + + return label + }() + + private lazy var category: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 13, weight: .regular) + label.textColor = UIColor.kcsGray + + return label + }() + + private lazy var certificationStackView: UIStackView = { + let stack = UIStackView() + stack.translatesAutoresizingMaskIntoConstraints = false + stack.axis = .horizontal + stack.spacing = 4 + stack.distribution = .fillProportionally + + return stack + }() + + private lazy var storeOpenClosed: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 15, weight: .regular) + label.textColor = UIColor.goodPrice + + return label + }() + + private lazy var openingHour: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 13, weight: .regular) + label.textColor = UIColor.kcsGray + + return label + }() + + private let storeImageView: UIImageView = { + let imageView = UIImageView() + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.setLayerCorner(cornerRadius: 6) + imageView.clipsToBounds = true + imageView.image = UIImage.basicStore + + return imageView + }() + + private let address: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + + return label + }() + + private let phoneNumber: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + + return label + }() + + private let dismissIndicatorView: UIView = { + let view = UIView() + view.translatesAutoresizingMaskIntoConstraints = false + view.backgroundColor = UIColor.swipeBar + view.layer.cornerRadius = 2 + + return view + }() + + private let viewModel: DetailViewModel + + init(viewModel: DetailViewModel) { + self.viewModel = viewModel + super.init(frame: .zero) + + setBackgroundColor() + setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) + addUIComponents() + configureConstraints() + bind() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +private extension DetailView { + + func bind() { + + } + +} +private extension DetailView { + + func setBackgroundColor() { + backgroundColor = .white + } + + func addUIComponents() { + addSubview(storeTitle) + addSubview(certificationStackView) + addSubview(category) + addSubview(storeOpenClosed) + addSubview(openingHour) + addSubview(storeImageView) + addSubview(dismissIndicatorView) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + storeTitle.topAnchor.constraint(equalTo: topAnchor, constant: 27), + storeTitle.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + storeTitle.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -156) + ]) + + NSLayoutConstraint.activate([ + category.topAnchor.constraint(equalTo: storeTitle.bottomAnchor, constant: 4), + category.leadingAnchor.constraint(equalTo: storeTitle.leadingAnchor) + ]) + + NSLayoutConstraint.activate([ + certificationStackView.topAnchor.constraint(equalTo: category.bottomAnchor, constant: 9), + certificationStackView.leadingAnchor.constraint(equalTo: storeTitle.leadingAnchor) + ]) + + NSLayoutConstraint.activate([ + storeOpenClosed.topAnchor.constraint(equalTo: certificationStackView.bottomAnchor, constant: 8), + storeOpenClosed.leadingAnchor.constraint(equalTo: storeTitle.leadingAnchor) + ]) + + NSLayoutConstraint.activate([ + openingHour.centerYAnchor.constraint(equalTo: storeOpenClosed.centerYAnchor), + openingHour.leadingAnchor.constraint(equalTo: storeOpenClosed.trailingAnchor, constant: 12) + ]) + + NSLayoutConstraint.activate([ + storeImageView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 27), + storeImageView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -16), + storeImageView.widthAnchor.constraint(equalToConstant: 132), + storeImageView.heightAnchor.constraint(equalToConstant: 132) + ]) + + NSLayoutConstraint.activate([ + dismissIndicatorView.topAnchor.constraint(equalTo: topAnchor, constant: 8), + dismissIndicatorView.centerXAnchor.constraint(equalTo: centerXAnchor), + dismissIndicatorView.widthAnchor.constraint(equalToConstant: 35), + dismissIndicatorView.heightAnchor.constraint(equalToConstant: 4) + ]) + } + + func setUIContents(store: Store) { + } + + func removeStackView() { + let subviews = certificationStackView.arrangedSubviews + certificationStackView.arrangedSubviews.forEach { + certificationStackView.removeArrangedSubview($0) + } + subviews.forEach { $0.removeFromSuperview() } + } + + func callTapped() { + if let number = phoneNumber.text , let url = URL(string: "tel://" + "\(number.filter { $0.isNumber })") { + UIApplication.shared.open(url, options: [:], completionHandler: nil) + } + } + +} diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 26446577..d14fb38e 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -170,6 +170,7 @@ final class HomeViewController: UIViewController { ) view.translatesAutoresizingMaskIntoConstraints = false + // TODO: ๋กœ์ง ๋ทฐ๋ชจ๋ธ๋กœ ์ด๋™ view.rx.panGesture() .when(.changed) .subscribe(onNext: { [weak self] recognizer in diff --git a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift new file mode 100644 index 00000000..c1e1a33c --- /dev/null +++ b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift @@ -0,0 +1,16 @@ +// +// DetailViewModelImpl.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/24/24. +// + +import Foundation + +struct DetailViewModelImpl: DetailViewModel { + + func action(input: DetailViewModelInputCase) { + + } + +} diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift new file mode 100644 index 00000000..46506f54 --- /dev/null +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift @@ -0,0 +1,28 @@ +// +// DetailViewModel.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/24/24. +// + +import Foundation + +protocol DetailViewModel: DetailViewModelInput, DetailViewModelOutput { + + init() + +} + +enum DetailViewModelInputCase { + +} + +protocol DetailViewModelInput { + + func action(input: DetailViewModelInputCase) + +} + +protocol DetailViewModelOutput { + +} From 910616f63284032f544a5bd64bfac951730a0738 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 24 Jan 2024 20:58:15 +0900 Subject: [PATCH 023/231] =?UTF-8?q?feat=20:=20Detail=20View=20HomeViewCont?= =?UTF-8?q?roller=EC=97=90=20=EC=B6=94=EA=B0=80=20(#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 6 +++- .../Presentation/Home/View/DetailView.swift | 18 +++++++--- .../Home/View/HomeViewController.swift | 15 +++++--- .../Home/View/StoreInformationView.swift | 35 ++++++++++++++++++- .../Home/ViewModel/DetailViewModelImpl.swift | 2 +- 5 files changed, 63 insertions(+), 13 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 636394b6..db2bf79d 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -28,7 +28,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) ) - window?.rootViewController = HomeViewController(viewModel: viewModel, summaryInformationViewModel: summaryInformationViewModel) + window?.rootViewController = HomeViewController( + viewModel: viewModel, + summaryInformationViewModel: summaryInformationViewModel, + detailViewModel: DetailViewModelImpl() + ) window?.makeKeyAndVisible() } diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index dbd3916e..68993034 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -108,6 +108,7 @@ final class DetailView: UIView { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + } private extension DetailView { @@ -117,10 +118,12 @@ private extension DetailView { } } + private extension DetailView { func setBackgroundColor() { - backgroundColor = .white + // backgroundColor = .white + backgroundColor = .systemYellow } func addUIComponents() { @@ -175,9 +178,6 @@ private extension DetailView { ]) } - func setUIContents(store: Store) { - } - func removeStackView() { let subviews = certificationStackView.arrangedSubviews certificationStackView.arrangedSubviews.forEach { @@ -187,9 +187,17 @@ private extension DetailView { } func callTapped() { - if let number = phoneNumber.text , let url = URL(string: "tel://" + "\(number.filter { $0.isNumber })") { + if let number = phoneNumber.text, let url = URL(string: "tel://" + "\(number.filter { $0.isNumber })") { UIApplication.shared.open(url, options: [:], completionHandler: nil) } } } + +extension DetailView { + + func setUIContents(store: Store) { + + } + +} diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index d14fb38e..c7c1914f 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -166,7 +166,8 @@ final class HomeViewController: UIViewController { private lazy var storeInformationView: StoreInformationView = { let view = StoreInformationView( summaryViewModel: summaryInformationViewModel, - summaryInformationHeightObserver: summaryInformationHeightObserver + summaryInformationHeightObserver: summaryInformationHeightObserver, + detailViewModel: detailViewModel ) view.translatesAutoresizingMaskIntoConstraints = false @@ -214,13 +215,14 @@ final class HomeViewController: UIViewController { } }) .disposed(by: disposeBag) - + return view }() private var activatedFilter: [CertificationType] = [] private let viewModel: HomeViewModel private let summaryInformationViewModel: SummaryInformationViewModel + private let detailViewModel: DetailViewModel private lazy var storeInformationHeightConstraint = storeInformationView.heightAnchor.constraint(equalToConstant: 0) private lazy var locationButtonBottomConstraint = locationButton.bottomAnchor.constraint( equalTo: storeInformationView.topAnchor, @@ -235,10 +237,12 @@ final class HomeViewController: UIViewController { init( viewModel: HomeViewModel, - summaryInformationViewModel: SummaryInformationViewModel + summaryInformationViewModel: SummaryInformationViewModel, + detailViewModel: DetailViewModel ) { self.viewModel = viewModel self.summaryInformationViewModel = summaryInformationViewModel + self.detailViewModel = detailViewModel super.init(nibName: nil, bundle: nil) } @@ -287,6 +291,7 @@ private extension HomeViewController { self?.setHeightConstraint(height: height) } .disposed(by: disposeBag) + } func bindFilterButton(button: FilterButton, type: CertificationType) { @@ -305,7 +310,7 @@ private extension HomeViewController { .bind(to: button.rx.isSelected) .disposed(by: disposeBag) } - + func setMarker(marker: Marker, tag: UInt) { marker.tag = tag marker.mapView = mapView.mapView @@ -320,7 +325,7 @@ private extension HomeViewController { return activatedFilter } - + } private extension HomeViewController { diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift index b4a75eb0..7e9cfbe5 100644 --- a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift @@ -23,9 +23,23 @@ final class StoreInformationView: UIView { private let summaryViewModel: SummaryInformationViewModel private let summaryInformationHeightObserver: PublishRelay - init(summaryViewModel: SummaryInformationViewModel, summaryInformationHeightObserver: PublishRelay) { + private lazy var detailView: DetailView = { + let view = DetailView(viewModel: detailViewModel) + view.translatesAutoresizingMaskIntoConstraints = false + + return view + }() + + private let detailViewModel: DetailViewModel + + init( + summaryViewModel: SummaryInformationViewModel, + summaryInformationHeightObserver: PublishRelay, + detailViewModel: DetailViewModel + ) { self.summaryViewModel = summaryViewModel self.summaryInformationHeightObserver = summaryInformationHeightObserver + self.detailViewModel = detailViewModel super.init(frame: .zero) addUIComponents() @@ -42,6 +56,17 @@ extension StoreInformationView { func setUIContents(store: Store) { summaryView.setUIContents(store: store) + detailView.setUIContents(store: store) + } + + func changeToSummary() { + summaryView.isHidden = false + summaryView.isHidden = true + } + + func changeToDetail() { + summaryView.isHidden = true + summaryView.isHidden = false } } @@ -50,6 +75,7 @@ private extension StoreInformationView { func addUIComponents() { addSubview(summaryView) + addSubview(detailView) } func configureConstraints() { @@ -61,6 +87,13 @@ private extension StoreInformationView { summaryView.trailingAnchor.constraint(equalTo: trailingAnchor) ]) + NSLayoutConstraint.activate([ + detailView.topAnchor.constraint(equalTo: topAnchor), + detailView.bottomAnchor.constraint(equalTo: bottomAnchor), + detailView.leadingAnchor.constraint(equalTo: leadingAnchor), + detailView.trailingAnchor.constraint(equalTo: trailingAnchor) + ]) + } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift index c1e1a33c..55028cab 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift @@ -7,7 +7,7 @@ import Foundation -struct DetailViewModelImpl: DetailViewModel { +final class DetailViewModelImpl: DetailViewModel { func action(input: DetailViewModelInputCase) { From 5389be199c9c9f55f34f1a9200ad00a18983c7fc Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 24 Jan 2024 21:24:31 +0900 Subject: [PATCH 024/231] =?UTF-8?q?feat=20:=20=EB=86=92=EC=9D=B4=EC=97=90?= =?UTF-8?q?=20=EB=94=B0=EB=9D=BC=20=EB=B7=B0=20=EC=A0=84=ED=99=98=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 8 +++++ .../Home/View/StoreInformationView.swift | 31 ++++++++++++++++--- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index c7c1914f..03fd1e05 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -187,8 +187,10 @@ final class HomeViewController: UIViewController { if storeInformationHeightConstraint.constant > 420 { // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. + storeInformationView.changeToDetail() setBottomConstraints(constraint: storeInformationHeightConstraint.constant - 441) } else { + storeInformationView.changeToSummary() setBottomConstraints(constraint: -16) } }) @@ -201,17 +203,21 @@ final class HomeViewController: UIViewController { if recognizer.velocity(in: view).y < -1000 { setBottomConstraints(constraint: 600 - 441) setHeightConstraint(height: 600) + storeInformationView.changeToDetail() } else if recognizer.velocity(in: view).y > 1000 { setBottomConstraints(constraint: -16) setHeightConstraint(height: storeInformationOriginalHeight) + storeInformationView.changeToSummary() } if storeInformationHeightConstraint.constant > 420 { setBottomConstraints(constraint: 600 - 441) setHeightConstraint(height: 600) + storeInformationView.changeToDetail() } else { setBottomConstraints(constraint: -16) setHeightConstraint(height: storeInformationOriginalHeight) + storeInformationView.changeToSummary() } }) .disposed(by: disposeBag) @@ -289,6 +295,7 @@ private extension HomeViewController { self?.storeInformationOriginalHeight = height self?.setBottomConstraints(constraint: -16) self?.setHeightConstraint(height: height) + self?.storeInformationView.changeToSummary() } .disposed(by: disposeBag) @@ -357,6 +364,7 @@ private extension HomeViewController { clickedMarker = nil setBottomConstraints(constraint: -37) setHeightConstraint(height: 0) + storeInformationView.dismissAll() } func setBottomConstraints(constraint: CGFloat) { diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift index 7e9cfbe5..3132f531 100644 --- a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift @@ -42,8 +42,10 @@ final class StoreInformationView: UIView { self.detailViewModel = detailViewModel super.init(frame: .zero) + setBackgroundColor() addUIComponents() configureConstraints() + changeToSummary() } required init?(coder: NSCoder) { @@ -60,19 +62,40 @@ extension StoreInformationView { } func changeToSummary() { - summaryView.isHidden = false - summaryView.isHidden = true + summaryView.isUserInteractionEnabled = true + detailView.isUserInteractionEnabled = false + UIView.animate(withDuration: 0.3) { [weak self] in + self?.summaryView.alpha = 1 + self?.detailView.alpha = 0 + } } func changeToDetail() { - summaryView.isHidden = true - summaryView.isHidden = false + summaryView.isUserInteractionEnabled = false + detailView.isUserInteractionEnabled = true + UIView.animate(withDuration: 0.3) { [weak self] in + self?.summaryView.alpha = 0 + self?.detailView.alpha = 1 + } + } + + func dismissAll() { + summaryView.isUserInteractionEnabled = false + detailView.isUserInteractionEnabled = false + UIView.animate(withDuration: 0.3) { [weak self] in + self?.summaryView.alpha = 0 + self?.detailView.alpha = 0 + } } } private extension StoreInformationView { + func setBackgroundColor() { + backgroundColor = .white + } + func addUIComponents() { addSubview(summaryView) addSubview(detailView) From 69b1d1ebafd7442fd8a915defbe5e9ee9e4e7a42 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 24 Jan 2024 21:25:44 +0900 Subject: [PATCH 025/231] =?UTF-8?q?feat=20:=20StoreInformationView=20Corne?= =?UTF-8?q?rRadius=20=EC=84=A4=EC=A0=95=20(#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/StoreInformationView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift index 3132f531..82ccee47 100644 --- a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift @@ -42,6 +42,7 @@ final class StoreInformationView: UIView { self.detailViewModel = detailViewModel super.init(frame: .zero) + setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) setBackgroundColor() addUIComponents() configureConstraints() From 283b70b4b922a35f84c58e24d0407fe6f82e3e50 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 25 Jan 2024 15:34:54 +0900 Subject: [PATCH 026/231] =?UTF-8?q?feat=20:=20SummaryView=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=EC=8B=9C=20DetailView=EB=A1=9C=20=EC=A0=84=ED=99=98?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20(#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/HomeViewController.swift | 12 ++++++++++++ .../Home/View/StoreInformationView.swift | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 03fd1e05..2721f10b 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -222,6 +222,18 @@ final class HomeViewController: UIViewController { }) .disposed(by: disposeBag) + view.rx.tapGesture() + .when(.ended) + .subscribe(onNext: {[weak self] recognizer in + guard let self = self else { return } + if storeInformationHeightConstraint.constant == storeInformationOriginalHeight { + setBottomConstraints(constraint: 600 - 441) + setHeightConstraint(height: 600) + storeInformationView.changeToDetail() + } + }) + .disposed(by: disposeBag) + return view }() diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift index 82ccee47..3e1a0111 100644 --- a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift @@ -46,7 +46,7 @@ final class StoreInformationView: UIView { setBackgroundColor() addUIComponents() configureConstraints() - changeToSummary() + dismissAll() } required init?(coder: NSCoder) { From a8042450d903c7d1bc044771831f52d0a3083f3b Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 25 Jan 2024 18:11:38 +0900 Subject: [PATCH 027/231] =?UTF-8?q?feat=20:=20animation=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=A0=81=EC=9A=A9=20(#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 85 ++++++++++++------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 2721f10b..47f45ff3 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -182,17 +182,27 @@ final class HomeViewController: UIViewController { recognizer.setTranslation(.zero, in: storeInformationView) if height > 230 && height < 620 { - storeInformationHeightConstraint.constant = height + setStoreInformationConstraints( + heightConstraint: height, + bottomConstraint: locationButtonBottomConstraint.constant + ) } if storeInformationHeightConstraint.constant > 420 { // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. storeInformationView.changeToDetail() - setBottomConstraints(constraint: storeInformationHeightConstraint.constant - 441) + setStoreInformationConstraints( + heightConstraint: storeInformationHeightConstraint.constant, + bottomConstraint: storeInformationHeightConstraint.constant - 441 + ) } else { storeInformationView.changeToSummary() - setBottomConstraints(constraint: -16) + setStoreInformationConstraints( + heightConstraint: storeInformationHeightConstraint.constant, + bottomConstraint: -16 + ) } + }) .disposed(by: disposeBag) @@ -201,22 +211,34 @@ final class HomeViewController: UIViewController { .subscribe(onNext: { [weak self] recognizer in guard let self = self else { return } if recognizer.velocity(in: view).y < -1000 { - setBottomConstraints(constraint: 600 - 441) - setHeightConstraint(height: 600) + setStoreInformationConstraints( + heightConstraint: 600, + bottomConstraint: 600 - 441, + animated: true + ) storeInformationView.changeToDetail() } else if recognizer.velocity(in: view).y > 1000 { - setBottomConstraints(constraint: -16) - setHeightConstraint(height: storeInformationOriginalHeight) + setStoreInformationConstraints( + heightConstraint: storeInformationOriginalHeight, + bottomConstraint: -16, + animated: true + ) storeInformationView.changeToSummary() } if storeInformationHeightConstraint.constant > 420 { - setBottomConstraints(constraint: 600 - 441) - setHeightConstraint(height: 600) + setStoreInformationConstraints( + heightConstraint: 600, + bottomConstraint: 600 - 441, + animated: true + ) storeInformationView.changeToDetail() } else { - setBottomConstraints(constraint: -16) - setHeightConstraint(height: storeInformationOriginalHeight) + setStoreInformationConstraints( + heightConstraint: storeInformationOriginalHeight, + bottomConstraint: -16, + animated: true + ) storeInformationView.changeToSummary() } }) @@ -227,8 +249,11 @@ final class HomeViewController: UIViewController { .subscribe(onNext: {[weak self] recognizer in guard let self = self else { return } if storeInformationHeightConstraint.constant == storeInformationOriginalHeight { - setBottomConstraints(constraint: 600 - 441) - setHeightConstraint(height: 600) + setStoreInformationConstraints( + heightConstraint: 600, + bottomConstraint: 600 - 441, + animated: true + ) storeInformationView.changeToDetail() } }) @@ -305,8 +330,11 @@ private extension HomeViewController { summaryInformationHeightObserver.bind { [weak self] height in self?.storeInformationOriginalHeight = height - self?.setBottomConstraints(constraint: -16) - self?.setHeightConstraint(height: height) + self?.setStoreInformationConstraints( + heightConstraint: height, + bottomConstraint: -16, + animated: true + ) self?.storeInformationView.changeToSummary() } .disposed(by: disposeBag) @@ -374,23 +402,22 @@ private extension HomeViewController { func storeInformationViewDismiss() { clickedMarker?.isSelected = false clickedMarker = nil - setBottomConstraints(constraint: -37) - setHeightConstraint(height: 0) + setStoreInformationConstraints( + heightConstraint: 0, + bottomConstraint: -37, + animated: true + ) storeInformationView.dismissAll() } - func setBottomConstraints(constraint: CGFloat) { - locationButtonBottomConstraint.constant = constraint - refreshButtonBottomConstraint.constant = constraint - UIView.animate(withDuration: 0.3) { [weak self] in - self?.view.layoutIfNeeded() - } - } - - func setHeightConstraint(height: CGFloat) { - storeInformationHeightConstraint.constant = height - UIView.animate(withDuration: 0.3) { [weak self] in - self?.view.layoutIfNeeded() + func setStoreInformationConstraints(heightConstraint: CGFloat, bottomConstraint: CGFloat, animated: Bool = false) { + locationButtonBottomConstraint.constant = bottomConstraint + refreshButtonBottomConstraint.constant = bottomConstraint + storeInformationHeightConstraint.constant = heightConstraint + if animated { + UIView.animate(withDuration: 0.3) { [weak self] in + self?.view.layoutIfNeeded() + } } } From 9eb475b796c3deee3556a84f4c0aee6f384b6ede Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 25 Jan 2024 18:13:28 +0900 Subject: [PATCH 028/231] =?UTF-8?q?fix=20:=20lint=20=EC=88=98=EC=A0=95=20(?= =?UTF-8?q?#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 2 +- KCS/KCS/Presentation/Home/View/SummaryInformationView.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 47f45ff3..2ba0f8d4 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -246,7 +246,7 @@ final class HomeViewController: UIViewController { view.rx.tapGesture() .when(.ended) - .subscribe(onNext: {[weak self] recognizer in + .subscribe(onNext: {[weak self] _ in guard let self = self else { return } if storeInformationHeightConstraint.constant == storeInformationOriginalHeight { setStoreInformationConstraints( diff --git a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift index f2ad9306..4b51c32d 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift @@ -221,7 +221,7 @@ extension SummaryInformationView { if let url = store.localPhotos.first { viewModel.action(input: .setInformationView( openingHour: store.openingHour, - url: store.localPhotos.first) + url: url) ) } else { storeImageView.image = UIImage.basicStore From e7d47146fcf661afa016546d3262f1e1fa5d4bfe Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 25 Jan 2024 18:13:40 +0900 Subject: [PATCH 029/231] =?UTF-8?q?fix=20:=20lint=20=EC=88=98=EC=A0=95=20(?= =?UTF-8?q?#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 2ba0f8d4..f43a9b9a 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -246,7 +246,7 @@ final class HomeViewController: UIViewController { view.rx.tapGesture() .when(.ended) - .subscribe(onNext: {[weak self] _ in + .subscribe(onNext: { [weak self] _ in guard let self = self else { return } if storeInformationHeightConstraint.constant == storeInformationOriginalHeight { setStoreInformationConstraints( From 3cdcdb4625037883b519a7561cf8aaaf7c1cb6a0 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 25 Jan 2024 18:21:04 +0900 Subject: [PATCH 030/231] =?UTF-8?q?chore=20:=20TODO=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20(#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/DetailView.swift | 1 + KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift | 1 + .../Presentation/Home/ViewModel/protocol/DetailViewModel.swift | 1 + 3 files changed, 3 insertions(+) diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 68993034..61e836d6 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -8,6 +8,7 @@ import UIKit import RxSwift +// TODO: UI ์š”์†Œ ์ „์ฒด๋ฅผ ๋””์ž์ธ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. final class DetailView: UIView { private let disposeBag = DisposeBag() diff --git a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift index 55028cab..26e5a2c2 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift @@ -7,6 +7,7 @@ import Foundation +// TODO: ๋””์ž์ธ๊ณผ ๊ธฐ๋Šฅ ์ŠคํŽ™์ด ์ •ํ•ด์ง€๋ฉด ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. final class DetailViewModelImpl: DetailViewModel { func action(input: DetailViewModelInputCase) { diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift index 46506f54..2da12000 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift @@ -7,6 +7,7 @@ import Foundation +// TODO: ๋””์ž์ธ๊ณผ ๊ธฐ๋Šฅ ์ŠคํŽ™์ด ์ •ํ•ด์ง€๋ฉด ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. protocol DetailViewModel: DetailViewModelInput, DetailViewModelOutput { init() From dd62c83771520779c74ed20baace6646a0a3d669 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 25 Jan 2024 18:22:27 +0900 Subject: [PATCH 031/231] =?UTF-8?q?chore=20:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20(#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/DetailView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 61e836d6..a3a6b12a 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -123,7 +123,6 @@ private extension DetailView { private extension DetailView { func setBackgroundColor() { - // backgroundColor = .white backgroundColor = .systemYellow } From 592980d78fd738280fbd37eabe4db2a7c2bcf94a Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 26 Jan 2024 02:52:21 +0900 Subject: [PATCH 032/231] =?UTF-8?q?feat=20:=20=ED=95=84=EC=9A=94=ED=95=9C?= =?UTF-8?q?=20assets=20=EC=B6=94=EA=B0=80=20(#113)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 22 +++++++++++------ .../AddressIcon.imageset/Contents.json | 23 ++++++++++++++++++ .../AddressIcon.imageset/address.png | Bin 0 -> 359 bytes .../AddressIcon.imageset/address@2x.png | Bin 0 -> 589 bytes .../AddressIcon.imageset/address@3x.png | Bin 0 -> 849 bytes .../ClockIcon.imageset/Contents.json | 23 ++++++++++++++++++ .../ClockIcon.imageset/clockIcon.png | Bin 0 -> 352 bytes .../ClockIcon.imageset/clockIcon@2x.png | Bin 0 -> 562 bytes .../ClockIcon.imageset/clockIcon@3x.png | Bin 0 -> 808 bytes .../Contents.json | 15 +++++++----- .../Contents.json | 0 .../PhoneIcon.imageset/Contents.json | 23 ++++++++++++++++++ .../PhoneIcon.imageset/phoneIcon.png | Bin 0 -> 325 bytes .../PhoneIcon.imageset/phoneIcon@2x.png | Bin 0 -> 548 bytes .../PhoneIcon.imageset/phoneIcon@3x.png | Bin 0 -> 780 bytes .../SwipeBar.colorset/Contents.json | 9 ++++--- 16 files changed, 99 insertions(+), 16 deletions(-) create mode 100644 KCS/KCS/Resource/Assets.xcassets/AddressIcon.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/AddressIcon.imageset/address.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/AddressIcon.imageset/address@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/AddressIcon.imageset/address@3x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/ClockIcon.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/ClockIcon.imageset/clockIcon.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/ClockIcon.imageset/clockIcon@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/ClockIcon.imageset/clockIcon@3x.png rename KCS/KCS/Resource/Assets.xcassets/{CertificationLabelText.colorset => DivideView.colorset}/Contents.json (71%) rename KCS/KCS/Resource/Assets.xcassets/{KCSGray.colorset => GrayLabel.colorset}/Contents.json (100%) create mode 100644 KCS/KCS/Resource/Assets.xcassets/PhoneIcon.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/PhoneIcon.imageset/phoneIcon.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/PhoneIcon.imageset/phoneIcon@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/PhoneIcon.imageset/phoneIcon@3x.png diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index dbe071bb..7273af0e 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -59,7 +59,7 @@ 59F478C12B5D0D8D002FEF9E /* ImageRepositoryImplTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F478C02B5D0D8D002FEF9E /* ImageRepositoryImplTests.swift */; }; 8FE699E5DAEEDFE5A53D5E82 /* Pods_KCS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E11E3144529848C9A0FC6F77 /* Pods_KCS.framework */; }; A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A802D1F52B5277620091FDE7 /* CertificationLabel.swift */; }; - A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB22B5BC57800D0C0D7 /* OpenClosedContent.swift */; }; + A81EFBB32B5BC57800D0C0D7 /* OpenClosedInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB22B5BC57800D0C0D7 /* OpenClosedInformation.swift */; }; A81EFBB52B5D477600D0C0D7 /* UILabel+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB42B5D477600D0C0D7 /* UILabel+.swift */; }; A81EFBC02B5D597400D0C0D7 /* Pretendard-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBB72B5D597400D0C0D7 /* Pretendard-Medium.ttf */; }; A81EFBC12B5D597400D0C0D7 /* Pretendard-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBB82B5D597400D0C0D7 /* Pretendard-Black.ttf */; }; @@ -86,6 +86,8 @@ A8ACB7ED2B59647400540BD1 /* OpeningHourError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7EC2B59647400540BD1 /* OpeningHourError.swift */; }; A8ACB7EF2B5AEBB900540BD1 /* GetStoreInformationUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7EE2B5AEBB800540BD1 /* GetStoreInformationUseCaseImpl.swift */; }; A8ACB7F12B5AEBE300540BD1 /* GetStoreInformationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7F02B5AEBE300540BD1 /* GetStoreInformationUseCase.swift */; }; + A8AE4B192B62903100632355 /* OpeningHourViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8AE4B182B62903100632355 /* OpeningHourViewModel.swift */; }; + A8AE4B1B2B62A60B00632355 /* OpeningHoursCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8AE4B1A2B62A60B00632355 /* OpeningHoursCellView.swift */; }; F242B43374CDD61CC6F6A4D5 /* Pods_KCSUnitTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FF39E6207057AD78DB44730 /* Pods_KCSUnitTest.framework */; }; /* End PBXBuildFile section */ @@ -159,7 +161,7 @@ 5FF0FF2386EEB69182D6EA4C /* Pods-KCSUnitTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCSUnitTest.debug.xcconfig"; path = "Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest.debug.xcconfig"; sourceTree = ""; }; 9EA5C8EA72EA9E937C11400A /* Pods-KCS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCS.debug.xcconfig"; path = "Target Support Files/Pods-KCS/Pods-KCS.debug.xcconfig"; sourceTree = ""; }; A802D1F52B5277620091FDE7 /* CertificationLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationLabel.swift; sourceTree = ""; }; - A81EFBB22B5BC57800D0C0D7 /* OpenClosedContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedContent.swift; sourceTree = ""; }; + A81EFBB22B5BC57800D0C0D7 /* OpenClosedInformation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedInformation.swift; sourceTree = ""; }; A81EFBB42B5D477600D0C0D7 /* UILabel+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+.swift"; sourceTree = ""; }; A81EFBB72B5D597400D0C0D7 /* Pretendard-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.ttf"; sourceTree = ""; }; A81EFBB82B5D597400D0C0D7 /* Pretendard-Black.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Black.ttf"; sourceTree = ""; }; @@ -186,6 +188,8 @@ A8ACB7EC2B59647400540BD1 /* OpeningHourError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHourError.swift; sourceTree = ""; }; A8ACB7EE2B5AEBB800540BD1 /* GetStoreInformationUseCaseImpl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetStoreInformationUseCaseImpl.swift; sourceTree = ""; }; A8ACB7F02B5AEBE300540BD1 /* GetStoreInformationUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetStoreInformationUseCase.swift; sourceTree = ""; }; + A8AE4B182B62903100632355 /* OpeningHourViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHourViewModel.swift; sourceTree = ""; }; + A8AE4B1A2B62A60B00632355 /* OpeningHoursCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHoursCellView.swift; sourceTree = ""; }; AA9EF30352C847A7C6DEC110 /* Pods-KCS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCS.release.xcconfig"; path = "Target Support Files/Pods-KCS/Pods-KCS.release.xcconfig"; sourceTree = ""; }; E11E3144529848C9A0FC6F77 /* Pods_KCS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KCS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -278,6 +282,7 @@ 5977BE672B553C8300725C90 /* HomeDependency.swift */, A8ACB7E12B594F7400540BD1 /* SummaryInformationViewModelImpl.swift */, 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */, + A8AE4B182B62903100632355 /* OpeningHourViewModel.swift */, ); path = ViewModel; sourceTree = ""; @@ -366,13 +371,14 @@ isa = PBXGroup; children = ( 591A88802B384E600059E40F /* HomeViewController.swift */, + A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */, A890870E2B4F836C00767225 /* SummaryInformationView.swift */, + 592262232B61203000CA5A11 /* DetailView.swift */, 59C306A32B4D7EBA00862625 /* Marker.swift */, A89087032B4E7F3500767225 /* FilterButton.swift */, - A802D1F52B5277620091FDE7 /* CertificationLabel.swift */, 5977BE572B5524D500725C90 /* RefreshButton.swift */, - A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */, - 592262232B61203000CA5A11 /* DetailView.swift */, + A802D1F52B5277620091FDE7 /* CertificationLabel.swift */, + A8AE4B1A2B62A60B00632355 /* OpeningHoursCellView.swift */, ); path = View; sourceTree = ""; @@ -406,7 +412,7 @@ A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */, 5977BE732B57FA7A00725C90 /* FilteredStores.swift */, 59F478BE2B5BEA08002FEF9E /* RequestLocation.swift */, - A81EFBB22B5BC57800D0C0D7 /* OpenClosedContent.swift */, + A81EFBB22B5BC57800D0C0D7 /* OpenClosedInformation.swift */, ); path = Entity; sourceTree = ""; @@ -781,6 +787,7 @@ A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */, A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */, 5977BE612B55374000725C90 /* HomeViewModel.swift in Sources */, + A8AE4B1B2B62A60B00632355 /* OpeningHoursCellView.swift in Sources */, A89087042B4E7F3500767225 /* FilterButton.swift in Sources */, 59F478B12B59BB00002FEF9E /* ImageRepositoryError.swift in Sources */, 592262282B6124C400CA5A11 /* DetailViewModelImpl.swift in Sources */, @@ -805,7 +812,7 @@ A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */, 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, 592262242B61203000CA5A11 /* DetailView.swift in Sources */, - A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, + A81EFBB32B5BC57800D0C0D7 /* OpenClosedInformation.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, A8ACB7E22B594F7400540BD1 /* SummaryInformationViewModelImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, @@ -815,6 +822,7 @@ 59C306CB2B50357900862625 /* Router.swift in Sources */, A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, 59C306B62B50027300862625 /* Store.swift in Sources */, + A8AE4B192B62903100632355 /* OpeningHourViewModel.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */, 5977BE942B59738800725C90 /* FetchStoresUseCase.swift in Sources */, diff --git a/KCS/KCS/Resource/Assets.xcassets/AddressIcon.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/AddressIcon.imageset/Contents.json new file mode 100644 index 00000000..79e25443 --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/AddressIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "address.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "address@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "address@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/AddressIcon.imageset/address.png b/KCS/KCS/Resource/Assets.xcassets/AddressIcon.imageset/address.png new file mode 100644 index 0000000000000000000000000000000000000000..75b00346ab3af67d85b8b07aa9ab32957c2c1f8c GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bA!3HD`>}{Og7r3sAonxr07UKs>^(o5w&_@ooDN-#?@zcxz2Lcf>fS4 z`zG=96slD|VDGsqznWLtqS$Zg!9_h4&w3Ojq*gz$jnlZ3Hwb5eQicYfUHduALs6dz`!wy_%=8$_Lv>n-l{!((Ef z|NR)A_LZWgH~+}>wz$(Gak}yV0BS5+ zAb9}E>7zzp*PVma7it-Rhh`L5ign1r%cT-qBY$VtMNT@Fb3#asLw5@;+m5s(G5^GOIWILwQjYYaH{umKt=2?JTO{Ry=69p=KwjV2l!QK-TPu^OxbC|-u&+V+GpOl^JXBI4QsHmd{@ z7_2q!$OYw?*?xmv)(8IF^&|2cVvxHk`p(?YV2&^pfL+R4TB=9Y{Ru+AMevhaOsYW| zK_aQHbGkPU2G?%-J>t~pgAH}yPx#HfS+N@b6D2jg74Av6{vaet`ye|k19jUjsaa7% z^Xh}Lu6msWvopdH9FOc_F+46{r}#Fa8pT5u{3N&pkEh19uO(()rs00000NkvXXu0mjf$P0I4 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/ClockIcon.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/ClockIcon.imageset/Contents.json new file mode 100644 index 00000000..f2feb3d4 --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/ClockIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "clockIcon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "clockIcon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "clockIcon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/ClockIcon.imageset/clockIcon.png b/KCS/KCS/Resource/Assets.xcassets/ClockIcon.imageset/clockIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..af40e74f7e3e44e341c08447d8d65cf4d7a6e29b GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa&H|6fVg?3oVGw3ym^DWND9BhG zwB9e7c>m$`#(t?YJB-W@2hH(+bYuI&gN}k6H_xQ1FG+vcH+kV@wLiC4 zo)f(yI$6!FitBg6(uJijwDV^Dkd-}}_g^JS%lM1JQlaAvJCqP7T)r6 zR)y_6Rw54@vI3sW@R@Qzw>+kZZGKA8Q{$*EvrByv3p8wYrK`U4p3|BWnJEx*`Zdd! veY)a_9^w;iRI`s9d*bvuV4a>A+ZlSbj3ei6{%{bPaF+yr zGZ&8B<-Y7?Z+8hcJm?xUF1gh}@c6e9-Y3lYIt?4)4So99wG?HJwsn)QU2Y!i2)Om| zL_;_U`r5++uiUF59|4YV0iS~OfciJJqp$FTNdYlIUU-6gT~7~eS|}4Jw5&V`O+3=b z{7sN;6w4BaD33XB?^&|FW=j`%cM$8v&4xQmf(kQ*<0Itc z+7g?NSN%SX`Pza#bFnah3z}nNTbpwmr6M~~!c@NDC*1LKiE4Z)-qbPju}w4^){3%4 zThEX`+W4FeMx1G`*@Bylc>%xFN#dopk$=130<#@rD-DwmJ6dw#zJfq#opj7O{6)k0 zh}a-&F1fymF@gim$QrjOnrFp~Dj{H_p4+mAngLt~AvYK?{{ z*z!4?7;(V$PSo+E1@e9;{Z{y<9__l?3H&0j3EDu3g#k3O)9dW;w$b5t0<8h7-+3g8u6zXC4 zNH7gMkP=23-Qu=0Wzg|~%bhaMEYt^i{x7%_(Dm&IcCQ)Hp8TM+AOv1wcG8JUE; z3$cn8-Qo%D;dLTb3K+DgYm!^!kk~bBkt&PE2_9PusFZ54EbrJ6FnQMIToSetnMKOQ zYMj9iryl6ie0_oFP?J!OD!Wtgq!C zf7w9mzLNS>o0kn-yN|rmvA@2#HFc^R@x?`>>l@}3+_Ek2oa}{WVU>jijHot1(O%&~ mj8V+scrxOcsU5iesNz4mUhuxGP*2SO0000GZx^prwfgF}}M_)$E)e-c@N{9B$bjv*C{y_3#z9&!+9z0dM-j*!klAs_ar z#%0X?kB)M1-P_Wf!J5SC$*Gy>eInBE^=ucF`V`q4t#hBw-f!M?!ta9Zc{Uzn~b(mcFmJ#B(6BH^r5B&PkLqOmA~hW zlj8k6a?j*6y_x+o?$m=8rIR0zH6@&z?k_os?FN@puRyf*QuT){q1uOwA4fVZ6^JRE zvVlAFL05TC-RT=%3VY+Zymo5V-cJ0bXexRmdF2bAVun@et~;Y{g`a9{mET}!`+?!= S@!3FMGI+ZBxvXI8G%mFbOX8p8?;PN`c^?D5{Z7i0TUD^C>zjDP&Q~r;I$yQ-X%nhg%c-n zei9*(&-wf8`-noykbEdi`OXJnixzGWs0a<=#n%zt^7Weqy8LVNeFuBIqd^n`>R^W- z<0#<)uWE({@Ob58O}w%OsH-!jM) z=g8EZ^M!;*?nNGpNkE)0F$o%T^*<9U7P5&IqltM|bBV+wPbkw)bR;d-@kbBJc$8A# zvn_9Lzr2v6n0@QA{BPq5)rhKjlx0W(U&~gDel?G>NRK+=lJ|dUu?*REQQxC1a(4VF m%I9|#CwP)$8~zW|O7RCY7l&t_rsNC&0000rexRw2JR0c(YIZW4p{lL^&#~6MEE? zeVh|~uXxThhA?F>?phWVeXoA#@uZj`s`#D_8`~aJ6t^uV-R2d%k5$(_&8_E{z@5^f z)pc_8Tg{mnmT;fh$7lJ0fE=$%s+iZ}CUjjV&R@q|^tkK2ly2}Q)UwfC&)uVkGXJ|P zG5-m;#chLa4{q8V;UJZEkp&cxea%tb-b-Zpr5#{ zz-7ZJOlNurU*t*7_FsLS(QMLa^4C#a9$T#Yi_@5P#-7$)wH>F$4*#UU!flay>sA$* zH7-z{Y{rRqwLd(CkDQ4n55ftWWkMgEo+eIFfiGwh|JxdF1UILPQ?$O@un;H@GhQ?! z?tyB7x+?2t#VMBz30a;I5}d}Md2x#Rq0p(NwwY5-h*$MONf}zre3d>w4d5Sc(p{KB zn2|eVWc%3qVp7tw@XRBQxChi9?^&G~76kjylXCmT?-qxT68-^O#mX+$!-6RQ0000< KMNUMnLSTYhIAoy! literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/SwipeBar.colorset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/SwipeBar.colorset/Contents.json index 4120543f..9e90a5f5 100644 --- a/KCS/KCS/Resource/Assets.xcassets/SwipeBar.colorset/Contents.json +++ b/KCS/KCS/Resource/Assets.xcassets/SwipeBar.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0.780", - "green" : "0.780", - "red" : "0.780" + "blue" : "0.851", + "green" : "0.851", + "red" : "0.851" } }, "idiom" : "universal" @@ -34,5 +34,8 @@ "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "localizable" : true } } From 07e6f49420cf5ba688651f3cb9de94a45f34bbf7 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 26 Jan 2024 02:52:46 +0900 Subject: [PATCH 033/231] =?UTF-8?q?feat=20:=20AutoLayout=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20(#113)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 5 +- KCS/KCS/Domain/Entity/Day.swift | 20 +- KCS/KCS/Domain/Entity/OpenClosedContent.swift | 15 -- .../Domain/Entity/OpenClosedInformation.swift | 29 +++ .../Home/View/CertificationLabel.swift | 9 +- .../Presentation/Home/View/DetailView.swift | 241 +++++++++++++++--- .../Home/View/OpeningHourView.swift | 31 +++ .../Home/View/OpeningHoursCellView.swift | 93 +++++++ .../Home/View/SummaryInformationView.swift | 41 ++- .../Home/ViewModel/DetailViewModelImpl.swift | 107 +++++++- .../Home/ViewModel/OpeningHourViewModel.swift | 8 + .../ViewModel/protocol/DetailViewModel.swift | 14 +- 12 files changed, 530 insertions(+), 83 deletions(-) delete mode 100644 KCS/KCS/Domain/Entity/OpenClosedContent.swift create mode 100644 KCS/KCS/Domain/Entity/OpenClosedInformation.swift create mode 100644 KCS/KCS/Presentation/Home/View/OpeningHourView.swift create mode 100644 KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift create mode 100644 KCS/KCS/Presentation/Home/ViewModel/OpeningHourViewModel.swift diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index db2bf79d..6355417f 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -31,7 +31,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window?.rootViewController = HomeViewController( viewModel: viewModel, summaryInformationViewModel: summaryInformationViewModel, - detailViewModel: DetailViewModelImpl() + detailViewModel: DetailViewModelImpl( + getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), + fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) + ) ) window?.makeKeyAndVisible() } diff --git a/KCS/KCS/Domain/Entity/Day.swift b/KCS/KCS/Domain/Entity/Day.swift index 0d38eedf..2342b750 100644 --- a/KCS/KCS/Domain/Entity/Day.swift +++ b/KCS/KCS/Domain/Entity/Day.swift @@ -7,7 +7,7 @@ import Foundation -enum Day: String { +enum Day: String, CaseIterable { case sunday = "SUN" case monday = "MON" @@ -36,4 +36,22 @@ enum Day: String { } } + var description: String { + switch self { + case .sunday: + return "์ผ" + case .monday: + return "์›”" + case .tuesday: + return "ํ™”" + case .wednesday: + return "์ˆ˜" + case .thursday: + return "๋ชฉ" + case .friday: + return "๊ธˆ" + case .saturday: + return "ํ† " + } + } } diff --git a/KCS/KCS/Domain/Entity/OpenClosedContent.swift b/KCS/KCS/Domain/Entity/OpenClosedContent.swift deleted file mode 100644 index 8ae331da..00000000 --- a/KCS/KCS/Domain/Entity/OpenClosedContent.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// OpenClosedContent.swift -// KCS -// -// Created by ๊น€์˜ํ˜„ on 1/20/24. -// - -import Foundation - -struct OpenClosedContent { - - let openClosedType: OpenClosedType - let openingHour: String - -} diff --git a/KCS/KCS/Domain/Entity/OpenClosedInformation.swift b/KCS/KCS/Domain/Entity/OpenClosedInformation.swift new file mode 100644 index 00000000..7d3ebf17 --- /dev/null +++ b/KCS/KCS/Domain/Entity/OpenClosedInformation.swift @@ -0,0 +1,29 @@ +// +// OpenClosedInformation.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 1/20/24. +// + +import Foundation + +struct OpenClosedInformation { + + let openClosedContent: OpenClosedContent + let detailOpeningHour: [Day: OpeningHour] + +} + +struct OpenClosedContent { + + let openClosedType: OpenClosedType + let openingHour: String + +} + +struct OpeningHour { + + let openingHour: String? + let breakTime: String? + +} diff --git a/KCS/KCS/Presentation/Home/View/CertificationLabel.swift b/KCS/KCS/Presentation/Home/View/CertificationLabel.swift index af6231ef..49c530b3 100644 --- a/KCS/KCS/Presentation/Home/View/CertificationLabel.swift +++ b/KCS/KCS/Presentation/Home/View/CertificationLabel.swift @@ -11,18 +11,21 @@ final class CertificationLabel: UIView { private let certificationType: CertificationType + private let fontSize: CGFloat + private lazy var certificationLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false - label.font = UIFont.pretendard(size: 9, weight: .medium) - label.textColor = UIColor.certificationLabelText + label.font = UIFont.pretendard(size: fontSize, weight: .medium) + label.textColor = UIColor.grayLabel label.text = certificationType.description return label }() - init(certificationType: CertificationType) { + init(certificationType: CertificationType, fontSize: CGFloat) { self.certificationType = certificationType + self.fontSize = fontSize super.init(frame: .zero) setBackgroundColor() diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index a3a6b12a..14c1dde5 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -7,8 +7,8 @@ import UIKit import RxSwift +import RxRelay -// TODO: UI ์š”์†Œ ์ „์ฒด๋ฅผ ๋””์ž์ธ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. final class DetailView: UIView { private let disposeBag = DisposeBag() @@ -16,7 +16,7 @@ final class DetailView: UIView { private lazy var storeTitle: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false - label.font = UIFont.pretendard(size: 22, weight: .bold) + label.font = UIFont.pretendard(size: 24, weight: .bold) label.textColor = UIColor.primary2 label.numberOfLines = 2 @@ -27,26 +27,50 @@ final class DetailView: UIView { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.font = UIFont.pretendard(size: 13, weight: .regular) - label.textColor = UIColor.kcsGray + label.textColor = UIColor.grayLabel return label }() private lazy var certificationStackView: UIStackView = { - let stack = UIStackView() - stack.translatesAutoresizingMaskIntoConstraints = false - stack.axis = .horizontal - stack.spacing = 4 - stack.distribution = .fillProportionally + let stackView = UIStackView() + stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.axis = .horizontal + stackView.spacing = 4 + stackView.distribution = .fillProportionally - return stack + return stackView + }() + + private let divideView: UIView = { + let view = UIView() + view.translatesAutoresizingMaskIntoConstraints = false + view.backgroundColor = UIColor.divideView + + return view + }() + + private let storeImageView: UIImageView = { + let imageView = UIImageView() + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.setLayerCorner(cornerRadius: 6) + imageView.clipsToBounds = true + imageView.image = UIImage.basicStore + + return imageView + }() + + private let clockIcon: UIImageView = { + let imageView = UIImageView(image: UIImage.clockIcon) + imageView.translatesAutoresizingMaskIntoConstraints = false + + return imageView }() private lazy var storeOpenClosed: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false - label.font = UIFont.pretendard(size: 15, weight: .regular) - label.textColor = UIColor.goodPrice + label.font = UIFont.pretendard(size: 13, weight: .regular) return label }() @@ -54,32 +78,50 @@ final class DetailView: UIView { private lazy var openingHour: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false - label.font = UIFont.pretendard(size: 13, weight: .regular) - label.textColor = UIColor.kcsGray + label.font = UIFont.pretendard(size: 12, weight: .regular) + label.textColor = UIColor.grayLabel return label }() - private let storeImageView: UIImageView = { - let imageView = UIImageView() + private let openingHoursStackView: UIStackView = { + let stackView = UIStackView() + stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.axis = .vertical + stackView.spacing = 5 + stackView.alignment = .leading + stackView.distribution = .equalSpacing + + return stackView + }() + + private let phoneIcon: UIImageView = { + let imageView = UIImageView(image: UIImage.phoneIcon) imageView.translatesAutoresizingMaskIntoConstraints = false - imageView.setLayerCorner(cornerRadius: 6) - imageView.clipsToBounds = true - imageView.image = UIImage.basicStore return imageView }() - private let address: UILabel = { + private let phoneNumber: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 13, weight: .regular) return label }() - private let phoneNumber: UILabel = { + private let addressIcon: UIImageView = { + let imageView = UIImageView(image: UIImage.addressIcon) + imageView.translatesAutoresizingMaskIntoConstraints = false + + return imageView + }() + + private let address: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 13, weight: .regular) + label.numberOfLines = 0 return label }() @@ -94,6 +136,7 @@ final class DetailView: UIView { }() private let viewModel: DetailViewModel + private lazy var addressConstraint = address.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16) init(viewModel: DetailViewModel) { self.viewModel = viewModel @@ -115,7 +158,52 @@ final class DetailView: UIView { private extension DetailView { func bind() { + viewModel.thumbnailImageOutput + .subscribe(onNext: { [weak self] data in + self?.storeImageView.image = UIImage(data: data) + }) + .disposed(by: disposeBag) + viewModel.openClosedOutput + .subscribe(onNext: { [weak self] openClosedInformation in + self?.removeOpeningHourStackView() + let openClosedContent = openClosedInformation.openClosedContent + if openClosedContent.openClosedType == .none { + self?.storeOpenClosed.text = "์˜์—…์‹œ๊ฐ„ ์ •๋ณด ์—†์Œ" + self?.storeOpenClosed.textColor = .black + self?.openingHour.text = openClosedContent.openClosedType.rawValue + self?.addressConstraint.constant = -174 + } else { + self?.storeOpenClosed.text = openClosedContent.openClosedType.rawValue + self?.storeOpenClosed.textColor = UIColor.goodPrice + self?.openingHour.text = openClosedContent.openingHour + self?.addressConstraint.constant = -16 + + let today = Date().weekDay + let detailOpeningHour = openClosedInformation.detailOpeningHour + for idx in today..() + var thumbnailImageOutput = PublishRelay() + + init(getOpenClosedUseCase: GetOpenClosedUseCase, fetchImageUseCase: FetchImageUseCase) { + self.getOpenClosedUseCase = getOpenClosedUseCase + self.fetchImageUseCase = fetchImageUseCase + } + func action(input: DetailViewModelInputCase) { + switch input { + case .setInformationView(let openingHour, let url): + setOpenClosed(openingHour: openingHour) + if let url = url { + fetchThumbnailImage(url: url) + } + } + } + +} + +private extension DetailViewModelImpl { + + func setOpenClosed( + openingHour: [RegularOpeningHours] + ) { + openClosedOutput.accept( + OpenClosedInformation( + openClosedContent: getOpenClosedUseCase.execute(openingHours: openingHour), + detailOpeningHour: detailOpeningHour(openingHours: openingHour) + ) + ) + } + + func fetchThumbnailImage(url: String) { + fetchImageUseCase.execute(url: url) + .subscribe( + onNext: { [weak self] imageData in + self?.thumbnailImageOutput.accept(imageData) + }, + onError: { error in + print(error.localizedDescription) + } + ) + .disposed(by: disposeBag) + } + +} + +private extension DetailViewModelImpl { + + func detailOpeningHour(openingHours: [RegularOpeningHours]) -> [Day: OpeningHour] { + if openingHours.isEmpty { return [:] } + var openingHourDictionary: [Day: OpeningHour] = [:] + + Day.allCases.forEach { day in + let openingHours = openingHours.filter { $0.open.day == day } + if openingHours.isEmpty { + openingHourDictionary[day] = OpeningHour(openingHour: OpenClosedType.dayOff.rawValue, breakTime: nil) + } + if openingHours.count == 1 { + if let openingHour = openingHours.first { + openingHourDictionary[day] = OpeningHour( + openingHour: openingHourToString(open: openingHour.open, close: openingHour.close), + breakTime: nil + ) + } + } else { + if let firstOpeningHour = openingHours.first, + let lastOpeningHour = openingHours.last { + if firstOpeningHour.open == lastOpeningHour.close { + openingHourDictionary[day] = OpeningHour( + openingHour: openingHourToString(open: lastOpeningHour.open, close: firstOpeningHour.close), + breakTime: nil + ) + } else { + openingHourDictionary[day] = OpeningHour( + openingHour: openingHourToString(open: firstOpeningHour.open, close: lastOpeningHour.close), + breakTime: openingHourToString(open: firstOpeningHour.close, close: lastOpeningHour.open, isBreakTime: true) + ) + } + } + } + } + + return openingHourDictionary + } + + func openingHourToString(open: BusinessHour, close: BusinessHour, isBreakTime: Bool = false) -> String { + var format = "%02d:%02d - %02d:%02d" + if isBreakTime { + format = "%02d:%02d - %02d:%02d ๋ธŒ๋ ˆ์ดํฌ ํƒ€์ž„" + } + return String( + format: format, + open.hour, + open.minute, + close.hour, + close.minute + ) } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/OpeningHourViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/OpeningHourViewModel.swift new file mode 100644 index 00000000..8bc2d949 --- /dev/null +++ b/KCS/KCS/Presentation/Home/ViewModel/OpeningHourViewModel.swift @@ -0,0 +1,8 @@ +// +// OpeningHourViewModel.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 1/25/24. +// + +import Foundation diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift index 2da12000..eec74f0d 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift @@ -5,17 +5,22 @@ // Created by ์กฐ์„ฑ๋ฏผ on 1/24/24. // -import Foundation +import RxSwift +import RxRelay -// TODO: ๋””์ž์ธ๊ณผ ๊ธฐ๋Šฅ ์ŠคํŽ™์ด ์ •ํ•ด์ง€๋ฉด ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. protocol DetailViewModel: DetailViewModelInput, DetailViewModelOutput { - init() + var getOpenClosedUseCase: GetOpenClosedUseCase { get } + var fetchImageUseCase: FetchImageUseCase { get } } enum DetailViewModelInputCase { + case setInformationView( + openingHour: [RegularOpeningHours], + url: String? + ) } protocol DetailViewModelInput { @@ -25,5 +30,6 @@ protocol DetailViewModelInput { } protocol DetailViewModelOutput { - + var openClosedOutput: PublishRelay { get } + var thumbnailImageOutput: PublishRelay { get } } From 1e37ecd48a013b991b680c8a35c7fc1b6a8f7667 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 26 Jan 2024 03:03:40 +0900 Subject: [PATCH 034/231] =?UTF-8?q?refactor=20:=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EC=BD=94=EB=93=9C=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=ED=99=94=20(#113)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/DetailView.swift | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 14c1dde5..4a1ccc3f 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -166,19 +166,11 @@ private extension DetailView { viewModel.openClosedOutput .subscribe(onNext: { [weak self] openClosedInformation in - self?.removeOpeningHourStackView() + guard let self = self else { return } + removeStackView(stackView: openingHoursStackView) let openClosedContent = openClosedInformation.openClosedContent - if openClosedContent.openClosedType == .none { - self?.storeOpenClosed.text = "์˜์—…์‹œ๊ฐ„ ์ •๋ณด ์—†์Œ" - self?.storeOpenClosed.textColor = .black - self?.openingHour.text = openClosedContent.openClosedType.rawValue - self?.addressConstraint.constant = -174 - } else { - self?.storeOpenClosed.text = openClosedContent.openClosedType.rawValue - self?.storeOpenClosed.textColor = UIColor.goodPrice - self?.openingHour.text = openClosedContent.openingHour - self?.addressConstraint.constant = -16 - + setOpeningHourText(openClosedContent: openClosedContent) + if openClosedContent.openClosedType != .none { let today = Date().weekDay let detailOpeningHour = openClosedInformation.detailOpeningHour for idx in today.. Date: Fri, 26 Jan 2024 03:56:13 +0900 Subject: [PATCH 035/231] =?UTF-8?q?feat=20:=20=EC=83=81=EC=84=B8=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A5=BC=20=EB=B3=B4?= =?UTF-8?q?=EC=97=AC=EC=A3=BC=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EB=B0=B0?= =?UTF-8?q?=EA=B2=BD=20Dimmed=20(#113)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 44 +++++++++++++++++++ .../Home/View/OpeningHoursCellView.swift | 6 ++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index f43a9b9a..707baeaa 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -163,6 +163,15 @@ final class HomeViewController: UIViewController { return button }() + private let dimView: UIView = { + let view = UIView() + view.translatesAutoresizingMaskIntoConstraints = false + view.backgroundColor = .clear + view.isUserInteractionEnabled = false + + return view + }() + private lazy var storeInformationView: StoreInformationView = { let view = StoreInformationView( summaryViewModel: summaryInformationViewModel, @@ -191,12 +200,14 @@ final class HomeViewController: UIViewController { if storeInformationHeightConstraint.constant > 420 { // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. storeInformationView.changeToDetail() + dimmedView() setStoreInformationConstraints( heightConstraint: storeInformationHeightConstraint.constant, bottomConstraint: storeInformationHeightConstraint.constant - 441 ) } else { storeInformationView.changeToSummary() + unDimmedView() setStoreInformationConstraints( heightConstraint: storeInformationHeightConstraint.constant, bottomConstraint: -16 @@ -217,6 +228,7 @@ final class HomeViewController: UIViewController { animated: true ) storeInformationView.changeToDetail() + dimmedView() } else if recognizer.velocity(in: view).y > 1000 { setStoreInformationConstraints( heightConstraint: storeInformationOriginalHeight, @@ -224,6 +236,7 @@ final class HomeViewController: UIViewController { animated: true ) storeInformationView.changeToSummary() + unDimmedView() } if storeInformationHeightConstraint.constant > 420 { @@ -233,6 +246,7 @@ final class HomeViewController: UIViewController { animated: true ) storeInformationView.changeToDetail() + dimmedView() } else { setStoreInformationConstraints( heightConstraint: storeInformationOriginalHeight, @@ -240,6 +254,7 @@ final class HomeViewController: UIViewController { animated: true ) storeInformationView.changeToSummary() + unDimmedView() } }) .disposed(by: disposeBag) @@ -255,6 +270,7 @@ final class HomeViewController: UIViewController { animated: true ) storeInformationView.changeToDetail() + dimmedView() } }) .disposed(by: disposeBag) @@ -336,6 +352,7 @@ private extension HomeViewController { animated: true ) self?.storeInformationView.changeToSummary() + self?.unDimmedView() } .disposed(by: disposeBag) @@ -421,6 +438,24 @@ private extension HomeViewController { } } + func dimmedView() { + goodPriceFilterButton.isUserInteractionEnabled = false + exemplaryFilterButton.isUserInteractionEnabled = false + safeFilterButton.isUserInteractionEnabled = false + UIView.animate(withDuration: 0.3) { [weak self] in + self?.dimView.backgroundColor = .black + self?.dimView.alpha = 0.4 + } + } + + func unDimmedView() { + goodPriceFilterButton.isUserInteractionEnabled = true + exemplaryFilterButton.isUserInteractionEnabled = true + safeFilterButton.isUserInteractionEnabled = true + UIView.animate(withDuration: 0.3) { [weak self] in + self?.dimView.backgroundColor = .clear + } + } } private extension HomeViewController { @@ -455,6 +490,7 @@ private extension HomeViewController { mapView.addSubview(locationButton) mapView.addSubview(filterButtonStackView) mapView.addSubview(refreshButton) + mapView.addSubview(dimView) mapView.addSubview(storeInformationView) } @@ -466,6 +502,13 @@ private extension HomeViewController { mapView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0) ]) + NSLayoutConstraint.activate([ + dimView.leadingAnchor.constraint(equalTo: mapView.leadingAnchor, constant: 0), + dimView.trailingAnchor.constraint(equalTo: mapView.trailingAnchor, constant: 0), + dimView.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: 0), + dimView.topAnchor.constraint(equalTo: mapView.topAnchor, constant: 0) + ]) + NSLayoutConstraint.activate([ locationButton.leadingAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.leadingAnchor, constant: 16), locationButton.widthAnchor.constraint(equalToConstant: 48), @@ -552,6 +595,7 @@ extension HomeViewController: NMFMapViewTouchDelegate { func mapView(_ mapView: NMFMapView, didTapMap latlng: NMGLatLng, point: CGPoint) { storeInformationViewDismiss() + unDimmedView() } } diff --git a/KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift b/KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift index e8fdf6dd..196e9a79 100644 --- a/KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift +++ b/KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift @@ -43,7 +43,11 @@ final class OpeningHoursCellView: UIView { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.text = openingHour.breakTime - label.font = UIFont.pretendard(size: 12, weight: .regular) + if isToday { + label.font = UIFont.pretendard(size: 12, weight: .medium) + } else { + label.font = UIFont.pretendard(size: 12, weight: .regular) + } return label }() From 0aea8aa013f0c089c0cabea5ca2c560e68d9fea1 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 26 Jan 2024 04:29:32 +0900 Subject: [PATCH 036/231] =?UTF-8?q?fix=20:=20location=20button=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index f43a9b9a..e0c4e722 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -513,7 +513,12 @@ extension HomeViewController: NMFMapViewCameraDelegate { func mapView(_ mapView: NMFMapView, cameraDidChangeByReason reason: Int, animated: Bool) { if reason == NMFMapChangedByDeveloper { mapView.positionMode = .direction - locationButton.setImage(UIImage.locationButtonNormal, for: .normal) + let authorizationStatus = locationManager.authorizationStatus + if authorizationStatus == .denied || authorizationStatus == .restricted || authorizationStatus == .notDetermined { + locationButton.setImage(UIImage.locationButtonNone, for: .normal) + } else { + locationButton.setImage(UIImage.locationButtonNormal, for: .normal) + } let northWestPoint = mapView.projection.latlng(from: CGPoint(x: 0, y: 0)) let southWestPoint = mapView.projection.latlng(from: CGPoint(x: 0, y: view.frame.height)) From 8e7059c0549cb0bf6fc224f8edd098649f0bf6e2 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 26 Jan 2024 15:34:49 +0900 Subject: [PATCH 037/231] =?UTF-8?q?chore=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C=20(#113)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/OpeningHourView.swift | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 KCS/KCS/Presentation/Home/View/OpeningHourView.swift diff --git a/KCS/KCS/Presentation/Home/View/OpeningHourView.swift b/KCS/KCS/Presentation/Home/View/OpeningHourView.swift deleted file mode 100644 index 1488a384..00000000 --- a/KCS/KCS/Presentation/Home/View/OpeningHourView.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// OpeningHourView.swift -// KCS -// -// Created by ๊น€์˜ํ˜„ on 1/25/24. -// - -import UIKit -import RxSwift -import RxRelay - -final class OpeningHourView: UIView { - - - required init(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} - -private extension OpeningHourView { - - - func setOpeningHoursStackView() { - - - } - - - -} From 67ce29bf413e86c60703554b5c30cfe414cfe4ec Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 26 Jan 2024 16:13:40 +0900 Subject: [PATCH 038/231] =?UTF-8?q?refatcor=20:=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20DetailViewModel?= =?UTF-8?q?=EB=A1=9C=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD=20(#113)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 8 +- ...ion.swift => OpeningHourInformation.swift} | 15 ++- .../UseCase/GetOpenClosedUseCaseImpl.swift | 2 +- .../Presentation/Home/View/DetailView.swift | 37 ++++--- .../Home/View/SummaryInformationView.swift | 2 +- .../Home/ViewModel/DetailViewModelImpl.swift | 96 +++++++++++++------ .../ViewModel/protocol/DetailViewModel.swift | 2 +- 7 files changed, 102 insertions(+), 60 deletions(-) rename KCS/KCS/Domain/Entity/{OpenClosedInformation.swift => OpeningHourInformation.swift} (55%) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 7273af0e..7363d5ae 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -59,7 +59,7 @@ 59F478C12B5D0D8D002FEF9E /* ImageRepositoryImplTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F478C02B5D0D8D002FEF9E /* ImageRepositoryImplTests.swift */; }; 8FE699E5DAEEDFE5A53D5E82 /* Pods_KCS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E11E3144529848C9A0FC6F77 /* Pods_KCS.framework */; }; A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A802D1F52B5277620091FDE7 /* CertificationLabel.swift */; }; - A81EFBB32B5BC57800D0C0D7 /* OpenClosedInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB22B5BC57800D0C0D7 /* OpenClosedInformation.swift */; }; + A81EFBB32B5BC57800D0C0D7 /* OpeningHourInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB22B5BC57800D0C0D7 /* OpeningHourInformation.swift */; }; A81EFBB52B5D477600D0C0D7 /* UILabel+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB42B5D477600D0C0D7 /* UILabel+.swift */; }; A81EFBC02B5D597400D0C0D7 /* Pretendard-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBB72B5D597400D0C0D7 /* Pretendard-Medium.ttf */; }; A81EFBC12B5D597400D0C0D7 /* Pretendard-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBB82B5D597400D0C0D7 /* Pretendard-Black.ttf */; }; @@ -161,7 +161,7 @@ 5FF0FF2386EEB69182D6EA4C /* Pods-KCSUnitTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCSUnitTest.debug.xcconfig"; path = "Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest.debug.xcconfig"; sourceTree = ""; }; 9EA5C8EA72EA9E937C11400A /* Pods-KCS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCS.debug.xcconfig"; path = "Target Support Files/Pods-KCS/Pods-KCS.debug.xcconfig"; sourceTree = ""; }; A802D1F52B5277620091FDE7 /* CertificationLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationLabel.swift; sourceTree = ""; }; - A81EFBB22B5BC57800D0C0D7 /* OpenClosedInformation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedInformation.swift; sourceTree = ""; }; + A81EFBB22B5BC57800D0C0D7 /* OpeningHourInformation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHourInformation.swift; sourceTree = ""; }; A81EFBB42B5D477600D0C0D7 /* UILabel+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+.swift"; sourceTree = ""; }; A81EFBB72B5D597400D0C0D7 /* Pretendard-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.ttf"; sourceTree = ""; }; A81EFBB82B5D597400D0C0D7 /* Pretendard-Black.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Black.ttf"; sourceTree = ""; }; @@ -410,9 +410,9 @@ 59C306C82B501B9D00862625 /* RegularOpeningHours.swift */, 59C306A52B4D966C00862625 /* CertificationType.swift */, A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */, + A81EFBB22B5BC57800D0C0D7 /* OpeningHourInformation.swift */, 5977BE732B57FA7A00725C90 /* FilteredStores.swift */, 59F478BE2B5BEA08002FEF9E /* RequestLocation.swift */, - A81EFBB22B5BC57800D0C0D7 /* OpenClosedInformation.swift */, ); path = Entity; sourceTree = ""; @@ -812,7 +812,7 @@ A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */, 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, 592262242B61203000CA5A11 /* DetailView.swift in Sources */, - A81EFBB32B5BC57800D0C0D7 /* OpenClosedInformation.swift in Sources */, + A81EFBB32B5BC57800D0C0D7 /* OpeningHourInformation.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, A8ACB7E22B594F7400540BD1 /* SummaryInformationViewModelImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, diff --git a/KCS/KCS/Domain/Entity/OpenClosedInformation.swift b/KCS/KCS/Domain/Entity/OpeningHourInformation.swift similarity index 55% rename from KCS/KCS/Domain/Entity/OpenClosedInformation.swift rename to KCS/KCS/Domain/Entity/OpeningHourInformation.swift index 7d3ebf17..b2ad55a1 100644 --- a/KCS/KCS/Domain/Entity/OpenClosedInformation.swift +++ b/KCS/KCS/Domain/Entity/OpeningHourInformation.swift @@ -1,5 +1,5 @@ // -// OpenClosedInformation.swift +// OpeningHourInformation.swift // KCS // // Created by ๊น€์˜ํ˜„ on 1/20/24. @@ -7,17 +7,24 @@ import Foundation -struct OpenClosedInformation { +struct OpeningHourInformation { let openClosedContent: OpenClosedContent - let detailOpeningHour: [Day: OpeningHour] + let detailOpeningHour: [DetailOpeningHour] } struct OpenClosedContent { let openClosedType: OpenClosedType - let openingHour: String + let nextOpeningHour: String + +} + +struct DetailOpeningHour { + + let weekDay: Day + let openingHour: OpeningHour } diff --git a/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift index 3b6cb124..77d257d7 100644 --- a/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift +++ b/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift @@ -32,7 +32,7 @@ private extension GetOpenClosedUseCaseImpl { } }() - return OpenClosedContent(openClosedType: nowOpenClosedType, openingHour: openingHourString) + return OpenClosedContent(openClosedType: nowOpenClosedType, nextOpeningHour: openingHourString) } } diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 4a1ccc3f..582b9a27 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -171,27 +171,22 @@ private extension DetailView { let openClosedContent = openClosedInformation.openClosedContent setOpeningHourText(openClosedContent: openClosedContent) if openClosedContent.openClosedType != .none { - let today = Date().weekDay - let detailOpeningHour = openClosedInformation.detailOpeningHour - for idx in today..() + var openClosedOutput = PublishRelay() var thumbnailImageOutput = PublishRelay() init(getOpenClosedUseCase: GetOpenClosedUseCase, fetchImageUseCase: FetchImageUseCase) { @@ -41,7 +41,7 @@ private extension DetailViewModelImpl { openingHour: [RegularOpeningHours] ) { openClosedOutput.accept( - OpenClosedInformation( + OpeningHourInformation( openClosedContent: getOpenClosedUseCase.execute(openingHours: openingHour), detailOpeningHour: detailOpeningHour(openingHours: openingHour) ) @@ -65,41 +65,81 @@ private extension DetailViewModelImpl { private extension DetailViewModelImpl { - func detailOpeningHour(openingHours: [RegularOpeningHours]) -> [Day: OpeningHour] { - if openingHours.isEmpty { return [:] } - var openingHourDictionary: [Day: OpeningHour] = [:] + func detailOpeningHour(openingHours: [RegularOpeningHours]) -> [DetailOpeningHour] { + if openingHours.isEmpty { return [] } + var detailOpeningHourArray: [DetailOpeningHour] = [] - Day.allCases.forEach { day in - let openingHours = openingHours.filter { $0.open.day == day } - if openingHours.isEmpty { - openingHourDictionary[day] = OpeningHour(openingHour: OpenClosedType.dayOff.rawValue, breakTime: nil) - } - if openingHours.count == 1 { - if let openingHour = openingHours.first { - openingHourDictionary[day] = OpeningHour( - openingHour: openingHourToString(open: openingHour.open, close: openingHour.close), - breakTime: nil + let today = Date().weekDay + for idx in today.. String { diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift index eec74f0d..fd494479 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift @@ -30,6 +30,6 @@ protocol DetailViewModelInput { } protocol DetailViewModelOutput { - var openClosedOutput: PublishRelay { get } + var openClosedOutput: PublishRelay { get } var thumbnailImageOutput: PublishRelay { get } } From 615194f4f522c2fbb557d9457fbe86f6215f068e Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 26 Jan 2024 16:18:10 +0900 Subject: [PATCH 039/231] =?UTF-8?q?refactor=20:=20=EC=A1=B0=EA=B1=B4?= =?UTF-8?q?=EB=AC=B8=20switch=EB=AC=B8=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index e0c4e722..741436e5 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -513,11 +513,13 @@ extension HomeViewController: NMFMapViewCameraDelegate { func mapView(_ mapView: NMFMapView, cameraDidChangeByReason reason: Int, animated: Bool) { if reason == NMFMapChangedByDeveloper { mapView.positionMode = .direction - let authorizationStatus = locationManager.authorizationStatus - if authorizationStatus == .denied || authorizationStatus == .restricted || authorizationStatus == .notDetermined { + switch locationManager.authorizationStatus { + case .denied, .restricted, .notDetermined: locationButton.setImage(UIImage.locationButtonNone, for: .normal) - } else { + case .authorizedWhenInUse: locationButton.setImage(UIImage.locationButtonNormal, for: .normal) + default: + return } let northWestPoint = mapView.projection.latlng(from: CGPoint(x: 0, y: 0)) From f1ee622d6cf4e32705bb42e9513632dab239db43 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 26 Jan 2024 18:15:49 +0900 Subject: [PATCH 040/231] =?UTF-8?q?refactor=20:=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#113)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/DetailView.swift | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 582b9a27..a334eaec 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -170,24 +170,23 @@ private extension DetailView { removeStackView(stackView: openingHoursStackView) let openClosedContent = openClosedInformation.openClosedContent setOpeningHourText(openClosedContent: openClosedContent) - if openClosedContent.openClosedType != .none { - openClosedInformation.detailOpeningHour.forEach { [weak self] detailOpeningHour in - let todayWeekDay = Date().weekDay - var cell: OpeningHoursCellView - if detailOpeningHour.weekDay.index == todayWeekDay { - cell = OpeningHoursCellView( - weekday: detailOpeningHour.weekDay, - openingHour: detailOpeningHour.openingHour, - isToday: true - ) - } else { - cell = OpeningHoursCellView( - weekday: detailOpeningHour.weekDay, - openingHour: detailOpeningHour.openingHour - ) - } - self?.openingHoursStackView.addArrangedSubview(cell) - } + + var detailOpeningHour = openClosedInformation.detailOpeningHour + let today = detailOpeningHour.removeFirst() + openingHoursStackView.addArrangedSubview( + OpeningHoursCellView( + weekday: today.weekDay, + openingHour: today.openingHour, + isToday: true + ) + ) + openClosedInformation.detailOpeningHour.forEach { [weak self] detailOpeningHour in + self?.openingHoursStackView.addArrangedSubview( + OpeningHoursCellView( + weekday: detailOpeningHour.weekDay, + openingHour: detailOpeningHour.openingHour + ) + ) } }) .disposed(by: disposeBag) From 9daff707aa35aa2491dede3ec613e00a3441c9d7 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 26 Jan 2024 18:20:24 +0900 Subject: [PATCH 041/231] =?UTF-8?q?refactor=20:=20switch=EB=AC=B8=20?= =?UTF-8?q?=EB=82=B4=20return=EC=9D=84=20break=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 741436e5..41b41ffb 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -519,7 +519,7 @@ extension HomeViewController: NMFMapViewCameraDelegate { case .authorizedWhenInUse: locationButton.setImage(UIImage.locationButtonNormal, for: .normal) default: - return + break } let northWestPoint = mapView.projection.latlng(from: CGPoint(x: 0, y: 0)) From cba81082a436fca800cccf5568fc07a53379d00d Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 01:20:44 +0900 Subject: [PATCH 042/231] =?UTF-8?q?fix=20:=20UILabel=20=EC=83=89=20black?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9=20(#119)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/DetailView.swift | 10 +++++++--- .../Presentation/Home/View/OpeningHoursCellView.swift | 3 +++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index a334eaec..c87f5aec 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -71,6 +71,7 @@ final class DetailView: UIView { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.font = UIFont.pretendard(size: 13, weight: .regular) + label.textColor = .black return label }() @@ -106,6 +107,7 @@ final class DetailView: UIView { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.font = UIFont.pretendard(size: 13, weight: .regular) + label.textColor = .black return label }() @@ -121,6 +123,7 @@ final class DetailView: UIView { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.font = UIFont.pretendard(size: 13, weight: .regular) + label.textColor = .black label.numberOfLines = 0 return label @@ -171,8 +174,9 @@ private extension DetailView { let openClosedContent = openClosedInformation.openClosedContent setOpeningHourText(openClosedContent: openClosedContent) - var detailOpeningHour = openClosedInformation.detailOpeningHour - let today = detailOpeningHour.removeFirst() + var detailOpeningHours = openClosedInformation.detailOpeningHour + if detailOpeningHours.isEmpty { return } + let today = detailOpeningHours.removeFirst() openingHoursStackView.addArrangedSubview( OpeningHoursCellView( weekday: today.weekDay, @@ -180,7 +184,7 @@ private extension DetailView { isToday: true ) ) - openClosedInformation.detailOpeningHour.forEach { [weak self] detailOpeningHour in + detailOpeningHours.forEach { [weak self] detailOpeningHour in self?.openingHoursStackView.addArrangedSubview( OpeningHoursCellView( weekday: detailOpeningHour.weekDay, diff --git a/KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift b/KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift index 196e9a79..47100d0a 100644 --- a/KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift +++ b/KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift @@ -17,6 +17,7 @@ final class OpeningHoursCellView: UIView { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.text = weekday.description + label.textColor = .black if isToday { label.font = UIFont.pretendard(size: 13, weight: .medium) } else { @@ -30,6 +31,7 @@ final class OpeningHoursCellView: UIView { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.text = openingHour.openingHour + label.textColor = .black if isToday { label.font = UIFont.pretendard(size: 12, weight: .medium) } else { @@ -43,6 +45,7 @@ final class OpeningHoursCellView: UIView { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.text = openingHour.breakTime + label.textColor = .black if isToday { label.font = UIFont.pretendard(size: 12, weight: .medium) } else { From d466de629b149e38fc502f47a44255138791c2ba Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 27 Jan 2024 01:26:12 +0900 Subject: [PATCH 043/231] =?UTF-8?q?fix=20:=20=EC=A0=84=ED=99=94=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EB=B0=94=EC=9D=B8=EB=94=A9=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=ED=9E=88=EB=93=A0=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20(#118)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/SummaryInformationView.swift | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift index 367289a4..5008d0b9 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift @@ -74,6 +74,7 @@ final class SummaryInformationView: UIView { var config = UIButton.Configuration.gray() config.image = SystemImage.phone config.cornerStyle = .capsule + config.baseForegroundColor = .primary3 let button = UIButton() button.translatesAutoresizingMaskIntoConstraints = false @@ -82,6 +83,8 @@ final class SummaryInformationView: UIView { return button }() + private var callDisposable: Disposable? + private let dismissIndicatorView: UIView = { let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false @@ -128,6 +131,7 @@ private extension SummaryInformationView { .disposed(by: disposeBag) } + } private extension SummaryInformationView { @@ -216,7 +220,14 @@ extension SummaryInformationView { func setUIContents(store: Store) { storeTitle.text = store.title + if storeTitle.numberOfVisibleLines == 1 { + summaryInformationHeightObserver.accept(230) + } else { + summaryInformationHeightObserver.accept(253) + } + category.text = store.category + removeStackView() store.certificationTypes .map({ @@ -225,16 +236,19 @@ extension SummaryInformationView { .forEach { certificationStackView.addArrangedSubview($0) } + + callDisposable?.dispose() if let phoneNum = store.phoneNumber { - storeCallButton.isEnabled = true - storeCallButton.rx.tap + storeCallButton.isHidden = false + + callDisposable = storeCallButton.rx.tap .bind { [weak self] _ in self?.callButtonTapped(phoneNum: phoneNum) } - .disposed(by: disposeBag) } else { - storeCallButton.isEnabled = false + storeCallButton.isHidden = true } + if let url = store.localPhotos.first { viewModel.action(input: .setInformationView( openingHour: store.openingHour, @@ -243,11 +257,7 @@ extension SummaryInformationView { } else { storeImageView.image = UIImage.basicStore } - if storeTitle.numberOfVisibleLines == 1 { - summaryInformationHeightObserver.accept(230) - } else { - summaryInformationHeightObserver.accept(253) - } + } } From 0d1192d1ace19851ed98589360396aea40e38c3d Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 01:34:10 +0900 Subject: [PATCH 044/231] =?UTF-8?q?fix=20:=20ViewModel=EC=9D=98=20Input=20?= =?UTF-8?q?Output=20=EC=88=98=EC=A0=95=20(#119)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/DetailView.swift | 6 ++---- .../Presentation/Home/ViewModel/DetailViewModelImpl.swift | 5 +++-- .../Home/ViewModel/protocol/DetailViewModel.swift | 7 +++---- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index c87f5aec..c295f796 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -349,11 +349,9 @@ extension DetailView { } else { phoneNumber.text = "์ „ํ™”๋ฒˆํ˜ธ ์ •๋ณด ์—†์Œ" } + viewModel.action(input: .setOpeningHour(openingHour: store.openingHour)) if let url = store.localPhotos.first { - viewModel.action(input: .setInformationView( - openingHour: store.openingHour, - url: url) - ) + viewModel.action(input: .setImageView(url: url)) } else { storeImageView.image = UIImage.basicStore } diff --git a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift index fed48cf5..1058d890 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift @@ -25,11 +25,12 @@ final class DetailViewModelImpl: DetailViewModel { func action(input: DetailViewModelInputCase) { switch input { - case .setInformationView(let openingHour, let url): - setOpenClosed(openingHour: openingHour) + case .setImageView(let url): if let url = url { fetchThumbnailImage(url: url) } + case .setOpeningHour(let openingHour): + setOpenClosed(openingHour: openingHour) } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift index fd494479..6172aef6 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift @@ -17,10 +17,9 @@ protocol DetailViewModel: DetailViewModelInput, DetailViewModelOutput { enum DetailViewModelInputCase { - case setInformationView( - openingHour: [RegularOpeningHours], - url: String? - ) + case setImageView(url: String?) + + case setOpeningHour(openingHour: [RegularOpeningHours]) } protocol DetailViewModelInput { From cfab9196b287d8d51df6dce86cd1b0f81652fd75 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 01:45:19 +0900 Subject: [PATCH 045/231] =?UTF-8?q?fix=20:=20=EA=B0=80=EA=B2=8C=20?= =?UTF-8?q?=EC=A3=BC=EC=86=8C=20constraint=20=EC=88=98=EC=A0=95=20(#119)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/DetailView.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index c295f796..b5ce61b3 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -140,6 +140,7 @@ final class DetailView: UIView { private let viewModel: DetailViewModel private lazy var addressConstraint = address.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16) + private lazy var phoneNumberConstraint = phoneNumber.topAnchor.constraint(equalTo: openingHoursStackView.bottomAnchor, constant: 20) init(viewModel: DetailViewModel) { self.viewModel = viewModel @@ -281,12 +282,12 @@ private extension DetailView { ]) NSLayoutConstraint.activate([ - phoneNumber.topAnchor.constraint(equalTo: openingHoursStackView.bottomAnchor, constant: 20), - phoneNumber.leadingAnchor.constraint(equalTo: phoneIcon.trailingAnchor, constant: 11) + phoneNumber.leadingAnchor.constraint(equalTo: phoneIcon.trailingAnchor, constant: 11), + phoneNumberConstraint ]) NSLayoutConstraint.activate([ - addressIcon.centerYAnchor.constraint(equalTo: address.centerYAnchor), + addressIcon.topAnchor.constraint(equalTo: address.topAnchor), addressIcon.leadingAnchor.constraint(equalTo: clockIcon.leadingAnchor), addressIcon.heightAnchor.constraint(equalToConstant: 16), addressIcon.widthAnchor.constraint(equalToConstant: 11) @@ -320,11 +321,13 @@ private extension DetailView { storeOpenClosed.textColor = .black openingHour.text = openClosedContent.openClosedType.rawValue addressConstraint.constant = -174 + phoneNumberConstraint.constant = 20 - 11 } else { storeOpenClosed.text = openClosedContent.openClosedType.rawValue storeOpenClosed.textColor = UIColor.goodPrice openingHour.text = openClosedContent.nextOpeningHour addressConstraint.constant = -16 + phoneNumberConstraint.constant = 20 } } From 68414c27408476c939a5c1fbcaaebdaa4bfb034d Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 01:49:16 +0900 Subject: [PATCH 046/231] =?UTF-8?q?refactor=20:=20enum=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#119)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/ViewModel/protocol/DetailViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift index 6172aef6..a8a81404 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift @@ -18,8 +18,8 @@ protocol DetailViewModel: DetailViewModelInput, DetailViewModelOutput { enum DetailViewModelInputCase { case setImageView(url: String?) - case setOpeningHour(openingHour: [RegularOpeningHours]) + } protocol DetailViewModelInput { From 8b7596475465916303ea35e5f68f020a14211f97 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 27 Jan 2024 02:32:32 +0900 Subject: [PATCH 047/231] =?UTF-8?q?feat=20:=20SummaryView,=20ViewModel=20b?= =?UTF-8?q?inding=20=EC=88=98=EC=A0=95=20(#118)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 20 +++-- KCS/KCS/Application/SceneDelegate.swift | 2 +- .../Domain/Entity/SummaryViewContents.swift | 17 ++++ .../Home/View/HomeViewController.swift | 4 +- .../Home/View/StoreInformationView.swift | 4 +- .../Home/View/SummaryInformationView.swift | 87 +++++++++---------- .../SummaryInformationViewModelImpl.swift | 59 ------------- .../Home/ViewModel/SummaryViewModelImpl.swift | 69 +++++++++++++++ .../SummaryInformationViewModel.swift | 38 -------- .../ViewModel/protocol/SummaryViewModel.swift | 37 ++++++++ 10 files changed, 183 insertions(+), 154 deletions(-) create mode 100644 KCS/KCS/Domain/Entity/SummaryViewContents.swift delete mode 100644 KCS/KCS/Presentation/Home/ViewModel/SummaryInformationViewModelImpl.swift create mode 100644 KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift delete mode 100644 KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryInformationViewModel.swift create mode 100644 KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 7363d5ae..0d1c0edc 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ 592262242B61203000CA5A11 /* DetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262232B61203000CA5A11 /* DetailView.swift */; }; 592262262B61232F00CA5A11 /* DetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262252B61232F00CA5A11 /* DetailViewModel.swift */; }; 592262282B6124C400CA5A11 /* DetailViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */; }; + 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */; }; 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE572B5524D500725C90 /* RefreshButton.swift */; }; 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE5B2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift */; }; 5977BE5E2B5535C700725C90 /* FetchRefreshStoresUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE5D2B5535C700725C90 /* FetchRefreshStoresUseCase.swift */; }; @@ -79,8 +80,8 @@ A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */; }; A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DA2B58B51A00540BD1 /* Date+.swift */; }; A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */; }; - A8ACB7DF2B594F4B00540BD1 /* SummaryInformationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DE2B594F4B00540BD1 /* SummaryInformationViewModel.swift */; }; - A8ACB7E22B594F7400540BD1 /* SummaryInformationViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E12B594F7400540BD1 /* SummaryInformationViewModelImpl.swift */; }; + A8ACB7DF2B594F4B00540BD1 /* SummaryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DE2B594F4B00540BD1 /* SummaryViewModel.swift */; }; + A8ACB7E22B594F7400540BD1 /* SummaryViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E12B594F7400540BD1 /* SummaryViewModelImpl.swift */; }; A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */; }; A8ACB7EA2B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */; }; A8ACB7ED2B59647400540BD1 /* OpeningHourError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7EC2B59647400540BD1 /* OpeningHourError.swift */; }; @@ -115,6 +116,7 @@ 592262232B61203000CA5A11 /* DetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailView.swift; sourceTree = ""; }; 592262252B61232F00CA5A11 /* DetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewModel.swift; sourceTree = ""; }; 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewModelImpl.swift; sourceTree = ""; }; + 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewContents.swift; sourceTree = ""; }; 5977BE572B5524D500725C90 /* RefreshButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshButton.swift; sourceTree = ""; }; 5977BE5B2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchRefreshStoresUseCaseImpl.swift; sourceTree = ""; }; 5977BE5D2B5535C700725C90 /* FetchRefreshStoresUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchRefreshStoresUseCase.swift; sourceTree = ""; }; @@ -181,8 +183,8 @@ A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepositoryError.swift; sourceTree = ""; }; A8ACB7DA2B58B51A00540BD1 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedType.swift; sourceTree = ""; }; - A8ACB7DE2B594F4B00540BD1 /* SummaryInformationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryInformationViewModel.swift; sourceTree = ""; }; - A8ACB7E12B594F7400540BD1 /* SummaryInformationViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryInformationViewModelImpl.swift; sourceTree = ""; }; + A8ACB7DE2B594F4B00540BD1 /* SummaryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewModel.swift; sourceTree = ""; }; + A8ACB7E12B594F7400540BD1 /* SummaryViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewModelImpl.swift; sourceTree = ""; }; A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetOpenClosedUseCase.swift; sourceTree = ""; }; A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetOpenClosedUseCaseImpl.swift; sourceTree = ""; }; A8ACB7EC2B59647400540BD1 /* OpeningHourError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHourError.swift; sourceTree = ""; }; @@ -280,7 +282,7 @@ A8ACB7E02B594F5F00540BD1 /* protocol */, 5977BE652B553BA800725C90 /* HomeViewModelImpl.swift */, 5977BE672B553C8300725C90 /* HomeDependency.swift */, - A8ACB7E12B594F7400540BD1 /* SummaryInformationViewModelImpl.swift */, + A8ACB7E12B594F7400540BD1 /* SummaryViewModelImpl.swift */, 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */, A8AE4B182B62903100632355 /* OpeningHourViewModel.swift */, ); @@ -413,6 +415,7 @@ A81EFBB22B5BC57800D0C0D7 /* OpeningHourInformation.swift */, 5977BE732B57FA7A00725C90 /* FilteredStores.swift */, 59F478BE2B5BEA08002FEF9E /* RequestLocation.swift */, + 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */, ); path = Entity; sourceTree = ""; @@ -532,7 +535,7 @@ isa = PBXGroup; children = ( 5977BE602B55374000725C90 /* HomeViewModel.swift */, - A8ACB7DE2B594F4B00540BD1 /* SummaryInformationViewModel.swift */, + A8ACB7DE2B594F4B00540BD1 /* SummaryViewModel.swift */, 592262252B61232F00CA5A11 /* DetailViewModel.swift */, ); path = protocol; @@ -814,7 +817,7 @@ 592262242B61203000CA5A11 /* DetailView.swift in Sources */, A81EFBB32B5BC57800D0C0D7 /* OpeningHourInformation.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, - A8ACB7E22B594F7400540BD1 /* SummaryInformationViewModelImpl.swift in Sources */, + A8ACB7E22B594F7400540BD1 /* SummaryViewModelImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */, A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */, @@ -827,6 +830,7 @@ 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */, 5977BE942B59738800725C90 /* FetchStoresUseCase.swift in Sources */, 59F478BF2B5BEA08002FEF9E /* RequestLocation.swift in Sources */, + 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */, 59C306B22B50001F00862625 /* StoreRepositoryImpl.swift in Sources */, 5977BE9A2B59AC3300725C90 /* ImageRepository.swift in Sources */, 591A887D2B384E600059E40F /* AppDelegate.swift in Sources */, @@ -835,7 +839,7 @@ 59C306AD2B4FFAC700862625 /* StoreDTO.swift in Sources */, 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */, 5977BE982B5999E000725C90 /* FetchStoresUseCaseImpl.swift in Sources */, - A8ACB7DF2B594F4B00540BD1 /* SummaryInformationViewModel.swift in Sources */, + A8ACB7DF2B594F4B00540BD1 /* SummaryViewModel.swift in Sources */, A8ACB7F12B5AEBE300540BD1 /* GetStoreInformationUseCase.swift in Sources */, 591A887F2B384E600059E40F /* SceneDelegate.swift in Sources */, A8ACB7EF2B5AEBB900540BD1 /* GetStoreInformationUseCaseImpl.swift in Sources */, diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 6355417f..2769c21a 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -24,7 +24,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { fetchStoresUseCase: FetchStoresUseCaseImpl(repository: repository), getStoreInformationUseCase: GetStoreInformationUseCaseImpl(repository: repository) ) - let summaryInformationViewModel = SummaryInformationViewModelImpl( + let summaryInformationViewModel = SummaryViewModelImpl( getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) ) diff --git a/KCS/KCS/Domain/Entity/SummaryViewContents.swift b/KCS/KCS/Domain/Entity/SummaryViewContents.swift new file mode 100644 index 00000000..1ddb51ff --- /dev/null +++ b/KCS/KCS/Domain/Entity/SummaryViewContents.swift @@ -0,0 +1,17 @@ +// +// SummaryViewContents.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/27/24. +// + +import Foundation + +struct SummaryViewContents { + + let storeTitle: String + let category: String? + let certificationTypes: [CertificationType] + let openClosedContent: OpenClosedContent + +} diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index cedfb63c..2c278d55 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -280,7 +280,7 @@ final class HomeViewController: UIViewController { private var activatedFilter: [CertificationType] = [] private let viewModel: HomeViewModel - private let summaryInformationViewModel: SummaryInformationViewModel + private let summaryInformationViewModel: SummaryViewModel private let detailViewModel: DetailViewModel private lazy var storeInformationHeightConstraint = storeInformationView.heightAnchor.constraint(equalToConstant: 0) private lazy var locationButtonBottomConstraint = locationButton.bottomAnchor.constraint( @@ -296,7 +296,7 @@ final class HomeViewController: UIViewController { init( viewModel: HomeViewModel, - summaryInformationViewModel: SummaryInformationViewModel, + summaryInformationViewModel: SummaryViewModel, detailViewModel: DetailViewModel ) { self.viewModel = viewModel diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift index 3e1a0111..0fb38e78 100644 --- a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift @@ -20,7 +20,7 @@ final class StoreInformationView: UIView { return view }() - private let summaryViewModel: SummaryInformationViewModel + private let summaryViewModel: SummaryViewModel private let summaryInformationHeightObserver: PublishRelay private lazy var detailView: DetailView = { @@ -33,7 +33,7 @@ final class StoreInformationView: UIView { private let detailViewModel: DetailViewModel init( - summaryViewModel: SummaryInformationViewModel, + summaryViewModel: SummaryViewModel, summaryInformationHeightObserver: PublishRelay, detailViewModel: DetailViewModel ) { diff --git a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift index 5008d0b9..b042be70 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift @@ -94,10 +94,10 @@ final class SummaryInformationView: UIView { return view }() - private let viewModel: SummaryInformationViewModel + private let viewModel: SummaryViewModel private let summaryInformationHeightObserver: PublishRelay - init(viewModel: SummaryInformationViewModel, summaryInformationHeightObserver: PublishRelay) { + init(viewModel: SummaryViewModel, summaryInformationHeightObserver: PublishRelay) { self.viewModel = viewModel self.summaryInformationHeightObserver = summaryInformationHeightObserver super.init(frame: .zero) @@ -117,19 +117,44 @@ final class SummaryInformationView: UIView { private extension SummaryInformationView { func bind() { + viewModel.setUIContentsOutput + .bind { [weak self] contents in + guard let self = self else { return } + storeTitle.text = contents.storeTitle + if storeTitle.numberOfVisibleLines == 1 { + summaryInformationHeightObserver.accept(230) + } else { + summaryInformationHeightObserver.accept(253) + } + storeOpenClosed.text = contents.openClosedContent.openClosedType.rawValue + openingHour.text = contents.openClosedContent.nextOpeningHour + category.text = contents.category + contents.certificationTypes + .map({ + CertificationLabel(certificationType: $0, fontSize: 9) + }) + .forEach { [weak self] in + self?.certificationStackView.addArrangedSubview($0) + } + } + .disposed(by: disposeBag) + viewModel.thumbnailImageOutput .subscribe(onNext: { [weak self] data in self?.storeImageView.image = UIImage(data: data) }) .disposed(by: disposeBag) - viewModel.openClosedOutput - .bind { [weak self] openClosedContent in - self?.storeOpenClosed.text = openClosedContent.openClosedType.rawValue - self?.openingHour.text = openClosedContent.nextOpeningHour + viewModel.callButtonOutput + .bind { [weak self] phoneNumber in + guard let self = self else { return } + storeCallButton.isHidden = false + callDisposable = storeCallButton.rx.tap + .bind { [weak self] _ in + self?.callButtonTapped(phoneNum: phoneNumber) + } } .disposed(by: disposeBag) - } } @@ -219,45 +244,19 @@ private extension SummaryInformationView { extension SummaryInformationView { func setUIContents(store: Store) { - storeTitle.text = store.title - if storeTitle.numberOfVisibleLines == 1 { - summaryInformationHeightObserver.accept(230) - } else { - summaryInformationHeightObserver.accept(253) - } - - category.text = store.category - + resetUIContents() + viewModel.action(input: .setUIContents(store: store)) + } + + func resetUIContents() { + storeTitle.text = nil + category.text = nil + storeOpenClosed.text = nil + openingHour.text = nil removeStackView() - store.certificationTypes - .map({ - CertificationLabel(certificationType: $0, fontSize: 9) - }) - .forEach { - certificationStackView.addArrangedSubview($0) - } - callDisposable?.dispose() - if let phoneNum = store.phoneNumber { - storeCallButton.isHidden = false - - callDisposable = storeCallButton.rx.tap - .bind { [weak self] _ in - self?.callButtonTapped(phoneNum: phoneNum) - } - } else { - storeCallButton.isHidden = true - } - - if let url = store.localPhotos.first { - viewModel.action(input: .setInformationView( - openingHour: store.openingHour, - url: url) - ) - } else { - storeImageView.image = UIImage.basicStore - } - + storeCallButton.isHidden = true + storeImageView.image = .basicStore } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/SummaryInformationViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/SummaryInformationViewModelImpl.swift deleted file mode 100644 index df509558..00000000 --- a/KCS/KCS/Presentation/Home/ViewModel/SummaryInformationViewModelImpl.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// SummaryInformationViewModelImpl.swift -// KCS -// -// Created by ๊น€์˜ํ˜„ on 1/18/24. -// - -import RxSwift -import RxRelay - -final class SummaryInformationViewModelImpl: SummaryInformationViewModel { - - private let disposeBag = DisposeBag() - - let getOpenClosedUseCase: GetOpenClosedUseCase - let fetchImageUseCase: FetchImageUseCase - - var openClosedOutput = PublishRelay() - var thumbnailImageOutput = PublishRelay() - - init(getOpenClosedUseCase: GetOpenClosedUseCase, fetchImageUseCase: FetchImageUseCase) { - self.getOpenClosedUseCase = getOpenClosedUseCase - self.fetchImageUseCase = fetchImageUseCase - } - - func action(input: StoreInformationViewInputCase) { - switch input { - case .setInformationView(let openingHour, let url): - setOpenClosed(openingHour: openingHour) - if let url = url { - fetchThumbnailImage(url: url) - } - } - } - -} - -private extension SummaryInformationViewModelImpl { - - func setOpenClosed( - openingHour: [RegularOpeningHours] - ) { - openClosedOutput.accept(getOpenClosedUseCase.execute(openingHours: openingHour)) - } - - func fetchThumbnailImage(url: String) { - fetchImageUseCase.execute(url: url) - .subscribe( - onNext: { [weak self] imageData in - self?.thumbnailImageOutput.accept(imageData) - }, - onError: { error in - print(error.localizedDescription) - } - ) - .disposed(by: disposeBag) - } - -} diff --git a/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift new file mode 100644 index 00000000..0fc04480 --- /dev/null +++ b/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift @@ -0,0 +1,69 @@ +// +// SummaryViewModelImpl.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 1/18/24. +// + +import RxSwift +import RxRelay + +final class SummaryViewModelImpl: SummaryViewModel { + + private let disposeBag = DisposeBag() + + let getOpenClosedUseCase: GetOpenClosedUseCase + let fetchImageUseCase: FetchImageUseCase + + var setUIContentsOutput = PublishRelay() + var thumbnailImageOutput = PublishRelay() + var callButtonOutput = PublishRelay() + + init(getOpenClosedUseCase: GetOpenClosedUseCase, fetchImageUseCase: FetchImageUseCase) { + self.getOpenClosedUseCase = getOpenClosedUseCase + self.fetchImageUseCase = fetchImageUseCase + } + + func action(input: SummaryViewInputCase) { + switch input { + case .setUIContents(store: let store): + setUIContents(store: store) + } + } + +} + +private extension SummaryViewModelImpl { + + func setUIContents(store: Store) { + let openClosedContent = getOpenClosedUseCase.execute(openingHours: store.openingHour) + fetchThumbnailImage(localPhotos: store.localPhotos) + if let phoneNumber = store.phoneNumber { + callButtonOutput.accept(phoneNumber) + } + + setUIContentsOutput.accept( + SummaryViewContents( + storeTitle: store.title, + category: store.category, + certificationTypes: store.certificationTypes, + openClosedContent: openClosedContent + ) + ) + } + + func fetchThumbnailImage(localPhotos: [String]) { + guard let url = localPhotos.first else { return } + fetchImageUseCase.execute(url: url) + .subscribe( + onNext: { [weak self] imageData in + self?.thumbnailImageOutput.accept(imageData) + }, + onError: { error in + print(error.localizedDescription) + } + ) + .disposed(by: disposeBag) + } + +} diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryInformationViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryInformationViewModel.swift deleted file mode 100644 index ed83c4da..00000000 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryInformationViewModel.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// SummaryInformationViewModel.swift -// KCS -// -// Created by ๊น€์˜ํ˜„ on 1/18/24. -// - -import RxSwift -import RxRelay - -protocol SummaryInformationViewModel: StoreInformationViewModelInput, StoreInformationViewModelOutput { - - var getOpenClosedUseCase: GetOpenClosedUseCase { get } - var fetchImageUseCase: FetchImageUseCase { get } - -} - -enum StoreInformationViewInputCase { - - case setInformationView( - openingHour: [RegularOpeningHours], - url: String? - ) - -} - -protocol StoreInformationViewModelInput { - - func action(input: StoreInformationViewInputCase) - -} - -protocol StoreInformationViewModelOutput { - - var openClosedOutput: PublishRelay { get } - var thumbnailImageOutput: PublishRelay { get } - -} diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift new file mode 100644 index 00000000..cd8e8ebb --- /dev/null +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift @@ -0,0 +1,37 @@ +// +// SummaryViewModel.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 1/18/24. +// + +import RxSwift +import RxRelay + +protocol SummaryViewModel: SummaryInformationViewModelInput, SummaryInformationViewModelOutput { + + var getOpenClosedUseCase: GetOpenClosedUseCase { get } + var fetchImageUseCase: FetchImageUseCase { get } + +} + +enum SummaryInformationViewInputCase { + + case setUIContents( + store: Store + ) + +} + +protocol SummaryInformationViewModelInput { + + func action(input: SummaryInformationViewInputCase) + +} + +protocol SummaryInformationViewModelOutput { + + var setUIContentsOutput: PublishRelay { get } + var thumbnailImageOutput: PublishRelay { get } + +} From 661dc8020789fcaadc56a294de27492900a8c6ec Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 27 Jan 2024 02:33:50 +0900 Subject: [PATCH 048/231] chore : rename SummaryViewModel protocol (#118) --- .../Home/ViewModel/protocol/SummaryViewModel.swift | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift index cd8e8ebb..e90ae9ff 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift @@ -8,14 +8,14 @@ import RxSwift import RxRelay -protocol SummaryViewModel: SummaryInformationViewModelInput, SummaryInformationViewModelOutput { +protocol SummaryViewModel: SummaryViewModelInput, SummaryViewModelOutput { var getOpenClosedUseCase: GetOpenClosedUseCase { get } var fetchImageUseCase: FetchImageUseCase { get } } -enum SummaryInformationViewInputCase { +enum SummaryViewInputCase { case setUIContents( store: Store @@ -23,15 +23,16 @@ enum SummaryInformationViewInputCase { } -protocol SummaryInformationViewModelInput { +protocol SummaryViewModelInput { - func action(input: SummaryInformationViewInputCase) + func action(input: SummaryViewInputCase) } -protocol SummaryInformationViewModelOutput { +protocol SummaryViewModelOutput { var setUIContentsOutput: PublishRelay { get } var thumbnailImageOutput: PublishRelay { get } + var callButtonOutput: PublishRelay { get } } From 74a50e65556d811c7b7ed7ae0bbeeb48ed71ec7f Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 02:49:36 +0900 Subject: [PATCH 049/231] =?UTF-8?q?refactor=20:=20detail=20view=20model=20?= =?UTF-8?q?input,=20output=20=EC=88=98=EC=A0=95=20(#119)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/Entity/DetailViewContents.swift | 20 +++++++ .../Presentation/Home/View/DetailView.swift | 58 +++++++++---------- .../Home/ViewModel/DetailViewModelImpl.swift | 30 +++++----- .../ViewModel/protocol/DetailViewModel.swift | 7 ++- 4 files changed, 68 insertions(+), 47 deletions(-) create mode 100644 KCS/KCS/Domain/Entity/DetailViewContents.swift diff --git a/KCS/KCS/Domain/Entity/DetailViewContents.swift b/KCS/KCS/Domain/Entity/DetailViewContents.swift new file mode 100644 index 00000000..e34aa652 --- /dev/null +++ b/KCS/KCS/Domain/Entity/DetailViewContents.swift @@ -0,0 +1,20 @@ +// +// DetailViewContents.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 1/27/24. +// + +import Foundation + +struct DetailViewContents { + + let storeTitle: String + let category: String? + let certificationTypes: [CertificationType] + let address: String + let phoneNumber: String + let openClosedContent: OpenClosedContent + let detailOpeningHour: [DetailOpeningHour] + +} diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index b5ce61b3..585449f3 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -168,14 +168,23 @@ private extension DetailView { }) .disposed(by: disposeBag) - viewModel.openClosedOutput - .subscribe(onNext: { [weak self] openClosedInformation in + viewModel.setUIContentsOutput + .bind { [weak self] detailViewContents in guard let self = self else { return } - removeStackView(stackView: openingHoursStackView) - let openClosedContent = openClosedInformation.openClosedContent - setOpeningHourText(openClosedContent: openClosedContent) + storeTitle.text = detailViewContents.storeTitle + category.text = detailViewContents.category + detailViewContents.certificationTypes + .map({ + CertificationLabel(certificationType: $0, fontSize: 11) + }) + .forEach { [weak self] in + self?.certificationStackView.addArrangedSubview($0) + } + address.text = detailViewContents.address + phoneNumber.text = detailViewContents.phoneNumber + setOpeningHourText(openClosedContent: detailViewContents.openClosedContent) - var detailOpeningHours = openClosedInformation.detailOpeningHour + var detailOpeningHours = detailViewContents.detailOpeningHour if detailOpeningHours.isEmpty { return } let today = detailOpeningHours.removeFirst() openingHoursStackView.addArrangedSubview( @@ -193,7 +202,7 @@ private extension DetailView { ) ) } - }) + } .disposed(by: disposeBag) } @@ -336,28 +345,19 @@ private extension DetailView { extension DetailView { func setUIContents(store: Store) { - storeTitle.text = store.title - category.text = store.category - address.text = store.address - removeStackView(stackView: certificationStackView) - store.certificationTypes - .map({ - CertificationLabel(certificationType: $0, fontSize: 11) - }) - .forEach { - certificationStackView.addArrangedSubview($0) - } - if let phoneNum = store.phoneNumber { - phoneNumber.text = phoneNum - } else { - phoneNumber.text = "์ „ํ™”๋ฒˆํ˜ธ ์ •๋ณด ์—†์Œ" - } - viewModel.action(input: .setOpeningHour(openingHour: store.openingHour)) - if let url = store.localPhotos.first { - viewModel.action(input: .setImageView(url: url)) - } else { - storeImageView.image = UIImage.basicStore - } + resetUIContents() + viewModel.action(input: .setUIContents(store: store)) } + func resetUIContents() { + storeTitle.text = nil + category.text = nil + address.text = nil + phoneNumber.text = nil + storeOpenClosed.text = nil + openingHour.text = nil + storeImageView.image = UIImage.basicStore + removeStackView(stackView: certificationStackView) + removeStackView(stackView: openingHoursStackView) + } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift index 1058d890..0666fa8c 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift @@ -15,7 +15,7 @@ final class DetailViewModelImpl: DetailViewModel { let getOpenClosedUseCase: GetOpenClosedUseCase let fetchImageUseCase: FetchImageUseCase - var openClosedOutput = PublishRelay() + var setUIContentsOutput = PublishRelay() var thumbnailImageOutput = PublishRelay() init(getOpenClosedUseCase: GetOpenClosedUseCase, fetchImageUseCase: FetchImageUseCase) { @@ -25,12 +25,8 @@ final class DetailViewModelImpl: DetailViewModel { func action(input: DetailViewModelInputCase) { switch input { - case .setImageView(let url): - if let url = url { - fetchThumbnailImage(url: url) - } - case .setOpeningHour(let openingHour): - setOpenClosed(openingHour: openingHour) + case .setUIContents(let store): + setUIContents(store: store) } } @@ -38,18 +34,22 @@ final class DetailViewModelImpl: DetailViewModel { private extension DetailViewModelImpl { - func setOpenClosed( - openingHour: [RegularOpeningHours] - ) { - openClosedOutput.accept( - OpeningHourInformation( - openClosedContent: getOpenClosedUseCase.execute(openingHours: openingHour), - detailOpeningHour: detailOpeningHour(openingHours: openingHour) + func setUIContents(store: Store) { + setUIContentsOutput.accept( + DetailViewContents( + storeTitle: store.title, + category: store.category, + certificationTypes: store.certificationTypes, + address: store.address, + phoneNumber: store.phoneNumber ?? "์ „ํ™”๋ฒˆํ˜ธ ์ •๋ณด ์—†์Œ", + openClosedContent: getOpenClosedUseCase.execute(openingHours: store.openingHour), + detailOpeningHour: detailOpeningHour(openingHours: store.openingHour) ) ) } - func fetchThumbnailImage(url: String) { + func fetchThumbnailImage(localPhotos: [String]) { + guard let url = localPhotos.first else { return } fetchImageUseCase.execute(url: url) .subscribe( onNext: { [weak self] imageData in diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift index a8a81404..7de68dbd 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift @@ -17,8 +17,7 @@ protocol DetailViewModel: DetailViewModelInput, DetailViewModelOutput { enum DetailViewModelInputCase { - case setImageView(url: String?) - case setOpeningHour(openingHour: [RegularOpeningHours]) + case setUIContents(store: Store) } @@ -29,6 +28,8 @@ protocol DetailViewModelInput { } protocol DetailViewModelOutput { - var openClosedOutput: PublishRelay { get } + + var setUIContentsOutput: PublishRelay { get } var thumbnailImageOutput: PublishRelay { get } + } From ff3d32e4375a9f78183fe65fb338234b05c1c2f1 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 03:24:23 +0900 Subject: [PATCH 050/231] =?UTF-8?q?fix=20:=20pbx=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=82=AC=EC=A7=84=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95=20(#122)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ++++ KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift | 1 + 2 files changed, 5 insertions(+) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 0d1c0edc..e0ed10eb 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -77,6 +77,7 @@ A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870E2B4F836C00767225 /* SummaryInformationView.swift */; }; + A8A7E05B2B642EC900D015E5 /* DetailViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */; }; A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */; }; A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DA2B58B51A00540BD1 /* Date+.swift */; }; A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */; }; @@ -180,6 +181,7 @@ A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; A890870E2B4F836C00767225 /* SummaryInformationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryInformationView.swift; sourceTree = ""; }; + A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewContents.swift; sourceTree = ""; }; A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepositoryError.swift; sourceTree = ""; }; A8ACB7DA2B58B51A00540BD1 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedType.swift; sourceTree = ""; }; @@ -416,6 +418,7 @@ 5977BE732B57FA7A00725C90 /* FilteredStores.swift */, 59F478BE2B5BEA08002FEF9E /* RequestLocation.swift */, 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */, + A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */, ); path = Entity; sourceTree = ""; @@ -798,6 +801,7 @@ 59C306C92B501B9D00862625 /* RegularOpeningHours.swift in Sources */, 59F478B52B59BE0B002FEF9E /* FetchImageUseCase.swift in Sources */, 59C306BF2B50109100862625 /* Location.swift in Sources */, + A8A7E05B2B642EC900D015E5 /* DetailViewContents.swift in Sources */, 591A88812B384E600059E40F /* HomeViewController.swift in Sources */, 5977BE9C2B59AC8D00725C90 /* ImageRepositoryImpl.swift in Sources */, 59F478B32B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift in Sources */, diff --git a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift index 0666fa8c..04dff66c 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift @@ -35,6 +35,7 @@ final class DetailViewModelImpl: DetailViewModel { private extension DetailViewModelImpl { func setUIContents(store: Store) { + fetchThumbnailImage(localPhotos: store.localPhotos) setUIContentsOutput.accept( DetailViewContents( storeTitle: store.title, From 4c8097fcf46a612b7229dac00b4655268f8a1b2e Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 27 Jan 2024 03:29:39 +0900 Subject: [PATCH 051/231] =?UTF-8?q?feat=20:=20dimView=20tap=ED=95=98?= =?UTF-8?q?=EB=A9=B4=20=EC=9A=94=EC=95=BD=EC=A0=95=EB=B3=B4=EB=A1=9C=20?= =?UTF-8?q?=EB=8F=8C=EC=95=84=EC=98=A4=EB=8F=84=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#123)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 2c278d55..0ac9760c 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -163,11 +163,25 @@ final class HomeViewController: UIViewController { return button }() - private let dimView: UIView = { + private lazy var dimView: UIView = { let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false view.backgroundColor = .clear - view.isUserInteractionEnabled = false + view.isUserInteractionEnabled = true + + view.rx.tapGesture() + .when(.ended) + .subscribe(onNext: { [weak self] _ in + guard let self = self else { return } + setStoreInformationConstraints( + heightConstraint: storeInformationOriginalHeight, + bottomConstraint: -16, + animated: true + ) + storeInformationView.changeToSummary() + unDimmedView() + }) + .disposed(by: disposeBag) return view }() @@ -316,6 +330,7 @@ final class HomeViewController: UIViewController { configureConstraints() checkUserCurrentLocationAuthorization() bind() + unDimmedView() } } @@ -439,9 +454,10 @@ private extension HomeViewController { } func dimmedView() { - goodPriceFilterButton.isUserInteractionEnabled = false - exemplaryFilterButton.isUserInteractionEnabled = false - safeFilterButton.isUserInteractionEnabled = false +// goodPriceFilterButton.isUserInteractionEnabled = false +// exemplaryFilterButton.isUserInteractionEnabled = false +// safeFilterButton.isUserInteractionEnabled = false + dimView.isUserInteractionEnabled = true UIView.animate(withDuration: 0.3) { [weak self] in self?.dimView.backgroundColor = .black self?.dimView.alpha = 0.4 @@ -449,9 +465,10 @@ private extension HomeViewController { } func unDimmedView() { - goodPriceFilterButton.isUserInteractionEnabled = true - exemplaryFilterButton.isUserInteractionEnabled = true - safeFilterButton.isUserInteractionEnabled = true + dimView.isUserInteractionEnabled = false +// goodPriceFilterButton.isUserInteractionEnabled = true +// exemplaryFilterButton.isUserInteractionEnabled = true +// safeFilterButton.isUserInteractionEnabled = true UIView.animate(withDuration: 0.3) { [weak self] in self?.dimView.backgroundColor = .clear } From 2f7a093dc7cf09d0ec0238427dae863a2d6bf535 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 27 Jan 2024 03:33:56 +0900 Subject: [PATCH 052/231] =?UTF-8?q?feat=20:=20dimView=20alpha=20=EA=B0=92?= =?UTF-8?q?=20=EC=84=A0=EC=96=B8=EC=8B=9C=20=EC=84=A4=EC=A0=95,=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0=20(#123)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 0ac9760c..512a7b19 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -168,6 +168,7 @@ final class HomeViewController: UIViewController { view.translatesAutoresizingMaskIntoConstraints = false view.backgroundColor = .clear view.isUserInteractionEnabled = true + view.alpha = 0.4 view.rx.tapGesture() .when(.ended) @@ -454,21 +455,14 @@ private extension HomeViewController { } func dimmedView() { -// goodPriceFilterButton.isUserInteractionEnabled = false -// exemplaryFilterButton.isUserInteractionEnabled = false -// safeFilterButton.isUserInteractionEnabled = false dimView.isUserInteractionEnabled = true UIView.animate(withDuration: 0.3) { [weak self] in self?.dimView.backgroundColor = .black - self?.dimView.alpha = 0.4 } } func unDimmedView() { dimView.isUserInteractionEnabled = false -// goodPriceFilterButton.isUserInteractionEnabled = true -// exemplaryFilterButton.isUserInteractionEnabled = true -// safeFilterButton.isUserInteractionEnabled = true UIView.animate(withDuration: 0.3) { [weak self] in self?.dimView.backgroundColor = .clear } From 6d46b5d8cc0ee1d5d0302d4da9c841be24a30bd5 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 12:40:09 +0900 Subject: [PATCH 053/231] =?UTF-8?q?feat=20:=20location=20button=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20view=20model=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 +++ KCS/KCS/Domain/Entity/LocationButton.swift | 15 +++++++++++ .../Home/View/HomeViewController.swift | 22 +++++++--------- .../Home/ViewModel/HomeViewModelImpl.swift | 26 +++++++++++++++++++ .../ViewModel/protocol/HomeViewModel.swift | 7 ++--- 5 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 KCS/KCS/Domain/Entity/LocationButton.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 7363d5ae..22476c1b 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -76,6 +76,7 @@ A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870E2B4F836C00767225 /* SummaryInformationView.swift */; }; + A8A7E05D2B64AF1300D015E5 /* LocationButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05C2B64AF1200D015E5 /* LocationButton.swift */; }; A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */; }; A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DA2B58B51A00540BD1 /* Date+.swift */; }; A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */; }; @@ -178,6 +179,7 @@ A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; A890870E2B4F836C00767225 /* SummaryInformationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryInformationView.swift; sourceTree = ""; }; + A8A7E05C2B64AF1200D015E5 /* LocationButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationButton.swift; sourceTree = ""; }; A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepositoryError.swift; sourceTree = ""; }; A8ACB7DA2B58B51A00540BD1 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedType.swift; sourceTree = ""; }; @@ -413,6 +415,7 @@ A81EFBB22B5BC57800D0C0D7 /* OpeningHourInformation.swift */, 5977BE732B57FA7A00725C90 /* FilteredStores.swift */, 59F478BE2B5BEA08002FEF9E /* RequestLocation.swift */, + A8A7E05C2B64AF1200D015E5 /* LocationButton.swift */, ); path = Entity; sourceTree = ""; @@ -800,6 +803,7 @@ 59F478B32B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift in Sources */, A8ACB7ED2B59647400540BD1 /* OpeningHourError.swift in Sources */, 5977BE742B57FA7A00725C90 /* FilteredStores.swift in Sources */, + A8A7E05D2B64AF1300D015E5 /* LocationButton.swift in Sources */, 5977BE5E2B5535C700725C90 /* FetchRefreshStoresUseCase.swift in Sources */, 59C306B02B4FFE4400862625 /* StoreResponse.swift in Sources */, A8ACB7EA2B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift in Sources */, diff --git a/KCS/KCS/Domain/Entity/LocationButton.swift b/KCS/KCS/Domain/Entity/LocationButton.swift new file mode 100644 index 00000000..2eb1ddf2 --- /dev/null +++ b/KCS/KCS/Domain/Entity/LocationButton.swift @@ -0,0 +1,15 @@ +// +// LocationButton.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 1/27/24. +// + +import NMapsMap + +struct LocationButton { + + let imageName: String + let positionMode: NMFMyPositionMode + +} diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index cedfb63c..54ac5a14 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -66,18 +66,8 @@ final class HomeViewController: UIViewController { button.rx.tap .bind { [weak self] _ in guard let self = self else { return } - checkLocationService() - switch mapView.mapView.positionMode { - case .direction: - button.setImage(UIImage.locationButtonCompass, for: .normal) - mapView.mapView.positionMode = .compass - case .compass, .normal: - button.setImage(UIImage.locationButtonNormal, for: .normal) - mapView.mapView.positionMode = .direction - default: - break - } + viewModel.action(input: .locationButtonTapped(positionMode: mapView.mapView.positionMode)) } .disposed(by: self.disposeBag) button.setImage(UIImage.locationButtonNone, for: .normal) @@ -180,7 +170,7 @@ final class HomeViewController: UIViewController { ) view.translatesAutoresizingMaskIntoConstraints = false - // TODO: ๋กœ์ง ๋ทฐ๋ชจ๋ธ๋กœ ์ด๋™ + // TODO: - ๋กœ์ง ๋ทฐ๋ชจ๋ธ๋กœ ์ด๋™ view.rx.panGesture() .when(.changed) .subscribe(onNext: { [weak self] recognizer in @@ -344,6 +334,13 @@ private extension HomeViewController { } .disposed(by: disposeBag) + viewModel.locationButtonOutput + .bind { [weak self] locationButton in + self?.locationButton.setImage(UIImage(named: locationButton.imageName), for: .normal) + self?.mapView.mapView.positionMode = locationButton.positionMode + } + .disposed(by: disposeBag) + summaryInformationHeightObserver.bind { [weak self] height in self?.storeInformationOriginalHeight = height self?.setStoreInformationConstraints( @@ -556,6 +553,7 @@ extension HomeViewController: NMFMapViewCameraDelegate { func mapView(_ mapView: NMFMapView, cameraDidChangeByReason reason: Int, animated: Bool) { if reason == NMFMapChangedByDeveloper { mapView.positionMode = .direction + switch locationManager.authorizationStatus { case .denied, .restricted, .notDetermined: locationButton.setImage(UIImage.locationButtonNone, for: .normal) diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index fc819bc5..ba10a5d9 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -7,6 +7,8 @@ import RxRelay import RxSwift +import CoreLocation +import NMapsMap final class HomeViewModelImpl: HomeViewModel { @@ -18,6 +20,7 @@ final class HomeViewModelImpl: HomeViewModel { var getStoreInformationOutput = PublishRelay() var refreshOutput = PublishRelay<[FilteredStores]>() + var locationButtonOutput = PublishRelay() let dependency: HomeDependency @@ -45,6 +48,8 @@ final class HomeViewModelImpl: HomeViewModel { fetchFilteredStores(filters: filters) case .markerTapped(let tag): try markerTapped(tag: tag) + case .locationButtonTapped(let positionMode): + setLocationButtonImage(positionMode: positionMode) } } catch { print(error.localizedDescription) @@ -118,4 +123,25 @@ private extension HomeViewModelImpl { ) } + func setLocationButtonImage(positionMode: NMFMyPositionMode) { + switch positionMode { + case .direction: + locationButtonOutput.accept( + LocationButton( + imageName: "LocationButtonCompass", + positionMode: .compass + ) + ) + case .compass, .normal: + locationButtonOutput.accept( + LocationButton( + imageName: "LocationButtonNormal", + positionMode: .direction + ) + ) + default: + break + } + } + } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 9d647d41..152f6fb1 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -6,6 +6,7 @@ // import RxCocoa +import NMapsMap protocol HomeViewModel: HomeViewModelInput, HomeViewModelOutput { @@ -33,9 +34,8 @@ enum HomeViewModelInputCase { case fetchFilteredStores( filters: [CertificationType] ) - case markerTapped( - tag: UInt - ) + case markerTapped(tag: UInt) + case locationButtonTapped(positionMode: NMFMyPositionMode) } @@ -49,5 +49,6 @@ protocol HomeViewModelOutput { var getStoreInformationOutput: PublishRelay { get } var refreshOutput: PublishRelay<[FilteredStores]> { get } + var locationButtonOutput: PublishRelay { get } } From ef5c8dc5c6e78e8dcfe1ab432f0ea10f3eef07a8 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 16:22:15 +0900 Subject: [PATCH 054/231] =?UTF-8?q?refactor=20:=20=EC=A0=9C=EC=8A=A4?= =?UTF-8?q?=EC=B3=90=20=EB=A1=9C=EC=A7=81=20ViewModel=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 12 +- KCS/KCS/Domain/Entity/LocationButton.swift | 15 -- .../StoreInformationViewConstraints.swift | 22 +++ .../Extension/NMFMyPosition+.swift | 24 +++ .../Home/View/HomeViewController.swift | 173 ++++++++---------- .../Home/ViewModel/HomeDependency.swift | 5 +- .../Home/ViewModel/HomeViewModelImpl.swift | 101 ++++++++-- .../ViewModel/protocol/HomeViewModel.swift | 10 +- 8 files changed, 224 insertions(+), 138 deletions(-) delete mode 100644 KCS/KCS/Domain/Entity/LocationButton.swift create mode 100644 KCS/KCS/Domain/Entity/StoreInformationViewConstraints.swift create mode 100644 KCS/KCS/Presentation/Extension/NMFMyPosition+.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index ba5d32c0..1df88176 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -77,8 +77,9 @@ A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870E2B4F836C00767225 /* SummaryInformationView.swift */; }; - A8A7E05D2B64AF1300D015E5 /* LocationButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05C2B64AF1200D015E5 /* LocationButton.swift */; }; A8A7E05B2B642EC900D015E5 /* DetailViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */; }; + A8A7E05D2B64AF1300D015E5 /* StoreInformationViewConstraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05C2B64AF1200D015E5 /* StoreInformationViewConstraints.swift */; }; + A8A7E0602B64E62200D015E5 /* NMFMyPosition+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */; }; A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */; }; A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DA2B58B51A00540BD1 /* Date+.swift */; }; A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */; }; @@ -182,8 +183,9 @@ A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; A890870E2B4F836C00767225 /* SummaryInformationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryInformationView.swift; sourceTree = ""; }; - A8A7E05C2B64AF1200D015E5 /* LocationButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationButton.swift; sourceTree = ""; }; A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewContents.swift; sourceTree = ""; }; + A8A7E05C2B64AF1200D015E5 /* StoreInformationViewConstraints.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewConstraints.swift; sourceTree = ""; }; + A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NMFMyPosition+.swift"; sourceTree = ""; }; A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepositoryError.swift; sourceTree = ""; }; A8ACB7DA2B58B51A00540BD1 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedType.swift; sourceTree = ""; }; @@ -419,7 +421,7 @@ A81EFBB22B5BC57800D0C0D7 /* OpeningHourInformation.swift */, 5977BE732B57FA7A00725C90 /* FilteredStores.swift */, 59F478BE2B5BEA08002FEF9E /* RequestLocation.swift */, - A8A7E05C2B64AF1200D015E5 /* LocationButton.swift */, + A8A7E05C2B64AF1200D015E5 /* StoreInformationViewConstraints.swift */, 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */, A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */, ); @@ -505,6 +507,7 @@ A890870C2B4EF91600767225 /* UIView+SetLayer.swift */, A81EFBB42B5D477600D0C0D7 /* UILabel+.swift */, A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */, + A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */, ); path = Extension; sourceTree = ""; @@ -810,9 +813,10 @@ 59F478B32B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift in Sources */, A8ACB7ED2B59647400540BD1 /* OpeningHourError.swift in Sources */, 5977BE742B57FA7A00725C90 /* FilteredStores.swift in Sources */, - A8A7E05D2B64AF1300D015E5 /* LocationButton.swift in Sources */, + A8A7E05D2B64AF1300D015E5 /* StoreInformationViewConstraints.swift in Sources */, 5977BE5E2B5535C700725C90 /* FetchRefreshStoresUseCase.swift in Sources */, 59C306B02B4FFE4400862625 /* StoreResponse.swift in Sources */, + A8A7E0602B64E62200D015E5 /* NMFMyPosition+.swift in Sources */, A8ACB7EA2B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift in Sources */, A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */, 59C306CD2B5035B100862625 /* StoreAPI.swift in Sources */, diff --git a/KCS/KCS/Domain/Entity/LocationButton.swift b/KCS/KCS/Domain/Entity/LocationButton.swift deleted file mode 100644 index 2eb1ddf2..00000000 --- a/KCS/KCS/Domain/Entity/LocationButton.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// LocationButton.swift -// KCS -// -// Created by ๊น€์˜ํ˜„ on 1/27/24. -// - -import NMapsMap - -struct LocationButton { - - let imageName: String - let positionMode: NMFMyPositionMode - -} diff --git a/KCS/KCS/Domain/Entity/StoreInformationViewConstraints.swift b/KCS/KCS/Domain/Entity/StoreInformationViewConstraints.swift new file mode 100644 index 00000000..ec235069 --- /dev/null +++ b/KCS/KCS/Domain/Entity/StoreInformationViewConstraints.swift @@ -0,0 +1,22 @@ +// +// StoreInformationViewConstraints.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 1/27/24. +// + +import Foundation + +struct StoreInformationViewConstraints { + + let heightConstraint: CGFloat + let bottomConstraint: CGFloat + let animated: Bool + + init(heightConstraint: CGFloat, bottomConstraint: CGFloat, animated: Bool = false) { + self.heightConstraint = heightConstraint + self.bottomConstraint = bottomConstraint + self.animated = animated + } + +} diff --git a/KCS/KCS/Presentation/Extension/NMFMyPosition+.swift b/KCS/KCS/Presentation/Extension/NMFMyPosition+.swift new file mode 100644 index 00000000..7a634f00 --- /dev/null +++ b/KCS/KCS/Presentation/Extension/NMFMyPosition+.swift @@ -0,0 +1,24 @@ +// +// NMFMyPosition+.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 1/27/24. +// + +import Foundation +import NMapsMap + +extension NMFMyPositionMode { + + func getImageName() -> String? { + switch self { + case .direction: + return "LocationButtonCompass" + case .compass, .normal: + return "LocationButtonNormal" + default: + return nil + } + } + +} diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index f844cceb..1cf6c0d8 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -160,19 +160,19 @@ final class HomeViewController: UIViewController { view.isUserInteractionEnabled = true view.alpha = 0.4 - view.rx.tapGesture() - .when(.ended) - .subscribe(onNext: { [weak self] _ in - guard let self = self else { return } - setStoreInformationConstraints( - heightConstraint: storeInformationOriginalHeight, - bottomConstraint: -16, - animated: true - ) - storeInformationView.changeToSummary() - unDimmedView() - }) - .disposed(by: disposeBag) +// view.rx.tapGesture() +// .when(.ended) +// .subscribe(onNext: { [weak self] _ in +// guard let self = self else { return } +// setStoreInformationConstraints( +// heightConstraint: storeInformationOriginalHeight, +// bottomConstraint: -16, +// animated: true +// ) +// storeInformationView.changeToSummary() +// unDimmedView() +// }) +// .disposed(by: disposeBag) return view }() @@ -185,100 +185,47 @@ final class HomeViewController: UIViewController { ) view.translatesAutoresizingMaskIntoConstraints = false - // TODO: - ๋กœ์ง ๋ทฐ๋ชจ๋ธ๋กœ ์ด๋™ + // TODO: ๋กœ์ง ๋ทฐ๋ชจ๋ธ๋กœ ์ด๋™ view.rx.panGesture() .when(.changed) - .subscribe(onNext: { [weak self] recognizer in + .bind { [weak self] recognizer in guard let self = self else { return } let transition = recognizer.translation(in: storeInformationView) - let height = storeInformationHeightConstraint.constant - transition.y - recognizer.setTranslation(.zero, in: storeInformationView) - if height > 230 && height < 620 { - setStoreInformationConstraints( - heightConstraint: height, - bottomConstraint: locationButtonBottomConstraint.constant - ) - } - - if storeInformationHeightConstraint.constant > 420 { - // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. - storeInformationView.changeToDetail() - dimmedView() - setStoreInformationConstraints( - heightConstraint: storeInformationHeightConstraint.constant, - bottomConstraint: storeInformationHeightConstraint.constant - 441 - ) - } else { - storeInformationView.changeToSummary() - unDimmedView() - setStoreInformationConstraints( - heightConstraint: storeInformationHeightConstraint.constant, - bottomConstraint: -16 + viewModel.action( + input: .storeInformationViewPanGestureChanged( + height: storeInformationHeightConstraint.constant - transition.y ) - } - - }) + ) + } .disposed(by: disposeBag) view.rx.panGesture() .when(.ended) - .subscribe(onNext: { [weak self] recognizer in + .bind { [weak self] recognizer in guard let self = self else { return } - if recognizer.velocity(in: view).y < -1000 { - setStoreInformationConstraints( - heightConstraint: 600, - bottomConstraint: 600 - 441, - animated: true - ) - storeInformationView.changeToDetail() - dimmedView() - } else if recognizer.velocity(in: view).y > 1000 { - setStoreInformationConstraints( - heightConstraint: storeInformationOriginalHeight, - bottomConstraint: -16, - animated: true - ) - storeInformationView.changeToSummary() - unDimmedView() - } + viewModel.action(input: .storeInformationViewSwipe(velocity: recognizer.velocity(in: view).y)) - if storeInformationHeightConstraint.constant > 420 { - setStoreInformationConstraints( - heightConstraint: 600, - bottomConstraint: 600 - 441, - animated: true - ) - storeInformationView.changeToDetail() - dimmedView() - } else { - setStoreInformationConstraints( - heightConstraint: storeInformationOriginalHeight, - bottomConstraint: -16, - animated: true - ) - storeInformationView.changeToSummary() - unDimmedView() - } - }) + viewModel.action(input: .storeInformationViewPanGestureEnded(height: storeInformationHeightConstraint.constant)) + } .disposed(by: disposeBag) - view.rx.tapGesture() - .when(.ended) - .subscribe(onNext: { [weak self] _ in - guard let self = self else { return } - if storeInformationHeightConstraint.constant == storeInformationOriginalHeight { - setStoreInformationConstraints( - heightConstraint: 600, - bottomConstraint: 600 - 441, - animated: true - ) - storeInformationView.changeToDetail() - dimmedView() - } - }) - .disposed(by: disposeBag) +// view.rx.tapGesture() +// .when(.ended) +// .bind { [weak self] _ in +// guard let self = self else { return } +// if storeInformationHeightConstraint.constant == storeInformationOriginalHeight { +// setStoreInformationConstraints( +// heightConstraint: 600, +// bottomConstraint: 600 - 441, +// animated: true +// ) +// storeInformationView.changeToDetail() +// dimmedView() +// } +// } +// .disposed(by: disposeBag) return view }() @@ -297,7 +244,6 @@ final class HomeViewController: UIViewController { constant: -37 ) private let summaryInformationHeightObserver = PublishRelay() - private var storeInformationOriginalHeight: CGFloat = 0 init( viewModel: HomeViewModel, @@ -334,9 +280,9 @@ private extension HomeViewController { guard let self = self else { return } self.markers.forEach { $0.mapView = nil } filteredStores.forEach { filteredStore in - filteredStore.stores.forEach { + filteredStore.stores.forEach { [weak self] in let location = $0.location.toMapLocation() - self.setMarker(marker: Marker(certificationType: filteredStore.type, position: location), tag: UInt($0.id)) + self?.setMarker(marker: Marker(certificationType: filteredStore.type, position: location), tag: UInt($0.id)) } } storeInformationViewDismiss() @@ -345,20 +291,45 @@ private extension HomeViewController { viewModel.getStoreInformationOutput .bind { [weak self] store in - guard let self = self else { return } - storeInformationView.setUIContents(store: store) + self?.storeInformationView.setUIContents(store: store) } .disposed(by: disposeBag) viewModel.locationButtonOutput - .bind { [weak self] locationButton in - self?.locationButton.setImage(UIImage(named: locationButton.imageName), for: .normal) - self?.mapView.mapView.positionMode = locationButton.positionMode + .bind { [weak self] positionMode in + guard let imageName = positionMode.getImageName() else { return } + self?.locationButton.setImage(UIImage(named: imageName), for: .normal) + self?.mapView.mapView.positionMode = positionMode + } + .disposed(by: disposeBag) + + viewModel.storeInformationViewHeightOutput + .bind { [weak self] constraints in + self?.setStoreInformationConstraints( + heightConstraint: constraints.heightConstraint, + bottomConstraint: constraints.bottomConstraint, + animated: constraints.animated + ) + } + .disposed(by: disposeBag) + + viewModel.detailToSummaryOutput + .bind { [weak self] _ in + self?.storeInformationView.changeToSummary() + self?.unDimmedView() + } + .disposed(by: disposeBag) + + viewModel.summaryToDetailOutput + .bind { [weak self] _ in + self?.storeInformationView.changeToDetail() + self?.dimmedView() } .disposed(by: disposeBag) + // MARK: ์ถ”ํ›„ ์ˆ˜์ • ํ•„์š” summaryInformationHeightObserver.bind { [weak self] height in - self?.storeInformationOriginalHeight = height + self?.viewModel.action(input: .setStoreInformationOriginalHeight(height: height)) self?.setStoreInformationConstraints( heightConstraint: height, bottomConstraint: -16, diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift index 6b09372c..fee91c60 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift @@ -5,8 +5,11 @@ // Created by ์กฐ์„ฑ๋ฏผ on 1/15/24. // -import Foundation +import RxSwift struct HomeDependency { + let disposeBag = DisposeBag() + var storeInformationOriginalHeight: CGFloat = 0 + } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index ba10a5d9..52da68e4 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -16,13 +16,14 @@ final class HomeViewModelImpl: HomeViewModel { let fetchStoresUseCase: FetchStoresUseCase let getStoreInformationUseCase: GetStoreInformationUseCase - private let disposeBag = DisposeBag() - var getStoreInformationOutput = PublishRelay() var refreshOutput = PublishRelay<[FilteredStores]>() - var locationButtonOutput = PublishRelay() + var locationButtonOutput = PublishRelay() + var storeInformationViewHeightOutput = PublishRelay() + var summaryToDetailOutput = PublishRelay() + var detailToSummaryOutput = PublishRelay() - let dependency: HomeDependency + var dependency: HomeDependency init( dependency: HomeDependency, @@ -50,6 +51,16 @@ final class HomeViewModelImpl: HomeViewModel { try markerTapped(tag: tag) case .locationButtonTapped(let positionMode): setLocationButtonImage(positionMode: positionMode) + case .setStoreInformationOriginalHeight(let height): + setStoreInformationOriginalHeight(height: height) + case .storeInformationViewPanGestureChanged(let height): + storeInformationViewPanGestureChanged(height: height) + case .storeInformationViewPanGestureEnded(let height): + storeInformationViewPanGestureEnded(height: height) + case .storeInformationViewSwipe(let velocity): + storeInformationViewSwipe(velocity: velocity) +// case .storeInformationViewTapGestureEnded(let height): +// storeInformationViewTapGestureEnded(height: height) } } catch { print(error.localizedDescription) @@ -75,7 +86,7 @@ private extension HomeViewModelImpl { print(error.localizedDescription) } ) - .disposed(by: disposeBag) + .disposed(by: dependency.disposeBag) } func fetchFilteredStores(filters: [CertificationType]) { @@ -126,22 +137,80 @@ private extension HomeViewModelImpl { func setLocationButtonImage(positionMode: NMFMyPositionMode) { switch positionMode { case .direction: - locationButtonOutput.accept( - LocationButton( - imageName: "LocationButtonCompass", - positionMode: .compass + locationButtonOutput.accept(.compass) + case .compass, .normal: + locationButtonOutput.accept(.direction) + default: + break + } + } + + func setStoreInformationOriginalHeight(height: CGFloat) { + dependency.storeInformationOriginalHeight = height + } + + func storeInformationViewPanGestureChanged(height: CGFloat) { + if height > 420 && height < 630 { + // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. + storeInformationViewHeightOutput.accept( + StoreInformationViewConstraints( + heightConstraint: height, + bottomConstraint: height - 441 ) ) - case .compass, .normal: - locationButtonOutput.accept( - LocationButton( - imageName: "LocationButtonNormal", - positionMode: .direction + summaryToDetailOutput.accept(()) + } else if height > 230 && height <= 420 { + storeInformationViewHeightOutput.accept( + StoreInformationViewConstraints( + heightConstraint: height, + bottomConstraint: -16 ) ) - default: - break + detailToSummaryOutput.accept(()) } } + func storeInformationViewPanGestureEnded(height: CGFloat) { + if height > 420 { + storeInformationViewHeightOutput.accept( + StoreInformationViewConstraints( + heightConstraint: 616, + bottomConstraint: 616 - 441, + animated: true + ) + ) + summaryToDetailOutput.accept(()) + } else { + storeInformationViewHeightOutput.accept( + StoreInformationViewConstraints( + heightConstraint: dependency.storeInformationOriginalHeight, + bottomConstraint: -16, + animated: true + ) + ) + detailToSummaryOutput.accept(()) + } + } + + func storeInformationViewSwipe(velocity: Double) { + if velocity < -1000 { + storeInformationViewHeightOutput.accept( + StoreInformationViewConstraints( + heightConstraint: 616, + bottomConstraint: 616 - 441, + animated: true + ) + ) + summaryToDetailOutput.accept(()) + } else if velocity > 1000 { + storeInformationViewHeightOutput.accept( + StoreInformationViewConstraints( + heightConstraint: dependency.storeInformationOriginalHeight, + bottomConstraint: -16, + animated: true + ) + ) + detailToSummaryOutput.accept(()) + } + } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 152f6fb1..abeb27fc 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -36,6 +36,11 @@ enum HomeViewModelInputCase { ) case markerTapped(tag: UInt) case locationButtonTapped(positionMode: NMFMyPositionMode) + case setStoreInformationOriginalHeight(height: CGFloat) + case storeInformationViewPanGestureChanged(height: CGFloat) + case storeInformationViewPanGestureEnded(height: CGFloat) + case storeInformationViewSwipe(velocity: Double) +// case storeInformationViewTapGestureEnded(height: CGFloat) } @@ -49,6 +54,9 @@ protocol HomeViewModelOutput { var getStoreInformationOutput: PublishRelay { get } var refreshOutput: PublishRelay<[FilteredStores]> { get } - var locationButtonOutput: PublishRelay { get } + var locationButtonOutput: PublishRelay { get } + var storeInformationViewHeightOutput: PublishRelay { get } + var summaryToDetailOutput: PublishRelay { get } + var detailToSummaryOutput: PublishRelay { get } } From c4e0e09c76b086cbf5b318c786a18726427986b2 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 17:15:04 +0900 Subject: [PATCH 055/231] =?UTF-8?q?refactor=20:=20store=20information=20vi?= =?UTF-8?q?ew=20tap=20=EC=A0=9C=EC=8A=A4=EC=B3=90=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 25 ++++++---------- .../Home/ViewModel/HomeDependency.swift | 9 ++++++ .../Home/ViewModel/HomeViewModelImpl.swift | 30 +++++++++++++++++-- .../ViewModel/protocol/HomeViewModel.swift | 3 +- 4 files changed, 48 insertions(+), 19 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 1cf6c0d8..114ac612 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -185,7 +185,6 @@ final class HomeViewController: UIViewController { ) view.translatesAutoresizingMaskIntoConstraints = false - // TODO: ๋กœ์ง ๋ทฐ๋ชจ๋ธ๋กœ ์ด๋™ view.rx.panGesture() .when(.changed) .bind { [weak self] recognizer in @@ -211,21 +210,13 @@ final class HomeViewController: UIViewController { } .disposed(by: disposeBag) -// view.rx.tapGesture() -// .when(.ended) -// .bind { [weak self] _ in -// guard let self = self else { return } -// if storeInformationHeightConstraint.constant == storeInformationOriginalHeight { -// setStoreInformationConstraints( -// heightConstraint: 600, -// bottomConstraint: 600 - 441, -// animated: true -// ) -// storeInformationView.changeToDetail() -// dimmedView() -// } -// } -// .disposed(by: disposeBag) + view.rx.tapGesture() + .when(.ended) + .bind { [weak self] _ in + guard let self = self else { return } + viewModel.action(input: .storeInformationViewTapGestureEnded) + } + .disposed(by: disposeBag) return view }() @@ -337,6 +328,7 @@ private extension HomeViewController { ) self?.storeInformationView.changeToSummary() self?.unDimmedView() + self?.viewModel.action(input: .changeState(state: .summary)) } .disposed(by: disposeBag) @@ -409,6 +401,7 @@ private extension HomeViewController { animated: true ) storeInformationView.dismissAll() + viewModel.action(input: .changeState(state: .normal)) } func setStoreInformationConstraints(heightConstraint: CGFloat, bottomConstraint: CGFloat, animated: Bool = false) { diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift index fee91c60..8502c80f 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift @@ -7,9 +7,18 @@ import RxSwift +enum HomeViewState { + + case normal + case summary + case detail + +} + struct HomeDependency { let disposeBag = DisposeBag() + var state: HomeViewState = .normal var storeInformationOriginalHeight: CGFloat = 0 } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 52da68e4..4333b7e1 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -59,8 +59,10 @@ final class HomeViewModelImpl: HomeViewModel { storeInformationViewPanGestureEnded(height: height) case .storeInformationViewSwipe(let velocity): storeInformationViewSwipe(velocity: velocity) -// case .storeInformationViewTapGestureEnded(let height): -// storeInformationViewTapGestureEnded(height: height) + case .storeInformationViewTapGestureEnded: + storeInformationViewTapGestureEnded() + case .changeState(let state): + changeState(state: state) } } catch { print(error.localizedDescription) @@ -159,6 +161,7 @@ private extension HomeViewModelImpl { ) ) summaryToDetailOutput.accept(()) + dependency.state = .detail } else if height > 230 && height <= 420 { storeInformationViewHeightOutput.accept( StoreInformationViewConstraints( @@ -167,6 +170,7 @@ private extension HomeViewModelImpl { ) ) detailToSummaryOutput.accept(()) + dependency.state = .summary } } @@ -180,6 +184,7 @@ private extension HomeViewModelImpl { ) ) summaryToDetailOutput.accept(()) + dependency.state = .detail } else { storeInformationViewHeightOutput.accept( StoreInformationViewConstraints( @@ -189,6 +194,7 @@ private extension HomeViewModelImpl { ) ) detailToSummaryOutput.accept(()) + dependency.state = .summary } } @@ -202,6 +208,7 @@ private extension HomeViewModelImpl { ) ) summaryToDetailOutput.accept(()) + dependency.state = .detail } else if velocity > 1000 { storeInformationViewHeightOutput.accept( StoreInformationViewConstraints( @@ -211,6 +218,25 @@ private extension HomeViewModelImpl { ) ) detailToSummaryOutput.accept(()) + dependency.state = .summary } } + + func storeInformationViewTapGestureEnded() { + if dependency.state == .summary { + storeInformationViewHeightOutput.accept( + StoreInformationViewConstraints( + heightConstraint: 616, + bottomConstraint: 616 - 441, + animated: true + ) + ) + summaryToDetailOutput.accept(()) + dependency.state = .detail + } + } + + func changeState(state: HomeViewState) { + dependency.state = state + } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index abeb27fc..bf34bbbd 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -40,7 +40,8 @@ enum HomeViewModelInputCase { case storeInformationViewPanGestureChanged(height: CGFloat) case storeInformationViewPanGestureEnded(height: CGFloat) case storeInformationViewSwipe(velocity: Double) -// case storeInformationViewTapGestureEnded(height: CGFloat) + case storeInformationViewTapGestureEnded + case changeState(state: HomeViewState) } From 0f15d5abb92697e6ebd153fd9b48f254f2088b0f Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 17:23:03 +0900 Subject: [PATCH 056/231] =?UTF-8?q?refactor=20:=20dim=20tap=20=EC=A0=9C?= =?UTF-8?q?=EC=8A=A4=EC=B3=90=20=EB=A1=9C=EC=A7=81=20view=20model=EB=A1=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 21 +++++++------------ .../Home/ViewModel/HomeViewModelImpl.swift | 20 +++++++++++------- .../ViewModel/protocol/HomeViewModel.swift | 1 + 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 114ac612..df7d6377 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -160,19 +160,12 @@ final class HomeViewController: UIViewController { view.isUserInteractionEnabled = true view.alpha = 0.4 -// view.rx.tapGesture() -// .when(.ended) -// .subscribe(onNext: { [weak self] _ in -// guard let self = self else { return } -// setStoreInformationConstraints( -// heightConstraint: storeInformationOriginalHeight, -// bottomConstraint: -16, -// animated: true -// ) -// storeInformationView.changeToSummary() -// unDimmedView() -// }) -// .disposed(by: disposeBag) + view.rx.tapGesture() + .when(.ended) + .subscribe(onNext: { [weak self] _ in + self?.viewModel.action(input: .dimViewTapGestureEnded) + }) + .disposed(by: disposeBag) return view }() @@ -308,6 +301,7 @@ private extension HomeViewController { .bind { [weak self] _ in self?.storeInformationView.changeToSummary() self?.unDimmedView() + self?.viewModel.action(input: .changeState(state: .summary)) } .disposed(by: disposeBag) @@ -315,6 +309,7 @@ private extension HomeViewController { .bind { [weak self] _ in self?.storeInformationView.changeToDetail() self?.dimmedView() + self?.viewModel.action(input: .changeState(state: .detail)) } .disposed(by: disposeBag) diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 4333b7e1..317370d2 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -61,6 +61,8 @@ final class HomeViewModelImpl: HomeViewModel { storeInformationViewSwipe(velocity: velocity) case .storeInformationViewTapGestureEnded: storeInformationViewTapGestureEnded() + case .dimViewTapGestureEnded: + dimViewTapGestureEnded() case .changeState(let state): changeState(state: state) } @@ -161,7 +163,6 @@ private extension HomeViewModelImpl { ) ) summaryToDetailOutput.accept(()) - dependency.state = .detail } else if height > 230 && height <= 420 { storeInformationViewHeightOutput.accept( StoreInformationViewConstraints( @@ -170,7 +171,6 @@ private extension HomeViewModelImpl { ) ) detailToSummaryOutput.accept(()) - dependency.state = .summary } } @@ -184,7 +184,6 @@ private extension HomeViewModelImpl { ) ) summaryToDetailOutput.accept(()) - dependency.state = .detail } else { storeInformationViewHeightOutput.accept( StoreInformationViewConstraints( @@ -194,7 +193,6 @@ private extension HomeViewModelImpl { ) ) detailToSummaryOutput.accept(()) - dependency.state = .summary } } @@ -208,7 +206,6 @@ private extension HomeViewModelImpl { ) ) summaryToDetailOutput.accept(()) - dependency.state = .detail } else if velocity > 1000 { storeInformationViewHeightOutput.accept( StoreInformationViewConstraints( @@ -218,7 +215,6 @@ private extension HomeViewModelImpl { ) ) detailToSummaryOutput.accept(()) - dependency.state = .summary } } @@ -232,10 +228,20 @@ private extension HomeViewModelImpl { ) ) summaryToDetailOutput.accept(()) - dependency.state = .detail } } + func dimViewTapGestureEnded() { + storeInformationViewHeightOutput.accept( + StoreInformationViewConstraints( + heightConstraint: dependency.storeInformationOriginalHeight, + bottomConstraint: -16, + animated: true + ) + ) + detailToSummaryOutput.accept(()) + } + func changeState(state: HomeViewState) { dependency.state = state } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index bf34bbbd..65fe22f9 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -41,6 +41,7 @@ enum HomeViewModelInputCase { case storeInformationViewPanGestureEnded(height: CGFloat) case storeInformationViewSwipe(velocity: Double) case storeInformationViewTapGestureEnded + case dimViewTapGestureEnded case changeState(state: HomeViewState) } From 4dfffb46159e783cb42e6861b3463618e13e6e54 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 17:30:15 +0900 Subject: [PATCH 057/231] =?UTF-8?q?refactor=20:=20=EC=95=88=EC=93=B0?= =?UTF-8?q?=EB=8A=94=20entity=20=EC=82=AD=EC=A0=9C=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 8 +-- ...ormation.swift => OpenClosedContent.swift} | 9 +-- .../Home/View/HomeViewController.swift | 55 ++++++++++++++----- 3 files changed, 47 insertions(+), 25 deletions(-) rename KCS/KCS/Domain/Entity/{OpeningHourInformation.swift => OpenClosedContent.swift} (68%) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 1df88176..6c5cebcf 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -60,7 +60,7 @@ 59F478C12B5D0D8D002FEF9E /* ImageRepositoryImplTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F478C02B5D0D8D002FEF9E /* ImageRepositoryImplTests.swift */; }; 8FE699E5DAEEDFE5A53D5E82 /* Pods_KCS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E11E3144529848C9A0FC6F77 /* Pods_KCS.framework */; }; A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A802D1F52B5277620091FDE7 /* CertificationLabel.swift */; }; - A81EFBB32B5BC57800D0C0D7 /* OpeningHourInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB22B5BC57800D0C0D7 /* OpeningHourInformation.swift */; }; + A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB22B5BC57800D0C0D7 /* OpenClosedContent.swift */; }; A81EFBB52B5D477600D0C0D7 /* UILabel+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB42B5D477600D0C0D7 /* UILabel+.swift */; }; A81EFBC02B5D597400D0C0D7 /* Pretendard-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBB72B5D597400D0C0D7 /* Pretendard-Medium.ttf */; }; A81EFBC12B5D597400D0C0D7 /* Pretendard-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBB82B5D597400D0C0D7 /* Pretendard-Black.ttf */; }; @@ -166,7 +166,7 @@ 5FF0FF2386EEB69182D6EA4C /* Pods-KCSUnitTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCSUnitTest.debug.xcconfig"; path = "Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest.debug.xcconfig"; sourceTree = ""; }; 9EA5C8EA72EA9E937C11400A /* Pods-KCS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCS.debug.xcconfig"; path = "Target Support Files/Pods-KCS/Pods-KCS.debug.xcconfig"; sourceTree = ""; }; A802D1F52B5277620091FDE7 /* CertificationLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationLabel.swift; sourceTree = ""; }; - A81EFBB22B5BC57800D0C0D7 /* OpeningHourInformation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHourInformation.swift; sourceTree = ""; }; + A81EFBB22B5BC57800D0C0D7 /* OpenClosedContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedContent.swift; sourceTree = ""; }; A81EFBB42B5D477600D0C0D7 /* UILabel+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+.swift"; sourceTree = ""; }; A81EFBB72B5D597400D0C0D7 /* Pretendard-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.ttf"; sourceTree = ""; }; A81EFBB82B5D597400D0C0D7 /* Pretendard-Black.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Black.ttf"; sourceTree = ""; }; @@ -418,7 +418,7 @@ 59C306C82B501B9D00862625 /* RegularOpeningHours.swift */, 59C306A52B4D966C00862625 /* CertificationType.swift */, A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */, - A81EFBB22B5BC57800D0C0D7 /* OpeningHourInformation.swift */, + A81EFBB22B5BC57800D0C0D7 /* OpenClosedContent.swift */, 5977BE732B57FA7A00725C90 /* FilteredStores.swift */, 59F478BE2B5BEA08002FEF9E /* RequestLocation.swift */, A8A7E05C2B64AF1200D015E5 /* StoreInformationViewConstraints.swift */, @@ -827,7 +827,7 @@ A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */, 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, 592262242B61203000CA5A11 /* DetailView.swift in Sources */, - A81EFBB32B5BC57800D0C0D7 /* OpeningHourInformation.swift in Sources */, + A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, A8ACB7E22B594F7400540BD1 /* SummaryViewModelImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, diff --git a/KCS/KCS/Domain/Entity/OpeningHourInformation.swift b/KCS/KCS/Domain/Entity/OpenClosedContent.swift similarity index 68% rename from KCS/KCS/Domain/Entity/OpeningHourInformation.swift rename to KCS/KCS/Domain/Entity/OpenClosedContent.swift index b2ad55a1..470faeab 100644 --- a/KCS/KCS/Domain/Entity/OpeningHourInformation.swift +++ b/KCS/KCS/Domain/Entity/OpenClosedContent.swift @@ -1,5 +1,5 @@ // -// OpeningHourInformation.swift +// OpenClosedContent.swift // KCS // // Created by ๊น€์˜ํ˜„ on 1/20/24. @@ -7,13 +7,6 @@ import Foundation -struct OpeningHourInformation { - - let openClosedContent: OpenClosedContent - let detailOpeningHour: [DetailOpeningHour] - -} - struct OpenClosedContent { let openClosedType: OpenClosedType diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index df7d6377..e74f45dd 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -67,7 +67,11 @@ final class HomeViewController: UIViewController { .bind { [weak self] _ in guard let self = self else { return } checkLocationService() - viewModel.action(input: .locationButtonTapped(positionMode: mapView.mapView.positionMode)) + viewModel.action( + input: .locationButtonTapped( + positionMode: mapView.mapView.positionMode + ) + ) } .disposed(by: self.disposeBag) button.setImage(UIImage.locationButtonNone, for: .normal) @@ -163,7 +167,9 @@ final class HomeViewController: UIViewController { view.rx.tapGesture() .when(.ended) .subscribe(onNext: { [weak self] _ in - self?.viewModel.action(input: .dimViewTapGestureEnded) + self?.viewModel.action( + input: .dimViewTapGestureEnded + ) }) .disposed(by: disposeBag) @@ -197,9 +203,16 @@ final class HomeViewController: UIViewController { .when(.ended) .bind { [weak self] recognizer in guard let self = self else { return } - viewModel.action(input: .storeInformationViewSwipe(velocity: recognizer.velocity(in: view).y)) - - viewModel.action(input: .storeInformationViewPanGestureEnded(height: storeInformationHeightConstraint.constant)) + viewModel.action( + input: .storeInformationViewSwipe( + velocity: recognizer.velocity(in: view).y + ) + ) + viewModel.action( + input: .storeInformationViewPanGestureEnded( + height: storeInformationHeightConstraint.constant + ) + ) } .disposed(by: disposeBag) @@ -207,7 +220,9 @@ final class HomeViewController: UIViewController { .when(.ended) .bind { [weak self] _ in guard let self = self else { return } - viewModel.action(input: .storeInformationViewTapGestureEnded) + viewModel.action( + input: .storeInformationViewTapGestureEnded + ) } .disposed(by: disposeBag) @@ -301,7 +316,9 @@ private extension HomeViewController { .bind { [weak self] _ in self?.storeInformationView.changeToSummary() self?.unDimmedView() - self?.viewModel.action(input: .changeState(state: .summary)) + self?.viewModel.action( + input: .changeState(state: .summary) + ) } .disposed(by: disposeBag) @@ -309,13 +326,17 @@ private extension HomeViewController { .bind { [weak self] _ in self?.storeInformationView.changeToDetail() self?.dimmedView() - self?.viewModel.action(input: .changeState(state: .detail)) + self?.viewModel.action( + input: .changeState(state: .detail) + ) } .disposed(by: disposeBag) // MARK: ์ถ”ํ›„ ์ˆ˜์ • ํ•„์š” summaryInformationHeightObserver.bind { [weak self] height in - self?.viewModel.action(input: .setStoreInformationOriginalHeight(height: height)) + self?.viewModel.action( + input: .setStoreInformationOriginalHeight(height: height) + ) self?.setStoreInformationConstraints( heightConstraint: height, bottomConstraint: -16, @@ -323,7 +344,9 @@ private extension HomeViewController { ) self?.storeInformationView.changeToSummary() self?.unDimmedView() - self?.viewModel.action(input: .changeState(state: .summary)) + self?.viewModel.action( + input: .changeState(state: .summary) + ) } .disposed(by: disposeBag) @@ -339,7 +362,9 @@ private extension HomeViewController { } else { activatedFilter.append(type) } - viewModel.action(input: .fetchFilteredStores(filters: getActivatedTypes())) + viewModel.action( + input: .fetchFilteredStores(filters: getActivatedTypes()) + ) return !lastState } .bind(to: button.rx.isSelected) @@ -382,7 +407,9 @@ private extension HomeViewController { func markerSelected(marker: Marker) { marker.isSelected.toggle() if marker.isSelected { - viewModel.action(input: .markerTapped(tag: marker.tag)) + viewModel.action( + input: .markerTapped(tag: marker.tag) + ) } clickedMarker = marker } @@ -396,7 +423,9 @@ private extension HomeViewController { animated: true ) storeInformationView.dismissAll() - viewModel.action(input: .changeState(state: .normal)) + viewModel.action( + input: .changeState(state: .normal) + ) } func setStoreInformationConstraints(heightConstraint: CGFloat, bottomConstraint: CGFloat, animated: Bool = false) { From fd0705caa8c9ae25a9017976dd27f2d033494ac4 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 19:17:24 +0900 Subject: [PATCH 058/231] =?UTF-8?q?fix=20:=20=EB=84=A4=EC=9D=B4=EB=B2=84?= =?UTF-8?q?=20=EB=A1=9C=EA=B3=A0=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index e74f45dd..1337d40b 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -90,7 +90,8 @@ final class HomeViewController: UIViewController { map.showScaleBar = false map.showIndoorLevelPicker = false map.showLocationButton = false - map.mapView.logoAlign = .rightBottom + map.mapView.logoAlign = .rightTop + map.mapView.logoMargin = UIEdgeInsets(top: 28, left: 0, bottom: 0, right: 0) map.mapView.touchDelegate = self map.mapView.addCameraDelegate(delegate: self) From 786b5297854b2e1042ffd4a3129c92f805b0de36 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sat, 27 Jan 2024 19:51:57 +0900 Subject: [PATCH 059/231] =?UTF-8?q?refactor=20:=20filter=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EB=A1=9C=EC=A7=81=20viewmodel=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 23 ++----------- .../Home/ViewModel/HomeDependency.swift | 1 + .../Home/ViewModel/HomeViewModelImpl.swift | 34 ++++++++++++------- .../ViewModel/protocol/HomeViewModel.swift | 9 ++--- 4 files changed, 28 insertions(+), 39 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 1337d40b..c91eb405 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -147,8 +147,7 @@ final class HomeViewController: UIViewController { longitude: northEastPoint.lng, latitude: northEastPoint.lat ) - ), - filters: getActivatedTypes() + ) ) ) refreshButton.isHidden = true @@ -230,7 +229,6 @@ final class HomeViewController: UIViewController { return view }() - private var activatedFilter: [CertificationType] = [] private let viewModel: HomeViewModel private let summaryInformationViewModel: SummaryViewModel private let detailViewModel: DetailViewModel @@ -357,14 +355,8 @@ private extension HomeViewController { button.rx.tap .scan(false) { [weak self] (lastState, _) in guard let self = self else { return lastState } - if lastState { - guard let lastIndex = activatedFilter.lastIndex(of: type) else { return lastState } - activatedFilter.remove(at: lastIndex) - } else { - activatedFilter.append(type) - } viewModel.action( - input: .fetchFilteredStores(filters: getActivatedTypes()) + input: .filterButtonTapped(activatedFilter: type) ) return !lastState } @@ -378,14 +370,6 @@ private extension HomeViewController { markerTouchHandler(marker: marker) markers.append(marker) } - - func getActivatedTypes() -> [CertificationType] { - if activatedFilter.isEmpty { - return [.safe, .exemplary, .goodPrice] - } - - return activatedFilter - } } @@ -586,8 +570,7 @@ extension HomeViewController: NMFMapViewCameraDelegate { longitude: northEastPoint.lng, latitude: northEastPoint.lat ) - ), - filters: getActivatedTypes() + ) ) ) refreshButton.isHidden = true diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift index 8502c80f..e1b5bd19 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift @@ -20,5 +20,6 @@ struct HomeDependency { let disposeBag = DisposeBag() var state: HomeViewState = .normal var storeInformationOriginalHeight: CGFloat = 0 + var activatedFilter: [CertificationType] = [] } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 317370d2..3363aa5c 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -40,13 +40,10 @@ final class HomeViewModelImpl: HomeViewModel { func action(input: HomeViewModelInputCase) { do { switch input { - case .refresh(let requestLocation, let filters): - refresh( - requestLocation: requestLocation, - filters: filters - ) - case .fetchFilteredStores(let filters): - fetchFilteredStores(filters: filters) + case .refresh(let requestLocation): + refresh(requestLocation: requestLocation) + case .filterButtonTapped(let filter): + filterButtonTapped(filter: filter) case .markerTapped(let tag): try markerTapped(tag: tag) case .locationButtonTapped(let positionMode): @@ -76,15 +73,15 @@ final class HomeViewModelImpl: HomeViewModel { private extension HomeViewModelImpl { func refresh( - requestLocation: RequestLocation, - filters: [CertificationType] = [.goodPrice, .exemplary, .safe] + requestLocation: RequestLocation ) { fetchRefreshStoresUseCase.execute( requestLocation: requestLocation ) .subscribe( onNext: { [weak self] stores in - self?.applyFilters(stores: stores, filters: filters) + guard let self = self else { return } + applyFilters(stores: stores, filters: getActivatedTypes()) }, onError: { error in print(error.localizedDescription) @@ -93,8 +90,21 @@ private extension HomeViewModelImpl { .disposed(by: dependency.disposeBag) } - func fetchFilteredStores(filters: [CertificationType]) { - applyFilters(stores: fetchStoresUseCase.execute(), filters: filters) + func filterButtonTapped(filter: CertificationType) { + if let lastIndex = dependency.activatedFilter.lastIndex(of: filter) { + dependency.activatedFilter.remove(at: lastIndex) + } else { + dependency.activatedFilter.append(filter) + } + applyFilters(stores: fetchStoresUseCase.execute(), filters: getActivatedTypes()) + } + + func getActivatedTypes() -> [CertificationType] { + if dependency.activatedFilter.isEmpty { + return [.safe, .exemplary, .goodPrice] + } + + return dependency.activatedFilter } func applyFilters(stores: [Store], filters: [CertificationType]) { diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 65fe22f9..7d7f3293 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -27,13 +27,8 @@ protocol HomeViewModel: HomeViewModelInput, HomeViewModelOutput { enum HomeViewModelInputCase { - case refresh( - requestLocation: RequestLocation, - filters: [CertificationType] - ) - case fetchFilteredStores( - filters: [CertificationType] - ) + case refresh(requestLocation: RequestLocation) + case filterButtonTapped(activatedFilter: CertificationType) case markerTapped(tag: UInt) case locationButtonTapped(positionMode: NMFMyPositionMode) case setStoreInformationOriginalHeight(height: CGFloat) From 73502a08da752a2c66685067e2057679f322e443 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 28 Jan 2024 14:56:39 +0900 Subject: [PATCH 060/231] =?UTF-8?q?refactor=20:=20=EB=A7=88=EC=BB=A4=20?= =?UTF-8?q?=EC=84=B8=ED=8C=85=20=EC=9E=AC=EC=84=A4=EC=A0=95=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ++ KCS/KCS/Domain/Entity/MarkerContents.swift | 18 +++++ .../Home/View/HomeViewController.swift | 55 +++++++++------- KCS/KCS/Presentation/Home/View/Marker.swift | 65 +++++++++---------- .../Home/ViewModel/HomeViewModelImpl.swift | 35 ++++++++++ .../ViewModel/protocol/HomeViewModel.swift | 2 + 6 files changed, 121 insertions(+), 58 deletions(-) create mode 100644 KCS/KCS/Domain/Entity/MarkerContents.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 6c5cebcf..0ca7bcfb 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -80,6 +80,7 @@ A8A7E05B2B642EC900D015E5 /* DetailViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */; }; A8A7E05D2B64AF1300D015E5 /* StoreInformationViewConstraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05C2B64AF1200D015E5 /* StoreInformationViewConstraints.swift */; }; A8A7E0602B64E62200D015E5 /* NMFMyPosition+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */; }; + A8A7E0622B652F0D00D015E5 /* MarkerContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E0612B652F0D00D015E5 /* MarkerContents.swift */; }; A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */; }; A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DA2B58B51A00540BD1 /* Date+.swift */; }; A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */; }; @@ -186,6 +187,7 @@ A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewContents.swift; sourceTree = ""; }; A8A7E05C2B64AF1200D015E5 /* StoreInformationViewConstraints.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewConstraints.swift; sourceTree = ""; }; A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NMFMyPosition+.swift"; sourceTree = ""; }; + A8A7E0612B652F0D00D015E5 /* MarkerContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkerContents.swift; sourceTree = ""; }; A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepositoryError.swift; sourceTree = ""; }; A8ACB7DA2B58B51A00540BD1 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedType.swift; sourceTree = ""; }; @@ -424,6 +426,7 @@ A8A7E05C2B64AF1200D015E5 /* StoreInformationViewConstraints.swift */, 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */, A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */, + A8A7E0612B652F0D00D015E5 /* MarkerContents.swift */, ); path = Entity; sourceTree = ""; @@ -839,6 +842,7 @@ 59C306B62B50027300862625 /* Store.swift in Sources */, A8AE4B192B62903100632355 /* OpeningHourViewModel.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, + A8A7E0622B652F0D00D015E5 /* MarkerContents.swift in Sources */, 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */, 5977BE942B59738800725C90 /* FetchStoresUseCase.swift in Sources */, 59F478BF2B5BEA08002FEF9E /* RequestLocation.swift in Sources */, diff --git a/KCS/KCS/Domain/Entity/MarkerContents.swift b/KCS/KCS/Domain/Entity/MarkerContents.swift new file mode 100644 index 00000000..bfa57966 --- /dev/null +++ b/KCS/KCS/Domain/Entity/MarkerContents.swift @@ -0,0 +1,18 @@ +// +// MarkerContents.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 1/27/24. +// + +import Foundation +import NMapsMap + +struct MarkerContents { + + let tag: Int + let location: NMGLatLng + let deselectImageName: String + let selectImageName: String + +} diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index c91eb405..5469b444 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -278,15 +278,31 @@ private extension HomeViewController { guard let self = self else { return } self.markers.forEach { $0.mapView = nil } filteredStores.forEach { filteredStore in - filteredStore.stores.forEach { [weak self] in - let location = $0.location.toMapLocation() - self?.setMarker(marker: Marker(certificationType: filteredStore.type, position: location), tag: UInt($0.id)) + filteredStore.stores.forEach { [weak self] store in + self?.viewModel.action( + input: .setMarker( + store: store, + certificationType: filteredStore.type + ) + ) } } storeInformationViewDismiss() } .disposed(by: disposeBag) + viewModel.setMarkerOutput + .bind { [weak self] content in + guard let selectImage = UIImage(named: content.selectImageName), + let deselectImage = UIImage(named: content.deselectImageName) else { return } + let marker = Marker(position: content.location, selectImage: selectImage, deselectImage: deselectImage) + marker.tag = UInt(content.tag) + marker.mapView = self?.mapView.mapView + self?.markerTouchHandler(marker: marker) + self?.markers.append(marker) + } + .disposed(by: disposeBag) + viewModel.getStoreInformationOutput .bind { [weak self] store in self?.storeInformationView.setUIContents(store: store) @@ -364,12 +380,12 @@ private extension HomeViewController { .disposed(by: disposeBag) } - func setMarker(marker: Marker, tag: UInt) { - marker.tag = tag - marker.mapView = mapView.mapView - markerTouchHandler(marker: marker) - markers.append(marker) - } +// func setMarker(marker: Marker, tag: UInt) { +// marker.tag = tag +// marker.mapView = mapView.mapView +// markerTouchHandler(marker: marker) +// markers.append(marker) +// } } @@ -377,30 +393,21 @@ private extension HomeViewController { func markerTouchHandler(marker: Marker) { marker.touchHandler = { [weak self] (_: NMFOverlay) -> Bool in + if let clickedMarker = self?.clickedMarker { if clickedMarker == marker { return true } - if clickedMarker.isSelected { - self?.storeInformationViewDismiss() - } + self?.storeInformationViewDismiss() } - self?.markerSelected(marker: marker) - - return true - } - } - - func markerSelected(marker: Marker) { - marker.isSelected.toggle() - if marker.isSelected { - viewModel.action( + self?.viewModel.action( input: .markerTapped(tag: marker.tag) ) + self?.clickedMarker = marker + + return true } - clickedMarker = marker } func storeInformationViewDismiss() { - clickedMarker?.isSelected = false clickedMarker = nil setStoreInformationConstraints( heightConstraint: 0, diff --git a/KCS/KCS/Presentation/Home/View/Marker.swift b/KCS/KCS/Presentation/Home/View/Marker.swift index b1389666..124465e1 100644 --- a/KCS/KCS/Presentation/Home/View/Marker.swift +++ b/KCS/KCS/Presentation/Home/View/Marker.swift @@ -11,51 +11,48 @@ import RxSwift final class Marker: NMFMarker { - var isSelected: Bool = false { - didSet { - setUI(type: certificationType) - } - } private lazy var unselectedGlobalZIndex: Int = self.globalZIndex - private let certificationType: CertificationType + private let selectImage: UIImage + private let deselectImage: UIImage - init(certificationType: CertificationType, position: NMGLatLng? = nil) { - self.certificationType = certificationType + init(position: NMGLatLng? = nil, selectImage: UIImage, deselectImage: UIImage) { + self.selectImage = selectImage + self.deselectImage = deselectImage super.init() if let position = position { self.position = position } - setUI(type: certificationType) +// setUI(type: certificationType) } } private extension Marker { - func setUI(type: CertificationType) { - var icon = NMFOverlayImage() - if isSelected { - switch type { - case .goodPrice: - icon = NMFOverlayImage(image: UIImage.markerGoodPriceSelected) - case .exemplary: - icon = NMFOverlayImage(image: UIImage.markerExemplarySelected) - case .safe: - icon = NMFOverlayImage(image: UIImage.markerSafeSelected) - } - self.globalZIndex = 250000 - } else { - switch type { - case .goodPrice: - icon = NMFOverlayImage(image: UIImage.markerGoodPriceNormal) - case .exemplary: - icon = NMFOverlayImage(image: UIImage.markerExemplaryNormal) - case .safe: - icon = NMFOverlayImage(image: UIImage.markerSafeNormal) - } - self.globalZIndex = unselectedGlobalZIndex - } - self.iconImage = icon - } +// func setUI(type: CertificationType) { +// var icon = NMFOverlayImage() +// if isSelected { +// switch type { +// case .goodPrice: +// icon = NMFOverlayImage(image: UIImage.markerGoodPriceSelected) +// case .exemplary: +// icon = NMFOverlayImage(image: UIImage.markerExemplarySelected) +// case .safe: +// icon = NMFOverlayImage(image: UIImage.markerSafeSelected) +// } +// self.globalZIndex = 250000 +// } else { +// switch type { +// case .goodPrice: +// icon = NMFOverlayImage(image: UIImage.markerGoodPriceNormal) +// case .exemplary: +// icon = NMFOverlayImage(image: UIImage.markerExemplaryNormal) +// case .safe: +// icon = NMFOverlayImage(image: UIImage.markerSafeNormal) +// } +// self.globalZIndex = unselectedGlobalZIndex +// } +// self.iconImage = icon +// } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 3363aa5c..73aea0f8 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -22,6 +22,7 @@ final class HomeViewModelImpl: HomeViewModel { var storeInformationViewHeightOutput = PublishRelay() var summaryToDetailOutput = PublishRelay() var detailToSummaryOutput = PublishRelay() + var setMarkerOutput = PublishRelay() var dependency: HomeDependency @@ -62,6 +63,8 @@ final class HomeViewModelImpl: HomeViewModel { dimViewTapGestureEnded() case .changeState(let state): changeState(state: state) + case .setMarker(let store, let certificationType): + setMarker(store: store, certificationType: certificationType) } } catch { print(error.localizedDescription) @@ -148,6 +151,38 @@ private extension HomeViewModelImpl { ) } + func setMarker(store: Store, certificationType: CertificationType) { + switch certificationType { + case .goodPrice: + setMarkerOutput.accept( + MarkerContents( + tag: store.id, + location: store.location.toMapLocation(), + deselectImageName: "MarkerGoodPriceNormal", + selectImageName: "MarkerGoodPriceSelected" + ) + ) + case .exemplary: + setMarkerOutput.accept( + MarkerContents( + tag: store.id, + location: store.location.toMapLocation(), + deselectImageName: "MarkerExemplaryNormal", + selectImageName: "MarkerExemplarySelected" + ) + ) + case .safe: + setMarkerOutput.accept( + MarkerContents( + tag: store.id, + location: store.location.toMapLocation(), + deselectImageName: "MarkerSafeNormal", + selectImageName: "MarkerSafeSelected" + ) + ) + } + } + func setLocationButtonImage(positionMode: NMFMyPositionMode) { switch positionMode { case .direction: diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 7d7f3293..b3f38246 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -38,6 +38,7 @@ enum HomeViewModelInputCase { case storeInformationViewTapGestureEnded case dimViewTapGestureEnded case changeState(state: HomeViewState) + case setMarker(store: Store, certificationType: CertificationType) } @@ -55,5 +56,6 @@ protocol HomeViewModelOutput { var storeInformationViewHeightOutput: PublishRelay { get } var summaryToDetailOutput: PublishRelay { get } var detailToSummaryOutput: PublishRelay { get } + var setMarkerOutput: PublishRelay { get } } From 9986d4d1eb5c5a467665c3ebb0ca85c153a35abc Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 28 Jan 2024 15:09:29 +0900 Subject: [PATCH 061/231] =?UTF-8?q?refactor=20:=20marker=20=EC=84=B8?= =?UTF-8?q?=ED=8C=85=20=EB=B0=8F=20=EB=B0=94=EC=9D=B8=EB=94=A9=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 11 ++--- KCS/KCS/Presentation/Home/View/Marker.swift | 46 ++++++------------- 2 files changed, 19 insertions(+), 38 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 5469b444..eaebec73 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -380,13 +380,6 @@ private extension HomeViewController { .disposed(by: disposeBag) } -// func setMarker(marker: Marker, tag: UInt) { -// marker.tag = tag -// marker.mapView = mapView.mapView -// markerTouchHandler(marker: marker) -// markers.append(marker) -// } - } private extension HomeViewController { @@ -396,11 +389,14 @@ private extension HomeViewController { if let clickedMarker = self?.clickedMarker { if clickedMarker == marker { return true } + clickedMarker.deselect() self?.storeInformationViewDismiss() } + self?.viewModel.action( input: .markerTapped(tag: marker.tag) ) + marker.select() self?.clickedMarker = marker return true @@ -408,6 +404,7 @@ private extension HomeViewController { } func storeInformationViewDismiss() { + clickedMarker?.deselect() clickedMarker = nil setStoreInformationConstraints( heightConstraint: 0, diff --git a/KCS/KCS/Presentation/Home/View/Marker.swift b/KCS/KCS/Presentation/Home/View/Marker.swift index 124465e1..b0f4b760 100644 --- a/KCS/KCS/Presentation/Home/View/Marker.swift +++ b/KCS/KCS/Presentation/Home/View/Marker.swift @@ -12,47 +12,31 @@ import RxSwift final class Marker: NMFMarker { private lazy var unselectedGlobalZIndex: Int = self.globalZIndex - private let selectImage: UIImage - private let deselectImage: UIImage + private let selectImage: NMFOverlayImage + private let deselectImage: NMFOverlayImage init(position: NMGLatLng? = nil, selectImage: UIImage, deselectImage: UIImage) { - self.selectImage = selectImage - self.deselectImage = deselectImage + self.selectImage = NMFOverlayImage(image: selectImage) + self.deselectImage = NMFOverlayImage(image: deselectImage) super.init() if let position = position { self.position = position } -// setUI(type: certificationType) + self.iconImage = self.deselectImage } } -private extension Marker { +extension Marker { -// func setUI(type: CertificationType) { -// var icon = NMFOverlayImage() -// if isSelected { -// switch type { -// case .goodPrice: -// icon = NMFOverlayImage(image: UIImage.markerGoodPriceSelected) -// case .exemplary: -// icon = NMFOverlayImage(image: UIImage.markerExemplarySelected) -// case .safe: -// icon = NMFOverlayImage(image: UIImage.markerSafeSelected) -// } -// self.globalZIndex = 250000 -// } else { -// switch type { -// case .goodPrice: -// icon = NMFOverlayImage(image: UIImage.markerGoodPriceNormal) -// case .exemplary: -// icon = NMFOverlayImage(image: UIImage.markerExemplaryNormal) -// case .safe: -// icon = NMFOverlayImage(image: UIImage.markerSafeNormal) -// } -// self.globalZIndex = unselectedGlobalZIndex -// } -// self.iconImage = icon -// } + func select() { + self.iconImage = selectImage + self.globalZIndex = 250000 + } + + func deselect() { + self.iconImage = deselectImage + self.globalZIndex = unselectedGlobalZIndex + } } From 8a00a286a6ccc88db51e65d3da4b8fd84c178228 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 28 Jan 2024 16:09:18 +0900 Subject: [PATCH 062/231] =?UTF-8?q?refactor=20:=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EB=A1=9C=EC=A7=81=20view=20model=EB=A1=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/ViewModel/HomeViewModelImpl.swift | 26 ++++++++++++++++--- .../ViewModel/protocol/HomeViewModel.swift | 6 ++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 73aea0f8..847e5e89 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -23,6 +23,9 @@ final class HomeViewModelImpl: HomeViewModel { var summaryToDetailOutput = PublishRelay() var detailToSummaryOutput = PublishRelay() var setMarkerOutput = PublishRelay() + var locationAuthorizationStatusDeniedOutput = PublishRelay() + var locationStatusNotDeterminedOutput = PublishRelay() + var locationStatusAuthorizedWhenInUse = PublishRelay() var dependency: HomeDependency @@ -47,8 +50,8 @@ final class HomeViewModelImpl: HomeViewModel { filterButtonTapped(filter: filter) case .markerTapped(let tag): try markerTapped(tag: tag) - case .locationButtonTapped(let positionMode): - setLocationButtonImage(positionMode: positionMode) + case .locationButtonTapped(let locationAuthorizationStatus, let positionMode): + locationButtonTapped(locationAuthorizationStatus: locationAuthorizationStatus, positionMode: positionMode) case .setStoreInformationOriginalHeight(let height): setStoreInformationOriginalHeight(height: height) case .storeInformationViewPanGestureChanged(let height): @@ -65,6 +68,8 @@ final class HomeViewModelImpl: HomeViewModel { changeState(state: state) case .setMarker(let store, let certificationType): setMarker(store: store, certificationType: certificationType) + case .checkLocationAuthorization(let status): + checkLocationAuthorization(status: status) } } catch { print(error.localizedDescription) @@ -183,7 +188,10 @@ private extension HomeViewModelImpl { } } - func setLocationButtonImage(positionMode: NMFMyPositionMode) { + func locationButtonTapped(locationAuthorizationStatus: CLAuthorizationStatus, positionMode: NMFMyPositionMode) { + if locationAuthorizationStatus == .denied { + locationAuthorizationStatusDeniedOutput.accept(()) + } switch positionMode { case .direction: locationButtonOutput.accept(.compass) @@ -290,4 +298,16 @@ private extension HomeViewModelImpl { func changeState(state: HomeViewState) { dependency.state = state } + + func checkLocationAuthorization(status: CLAuthorizationStatus) { + switch status { + case .notDetermined: + locationStatusNotDeterminedOutput.accept(()) + case .authorizedWhenInUse: + locationStatusAuthorizedWhenInUse.accept(()) + default: + break + } + } + } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index b3f38246..29c71804 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -30,7 +30,7 @@ enum HomeViewModelInputCase { case refresh(requestLocation: RequestLocation) case filterButtonTapped(activatedFilter: CertificationType) case markerTapped(tag: UInt) - case locationButtonTapped(positionMode: NMFMyPositionMode) + case locationButtonTapped(locationAuthorizationStatus: CLAuthorizationStatus, positionMode: NMFMyPositionMode) case setStoreInformationOriginalHeight(height: CGFloat) case storeInformationViewPanGestureChanged(height: CGFloat) case storeInformationViewPanGestureEnded(height: CGFloat) @@ -39,6 +39,7 @@ enum HomeViewModelInputCase { case dimViewTapGestureEnded case changeState(state: HomeViewState) case setMarker(store: Store, certificationType: CertificationType) + case checkLocationAuthorization(status: CLAuthorizationStatus) } @@ -57,5 +58,8 @@ protocol HomeViewModelOutput { var summaryToDetailOutput: PublishRelay { get } var detailToSummaryOutput: PublishRelay { get } var setMarkerOutput: PublishRelay { get } + var locationAuthorizationStatusDeniedOutput: PublishRelay { get } + var locationStatusNotDeterminedOutput: PublishRelay { get } + var locationStatusAuthorizedWhenInUse: PublishRelay { get } } From a4c667343d14c106bdfa2cb5e36d73f34b36809b Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 28 Jan 2024 16:09:49 +0900 Subject: [PATCH 063/231] =?UTF-8?q?refactor=20:=20bind=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=88=98=EC=A0=95=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 100 +++++++++++------- 1 file changed, 64 insertions(+), 36 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index eaebec73..8189e3da 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -66,9 +66,9 @@ final class HomeViewController: UIViewController { button.rx.tap .bind { [weak self] _ in guard let self = self else { return } - checkLocationService() viewModel.action( input: .locationButtonTapped( + locationAuthorizationStatus: locationManager.authorizationStatus, positionMode: mapView.mapView.positionMode ) ) @@ -263,9 +263,15 @@ final class HomeViewController: UIViewController { addUIComponents() configureConstraints() - checkUserCurrentLocationAuthorization() bind() unDimmedView() + + viewModel.action( + input: .checkLocationAuthorization( + status: locationManager.authorizationStatus + ) + ) + } } @@ -273,6 +279,14 @@ final class HomeViewController: UIViewController { private extension HomeViewController { func bind() { + bindRefresh() + bindSetMarker() + bindLocationButton() + bindLocationAuthorization() + bindStoreInformationView() + } + + func bindRefresh() { viewModel.refreshOutput .bind { [weak self] filteredStores in guard let self = self else { return } @@ -290,7 +304,9 @@ private extension HomeViewController { storeInformationViewDismiss() } .disposed(by: disposeBag) - + } + + func bindSetMarker() { viewModel.setMarkerOutput .bind { [weak self] content in guard let selectImage = UIImage(named: content.selectImageName), @@ -302,13 +318,9 @@ private extension HomeViewController { self?.markers.append(marker) } .disposed(by: disposeBag) - - viewModel.getStoreInformationOutput - .bind { [weak self] store in - self?.storeInformationView.setUIContents(store: store) - } - .disposed(by: disposeBag) - + } + + func bindLocationButton() { viewModel.locationButtonOutput .bind { [weak self] positionMode in guard let imageName = positionMode.getImageName() else { return } @@ -316,6 +328,14 @@ private extension HomeViewController { self?.mapView.mapView.positionMode = positionMode } .disposed(by: disposeBag) + } + + func bindStoreInformationView() { + viewModel.getStoreInformationOutput + .bind { [weak self] store in + self?.storeInformationView.setUIContents(store: store) + } + .disposed(by: disposeBag) viewModel.storeInformationViewHeightOutput .bind { [weak self] constraints in @@ -364,7 +384,36 @@ private extension HomeViewController { ) } .disposed(by: disposeBag) + } + func bindLocationAuthorization() { + viewModel.locationAuthorizationStatusDeniedOutput + .bind { [weak self] _ in + guard let self = self else { return } + present(requestLocationServiceAlert, animated: true) + } + .disposed(by: disposeBag) + + viewModel.locationStatusNotDeterminedOutput + .bind { [weak self] _ in + self?.locationManager.requestWhenInUseAuthorization() + self?.locationButton.setImage(UIImage.locationButtonNone, for: .normal) + } + .disposed(by: disposeBag) + + viewModel.locationStatusAuthorizedWhenInUse + .bind { [weak self] _ in + guard let location = self?.locationManager.location else { return } + let cameraUpdate = NMFCameraUpdate( + scrollTo: NMGLatLng( + lat: location.coordinate.latitude, + lng: location.coordinate.longitude + ) + ) + cameraUpdate.animation = .none + self?.mapView.mapView.moveCamera(cameraUpdate) + } + .disposed(by: disposeBag) } func bindFilterButton(button: FilterButton, type: CertificationType) { @@ -443,31 +492,6 @@ private extension HomeViewController { } } -private extension HomeViewController { - - func checkUserCurrentLocationAuthorization() { - switch locationManager.authorizationStatus { - case .notDetermined: - locationManager.requestWhenInUseAuthorization() - locationButton.setImage(UIImage.locationButtonNone, for: .normal) - case .authorizedWhenInUse: - guard let location = locationManager.location else { return } - let cameraUpdate = NMFCameraUpdate(scrollTo: NMGLatLng(lat: location.coordinate.latitude, lng: location.coordinate.longitude)) - cameraUpdate.animation = .none - mapView.mapView.moveCamera(cameraUpdate) - default: - break - } - } - - func checkLocationService() { - if locationManager.authorizationStatus == .denied { - present(requestLocationServiceAlert, animated: true) - } - } - -} - private extension HomeViewController { func addUIComponents() { @@ -524,7 +548,11 @@ private extension HomeViewController { extension HomeViewController: CLLocationManagerDelegate { func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { - checkUserCurrentLocationAuthorization() + viewModel.action( + input: .checkLocationAuthorization( + status: locationManager.authorizationStatus + ) + ) } } From 475b88621b1e1564dfeb04f852fed11c590e2ecc Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 28 Jan 2024 16:32:56 +0900 Subject: [PATCH 064/231] =?UTF-8?q?refactor=20:=20location=20button=20imag?= =?UTF-8?q?e=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension/NMFMyPosition+.swift | 4 ++-- .../Home/View/HomeViewController.swift | 19 +++++++++++-------- .../Home/ViewModel/HomeViewModelImpl.swift | 14 ++++++++++++++ .../ViewModel/protocol/HomeViewModel.swift | 2 ++ 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/KCS/KCS/Presentation/Extension/NMFMyPosition+.swift b/KCS/KCS/Presentation/Extension/NMFMyPosition+.swift index 7a634f00..c7a13449 100644 --- a/KCS/KCS/Presentation/Extension/NMFMyPosition+.swift +++ b/KCS/KCS/Presentation/Extension/NMFMyPosition+.swift @@ -13,9 +13,9 @@ extension NMFMyPositionMode { func getImageName() -> String? { switch self { case .direction: - return "LocationButtonCompass" - case .compass, .normal: return "LocationButtonNormal" + case .compass, .normal: + return "LocationButtonCompass" default: return nil } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 8189e3da..b1e06a0a 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -328,6 +328,12 @@ private extension HomeViewController { self?.mapView.mapView.positionMode = positionMode } .disposed(by: disposeBag) + + viewModel.locationButtonImageNameOutput + .bind { [weak self] imageName in + self?.locationButton.setImage(UIImage(named: imageName), for: .normal) + } + .disposed(by: disposeBag) } func bindStoreInformationView() { @@ -570,14 +576,11 @@ extension HomeViewController: NMFMapViewCameraDelegate { if reason == NMFMapChangedByDeveloper { mapView.positionMode = .direction - switch locationManager.authorizationStatus { - case .denied, .restricted, .notDetermined: - locationButton.setImage(UIImage.locationButtonNone, for: .normal) - case .authorizedWhenInUse: - locationButton.setImage(UIImage.locationButtonNormal, for: .normal) - default: - break - } + viewModel.action(input: + .checkLocationAuthorizationWhenCameraDidChange( + status: locationManager.authorizationStatus + ) + ) let northWestPoint = mapView.projection.latlng(from: CGPoint(x: 0, y: 0)) let southWestPoint = mapView.projection.latlng(from: CGPoint(x: 0, y: view.frame.height)) diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 847e5e89..7758fbba 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -19,6 +19,7 @@ final class HomeViewModelImpl: HomeViewModel { var getStoreInformationOutput = PublishRelay() var refreshOutput = PublishRelay<[FilteredStores]>() var locationButtonOutput = PublishRelay() + var locationButtonImageNameOutput = PublishRelay() var storeInformationViewHeightOutput = PublishRelay() var summaryToDetailOutput = PublishRelay() var detailToSummaryOutput = PublishRelay() @@ -70,6 +71,8 @@ final class HomeViewModelImpl: HomeViewModel { setMarker(store: store, certificationType: certificationType) case .checkLocationAuthorization(let status): checkLocationAuthorization(status: status) + case .checkLocationAuthorizationWhenCameraDidChange(let status): + checkLocationAuthorizationWhenCameraDidChange(status: status) } } catch { print(error.localizedDescription) @@ -310,4 +313,15 @@ private extension HomeViewModelImpl { } } + func checkLocationAuthorizationWhenCameraDidChange(status: CLAuthorizationStatus) { + switch status { + case .denied, .restricted, .notDetermined: + locationButtonImageNameOutput.accept("LocationButtonNone") + case .authorizedWhenInUse: + locationButtonImageNameOutput.accept("LocationButtonNormal") + default: + break + } + } + } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 29c71804..1a92f997 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -40,6 +40,7 @@ enum HomeViewModelInputCase { case changeState(state: HomeViewState) case setMarker(store: Store, certificationType: CertificationType) case checkLocationAuthorization(status: CLAuthorizationStatus) + case checkLocationAuthorizationWhenCameraDidChange(status: CLAuthorizationStatus) } @@ -54,6 +55,7 @@ protocol HomeViewModelOutput { var getStoreInformationOutput: PublishRelay { get } var refreshOutput: PublishRelay<[FilteredStores]> { get } var locationButtonOutput: PublishRelay { get } + var locationButtonImageNameOutput: PublishRelay { get } var storeInformationViewHeightOutput: PublishRelay { get } var summaryToDetailOutput: PublishRelay { get } var detailToSummaryOutput: PublishRelay { get } From 9327b67d554065fa41cc9b4490b180c2f0aefc81 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 28 Jan 2024 18:48:17 +0900 Subject: [PATCH 065/231] =?UTF-8?q?refactor=20:=20MarkerContents=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Domain/Entity/MarkerContents.swift | 3 +-- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 2 +- .../Presentation/Home/ViewModel/HomeViewModelImpl.swift | 9 ++++----- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/KCS/KCS/Domain/Entity/MarkerContents.swift b/KCS/KCS/Domain/Entity/MarkerContents.swift index bfa57966..ee760caa 100644 --- a/KCS/KCS/Domain/Entity/MarkerContents.swift +++ b/KCS/KCS/Domain/Entity/MarkerContents.swift @@ -6,12 +6,11 @@ // import Foundation -import NMapsMap struct MarkerContents { let tag: Int - let location: NMGLatLng + let location: Location let deselectImageName: String let selectImageName: String diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index b1e06a0a..a4833960 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -311,7 +311,7 @@ private extension HomeViewController { .bind { [weak self] content in guard let selectImage = UIImage(named: content.selectImageName), let deselectImage = UIImage(named: content.deselectImageName) else { return } - let marker = Marker(position: content.location, selectImage: selectImage, deselectImage: deselectImage) + let marker = Marker(position: content.location.toMapLocation(), selectImage: selectImage, deselectImage: deselectImage) marker.tag = UInt(content.tag) marker.mapView = self?.mapView.mapView self?.markerTouchHandler(marker: marker) diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 7758fbba..aa820be3 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -165,7 +165,7 @@ private extension HomeViewModelImpl { setMarkerOutput.accept( MarkerContents( tag: store.id, - location: store.location.toMapLocation(), + location: store.location, deselectImageName: "MarkerGoodPriceNormal", selectImageName: "MarkerGoodPriceSelected" ) @@ -174,7 +174,7 @@ private extension HomeViewModelImpl { setMarkerOutput.accept( MarkerContents( tag: store.id, - location: store.location.toMapLocation(), + location: store.location, deselectImageName: "MarkerExemplaryNormal", selectImageName: "MarkerExemplarySelected" ) @@ -183,7 +183,7 @@ private extension HomeViewModelImpl { setMarkerOutput.accept( MarkerContents( tag: store.id, - location: store.location.toMapLocation(), + location: store.location, deselectImageName: "MarkerSafeNormal", selectImageName: "MarkerSafeSelected" ) @@ -211,11 +211,10 @@ private extension HomeViewModelImpl { func storeInformationViewPanGestureChanged(height: CGFloat) { if height > 420 && height < 630 { - // TODO: 441์€ 420์—์„œ bottomSafeArea ๊ธธ์ด์ธ 21๋งŒํผ ๋”ํ•ด์ค€ ๊ฐ’์ด๋‹ค. storeInformationViewHeightOutput.accept( StoreInformationViewConstraints( heightConstraint: height, - bottomConstraint: height - 441 + bottomConstraint: height - (420 + 21) ) ) summaryToDetailOutput.accept(()) From 7a62cfde2957c06439158660efb2a1a6433dc49a Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 28 Jan 2024 18:59:50 +0900 Subject: [PATCH 066/231] =?UTF-8?q?fix=20:=20swfit=20lint=20rule=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/.swiftlint.yml | 5 ++++- .../Presentation/Home/View/DetailView.swift | 21 ++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/KCS/.swiftlint.yml b/KCS/.swiftlint.yml index 0ffbd1ef..4fb199e9 100644 --- a/KCS/.swiftlint.yml +++ b/KCS/.swiftlint.yml @@ -9,4 +9,7 @@ excluded: - KCS/Application line_length: 140 -file_length: 600 +file_length: 650 +cyclomatic_complexity: 20 +identifier_name: + max_length: 50 diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 585449f3..33f5101d 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -232,6 +232,11 @@ private extension DetailView { } func configureConstraints() { + upperDevideConstraints() + lowerDevideConstraints() + } + + func upperDevideConstraints() { NSLayoutConstraint.activate([ storeTitle.topAnchor.constraint(equalTo: topAnchor, constant: 27), storeTitle.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16) @@ -254,6 +259,15 @@ private extension DetailView { divideView.heightAnchor.constraint(equalToConstant: 6) ]) + NSLayoutConstraint.activate([ + dismissIndicatorView.topAnchor.constraint(equalTo: topAnchor, constant: 8), + dismissIndicatorView.centerXAnchor.constraint(equalTo: centerXAnchor), + dismissIndicatorView.widthAnchor.constraint(equalToConstant: 35), + dismissIndicatorView.heightAnchor.constraint(equalToConstant: 4) + ]) + } + + func lowerDevideConstraints() { NSLayoutConstraint.activate([ storeImageView.topAnchor.constraint(equalTo: divideView.bottomAnchor, constant: 16), storeImageView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16), @@ -307,13 +321,6 @@ private extension DetailView { address.leadingAnchor.constraint(equalTo: addressIcon.trailingAnchor, constant: 13), addressConstraint ]) - - NSLayoutConstraint.activate([ - dismissIndicatorView.topAnchor.constraint(equalTo: topAnchor, constant: 8), - dismissIndicatorView.centerXAnchor.constraint(equalTo: centerXAnchor), - dismissIndicatorView.widthAnchor.constraint(equalToConstant: 35), - dismissIndicatorView.heightAnchor.constraint(equalToConstant: 4) - ]) } func removeStackView(stackView: UIStackView) { From 129bfe10bb49f755d24ad6977f0c6d2610a40084 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 28 Jan 2024 19:10:36 +0900 Subject: [PATCH 067/231] =?UTF-8?q?refactor=20:=20Constraints=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EB=AA=85=20=EC=88=98=EC=A0=95=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/DetailView.swift | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 33f5101d..3184c3f7 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -232,11 +232,13 @@ private extension DetailView { } func configureConstraints() { - upperDevideConstraints() - lowerDevideConstraints() + storeRepresentConstraints() + openingHourConstraints() + phoneConstraints() + addressConstraints() } - func upperDevideConstraints() { + func storeRepresentConstraints() { NSLayoutConstraint.activate([ storeTitle.topAnchor.constraint(equalTo: topAnchor, constant: 27), storeTitle.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16) @@ -265,16 +267,16 @@ private extension DetailView { dismissIndicatorView.widthAnchor.constraint(equalToConstant: 35), dismissIndicatorView.heightAnchor.constraint(equalToConstant: 4) ]) - } - - func lowerDevideConstraints() { + NSLayoutConstraint.activate([ storeImageView.topAnchor.constraint(equalTo: divideView.bottomAnchor, constant: 16), storeImageView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16), storeImageView.widthAnchor.constraint(equalToConstant: 150), storeImageView.heightAnchor.constraint(equalToConstant: 150) ]) - + } + + func openingHourConstraints() { NSLayoutConstraint.activate([ clockIcon.centerYAnchor.constraint(equalTo: storeOpenClosed.centerYAnchor), clockIcon.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), @@ -296,7 +298,9 @@ private extension DetailView { openingHoursStackView.topAnchor.constraint(equalTo: storeOpenClosed.bottomAnchor, constant: 8), openingHoursStackView.leadingAnchor.constraint(equalTo: storeOpenClosed.leadingAnchor) ]) - + } + + func phoneConstraints() { NSLayoutConstraint.activate([ phoneIcon.centerYAnchor.constraint(equalTo: phoneNumber.centerYAnchor), phoneIcon.leadingAnchor.constraint(equalTo: clockIcon.leadingAnchor), @@ -308,7 +312,9 @@ private extension DetailView { phoneNumber.leadingAnchor.constraint(equalTo: phoneIcon.trailingAnchor, constant: 11), phoneNumberConstraint ]) - + } + + func addressConstraints() { NSLayoutConstraint.activate([ addressIcon.topAnchor.constraint(equalTo: address.topAnchor), addressIcon.leadingAnchor.constraint(equalTo: clockIcon.leadingAnchor), From f2fac9013cc75b5d2bc3f11c2f91c8d180233d24 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 29 Jan 2024 00:00:57 +0900 Subject: [PATCH 068/231] =?UTF-8?q?refactor=20:=20makeRequestLocation=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 74 ++++++++----------- 1 file changed, 29 insertions(+), 45 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index a4833960..06d1888a 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -124,30 +124,9 @@ final class HomeViewController: UIViewController { button.rx.tap .bind { [weak self] _ in guard let self = self else { return } - let northWestPoint = mapView.mapView.projection.latlng(from: CGPoint(x: 0, y: 0)) - let southWestPoint = mapView.mapView.projection.latlng(from: CGPoint(x: 0, y: view.frame.height)) - let southEastPoint = mapView.mapView.projection.latlng(from: CGPoint(x: view.frame.width, y: view.frame.height)) - let northEastPoint = mapView.mapView.projection.latlng(from: CGPoint(x: view.frame.width, y: 0)) viewModel.action( input: .refresh( - requestLocation: RequestLocation( - northWest: Location( - longitude: northWestPoint.lng, - latitude: northWestPoint.lat - ), - southWest: Location( - longitude: southWestPoint.lng, - latitude: southWestPoint.lat - ), - southEast: Location( - longitude: southEastPoint.lng, - latitude: southEastPoint.lat - ), - northEast: Location( - longitude: northEastPoint.lng, - latitude: northEastPoint.lat - ) - ) + requestLocation: makeRequestLocation(projection: mapView.mapView.projection) ) ) refreshButton.isHidden = true @@ -496,6 +475,33 @@ private extension HomeViewController { self?.dimView.backgroundColor = .clear } } + + func makeRequestLocation(projection: NMFProjection) -> RequestLocation { + let northWestPoint = projection.latlng(from: CGPoint(x: 0, y: 0)) + let southWestPoint = projection.latlng(from: CGPoint(x: 0, y: view.frame.height)) + let southEastPoint = projection.latlng(from: CGPoint(x: view.frame.width, y: view.frame.height)) + let northEastPoint = projection.latlng(from: CGPoint(x: view.frame.width, y: 0)) + + return RequestLocation( + northWest: Location( + longitude: northWestPoint.lng, + latitude: northWestPoint.lat + ), + southWest: Location( + longitude: southWestPoint.lng, + latitude: southWestPoint.lat + ), + southEast: Location( + longitude: southEastPoint.lng, + latitude: southEastPoint.lat + ), + northEast: Location( + longitude: northEastPoint.lng, + latitude: northEastPoint.lat + ) + ) + } + } private extension HomeViewController { @@ -581,31 +587,9 @@ extension HomeViewController: NMFMapViewCameraDelegate { status: locationManager.authorizationStatus ) ) - - let northWestPoint = mapView.projection.latlng(from: CGPoint(x: 0, y: 0)) - let southWestPoint = mapView.projection.latlng(from: CGPoint(x: 0, y: view.frame.height)) - let southEastPoint = mapView.projection.latlng(from: CGPoint(x: view.frame.width, y: view.frame.height)) - let northEastPoint = mapView.projection.latlng(from: CGPoint(x: view.frame.width, y: 0)) viewModel.action( input: .refresh( - requestLocation: RequestLocation( - northWest: Location( - longitude: northWestPoint.lng, - latitude: northWestPoint.lat - ), - southWest: Location( - longitude: southWestPoint.lng, - latitude: southWestPoint.lat - ), - southEast: Location( - longitude: southEastPoint.lng, - latitude: southEastPoint.lat - ), - northEast: Location( - longitude: northEastPoint.lng, - latitude: northEastPoint.lat - ) - ) + requestLocation: makeRequestLocation(projection: mapView.projection) ) ) refreshButton.isHidden = true From 26eb58741217eb7ffe7448350117e4ac898fe54d Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 29 Jan 2024 01:57:29 +0900 Subject: [PATCH 069/231] =?UTF-8?q?feat=20:=20refresh=20=EC=8A=A4=EB=A0=88?= =?UTF-8?q?=EB=93=9C=20=EB=B6=84=EB=A6=AC,=20animation=20observable=20?= =?UTF-8?q?=EB=B0=8F=20=EC=95=A0=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 24 +++++++++++++----- .../RefreshAnimation1.imageset/Contents.json | 23 +++++++++++++++++ .../RefreshAnimation1.png | Bin 0 -> 2813 bytes .../RefreshAnimation1@2x.png | Bin 0 -> 8542 bytes .../RefreshAnimation1@3x.png | Bin 0 -> 16757 bytes .../RefreshAnimation2.imageset/Contents.json | 23 +++++++++++++++++ .../RefreshAnimation2.png | Bin 0 -> 2890 bytes .../RefreshAnimation2@2x.png | Bin 0 -> 8654 bytes .../RefreshAnimation2@3x.png | Bin 0 -> 16889 bytes .../RefreshAnimation3.imageset/Contents.json | 23 +++++++++++++++++ .../RefreshAnimation3.png | Bin 0 -> 2875 bytes .../RefreshAnimation3@2x.png | Bin 0 -> 8694 bytes .../RefreshAnimation3@3x.png | Bin 0 -> 16884 bytes .../RefreshAnimation4.imageset/Contents.json | 23 +++++++++++++++++ .../RefreshAnimation4.png | Bin 0 -> 2883 bytes .../RefreshAnimation4@2x.png | Bin 0 -> 8695 bytes .../RefreshAnimation4@3x.png | Bin 0 -> 16897 bytes .../RefreshAnimation5.imageset/Contents.json | 23 +++++++++++++++++ .../RefreshAnimation5.png | Bin 0 -> 2884 bytes .../RefreshAnimation5@2x.png | Bin 0 -> 8643 bytes .../RefreshAnimation5@3x.png | Bin 0 -> 16863 bytes .../RefreshAnimation6.imageset/Contents.json | 23 +++++++++++++++++ .../RefreshAnimation6.png | Bin 0 -> 2813 bytes .../RefreshAnimation6@2x.png | Bin 0 -> 8542 bytes .../RefreshAnimation6@3x.png | Bin 0 -> 16757 bytes 25 files changed, 156 insertions(+), 6 deletions(-) create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1@3x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2@3x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation3.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation3.imageset/RefreshAnimation3.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation3.imageset/RefreshAnimation3@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation3.imageset/RefreshAnimation3@3x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4@3x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/RefreshAnimation5.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/RefreshAnimation5@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/RefreshAnimation5@3x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@3x.png diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 06d1888a..889bb329 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -117,19 +117,28 @@ final class HomeViewController: UIViewController { return alertController }() + private let animationObservable = PublishRelay() + private lazy var refreshButton: RefreshButton = { let button = RefreshButton() button.translatesAutoresizingMaskIntoConstraints = false button.isHidden = true button.rx.tap - .bind { [weak self] _ in - guard let self = self else { return } + .observe(on: MainScheduler()) + .map { [weak self] _ -> RequestLocation? in + guard let self = self else { return nil } + // TODO: ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ธ”๋Ÿญ + animationObservable.accept(()) + return makeRequestLocation(projection: mapView.mapView.projection) + } + .observe(on: ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global())) + .bind { [weak self] requestLocation in + guard let self = self, let location = requestLocation else { return } viewModel.action( input: .refresh( - requestLocation: makeRequestLocation(projection: mapView.mapView.projection) + requestLocation: location ) ) - refreshButton.isHidden = true } .disposed(by: self.disposeBag) @@ -250,7 +259,6 @@ final class HomeViewController: UIViewController { status: locationManager.authorizationStatus ) ) - } } @@ -295,6 +303,8 @@ private extension HomeViewController { marker.mapView = self?.mapView.mapView self?.markerTouchHandler(marker: marker) self?.markers.append(marker) + // TODO: ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ข…๋ฃŒ ๋ฐ isHidden = true + self?.refreshButton.layer.removeAllAnimations() } .disposed(by: disposeBag) } @@ -592,7 +602,9 @@ extension HomeViewController: NMFMapViewCameraDelegate { requestLocation: makeRequestLocation(projection: mapView.projection) ) ) - refreshButton.isHidden = true +// refreshButton.isHidden = true + // TODO: ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ์ž‘ + animationObservable.accept(()) } } diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/Contents.json new file mode 100644 index 00000000..b07a6eec --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "RefreshAnimation1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "RefreshAnimation1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "RefreshAnimation1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1.png new file mode 100644 index 0000000000000000000000000000000000000000..d3da1daee4009f95ee7f1f2133ac71356c1115e8 GIT binary patch literal 2813 zcmV6Cp*00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yPMCtY|H5)rPfdw{Fw4KTNx=57f1tD6N354?1bZY^qc$ zBsz6NEz-2Dj6yLTTPcWb9i-(^*74XV4unUQhAatj9AaNPw(slgJNI5Y4q{PY6}f2s z*}nHYzVAEVIiJrx=iYnHN8mC+DJASo@EDCQ;NlpLR^-RyEFH|$WU`e6g9*yQar{Jw z&>OG5= zZ2FRrlmyNd| z&P7_|{Q2_*K~aKypSK|RyaER@urI;~W{8N?M^)S4BF*60kH7NS&hu3kf)N>6eLgE- z^3|$@(U7c&DyW2|m36{AlFic$^$c)V;>0!65bp}9(1n3mv1`=8Z zB4kvC6-Gm38W7c+JNHLIcQ=T@>F(vPK6J-d=g$5{td>6)g0etK$ku~u=T)A;d#qEu^8nj9c9NvLJ~tG-f+XSH5<02i_ z#ozaxFU^=bx$zmO!qJ#Hqv`SKQ>0J~Z3gxw)-+@+wvu$JdFkOFG(V3Phbo*6c8UG@ z^7|JB3xdmh*bTNJ6Ny67=ea_^&(vTz}yLQv|zvlW5tLEE}F5-~_KF{^wKrGu1@Y?>Ncx)HI(pv%6eA8Kc zV*y{ld%cpAMGO*dRw6-+{(iyl^E>Xc${Mt?Q7hAbvClbtV}%;G`x=dRx$ylk;aZas zk`vq#$I%ct3?nxB$Ijs!E7aC{LsZs;=4313y5uh6HYhKOA~+5010&>}cMjiJ!X*Je zeflKAo%Dq$NQ46iqN#3#yn5&GjTOul2CiCi^5jNp8IbT)mUG?UFf1A2u6D^h=kSdc zG#$FrMUBeSzi0JC!gG2qSLgwUfz1||UZinZgD<_!IecS<{&c1XyoNFD{0D~cnu6{>JF_I}d#`@ifz(}uwuTfEHD$`1m`_XKcI>4dgdRNjrbdJHxl^43?TePLf2Mkgbsm^ae)8(JXZ-@{ZLINT zW8V(xU~eTT_ef^UWU#Ry6{Xb9zn%E>nU^*!9~{gNLKThxGvbd|y#2!F_YWKcg--?1 zR_1m*8^c#Ex9_IPgkS3JoYy$m)*&a8^6{_TKBHN5;uH1%BQPT_Tk-abzuvU(fJnsd zi7rp((4kdY<;I>19+qRq=^e_9DN;r?gl=T~WZ}}^EdIQst2$MFY{ z1J(<7?mE2fxtF(W?*2U0PQ6mHevs?$>IxMAV#bB^|8@TW+fuh~U6*@6gn(95>kUH3 z-G1}rYh%xT_o127n`So#>w{3m7mie_Klk?|pS{22rH${lclP(-jebhu`BbQZle?y! zFG4)7UyN_W{dR0u)^D3ZO7$dbxO~w+NVEVgf{)jA?~=uLedVq@X5Ts`)G)Q7KG5iP z@xkg)dgRt46AusqLM@p0ad3%eC*74IjSI!Waoj1X|^0jZz{#Y3@Urns9~PR zq|YJ$&~#gt?J@$f7Pgj0#l&&ou8Mp2_OJvnOX%hH$( zyFdx0DW-lX!%W0XRii2hr1D}VsaE}1KK>(h_Rqw67RI|cMajv9OoO|K^-@E$y?+dYMMIH~*fL6Z6!C zlB`uO%kj%t58sdn5Yux9^Ty#DDyt;_!fk68)1B!}WaRVP@meeg%L7iLFj&-@`V6%u z(qtrNC3GAIN9_cnY#8|8!1$SQA(2Rscsz>lI4#FDaoZ=3UP*#2gX@$R@%CxBMnOFR*Dk|oERoZsjN8CM3KhQX%?x_xLod#Zy!r{Y(KXB(Q44kbo%fg)a2E*3F{O@ P00000NkvXXu0mjfeu;Qp literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1@2x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..02b1855cfdca0e2c5bf499b74ab25de4acdd2836 GIT binary patch literal 8542 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 Y2i#7?@vThJr2qf`07*qoM6N<$f|H)gyZ`_I literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1@3x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c870ae0673b0d99ef980a60c8fa44ae225c54e1a GIT binary patch literal 16757 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/Contents.json new file mode 100644 index 00000000..ecb9f9b1 --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "RefreshAnimation2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "RefreshAnimation2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "RefreshAnimation2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf38f4fa8366365b956deeb7cdb32b5c60d00f1 GIT binary patch literal 2890 zcmV-Q3$^r#P)6Cp*00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yPBm47QfGYQtK!Yp1E&AEw>b2kQC|Wfjo%K{u_KO_fT8 zM5k_5i!^O3qYq5SR@#b99i#`L%G6q?UPFdZtYk3?8Gn5D5;Gx7VQl%*s17aCAs z#ACnZ`65UZvWX%l1N%3*3;b5Qp*(j%PRM)<*$ov}6t!j3S)_J5wtlQI))+*+8)#l` zEZ9t%qEQ+u$g+4?|C;<(`GET{AQS5Ebi{5Q)4^afUA}xdWjB)8w-!bKaxTOL| zkYO2C7!HwXKvZweoX3UEP7s09oy%T+;FfRCnR!>G$30ULg^3kzR{+X5C#b3llyL2- zbozvx?Aw3vX!}PGJ@%(hiSbw#$UG$+ZZz=T56hTCj!0%eM$kBK9)F-`qGRq2Gsmxd zX8yw3vA##Es;azD#sx=0mfO2Jx_7Kw-?Vbg?+zZCKD{!xb?b6{xFd5AP!bM@xofU@ z(y?I4>iYkDb$C@SmrKwxE(-ek`e@7H)>YoXPimMA0Br&1xD?u}ZI}xLmbzBGwsCgs zRQv=jV^q-D+10jgo#n?y*vs>AIt`kjazPm zy2sq;UGu{-B74;#!@76NMl2;TTfF<%t+%sT5>3TMCK=L@Y(9ST?X7dlMl3xro2-0w z!yINKdWIpn;+1jUycPVBOrrAkTc>T5B&qC`mKc~#9{JI{zs&vaq&kAOVh(A(&YW-A z`ibr>w`Whvx#h#>UYJrJxD!eUO~(NK)(r6X!vIxIfbkx5i=fhh7mfQ%i`g?H2V*0fD zN2gAb)`T~;{+F$X%z)<98V;`@?P^AP@W+kMqQ#+9zzkSy#NzVb?0_p4Y>NH$vU?Z$ zvx38X*bVj?8I3lObQ&rqj30Lsln{n8)+?XG6^*MVjCq*L8g6{@&at)9bYu6Xwh3>% zwBXh%pXVwlA++`mQFj`yXjE1CyuW(>j$4DlAo@9k3M*EuApEhkG_zsST~K1EuR6Oi z>#N~w!JMQoI{|vL0QXD>xULR{g^}`IY|OoW#$CVAKG=+dQ8k^N4&su09@h*gF)Y5x za&`u-n>!@yh@GTM$+`0Q+%uH4EMk&y4bdnudU^z}$6HdCl9=8nwy(x&Rwm1^zpwxxnWN5KDdliE7@+iPm7E1`^%$EkSl$+~Ymd1sa4J=)#DtcS9K^iMA6RC+~RhmDhb7?Kv56Dfvx1*7r!9UU%(!L!_wYj7Vn8n7=kF<)rxLe;)kmsTbBQ z>+8$(K^Y|hX2hQ@f9tvRAMD%@3Lp2Qt<2+iHU{omZrw_ialh4_X}7VfrA>~-μ_SOM|sU0C3JRnci;QSt3O@4cH2(D;JT{DLgN1W$EatX&KhLfIVJ1_@~16M zXEN@n))d80MQ-f-Z!UVc@y6hNrL@cLat0fPo44%Q^vsJJ)^{F{w^FwhtM21^Iy&mI z0Ab@y`m>%NU`OiKtm$y}ir~|7YPCV=n47Pkcy;*cA3QL9YW>Vwf3+XVxZsG#d(!{f zd+dY7FTDL;YkN-@e$kIBJRh&C;pC1fr*jaA=!5YMdESnl%KBp?Nb#;%1((Tr`-tYF zIq>kh?q0m;wr}2c%gh@m)zwU{srJ=69lXE1l%6|!dgYj$%A9QbU%d7G&AUE-ecg_| zgotUv>q$Nfy^>I!tZhG-J_6UPgN?*IhI4R|G&Y9$rk<3;lTEs~oZ-pnS|t^E7kWxg zEvGv$ErDhb0Sh$7p&0mMHAg__a2_}CYEZVzOXJx)(gD`<9MR0rmX#KeCI_|Ck|bq8q4d13YgF78vcsT;nko#mg}gK z!o2-v{@OC-sYN}+mV^9ZXH1j_6(^+yXT0s!- zH$`d?MN}CApiU!UNTL&*Xc`GSMieBGSRa}3Segw`6^$wKcvlUgYM53tG*2aoE&{4f`}x?F z@p4o_9?7l)5zA~jjNVj=r5RNAs8Pc@mr0*S{{DG^D|B8$845)n!phVFtBAZz55<&Y zfAH`s3WQUM&Cl9IenwHDGCetJ>dVTQ47))Ir75O!sO2&8zjl2ogItR6p+ zI{Rc|KeJ;UoT8-VY_i6g!~Q6+dkr(70mHz#9c4y(TsuiL93{=cARkR6__5i9pt>DG z!cd6Ej<}JePU0n5Gl~ab+6vGig9rZzE4L$I6rz6&fJH-*kJvKukwDB^EN49VC>yLU zPYX7krzrAAah{qHH#~N;vK_T!4C2E79|IA}+ zgXzxnCNlDQ?R+J+gY5w)QRvHQ^`{KAB3N%k8=^X{gToF2Q7{ag9~eI~E<~eI5{ZQH zH%=>XO~j6gV}+WD42Zj9MYDkc@pi1xGge*xoyjUh&xyc*XgXG094i+L1}SU5h_onP zPjOkuj?EJ(DzxZ=5tI>%4!j?>l6f8TG*&)@`DTia1UiOMl5Z=5G$Ew1bZQ_)8W-B_ okL_dWj`xopf3$As2!lTSAKoP1$II5$D*ylh07*qoM6N<$f_F}xOaK4? literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2@2x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d06dd588d001afacd5b6b49fbaef273da61103ad GIT binary patch literal 8654 zcmV;k#dn%P-P;`ECP5q%<2CfWV8Q<5j<9KI!>Wsti zo9h6-K^;aAv51g}hzRQZ#6|@QLMX2k3vHUxkUmZxP0oA2)_mW7oO6;UrLUAi)<3_T zz4uz*`d({&d#%0p+Is`Mi4a1t%0Dnn!G9>H(S9nG;^972(T8+Y#-oAiJfC04w^~Lu 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2@3x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..712697ae57ecbd982f197ec7ff086d11b9561926 GIT binary patch literal 16889 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

;< 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation3.imageset/RefreshAnimation3@2x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation3.imageset/RefreshAnimation3@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b3625f95e9e044ee2524b5e8b5b8ae5b8788df29 GIT binary patch literal 8694 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 Ui42#9NB{r;07*qoM6N<$g6ZB1@Bjb+ literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation3.imageset/RefreshAnimation3@3x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation3.imageset/RefreshAnimation3@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2bbeab03cd5129e2b4145e706a7a04ee9fa068ae GIT binary patch literal 16884 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 P00000NkvXXu0mjf71}1K literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/Contents.json new file mode 100644 index 00000000..0a752b3c --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "RefreshAnimation4.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "RefreshAnimation4@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "RefreshAnimation4@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4.png new file mode 100644 index 0000000000000000000000000000000000000000..eb7fb440910a6fa32a35e1b41f8bc862d696c7ab GIT binary patch literal 2883 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4@2x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..26cc9ba796340e236513123cc6a5fdf204167a85 GIT binary patch literal 8695 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4@3x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5baeb68a2f049ba643952c0c79cc2e445ff0d20f GIT binary patch literal 16897 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 z

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 Qt^fc407*qoM6N<$g3h~gdH?_b literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/Contents.json new file mode 100644 index 00000000..2cb91e66 --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "RefreshAnimation5.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "RefreshAnimation5@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "RefreshAnimation5@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/RefreshAnimation5.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/RefreshAnimation5.png new file mode 100644 index 0000000000000000000000000000000000000000..3a71a0ceeb2a2a040e7ab436f3ba8c28499a9787 GIT binary patch literal 2884 zcmV-K3%m4*P)6Cp*00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP(&VB78+1(_t0ph|0bQs8jl|rkiqoF!l?R1>}v1nT#jP)@{9l-j)b}CCd&WOVd zc5EGGrqfo64;D)+>d=mbD4^7$)W-$_Vq;8`kYz)5?{0SYzD~b$@7>LYiD_7=-c0tF z?B4VEzVCeJetXXO_U<_!feJw>CG1M@JrY^Y#V{QytB=K4Ihdu1L^}xvUSpV9BR{4ngFd`Ef?sUv<9n;}(J6*qiJ!LnN*tZrc0681tlJS>uF+Getz|qpEFik*4wL$5-iU*ZImD!HkToKA)8^ z`D#_dXh=px6;#5?N;+X3$>eC7dWav(SsrZK;d+#Te5{^bZSAb)?2J6zd04(e5x(TzcY(?f1q>kfbpanLEm3?#G+ zM98=dD~yN8G$5+CWXat^Z!d_z>F#xp-*Uw_mn^)l*5_R)iNeepuO|dmoE2161xmQ? zOg8(OoF4k<=!x#vZoBIbZxZ9KJdkBdG}>z5y&sn`#~hK&fQ+DZ*)smfz)aWDOBPPw z_`vd&jZ*`6*45Sdp^9^klq`4m_4FUuw!LlRmfsvbHh+F?Vej7c`glj?D4--7jdB-U zaIb5{n$6As`tbOsLZOhNReUKJ8XBS<$2&LqLqBR@HUP8*oaItzueMPx6k6-q^wiG9 ziBrkXXcb=xdVBl2w(UH)IJ9)FCmN+3rQ;l!NJye+#0xLHzh>Kxy;oO9;a3l4gV@eJ zS3%QVUi7Z{aT$@lnvh}Ji&Y~!3CtER{(0}!Y?ee*v5`r}G$fmkpM8GslByA%2WFFv zPwrU4Y(&p6Bv-yNE?c&N|2UVbz52>|J0(e~dZi8nv&kJlSoWu--=5V(&{oVLE!LUy zEn7d)z2)9}FXP_x>O+srX%1ZrlNfEE0Q{vL;IGF4>f8X+ec%{)Jf6Uu&{S>T?vM7b zTJeU~*4AcvKjs4g{E9*rFTR_<{)TVNn?1AfKA6N<`zpW_Zw=?8djQs43b6S*;26xG z*L>&PS<;s1uFik6^^h6RoLZyN4WwJmNw@y6^+B{aOja-hmK(9W{8tCSFJO zd2Gd%bphXbFp1GQI7Z!Ra1`q50{&k-e9e{Na2Wj@LWK<*HW2=kthBIY)^*@eFz4g_ zUVyOE^7M!@HN+czA>BY!Eso6@q+7qroFNo2cv2_J3YiB1$>?b;6POBd{n}> z`Z9}e)VihMIQRnI1xi*HF-f?Vc$^pm1A^b@cigmEsq;}OA2altQM?3Z;582P9%|g~ z^EBS&!rzC9(4GjBtnjJCadey$)|ZF><$SEZ?A-D(Y`z}gwnf(W$bj3Lj$3DgBT-xH zZKAR!v?kh#&?EN{w?TPP6v1hz)cN?LPRm6ztk*<7;4q9e1&-x>RLVEepy|+?Dri)m`+aL95}wnu z*?b>343#<`6U}L<6a%SrA9xL8&gs_;;huY1X#BxWY+iZH0lX!uHRaI|3Fo zF0YA8zVnkGY}((@P+tpGI3A~xgD0E5cJH-yivL7^|5I6WjVuJFt1eE@d~l>|2UIa3 z&~c*cu*!>aAi%4br5xKYxoAeHZQZX(u07Im{z>HHn8r| zm$vrw_4h*+jzrgIJtwcZ^@*ng9340r@+iekJJ$C|oL&zddPbwc`t0%U!OoTIw%%8r zVx0$Olb=4m>wdpL`WtJ!ndo<$bg+*Sltv^oW+K>_mkLsH_ur3xc;6%2)(s8ihM)>Z zfEn>8>z{jQ`zr@O0)bm9~B zNd#uZwd#mBEH^JYnD)ew4-@tqZGez)q= zuAb_e`4yqJx4-|!JD&XU)~)*v3I^9#Hx*Jh-#kS<^K{lI+s-LrCy?LlaJ$nKAQa)E>=eyiA9X(;3R2njq+^+8J91g_HYHmm(#UcD)Juml-ycDcVSur z%^(66XpBQK@W*P7fX?AOZs66RY?qhDvv;HetmiqRnV&5yEg($+1aPr(CI$1jgqyUQ zxglP&)e-PdMH*Zq7(a8@kOvfM=sZtcxT zjg%pYZg8V%B)Qz@2aP}!qK4eLB6eHQtL=LN3Rc?o4G6nO|MQ%kHO@-jUXQ;z+?!>cF| zP9-)!YZLhyMUBezk?9iLVR|_ zjWl%=KgpX>JOI;HfDRda_(xc|9SNfp{bK|y8j5_xmQjoZV%B0g<0(ejV0A@Wu<3kd zkw41w)Qq^{vzwLes2x*KAH~#>WUO{sjbFxo_=Y2Zn2|eJG!EZzTSfV29$OntccwRy zk*a!P(f=xWvDgbW+UDb*Kr*jcMyn@Vc?5_@iXH>JRT>pSOkCLv;x<} z?3g%KsF~P^xI0!f8yFF9#|k}T)fL~FtWxxx7>tOfW5va>a^Y~8vi8eJ%i{HvmqqN@ zJh8Gui!K~P8IkzN`(Z0t)UiloxNbs^x?lzMBc{&u0)vt0000|G;gF1{LVi2KQL_|>M6VoaX5SsAnU?AyqNT>5S{YdwD?^n%Q`*F_clMd-Tm8Aau z`s}@{R;^dn+Eu%D?Y#m1fDl5k%0Dnn!G9>H(S9nG;^972(T8+Y#-oAiJfC04w^~Lu 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𝔢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 P00000NkvXXu0mjfeu;Qp literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@2x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..02b1855cfdca0e2c5bf499b74ab25de4acdd2836 GIT binary patch literal 8542 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 Y2i#7?@vThJr2qf`07*qoM6N<$f|H)gyZ`_I literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@3x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c870ae0673b0d99ef980a60c8fa44ae225c54e1a GIT binary patch literal 16757 zcmXte19YTKv~7%ut%+?-Y^P(}wrx!?v2EM7HL>l9osRMH-+N!L)%|t%THonYr*`eL zYgb1o$Vnjl!2JON0)haL6jcHN0ag2c?+pX>{mOV&w)1^~b&%9_1_2@F{O<`WmcnfC z{UxZgl7uiw&GgUH?+*~>Lb5_2Aoa0u?}m^dAVNO?qCzSjpqJfnSwAIQ8Ff@YveL6P ztBZhAmCf{%ci_>s@C~A`zuD+c5HvL_MIvB!nMQBT0#gs23UdZ z5cej;SZpvIcs&LK8=DtC>pD}-6gBH=wRtOdH?vnoUDuiNtDMtxT^s?mhUJRhUmLX* z%B6CuUvCfPS60GmOhrk*bO&O|1U6Ic23h!Ww!$pePgz*zeeo?9^ox}Y&p3%AV@h9G zURX^h8Pe-=T?k3b+;+^WKU$Tb7GGG2n|l1Eu9xh<@PkWE={=?R=vh!+H?Y!Sk(_}{BzX3(ko)N zb62zgdG&_WGUKohfKhK$G|Xw;ZGm%%s+^l|gfp#ok4y4KzVpiGurE2Oar{TavFj7N zrlAJ&4@SeyqS`$_8tUO`iE)eK`S=>G>iIhjO*NX3K7Sxyps(>!!xdci1KNZiowOLrTB;sm@jgY5N{FONsBA5R^};n z(=9UoO?QTO>ev)}W}bd1)swKsKuJq_3BC4e7T91~;a}W%*{m&X(ak4ab1}#irGfL%viM-)f6zY;3%d2Od2n%Boy4cyL>P zTdj=mO6wim^kcI6Drpn;{K&)~qa}hvy0yc1{FBDfa4XmqE5?&XKiR-by*NGkXn=by zA_$tgTyC6&K~YZ$s-}<^?A&w=O*+6hZkcvQDG9^6F8N}!J<-6AgG)`;WR#`S5@Av6 zm1C~Q)y0}E<(S;7sKeYgZo>XJ_KDmIS(Q+uqGQmnxx7V4Kdu+;uEMEh#M9kvm0nxi zh9_x7SFZx7W_qAumjxw%!f!gN@w8~RBx5^Xz_)hkMA8|hCUp_xt-JKE@t167OYCuR z2RVJ!-Oz_9Fu16u0>9p6wmoY+ak-Mdw`&ZlqL&OvqD{0SnpK+xQ2$-bBCwj@1sNkV zbeXZY5d3&-*QjjynDG z8E@HHZiAbf?Y2s!dtlQ|XQju1{R(6{Ei;Q6ZM>!T^dKlV0-R%*(dQO9k`#dEbERWkg1S&4G4RDj<6X-Guc9ag(5YXB zJ&*yAsP`WLIIIf)1RIo-)8~j~QyBmx%9nr#HEy!EQstL{Lh$pMsH46fH{EsMMG9Xx z=G{-HBbNqNdL&oEzK7FKn_J6vzy~0;X6<$8Y=qnFx64YUDt^N+(d9>J1MYg*78JYE zN3ltGm!t9ZVpGa0Yo%lIBifCiYy~|d{lT$uDk}zV`MRc06*DD&nVlAVK!<|2zklmg zhfPEWaL|pWaS2+GaX^PF?%@cBH)RZv=<-y&sD{50$B~?SsbAe9GlQ`N)h56|+l)1F zqCRS^#CtlIE?Rmjlet@OIj`x~`4Qf5;i6PC;ccOZSVL)Y=0L=rDW)28P!<27N;1a8 zDS4nur1|iVc49cXTg$a{o%qd!bTu(Z18t_sm0W5nv=zFo+71bgB|Fm@z5VJAu})}C zqJ9BRu}JayClARFmt>f-klX~?fg-Qh>GMC^bvZ`#cfYhjdC?&9ho=PI(jgm}N}5 z^lDWdhjLXLHNBGAW#(qBKj-m~rn1!eSNG{1qXT(5>EJwU#q*s>)EtH6XW~K}YiJdw z8xzHd_#M?N6`>X0$|Vtsa`f@aQZ}2GRbnJ6c*_<>xr+>IEP@o{tM-nuCsI3#gKZd% zK$~wa)AB1nQX(H|Sa+RX_tP8dz~s3|FCk0!ibR>IPmsyZ`{K!1R zllyy*I8+bvv{{od?u1U?0D@al@mE@uOiLWAhMv>9gRK;9$e}?uY=bjC`SIRLz@5x4 ztlVk5pplo%LWnQKUC}ACJ;4IGlVmDg23Lyod~3=JZ~l}ZzPzdHVc0>@+{tFFmv`Wh zu`Fk(XA!*sBIW34_LpI7ww8T@@Of zN#ooy{f=p?%^LowVfy4MqqclP(ICq``sL3J3&+eu!!-?+9W(KnMgGXQ304Vd@e%~( z7fXD=6L-X$9>WHv^w>oc77Q})731ib$QUXR@E`>QY!s`?mFP2EsoNGiOP{z`H8k4( zA+bQ4;mb72RfNS}g;|fouAyQ-hM=xak?epUb6egw+O?p%nFft;Lk&*>nL~U+V~)uW zHu(v{x3)+u%{@>qR`o~0v4|Q6-xdcP%7JM$#zd>Ky42Yjsb05B9AMD+>5y`3lp84e zNBzK49sBo~fs)6?y7jbnGw?l-Rc>e2yMMiBKV@5~yj9~2$BE8Zq$e(nwi=rR7Z;Zj zW4FbjL9sS5Kq65HdHUMl$*f?`Vj4fAT;0Cg+8s#ge$6KZj>#M;hAx@%Se@()l#I*3 zi3fUexsaiDcX!ACF&2r!JZR+fC=rI_%#!6EwH$*TfhAwQ!lp^E{yozAb}$&S)W^f; z!^srH#t!$CVN=3sjNFrgu{9RwEK8wdspCEMyYjQvn&Wf&RHRh5-EV7sGIBU4f2mS^ z@HeNt%mUeWnzU$H&M?G(D|ZHjjrVUZ=FV!i5_>&vR#;p8Un|`&ivMCT&xsGzMUR2l zFITU$wYSr)ES3~x^Ee{I8#N?1Z0ePdT}i;ok@e?D8WrCfhp_bIfE3dpx!QzICxvNt z_k>+ii$UGew@hG(L+F*?*eYuTa=jkc_Bh?2eyH2&+&AfpV%~!xWJI$7DEKni< zM^Y<^br?rG?Iv(Hn(`%>irrY=W*kAIp{_r?D~l0@oNrS%VI_1)gV%DT{(UZ z5o)hfe0YkDyuCFHe8EI=!PgJsGaULu`o477f4^ni+K`P04t`K-9SlB_pR+W=-Dt7o zF@@c|x1_HBP>^qXoa4M~&2EEDXE~!HB2tJ~PWd)F7#rp5{+=J}b4B}faZ24jz>Rtr znt5yo4#R#eTC{>iy4zjCXiz3pgSOjEfMs;)SC_kQtei}<)zKWg7d+V5n1h4<7F~B5 z_;r`aR3?SZ`0)luHp3_Mg+$NS`0(y}mnonB%iB zK6Xbsc28-Fe$x?dmtIV`IH#$Sb?F>kF?jt9JoRSi#kZAK&lNv={)tEBw-XOu1EcG< znQmeK1PxcY+j*akoPTaf+js2-VV!RHA|OPYBap2^2O9JOd#~QcDD8W`ZVPPhaVZV` zr=!fyN^h&JOA2Ip`n`wyt1mIqea8*j$AKOmRaS97V3PMXP!E!S;4z}HpU9uepi zSa(EesVC3qe1zGzAM$DI`+P#P+ignz`hKKm*|v4DQamMjJw-^xFTCoZ)=vjEruQ>LuZOMsrz6r2IO@@_YDK>vyoyiEst&CKMWW*4?$qgJWBsU=cN>>`~&GQ~C6|S{$@^ciSvPe&p-NF&m~iT=YQ$uDdC}^p(FPJqXgbIpArIVFRg^n zH?cid%Ow7ned}YSjfS}#lW%X6MjmY>i*&zFO%!GVb#j}}(|q|b0Bk@NbHg~R=IgXi zuvXl^EXgL>oWx_q_wS*@Ic%5gZfDMTur zJxIPaR4U(vgXDDN=ei}ZHj9%|`uPE^L{C|CHpOK&=CeUT5O>D&<@TJB+Rd8kUE>U8 zX<=bOhs5-Y>9hCxd6TgFx^e?N;a(oiZ`YIT;#`_fJu9W|E{j)PJcpdAuacmAAh04t zB{M`rvZ8B`OaJ3}!*0IlzhX9ka#?;Sy7SWP|2~LEYCmoF!2OscT_rM-j>$h9LOk`O zyvc0Ak9}v;OMGbkQxa!bo?_ODKEjIX*%Wu1KuCItzvRq_B)Y-IfoP^EX;-jXT|+>i74A4v0$)A%TNxX-Li-{uh`2?w4$-y&{Pf z-_tA=_^18zA!bJR>5B2oT*P4q!Rvi0Gn)$L>>a@#JE|c!(6i%qx%9HWgyHstO11I* zptZE(cW{aPIXk1I`$b8sufqSv3I5aG^M2>VeEfLSkL%oBHQM3ri_nazuk2qgQM%;Jkn{~e@K8s8MEzu z>Y)Add*09gBxtk{QZlN7MSS+wW$z&Hzaib-g$X>}+!XLiY6<`z{ z+}Or0HEKp-@lnG^NB3h8h*j14@#u-Cf46_XT`L0e%@vF$29mq;k*!@{(Y>yFnnQ4x zm zbMSUxoBHX?@Iwai=QAAk7%q6NE1cY-QhD8>w`OG5ve-}t#Xv1+oFn?T+_0|~o~_${ zD5*Br_2_T6|4-iGmclSl^`10*T?^>F-HjD2TeUe~hs~aRt!_Of#a6iel;Kki`BM$X z${}qXou}6rqFU$owWI6P{iyceawXptTy9pkZ|}L1a2xyaI4FS`wQ!UCX$4G+)uaD5 zCwx&1po}Yld{qWGCB~Q+0&Q3Cvg_JQv$LESj@#{-jBoZFUHfP2iiW#rU`R+y7M}m) zEnh3F-8u8bs_I*D(QZ=cRsUQu9J_jXm=S6-mAP(N>%aP4R{y7S{s`6r3*e^P7|g|6 zdfCmPV^=RyZfmJobgibBG3!feEu&-9PFm_wSeS*v)j21ldzdp!MNJmm(bj(?52es)P{m4t;0c!}|T#<*n8R*7w0*HgXw?bM=f2_H9bN@Oj@< zN@HwcA#yAKdGg17muR`Ecm3oEk%>jEM7sN5$C&Z3P-XTu(bl;rW{A}k#qqz%+P0G! zpmXJarDnNlU%sDSbMZ`Mon+SWc0Xx&vdbQrU;Fty z4;K~+r!T)8XZfZ3;qLwpD@_4aa7{V5lss}f4(pR95CoOB znG1YDvbEI>_4UlKIhB30G?9ZK8{~3S0XwdHVsy zulS|JW!ed_!xmY_Q%%1rWF42!GjMzdriJV--rpt1s@5d8Cg8bdBCZ9l%+=RF-aeFr ztgk#-g<~w1?Ltk8MRlJ|G)@#Jd_JE^jS{r6`Hp`@!S1Gm-FF=x+|pm&hAt}`lY@@t zFmxMy;54+F5R7^MQ@jSDO{L`4x5UTCCy(U?8`KV*5>+veE;F>z*m3TmSWZSD3$zxv z-;_H%igP5HnDw&Cl03ZkbQ;02Zi)K`h7k|T%MBPA9R<7=1duFWZnRcDTcNX+>m+i7 z=T*fqRt*qUk4y~ne42X78IT3LZ_32r{Wm0pv1pO=*XiU;5 z)t7fS(oeesa*2h7|)B3C^XU3XS;2wL@tUFsm7HybX4ShD5DvK%R%?Tc*+A z>siF%~y}jY@*~efXW1H0Zk_dk7;9jHd%-P_Sc|)mD2J{xi0S zBnom|Txo;iF0LZrA}4ViR5H8q^H8tlbUvY2FW0t8Fstjz5XX$<4xnR@sd%A&TKTvS&`jCEt(e$E_Ghg+}z zpUn)oOz>-S2@zzfT=l5DcCxm;UU@PQS)u^CFWFVbDxK>`%!OkVo#jt?_*}6Vyp%+k zrko57bruMRqNVVnj;m!p&*6uv_k~XyM7`l)mBGOfnMO@6cP&QJq)Ft3B|K4M(|ud* zamPWtR7Vm(_3_o9v7pe~?rLwxfz*xOhh@N=osGllmV=_4|~XW3NIm zkfHzo)#@`0pD2L9h#VAxKB1&%LguMl;7~`73L%BF(f5&-XN9PDaUG;D+H*Z zHSu$aNx}-yVOK!wn42GC{x@qtbq0GIWYg}C;{UsMwb9%Oi(ljSxyWJy{6P6BGn+@V zF?5xQ+j>5__tOmj1Q#VPEmrQ=$I;7AnC%9?Pj08pyzd{i6tv^z-l;;_h|6INxd;ph z&^#eh<6>4!sp*tcSWarsA_gB#?)CC#dK4OJ5 z;-L8sn*kX0x#ppvq5i@~XD^WR-ylEddTw1qct86&Yo1g{H$C7FB2HAd9y-w8mgB!^ ztax|K#&)IlY5AWe87Fnpp`Deq)3jNTe%Hv0hITG$+u_ca_kBdJLo3(hoj4LBTc+am ziomUe|5FLa=i@bUG}ccCwcmtI4=rq#a3Ol%WWWFMsn(z2BMJ z>G9eFl_-uq#uJ-_{IBDLnl%Eh%CCB2nQ#>`MgKmKM0yB!OMq?D^hea(W~!UKxiwfW zRB;X-1$q1;frhtp*3|_~K4+Ok@1f0l#zw;_> zJg?dVvDcV`_^rHeelWAJfVqE(wJ)<44Csu_O*NNcYJfIZ{Q05AN=U!1Gb6LAU@}4cZYxA|B{5 zC%)iqyimIA#-I9qJn&>G)qlr`5`QmH_&ur@A#+tB_D1>LN2k7z&1%sQzFiGvbZn^S zwJq=KLMV^QctS6V$mO)KkoI<>u&@Zpoetq9VbHcs&_b;kXF*&{ti_WEhw1Ym!{2Cc zW@gtN$9ww7{~M%r=cNzH-)Xc507g(bdFi040q4wxieYwUG?`-c%2oNO42u0j&}rD- z=;Z~S_UZK zFl>Nq2a7F|V4 zfPyLix5p*?8i=)DzaQE}$rPQMbph{Pdswpy+em!6WAna%;bM`^1*)M$@-A}*lJSg) z581g(+0lp=j2Fhik_HSBV1&-}(|_*Ac)M@k1#j5T5rclO2P{-32#3ih``)9eb&V! zcfq`HcY;+zOz*vKtJV7LZ#mE|l7ipZh6INPeQ%B3c`Oc>AYd!HhS_7?fLCiLamf-) z^7bxVTT^e%(Y<{9PC1-S76L+gWMpD~i;tWG%h&F9J5H0`op0Z90iss*Irfsr>!kMc z%l@-;tMlpP+QjB_bKi9=~ zFW3L>8!c;{sgi@EgbCJ2URAp)i15|lhfRQA{CcXn?c&Gx8i!tgYa#YCHNxwiG!bXY zQX2}4oMl~hZ-j~HCl7z=-A9$0`7Zoyo)iYYI!T6O#)QRCBOwRuP zss(Qwy*uzzIoq>k99YYyJq1I}gbu^OU-~7Bk)weh z;C8DoOe>N0#$x<|aUhh6iBf~!D+oON!0PKww@eE4|Hc7wSYf~Av|)Sw8tMO%BrTel zwp*>$Qo3Jhces%clQ~7zRp5?lRLN>I8iRjkTY1q1BHiy(A)JUEq(z?mBQQ>IXqLv%mBL-jx%+0wj<4szd980TBHZ`3HLFSz0IVi#dnxSGBv21l z-8A+)!Qee@e+k<8%VpTJgKpB38ij;*>tZTEUT>CztZ?7_7#lTqyX8BVC#x||9|}!v z%yI{R2Hvlg1Q^#4ExS!QclUXy6zu4IdR0fXcKXk`Sj&^dxT@KC?XQm&6J?JO>h@u^ z!VO^;-gxjWCF?r4>+tYFa zB|d1+5-5Xo#TrWlMU>IEysceJ*m;}Vdpmf2R`;LVG#>J+ z`GasGlwP(+O4hynHT7+Iw(9nd0D~l?^ZY~m(vHT+0?BenvFdD#61DWoWg=q+M*;Vc z_L^1XQ``JxyjP+Yyk8R_Nm{nc{p*N>A2?k5Wf10v{$H0d0dblu{W?v-zkZF~`HX_) z#Rw#oEMIe=E5w1>Fi!9yABCwB&f&o2r__Esyt%1c)e8irm7?;@@K}d!thJq+Q{>hm zwpqb&PN8jM~oA3m6oHE;m;z~Ila)_pK`r7YS|6Jbqy0+f&-1a;^{7>}! z=fxBH7krj8e(v5AzFuSt44L1M5=t(CP{t)d0X-9w=?L2@xmJy#dKd@ztS>A~7U0jpnmGeq(t^^uTC49UM;(hx{iVe~vUUmo`uC z?g&(vNM3RqoakXu_RP510yDL%$bv(0+@q#>mEK40r^z$Dz0a0vt#-E;+uXN?;>_vO z{__9Wp6Pwl=YKt@<@2j^O9~yJgg6E<;72H+i0a`e`^^X{+9T`bgJt(sY5;F(0vB;J zS8;&{G83X9dj}tv?T!qNXabG0aRQT0mHLv$Cx#m{J}8dOG+5$fD3m5A_d{h84x*W^ z-u`-S@cO0F|K-ru{i5Uk0UeZRd9SO3RH+F$+O{fC#7D1X~~XK;ye%V#u((f=** zP1fpGaw1M6N*fytrhQbG7J?i2P6hu1MfECz67qn=#7?{cM(Dfe{`%kY32qt zp!g;$obC6Y&Up=NM2l!yWMhjMY`uIK5u3$~)-tj8K1a^xBI{1jr^}ylR+0!C=<&n- z-fT>weMO#YVj|}|Pc5{qy3R*pgPeWE#&zGSW~&eTtjG85ymjYeR#)JCyw>jRj)Sm` z@G79)a*Y?2_fR;LOI$ccpO3lh6%3?KL4#!RUKnQ`5~l-*d!0>&vi*5L=jY@tHWd6d zlcS(ahgVOL>yn>5LG@mdWOHdOvd~y^jYdj`E@LO^cF5K8%XiXf{!!##8bNDN&_SGF z+7JtUT?#0=tyomLdbfwghia-#+s#z3_pmG8%ujAv0kLmKG;sTLFqWU$@u@pjMc{Rf z$8L>Bx3YiATQYr@f-YWxnl8dPv}G5xQKK(F<(P!^#8J{hT#sot3-e=L06PWFRk1oD zJg&j(#gYq#ZMXrMmV{WHEe-Nrs>K%1(D<2ZdD_>;z@Qoj-N|gbMMhuAoY+DO@z^YJ zonb_4kSYXRu*P$cA}IZj0S+7NZ&&KSEBcL=3)cGGN9(CNE{`b)=dT=A@@gUniy&Sl z3kwS-cYS|zc&@z;ue=FXpLSP1Z3}Q=$7S2LM#-7e1)a!2JxT;~S`2SyAsT?-jD%eI zgujH1UHO|3x%yGgEt=Zf{vdsyhM!S>ILTZgKVP1eW;DI78LWk~iQ&5c&Z8a1sc*6K zt*u|kEDmn;ElI7-S&y==I`^#jo z3zssq+t-xZ>oV9;$;fpOB+am`!td*FITHA(iYHx++MjF5UsyW&Eyv|Zh$7f=5ss1x z_*ppaD@Q3Rm%^UZd;O$=(;v{7m<3FK;zR?#IFT)fsH1gm6!>n`_SjRkWBS{#UlyB$ zu^*8l4DS|fP+#LQG!Sw(T5yi;<(lB2%4wJ+Rf#v2p5L5Mt^Sx&s)=57k6;BVKC2TW z;}ZGW9E|jpVck*mWF`k^ezo`gg7m1JXOV&1uVtgKfy>1NaUvH^n>Q?hH3W6I?l(da zae}O2lYuFDPQZpLv^h{Hf2xR-7jRw}QO)%7_P#r|(`v1cbH3+;EEUL|5eW%={N5=> zC;lK#WtA*|bM^nXo8O*3*ytR+CI55%{(Kba+VlILC(w^qnbm=W+9FTE0voy1ubfl+OjEgJ?X zcZYEWYlMd4O!xrl=f9J9LWQtH;mMNe9pn*g)=uxTTn!@B(kk;;MbY zmY0~H`#(a~Td>)7Jwnch!XXWC+Z0eY3apSs9R=|;IQDTXd{U%>U*KKg=M~XLu?`wU zs2%j4KQCy9{p^C27=ddWn3F2WI~jae+!b`z`wl9}e&VGo|3 zfR<;Y6`dKJwiwQVxG=L=qE?Q&Nlq$=559(=UItkviyLT@4pA1~{*|7XfDyzib1@)n zY85&#wPO5>B?zYKCoS|mPNshc=dfn@WRk1I@`n~fTXHSQz36)$ZR+NuZC^HpcObJWFi46+LJpuGc4T5xiw0As!PdTU@(eKQVBg7s%USeftONroC4&C1jL>})rBx5fxG#_bWD94 zzBGKCIdB1q&8nqhGaPr6YXVi6E?>|`+7=d5{3IDg^{Kp`!|%d`PG zZ2xH>d$*wX51gXnmc)z9sP1>wqL2zULA+6VG|ak1l_`KinC%e+h#adT{P79I$I;3n zt;cnQ4$m{@ae!agb0jd8mn2@8jtzvAi>r#?oJRv+Fg)(FrC|Oo6&vn=w-Y2SC!CbK zD8N8U>`}Od!fY#=M#59}>qtn4|Ez3!Mbr(VA-`d0h_?lS+qoF}>^c};;`GM~H67vI ziv=esf4g!TU@M8?j|;3Ld>jS@>PmD-mkhYH)dti9xF!idGk{leEhY0LR$9`2*PZ;v zgxRP;*%d}XUIy+?(yDhgg(3pTq2#>>NI_1vA0ortNKQ=CsYi629AZTLVMWn$sHlUe z-k^m4dw%5?-I5;v>eSfDC7CT+pbYr5vNGgll-dS$x`BPxes<-fn&&MT0|IG}$FMKt z-5LX_B62HZ3+W-NYEN5sQViLZzZA5EJ=z6EsyWGIMGL#?P7;9dm&#{bw*lNdRp$UA z+AFI3n}ix+0y$&JtFaAp$%C69i25TkK)Zna_7iso3vWGm6au!GQ;PE>{8Uk*jIaeq z9zTJqobphpbM&ZbCci0Ka{kIuK!i&n!R$p(ap zVO_fMD45w~TzFJ#;&k~~Fy-O+QUrExQ$*2W+j=bw48#4}FG)`RM24ix_~#&SUHO2^ zw7c*{{5is;f2qHwl-#FO52(VgKC!W^eg$--{~hMuUcoG z1I)!_Co!+PR{g)ZAtUI~G~0Ii;V{O8@Krm>j>x;oYV0>#jq!%OWt#Y6v_vC(R!88R z)~zmEBJYXkywAD-uf8Ft2Yz-z)pOJ3rYhrSBvHWd4LnVvYw5(k^gN zP>0Ug)(;2qV56Vms^K7ZkMTD6H*%KPApOFOASBh=?8ugVE8KJq)@CMy9}L@%2M;Bg zi=s3UsTn=AG_kp*>lHt^gvJtRdt?G8X+oe!M$D+Fks70ce8@k!;CuaopFsLU^NF{{ z9D+fFX`BrI;6`$Gr z#sb1th-9^8K=Z+YC~kd>g^Lf^^bkt3hxYhL6S4U4!8>M2e;?wNd`I#TWDsXf;Eb;U zKXyk58kwDFq=6nQ8;mMTS162bX1)R(w<=5rZFapujJktF^4dI{t1$j9r-WFZ4=Xu` z%ti;iLxS=PLYqJk`NUwC!$yhA;Ol`S)#SiyU=GBC3h;NG6ii3oE-{-B|1!@|lLlf5 zoUyKgJTHoHDhu2rn_(`AZxiW+`eVK$C+JZhB+`Ky@%k1^V|Fl&?z|horgma%Ri-)< zfS2D*CzFvyWaTe~aM@AJuFOKrH*{xO_G%XvVIxM2`I{Mfkt0etKgLiy z2%eRCM`}I$zHRy$xuqeK+t5(^C>cyF)Nqp>85lXKYzt}&=_a_b?_*DKGD+Xa=Lvl> zw!j_+{P_S^4EGP5s|<}FitwLcZj-N~ONDcToDWP*zfeSeLy^T&s*oL;niJ;gFZQ4Y zJ;bBiBKg)=`on&|ghN$ZSg?ir3RlPE2)^0rir5Ut&b*#9iugd=C{ryarGhg=EY?3E zKeo$FGdVdSbEr21LWTR9!G*zu4m&+h2iy$ms0clF#ekx$>``u>;!U_+%C!E!GIBTy zoI({Au9b^9w@ua+F}VWA5-MqUZ}l8~yM$L|+9xV@`w@en@%Ezh_Gk_ykvRVR9Ds=F z!!khtHM3*Kr1GkVc-N!`Bhs>5%$TP-qz{Gw9U|p&A<<4Y93&|-4o6SH)B%Wep&CO> z4kcDE5j!T)@?j?YbO|UsvR#ij#?bHx3bo?tGj=fB0Mx>()JpTIFxXOIs{oo{lHNh! ztbeJdpS7X?;zvAim6FRK9D^nSVx|h85(;utRU(?x^gzS6#?3=*5wpxN`Dd*R)S(UM zCC;PF8_VAG&SSZ>-bSD&qvKFV$=8|iv8(MHLeUIhx%*YATXD>ehq4k`R0nU?MNlHB zK0@NF_!{UN91+Q*Z*XfO#aC&yE(jTU;Nj$nrQB-%1l$NEXM@4ijG8;!5Rwo6!JA3| z_%7`wSvrE-W+@*62AWy}r|OV`wr|D2?#dsBj1?=lRC*=nN2O6#rlMeF)>N0cD&5nT zL-L}C;!%R&i!HG?`a&z^@oT~%O>>9Li1|^`o`wa-A@uf;Pm-v>pVEG%SW^BQf2=Li zy~~pzC0B2vO@eg&(cm`BZT2QOUkk1ZH8$W?;Url_yI77m3b*<-JB?5VcY=A|#||f5tS!d&$+3$&peV2>_^)n9vHY9HqK5`B1DFu)rJUxa8!;^t|jg&z;Lm<3MUb1S6 zdhb?TagdTayy#pa>zKS25}Q*vQDP0%IK^&OzyOtZ^VI^ZXt4iD{!`%kZ2jEg%pb}i z5vi+Y>?he@G3t+;f_IV)WzdG>fCy8=u(0n7)aciq!iicW>e~ND)C8R>iG9-$XmV`O zRB6Htyrjp*wZTJy$}y;mLMJvre;((@6+RB>N820`M2(_*aj?H83v)cB^n^8&lQ-BD zU!y`xi5cpLq?;tJes5!>7AYRJna$q~QBhY=y;2H=HOjWii$qJUncr^+H6`c9Q0~6v zTm~Ek^JAO1r~sAJF>olQ=0%`O^HO(oC90H_ur?;@LBgj(gF%<^?o7`2%ba{zVmo%3 zeMSc*bVGCj<0(=_?%i;aiZ~D*9PM4jkE1rK+5H=Q=>wYTQ#&WoN((2iu8w z)&3`uLYswzEEFi0e7Nu&hHI{vSldhmPGiB$1q#LHStF1w9sJrQmW#giiks@spjdd} zqx8Fr%AMtz*v>gACH4$leTl`)HSP{VNvuFri9Cv6TAt38xu0vGmk6IsI6pVWbVGAx zQX!&9#WL+;T zE!QfNx)ctjb>9{5#X-}l(7H~}u7w%ma%LOisH)$J+USBhx{4k-^t_>8Qt**+ju|O6 zlN?qm;iT<;A~+4Bx+g%5F(D~+?2>^pC21nU)smtiGmddu-UufGAp?-3)6q+cM3-FS z_?eQeW!ZpW-a7HOh6Byl3DCXnD(^}H@V)V{DpUzwJ9}^cWv_2@Ts5V#l?l*wTD!xg z2R0~|A2U_sZP2CGi&WUxkm_%kam}a8U7puiYf&zlrQ0UFD2S_X(7e%PA9yvriSyU{ zw{~4Ul0~-6sp0!V9d%s#WiQcQ9+SyR-vK_S?~=3gdaTgiyeh$qJ_>CU+x$G|8EEIY zsu?5RQfNrWGtY#CMxmmj&@;elp82CVorN^@{<5~wYG|NUU)D+=SWv-(O9ic-5;Rgd z3RY-kgHjgj`_fb>tuZKndhmBG6yJ2AT637-qDl93=$5M_K}U{`jJ#^J^Ga8Ka(BcF zz`U_17$Ahe51?Ym^9vPjyIzFfoYJ5OhEU`=lN6CFNp;bL`}C{E{+&tm^hpPK-1|he znKWV`c9$j*N_BvJ10=+dom;-X9GXJNBobW5rI#a3kP_7{s?NOBTq>>f6t^@U(fxjr z=}}twO!>K*78X2AkUC!;TybFPN~!CKg1W%q!9q(I$X;!@)$pijHL|eD7se)_s zR(z4R+SB=NeA-e*-}pgYs2*V?nZHOwT3svidY)hl3nW`iyyS=P{F8lJKV>y*Rvh&= z#*6GD%VjN|F5kbBKx5i~4y&~uDPAjjG2wHI2G2F@aq=<324~HeM%SJ(T?93o@rRG~ zRvHfoDRoU26bZf&B(_Rc^6%#*4xGx$D$3kA}F4`QKS4 z8b8BSW1kG@)F5}_EzHd(Tzq_f()luwZ_{mEFwW}w1lW;rp6QjItchDoC&|bso<>!D zHj7OlE*(Dff#CS;uCU;0G`D>^{N?<`*!Tjyn>v9L;9tH7DoI-qnvgz~JC$n0Jr3Z0 zY&JzQc_fA^jg?|)%Q2|(C+|o;cyvjAljE%Dh|gdfFwM8^Pp^ z9R|O*Si8i}Ll}8gUef(zBO#isHa@;SDU^mVi7SrUnI?Wq%J%Q%Cx2qO+ti^vP}&_E zpl2#U&S_j}v&DKY-7If)yhvcF53r4usLS2EO&@yH>}u=MikSa^){BT`;Am|x*GHAetvKjBP8-5T5PSyO~shqvK?*-#eD z6ER7U$$)If;Z+*d1b3@M{TZ^}?yQFVAjQo3zP9aJ8Oy0T_A4?mMk7_&s_mlGaQ4rJ zxcKTSHZf@(Kf6xJpvg~$g5!!`JbSIK$8!70JA(D`N-C_hM=Ypp43mZRV|11)x!KYHOy%-wf7|wlV|d3nR2=fPK$PN$`rfB zsme?H2bMSlN%;?f{%Z%9e^juN(Xdo(i>)@mCzS4t+N3^-WKGo*;j4M+vw5U17-|-r z)*ehb9qrjWj0MyR-A_fOkYV>}%;d{(f z%c>?NMfa+Saw&pXsbhaRUS%Dgmv7he50RQ^D`h50%*+VDAbDR~@AhJcb5iY9Qhif_ z(_P5bMAUW=MT^+f<##I6xFnjYGOgj{N_pv$ zT*F&tPscGQbozZ9vur9;!W|VIy*E0gf>UoZYfV<;uGJz{YjPQI*IM57On9HlERX`r zvj6VLB~=u#f`o5T^UNF}z3u=PA? ziLGA0xNrm?ALDD}GVOscq1n20^Fh!QmZy1|ewNF7T5=Z4{uHen9sX;P@NhktWr@s zE3Qcot(EB%+@{WwS36WjH#VeP!IejAYmPJ9WLM3bV45C*#}$_sE+Cfq@n&{i{J#KA z0J8shl0Gdb`zBGRt>QkPu@R9=p9HNwm}yig+oQ>?WtVNU9qd>(P2ad&)Zdos$K9kU fPr_ULr;Gms4$F+1GCV>+00000NkvXXu0mjf9>NsG literal 0 HcmV?d00001 From 1ed1f14048641a844f1c631e3b51289344e4c0b4 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 29 Jan 2024 16:23:18 +0900 Subject: [PATCH 070/231] =?UTF-8?q?chore=20:=20RefreshAnimation=20ImageSet?= =?UTF-8?q?=20Assets=EC=97=90=20=EC=B6=94=EA=B0=80=20(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RefreshAnimation1.png | Bin 2813 -> 926 bytes .../RefreshAnimation1@2x.png | Bin 8542 -> 1946 bytes .../RefreshAnimation1@3x.png | Bin 16757 -> 2982 bytes .../RefreshAnimation2.png | Bin 2890 -> 1010 bytes .../RefreshAnimation2@2x.png | Bin 8654 -> 2053 bytes .../RefreshAnimation2@3x.png | Bin 16889 -> 3163 bytes .../RefreshAnimation3.png | Bin 2875 -> 1017 bytes .../RefreshAnimation3@2x.png | Bin 8694 -> 2100 bytes .../RefreshAnimation3@3x.png | Bin 16884 -> 3155 bytes .../RefreshAnimation4.png | Bin 2883 -> 1023 bytes .../RefreshAnimation4@2x.png | Bin 8695 -> 2101 bytes .../RefreshAnimation4@3x.png | Bin 16897 -> 3159 bytes .../RefreshAnimation5.png | Bin 2884 -> 1004 bytes .../RefreshAnimation5@2x.png | Bin 8643 -> 2047 bytes .../RefreshAnimation5@3x.png | Bin 16863 -> 3143 bytes .../RefreshAnimation6.imageset/Contents.json | 23 ------------------ .../RefreshAnimation6.png | Bin 2813 -> 0 bytes .../RefreshAnimation6@2x.png | Bin 8542 -> 0 bytes .../RefreshAnimation6@3x.png | Bin 16757 -> 0 bytes 19 files changed, 23 deletions(-) delete mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/Contents.json delete mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6.png delete mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@2x.png delete mode 100644 KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@3x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1.png index d3da1daee4009f95ee7f1f2133ac71356c1115e8..0c15a58466c355dd970d4247a8a9f9f346d34fd4 100644 GIT binary patch delta 888 zcmV-;1Bd+m6`ltmiBL{Q4GJ0x0000DNk~Le0001P0000Z2nGNE0Ck-|ksvjH12aiP zK~#7F?VHU`8c`I-&rDE9O%!4@%En8g3*w@hxS=Kn*InqFK%YQ-g5ndjZ(v%fC84ZGKb{+Ho#oY=Ki@K=bS$p^hh$94A0NcZyJWN ztZAAW85vO^^hBjn0guOH6$%A^t6VOhJUu<_FD@=7;D58Xx97dTzu$g*e9YE_7Xiil zkxHfB9~>Mg_*Y1-8!S`p(_moi#l@ zy@AJ()o#44aJRR&%RZma#C_Ncf@@T()m%24-I$q~IcXjHLpTwQ7oEg^YZ4B(ScPBw zDx&d%#Jj$}UI_#Omh((+`~vQ)veFnrn$Rvtmqq7UT{ybQ;9;mhV9DgeN1Rn>3%9hiw2i`nz#G~!*VotWRc8w~H8m9mVIV;9BJ`?XTwH|5 z#>Nx~1Hr_^gqP~Yp7HU2@hxCV;yb`;1|U}i*bD+J`+3Io8!Yl~X%7z%CSEnez>K$_ z0ODVopG98-ynDkd&J8dFNa!5fGBkm$ljuC({mduME%2OEI%eexn9+5TlYHXbVt9C1 z=|e+9zzr+cWh~1l&P{Y+i0V>wQ$9X%Zb2P%y;Le$z>LURm$49kpE$Q5+k=iB0SlNx zx4CGW$)pL6uJMU;3-YRHH#ax&xw*LrFysVts{LQD`4L$F_+r~VIZKY3BB6F9UdOWsXYz?Yw%J6 zXJ= zw{kZ$=n-;-k-^9?j8|lPpbk36W-NE8orZc@#bWXF>gwuaC=^Qc68{sK3%B-%ZYpj7 O0000MCtY|H5)rPfdw{Fw4KTNx=57f1tD6N35 z4?1bZY^qc$Bsz6NEz-2Dj6yLTTPcWb9i-(^*74XV4unUQhAatj9AaNPw(slgJNI5Y z4q{PY6}f2s*}nHYzVAEVIiJseJ?Gwg&PU)fK`ABdOz;?uF5u!Aj#lKy<18J_)MT=i z1cM36!g2gWhvirB*oP8d9EqYfQQTx;Uz5AcZGD9c_^{UJ2#(==-VYjSx z20(`d=oI1x5?Tf#WK@O~Mnhy85Y?MI_eVl^H;BOL?&YsObjMfc&i+QN&pTTZg~>Hu zPZ+AWB&ezilyIHdT<)x#89a94Oy`bAp7`BI#CW0rWWExMH5=G}_Md>6)g0etK$ku~>?TL_!inBi?Ysvo#yG z?7q9&3&$SJ2Jx-C?t;)0UYuR?qcS4?(<-Vm*_LXh?QF zerx0Ixm6=N56mX3Uf(j8*@#|XNUm~ZoIighe>$J8z5C988CxYus?JIs24<7TzCZsD z^S(YMM9@}jLR!i*ueWUc#OW<}_;A*}Yx@f?O=}9@3spE09*-w5Ej(V^v-8;A#S1^w zT3TAn*^k*H@fL+_+t$V3_nj}zm^!)f8K}b1m^q{A@##~fPz-Gb_9fOdWGuFlbgFsj z;U6?Vj~0i2Dx3{=iT(NV`xgZZg3El^4YnZ@iCH9>lCGR~Ft`7w}yJRa_OQs|)yl_ToKvMj{cM=Mc)XNls!0+yE1O&g8q&kR&0ycGLEMzvlW5tLEE}F5-~_KF{^wKrGu1 z@Y?>Ncx)HI(pv%6eA8KcV*y{ld%cpAMGO*dRw6-+{(iyl^E>Xc${Mt?Q7hAbvClbt zV}%;G`x=dRx$ylk;aZask`vq#$I%ct3?nxB$Ijs!E7aC{LsZs;=4313y5uh6HYhKO zA~+3y?E@p^op%o3Si&U%KYjWn!kzSmC`g0@2coHNguHs^@QoGB6$Y+aa`NOxY8jC5 zRF-qy;4my1;jVVcJm>I@6*L{X(?yNS)4yl+M8b1=E?4LQhk?x&mtLfCS%WXV%{hEy zh5mG=2fT(c?feIZ@Z^)TXyW;Hu1ds z0oOM!s7Xk^Yg0#8?`>$PuZ1cckG|BvxzLxNzPC>CpXu#gn={AAVql``;`Hp%;~iUn zpo*&kZD%@;sJti#0=$Y*%CYs5bLRADb&?@3`sw;j`FtS&p|vu)jkqLvMZ z$LZ`%mf0gWZ{BP`&4gU%iQbM~d;YZ*s&F*+e$w{)zwAHLhQS`_XKcI>4dgdRNjrbdJHxl^43?TePL zf2Mkgbsm^ae)8(JXZ-@{ZLINTW8V(xU~eTT_ef^UWU#Ry6{Xb9zn%E>nU^*!9~{gN zLKThxGvbd|y#2!F_YWKcg--?1R_1m*8^c#Ex9_IPgkS3JoYy$m)*&a8^6{^K-9DpP zbm9~B|06IXE?e>Ti@)Bq?|?|e?ujl>=Fp*4TII%`3m%qZ#_1i(j44t^HH2y(^ z)oY3pq#`%|y|)%W+I(x|f$A!MyDJ0M3wQ21yzRM{w`}hIJk?IUQnG%K>+k9c6#!z! zh4lY*{{Y)kw{BgRdq9MMR#fW^LdV^H^WF6JjlX5nHuH)aS_V;!k{P>Lx`;HJI z<_NE6_yP<_LVc#O^F;16+^k-#CzddpjgzFgImWm2XI;KR#={j2UtZU0smOb9rsUR& zx(mY+Xa*55L1P?>fiJ6nIRZL|*Kq^S24$`MN88>NTM6uXc`GCMieBGSRI-1SeSKC6^$wK*s2CmH4LkHTB4Ff4*^xDLwxMa zcsZ&dk7Vb8h-tQe97b;{#lj3Kd(^05p2wumA^*^Ifh$*DLKzB09>UVpGOLKZOb^AB zWB>8+EDD5EiOtW-M1Dq5qcS}?YU<038g8fekj9C#7tGADhQlI4#FDaoZ=3UP*#2g zX@$R@%CxBMnM5@m7ix37i-vNU5wi(nOKQ(rFf{ s(70UgkZ&JLcWghl{n2XB%XIqiAJpX4wF&DKL;wH)07*qoM6N<$g1S?BssI20 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1@2x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1@2x.png index 02b1855cfdca0e2c5bf499b74ab25de4acdd2836..f1c8f7cf18b28f829d1e689164f1b5437b58fc02 100644 GIT binary patch delta 1917 zcmV-@2ZH$CLYfaDiBL{Q4GJ0x0000DNk~Le0002o0000+2nGNE0H>$=q>&*se+Mr~ zL_t(|0qxygPZL=j2JnApwIWh1*eDHxqd~FDh2_Evmzb1YLl$qOpFl|VUi<{5p8)oL z6WLDyT!;zDE?uIyi6)eU7vHi>DNP|FR8Yhh!p>8LU@3H_of>JMUt$WKX-{J2;hZ_= z%sDpshK7cQyd@f6Zp|mX?;vhYugr!-o&cp+kp+C?DRvdnb0gU3>rj zePUx{BeAx&7G7LjjI6J(hgw=%!t#ySB#-*~`kW_DoM?Bu-8UQ#hqt`E+3eiEaf3&nDD=RDg z)6>&`UcY|5Uo2*6;6_G9+G}fT1A5q0HV^3_L(TW*%^NKiiv=4S8+*kfmIMwpn%-=@ z!=O+0(6sH*B?(5R51#?w1ldM76*gSp(}WgWQ3k00MU zfBt+IIzoh~NGvQYB;xV-f9-5*JJW$f&!flV3F!A~o$PU>Vuadmc6PSs;>C-%#UxXK zLld&TzP|75*|T0DDsppkbK!}J3BQ>prs2RLYfX_WS*bf4$C8_WOb-Po8u$ zY(&POGZ8)b`<=6A;Ks(rFiopdh{!Nx=Fy`^d*&u>;BepOcDuVd&PHSoGIQa=g#a>? z?s(e3H8eB?PMtc%86-qm!0anbc}#a~SK!c;bh%vZLPS}^{9;V%Pknz^;3_IA0&GeW zfbgpGSYeV>eX%`LlWyE!M{X$M)yCj z^QX@jrn5v?9wm*Aj&|6lrlxv49?vbIjBqhF{~;2N8#^Dh!SHX{UzCMjUa`?M?RP~V z?7k#q2>$XLf4vw1=i)Ogk6?3iQ&n_qjT@jXXKrStgU^I!#I!;$uNdiByQJ9db_ULX z;NOz9fhjSq(90`E*b7m?W{5%=nQ3aJ>Yo`VuY+IYinylncc|Y zg2aprmPdN0NkZA!*a!<{yzx=t*Gc5G-ip}EUqGrS6InB+@V;qk&2V+l| zoq_SIf2}brG_BD2fcqgd(O4dBK@a8q`}Z4@+f~ia&o6UnbE5ot_3Bl^<#JUdpZH!~ zU1hV9D34ZFR{p_jGH~&Dd_agOZ(hHC-H+E~;PmRQcWG%!h{$@#mVVn7!q3}V4$scc z4%gJw_=JcoH8V3aaPHi>HBFo0?m0x( zdHM3CcJk!O?Lm~UcF)n9m8|86EEJ2yf;)e=rJlfAj>sC3NJLXr^{XiYyLLd;tH2J{ zazweoz1#BgaxnFMTe_3=o4nz=x;mc_QC6bSXm4$8ZAa?+O1hI@ym--}kBldTh)mOa zfBX}Zlas-8$I=F_wY61y_Uu^@)gloYhs?y|@!QByy5q`TAH00|au1ef79uhXnQ3fn z?A`155Bq)i+O=!{9yxO4*NTdYDj}kM&CSh)^}Y}Pe&;Cr9rXMCiKkDW`q8~9M6@Sl zWMX2%pXofC7=S&%Js!_6$LEN4L)fOLf2W)Gx^LUbP~d=}BihYO*gz43@P+u|SS-ee zRf#0|6hPQa*uZcNw-YvTR8{pB*Fm9Tgsy+|M(X_=UFhd9^VzHd2V-Mn?QXZbn`@y^ zF~Nioj8S9QOtO%5-~jh^4Gj%lE|=>jYdb1rm|v{dY9Y+RGSh@il~drhptjS;f9eA4 zP@zJDpy~Y2%(3I2^vx(o!dD zKKh=Z#}OSNSeq5gMPdazvptVyQ{**psfLDzyd@+wD&5eas+I zzMy%CjYqLR8@6ZL+}y-ias>Notgo+!TUuJa+1T>`+o(#Jw+MdQ00000NkvXXu0mjf DX`INT literal 8542 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 Y2i#7?@vThJr2qf`07*qoM6N<$f|H)gyZ`_I diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1@3x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation1.imageset/RefreshAnimation1@3x.png index c870ae0673b0d99ef980a60c8fa44ae225c54e1a..0c755e95192be8500a5958f4efe78b41c1984a9e 100644 GIT binary patch delta 2962 zcmV;D3vKlEf&r!%A&F2_ zNkl?+TOd!cXyLG>A=0J}YtkQjA?zkiysBpR9!U0bH|k#i z^A{BFHv#W=qrGTInrs;^Bqb&?YZOIP4x)^hr~@jXi1zt{LlB2y7|zU`GxL5WBR?GI zlQie!_xn80d5%v!;=+Xsfqnb-S%0gmtHJW}^1~Gs6@ikH63g%RTjpz7Sy{0JfU6W2 z7u$=Ai}L2p8{52Mj~_q&|I3#zV{hNSjVv!OM^2qO6%!BeiA!lPmX?;DtgNg&UR71q zURG9S9XN16G!%=9iUfc+y?*^#78VxPUM4gnFJ8QeJbLtK*!)%a#EBEOxPOqVf^u+h zu-ydV@tT^Nlcr(}nvaAcPym*emgLEkC-VIH^T^!XT-XHY`5%7xAtEl3^Ptqq(Nv13 z>+0&-%}0F+fWoGsX#&%po}Lbg3o6Z=1*KMxfk2?MzP|osZEbCU$`Qa;@k-MK=74F{ zL%9mftOunAYArFcoIEsV>8k zAsGouts>0=P0tr!d~t?08$hP%g3sjSWM4EI4P~ObbUY|^F4BbL(0`X-en}MxAZs>N zmmN;eT{;?+CL}veK=yt1*=GR(fE<{bnu<+KOq?}gIUo*kEGUPEhkL&I>Z@K_Z2-BZ zt@!QRw|l?+_S=v+z>%Q*{rBI0`ugjy&y`f(w&GW>UhVttyYJ4*9_=|OFI~FS z-`3XFMMwg08x6~`v463FW5MD1AeLY)&0OU1o z!A(8bqnWqedw;eKN|UfXCMX2}@|`x$RaI5}+x>mQpwwhF%jaDJ00qL#Rkm-pu#+$- zsU`sw8eP~qc<^At?Lr>}CDkN=LeB9U1UJ0>#y zbp3mQQh$-dwdP;OKZ$EFPPmb-epgmj>XhWbT2N|~Sblm&>CNY^s@i1L%a9Zzg;yA_$uQFY? zrGFdFErBQLmX%D*f$3_mlT{VtbatG`F2CPz`E{}q-gI$XGUoghaSY>hcAUsA%}D>s z%8DiMq)1dU#>onZaZ*uwnP#M4;8~fxuwzT&7{=-BIFWq>B@){1Rz0_2oX7@((!;!R ziyY&G*AbK+mdOh{SSyZUoX(CD+2=1VE`PQKp48qX8RO)I%{U24FVl?lFD@<$ys7hu zWXz9;#4(K1*>NJfG$Xb3wgsM~6;LMHMLqdO&sKB_<8*eM$gVeU-mF!W(*n=Za}OQ= zoqrL>F-~~Z>gwve|Jk!=90cWIdPuC3b8Gs$y8bMVW1R4+Cr_S4{L9PBk=L(Z3xB+; z|8LG55UVX>|KBBJ7$>|&vvFx@Ddso*cZ3BUZ*$@_?QERL%{bvTdcwKS=ZpAXy?SMv z(o*1UdSQS+xlrZ z$(|ahb7w!cW_JHzGK>>$ck9-zNPkO9OWRsdj*N^9eEc$Hd4&#K|m_;0U^ytyB ze!h0Ex9Pzz&dtpU0ASs_wVSa1;fsIs=FOX9rWX$i0AOQ&Qa|4~J;+p)KYt4VV9o68 z>~Q?^ji6jyTnw{K2msdG?v<65f%wE z11CCr$~$-NgarT!#CFxB+V;8Lj~_qowryJgAm1gcCe^k$Wx|swr6K&`;xsUX@5}azDhG!+0DWZ zfPAFcX67clHS3bSFKJLJUD%nJm^eoZ4j`Xs%dOd_8Mo7WcMM83H#gUN{rYuV03c6j z%dOd#%6n4^N-ayH(P+oa%nbK|1Mobv_7XEKcgIdGcU($AsdPoiRF!9$uLR&_nqj8p zKAUWnd#jX#Qkh>oaDVOEwUGAq0N^#6UAJ%F)~!GTyZJevq+w)aq%Rl@o-QjZ69Di6 z4arC(a_;ESqi1B7(h5qY&jL4L*-2OeaJzRQdESI%m!u)>pj3n<0Jqy~NUA*rr6Mc= zxRnzjsdlxPlZXyL`+gR90JzDfIms^BqdixYaigQ7z0J+dJ%0xd91sA=CEWsa_3G77 zM@L7mIKZ)>RD*+qT`eswKQ%Qq1q1+cKyQrEJ>R?C0+fuSL8(kwT8)j3Lzcn3C4g+v z^C-s0$Mqzjj@@h~PsN_+D7Vr9PE1U+>D&N!@c_sM&6>-XFQ2=6_imfhA*md%C^s|J zWxJ^^`>8GgWPgHIk<-)D_T=PbcPggFhK5c86F|DO&DMt>>T|s^(Pk%-wV;e6Fae}P1M=Rz zdtrT?b|%~GM6w=~ahn5E_g*rG31BOogN#O_v6-2fi+>9X3+J;Pka0N+$~X;7^FbGV zdTMHFEH#xD$;^MB_+S=n46%|1$O`tGnl9osRMH-+N!L)%|t%THonYr*`eL zYgb1o$Vnjl!2JON0)haL6jcHN0ag2c?+pX>{mOV&w)1^~b&%9_1_2@F{O<`WmcnfC z{UxZgl7uiw&GgUH?+*~>Lb5_2Aoa0u?}m^dAVNO?qCzSjpqJfnSwAIQ8Ff@YveL6P ztBZhAmCf{%ci_>s@C~A`zuD+c5HvL_MIvB!nMQBT0#gs23UdZ z5cej;SZpvIcs&LK8=DtC>pD}-6gBH=wRtOdH?vnoUDuiNtDMtxT^s?mhUJRhUmLX* z%B6CuUvCfPS60GmOhrk*bO&O|1U6Ic23h!Ww!$pePgz*zeeo?9^ox}Y&p3%AV@h9G zURX^h8Pe-=T?k3b+;+^WKU$Tb7GGG2n|l1Eu9xh<@PkWE={=?R=vh!+H?Y!Sk(_}{BzX3(ko)N zb62zgdG&_WGUKohfKhK$G|Xw;ZGm%%s+^l|gfp#ok4y4KzVpiGurE2Oar{TavFj7N zrlAJ&4@SeyqS`$_8tUO`iE)eK`S=>G>iIhjO*NX3K7Sxyps(>!!xdci1KNZiowOLrTB;sm@jgY5N{FONsBA5R^};n z(=9UoO?QTO>ev)}W}bd1)swKsKuJq_3BC4e7T91~;a}W%*{m&X(ak4ab1}#irGfL%viM-)f6zY;3%d2Od2n%Boy4cyL>P zTdj=mO6wim^kcI6Drpn;{K&)~qa}hvy0yc1{FBDfa4XmqE5?&XKiR-by*NGkXn=by zA_$tgTyC6&K~YZ$s-}<^?A&w=O*+6hZkcvQDG9^6F8N}!J<-6AgG)`;WR#`S5@Av6 zm1C~Q)y0}E<(S;7sKeYgZo>XJ_KDmIS(Q+uqGQmnxx7V4Kdu+;uEMEh#M9kvm0nxi zh9_x7SFZx7W_qAumjxw%!f!gN@w8~RBx5^Xz_)hkMA8|hCUp_xt-JKE@t167OYCuR z2RVJ!-Oz_9Fu16u0>9p6wmoY+ak-Mdw`&ZlqL&OvqD{0SnpK+xQ2$-bBCwj@1sNkV zbeXZY5d3&-*QjjynDG z8E@HHZiAbf?Y2s!dtlQ|XQju1{R(6{Ei;Q6ZM>!T^dKlV0-R%*(dQO9k`#dEbERWkg1S&4G4RDj<6X-Guc9ag(5YXB zJ&*yAsP`WLIIIf)1RIo-)8~j~QyBmx%9nr#HEy!EQstL{Lh$pMsH46fH{EsMMG9Xx z=G{-HBbNqNdL&oEzK7FKn_J6vzy~0;X6<$8Y=qnFx64YUDt^N+(d9>J1MYg*78JYE zN3ltGm!t9ZVpGa0Yo%lIBifCiYy~|d{lT$uDk}zV`MRc06*DD&nVlAVK!<|2zklmg zhfPEWaL|pWaS2+GaX^PF?%@cBH)RZv=<-y&sD{50$B~?SsbAe9GlQ`N)h56|+l)1F zqCRS^#CtlIE?Rmjlet@OIj`x~`4Qf5;i6PC;ccOZSVL)Y=0L=rDW)28P!<27N;1a8 zDS4nur1|iVc49cXTg$a{o%qd!bTu(Z18t_sm0W5nv=zFo+71bgB|Fm@z5VJAu})}C zqJ9BRu}JayClARFmt>f-klX~?fg-Qh>GMC^bvZ`#cfYhjdC?&9ho=PI(jgm}N}5 z^lDWdhjLXLHNBGAW#(qBKj-m~rn1!eSNG{1qXT(5>EJwU#q*s>)EtH6XW~K}YiJdw z8xzHd_#M?N6`>X0$|Vtsa`f@aQZ}2GRbnJ6c*_<>xr+>IEP@o{tM-nuCsI3#gKZd% zK$~wa)AB1nQX(H|Sa+RX_tP8dz~s3|FCk0!ibR>IPmsyZ`{K!1R zllyy*I8+bvv{{od?u1U?0D@al@mE@uOiLWAhMv>9gRK;9$e}?uY=bjC`SIRLz@5x4 ztlVk5pplo%LWnQKUC}ACJ;4IGlVmDg23Lyod~3=JZ~l}ZzPzdHVc0>@+{tFFmv`Wh zu`Fk(XA!*sBIW34_LpI7ww8T@@Of zN#ooy{f=p?%^LowVfy4MqqclP(ICq``sL3J3&+eu!!-?+9W(KnMgGXQ304Vd@e%~( z7fXD=6L-X$9>WHv^w>oc77Q})731ib$QUXR@E`>QY!s`?mFP2EsoNGiOP{z`H8k4( zA+bQ4;mb72RfNS}g;|fouAyQ-hM=xak?epUb6egw+O?p%nFft;Lk&*>nL~U+V~)uW zHu(v{x3)+u%{@>qR`o~0v4|Q6-xdcP%7JM$#zd>Ky42Yjsb05B9AMD+>5y`3lp84e zNBzK49sBo~fs)6?y7jbnGw?l-Rc>e2yMMiBKV@5~yj9~2$BE8Zq$e(nwi=rR7Z;Zj zW4FbjL9sS5Kq65HdHUMl$*f?`Vj4fAT;0Cg+8s#ge$6KZj>#M;hAx@%Se@()l#I*3 zi3fUexsaiDcX!ACF&2r!JZR+fC=rI_%#!6EwH$*TfhAwQ!lp^E{yozAb}$&S)W^f; z!^srH#t!$CVN=3sjNFrgu{9RwEK8wdspCEMyYjQvn&Wf&RHRh5-EV7sGIBU4f2mS^ z@HeNt%mUeWnzU$H&M?G(D|ZHjjrVUZ=FV!i5_>&vR#;p8Un|`&ivMCT&xsGzMUR2l zFITU$wYSr)ES3~x^Ee{I8#N?1Z0ePdT}i;ok@e?D8WrCfhp_bIfE3dpx!QzICxvNt z_k>+ii$UGew@hG(L+F*?*eYuTa=jkc_Bh?2eyH2&+&AfpV%~!xWJI$7DEKni< zM^Y<^br?rG?Iv(Hn(`%>irrY=W*kAIp{_r?D~l0@oNrS%VI_1)gV%DT{(UZ z5o)hfe0YkDyuCFHe8EI=!PgJsGaULu`o477f4^ni+K`P04t`K-9SlB_pR+W=-Dt7o zF@@c|x1_HBP>^qXoa4M~&2EEDXE~!HB2tJ~PWd)F7#rp5{+=J}b4B}faZ24jz>Rtr znt5yo4#R#eTC{>iy4zjCXiz3pgSOjEfMs;)SC_kQtei}<)zKWg7d+V5n1h4<7F~B5 z_;r`aR3?SZ`0)luHp3_Mg+$NS`0(y}mnonB%iB zK6Xbsc28-Fe$x?dmtIV`IH#$Sb?F>kF?jt9JoRSi#kZAK&lNv={)tEBw-XOu1EcG< znQmeK1PxcY+j*akoPTaf+js2-VV!RHA|OPYBap2^2O9JOd#~QcDD8W`ZVPPhaVZV` zr=!fyN^h&JOA2Ip`n`wyt1mIqea8*j$AKOmRaS97V3PMXP!E!S;4z}HpU9uepi zSa(EesVC3qe1zGzAM$DI`+P#P+ignz`hKKm*|v4DQamMjJw-^xFTCoZ)=vjEruQ>LuZOMsrz6r2IO@@_YDK>vyoyiEst&CKMWW*4?$qgJWBsU=cN>>`~&GQ~C6|S{$@^ciSvPe&p-NF&m~iT=YQ$uDdC}^p(FPJqXgbIpArIVFRg^n zH?cid%Ow7ned}YSjfS}#lW%X6MjmY>i*&zFO%!GVb#j}}(|q|b0Bk@NbHg~R=IgXi zuvXl^EXgL>oWx_q_wS*@Ic%5gZfDMTur zJxIPaR4U(vgXDDN=ei}ZHj9%|`uPE^L{C|CHpOK&=CeUT5O>D&<@TJB+Rd8kUE>U8 zX<=bOhs5-Y>9hCxd6TgFx^e?N;a(oiZ`YIT;#`_fJu9W|E{j)PJcpdAuacmAAh04t zB{M`rvZ8B`OaJ3}!*0IlzhX9ka#?;Sy7SWP|2~LEYCmoF!2OscT_rM-j>$h9LOk`O zyvc0Ak9}v;OMGbkQxa!bo?_ODKEjIX*%Wu1KuCItzvRq_B)Y-IfoP^EX;-jXT|+>i74A4v0$)A%TNxX-Li-{uh`2?w4$-y&{Pf z-_tA=_^18zA!bJR>5B2oT*P4q!Rvi0Gn)$L>>a@#JE|c!(6i%qx%9HWgyHstO11I* zptZE(cW{aPIXk1I`$b8sufqSv3I5aG^M2>VeEfLSkL%oBHQM3ri_nazuk2qgQM%;Jkn{~e@K8s8MEzu z>Y)Add*09gBxtk{QZlN7MSS+wW$z&Hzaib-g$X>}+!XLiY6<`z{ z+}Or0HEKp-@lnG^NB3h8h*j14@#u-Cf46_XT`L0e%@vF$29mq;k*!@{(Y>yFnnQ4x zm zbMSUxoBHX?@Iwai=QAAk7%q6NE1cY-QhD8>w`OG5ve-}t#Xv1+oFn?T+_0|~o~_${ zD5*Br_2_T6|4-iGmclSl^`10*T?^>F-HjD2TeUe~hs~aRt!_Of#a6iel;Kki`BM$X z${}qXou}6rqFU$owWI6P{iyceawXptTy9pkZ|}L1a2xyaI4FS`wQ!UCX$4G+)uaD5 zCwx&1po}Yld{qWGCB~Q+0&Q3Cvg_JQv$LESj@#{-jBoZFUHfP2iiW#rU`R+y7M}m) zEnh3F-8u8bs_I*D(QZ=cRsUQu9J_jXm=S6-mAP(N>%aP4R{y7S{s`6r3*e^P7|g|6 zdfCmPV^=RyZfmJobgibBG3!feEu&-9PFm_wSeS*v)j21ldzdp!MNJmm(bj(?52es)P{m4t;0c!}|T#<*n8R*7w0*HgXw?bM=f2_H9bN@Oj@< zN@HwcA#yAKdGg17muR`Ecm3oEk%>jEM7sN5$C&Z3P-XTu(bl;rW{A}k#qqz%+P0G! zpmXJarDnNlU%sDSbMZ`Mon+SWc0Xx&vdbQrU;Fty z4;K~+r!T)8XZfZ3;qLwpD@_4aa7{V5lss}f4(pR95CoOB znG1YDvbEI>_4UlKIhB30G?9ZK8{~3S0XwdHVsy zulS|JW!ed_!xmY_Q%%1rWF42!GjMzdriJV--rpt1s@5d8Cg8bdBCZ9l%+=RF-aeFr ztgk#-g<~w1?Ltk8MRlJ|G)@#Jd_JE^jS{r6`Hp`@!S1Gm-FF=x+|pm&hAt}`lY@@t zFmxMy;54+F5R7^MQ@jSDO{L`4x5UTCCy(U?8`KV*5>+veE;F>z*m3TmSWZSD3$zxv z-;_H%igP5HnDw&Cl03ZkbQ;02Zi)K`h7k|T%MBPA9R<7=1duFWZnRcDTcNX+>m+i7 z=T*fqRt*qUk4y~ne42X78IT3LZ_32r{Wm0pv1pO=*XiU;5 z)t7fS(oeesa*2h7|)B3C^XU3XS;2wL@tUFsm7HybX4ShD5DvK%R%?Tc*+A z>siF%~y}jY@*~efXW1H0Zk_dk7;9jHd%-P_Sc|)mD2J{xi0S zBnom|Txo;iF0LZrA}4ViR5H8q^H8tlbUvY2FW0t8Fstjz5XX$<4xnR@sd%A&TKTvS&`jCEt(e$E_Ghg+}z zpUn)oOz>-S2@zzfT=l5DcCxm;UU@PQS)u^CFWFVbDxK>`%!OkVo#jt?_*}6Vyp%+k zrko57bruMRqNVVnj;m!p&*6uv_k~XyM7`l)mBGOfnMO@6cP&QJq)Ft3B|K4M(|ud* zamPWtR7Vm(_3_o9v7pe~?rLwxfz*xOhh@N=osGllmV=_4|~XW3NIm zkfHzo)#@`0pD2L9h#VAxKB1&%LguMl;7~`73L%BF(f5&-XN9PDaUG;D+H*Z zHSu$aNx}-yVOK!wn42GC{x@qtbq0GIWYg}C;{UsMwb9%Oi(ljSxyWJy{6P6BGn+@V zF?5xQ+j>5__tOmj1Q#VPEmrQ=$I;7AnC%9?Pj08pyzd{i6tv^z-l;;_h|6INxd;ph z&^#eh<6>4!sp*tcSWarsA_gB#?)CC#dK4OJ5 z;-L8sn*kX0x#ppvq5i@~XD^WR-ylEddTw1qct86&Yo1g{H$C7FB2HAd9y-w8mgB!^ ztax|K#&)IlY5AWe87Fnpp`Deq)3jNTe%Hv0hITG$+u_ca_kBdJLo3(hoj4LBTc+am ziomUe|5FLa=i@bUG}ccCwcmtI4=rq#a3Ol%WWWFMsn(z2BMJ z>G9eFl_-uq#uJ-_{IBDLnl%Eh%CCB2nQ#>`MgKmKM0yB!OMq?D^hea(W~!UKxiwfW zRB;X-1$q1;frhtp*3|_~K4+Ok@1f0l#zw;_> zJg?dVvDcV`_^rHeelWAJfVqE(wJ)<44Csu_O*NNcYJfIZ{Q05AN=U!1Gb6LAU@}4cZYxA|B{5 zC%)iqyimIA#-I9qJn&>G)qlr`5`QmH_&ur@A#+tB_D1>LN2k7z&1%sQzFiGvbZn^S zwJq=KLMV^QctS6V$mO)KkoI<>u&@Zpoetq9VbHcs&_b;kXF*&{ti_WEhw1Ym!{2Cc zW@gtN$9ww7{~M%r=cNzH-)Xc507g(bdFi040q4wxieYwUG?`-c%2oNO42u0j&}rD- z=;Z~S_UZK zFl>Nq2a7F|V4 zfPyLix5p*?8i=)DzaQE}$rPQMbph{Pdswpy+em!6WAna%;bM`^1*)M$@-A}*lJSg) z581g(+0lp=j2Fhik_HSBV1&-}(|_*Ac)M@k1#j5T5rclO2P{-32#3ih``)9eb&V! zcfq`HcY;+zOz*vKtJV7LZ#mE|l7ipZh6INPeQ%B3c`Oc>AYd!HhS_7?fLCiLamf-) z^7bxVTT^e%(Y<{9PC1-S76L+gWMpD~i;tWG%h&F9J5H0`op0Z90iss*Irfsr>!kMc z%l@-;tMlpP+QjB_bKi9=~ zFW3L>8!c;{sgi@EgbCJ2URAp)i15|lhfRQA{CcXn?c&Gx8i!tgYa#YCHNxwiG!bXY zQX2}4oMl~hZ-j~HCl7z=-A9$0`7Zoyo)iYYI!T6O#)QRCBOwRuP zss(Qwy*uzzIoq>k99YYyJq1I}gbu^OU-~7Bk)weh z;C8DoOe>N0#$x<|aUhh6iBf~!D+oON!0PKww@eE4|Hc7wSYf~Av|)Sw8tMO%BrTel zwp*>$Qo3Jhces%clQ~7zRp5?lRLN>I8iRjkTY1q1BHiy(A)JUEq(z?mBQQ>IXqLv%mBL-jx%+0wj<4szd980TBHZ`3HLFSz0IVi#dnxSGBv21l z-8A+)!Qee@e+k<8%VpTJgKpB38ij;*>tZTEUT>CztZ?7_7#lTqyX8BVC#x||9|}!v z%yI{R2Hvlg1Q^#4ExS!QclUXy6zu4IdR0fXcKXk`Sj&^dxT@KC?XQm&6J?JO>h@u^ z!VO^;-gxjWCF?r4>+tYFa zB|d1+5-5Xo#TrWlMU>IEysceJ*m;}Vdpmf2R`;LVG#>J+ z`GasGlwP(+O4hynHT7+Iw(9nd0D~l?^ZY~m(vHT+0?BenvFdD#61DWoWg=q+M*;Vc z_L^1XQ``JxyjP+Yyk8R_Nm{nc{p*N>A2?k5Wf10v{$H0d0dblu{W?v-zkZF~`HX_) z#Rw#oEMIe=E5w1>Fi!9yABCwB&f&o2r__Esyt%1c)e8irm7?;@@K}d!thJq+Q{>hm zwpqb&PN8jM~oA3m6oHE;m;z~Ila)_pK`r7YS|6Jbqy0+f&-1a;^{7>}! z=fxBH7krj8e(v5AzFuSt44L1M5=t(CP{t)d0X-9w=?L2@xmJy#dKd@ztS>A~7U0jpnmGeq(t^^uTC49UM;(hx{iVe~vUUmo`uC z?g&(vNM3RqoakXu_RP510yDL%$bv(0+@q#>mEK40r^z$Dz0a0vt#-E;+uXN?;>_vO z{__9Wp6Pwl=YKt@<@2j^O9~yJgg6E<;72H+i0a`e`^^X{+9T`bgJt(sY5;F(0vB;J zS8;&{G83X9dj}tv?T!qNXabG0aRQT0mHLv$Cx#m{J}8dOG+5$fD3m5A_d{h84x*W^ z-u`-S@cO0F|K-ru{i5Uk0UeZRd9SO3RH+F$+O{fC#7D1X~~XK;ye%V#u((f=** zP1fpGaw1M6N*fytrhQbG7J?i2P6hu1MfECz67qn=#7?{cM(Dfe{`%kY32qt zp!g;$obC6Y&Up=NM2l!yWMhjMY`uIK5u3$~)-tj8K1a^xBI{1jr^}ylR+0!C=<&n- z-fT>weMO#YVj|}|Pc5{qy3R*pgPeWE#&zGSW~&eTtjG85ymjYeR#)JCyw>jRj)Sm` z@G79)a*Y?2_fR;LOI$ccpO3lh6%3?KL4#!RUKnQ`5~l-*d!0>&vi*5L=jY@tHWd6d zlcS(ahgVOL>yn>5LG@mdWOHdOvd~y^jYdj`E@LO^cF5K8%XiXf{!!##8bNDN&_SGF z+7JtUT?#0=tyomLdbfwghia-#+s#z3_pmG8%ujAv0kLmKG;sTLFqWU$@u@pjMc{Rf z$8L>Bx3YiATQYr@f-YWxnl8dPv}G5xQKK(F<(P!^#8J{hT#sot3-e=L06PWFRk1oD zJg&j(#gYq#ZMXrMmV{WHEe-Nrs>K%1(D<2ZdD_>;z@Qoj-N|gbMMhuAoY+DO@z^YJ zonb_4kSYXRu*P$cA}IZj0S+7NZ&&KSEBcL=3)cGGN9(CNE{`b)=dT=A@@gUniy&Sl z3kwS-cYS|zc&@z;ue=FXpLSP1Z3}Q=$7S2LM#-7e1)a!2JxT;~S`2SyAsT?-jD%eI zgujH1UHO|3x%yGgEt=Zf{vdsyhM!S>ILTZgKVP1eW;DI78LWk~iQ&5c&Z8a1sc*6K zt*u|kEDmn;ElI7-S&y==I`^#jo z3zssq+t-xZ>oV9;$;fpOB+am`!td*FITHA(iYHx++MjF5UsyW&Eyv|Zh$7f=5ss1x z_*ppaD@Q3Rm%^UZd;O$=(;v{7m<3FK;zR?#IFT)fsH1gm6!>n`_SjRkWBS{#UlyB$ zu^*8l4DS|fP+#LQG!Sw(T5yi;<(lB2%4wJ+Rf#v2p5L5Mt^Sx&s)=57k6;BVKC2TW z;}ZGW9E|jpVck*mWF`k^ezo`gg7m1JXOV&1uVtgKfy>1NaUvH^n>Q?hH3W6I?l(da zae}O2lYuFDPQZpLv^h{Hf2xR-7jRw}QO)%7_P#r|(`v1cbH3+;EEUL|5eW%={N5=> zC;lK#WtA*|bM^nXo8O*3*ytR+CI55%{(Kba+VlILC(w^qnbm=W+9FTE0voy1ubfl+OjEgJ?X zcZYEWYlMd4O!xrl=f9J9LWQtH;mMNe9pn*g)=uxTTn!@B(kk;;MbY zmY0~H`#(a~Td>)7Jwnch!XXWC+Z0eY3apSs9R=|;IQDTXd{U%>U*KKg=M~XLu?`wU zs2%j4KQCy9{p^C27=ddWn3F2WI~jae+!b`z`wl9}e&VGo|3 zfR<;Y6`dKJwiwQVxG=L=qE?Q&Nlq$=559(=UItkviyLT@4pA1~{*|7XfDyzib1@)n zY85&#wPO5>B?zYKCoS|mPNshc=dfn@WRk1I@`n~fTXHSQz36)$ZR+NuZC^HpcObJWFi46+LJpuGc4T5xiw0As!PdTU@(eKQVBg7s%USeftONroC4&C1jL>})rBx5fxG#_bWD94 zzBGKCIdB1q&8nqhGaPr6YXVi6E?>|`+7=d5{3IDg^{Kp`!|%d`PG zZ2xH>d$*wX51gXnmc)z9sP1>wqL2zULA+6VG|ak1l_`KinC%e+h#adT{P79I$I;3n zt;cnQ4$m{@ae!agb0jd8mn2@8jtzvAi>r#?oJRv+Fg)(FrC|Oo6&vn=w-Y2SC!CbK zD8N8U>`}Od!fY#=M#59}>qtn4|Ez3!Mbr(VA-`d0h_?lS+qoF}>^c};;`GM~H67vI ziv=esf4g!TU@M8?j|;3Ld>jS@>PmD-mkhYH)dti9xF!idGk{leEhY0LR$9`2*PZ;v zgxRP;*%d}XUIy+?(yDhgg(3pTq2#>>NI_1vA0ortNKQ=CsYi629AZTLVMWn$sHlUe z-k^m4dw%5?-I5;v>eSfDC7CT+pbYr5vNGgll-dS$x`BPxes<-fn&&MT0|IG}$FMKt z-5LX_B62HZ3+W-NYEN5sQViLZzZA5EJ=z6EsyWGIMGL#?P7;9dm&#{bw*lNdRp$UA z+AFI3n}ix+0y$&JtFaAp$%C69i25TkK)Zna_7iso3vWGm6au!GQ;PE>{8Uk*jIaeq z9zTJqobphpbM&ZbCci0Ka{kIuK!i&n!R$p(ap zVO_fMD45w~TzFJ#;&k~~Fy-O+QUrExQ$*2W+j=bw48#4}FG)`RM24ix_~#&SUHO2^ zw7c*{{5is;f2qHwl-#FO52(VgKC!W^eg$--{~hMuUcoG z1I)!_Co!+PR{g)ZAtUI~G~0Ii;V{O8@Krm>j>x;oYV0>#jq!%OWt#Y6v_vC(R!88R z)~zmEBJYXkywAD-uf8Ft2Yz-z)pOJ3rYhrSBvHWd4LnVvYw5(k^gN zP>0Ug)(;2qV56Vms^K7ZkMTD6H*%KPApOFOASBh=?8ugVE8KJq)@CMy9}L@%2M;Bg zi=s3UsTn=AG_kp*>lHt^gvJtRdt?G8X+oe!M$D+Fks70ce8@k!;CuaopFsLU^NF{{ z9D+fFX`BrI;6`$Gr z#sb1th-9^8K=Z+YC~kd>g^Lf^^bkt3hxYhL6S4U4!8>M2e;?wNd`I#TWDsXf;Eb;U zKXyk58kwDFq=6nQ8;mMTS162bX1)R(w<=5rZFapujJktF^4dI{t1$j9r-WFZ4=Xu` z%ti;iLxS=PLYqJk`NUwC!$yhA;Ol`S)#SiyU=GBC3h;NG6ii3oE-{-B|1!@|lLlf5 zoUyKgJTHoHDhu2rn_(`AZxiW+`eVK$C+JZhB+`Ky@%k1^V|Fl&?z|horgma%Ri-)< zfS2D*CzFvyWaTe~aM@AJuFOKrH*{xO_G%XvVIxM2`I{Mfkt0etKgLiy z2%eRCM`}I$zHRy$xuqeK+t5(^C>cyF)Nqp>85lXKYzt}&=_a_b?_*DKGD+Xa=Lvl> zw!j_+{P_S^4EGP5s|<}FitwLcZj-N~ONDcToDWP*zfeSeLy^T&s*oL;niJ;gFZQ4Y zJ;bBiBKg)=`on&|ghN$ZSg?ir3RlPE2)^0rir5Ut&b*#9iugd=C{ryarGhg=EY?3E zKeo$FGdVdSbEr21LWTR9!G*zu4m&+h2iy$ms0clF#ekx$>``u>;!U_+%C!E!GIBTy zoI({Au9b^9w@ua+F}VWA5-MqUZ}l8~yM$L|+9xV@`w@en@%Ezh_Gk_ykvRVR9Ds=F z!!khtHM3*Kr1GkVc-N!`Bhs>5%$TP-qz{Gw9U|p&A<<4Y93&|-4o6SH)B%Wep&CO> z4kcDE5j!T)@?j?YbO|UsvR#ij#?bHx3bo?tGj=fB0Mx>()JpTIFxXOIs{oo{lHNh! ztbeJdpS7X?;zvAim6FRK9D^nSVx|h85(;utRU(?x^gzS6#?3=*5wpxN`Dd*R)S(UM zCC;PF8_VAG&SSZ>-bSD&qvKFV$=8|iv8(MHLeUIhx%*YATXD>ehq4k`R0nU?MNlHB zK0@NF_!{UN91+Q*Z*XfO#aC&yE(jTU;Nj$nrQB-%1l$NEXM@4ijG8;!5Rwo6!JA3| z_%7`wSvrE-W+@*62AWy}r|OV`wr|D2?#dsBj1?=lRC*=nN2O6#rlMeF)>N0cD&5nT zL-L}C;!%R&i!HG?`a&z^@oT~%O>>9Li1|^`o`wa-A@uf;Pm-v>pVEG%SW^BQf2=Li zy~~pzC0B2vO@eg&(cm`BZT2QOUkk1ZH8$W?;Url_yI77m3b*<-JB?5VcY=A|#||f5tS!d&$+3$&peV2>_^)n9vHY9HqK5`B1DFu)rJUxa8!;^t|jg&z;Lm<3MUb1S6 zdhb?TagdTayy#pa>zKS25}Q*vQDP0%IK^&OzyOtZ^VI^ZXt4iD{!`%kZ2jEg%pb}i z5vi+Y>?he@G3t+;f_IV)WzdG>fCy8=u(0n7)aciq!iicW>e~ND)C8R>iG9-$XmV`O zRB6Htyrjp*wZTJy$}y;mLMJvre;((@6+RB>N820`M2(_*aj?H83v)cB^n^8&lQ-BD zU!y`xi5cpLq?;tJes5!>7AYRJna$q~QBhY=y;2H=HOjWii$qJUncr^+H6`c9Q0~6v zTm~Ek^JAO1r~sAJF>olQ=0%`O^HO(oC90H_ur?;@LBgj(gF%<^?o7`2%ba{zVmo%3 zeMSc*bVGCj<0(=_?%i;aiZ~D*9PM4jkE1rK+5H=Q=>wYTQ#&WoN((2iu8w z)&3`uLYswzEEFi0e7Nu&hHI{vSldhmPGiB$1q#LHStF1w9sJrQmW#giiks@spjdd} zqx8Fr%AMtz*v>gACH4$leTl`)HSP{VNvuFri9Cv6TAt38xu0vGmk6IsI6pVWbVGAx zQX!&9#WL+;T zE!QfNx)ctjb>9{5#X-}l(7H~}u7w%ma%LOisH)$J+USBhx{4k-^t_>8Qt**+ju|O6 zlN?qm;iT<;A~+4Bx+g%5F(D~+?2>^pC21nU)smtiGmddu-UufGAp?-3)6q+cM3-FS z_?eQeW!ZpW-a7HOh6Byl3DCXnD(^}H@V)V{DpUzwJ9}^cWv_2@Ts5V#l?l*wTD!xg z2R0~|A2U_sZP2CGi&WUxkm_%kam}a8U7puiYf&zlrQ0UFD2S_X(7e%PA9yvriSyU{ zw{~4Ul0~-6sp0!V9d%s#WiQcQ9+SyR-vK_S?~=3gdaTgiyeh$qJ_>CU+x$G|8EEIY zsu?5RQfNrWGtY#CMxmmj&@;elp82CVorN^@{<5~wYG|NUU)D+=SWv-(O9ic-5;Rgd z3RY-kgHjgj`_fb>tuZKndhmBG6yJ2AT637-qDl93=$5M_K}U{`jJ#^J^Ga8Ka(BcF zz`U_17$Ahe51?Ym^9vPjyIzFfoYJ5OhEU`=lN6CFNp;bL`}C{E{+&tm^hpPK-1|he znKWV`c9$j*N_BvJ10=+dom;-X9GXJNBobW5rI#a3kP_7{s?NOBTq>>f6t^@U(fxjr z=}}twO!>K*78X2AkUC!;TybFPN~!CKg1W%q!9q(I$X;!@)$pijHL|eD7se)_s zR(z4R+SB=NeA-e*-}pgYs2*V?nZHOwT3svidY)hl3nW`iyyS=P{F8lJKV>y*Rvh&= z#*6GD%VjN|F5kbBKx5i~4y&~uDPAjjG2wHI2G2F@aq=<324~HeM%SJ(T?93o@rRG~ zRvHfoDRoU26bZf&B(_Rc^6%#*4xGx$D$3kA}F4`QKS4 z8b8BSW1kG@)F5}_EzHd(Tzq_f()luwZ_{mEFwW}w1lW;rp6QjItchDoC&|bso<>!D zHj7OlE*(Dff#CS;uCU;0G`D>^{N?<`*!Tjyn>v9L;9tH7DoI-qnvgz~JC$n0Jr3Z0 zY&JzQc_fA^jg?|)%Q2|(C+|o;cyvjAljE%Dh|gdfFwM8^Pp^ z9R|O*Si8i}Ll}8gUef(zBO#isHa@;SDU^mVi7SrUnI?Wq%J%Q%Cx2qO+ti^vP}&_E zpl2#U&S_j}v&DKY-7If)yhvcF53r4usLS2EO&@yH>}u=MikSa^){BT`;Am|x*GHAetvKjBP8-5T5PSyO~shqvK?*-#eD z6ER7U$$)If;Z+*d1b3@M{TZ^}?yQFVAjQo3zP9aJ8Oy0T_A4?mMk7_&s_mlGaQ4rJ zxcKTSHZf@(Kf6xJpvg~$g5!!`JbSIK$8!70JA(D`N-C_hM=Ypp43mZRV|11)x!KYHOy%-wf7|wlV|d3nR2=fPK$PN$`rfB zsme?H2bMSlN%;?f{%Z%9e^juN(Xdo(i>)@mCzS4t+N3^-WKGo*;j4M+vw5U17-|-r z)*ehb9qrjWj0MyR-A_fOkYV>}%;d{(f z%c>?NMfa+Saw&pXsbhaRUS%Dgmv7he50RQ^D`h50%*+VDAbDR~@AhJcb5iY9Qhif_ z(_P5bMAUW=MT^+f<##I6xFnjYGOgj{N_pv$ zT*F&tPscGQbozZ9vur9;!W|VIy*E0gf>UoZYfV<;uGJz{YjPQI*IM57On9HlERX`r zvj6VLB~=u#f`o5T^UNF}z3u=PA? ziLGA0xNrm?ALDD}GVOscq1n20^Fh!QmZy1|ewNF7T5=Z4{uHen9sX;P@NhktWr@s zE3Qcot(EB%+@{WwS36WjH#VeP!IejAYmPJ9WLM3bV45C*#}$_sE+Cfq@n&{i{J#KA z0J8shl0Gdb`zBGRt>QkPu@R9=p9HNwm}yig+oQ>?WtVNU9qd>(P2ad&)Zdos$K9kU fPr_ULr;Gms4$F+1GCV>+00000NkvXXu0mjf9>NsG diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2.png index dbf38f4fa8366365b956deeb7cdb32b5c60d00f1..a76f279527e31267bce01eabfbd30319a9126a58 100644 GIT binary patch delta 973 zcmV;;12X)|7V-xmiBL{Q4GJ0x0000DNk~Le0001P0000Z2nGNE0Ck-|ksvjH1BXdO zK~#7F?VHa}8bK7t-x5^RL>CQ4xHy~Wfp`!TFVsZw+=Kd;V3Xd(a}UM8p#2Z5iH)~H zOj;5>R1emJrmjRJ(J1Rd#2*QL54r{f7Fd-XU_J?9nc2DUW#7Dc?~4R=5{tzGBO@d8 z4u``hNfPVo>S7?Mi-(5?u-ol_>h0~VdVhbvdvkNMJ~lQMh1X_nZB4$syj;G%zD{KY zZvu*U9FNDpY;JBccqt@UB9U0eUx*N_L8Q~^EIlOEw2>-J92^|5;o;$kEXxc84d>$G zLUp-ZbGRL;<>t!@cYc2Eb2^<7jKeYrEaUO&|9`uqFY)YQ}xUWVv%E>zOlVRm-*xVyU>c;Ul$fbg&4v88tapWj2Eo+Ep>3g%IWsduPhEbG8yp-A07n>!6OKV!gW?70 z-FA3*80hKgVZafpW-yn6wx+MIPo{dYy|=e_0XT!nmBnLDsEXO7rdg69Eb=edvC2OI zoDrPPCnsg+{Dw#U%&vvb16V_Sy4u%+qJaT2tD+_;X}q^8-DA>8Mf zgsqw^#!cXnT?||6fA9?B$cL?fVtl{y$vDIwe|+6_R)Kvyuy=HH0I&Gm`B$x&O=_Ak z8L~kO!3>IZMoEp?byh(gblctCoeC{N&|v>FN@~omvkJ03*svp@LW^KFsWH3GD#)uM zot>S9-EMafT8MgolbV;VYc$DZa#h;d*$H6PIRb*F;ppgSF4r9(_ZF2>K)^lebXvt~ zmy*jWv0bnVf~Elbrcrv&3AeSi6{cPf2)Kq0-uwIeD|G$jIY}fEA&PzU==$jZzP-I2)-+880hf@^QWuRVa(R&nc64-9xV$)jgSIi$WU|m4TU7G$dc7)n z_{4t454x}NxuaP)nK`B|C$kQjW65Xfa=91?8V;VVbJ4HR1Y1bO?f^ZSsI)?v45guh z#_->@yb_5-CM$_nGvvFB$Kzk=KU`VCn?ThoJY0tg-O5HtP$%RHBZConRmk>$zYxZA vGnQAVorZcOshLb>@8smr00000NkvXXu0mjfO`+7} delta 2868 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 S)hhrC0000$=q>&*se+QaL zL_t(|0qxygPZMn#2k?totOyhfHcCZsF!;i9VA;e2mXq?VAq#r|&3*te*>g47^V&}U zd%lV6ClC(Agk+bl(RCBeQWIW$%eGLOLPV&bh%bblf1ib5?c207^Hk>lOH64yr6>Ho z@44=4=B^M6O-@dFtE#HJ&CSi1f3>G-MMZ_Ty1H6EfBvio>A`0-<3Q&Ur*rl!W%(9j@6e?N+~wKdt; z*ch9ipZ{BbfB%>m%+SC+c<^ATrKKgHg-zx3kbYzs`QE>OAC1T3!OqUkQ89=ify0QV zO&jkpXml7YEG$IV*VhdRUP*zwfB(MP*4B1MRaGB@Mu!bxhX4O;1mwP3xu*QNfUzCr_Sa%}vI@;k?b`@eFgFjYuD4=E8*w z0c0rC`xyh*(a{k&b?Ov5NQjDn?kluBW_s_tq6wyw+T!*dj&8Yy{wp#*FETbK68--v zve)zTzrgQARQ`8me`{aAentCZPghr0=-}($1uhzmMz{o!U2z=5K!v zo~ug8rm$3?s%q=O*S?ujVsvBJvP0N<{+d5*fMakhK123|%het|dNg$KH6`tUfKXN# z*}{p!kH@k24A~PdSxe8=g_ya9guFe*m zSK{C3e~jyFvHJV$0vW5Rsqrdqw_6p;%h#&?k#&o1H@b@-4Xo~LVJD5bPM<#QRkX$K z%R&VS{G@Msh+}X6Bt^5jvxS{B=GxueRTT|q;|0R>e`)GZg^hF=*>G&JQ!cAJTi8is zJ}qmP6^FyY!0CVh4fl&g{wy-|n{P)vOdWA>Lp1md@l%hy3h@>*Rcp>Jp?vu8VQ1<_u*=KK>%6r& zk$K*}eVcT<-Sw#}zBe~FIjtlz(Z%sKbD>5Cdo#aimwYB+#h>8-6#YS6NTCS(Ru4Fp+_3PKywUzOt5Rq%&*CUj6scqep*VUtixSM3mFg(o$HfefV=7qvU$i@AoHPym;Y9c~gie zD`aG5X2zfIxC$u%_5g2hZ=d4&9MSg>w)y$_o^0oB2Ne`JVCaaxrzdQnNP+MRfANds z@i;G5C6d%t0AW30gMvr6gXZSuMpRY3!TX?)9ijA(YNS@*xQ#l8p3fE)IGCQE9`blR z!@L&?*$Em#uttq#GbuvRfdib^b#!#xcDvozINH%+hW=u0R12XCOV1QCT}gr4gV9b~ zs|&E8LWd24rqwN?iA3UhS65d^e@bLX;PxPRO-)UK+S*!`BOd+8_JW4%*}A*CN5vq9 z25!&9#KfSsgmA5{u5PfQp+Sg#6u9BfhYue@2$~TiS~^n#w+H8Vjg5^ym&-NabUJ<2 z)zvPJd{j!w(`sE4GbYXI00000NkvXX Hu0mjffC>JN literal 8654 zcmV;k#dn%P-P;`ECP5q%<2CfWV8Q<5j<9KI!>Wsti zo9h6-K^;aAv51g}hzRQZ#6|@QLMX2k3vHUxkUmZxP0oA2)_mW7oO6;UrLUAi)<3_T zz4uz*`d({&d#%0p+Is`Mi4a1t%0Dnn!G9>H(S9nG;^972(T8+Y#-oAiJfC04w^~Lu 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 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2@3x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation2.imageset/RefreshAnimation2@3x.png index 712697ae57ecbd982f197ec7ff086d11b9561926..14d510a0e706c308c7904188b28ef0a1d0a5cd50 100644 GIT binary patch delta 3145 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 literal 16889 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

;< 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 Ui42#9NB{r;07*qoM6N<$g6ZB1@Bjb+ diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation3.imageset/RefreshAnimation3@3x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation3.imageset/RefreshAnimation3@3x.png index 2bbeab03cd5129e2b4145e706a7a04ee9fa068ae..93c8d99376ea8188a92311bdfb2bc2d437eb10c8 100644 GIT binary patch delta 3137 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 P00000NkvXXu0mjf71}1K diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4.png index eb7fb440910a6fa32a35e1b41f8bc862d696c7ab..804ffd72c92b4228b717af86acc944fb559f543a 100644 GIT binary patch delta 986 zcmV<0110>!7XJqziBL{Q4GJ0x0000DNk~Le0001P0000Z2nGNE0Ck-|ksvjH1C&Wb zK~#7F?VCYQ8bK7t-)>M*6J0bI;o@wf2jW3UyigOxYkN>XK|g{t>8%Ix&{GfUp~t5E z25MsKtq_xz#7p&HJ($#$NSbJr^?)Lp(D$Giu(G;#*&T3xiD8`KUHG$a-puRC2pr@3`dZIqGLwCMeOtGG*ZvVsh{hMS z#H$hxQ!K+b{t%+^1&Mcfco(#pb1F) z0@(fypyvRl0sujOedFw)yStl>j*dog7^DA-sglkP6B85r?d|Q*=)C$2u=u@tF8T~$ z;YEGo?1WP0+S-~rGc%)q7gOc%@bFwSh(;g$?GL{^zx2)eIJ=>gIX*s4PhDw`>+S80 zKoejnPSW}~CqVIL=~dp_+lzE`bTDWFG~Hk=V||Bfue4EKGjD0^tjmQC|Te_#87!F&QURQtO*~eW?A?F5P%67VL&P=wQY-}u2uLlHNL+7`hot=3a-*`@N zuZ#Kp{(Jp=0_QkAJ)OrET#Uvy2k_0!%|%_;H4tzK`7FzSq7hXtFEYUn4h{;J7iZ8m zhMI&b&9PNiUV%VBBM+b0@A#qYtGw-K7EWf4G38_~L*`iWS$e%*1_Il`vvo21RhnQc zso5Q%M-!D+sgj{GRA3K(UCZ_y~4wFtkSJ)gajrb zR~Q+L$g4szwg>!%u$Gn<5SWA7X{eV*m;46@2P@%lIAJFK4`kHIYAo6&J^%m!07*qo IM6N<$f-mXTtpET3 delta 2861 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 DJ@E#H literal 8695 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 diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4@3x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation4.imageset/RefreshAnimation4@3x.png index 5baeb68a2f049ba643952c0c79cc2e445ff0d20f..241ca86372b85748ec79184157a52dacd49a0521 100644 GIT binary patch delta 3141 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 literal 16897 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 z

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 Qt^fc407*qoM6N<$g3h~gdH?_b diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/RefreshAnimation5.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation5.imageset/RefreshAnimation5.png index 3a71a0ceeb2a2a040e7ab436f3ba8c28499a9787..e4f443875fa3d6cefd7234b5cc91ddce4cc58633 100644 GIT binary patch delta 967 zcmV;&133J|7VHNgiBL{Q4GJ0x0000DNk~Le0001P0000Z2nGNE0Ck-|ksvjH1A$3I zK~#7F?VHa}8c`6(X9+55qM*SD7vCm&ARffT3pG(Z_n`hI*ra#y+(Yp%X#WFiV&kn4 zla@pe)r0k*sVfmlGzuO>{E^TZ=o&y+WmT9B?~@Rg_x7E>yYuGFd{LlI;_-NJXlQ8G z;c)mBMG+kx9RehEad&qIcDr4FyS~2GZf|e5udc3EM@B|s@Y<}btT@ll&lfK*FVlI+ zn}FgSCK8D+>+9Au8X&U$U_nCA$Ju@&cuw6O#NH{5f8ZT;zS0)^W zSb;bGmZI^3#5+Dd9#>UW)5mP3H(*?qZyG~L6N-YAEIy3s7nI5L_4Ns8VPby)c2WSD z9Kfs(!0!b%^!E0OiHV5?ybROtLa3y(!}Rp@VP|J2v??FI14Mq6k1f0d`1~H&Kp}H& zZB3n@pU)IR<>=_>Vk?V(MuJs}rjIZG1U68}oSK@Vx30Ly_4oG&p@lILClUu%pm-tr zw(all2fMnu1hg<(#$YZDtmx_KaZeoz6Cf*VR9GW^xq6YfuH2U>^_cZEbD94YSF@OOp)0r}(h~HeiS_ zD7qOX3uf0@4eFrVZfPKq0Q;sf`Ys5!v9S@MUJpoELkI8O-Q6X+e(;wVJCCutrR7Z*#|f(z62 z!vTDAb2F03WHgYlgnX8|XhfOIi%hV?!^6_$#SGfUP?Pb0Qgdus$;;>SY2@LP`yC&2 zUuC7ESvr{+QP)TF>?^<4p zMx*1kM0+;myG$e!U+F(wdC8kV)hj$)hfCecMkr7xZt$#002ovPDHLkV1kUC#V7y( delta 2862 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 B_2>Wq literal 8643 zcmV;!Aw1rRP)|G;gF1{LVi2KQL_|>M6VoaX5SsAnU?AyqNT>5S{YdwD?^n%Q`*F_clMd-Tm8Aau z`s}@{R;^dn+Eu%D?Y#m1fDl5k%0Dnn!G9>H(S9nG;^972(T8+Y#-oAiJfC04w^~Lu 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𝔢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 P00000NkvXXu0mjfeu;Qp diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@2x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@2x.png deleted file mode 100644 index 02b1855cfdca0e2c5bf499b74ab25de4acdd2836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8542 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 Y2i#7?@vThJr2qf`07*qoM6N<$f|H)gyZ`_I diff --git a/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@3x.png b/KCS/KCS/Resource/Assets.xcassets/RefreshAnimation6.imageset/RefreshAnimation6@3x.png deleted file mode 100644 index c870ae0673b0d99ef980a60c8fa44ae225c54e1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16757 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 From 893e2d1262afb7f5b41e5e0592f4fe7ba0bea4dc Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 29 Jan 2024 16:24:19 +0900 Subject: [PATCH 071/231] =?UTF-8?q?feat=20:=20animationFire,=20animationIn?= =?UTF-8?q?validate=20=EA=B5=AC=ED=98=84=20(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/RefreshButton.swift | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/KCS/KCS/Presentation/Home/View/RefreshButton.swift b/KCS/KCS/Presentation/Home/View/RefreshButton.swift index 7f6d5901..40d63ce7 100644 --- a/KCS/KCS/Presentation/Home/View/RefreshButton.swift +++ b/KCS/KCS/Presentation/Home/View/RefreshButton.swift @@ -9,6 +9,8 @@ import UIKit final class RefreshButton: UIButton { + private var animationTimer: Timer? + init() { super.init(frame: .zero) setUI() @@ -19,6 +21,39 @@ final class RefreshButton: UIButton { fatalError("init(coder:) has not been implemented") } + func animationFire() { + isUserInteractionEnabled = false + var runCount = 0 + var config = configuration + config?.attributedTitle = nil + animationTimer?.invalidate() + animationTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { [weak self] _ in + guard let self = self else { return } + let images = [ + UIImage.refreshAnimation1, + UIImage.refreshAnimation2, + UIImage.refreshAnimation3, + UIImage.refreshAnimation4, + UIImage.refreshAnimation5 + ] + config?.image = images[runCount] + self.configuration = config + + runCount = (runCount + 1) % 5 + } + } + + func animationInvalidate() { + isUserInteractionEnabled = true + isHidden = true + animationTimer?.invalidate() + + var titleAttribute = AttributedString("ํ˜„ ์ง€๋„์—์„œ ๊ฒ€์ƒ‰") + titleAttribute.font = UIFont.pretendard(size: 10, weight: .medium) + configuration?.attributedTitle = titleAttribute + configuration?.image = SystemImage.refresh?.withTintColor(.primary3, renderingMode: .alwaysOriginal) + } + } private extension RefreshButton { From 53a3cc11f9c6c2d0526cba5a09abb7d14b3a7b4a Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 29 Jan 2024 16:26:35 +0900 Subject: [PATCH 072/231] =?UTF-8?q?feat=20:=20Refresh=20Button=20=EC=95=A0?= =?UTF-8?q?=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98=20=EC=A0=81=EC=9A=A9=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A1=9C=EC=A7=81=20=EC=A0=95=EB=A6=AC=20(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 889bb329..11d23112 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -117,18 +117,15 @@ final class HomeViewController: UIViewController { return alertController }() - private let animationObservable = PublishRelay() - private lazy var refreshButton: RefreshButton = { let button = RefreshButton() button.translatesAutoresizingMaskIntoConstraints = false - button.isHidden = true button.rx.tap .observe(on: MainScheduler()) .map { [weak self] _ -> RequestLocation? in guard let self = self else { return nil } - // TODO: ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ธ”๋Ÿญ - animationObservable.accept(()) + button.animationFire() + return makeRequestLocation(projection: mapView.mapView.projection) } .observe(on: ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global())) @@ -149,7 +146,7 @@ final class HomeViewController: UIViewController { let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false view.backgroundColor = .clear - view.isUserInteractionEnabled = true + view.isUserInteractionEnabled = false view.alpha = 0.4 view.rx.tapGesture() @@ -252,7 +249,6 @@ final class HomeViewController: UIViewController { addUIComponents() configureConstraints() bind() - unDimmedView() viewModel.action( input: .checkLocationAuthorization( @@ -288,6 +284,7 @@ private extension HomeViewController { ) } } + refreshButton.animationInvalidate() storeInformationViewDismiss() } .disposed(by: disposeBag) @@ -297,14 +294,12 @@ private extension HomeViewController { viewModel.setMarkerOutput .bind { [weak self] content in guard let selectImage = UIImage(named: content.selectImageName), - let deselectImage = UIImage(named: content.deselectImageName) else { return } + let deselectImage = UIImage(named: content.deselectImageName) else { return } let marker = Marker(position: content.location.toMapLocation(), selectImage: selectImage, deselectImage: deselectImage) marker.tag = UInt(content.tag) marker.mapView = self?.mapView.mapView self?.markerTouchHandler(marker: marker) self?.markers.append(marker) - // TODO: ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ข…๋ฃŒ ๋ฐ isHidden = true - self?.refreshButton.layer.removeAllAnimations() } .disposed(by: disposeBag) } @@ -373,7 +368,6 @@ private extension HomeViewController { animated: true ) self?.storeInformationView.changeToSummary() - self?.unDimmedView() self?.viewModel.action( input: .changeState(state: .summary) ) @@ -423,7 +417,7 @@ private extension HomeViewController { .bind(to: button.rx.isSelected) .disposed(by: disposeBag) } - + } private extension HomeViewController { @@ -459,6 +453,7 @@ private extension HomeViewController { viewModel.action( input: .changeState(state: .normal) ) + unDimmedView() } func setStoreInformationConstraints(heightConstraint: CGFloat, bottomConstraint: CGFloat, animated: Bool = false) { @@ -554,6 +549,8 @@ private extension HomeViewController { NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), + refreshButton.widthAnchor.constraint(equalToConstant: 110), + refreshButton.heightAnchor.constraint(equalToConstant: 35), refreshButtonBottomConstraint ]) @@ -592,19 +589,17 @@ extension HomeViewController: NMFMapViewCameraDelegate { if reason == NMFMapChangedByDeveloper { mapView.positionMode = .direction - viewModel.action(input: + viewModel.action(input: .checkLocationAuthorizationWhenCameraDidChange( status: locationManager.authorizationStatus ) ) + refreshButton.animationFire() viewModel.action( input: .refresh( requestLocation: makeRequestLocation(projection: mapView.projection) ) ) -// refreshButton.isHidden = true - // TODO: ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ์ž‘ - animationObservable.accept(()) } } @@ -614,7 +609,6 @@ extension HomeViewController: NMFMapViewTouchDelegate { func mapView(_ mapView: NMFMapView, didTapMap latlng: NMGLatLng, point: CGPoint) { storeInformationViewDismiss() - unDimmedView() } } From a62426fc87715b16a719ee00a36afcf99fa95fee Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 29 Jan 2024 17:05:04 +0900 Subject: [PATCH 073/231] =?UTF-8?q?refactor=20:=20runCount=20->=20imageInd?= =?UTF-8?q?ex=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95=20(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/RefreshButton.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/RefreshButton.swift b/KCS/KCS/Presentation/Home/View/RefreshButton.swift index 40d63ce7..c03f8608 100644 --- a/KCS/KCS/Presentation/Home/View/RefreshButton.swift +++ b/KCS/KCS/Presentation/Home/View/RefreshButton.swift @@ -23,7 +23,7 @@ final class RefreshButton: UIButton { func animationFire() { isUserInteractionEnabled = false - var runCount = 0 + var imageIndex = 0 var config = configuration config?.attributedTitle = nil animationTimer?.invalidate() @@ -36,10 +36,10 @@ final class RefreshButton: UIButton { UIImage.refreshAnimation4, UIImage.refreshAnimation5 ] - config?.image = images[runCount] + config?.image = images[imageIndex] self.configuration = config - runCount = (runCount + 1) % 5 + imageIndex = (imageIndex + 1) % 5 } } From c48ab4097e64e0e2111360687b4270efae43b058 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 29 Jan 2024 17:37:13 +0900 Subject: [PATCH 074/231] =?UTF-8?q?refactore=20:=20RefreshButton=20origina?= =?UTF-8?q?lTitle=20=EC=84=A0=EC=96=B8=20(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/RefreshButton.swift | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/RefreshButton.swift b/KCS/KCS/Presentation/Home/View/RefreshButton.swift index c03f8608..834b7fad 100644 --- a/KCS/KCS/Presentation/Home/View/RefreshButton.swift +++ b/KCS/KCS/Presentation/Home/View/RefreshButton.swift @@ -11,6 +11,13 @@ final class RefreshButton: UIButton { private var animationTimer: Timer? + private let originalTitle: AttributedString = { + var titleAttribute = AttributedString("ํ˜„ ์ง€๋„์—์„œ ๊ฒ€์ƒ‰") + titleAttribute.font = UIFont.pretendard(size: 10, weight: .medium) + + return titleAttribute + }() + init() { super.init(frame: .zero) setUI() @@ -48,9 +55,7 @@ final class RefreshButton: UIButton { isHidden = true animationTimer?.invalidate() - var titleAttribute = AttributedString("ํ˜„ ์ง€๋„์—์„œ ๊ฒ€์ƒ‰") - titleAttribute.font = UIFont.pretendard(size: 10, weight: .medium) - configuration?.attributedTitle = titleAttribute + configuration?.attributedTitle = originalTitle configuration?.image = SystemImage.refresh?.withTintColor(.primary3, renderingMode: .alwaysOriginal) } @@ -59,11 +64,8 @@ final class RefreshButton: UIButton { private extension RefreshButton { func setUI() { - var titleAttribute = AttributedString("ํ˜„ ์ง€๋„์—์„œ ๊ฒ€์ƒ‰") - titleAttribute.font = UIFont.pretendard(size: 10, weight: .medium) - var config = UIButton.Configuration.filled() - config.attributedTitle = titleAttribute + config.attributedTitle = originalTitle config.baseBackgroundColor = .white config.baseForegroundColor = .black config.image = SystemImage.refresh?.withTintColor(.primary3, renderingMode: .alwaysOriginal) From e4f88d60c9f36732e452b60b0fcc82633fb47d4f Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 29 Jan 2024 17:41:23 +0900 Subject: [PATCH 075/231] =?UTF-8?q?fix=20:=20=EC=9D=98=EB=AF=B8=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=8A=A4=EB=A0=88=EB=93=9C=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 11d23112..2f204d30 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -121,7 +121,6 @@ final class HomeViewController: UIViewController { let button = RefreshButton() button.translatesAutoresizingMaskIntoConstraints = false button.rx.tap - .observe(on: MainScheduler()) .map { [weak self] _ -> RequestLocation? in guard let self = self else { return nil } button.animationFire() From 240c8bec637e2fc1888082b634dd3022ecdfef6f Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Tue, 30 Jan 2024 21:51:39 +0900 Subject: [PATCH 076/231] =?UTF-8?q?refactor=20:=20UseCase=20error=EB=A5=BC?= =?UTF-8?q?=20ViewModel=EB=A1=9C=20=EC=B1=85=EC=9E=84=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=20(#129)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 114 +++++++++--------- KCS/KCS/Data/Network/DTO/StoreDTO.swift | 24 ++-- KCS/KCS/Data/Network/Router.swift | 2 +- KCS/KCS/Data/Network/StoreAPI.swift | 34 +++--- .../Data/Repository/StoreRepositoryImpl.swift | 17 +-- .../UseCase/GetOpenClosedUseCase.swift | 2 +- .../UseCase/GetOpenClosedUseCaseImpl.swift | 65 ++++------ .../Home/ViewModel/DetailViewModelImpl.swift | 24 ++-- .../Home/ViewModel/SummaryViewModelImpl.swift | 31 +++-- 9 files changed, 150 insertions(+), 163 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 0ca7bcfb..8196a8e2 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -58,7 +58,6 @@ 59F478BD2B5AE180002FEF9E /* FetchStoresUseCaseImplTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F478BC2B5AE180002FEF9E /* FetchStoresUseCaseImplTests.swift */; }; 59F478BF2B5BEA08002FEF9E /* RequestLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F478BE2B5BEA08002FEF9E /* RequestLocation.swift */; }; 59F478C12B5D0D8D002FEF9E /* ImageRepositoryImplTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F478C02B5D0D8D002FEF9E /* ImageRepositoryImplTests.swift */; }; - 8FE699E5DAEEDFE5A53D5E82 /* Pods_KCS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E11E3144529848C9A0FC6F77 /* Pods_KCS.framework */; }; A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A802D1F52B5277620091FDE7 /* CertificationLabel.swift */; }; A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB22B5BC57800D0C0D7 /* OpenClosedContent.swift */; }; A81EFBB52B5D477600D0C0D7 /* UILabel+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBB42B5D477600D0C0D7 /* UILabel+.swift */; }; @@ -93,7 +92,8 @@ A8ACB7F12B5AEBE300540BD1 /* GetStoreInformationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7F02B5AEBE300540BD1 /* GetStoreInformationUseCase.swift */; }; A8AE4B192B62903100632355 /* OpeningHourViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8AE4B182B62903100632355 /* OpeningHourViewModel.swift */; }; A8AE4B1B2B62A60B00632355 /* OpeningHoursCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8AE4B1A2B62A60B00632355 /* OpeningHoursCellView.swift */; }; - F242B43374CDD61CC6F6A4D5 /* Pods_KCSUnitTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FF39E6207057AD78DB44730 /* Pods_KCSUnitTest.framework */; }; + AE60727C9A543E3D0F3A0279 /* Pods_KCSUnitTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 71A6818C1431365A23C873FB /* Pods_KCSUnitTest.framework */; }; + BBE1483137890D1D37D0E308 /* Pods_KCS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A3902FBE673069073F47D82 /* Pods_KCS.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -107,8 +107,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 0FF39E6207057AD78DB44730 /* Pods_KCSUnitTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KCSUnitTest.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BD0CCD4DBD4E121C26925E6 /* Pods-KCSUnitTest.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCSUnitTest.release.xcconfig"; path = "Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest.release.xcconfig"; sourceTree = ""; }; + 2A59B3837A53AAB2D7A1E09C /* Pods-KCSUnitTest.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCSUnitTest.release.xcconfig"; path = "Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest.release.xcconfig"; sourceTree = ""; }; 59053D0A2B3889A200D190CC /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; 591A88792B384E600059E40F /* KCS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KCS.app; sourceTree = BUILT_PRODUCTS_DIR; }; 591A887C2B384E600059E40F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -164,8 +163,10 @@ 59F478BC2B5AE180002FEF9E /* FetchStoresUseCaseImplTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStoresUseCaseImplTests.swift; sourceTree = ""; }; 59F478BE2B5BEA08002FEF9E /* RequestLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestLocation.swift; sourceTree = ""; }; 59F478C02B5D0D8D002FEF9E /* ImageRepositoryImplTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRepositoryImplTests.swift; sourceTree = ""; }; - 5FF0FF2386EEB69182D6EA4C /* Pods-KCSUnitTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCSUnitTest.debug.xcconfig"; path = "Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest.debug.xcconfig"; sourceTree = ""; }; - 9EA5C8EA72EA9E937C11400A /* Pods-KCS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCS.debug.xcconfig"; path = "Target Support Files/Pods-KCS/Pods-KCS.debug.xcconfig"; sourceTree = ""; }; + 5A3902FBE673069073F47D82 /* Pods_KCS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KCS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6E7A587B8D04F1EBD1715550 /* Pods-KCS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCS.release.xcconfig"; path = "Target Support Files/Pods-KCS/Pods-KCS.release.xcconfig"; sourceTree = ""; }; + 71A6818C1431365A23C873FB /* Pods_KCSUnitTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KCSUnitTest.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 96F7AFBA49BAE4D780F6D753 /* Pods-KCS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCS.debug.xcconfig"; path = "Target Support Files/Pods-KCS/Pods-KCS.debug.xcconfig"; sourceTree = ""; }; A802D1F52B5277620091FDE7 /* CertificationLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationLabel.swift; sourceTree = ""; }; A81EFBB22B5BC57800D0C0D7 /* OpenClosedContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedContent.swift; sourceTree = ""; }; A81EFBB42B5D477600D0C0D7 /* UILabel+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+.swift"; sourceTree = ""; }; @@ -200,8 +201,7 @@ A8ACB7F02B5AEBE300540BD1 /* GetStoreInformationUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetStoreInformationUseCase.swift; sourceTree = ""; }; A8AE4B182B62903100632355 /* OpeningHourViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHourViewModel.swift; sourceTree = ""; }; A8AE4B1A2B62A60B00632355 /* OpeningHoursCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHoursCellView.swift; sourceTree = ""; }; - AA9EF30352C847A7C6DEC110 /* Pods-KCS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCS.release.xcconfig"; path = "Target Support Files/Pods-KCS/Pods-KCS.release.xcconfig"; sourceTree = ""; }; - E11E3144529848C9A0FC6F77 /* Pods_KCS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KCS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D7B848B1C5D2F1B31C605818 /* Pods-KCSUnitTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCSUnitTest.debug.xcconfig"; path = "Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -209,7 +209,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8FE699E5DAEEDFE5A53D5E82 /* Pods_KCS.framework in Frameworks */, + BBE1483137890D1D37D0E308 /* Pods_KCS.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -217,7 +217,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F242B43374CDD61CC6F6A4D5 /* Pods_KCSUnitTest.framework in Frameworks */, + AE60727C9A543E3D0F3A0279 /* Pods_KCSUnitTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -233,7 +233,7 @@ 5977BE8B2B5966F900725C90 /* KCSUnitTest */, 591A887A2B384E600059E40F /* Products */, ED50AD730FA5F4D533F6DF5F /* Pods */, - CBA0F2F7C6731F98AFE4E86D /* Frameworks */, + E99F20FF9A30DCF9C51285A2 /* Frameworks */, ); sourceTree = ""; }; @@ -561,11 +561,11 @@ path = Error; sourceTree = ""; }; - CBA0F2F7C6731F98AFE4E86D /* Frameworks */ = { + E99F20FF9A30DCF9C51285A2 /* Frameworks */ = { isa = PBXGroup; children = ( - E11E3144529848C9A0FC6F77 /* Pods_KCS.framework */, - 0FF39E6207057AD78DB44730 /* Pods_KCSUnitTest.framework */, + 5A3902FBE673069073F47D82 /* Pods_KCS.framework */, + 71A6818C1431365A23C873FB /* Pods_KCSUnitTest.framework */, ); name = Frameworks; sourceTree = ""; @@ -573,10 +573,10 @@ ED50AD730FA5F4D533F6DF5F /* Pods */ = { isa = PBXGroup; children = ( - 9EA5C8EA72EA9E937C11400A /* Pods-KCS.debug.xcconfig */, - AA9EF30352C847A7C6DEC110 /* Pods-KCS.release.xcconfig */, - 5FF0FF2386EEB69182D6EA4C /* Pods-KCSUnitTest.debug.xcconfig */, - 4BD0CCD4DBD4E121C26925E6 /* Pods-KCSUnitTest.release.xcconfig */, + 96F7AFBA49BAE4D780F6D753 /* Pods-KCS.debug.xcconfig */, + 6E7A587B8D04F1EBD1715550 /* Pods-KCS.release.xcconfig */, + D7B848B1C5D2F1B31C605818 /* Pods-KCSUnitTest.debug.xcconfig */, + 2A59B3837A53AAB2D7A1E09C /* Pods-KCSUnitTest.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -588,12 +588,12 @@ isa = PBXNativeTarget; buildConfigurationList = 591A888D2B384E610059E40F /* Build configuration list for PBXNativeTarget "KCS" */; buildPhases = ( - CB55E62BB6C1E559A1B678AA /* [CP] Check Pods Manifest.lock */, + 1710AC2AA053B9D767B25C83 /* [CP] Check Pods Manifest.lock */, 591A88752B384E600059E40F /* Sources */, 591A88762B384E600059E40F /* Frameworks */, 591A88772B384E600059E40F /* Resources */, - 3BC1B94F5FD0808C2E71C0CF /* [CP] Embed Pods Frameworks */, 591A88902B3884930059E40F /* Run Script */, + C9DF99EE5FF9433DE46D74ED /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -608,11 +608,11 @@ isa = PBXNativeTarget; buildConfigurationList = 5977BE922B5966F900725C90 /* Build configuration list for PBXNativeTarget "KCSUnitTest" */; buildPhases = ( - B40FA4C5FEA2CEF5D14076EF /* [CP] Check Pods Manifest.lock */, + A73C3D34B606A83DF89A57DD /* [CP] Check Pods Manifest.lock */, 5977BE862B5966F900725C90 /* Sources */, 5977BE872B5966F900725C90 /* Frameworks */, 5977BE882B5966F900725C90 /* Resources */, - BC4E38BB9B3B1281AC2576D1 /* [CP] Embed Pods Frameworks */, + 4A3D260580D318595657BED8 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -693,21 +693,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3BC1B94F5FD0808C2E71C0CF /* [CP] Embed Pods Frameworks */ = { + 1710AC2AA053B9D767B25C83 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-KCS/Pods-KCS-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-KCS-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 4A3D260580D318595657BED8 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-KCS/Pods-KCS-frameworks-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KCS/Pods-KCS-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 591A88902B3884930059E40F /* Run Script */ = { @@ -729,7 +751,7 @@ shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/SwiftLint/swiftlint\"\n"; }; - B40FA4C5FEA2CEF5D14076EF /* [CP] Check Pods Manifest.lock */ = { + A73C3D34B606A83DF89A57DD /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -751,43 +773,21 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - BC4E38BB9B3B1281AC2576D1 /* [CP] Embed Pods Frameworks */ = { + C9DF99EE5FF9433DE46D74ED /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest-frameworks-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-KCS/Pods-KCS-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - CB55E62BB6C1E559A1B678AA /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-KCS-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-KCS/Pods-KCS-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KCS/Pods-KCS-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -1024,7 +1024,7 @@ }; 591A888E2B384E610059E40F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9EA5C8EA72EA9E937C11400A /* Pods-KCS.debug.xcconfig */; + baseConfigurationReference = 96F7AFBA49BAE4D780F6D753 /* Pods-KCS.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1059,7 +1059,7 @@ }; 591A888F2B384E610059E40F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA9EF30352C847A7C6DEC110 /* Pods-KCS.release.xcconfig */; + baseConfigurationReference = 6E7A587B8D04F1EBD1715550 /* Pods-KCS.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1094,7 +1094,7 @@ }; 5977BE902B5966F900725C90 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FF0FF2386EEB69182D6EA4C /* Pods-KCSUnitTest.debug.xcconfig */; + baseConfigurationReference = D7B848B1C5D2F1B31C605818 /* Pods-KCSUnitTest.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -1119,7 +1119,7 @@ }; 5977BE912B5966F900725C90 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4BD0CCD4DBD4E121C26925E6 /* Pods-KCSUnitTest.release.xcconfig */; + baseConfigurationReference = 2A59B3837A53AAB2D7A1E09C /* Pods-KCSUnitTest.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/KCS/KCS/Data/Network/DTO/StoreDTO.swift b/KCS/KCS/Data/Network/DTO/StoreDTO.swift index 090bf31c..de88ebe5 100644 --- a/KCS/KCS/Data/Network/DTO/StoreDTO.swift +++ b/KCS/KCS/Data/Network/DTO/StoreDTO.swift @@ -33,25 +33,19 @@ struct StoreDTO: Codable { } - func toEntity() -> Store { + func toEntity() throws -> Store { var certificationTypes: [CertificationType] = [] var openingHours: [RegularOpeningHours] = [] - do { - for name in certificationName { - guard let type = CertificationType(rawValue: name) else { - throw JSONContentsError.wrongCertificationType - } - certificationTypes.append(type) + for name in certificationName { + guard let type = CertificationType(rawValue: name) else { + throw JSONContentsError.wrongCertificationType } - - for hour in regularOpeningHours { - openingHours.append(try hour.toEntity()) - } - } catch let error as JSONContentsError { - print(error.errorDescription) - } catch let error { - print(error.localizedDescription) + certificationTypes.append(type) + } + + for hour in regularOpeningHours { + openingHours.append(try hour.toEntity()) } return Store( diff --git a/KCS/KCS/Data/Network/Router.swift b/KCS/KCS/Data/Network/Router.swift index 3932d727..d8af9c27 100644 --- a/KCS/KCS/Data/Network/Router.swift +++ b/KCS/KCS/Data/Network/Router.swift @@ -9,7 +9,7 @@ import Alamofire protocol Router { - var baseURL: String { get } + var baseURL: String? { get } var path: String { get } var method: HTTPMethod { get } var headers: [String: String] { get } diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 20437f87..03acb84b 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -16,36 +16,31 @@ enum StoreAPI { } extension StoreAPI: Router, URLRequestConvertible { - - public var baseURL: String { + + var baseURL: String? { switch self { case .getStores: - do { - return try getURL(type: .develop) - } catch { - print(error.localizedDescription) - return "" - } + return getURL(type: .develop) case .getImage(let url): return url } } - public var path: String { + var path: String { switch self { case .getStores, .getImage: return "" } } - public var method: HTTPMethod { + var method: HTTPMethod { switch self { case .getStores, .getImage: return .get } } - public var headers: [String: String] { + var headers: [String: String] { switch self { case .getStores: return [ @@ -56,13 +51,13 @@ extension StoreAPI: Router, URLRequestConvertible { } } - public var parameters: [String: Any]? { + var parameters: [String: Any]? { do { switch self { case let .getStores(location): return try location.asDictionary() case .getImage: - return nil + return [:] } } catch let error { print(error.localizedDescription) @@ -72,7 +67,7 @@ extension StoreAPI: Router, URLRequestConvertible { /// ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณด๋‚ด์•ผํ•  ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด, URLEncoding.default /// ๋ฐ”๋””์— ๋‹ด์•„์„œ ๋ณด๋‚ด์•ผํ•  ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด, JSONEncoding.default - public var encoding: ParameterEncoding? { + var encoding: ParameterEncoding? { switch self { case .getStores: return URLEncoding.default @@ -81,8 +76,9 @@ extension StoreAPI: Router, URLRequestConvertible { } } - public func asURLRequest() throws -> URLRequest { - guard let url = URL(string: baseURL + path) else { + func asURLRequest() throws -> URLRequest { + guard let base = baseURL, + let url = URL(string: base + path) else { throw NetworkError.wrongURL } var request = URLRequest(url: url) @@ -108,13 +104,13 @@ private extension StoreAPI { } - func getURL(type: URLType) throws -> String { + func getURL(type: URLType) -> String? { switch type { case .develop: - guard let url = Bundle.main.object(forInfoDictionaryKey: "DEV_SERVER_URL") as? String else { throw NetworkError.wrongURL } + guard let url = Bundle.main.object(forInfoDictionaryKey: "DEV_SERVER_URL") as? String else { return nil } return url case .product: - guard let url = Bundle.main.object(forInfoDictionaryKey: "PROD_SERVER_URL") as? String else { throw NetworkError.wrongURL } + guard let url = Bundle.main.object(forInfoDictionaryKey: "PROD_SERVER_URL") as? String else { return nil } return url } } diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index cb0ca25d..37aca6fa 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -31,16 +31,19 @@ final class StoreRepositoryImpl: StoreRepository { neLat: requestLocation.northEast.latitude ))) .responseDecodable(of: StoreResponse.self) { [weak self] response in - switch response.result { - case .success(let result): - let resultStores = result.data.map { $0.toEntity() } - self?.stores = resultStores - observer.onNext(resultStores) - case .failure(let error): + do { + switch response.result { + case .success(let result): + let resultStores = try result.data.map { try $0.toEntity() } + self?.stores = resultStores + observer.onNext(resultStores) + case .failure(let error): + throw error + } + } catch let error { observer.onError(error) } } - return Disposables.create() } } diff --git a/KCS/KCS/Domain/Interface/UseCase/GetOpenClosedUseCase.swift b/KCS/KCS/Domain/Interface/UseCase/GetOpenClosedUseCase.swift index 8839be20..b988b34e 100644 --- a/KCS/KCS/Domain/Interface/UseCase/GetOpenClosedUseCase.swift +++ b/KCS/KCS/Domain/Interface/UseCase/GetOpenClosedUseCase.swift @@ -11,6 +11,6 @@ protocol GetOpenClosedUseCase { func execute( openingHours: [RegularOpeningHours] - ) -> OpenClosedContent + ) throws -> OpenClosedContent } diff --git a/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift index 77d257d7..f2bf7bea 100644 --- a/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift +++ b/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift @@ -11,24 +11,24 @@ struct GetOpenClosedUseCaseImpl: GetOpenClosedUseCase { func execute( openingHours: [RegularOpeningHours] - ) -> OpenClosedContent { - return getOpenClosedContent(openingHour: openingHours) + ) throws -> OpenClosedContent { + return try getOpenClosedContent(openingHour: openingHours) } } private extension GetOpenClosedUseCaseImpl { - func getOpenClosedContent(openingHour: [RegularOpeningHours]) -> OpenClosedContent { - let nowOpenClosedType = getOpenClosedType(openingHour: openingHour) - lazy var openingHourString: String = { + func getOpenClosedContent(openingHour: [RegularOpeningHours]) throws -> OpenClosedContent { + let nowOpenClosedType = try getOpenClosedType(openingHour: openingHour) + let openingHourString: String = try { switch nowOpenClosedType { case .none, .dayOff: return OpenClosedType.none.rawValue case .breakTime, .closed: - return getOpenClosedString(openingHour: openingHour, openClosedType: .open) + return try getOpenClosedString(openingHour: openingHour, openClosedType: .open) case .open: - return getOpenClosedString(openingHour: openingHour, openClosedType: .close) + return try getOpenClosedString(openingHour: openingHour, openClosedType: .close) } }() @@ -38,11 +38,11 @@ private extension GetOpenClosedUseCaseImpl { private extension GetOpenClosedUseCaseImpl { - func getOpenClosedType(openingHour: [RegularOpeningHours]) -> OpenClosedType { + func getOpenClosedType(openingHour: [RegularOpeningHours]) throws -> OpenClosedType { if openingHour.isEmpty { return OpenClosedType.none } - let openCloseTime = getOpenClosedTimeArray(openingHours: openingHour) + let openCloseTime = try getOpenClosedTimeArray(openingHours: openingHour) if openCloseTime.isEmpty { return OpenClosedType.dayOff } @@ -66,8 +66,8 @@ private extension GetOpenClosedUseCaseImpl { return OpenClosedType.dayOff } - func getOpenClosedString(openingHour: [RegularOpeningHours], openClosedType: OpenClose) -> String { - let openCloseTime = getOpenClosedTimeArray(openingHours: openingHour) + func getOpenClosedString(openingHour: [RegularOpeningHours], openClosedType: OpenClose) throws -> String { + let openCloseTime = try getOpenClosedTimeArray(openingHours: openingHour) var nextTime = openCloseTime.filter({ $0 > Date().toSecond() }) switch openClosedType { case .open: @@ -92,7 +92,7 @@ private extension GetOpenClosedUseCaseImpl { } } - func getOpenClosedTimeArray(openingHours: [RegularOpeningHours]) -> [Int] { + func getOpenClosedTimeArray(openingHours: [RegularOpeningHours]) throws -> [Int] { var openCloseTime: [Int] = [] let todayOpenHours = filteredOpeningHours(openingHours: openingHours, day: 0) if todayOpenHours.isEmpty { @@ -101,9 +101,9 @@ private extension GetOpenClosedUseCaseImpl { let yesterdayOpenHours = filteredOpeningHours(openingHours: openingHours, day: -1) let tomorrowOpenHours = filteredOpeningHours(openingHours: openingHours, day: 1) - openCloseTime.append(contentsOf: appendYesterdayClosedHour(openingHours: yesterdayOpenHours)) - openCloseTime.append(contentsOf: appendTodayOpenClosedHour(openingHours: todayOpenHours)) - openCloseTime.append(contentsOf: appendTomorrowOpenHour(openingHours: tomorrowOpenHours)) + openCloseTime.append(contentsOf: try appendYesterdayClosedHour(openingHours: yesterdayOpenHours)) + openCloseTime.append(contentsOf: try appendTodayOpenClosedHour(openingHours: todayOpenHours)) + openCloseTime.append(contentsOf: try appendTomorrowOpenHour(openingHours: tomorrowOpenHours)) return openCloseTime } @@ -115,49 +115,34 @@ private extension GetOpenClosedUseCaseImpl { } } - func appendYesterdayClosedHour(openingHours: [RegularOpeningHours]) -> [Int] { + func appendYesterdayClosedHour(openingHours: [RegularOpeningHours]) throws -> [Int] { if let businessHour = openingHours.last?.close { - if let time = catchHourError(businessHour: businessHour, openClose: .close) { - return [time - 86400] - } + return [try catchHourError(businessHour: businessHour, openClose: .close) - 86400] } return [.zero] } - func appendTodayOpenClosedHour(openingHours: [RegularOpeningHours]) -> [Int] { + func appendTodayOpenClosedHour(openingHours: [RegularOpeningHours]) throws -> [Int] { var openCloseTime: [Int] = [] - openingHours.forEach { businessHour in - if let openHour = catchHourError(businessHour: businessHour.open, openClose: .open), - let closeHour = catchHourError(businessHour: businessHour.close, openClose: .close) { - openCloseTime.append(openHour) - openCloseTime.append(closeHour) - } + try openingHours.forEach { businessHour in + openCloseTime.append(try catchHourError(businessHour: businessHour.open, openClose: .open)) + openCloseTime.append(try catchHourError(businessHour: businessHour.close, openClose: .close)) } return openCloseTime } - func appendTomorrowOpenHour(openingHours: [RegularOpeningHours]) -> [Int] { + func appendTomorrowOpenHour(openingHours: [RegularOpeningHours]) throws -> [Int] { if let businessHour = openingHours.first?.open { - if let time = catchHourError(businessHour: businessHour, openClose: .open) { - return [time + 86400] - } + return [try catchHourError(businessHour: businessHour, openClose: .open) + 86400] } return [86400 * 2] } - func catchHourError(businessHour: BusinessHour, openClose: OpenClose) -> Int? { - do { - return try toSecond(businessHour: businessHour, openClose: openClose) - } catch let error as OpeningHourError { - print(error.description) - } catch { - print(error) - } - - return nil + func catchHourError(businessHour: BusinessHour, openClose: OpenClose) throws -> Int { + return try toSecond(businessHour: businessHour, openClose: openClose) } func toSecond(businessHour: BusinessHour, openClose: OpenClose) throws -> Int { diff --git a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift index 04dff66c..fc1c9466 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift @@ -36,17 +36,21 @@ private extension DetailViewModelImpl { func setUIContents(store: Store) { fetchThumbnailImage(localPhotos: store.localPhotos) - setUIContentsOutput.accept( - DetailViewContents( - storeTitle: store.title, - category: store.category, - certificationTypes: store.certificationTypes, - address: store.address, - phoneNumber: store.phoneNumber ?? "์ „ํ™”๋ฒˆํ˜ธ ์ •๋ณด ์—†์Œ", - openClosedContent: getOpenClosedUseCase.execute(openingHours: store.openingHour), - detailOpeningHour: detailOpeningHour(openingHours: store.openingHour) + do { + setUIContentsOutput.accept( + DetailViewContents( + storeTitle: store.title, + category: store.category, + certificationTypes: store.certificationTypes, + address: store.address, + phoneNumber: store.phoneNumber ?? "์ „ํ™”๋ฒˆํ˜ธ ์ •๋ณด ์—†์Œ", + openClosedContent: try getOpenClosedUseCase.execute(openingHours: store.openingHour), + detailOpeningHour: detailOpeningHour(openingHours: store.openingHour) + ) ) - ) + } catch let error { + print(error.localizedDescription) + } } func fetchThumbnailImage(localPhotos: [String]) { diff --git a/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift index 0fc04480..412bc39e 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift @@ -36,20 +36,25 @@ final class SummaryViewModelImpl: SummaryViewModel { private extension SummaryViewModelImpl { func setUIContents(store: Store) { - let openClosedContent = getOpenClosedUseCase.execute(openingHours: store.openingHour) - fetchThumbnailImage(localPhotos: store.localPhotos) - if let phoneNumber = store.phoneNumber { - callButtonOutput.accept(phoneNumber) - } - - setUIContentsOutput.accept( - SummaryViewContents( - storeTitle: store.title, - category: store.category, - certificationTypes: store.certificationTypes, - openClosedContent: openClosedContent + do { + let openClosedContent = try getOpenClosedUseCase.execute(openingHours: store.openingHour) + + fetchThumbnailImage(localPhotos: store.localPhotos) + if let phoneNumber = store.phoneNumber { + callButtonOutput.accept(phoneNumber) + } + + setUIContentsOutput.accept( + SummaryViewContents( + storeTitle: store.title, + category: store.category, + certificationTypes: store.certificationTypes, + openClosedContent: openClosedContent + ) ) - ) + } catch let error { + print(error.localizedDescription) + } } func fetchThumbnailImage(localPhotos: [String]) { From 6e81975fe19a8c1a63897c0f4b5d4952b168f4ce Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Tue, 30 Jan 2024 22:09:15 +0900 Subject: [PATCH 077/231] =?UTF-8?q?feat=20:=20API=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=20=EC=98=A4=EB=A5=98=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?(#129)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Network/Error/NetworkError.swift | 3 +++ KCS/KCS/Data/Network/Extension/Encodable+.swift | 5 ++++- KCS/KCS/Data/Network/StoreAPI.swift | 8 ++++++-- KCS/KCS/Data/Repository/StoreRepositoryImpl.swift | 2 +- .../Presentation/Home/ViewModel/DetailViewModelImpl.swift | 2 +- .../Home/ViewModel/SummaryViewModelImpl.swift | 2 +- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/KCS/KCS/Data/Network/Error/NetworkError.swift b/KCS/KCS/Data/Network/Error/NetworkError.swift index 5771526b..540155ad 100644 --- a/KCS/KCS/Data/Network/Error/NetworkError.swift +++ b/KCS/KCS/Data/Network/Error/NetworkError.swift @@ -10,11 +10,14 @@ import Foundation enum NetworkError: Error, LocalizedError { case wrongURL + case wrongParameters var errorDescription: String { switch self { case .wrongURL: return "URL์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค." + case .wrongParameters: + return "Parameters๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค." } } diff --git a/KCS/KCS/Data/Network/Extension/Encodable+.swift b/KCS/KCS/Data/Network/Extension/Encodable+.swift index 1724e12c..9add86b6 100644 --- a/KCS/KCS/Data/Network/Extension/Encodable+.swift +++ b/KCS/KCS/Data/Network/Extension/Encodable+.swift @@ -11,7 +11,10 @@ extension Encodable { func asDictionary() throws -> [String: Any] { let data = try JSONEncoder().encode(self) - guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { + guard let dictionary = try JSONSerialization.jsonObject( + with: data, + options: .allowFragments + ) as? [String: Any] else { throw JSONContentsError.dictionaryConvert } return dictionary diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 03acb84b..fcb4d80b 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -59,7 +59,7 @@ extension StoreAPI: Router, URLRequestConvertible { case .getImage: return [:] } - } catch let error { + } catch { print(error.localizedDescription) return nil } @@ -87,7 +87,11 @@ extension StoreAPI: Router, URLRequestConvertible { request.headers = HTTPHeaders(headers) if let encoding = encoding { - return try encoding.encode(request, with: parameters) + if let parameters = parameters { + return try encoding.encode(request, with: parameters) + } else { + throw NetworkError.wrongParameters + } } return request diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 37aca6fa..6911f8ae 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -40,7 +40,7 @@ final class StoreRepositoryImpl: StoreRepository { case .failure(let error): throw error } - } catch let error { + } catch { observer.onError(error) } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift index fc1c9466..5063d427 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift @@ -48,7 +48,7 @@ private extension DetailViewModelImpl { detailOpeningHour: detailOpeningHour(openingHours: store.openingHour) ) ) - } catch let error { + } catch { print(error.localizedDescription) } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift index 412bc39e..df28eaf7 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift @@ -52,7 +52,7 @@ private extension SummaryViewModelImpl { openClosedContent: openClosedContent ) ) - } catch let error { + } catch { print(error.localizedDescription) } } From d48767b73d044975e3a7c1dca23e7e7429652fb6 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Tue, 30 Jan 2024 22:27:18 +0900 Subject: [PATCH 078/231] =?UTF-8?q?feat=20:=20markerTapped=20error=20alert?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20(#129)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Network/StoreAPI.swift | 1 - .../Home/View/HomeViewController.swift | 12 +++ .../Home/ViewModel/HomeViewModelImpl.swift | 87 ++++++++++--------- .../ViewModel/protocol/HomeViewModel.swift | 1 + 4 files changed, 57 insertions(+), 44 deletions(-) diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index fcb4d80b..93658693 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -60,7 +60,6 @@ extension StoreAPI: Router, URLRequestConvertible { return [:] } } catch { - print(error.localizedDescription) return nil } } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 2f204d30..b957d255 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -266,6 +266,7 @@ private extension HomeViewController { bindLocationButton() bindLocationAuthorization() bindStoreInformationView() + bindErrorAlert() } func bindRefresh() { @@ -417,6 +418,17 @@ private extension HomeViewController { .disposed(by: disposeBag) } + func bindErrorAlert() { + viewModel.errorAlertOutput + .bind { [weak self] message in + let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: "ํ™•์ธ", style: .default)) + + self?.present(alertController, animated: true) + } + .disposed(by: disposeBag) + } + } private extension HomeViewController { diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index aa820be3..30e0c4fb 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -16,17 +16,18 @@ final class HomeViewModelImpl: HomeViewModel { let fetchStoresUseCase: FetchStoresUseCase let getStoreInformationUseCase: GetStoreInformationUseCase - var getStoreInformationOutput = PublishRelay() - var refreshOutput = PublishRelay<[FilteredStores]>() - var locationButtonOutput = PublishRelay() - var locationButtonImageNameOutput = PublishRelay() - var storeInformationViewHeightOutput = PublishRelay() - var summaryToDetailOutput = PublishRelay() - var detailToSummaryOutput = PublishRelay() - var setMarkerOutput = PublishRelay() - var locationAuthorizationStatusDeniedOutput = PublishRelay() - var locationStatusNotDeterminedOutput = PublishRelay() - var locationStatusAuthorizedWhenInUse = PublishRelay() + let getStoreInformationOutput = PublishRelay() + let refreshOutput = PublishRelay<[FilteredStores]>() + let locationButtonOutput = PublishRelay() + let locationButtonImageNameOutput = PublishRelay() + let storeInformationViewHeightOutput = PublishRelay() + let summaryToDetailOutput = PublishRelay() + let detailToSummaryOutput = PublishRelay() + let setMarkerOutput = PublishRelay() + let locationAuthorizationStatusDeniedOutput = PublishRelay() + let locationStatusNotDeterminedOutput = PublishRelay() + let locationStatusAuthorizedWhenInUse = PublishRelay() + let errorAlertOutput = PublishRelay() var dependency: HomeDependency @@ -43,39 +44,39 @@ final class HomeViewModelImpl: HomeViewModel { } func action(input: HomeViewModelInputCase) { - do { - switch input { - case .refresh(let requestLocation): - refresh(requestLocation: requestLocation) - case .filterButtonTapped(let filter): - filterButtonTapped(filter: filter) - case .markerTapped(let tag): - try markerTapped(tag: tag) - case .locationButtonTapped(let locationAuthorizationStatus, let positionMode): - locationButtonTapped(locationAuthorizationStatus: locationAuthorizationStatus, positionMode: positionMode) - case .setStoreInformationOriginalHeight(let height): - setStoreInformationOriginalHeight(height: height) - case .storeInformationViewPanGestureChanged(let height): - storeInformationViewPanGestureChanged(height: height) - case .storeInformationViewPanGestureEnded(let height): - storeInformationViewPanGestureEnded(height: height) - case .storeInformationViewSwipe(let velocity): - storeInformationViewSwipe(velocity: velocity) - case .storeInformationViewTapGestureEnded: - storeInformationViewTapGestureEnded() - case .dimViewTapGestureEnded: - dimViewTapGestureEnded() - case .changeState(let state): - changeState(state: state) - case .setMarker(let store, let certificationType): - setMarker(store: store, certificationType: certificationType) - case .checkLocationAuthorization(let status): - checkLocationAuthorization(status: status) - case .checkLocationAuthorizationWhenCameraDidChange(let status): - checkLocationAuthorizationWhenCameraDidChange(status: status) + switch input { + case .refresh(let requestLocation): + refresh(requestLocation: requestLocation) + case .filterButtonTapped(let filter): + filterButtonTapped(filter: filter) + case .markerTapped(let tag): + do { + try markerTapped(tag: 10) + } catch { + errorAlertOutput.accept("์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.") } - } catch { - print(error.localizedDescription) + case .locationButtonTapped(let locationAuthorizationStatus, let positionMode): + locationButtonTapped(locationAuthorizationStatus: locationAuthorizationStatus, positionMode: positionMode) + case .setStoreInformationOriginalHeight(let height): + setStoreInformationOriginalHeight(height: height) + case .storeInformationViewPanGestureChanged(let height): + storeInformationViewPanGestureChanged(height: height) + case .storeInformationViewPanGestureEnded(let height): + storeInformationViewPanGestureEnded(height: height) + case .storeInformationViewSwipe(let velocity): + storeInformationViewSwipe(velocity: velocity) + case .storeInformationViewTapGestureEnded: + storeInformationViewTapGestureEnded() + case .dimViewTapGestureEnded: + dimViewTapGestureEnded() + case .changeState(let state): + changeState(state: state) + case .setMarker(let store, let certificationType): + setMarker(store: store, certificationType: certificationType) + case .checkLocationAuthorization(let status): + checkLocationAuthorization(status: status) + case .checkLocationAuthorizationWhenCameraDidChange(let status): + checkLocationAuthorizationWhenCameraDidChange(status: status) } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 1a92f997..8244e609 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -63,5 +63,6 @@ protocol HomeViewModelOutput { var locationAuthorizationStatusDeniedOutput: PublishRelay { get } var locationStatusNotDeterminedOutput: PublishRelay { get } var locationStatusAuthorizedWhenInUse: PublishRelay { get } + var errorAlertOutput: PublishRelay { get } } From 6914d328e67d303c04ef97063eff0b597646a42b Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 00:03:47 +0900 Subject: [PATCH 079/231] feat : ErrorAlert Binding (#129) --- KCS/KCS.xcodeproj/project.pbxproj | 4 +++ KCS/KCS/Domain/Entity/ErrorAlertMessage.swift | 24 ++++++++++++++++ .../Home/View/HomeViewController.swift | 26 +++++++++++++---- .../Home/ViewModel/DetailViewModelImpl.swift | 11 ++++---- .../Home/ViewModel/HomeViewModelImpl.swift | 28 +++++++++++-------- .../Home/ViewModel/SummaryViewModelImpl.swift | 13 +++++---- .../ViewModel/protocol/DetailViewModel.swift | 1 + .../ViewModel/protocol/HomeViewModel.swift | 2 +- .../ViewModel/protocol/SummaryViewModel.swift | 1 + 9 files changed, 81 insertions(+), 29 deletions(-) create mode 100644 KCS/KCS/Domain/Entity/ErrorAlertMessage.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 8196a8e2..71035518 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ 592262242B61203000CA5A11 /* DetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262232B61203000CA5A11 /* DetailView.swift */; }; 592262262B61232F00CA5A11 /* DetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262252B61232F00CA5A11 /* DetailViewModel.swift */; }; 592262282B6124C400CA5A11 /* DetailViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */; }; + 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */; }; 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */; }; 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE572B5524D500725C90 /* RefreshButton.swift */; }; 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE5B2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift */; }; @@ -119,6 +120,7 @@ 592262232B61203000CA5A11 /* DetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailView.swift; sourceTree = ""; }; 592262252B61232F00CA5A11 /* DetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewModel.swift; sourceTree = ""; }; 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewModelImpl.swift; sourceTree = ""; }; + 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlertMessage.swift; sourceTree = ""; }; 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewContents.swift; sourceTree = ""; }; 5977BE572B5524D500725C90 /* RefreshButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshButton.swift; sourceTree = ""; }; 5977BE5B2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchRefreshStoresUseCaseImpl.swift; sourceTree = ""; }; @@ -427,6 +429,7 @@ 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */, A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */, A8A7E0612B652F0D00D015E5 /* MarkerContents.swift */, + 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */, ); path = Entity; sourceTree = ""; @@ -802,6 +805,7 @@ A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */, A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */, 5977BE612B55374000725C90 /* HomeViewModel.swift in Sources */, + 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */, A8AE4B1B2B62A60B00632355 /* OpeningHoursCellView.swift in Sources */, A89087042B4E7F3500767225 /* FilterButton.swift in Sources */, 59F478B12B59BB00002FEF9E /* ImageRepositoryError.swift in Sources */, diff --git a/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift b/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift new file mode 100644 index 00000000..83192be2 --- /dev/null +++ b/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift @@ -0,0 +1,24 @@ +// +// ErrorAlertMessage.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/30/24. +// + +import Foundation + +enum ErrorAlertMessage: LocalizedError { + + case server + case data + + var errorDescription: String { + switch self { + case .server: + return "์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์ด ์›ํ™œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค" + case .data: + return "๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค" + } + } + +} diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index b957d255..8a70f3b9 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -420,11 +420,20 @@ private extension HomeViewController { func bindErrorAlert() { viewModel.errorAlertOutput - .bind { [weak self] message in - let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert) - alertController.addAction(UIAlertAction(title: "ํ™•์ธ", style: .default)) - - self?.present(alertController, animated: true) + .bind { [weak self] error in + self?.presentErrorAlert(error: error) + } + .disposed(by: disposeBag) + + summaryInformationViewModel.errorAlertOutput + .bind { [weak self] error in + self?.presentErrorAlert(error: error) + } + .disposed(by: disposeBag) + + detailViewModel.errorAlertOutput + .bind { [weak self] error in + self?.presentErrorAlert(error: error) } .disposed(by: disposeBag) } @@ -518,6 +527,13 @@ private extension HomeViewController { ) } + func presentErrorAlert(error: ErrorAlertMessage) { + let alertController = UIAlertController(title: nil, message: error.errorDescription, preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: "ํ™•์ธ", style: .default)) + + present(alertController, animated: true) + } + } private extension HomeViewController { diff --git a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift index 5063d427..202b4197 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift @@ -15,8 +15,9 @@ final class DetailViewModelImpl: DetailViewModel { let getOpenClosedUseCase: GetOpenClosedUseCase let fetchImageUseCase: FetchImageUseCase - var setUIContentsOutput = PublishRelay() - var thumbnailImageOutput = PublishRelay() + let setUIContentsOutput = PublishRelay() + let thumbnailImageOutput = PublishRelay() + let errorAlertOutput = PublishRelay() init(getOpenClosedUseCase: GetOpenClosedUseCase, fetchImageUseCase: FetchImageUseCase) { self.getOpenClosedUseCase = getOpenClosedUseCase @@ -49,7 +50,7 @@ private extension DetailViewModelImpl { ) ) } catch { - print(error.localizedDescription) + errorAlertOutput.accept(.data) } } @@ -60,8 +61,8 @@ private extension DetailViewModelImpl { onNext: { [weak self] imageData in self?.thumbnailImageOutput.accept(imageData) }, - onError: { error in - print(error.localizedDescription) + onError: { [weak self] _ in + self?.errorAlertOutput.accept(.server) } ) .disposed(by: disposeBag) diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 30e0c4fb..a0adf488 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -27,7 +27,7 @@ final class HomeViewModelImpl: HomeViewModel { let locationAuthorizationStatusDeniedOutput = PublishRelay() let locationStatusNotDeterminedOutput = PublishRelay() let locationStatusAuthorizedWhenInUse = PublishRelay() - let errorAlertOutput = PublishRelay() + let errorAlertOutput = PublishRelay() var dependency: HomeDependency @@ -50,11 +50,7 @@ final class HomeViewModelImpl: HomeViewModel { case .filterButtonTapped(let filter): filterButtonTapped(filter: filter) case .markerTapped(let tag): - do { - try markerTapped(tag: 10) - } catch { - errorAlertOutput.accept("์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.") - } + markerTapped(tag: tag) case .locationButtonTapped(let locationAuthorizationStatus, let positionMode): locationButtonTapped(locationAuthorizationStatus: locationAuthorizationStatus, positionMode: positionMode) case .setStoreInformationOriginalHeight(let height): @@ -95,8 +91,12 @@ private extension HomeViewModelImpl { guard let self = self else { return } applyFilters(stores: stores, filters: getActivatedTypes()) }, - onError: { error in - print(error.localizedDescription) + onError: { [weak self] error in + if error is StoreRepositoryError { + self?.errorAlertOutput.accept(.data) + } else { + self?.errorAlertOutput.accept(.server) + } } ) .disposed(by: dependency.disposeBag) @@ -154,10 +154,14 @@ private extension HomeViewModelImpl { refreshOutput.accept([goodPriceStores, exemplaryStores, safeStores]) } - func markerTapped(tag: UInt) throws { - getStoreInformationOutput.accept( - try getStoreInformationUseCase.execute(tag: tag) - ) + func markerTapped(tag: UInt) { + do { + getStoreInformationOutput.accept( + try getStoreInformationUseCase.execute(tag: tag) + ) + } catch { + errorAlertOutput.accept(.data) + } } func setMarker(store: Store, certificationType: CertificationType) { diff --git a/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift index df28eaf7..f46da113 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift @@ -15,9 +15,10 @@ final class SummaryViewModelImpl: SummaryViewModel { let getOpenClosedUseCase: GetOpenClosedUseCase let fetchImageUseCase: FetchImageUseCase - var setUIContentsOutput = PublishRelay() - var thumbnailImageOutput = PublishRelay() - var callButtonOutput = PublishRelay() + let setUIContentsOutput = PublishRelay() + let thumbnailImageOutput = PublishRelay() + let callButtonOutput = PublishRelay() + let errorAlertOutput = PublishRelay() init(getOpenClosedUseCase: GetOpenClosedUseCase, fetchImageUseCase: FetchImageUseCase) { self.getOpenClosedUseCase = getOpenClosedUseCase @@ -53,7 +54,7 @@ private extension SummaryViewModelImpl { ) ) } catch { - print(error.localizedDescription) + errorAlertOutput.accept(.data) } } @@ -64,8 +65,8 @@ private extension SummaryViewModelImpl { onNext: { [weak self] imageData in self?.thumbnailImageOutput.accept(imageData) }, - onError: { error in - print(error.localizedDescription) + onError: { [weak self] _ in + self?.errorAlertOutput.accept(.server) } ) .disposed(by: disposeBag) diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift index 7de68dbd..540bb5dd 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift @@ -31,5 +31,6 @@ protocol DetailViewModelOutput { var setUIContentsOutput: PublishRelay { get } var thumbnailImageOutput: PublishRelay { get } + var errorAlertOutput: PublishRelay { get } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 8244e609..6832b663 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -63,6 +63,6 @@ protocol HomeViewModelOutput { var locationAuthorizationStatusDeniedOutput: PublishRelay { get } var locationStatusNotDeterminedOutput: PublishRelay { get } var locationStatusAuthorizedWhenInUse: PublishRelay { get } - var errorAlertOutput: PublishRelay { get } + var errorAlertOutput: PublishRelay { get } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift index e90ae9ff..2323a16c 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift @@ -34,5 +34,6 @@ protocol SummaryViewModelOutput { var setUIContentsOutput: PublishRelay { get } var thumbnailImageOutput: PublishRelay { get } var callButtonOutput: PublishRelay { get } + var errorAlertOutput: PublishRelay { get } } From 07c3b18d1c4bb87c01bf885c6a1123262b0f970d Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 01:56:41 +0900 Subject: [PATCH 080/231] =?UTF-8?q?feat=20:=20errorDescription=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20=EB=B0=8F=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20request?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=20=EC=84=A4=EC=A0=95=20(#129)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Repository/ImageRepositoryImpl.swift | 2 +- KCS/KCS/Domain/Entity/ErrorAlertMessage.swift | 4 ++-- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/KCS/KCS/Data/Repository/ImageRepositoryImpl.swift b/KCS/KCS/Data/Repository/ImageRepositoryImpl.swift index 8ad86fb4..449f6327 100644 --- a/KCS/KCS/Data/Repository/ImageRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/ImageRepositoryImpl.swift @@ -28,7 +28,7 @@ struct ImageRepositoryImpl: ImageRepository { .response(completionHandler: { response in switch response.result { case .success(let result): - if let resultData = result { + if let resultData = result, String(data: resultData, encoding: .utf8) == nil { cache.setImageData(resultData as NSData, for: imageURL as NSURL) observer.onNext(resultData) } else { diff --git a/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift b/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift index 83192be2..0dda525f 100644 --- a/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift +++ b/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift @@ -11,8 +11,8 @@ enum ErrorAlertMessage: LocalizedError { case server case data - - var errorDescription: String { + + var errorDescription: String? { switch self { case .server: return "์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์ด ์›ํ™œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค" diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 8a70f3b9..c09bf74c 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -530,10 +530,11 @@ private extension HomeViewController { func presentErrorAlert(error: ErrorAlertMessage) { let alertController = UIAlertController(title: nil, message: error.errorDescription, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "ํ™•์ธ", style: .default)) - - present(alertController, animated: true) + if !(presentedViewController is UIAlertController) { + present(alertController, animated: true) + } } - + } private extension HomeViewController { From c09cf9ad663c82c5f852fb9f1a8b30a4ccf631cc Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 02:00:02 +0900 Subject: [PATCH 081/231] =?UTF-8?q?chore=20:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20(#129)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ---- .../Home/ViewModel/OpeningHourViewModel.swift | 8 -------- 2 files changed, 12 deletions(-) delete mode 100644 KCS/KCS/Presentation/Home/ViewModel/OpeningHourViewModel.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 71035518..eae70a3f 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -91,7 +91,6 @@ A8ACB7ED2B59647400540BD1 /* OpeningHourError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7EC2B59647400540BD1 /* OpeningHourError.swift */; }; A8ACB7EF2B5AEBB900540BD1 /* GetStoreInformationUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7EE2B5AEBB800540BD1 /* GetStoreInformationUseCaseImpl.swift */; }; A8ACB7F12B5AEBE300540BD1 /* GetStoreInformationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7F02B5AEBE300540BD1 /* GetStoreInformationUseCase.swift */; }; - A8AE4B192B62903100632355 /* OpeningHourViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8AE4B182B62903100632355 /* OpeningHourViewModel.swift */; }; A8AE4B1B2B62A60B00632355 /* OpeningHoursCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8AE4B1A2B62A60B00632355 /* OpeningHoursCellView.swift */; }; AE60727C9A543E3D0F3A0279 /* Pods_KCSUnitTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 71A6818C1431365A23C873FB /* Pods_KCSUnitTest.framework */; }; BBE1483137890D1D37D0E308 /* Pods_KCS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A3902FBE673069073F47D82 /* Pods_KCS.framework */; }; @@ -201,7 +200,6 @@ A8ACB7EC2B59647400540BD1 /* OpeningHourError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHourError.swift; sourceTree = ""; }; A8ACB7EE2B5AEBB800540BD1 /* GetStoreInformationUseCaseImpl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetStoreInformationUseCaseImpl.swift; sourceTree = ""; }; A8ACB7F02B5AEBE300540BD1 /* GetStoreInformationUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetStoreInformationUseCase.swift; sourceTree = ""; }; - A8AE4B182B62903100632355 /* OpeningHourViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHourViewModel.swift; sourceTree = ""; }; A8AE4B1A2B62A60B00632355 /* OpeningHoursCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHoursCellView.swift; sourceTree = ""; }; D7B848B1C5D2F1B31C605818 /* Pods-KCSUnitTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KCSUnitTest.debug.xcconfig"; path = "Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -294,7 +292,6 @@ 5977BE672B553C8300725C90 /* HomeDependency.swift */, A8ACB7E12B594F7400540BD1 /* SummaryViewModelImpl.swift */, 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */, - A8AE4B182B62903100632355 /* OpeningHourViewModel.swift */, ); path = ViewModel; sourceTree = ""; @@ -844,7 +841,6 @@ 59C306CB2B50357900862625 /* Router.swift in Sources */, A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, 59C306B62B50027300862625 /* Store.swift in Sources */, - A8AE4B192B62903100632355 /* OpeningHourViewModel.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, A8A7E0622B652F0D00D015E5 /* MarkerContents.swift in Sources */, 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */, diff --git a/KCS/KCS/Presentation/Home/ViewModel/OpeningHourViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/OpeningHourViewModel.swift deleted file mode 100644 index 8bc2d949..00000000 --- a/KCS/KCS/Presentation/Home/ViewModel/OpeningHourViewModel.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// OpeningHourViewModel.swift -// KCS -// -// Created by ๊น€์˜ํ˜„ on 1/25/24. -// - -import Foundation From a4c524c002519594fded90b1f9948a18d509288c Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 02:49:27 +0900 Subject: [PATCH 082/231] =?UTF-8?q?fix=20:=20filter=EC=99=80=20refresh=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=9D=84=20=EB=B6=84=EB=A6=AC=20(#132)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/HomeViewController.swift | 12 ++++++++++-- .../Home/ViewModel/HomeViewModelImpl.swift | 6 ++++-- .../Home/ViewModel/protocol/HomeViewModel.swift | 3 ++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index c09bf74c..7477fc90 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -262,6 +262,7 @@ private extension HomeViewController { func bind() { bindRefresh() + bindApplyFilters() bindSetMarker() bindLocationButton() bindLocationAuthorization() @@ -271,6 +272,15 @@ private extension HomeViewController { func bindRefresh() { viewModel.refreshOutput + .bind { [weak self] _ in + self?.refreshButton.animationInvalidate() + self?.storeInformationViewDismiss() + } + .disposed(by: disposeBag) + } + + func bindApplyFilters() { + viewModel.applyFiltersOutput .bind { [weak self] filteredStores in guard let self = self else { return } self.markers.forEach { $0.mapView = nil } @@ -284,8 +294,6 @@ private extension HomeViewController { ) } } - refreshButton.animationInvalidate() - storeInformationViewDismiss() } .disposed(by: disposeBag) } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index a0adf488..d8b26270 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -17,7 +17,7 @@ final class HomeViewModelImpl: HomeViewModel { let getStoreInformationUseCase: GetStoreInformationUseCase let getStoreInformationOutput = PublishRelay() - let refreshOutput = PublishRelay<[FilteredStores]>() + let refreshOutput = PublishRelay() let locationButtonOutput = PublishRelay() let locationButtonImageNameOutput = PublishRelay() let storeInformationViewHeightOutput = PublishRelay() @@ -28,6 +28,7 @@ final class HomeViewModelImpl: HomeViewModel { let locationStatusNotDeterminedOutput = PublishRelay() let locationStatusAuthorizedWhenInUse = PublishRelay() let errorAlertOutput = PublishRelay() + let applyFiltersOutput = PublishRelay<[FilteredStores]>() var dependency: HomeDependency @@ -90,6 +91,7 @@ private extension HomeViewModelImpl { onNext: { [weak self] stores in guard let self = self else { return } applyFilters(stores: stores, filters: getActivatedTypes()) + refreshOutput.accept(()) }, onError: { [weak self] error in if error is StoreRepositoryError { @@ -151,7 +153,7 @@ private extension HomeViewModelImpl { } } } - refreshOutput.accept([goodPriceStores, exemplaryStores, safeStores]) + applyFiltersOutput.accept([goodPriceStores, exemplaryStores, safeStores]) } func markerTapped(tag: UInt) { diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 6832b663..7a28c2bf 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -53,7 +53,8 @@ protocol HomeViewModelInput { protocol HomeViewModelOutput { var getStoreInformationOutput: PublishRelay { get } - var refreshOutput: PublishRelay<[FilteredStores]> { get } + var refreshOutput: PublishRelay { get } + var applyFiltersOutput: PublishRelay<[FilteredStores]> { get } var locationButtonOutput: PublishRelay { get } var locationButtonImageNameOutput: PublishRelay { get } var storeInformationViewHeightOutput: PublishRelay { get } From 2e5b69b879252f94a1b4b774c6caf700740f0da6 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 31 Jan 2024 03:24:49 +0900 Subject: [PATCH 083/231] =?UTF-8?q?fix=20:=20store=20title=20trailing=20co?= =?UTF-8?q?nstraints=20=EC=84=A4=EC=A0=95=20=EB=B0=8F=20figma=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EA=B2=8C=20=ED=8F=B0=ED=8A=B8=20size=20=EB=B0=8F=20co?= =?UTF-8?q?nstraint=20=EC=88=98=EC=A0=95=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/CertificationLabel.swift | 7 ++----- KCS/KCS/Presentation/Home/View/DetailView.swift | 11 ++++++----- .../Home/View/SummaryInformationView.swift | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/CertificationLabel.swift b/KCS/KCS/Presentation/Home/View/CertificationLabel.swift index 49c530b3..b9bc1a79 100644 --- a/KCS/KCS/Presentation/Home/View/CertificationLabel.swift +++ b/KCS/KCS/Presentation/Home/View/CertificationLabel.swift @@ -11,21 +11,18 @@ final class CertificationLabel: UIView { private let certificationType: CertificationType - private let fontSize: CGFloat - private lazy var certificationLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false - label.font = UIFont.pretendard(size: fontSize, weight: .medium) + label.font = UIFont.pretendard(size: 9, weight: .medium) label.textColor = UIColor.grayLabel label.text = certificationType.description return label }() - init(certificationType: CertificationType, fontSize: CGFloat) { + init(certificationType: CertificationType) { self.certificationType = certificationType - self.fontSize = fontSize super.init(frame: .zero) setBackgroundColor() diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 3184c3f7..21b4adca 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -16,7 +16,7 @@ final class DetailView: UIView { private lazy var storeTitle: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false - label.font = UIFont.pretendard(size: 24, weight: .bold) + label.font = UIFont.pretendard(size: 22, weight: .bold) label.textColor = UIColor.primary2 label.numberOfLines = 2 @@ -175,7 +175,7 @@ private extension DetailView { category.text = detailViewContents.category detailViewContents.certificationTypes .map({ - CertificationLabel(certificationType: $0, fontSize: 11) + CertificationLabel(certificationType: $0) }) .forEach { [weak self] in self?.certificationStackView.addArrangedSubview($0) @@ -241,16 +241,17 @@ private extension DetailView { func storeRepresentConstraints() { NSLayoutConstraint.activate([ storeTitle.topAnchor.constraint(equalTo: topAnchor, constant: 27), - storeTitle.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16) + storeTitle.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + storeTitle.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16) ]) NSLayoutConstraint.activate([ - category.topAnchor.constraint(equalTo: storeTitle.bottomAnchor, constant: 8), + category.topAnchor.constraint(equalTo: storeTitle.bottomAnchor, constant: 4), category.leadingAnchor.constraint(equalTo: storeTitle.leadingAnchor) ]) NSLayoutConstraint.activate([ - certificationStackView.topAnchor.constraint(equalTo: category.bottomAnchor, constant: 11), + certificationStackView.topAnchor.constraint(equalTo: category.bottomAnchor, constant: 9), certificationStackView.leadingAnchor.constraint(equalTo: storeTitle.leadingAnchor) ]) diff --git a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift index b042be70..5cc84ad7 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift @@ -131,7 +131,7 @@ private extension SummaryInformationView { category.text = contents.category contents.certificationTypes .map({ - CertificationLabel(certificationType: $0, fontSize: 9) + CertificationLabel(certificationType: $0) }) .forEach { [weak self] in self?.certificationStackView.addArrangedSubview($0) From 9be13d2f8b2b64ffd34d6c40041e5283233daea0 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 31 Jan 2024 03:41:04 +0900 Subject: [PATCH 084/231] =?UTF-8?q?fix=20:=20=EB=A7=88=EC=BB=A4=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EC=98=A4=EB=A5=98=20=EC=9D=B4=EC=8A=88=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/Marker.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/Marker.swift b/KCS/KCS/Presentation/Home/View/Marker.swift index b0f4b760..8301e5e5 100644 --- a/KCS/KCS/Presentation/Home/View/Marker.swift +++ b/KCS/KCS/Presentation/Home/View/Marker.swift @@ -11,7 +11,7 @@ import RxSwift final class Marker: NMFMarker { - private lazy var unselectedGlobalZIndex: Int = self.globalZIndex + private var unselectedGlobalZIndex: Int? private let selectImage: NMFOverlayImage private let deselectImage: NMFOverlayImage @@ -19,6 +19,7 @@ final class Marker: NMFMarker { self.selectImage = NMFOverlayImage(image: selectImage) self.deselectImage = NMFOverlayImage(image: deselectImage) super.init() + self.unselectedGlobalZIndex = globalZIndex if let position = position { self.position = position } @@ -36,7 +37,8 @@ extension Marker { func deselect() { self.iconImage = deselectImage - self.globalZIndex = unselectedGlobalZIndex + guard let zIndex = unselectedGlobalZIndex else { return } + self.globalZIndex = zIndex } } From bb3a808af84fae075b0d84071c9a16361231c733 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 11:06:57 +0900 Subject: [PATCH 085/231] =?UTF-8?q?build=20:=20version=202.0=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index eae70a3f..b8e49996 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -1035,6 +1035,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = KCS/Resource/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "๋‚˜์ธ๊ฐ€"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.lifestyle"; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "์‚ฌ์šฉ์ž์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; @@ -1045,7 +1046,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 2.0; PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -1070,6 +1071,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = KCS/Resource/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "๋‚˜์ธ๊ฐ€"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.lifestyle"; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "์‚ฌ์šฉ์ž์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; @@ -1080,7 +1082,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 2.0; PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; From 9831e7fb7ccbcc259b5efd12d222425a40e94bc2 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 11:10:16 +0900 Subject: [PATCH 086/231] =?UTF-8?q?build=20:=20base=20URL=20product?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Network/StoreAPI.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 93658693..018a4faa 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -20,7 +20,7 @@ extension StoreAPI: Router, URLRequestConvertible { var baseURL: String? { switch self { case .getStores: - return getURL(type: .develop) + return getURL(type: .product) case .getImage(let url): return url } From f24a0ddebd22aad21f69e0036fa2e899bbd6ff57 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 11:25:20 +0900 Subject: [PATCH 087/231] =?UTF-8?q?build=20:=20Firebase=20Analytics,=20Cra?= =?UTF-8?q?shlytics=20=EC=B6=94=EA=B0=80=20(#137)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/GoogleService-Info.plist | 30 +++++++ KCS/KCS.xcodeproj/project.pbxproj | 4 + KCS/Podfile | 2 + KCS/Podfile.lock | 140 +++++++++++++++++++++++++++++- 4 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 KCS/GoogleService-Info.plist diff --git a/KCS/GoogleService-Info.plist b/KCS/GoogleService-Info.plist new file mode 100644 index 00000000..776fe7cf --- /dev/null +++ b/KCS/GoogleService-Info.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyAHg3iyzwXwUd3TpKqM7jpl-EZaXUmiqHw + GCM_SENDER_ID + 127350323526 + PLIST_VERSION + 1 + BUNDLE_ID + com.kcs.nainga + PROJECT_ID + korea-certified-stores + STORAGE_BUCKET + korea-certified-stores.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:127350323526:ios:15feb5ff2ff45f42448d47 + + \ No newline at end of file diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index eae70a3f..98ccc6c9 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -52,6 +52,7 @@ 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306CE2B50399C00862625 /* RequestLocationDTO.swift */; }; 59C306D82B50650D00862625 /* Encodable+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306D72B50650D00862625 /* Encodable+.swift */; }; 59C306DC2B506F3D00862625 /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306DB2B506F3D00862625 /* NetworkError.swift */; }; + 59EC53802B69E5E2004DB2F9 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 59EC537F2B69E5E2004DB2F9 /* GoogleService-Info.plist */; }; 59F478B12B59BB00002FEF9E /* ImageRepositoryError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F478B02B59BB00002FEF9E /* ImageRepositoryError.swift */; }; 59F478B32B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F478B22B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift */; }; 59F478B52B59BE0B002FEF9E /* FetchImageUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F478B42B59BE0B002FEF9E /* FetchImageUseCase.swift */; }; @@ -157,6 +158,7 @@ 59C306CE2B50399C00862625 /* RequestLocationDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestLocationDTO.swift; sourceTree = ""; }; 59C306D72B50650D00862625 /* Encodable+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Encodable+.swift"; sourceTree = ""; }; 59C306DB2B506F3D00862625 /* NetworkError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkError.swift; sourceTree = ""; }; + 59EC537F2B69E5E2004DB2F9 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 59F478B02B59BB00002FEF9E /* ImageRepositoryError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRepositoryError.swift; sourceTree = ""; }; 59F478B22B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchImageUseCaseImpl.swift; sourceTree = ""; }; 59F478B42B59BE0B002FEF9E /* FetchImageUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchImageUseCase.swift; sourceTree = ""; }; @@ -229,6 +231,7 @@ children = ( 5986DCE82B390A8D005AE43B /* Secret.xcconfig */, 59053D0A2B3889A200D190CC /* .swiftlint.yml */, + 59EC537F2B69E5E2004DB2F9 /* GoogleService-Info.plist */, 591A887B2B384E600059E40F /* KCS */, 5977BE8B2B5966F900725C90 /* KCSUnitTest */, 591A887A2B384E600059E40F /* Products */, @@ -680,6 +683,7 @@ 591A88862B384E610059E40F /* Assets.xcassets in Resources */, A81EFBC72B5D597400D0C0D7 /* Pretendard-Bold.ttf in Resources */, A81EFBC12B5D597400D0C0D7 /* Pretendard-Black.ttf in Resources */, + 59EC53802B69E5E2004DB2F9 /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/KCS/Podfile b/KCS/Podfile index 39029484..ff491dcd 100644 --- a/KCS/Podfile +++ b/KCS/Podfile @@ -14,6 +14,8 @@ target 'KCS' do pod 'Alamofire' pod 'SwiftLint' pod 'NMapsMap' + pod 'Firebase/Analytics' + pod 'Firebase/Crashlytics' post_install do |installer| installer.pods_project.targets.each do |target| diff --git a/KCS/Podfile.lock b/KCS/Podfile.lock index 0f242d65..e5af22a1 100644 --- a/KCS/Podfile.lock +++ b/KCS/Podfile.lock @@ -1,8 +1,116 @@ PODS: - Alamofire (5.8.1) + - Firebase/Analytics (10.20.0): + - Firebase/Core + - Firebase/Core (10.20.0): + - Firebase/CoreOnly + - FirebaseAnalytics (~> 10.20.0) + - Firebase/CoreOnly (10.20.0): + - FirebaseCore (= 10.20.0) + - Firebase/Crashlytics (10.20.0): + - Firebase/CoreOnly + - FirebaseCrashlytics (~> 10.20.0) + - FirebaseAnalytics (10.20.0): + - FirebaseAnalytics/AdIdSupport (= 10.20.0) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseAnalytics/AdIdSupport (10.20.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleAppMeasurement (= 10.20.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseCore (10.20.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.12) + - GoogleUtilities/Logger (~> 7.12) + - FirebaseCoreExtension (10.20.0): + - FirebaseCore (~> 10.0) + - FirebaseCoreInternal (10.20.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseCrashlytics (10.20.0): + - FirebaseCore (~> 10.5) + - FirebaseInstallations (~> 10.0) + - FirebaseSessions (~> 10.5) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/Environment (~> 7.8) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (~> 2.1) + - FirebaseInstallations (10.20.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - FirebaseSessions (10.20.0): + - FirebaseCore (~> 10.5) + - FirebaseCoreExtension (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/Environment (~> 7.10) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesSwift (~> 2.1) + - GoogleAppMeasurement (10.20.0): + - GoogleAppMeasurement/AdIdSupport (= 10.20.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (10.20.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.20.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (10.20.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleDataTransport (9.3.0): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/AppDelegateSwizzler (7.12.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.12.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.12.0): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (7.12.0): + - GoogleUtilities/Logger + - GoogleUtilities/Network (7.12.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.12.0)" + - GoogleUtilities/Reachability (7.12.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (7.12.0): + - GoogleUtilities/Logger + - nanopb (2.30909.1): + - nanopb/decode (= 2.30909.1) + - nanopb/encode (= 2.30909.1) + - nanopb/decode (2.30909.1) + - nanopb/encode (2.30909.1) - NMapsGeometry (1.0.1) - NMapsMap (3.17.0): - NMapsGeometry + - PromisesObjC (2.3.1) + - PromisesSwift (2.3.1): + - PromisesObjC (= 2.3.1) - RxBlocking (6.6.0): - RxSwift (= 6.6.0) - RxCocoa (6.6.0): @@ -20,6 +128,8 @@ PODS: DEPENDENCIES: - Alamofire + - Firebase/Analytics + - Firebase/Crashlytics - NMapsMap - RxBlocking - RxCocoa (= 6.6.0) @@ -31,8 +141,22 @@ DEPENDENCIES: SPEC REPOS: trunk: - Alamofire + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseCrashlytics + - FirebaseInstallations + - FirebaseSessions + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleUtilities + - nanopb - NMapsGeometry - NMapsMap + - PromisesObjC + - PromisesSwift - RxBlocking - RxCocoa - RxGesture @@ -43,8 +167,22 @@ SPEC REPOS: SPEC CHECKSUMS: Alamofire: 3ca42e259043ee0dc5c0cdd76c4bc568b8e42af7 + Firebase: 10c8cb12fb7ad2ae0c09ffc86cd9c1ab392a0031 + FirebaseAnalytics: a2731bf3670747ce8f65368b118d18aa8e368246 + FirebaseCore: 28045c1560a2600d284b9c45a904fe322dc890b6 + FirebaseCoreExtension: 0659f035b88c5a7a15a9763c48c2e6ca8c0a2977 + FirebaseCoreInternal: efeeb171ac02d623bdaefe121539939821e10811 + FirebaseCrashlytics: 81530595edb6d99f1918f723a6c33766a24a4c86 + FirebaseInstallations: 558b1da7d65afeb996fd5c814332f013234ece4e + FirebaseSessions: 2f348975f6d1c139231c180e12194161da2e0cd6 + GoogleAppMeasurement: bb3c564c3efb933136af0e94899e0a46167466a8 + GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe + GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 + nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 NMapsGeometry: 53c573ead66466681cf123f99f698dc8071a4b83 NMapsMap: a5b909a31b6f3d27a670f6eb2ddc913c38975474 + PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 + PromisesSwift: 28dca69a9c40779916ac2d6985a0192a5cb4a265 RxBlocking: fbd1f8501443024f686e556f36dac79b0d5f4d7c RxCocoa: 44a80de90e25b739b5aeaae3c8c371a32e3343cc RxGesture: f3efb47ed2d26a8082f7b660d4a59970e275a7f8 @@ -53,6 +191,6 @@ SPEC CHECKSUMS: RxTest: a23f26bb53a5e146a0a69db4f0fa0b69001ce7f4 SwiftLint: c1de071d9d08c8aba837545f6254315bc900e211 -PODFILE CHECKSUM: 529859231e49f63fa881147a916b977cb8f574df +PODFILE CHECKSUM: a5566a18764ef703abc0265b00efa39f0938cc7c COCOAPODS: 1.14.3 From de3635d1c10d53d786449dfe650db9636359007d Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 12:11:43 +0900 Subject: [PATCH 088/231] =?UTF-8?q?fix=20:=20CocoaPods=20=EC=A0=84?= =?UTF-8?q?=EC=9A=A9=20RunScript=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?=EC=BD=98=EC=86=94=20=ED=99=95=EC=9D=B8=20(#137)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 34 +++++++++++++++++-- .../xcshareddata/xcschemes/KCS.xcscheme | 6 ++++ KCS/KCS/Application/AppDelegate.swift | 3 +- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 98ccc6c9..b1aafc66 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -595,8 +595,9 @@ 591A88752B384E600059E40F /* Sources */, 591A88762B384E600059E40F /* Frameworks */, 591A88772B384E600059E40F /* Resources */, - 591A88902B3884930059E40F /* Run Script */, + 591A88902B3884930059E40F /* SwiftLint Run Script */, C9DF99EE5FF9433DE46D74ED /* [CP] Embed Pods Frameworks */, + 59B886232B69EE17005750EF /* ShellScript */, ); buildRules = ( ); @@ -736,7 +737,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KCSUnitTest/Pods-KCSUnitTest-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 591A88902B3884930059E40F /* Run Script */ = { + 591A88902B3884930059E40F /* SwiftLint Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; @@ -746,7 +747,7 @@ ); inputPaths = ( ); - name = "Run Script"; + name = "SwiftLint Run Script"; outputFileListPaths = ( ); outputPaths = ( @@ -755,6 +756,28 @@ shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/SwiftLint/swiftlint\"\n"; }; + 59B886232B69EE17005750EF /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist", + "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)", + "$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist", + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/FirebaseCrashlytics/run\"\n"; + }; A73C3D34B606A83DF89A57DD /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1032,8 +1055,10 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 7CQAR4CYZX; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1052,6 +1077,7 @@ MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -1067,6 +1093,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 7CQAR4CYZX; @@ -1087,6 +1114,7 @@ MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; diff --git a/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme b/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme index 5ff40d72..7f1e1c62 100644 --- a/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme +++ b/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme @@ -62,6 +62,12 @@ ReferencedContainer = "container:KCS.xcodeproj"> + + + + Bool { - // Override point for customization after application launch. if let id = Bundle.main.object(forInfoDictionaryKey: "NMAP_CLIENT_ID") as? String { NMFAuthManager.shared().clientId = id } + FirebaseApp.configure() return true } From a27bb5704c2aae412d8ae51d3c15e4f8eb0e9cd1 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 12:14:27 +0900 Subject: [PATCH 089/231] =?UTF-8?q?build=20:=20App=20Version=202.0?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20(#137)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index b1aafc66..98bb7558 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -1074,7 +1074,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 2.0; PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1111,7 +1111,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 2.0; PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; From e40ebc8745eca97c7866712acb373a566a9a8635 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 17:21:16 +0900 Subject: [PATCH 090/231] =?UTF-8?q?chore=20:=20StoreViewController=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 12 ++++++++++++ .../StoreList/StoreListViewController.swift | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 KCS/KCS/Presentation/StoreList/StoreListViewController.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 98bb7558..fdd42371 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -34,6 +34,7 @@ 598CC4D82B5D2E3C0043D064 /* FetchRefreshStoresUseCaseImplTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 598CC4D72B5D2E3C0043D064 /* FetchRefreshStoresUseCaseImplTests.swift */; }; 598CC4DB2B5D344C0043D064 /* MockSuccessStoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 598CC4DA2B5D344C0043D064 /* MockSuccessStoreRepository.swift */; }; 598CC4DD2B5D44940043D064 /* MockFailStoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 598CC4DC2B5D44940043D064 /* MockFailStoreRepository.swift */; }; + 59B886262B6A3A02005750EF /* StoreListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886252B6A3A02005750EF /* StoreListViewController.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -140,6 +141,7 @@ 598CC4D72B5D2E3C0043D064 /* FetchRefreshStoresUseCaseImplTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchRefreshStoresUseCaseImplTests.swift; sourceTree = ""; }; 598CC4DA2B5D344C0043D064 /* MockSuccessStoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSuccessStoreRepository.swift; sourceTree = ""; }; 598CC4DC2B5D44940043D064 /* MockFailStoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFailStoreRepository.swift; sourceTree = ""; }; + 59B886252B6A3A02005750EF /* StoreListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewController.swift; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -356,6 +358,7 @@ 5986DCDF2B3892EB005AE43B /* Presentation */ = { isa = PBXGroup; children = ( + 59B886242B6A39E9005750EF /* StoreList */, A890870B2B4EF8F900767225 /* Extension */, 5986DCEA2B392996005AE43B /* Home */, ); @@ -404,6 +407,14 @@ path = MockRepository; sourceTree = ""; }; + 59B886242B6A39E9005750EF /* StoreList */ = { + isa = PBXGroup; + children = ( + 59B886252B6A3A02005750EF /* StoreListViewController.swift */, + ); + path = StoreList; + sourceTree = ""; + }; 59C306A72B4FF98600862625 /* Repository */ = { isa = PBXGroup; children = ( @@ -828,6 +839,7 @@ 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */, A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */, A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */, + 59B886262B6A3A02005750EF /* StoreListViewController.swift in Sources */, 5977BE612B55374000725C90 /* HomeViewModel.swift in Sources */, 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */, A8AE4B1B2B62A60B00632355 /* OpeningHoursCellView.swift in Sources */, diff --git a/KCS/KCS/Presentation/StoreList/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/StoreListViewController.swift new file mode 100644 index 00000000..a68a30d6 --- /dev/null +++ b/KCS/KCS/Presentation/StoreList/StoreListViewController.swift @@ -0,0 +1,17 @@ +// +// StoreListViewController.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/31/24. +// + +import UIKit + +final class StoreListViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + } + +} From ca3a61f641df8153ef90ee230c8940d6577744a3 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 17:48:50 +0900 Subject: [PATCH 091/231] =?UTF-8?q?feat=20:=20UITableView=20extension?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20identifier=20=EA=B5=AC=ED=98=84=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 20 +++++++++++++++++-- .../UITableViewCell+Identifier.swift | 16 +++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 KCS/KCS/Presentation/Extension/UITableViewCell+Identifier.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index fdd42371..80f9afe6 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -35,6 +35,8 @@ 598CC4DB2B5D344C0043D064 /* MockSuccessStoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 598CC4DA2B5D344C0043D064 /* MockSuccessStoreRepository.swift */; }; 598CC4DD2B5D44940043D064 /* MockFailStoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 598CC4DC2B5D44940043D064 /* MockFailStoreRepository.swift */; }; 59B886262B6A3A02005750EF /* StoreListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886252B6A3A02005750EF /* StoreListViewController.swift */; }; + 59B886292B6A3F1E005750EF /* StoreTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886282B6A3F1E005750EF /* StoreTableViewCell.swift */; }; + 59B8862B2B6A3F7F005750EF /* UITableViewCell+Identifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -142,6 +144,8 @@ 598CC4DA2B5D344C0043D064 /* MockSuccessStoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSuccessStoreRepository.swift; sourceTree = ""; }; 598CC4DC2B5D44940043D064 /* MockFailStoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFailStoreRepository.swift; sourceTree = ""; }; 59B886252B6A3A02005750EF /* StoreListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewController.swift; sourceTree = ""; }; + 59B886282B6A3F1E005750EF /* StoreTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreTableViewCell.swift; sourceTree = ""; }; + 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableViewCell+Identifier.swift"; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -358,9 +362,9 @@ 5986DCDF2B3892EB005AE43B /* Presentation */ = { isa = PBXGroup; children = ( - 59B886242B6A39E9005750EF /* StoreList */, A890870B2B4EF8F900767225 /* Extension */, 5986DCEA2B392996005AE43B /* Home */, + 59B886242B6A39E9005750EF /* StoreList */, ); path = Presentation; sourceTree = ""; @@ -410,11 +414,20 @@ 59B886242B6A39E9005750EF /* StoreList */ = { isa = PBXGroup; children = ( - 59B886252B6A3A02005750EF /* StoreListViewController.swift */, + 59B886272B6A3AF0005750EF /* View */, ); path = StoreList; sourceTree = ""; }; + 59B886272B6A3AF0005750EF /* View */ = { + isa = PBXGroup; + children = ( + 59B886252B6A3A02005750EF /* StoreListViewController.swift */, + 59B886282B6A3F1E005750EF /* StoreTableViewCell.swift */, + ); + path = View; + sourceTree = ""; + }; 59C306A72B4FF98600862625 /* Repository */ = { isa = PBXGroup; children = ( @@ -525,6 +538,7 @@ A81EFBB42B5D477600D0C0D7 /* UILabel+.swift */, A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */, A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */, + 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */, ); path = Extension; sourceTree = ""; @@ -867,8 +881,10 @@ A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */, 5977BE9E2B59ACE800725C90 /* ImageCache.swift in Sources */, 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */, + 59B8862B2B6A3F7F005750EF /* UITableViewCell+Identifier.swift in Sources */, A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */, 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, + 59B886292B6A3F1E005750EF /* StoreTableViewCell.swift in Sources */, 592262242B61203000CA5A11 /* DetailView.swift in Sources */, A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, diff --git a/KCS/KCS/Presentation/Extension/UITableViewCell+Identifier.swift b/KCS/KCS/Presentation/Extension/UITableViewCell+Identifier.swift new file mode 100644 index 00000000..868afd19 --- /dev/null +++ b/KCS/KCS/Presentation/Extension/UITableViewCell+Identifier.swift @@ -0,0 +1,16 @@ +// +// UITableViewCell+Identifier.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/31/24. +// + +import UIKit + +extension UITableViewCell { + + static var identifier: String { + return String(describing: self) + } + +} From f318f932e583038a57951c2363a46b613c6c2abd Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 17:49:22 +0900 Subject: [PATCH 092/231] =?UTF-8?q?feat=20:=20storeTableView=EC=9D=98=20da?= =?UTF-8?q?taSource=20=EC=84=A4=EC=A0=95=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StoreList/StoreListViewController.swift | 17 ----- .../View/StoreListViewController.swift | 67 +++++++++++++++++++ .../StoreList/View/StoreTableViewCell.swift | 28 ++++++++ 3 files changed, 95 insertions(+), 17 deletions(-) delete mode 100644 KCS/KCS/Presentation/StoreList/StoreListViewController.swift create mode 100644 KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift create mode 100644 KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift diff --git a/KCS/KCS/Presentation/StoreList/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/StoreListViewController.swift deleted file mode 100644 index a68a30d6..00000000 --- a/KCS/KCS/Presentation/StoreList/StoreListViewController.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// StoreListViewController.swift -// KCS -// -// Created by ์กฐ์„ฑ๋ฏผ on 1/31/24. -// - -import UIKit - -final class StoreListViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - } - -} diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift new file mode 100644 index 00000000..75df3a29 --- /dev/null +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -0,0 +1,67 @@ +// +// StoreListViewController.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/31/24. +// + +import UIKit + +final class StoreListViewController: UIViewController { + + private let storeTableView: UITableView = { + let tableView = UITableView() + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.rowHeight = 109 + + return tableView + }() + + enum Section { + case store + } + + private lazy var dataSource: UITableViewDiffableDataSource = { + return UITableViewDiffableDataSource(tableView: storeTableView) { (tableView, indexPath, store) in + guard let cell = tableView.dequeueReusableCell( + withIdentifier: StoreTableViewCell.identifier, + for: indexPath + ) as? StoreTableViewCell else { + return StoreTableViewCell() + } + cell.setUIContents(store: store) + + return cell + } + }() + + override func viewDidLoad() { + super.viewDidLoad() + + addUIComponents() + configureConstraints() + bind() + } + +} + +private extension StoreListViewController { + + func addUIComponents() { + view.addSubview(storeTableView) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + storeTableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + storeTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + storeTableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + storeTableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor) + ]) + } + + func bind() { + + } + +} diff --git a/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift b/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift new file mode 100644 index 00000000..5540cfbe --- /dev/null +++ b/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift @@ -0,0 +1,28 @@ +// +// StoreTableViewCell.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/31/24. +// + +import UIKit + +final class StoreTableViewCell: UITableViewCell { + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension StoreTableViewCell { + + func setUIContents(store: Store) { + + } + +} From 2a44561841dac67dc84166bda55fc18c41eb3c2b Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 19:50:16 +0900 Subject: [PATCH 093/231] =?UTF-8?q?feat=20:=20StoreViewModel=20=ED=8B=80?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 24 +++++++++++++++++ .../Protocol/StoreListViewModel.swift | 26 +++++++++++++++++++ .../ViewModel/StoreListViewModelImpl.swift | 18 +++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift create mode 100644 KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 80f9afe6..ecf5d890 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -37,6 +37,8 @@ 59B886262B6A3A02005750EF /* StoreListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886252B6A3A02005750EF /* StoreListViewController.swift */; }; 59B886292B6A3F1E005750EF /* StoreTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886282B6A3F1E005750EF /* StoreTableViewCell.swift */; }; 59B8862B2B6A3F7F005750EF /* UITableViewCell+Identifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */; }; + 59B886462B6A5CDC005750EF /* StoreListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */; }; + 59B886482B6A5CE9005750EF /* StoreListViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -146,6 +148,8 @@ 59B886252B6A3A02005750EF /* StoreListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewController.swift; sourceTree = ""; }; 59B886282B6A3F1E005750EF /* StoreTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreTableViewCell.swift; sourceTree = ""; }; 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableViewCell+Identifier.swift"; sourceTree = ""; }; + 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewModel.swift; sourceTree = ""; }; + 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewModelImpl.swift; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -414,6 +418,7 @@ 59B886242B6A39E9005750EF /* StoreList */ = { isa = PBXGroup; children = ( + 59B886432B6A5CB6005750EF /* ViewModel */, 59B886272B6A3AF0005750EF /* View */, ); path = StoreList; @@ -428,6 +433,23 @@ path = View; sourceTree = ""; }; + 59B886432B6A5CB6005750EF /* ViewModel */ = { + isa = PBXGroup; + children = ( + 59B886442B6A5CB6005750EF /* Protocol */, + 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 59B886442B6A5CB6005750EF /* Protocol */ = { + isa = PBXGroup; + children = ( + 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */, + ); + path = Protocol; + sourceTree = ""; + }; 59C306A72B4FF98600862625 /* Repository */ = { isa = PBXGroup; children = ( @@ -849,6 +871,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 59B886482B6A5CE9005750EF /* StoreListViewModelImpl.swift in Sources */, A81EFBB52B5D477600D0C0D7 /* UILabel+.swift in Sources */, 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */, A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */, @@ -882,6 +905,7 @@ 5977BE9E2B59ACE800725C90 /* ImageCache.swift in Sources */, 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */, 59B8862B2B6A3F7F005750EF /* UITableViewCell+Identifier.swift in Sources */, + 59B886462B6A5CDC005750EF /* StoreListViewModel.swift in Sources */, A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */, 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, 59B886292B6A3F1E005750EF /* StoreTableViewCell.swift in Sources */, diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift b/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift new file mode 100644 index 00000000..dcab5a66 --- /dev/null +++ b/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift @@ -0,0 +1,26 @@ +// +// StoreListViewModel.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/31/24. +// + +import Foundation + +protocol StoreListViewModel: StoreListViewModelInput, StoreListViewModelOutput { + +} + +protocol StoreListViewModelInput { + + func action(input: StoreListViewModelInputCase) + +} + +enum StoreListViewModelInputCase { + +} + +protocol StoreListViewModelOutput { + +} diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift b/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift new file mode 100644 index 00000000..a1891413 --- /dev/null +++ b/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift @@ -0,0 +1,18 @@ +// +// StoreListViewModelImpl.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/31/24. +// + +import Foundation + +final class StoreListViewModelImpl: StoreListViewModel { + + func action(input: StoreListViewModelInputCase) { + switch input { + + } + } + +} From 27f5e4166106a36f37d72253726dc57e82127012 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 21:14:11 +0900 Subject: [PATCH 094/231] =?UTF-8?q?feat=20:=20Fetch=20Count=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=ED=9B=84=20StoreListViewController=EC=97=90=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 3 ++- .../Data/Repository/StoreRepositoryImpl.swift | 20 +++++++++++-------- .../Repository/StoreRepository.swift | 2 +- .../UseCase/FetchStoresUseCase.swift | 2 +- .../UseCase/FetchStoresUseCaseImpl.swift | 4 ++-- .../Home/View/HomeViewController.swift | 11 ++++++++-- .../Home/ViewModel/HomeViewModelImpl.swift | 2 +- .../View/StoreListViewController.swift | 7 +++++++ 8 files changed, 35 insertions(+), 16 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 2769c21a..c45e2e5c 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -34,7 +34,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { detailViewModel: DetailViewModelImpl( getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) - ) + ), + storeListViewController: StoreListViewController() ) window?.makeKeyAndVisible() } diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 6911f8ae..908f1013 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -10,9 +10,9 @@ import Alamofire final class StoreRepositoryImpl: StoreRepository { - private var stores: [Store] + private var stores: [[Store]] - init(stores: [Store] = []) { + init(stores: [[Store]] = []) { self.stores = stores } @@ -33,10 +33,10 @@ final class StoreRepositoryImpl: StoreRepository { .responseDecodable(of: StoreResponse.self) { [weak self] response in do { switch response.result { - case .success(let result): + case .success(let result): // ํ˜„์žฌ๋Š” 1์ฐจ์› ๋ฐฐ์—ด๋กœ ์˜จ๋‹ค let resultStores = try result.data.map { try $0.toEntity() } - self?.stores = resultStores - observer.onNext(resultStores) + self?.stores = [resultStores] // 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์˜ฌ ๊ฒฝ์šฐ stores๋ฅผ ์ „์ฒด๋กœ ์ดˆ๊ธฐํ™” ํ•ด์•ผํ•จ + observer.onNext(resultStores) // ๊ทธ ํ›„์— 5๊ฐœ์ค‘ ์ฒซ ์ธ๋ฑ์Šค์˜ stores๋ฅผ ๋ณด๋‚ด์ค˜์•ผ ํ•จ case .failure(let error): throw error } @@ -48,14 +48,18 @@ final class StoreRepositoryImpl: StoreRepository { } } - func fetchStores() -> [Store] { - return stores + func fetchStores(count: Int) -> [Store] { + var fetchResult: [Store] = [] + for index in 0.. Store { - guard let store = stores.first(where: { $0.id == tag }) else { throw StoreRepositoryError.wrongStoreId } + guard let store = stores.flatMap({ $0 }).first(where: { $0.id == tag }) else { throw StoreRepositoryError.wrongStoreId } return store } diff --git a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift index 3d548781..1bc7ffd2 100644 --- a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift +++ b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift @@ -13,7 +13,7 @@ protocol StoreRepository { requestLocation: RequestLocation ) -> Observable<[Store]> - func fetchStores() -> [Store] + func fetchStores(count: Int) -> [Store] func getStoreInformation( tag: UInt diff --git a/KCS/KCS/Domain/Interface/UseCase/FetchStoresUseCase.swift b/KCS/KCS/Domain/Interface/UseCase/FetchStoresUseCase.swift index 94508e4d..d66125fa 100644 --- a/KCS/KCS/Domain/Interface/UseCase/FetchStoresUseCase.swift +++ b/KCS/KCS/Domain/Interface/UseCase/FetchStoresUseCase.swift @@ -13,6 +13,6 @@ protocol FetchStoresUseCase { init(repository: StoreRepository) - func execute() -> [Store] + func execute(fetchCount: Int) -> [Store] } diff --git a/KCS/KCS/Domain/UseCase/FetchStoresUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/FetchStoresUseCaseImpl.swift index 0fc4561e..8635894f 100644 --- a/KCS/KCS/Domain/UseCase/FetchStoresUseCaseImpl.swift +++ b/KCS/KCS/Domain/UseCase/FetchStoresUseCaseImpl.swift @@ -11,8 +11,8 @@ struct FetchStoresUseCaseImpl: FetchStoresUseCase { let repository: StoreRepository - func execute() -> [Store] { - return repository.fetchStores() + func execute(fetchCount: Int) -> [Store] { + return repository.fetchStores(count: fetchCount) } } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 7477fc90..cc5e7571 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -213,6 +213,8 @@ final class HomeViewController: UIViewController { return view }() + private let storeListViewController: StoreListViewController + private let viewModel: HomeViewModel private let summaryInformationViewModel: SummaryViewModel private let detailViewModel: DetailViewModel @@ -230,11 +232,13 @@ final class HomeViewController: UIViewController { init( viewModel: HomeViewModel, summaryInformationViewModel: SummaryViewModel, - detailViewModel: DetailViewModel + detailViewModel: DetailViewModel, + storeListViewController: StoreListViewController ) { self.viewModel = viewModel self.summaryInformationViewModel = summaryInformationViewModel self.detailViewModel = detailViewModel + self.storeListViewController = storeListViewController super.init(nibName: nil, bundle: nil) } @@ -283,7 +287,8 @@ private extension HomeViewController { viewModel.applyFiltersOutput .bind { [weak self] filteredStores in guard let self = self else { return } - self.markers.forEach { $0.mapView = nil } +// self.markers.forEach { $0.mapView = nil } + var stores: [Store] = [] filteredStores.forEach { filteredStore in filteredStore.stores.forEach { [weak self] store in self?.viewModel.action( @@ -292,8 +297,10 @@ private extension HomeViewController { certificationType: filteredStore.type ) ) + stores.append(store) } } + storeListViewController.updateList(stores: stores) } .disposed(by: disposeBag) } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index d8b26270..9240ef2c 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -110,7 +110,7 @@ private extension HomeViewModelImpl { } else { dependency.activatedFilter.append(filter) } - applyFilters(stores: fetchStoresUseCase.execute(), filters: getActivatedTypes()) + applyFilters(stores: fetchStoresUseCase.execute(fetchCount: 1), filters: getActivatedTypes()) } func getActivatedTypes() -> [CertificationType] { diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index 75df3a29..6bab20a5 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -43,6 +43,13 @@ final class StoreListViewController: UIViewController { bind() } + func updateList(stores: [Store]) { // ์ถ•์ ํ•ด์„œ ์™€์•ผ ํ•จ + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([.store]) + snapshot.appendItems(stores, toSection: Section.store) + dataSource.apply(snapshot) + } + } private extension StoreListViewController { From dec886b70a3b5746d1da4da5f5771cfa01dea48b Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 31 Jan 2024 21:15:39 +0900 Subject: [PATCH 095/231] =?UTF-8?q?refactor=20:=20StoreListViewModel=20?= =?UTF-8?q?=ED=8B=80=20=EC=9E=A1=EA=B8=B0=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModel/Protocol/StoreListViewModel.swift | 2 +- .../StoreList/ViewModel/StoreListViewModelImpl.swift | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift b/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift index dcab5a66..58fff037 100644 --- a/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift +++ b/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift @@ -5,7 +5,7 @@ // Created by ์กฐ์„ฑ๋ฏผ on 1/31/24. // -import Foundation +import RxRelay protocol StoreListViewModel: StoreListViewModelInput, StoreListViewModelOutput { diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift b/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift index a1891413..6efcc43a 100644 --- a/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift +++ b/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift @@ -5,14 +5,18 @@ // Created by ์กฐ์„ฑ๋ฏผ on 1/31/24. // -import Foundation +import RxRelay final class StoreListViewModelImpl: StoreListViewModel { + let refreshOutput = PublishRelay<[Store]>() + func action(input: StoreListViewModelInputCase) { - switch input { - - } + } } + +private extension StoreListViewModelImpl { + +} From 47a43f52aecee3a09d55c5c8f240b66da9ce10a5 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 1 Feb 2024 00:13:31 +0900 Subject: [PATCH 096/231] =?UTF-8?q?feat=20:=20Refresh=20=ED=9A=9F=EC=88=98?= =?UTF-8?q?=20=EC=9D=B8=EC=9E=90=20=EC=B6=94=EA=B0=80=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 5 +++-- .../Presentation/Home/ViewModel/HomeViewModelImpl.swift | 8 ++++---- .../Home/ViewModel/protocol/HomeViewModel.swift | 2 +- .../StoreList/View/StoreListViewController.swift | 3 ++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index cc5e7571..7c5c569a 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -287,7 +287,7 @@ private extension HomeViewController { viewModel.applyFiltersOutput .bind { [weak self] filteredStores in guard let self = self else { return } -// self.markers.forEach { $0.mapView = nil } + self.markers.forEach { $0.mapView = nil } var stores: [Store] = [] filteredStores.forEach { filteredStore in filteredStore.stores.forEach { [weak self] store in @@ -425,7 +425,8 @@ private extension HomeViewController { .scan(false) { [weak self] (lastState, _) in guard let self = self else { return lastState } viewModel.action( - input: .filterButtonTapped(activatedFilter: type) + input: .filterButtonTapped(activatedFilter: type, fetchCount: 1) + // TODO: fetchCount Dependency์—์„œ ์ฒ˜๋ฆฌ ) return !lastState } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 9240ef2c..197d6c42 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -48,8 +48,8 @@ final class HomeViewModelImpl: HomeViewModel { switch input { case .refresh(let requestLocation): refresh(requestLocation: requestLocation) - case .filterButtonTapped(let filter): - filterButtonTapped(filter: filter) + case .filterButtonTapped(let filter, let fetchCount): + filterButtonTapped(filter: filter, fetchCount: fetchCount) case .markerTapped(let tag): markerTapped(tag: tag) case .locationButtonTapped(let locationAuthorizationStatus, let positionMode): @@ -104,13 +104,13 @@ private extension HomeViewModelImpl { .disposed(by: dependency.disposeBag) } - func filterButtonTapped(filter: CertificationType) { + func filterButtonTapped(filter: CertificationType, fetchCount: Int) { if let lastIndex = dependency.activatedFilter.lastIndex(of: filter) { dependency.activatedFilter.remove(at: lastIndex) } else { dependency.activatedFilter.append(filter) } - applyFilters(stores: fetchStoresUseCase.execute(fetchCount: 1), filters: getActivatedTypes()) + applyFilters(stores: fetchStoresUseCase.execute(fetchCount: fetchCount), filters: getActivatedTypes()) } func getActivatedTypes() -> [CertificationType] { diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 7a28c2bf..5d2d0eb4 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -28,7 +28,7 @@ protocol HomeViewModel: HomeViewModelInput, HomeViewModelOutput { enum HomeViewModelInputCase { case refresh(requestLocation: RequestLocation) - case filterButtonTapped(activatedFilter: CertificationType) + case filterButtonTapped(activatedFilter: CertificationType, fetchCount: Int) case markerTapped(tag: UInt) case locationButtonTapped(locationAuthorizationStatus: CLAuthorizationStatus, positionMode: NMFMyPositionMode) case setStoreInformationOriginalHeight(height: CGFloat) diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index 6bab20a5..fac99277 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -13,6 +13,7 @@ final class StoreListViewController: UIViewController { let tableView = UITableView() tableView.translatesAutoresizingMaskIntoConstraints = false tableView.rowHeight = 109 + tableView.register(StoreTableViewCell.self, forCellReuseIdentifier: StoreTableViewCell.identifier) return tableView }() @@ -43,7 +44,7 @@ final class StoreListViewController: UIViewController { bind() } - func updateList(stores: [Store]) { // ์ถ•์ ํ•ด์„œ ์™€์•ผ ํ•จ + func updateList(stores: [Store]) { var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([.store]) snapshot.appendItems(stores, toSection: Section.store) From 8eae956303a4500ff062fd1a42a2fa438d575625 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 1 Feb 2024 00:23:18 +0900 Subject: [PATCH 097/231] =?UTF-8?q?feat=20:=20UIStackView=20clear=20extens?= =?UTF-8?q?ion=20=EA=B5=AC=ED=98=84=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ++++ .../Extension/UIStackView+clear.swift | 20 +++++++++++++++++++ .../Presentation/Home/View/DetailView.swift | 12 ++--------- .../Home/View/SummaryInformationView.swift | 10 +--------- 4 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 KCS/KCS/Presentation/Extension/UIStackView+clear.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index ecf5d890..648a46ca 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -39,6 +39,7 @@ 59B8862B2B6A3F7F005750EF /* UITableViewCell+Identifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */; }; 59B886462B6A5CDC005750EF /* StoreListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */; }; 59B886482B6A5CE9005750EF /* StoreListViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */; }; + 59B8864A2B6A9CCB005750EF /* UIStackView+clear.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -150,6 +151,7 @@ 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableViewCell+Identifier.swift"; sourceTree = ""; }; 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewModel.swift; sourceTree = ""; }; 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewModelImpl.swift; sourceTree = ""; }; + 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+clear.swift"; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -561,6 +563,7 @@ A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */, A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */, 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */, + 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */, ); path = Extension; sourceTree = ""; @@ -916,6 +919,7 @@ 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */, A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */, + 59B8864A2B6A9CCB005750EF /* UIStackView+clear.swift in Sources */, 59C306C72B501B1E00862625 /* JSONContentsError.swift in Sources */, 59C306CB2B50357900862625 /* Router.swift in Sources */, A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, diff --git a/KCS/KCS/Presentation/Extension/UIStackView+clear.swift b/KCS/KCS/Presentation/Extension/UIStackView+clear.swift new file mode 100644 index 00000000..ecd1fac7 --- /dev/null +++ b/KCS/KCS/Presentation/Extension/UIStackView+clear.swift @@ -0,0 +1,20 @@ +// +// UIStackView+clear.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/1/24. +// + +import UIKit + +extension UIStackView { + + func clear() { + let subviews = arrangedSubviews + arrangedSubviews.forEach { + removeArrangedSubview($0) + } + subviews.forEach { $0.removeFromSuperview() } + } + +} diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 21b4adca..22604048 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -330,14 +330,6 @@ private extension DetailView { ]) } - func removeStackView(stackView: UIStackView) { - let subviews = stackView.arrangedSubviews - stackView.arrangedSubviews.forEach { - stackView.removeArrangedSubview($0) - } - subviews.forEach { $0.removeFromSuperview() } - } - func setOpeningHourText(openClosedContent: OpenClosedContent) { if openClosedContent.openClosedType == .none { storeOpenClosed.text = "์˜์—…์‹œ๊ฐ„ ์ •๋ณด ์—†์Œ" @@ -371,7 +363,7 @@ extension DetailView { storeOpenClosed.text = nil openingHour.text = nil storeImageView.image = UIImage.basicStore - removeStackView(stackView: certificationStackView) - removeStackView(stackView: openingHoursStackView) + certificationStackView.clear() + openingHoursStackView.clear() } } diff --git a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift index 5cc84ad7..e45a0179 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift @@ -225,14 +225,6 @@ private extension SummaryInformationView { ]) } - func removeStackView() { - let subviews = certificationStackView.arrangedSubviews - certificationStackView.arrangedSubviews.forEach { - certificationStackView.removeArrangedSubview($0) - } - subviews.forEach { $0.removeFromSuperview() } - } - func callButtonTapped(phoneNum: String) { if let url = URL(string: "tel://" + "\(phoneNum.filter { $0.isNumber })") { UIApplication.shared.open(url, options: [:], completionHandler: nil) @@ -253,7 +245,7 @@ extension SummaryInformationView { category.text = nil storeOpenClosed.text = nil openingHour.text = nil - removeStackView() + certificationStackView.clear() callDisposable?.dispose() storeCallButton.isHidden = true storeImageView.image = .basicStore From 66735965287c250de28ebb45b1d76780a2829172 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 1 Feb 2024 00:57:04 +0900 Subject: [PATCH 098/231] =?UTF-8?q?fix=20:=20Figma=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EC=83=89=EC=83=81=20=EB=B3=80=EA=B2=BD=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/DetailView.swift | 2 +- KCS/KCS/Presentation/Home/View/SummaryInformationView.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 22604048..35d282cd 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -17,7 +17,7 @@ final class DetailView: UIView { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.font = UIFont.pretendard(size: 22, weight: .bold) - label.textColor = UIColor.primary2 + label.textColor = UIColor.primary1 label.numberOfLines = 2 return label diff --git a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift index e45a0179..0b6f29e8 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift @@ -17,7 +17,7 @@ final class SummaryInformationView: UIView { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.font = UIFont.pretendard(size: 22, weight: .bold) - label.textColor = UIColor.primary2 + label.textColor = UIColor.primary1 label.numberOfLines = 2 return label From 214da2ffd8fae0f8ae61718387cda49ec50c6b6c Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 1 Feb 2024 00:57:43 +0900 Subject: [PATCH 099/231] =?UTF-8?q?feat=20:=20StoreTableViewCell=20UI=20?= =?UTF-8?q?=EC=84=B8=ED=8C=85=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StoreList/View/StoreTableViewCell.swift | 87 ++++++++++++++++++- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift b/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift index 5540cfbe..72a27707 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift @@ -9,20 +9,101 @@ import UIKit final class StoreTableViewCell: UITableViewCell { + private lazy var storeTitle: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 20, weight: .bold) + label.textColor = UIColor.primary1 + label.numberOfLines = 1 + + return label + }() + + private lazy var certificationStackView: UIStackView = { + let stack = UIStackView() + stack.translatesAutoresizingMaskIntoConstraints = false + stack.axis = .horizontal + stack.spacing = 4 + stack.distribution = .fillProportionally + + return stack + }() + + private lazy var category: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 11, weight: .regular) + label.textColor = UIColor.grayLabel + + return label + }() + + private let storeImageView: UIImageView = { + let imageView = UIImageView() + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.setLayerCorner(cornerRadius: 4) + imageView.clipsToBounds = true + imageView.image = UIImage.basicStore + + return imageView + }() + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + + addUIContents() + configureConstraints() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + + override func prepareForReuse() { + storeTitle.text = nil + certificationStackView.clear() + category.text = nil + storeImageView.image = .basicStore + } + + func setUIContents(store: Store) { + + } + } -extension StoreTableViewCell { +private extension StoreTableViewCell { - func setUIContents(store: Store) { + func addUIContents() { + contentView.addSubview(storeTitle) + contentView.addSubview(certificationStackView) + contentView.addSubview(category) + contentView.addSubview(storeImageView) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + storeImageView.centerYAnchor.constraint(equalTo: centerYAnchor), + storeImageView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -16), + storeImageView.widthAnchor.constraint(equalToConstant: 77), + storeImageView.heightAnchor.constraint(equalToConstant: 77) + ]) + + NSLayoutConstraint.activate([ + storeTitle.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 16), + storeTitle.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16), + storeTitle.trailingAnchor.constraint(equalTo: storeImageView.leadingAnchor, constant: -8) + ]) + + NSLayoutConstraint.activate([ + category.topAnchor.constraint(equalTo: storeTitle.bottomAnchor, constant: 8), + category.leadingAnchor.constraint(equalTo: storeTitle.leadingAnchor) + ]) + NSLayoutConstraint.activate([ + certificationStackView.topAnchor.constraint(equalTo: category.bottomAnchor, constant: 11), + certificationStackView.leadingAnchor.constraint(equalTo: storeTitle.leadingAnchor) + ]) } } From 6a96277bda0f2f12050622b85e3c1498959aed52 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 1 Feb 2024 01:30:30 +0900 Subject: [PATCH 100/231] =?UTF-8?q?feat=20:=20StoreTableViewCellViewModel?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 8 ++++++ .../View/StoreListViewController.swift | 14 ++++++++++ .../StoreList/View/StoreTableViewCell.swift | 7 +++++ .../StoreTableViewCellViewModel.swift | 26 +++++++++++++++++++ .../StoreTableViewCellViewModelImpl.swift | 16 ++++++++++++ 5 files changed, 71 insertions(+) create mode 100644 KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreTableViewCellViewModel.swift create mode 100644 KCS/KCS/Presentation/StoreList/ViewModel/StoreTableViewCellViewModelImpl.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 648a46ca..411aea30 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -40,6 +40,8 @@ 59B886462B6A5CDC005750EF /* StoreListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */; }; 59B886482B6A5CE9005750EF /* StoreListViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */; }; 59B8864A2B6A9CCB005750EF /* UIStackView+clear.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */; }; + 59B8864C2B6AAB41005750EF /* StoreTableViewCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8864B2B6AAB41005750EF /* StoreTableViewCellViewModel.swift */; }; + 59B8864E2B6AAB6D005750EF /* StoreTableViewCellViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8864D2B6AAB6D005750EF /* StoreTableViewCellViewModelImpl.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -152,6 +154,8 @@ 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewModel.swift; sourceTree = ""; }; 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewModelImpl.swift; sourceTree = ""; }; 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+clear.swift"; sourceTree = ""; }; + 59B8864B2B6AAB41005750EF /* StoreTableViewCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreTableViewCellViewModel.swift; sourceTree = ""; }; + 59B8864D2B6AAB6D005750EF /* StoreTableViewCellViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreTableViewCellViewModelImpl.swift; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -440,6 +444,7 @@ children = ( 59B886442B6A5CB6005750EF /* Protocol */, 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */, + 59B8864D2B6AAB6D005750EF /* StoreTableViewCellViewModelImpl.swift */, ); path = ViewModel; sourceTree = ""; @@ -448,6 +453,7 @@ isa = PBXGroup; children = ( 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */, + 59B8864B2B6AAB41005750EF /* StoreTableViewCellViewModel.swift */, ); path = Protocol; sourceTree = ""; @@ -922,10 +928,12 @@ 59B8864A2B6A9CCB005750EF /* UIStackView+clear.swift in Sources */, 59C306C72B501B1E00862625 /* JSONContentsError.swift in Sources */, 59C306CB2B50357900862625 /* Router.swift in Sources */, + 59B8864C2B6AAB41005750EF /* StoreTableViewCellViewModel.swift in Sources */, A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, 59C306B62B50027300862625 /* Store.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, A8A7E0622B652F0D00D015E5 /* MarkerContents.swift in Sources */, + 59B8864E2B6AAB6D005750EF /* StoreTableViewCellViewModelImpl.swift in Sources */, 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */, 5977BE942B59738800725C90 /* FetchStoresUseCase.swift in Sources */, 59F478BF2B5BEA08002FEF9E /* RequestLocation.swift in Sources */, diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index fac99277..e127d7e6 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -14,6 +14,7 @@ final class StoreListViewController: UIViewController { tableView.translatesAutoresizingMaskIntoConstraints = false tableView.rowHeight = 109 tableView.register(StoreTableViewCell.self, forCellReuseIdentifier: StoreTableViewCell.identifier) + tableView.backgroundColor = .white return tableView }() @@ -22,6 +23,8 @@ final class StoreListViewController: UIViewController { case store } + private let cellViewModel: StoreTableViewCellViewModel + private lazy var dataSource: UITableViewDiffableDataSource = { return UITableViewDiffableDataSource(tableView: storeTableView) { (tableView, indexPath, store) in guard let cell = tableView.dequeueReusableCell( @@ -30,12 +33,23 @@ final class StoreListViewController: UIViewController { ) as? StoreTableViewCell else { return StoreTableViewCell() } + cell.bind(viewModel: self.cellViewModel) cell.setUIContents(store: store) return cell } }() + init(cellViewModel: StoreTableViewCellViewModel) { + self.cellViewModel = cellViewModel + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { super.viewDidLoad() diff --git a/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift b/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift index 72a27707..1340b89f 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift @@ -9,6 +9,8 @@ import UIKit final class StoreTableViewCell: UITableViewCell { + private var viewModel: StoreTableViewCellViewModel? + private lazy var storeTitle: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false @@ -50,6 +52,7 @@ final class StoreTableViewCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + self.backgroundColor = .white addUIContents() configureConstraints() @@ -70,6 +73,10 @@ final class StoreTableViewCell: UITableViewCell { } + func bind(viewModel: StoreTableViewCellViewModel) { + self.viewModel = viewModel + } + } private extension StoreTableViewCell { diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreTableViewCellViewModel.swift b/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreTableViewCellViewModel.swift new file mode 100644 index 00000000..2f1e87fa --- /dev/null +++ b/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreTableViewCellViewModel.swift @@ -0,0 +1,26 @@ +// +// StoreTableViewCellViewModel.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/1/24. +// + +import RxRelay + +protocol StoreTableViewCellViewModel: StoreTableViewCellViewModelInput, StoreTableViewCellViewModelOutput { + +} + +protocol StoreTableViewCellViewModelInput { + + func action(input: StoreTableViewCellViewModelInputCase) + +} + +enum StoreTableViewCellViewModelInputCase { + +} + +protocol StoreTableViewCellViewModelOutput { + +} diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/StoreTableViewCellViewModelImpl.swift b/KCS/KCS/Presentation/StoreList/ViewModel/StoreTableViewCellViewModelImpl.swift new file mode 100644 index 00000000..5af174a8 --- /dev/null +++ b/KCS/KCS/Presentation/StoreList/ViewModel/StoreTableViewCellViewModelImpl.swift @@ -0,0 +1,16 @@ +// +// StoreTableViewCellViewModelImpl.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/1/24. +// + +import Foundation + +final class StoreTableViewCellViewModelImpl: StoreTableViewCellViewModel { + + func action(input: StoreTableViewCellViewModelInputCase) { + + } + +} From 569e225eb6b9b7d40a221dd3d1f0a96cf01ea331 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 1 Feb 2024 05:36:23 +0900 Subject: [PATCH 101/231] =?UTF-8?q?feat=20:=20StoreListViewModel=20?= =?UTF-8?q?=EB=B0=8F=20Cell=20Layout=20=EC=84=A4=EC=A0=95=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 12 ++--- .../xcshareddata/xcschemes/KCS.xcscheme | 6 --- KCS/KCS/Application/SceneDelegate.swift | 10 ++++- .../Data/Repository/StoreRepositoryImpl.swift | 7 +-- .../Entity/StoreTableViewCellContents.swift | 17 +++++++ .../View/StoreListViewController.swift | 35 +++++++++------ .../StoreList/View/StoreTableViewCell.swift | 23 ++++++---- .../Protocol/StoreListViewModel.swift | 6 +++ .../StoreTableViewCellViewModel.swift | 26 ----------- .../ViewModel/StoreListViewModelImpl.swift | 44 ++++++++++++++++++- .../StoreTableViewCellViewModelImpl.swift | 16 ------- 11 files changed, 118 insertions(+), 84 deletions(-) create mode 100644 KCS/KCS/Domain/Entity/StoreTableViewCellContents.swift delete mode 100644 KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreTableViewCellViewModel.swift delete mode 100644 KCS/KCS/Presentation/StoreList/ViewModel/StoreTableViewCellViewModelImpl.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 411aea30..7b03e74a 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -40,8 +40,7 @@ 59B886462B6A5CDC005750EF /* StoreListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */; }; 59B886482B6A5CE9005750EF /* StoreListViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */; }; 59B8864A2B6A9CCB005750EF /* UIStackView+clear.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */; }; - 59B8864C2B6AAB41005750EF /* StoreTableViewCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8864B2B6AAB41005750EF /* StoreTableViewCellViewModel.swift */; }; - 59B8864E2B6AAB6D005750EF /* StoreTableViewCellViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8864D2B6AAB6D005750EF /* StoreTableViewCellViewModelImpl.swift */; }; + 59B886502B6AB9F7005750EF /* StoreTableViewCellContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8864F2B6AB9F7005750EF /* StoreTableViewCellContents.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -154,8 +153,7 @@ 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewModel.swift; sourceTree = ""; }; 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewModelImpl.swift; sourceTree = ""; }; 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+clear.swift"; sourceTree = ""; }; - 59B8864B2B6AAB41005750EF /* StoreTableViewCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreTableViewCellViewModel.swift; sourceTree = ""; }; - 59B8864D2B6AAB6D005750EF /* StoreTableViewCellViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreTableViewCellViewModelImpl.swift; sourceTree = ""; }; + 59B8864F2B6AB9F7005750EF /* StoreTableViewCellContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreTableViewCellContents.swift; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -444,7 +442,6 @@ children = ( 59B886442B6A5CB6005750EF /* Protocol */, 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */, - 59B8864D2B6AAB6D005750EF /* StoreTableViewCellViewModelImpl.swift */, ); path = ViewModel; sourceTree = ""; @@ -453,7 +450,6 @@ isa = PBXGroup; children = ( 59B886452B6A5CDC005750EF /* StoreListViewModel.swift */, - 59B8864B2B6AAB41005750EF /* StoreTableViewCellViewModel.swift */, ); path = Protocol; sourceTree = ""; @@ -484,6 +480,7 @@ A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */, A8A7E0612B652F0D00D015E5 /* MarkerContents.swift */, 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */, + 59B8864F2B6AB9F7005750EF /* StoreTableViewCellContents.swift */, ); path = Entity; sourceTree = ""; @@ -928,14 +925,13 @@ 59B8864A2B6A9CCB005750EF /* UIStackView+clear.swift in Sources */, 59C306C72B501B1E00862625 /* JSONContentsError.swift in Sources */, 59C306CB2B50357900862625 /* Router.swift in Sources */, - 59B8864C2B6AAB41005750EF /* StoreTableViewCellViewModel.swift in Sources */, A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, 59C306B62B50027300862625 /* Store.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, A8A7E0622B652F0D00D015E5 /* MarkerContents.swift in Sources */, - 59B8864E2B6AAB6D005750EF /* StoreTableViewCellViewModelImpl.swift in Sources */, 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */, 5977BE942B59738800725C90 /* FetchStoresUseCase.swift in Sources */, + 59B886502B6AB9F7005750EF /* StoreTableViewCellContents.swift in Sources */, 59F478BF2B5BEA08002FEF9E /* RequestLocation.swift in Sources */, 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */, 59C306B22B50001F00862625 /* StoreRepositoryImpl.swift in Sources */, diff --git a/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme b/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme index 7f1e1c62..5ff40d72 100644 --- a/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme +++ b/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme @@ -62,12 +62,6 @@ ReferencedContainer = "container:KCS.xcodeproj"> - - - - Observable<[Store]> { @@ -33,10 +34,10 @@ final class StoreRepositoryImpl: StoreRepository { .responseDecodable(of: StoreResponse.self) { [weak self] response in do { switch response.result { - case .success(let result): // ํ˜„์žฌ๋Š” 1์ฐจ์› ๋ฐฐ์—ด๋กœ ์˜จ๋‹ค + case .success(let result): let resultStores = try result.data.map { try $0.toEntity() } - self?.stores = [resultStores] // 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์˜ฌ ๊ฒฝ์šฐ stores๋ฅผ ์ „์ฒด๋กœ ์ดˆ๊ธฐํ™” ํ•ด์•ผํ•จ - observer.onNext(resultStores) // ๊ทธ ํ›„์— 5๊ฐœ์ค‘ ์ฒซ ์ธ๋ฑ์Šค์˜ stores๋ฅผ ๋ณด๋‚ด์ค˜์•ผ ํ•จ + self?.stores = [resultStores] + observer.onNext(resultStores) case .failure(let error): throw error } diff --git a/KCS/KCS/Domain/Entity/StoreTableViewCellContents.swift b/KCS/KCS/Domain/Entity/StoreTableViewCellContents.swift new file mode 100644 index 00000000..5ddd170f --- /dev/null +++ b/KCS/KCS/Domain/Entity/StoreTableViewCellContents.swift @@ -0,0 +1,17 @@ +// +// StoreTableViewCellContents.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/1/24. +// + +import Foundation + +struct StoreTableViewCellContents: Hashable { + + let storeTitle: String + let category: String? + let certificationTypes: [CertificationType] + let thumbnailImageData: Data? + +} diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index e127d7e6..6b301d09 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -6,9 +6,12 @@ // import UIKit +import RxSwift final class StoreListViewController: UIViewController { + private let disposeBag = DisposeBag() + private let storeTableView: UITableView = { let tableView = UITableView() tableView.translatesAutoresizingMaskIntoConstraints = false @@ -23,25 +26,26 @@ final class StoreListViewController: UIViewController { case store } - private let cellViewModel: StoreTableViewCellViewModel - - private lazy var dataSource: UITableViewDiffableDataSource = { - return UITableViewDiffableDataSource(tableView: storeTableView) { (tableView, indexPath, store) in + private lazy var dataSource: UITableViewDiffableDataSource = { + return UITableViewDiffableDataSource( + tableView: storeTableView + ) { (tableView, indexPath, storeContents) in guard let cell = tableView.dequeueReusableCell( withIdentifier: StoreTableViewCell.identifier, for: indexPath ) as? StoreTableViewCell else { return StoreTableViewCell() } - cell.bind(viewModel: self.cellViewModel) - cell.setUIContents(store: store) + cell.setUIContents(storeContents: storeContents) return cell } }() - init(cellViewModel: StoreTableViewCellViewModel) { - self.cellViewModel = cellViewModel + private let viewModel: StoreListViewModel + + init(viewModel: StoreListViewModel) { + self.viewModel = viewModel super.init(nibName: nil, bundle: nil) } @@ -59,10 +63,7 @@ final class StoreListViewController: UIViewController { } func updateList(stores: [Store]) { - var snapshot = NSDiffableDataSourceSnapshot() - snapshot.appendSections([.store]) - snapshot.appendItems(stores, toSection: Section.store) - dataSource.apply(snapshot) + viewModel.action(input: .updateList(stores: stores)) } } @@ -83,7 +84,15 @@ private extension StoreListViewController { } func bind() { - + viewModel.updateListOutput + .bind { [weak self] contentsArray in + guard let self = self else { return } + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([.store]) + snapshot.appendItems(contentsArray, toSection: Section.store) + dataSource.apply(snapshot) + } + .disposed(by: disposeBag) } } diff --git a/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift b/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift index 1340b89f..2d574943 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift @@ -6,10 +6,9 @@ // import UIKit +import RxSwift final class StoreTableViewCell: UITableViewCell { - - private var viewModel: StoreTableViewCellViewModel? private lazy var storeTitle: UILabel = { let label = UILabel() @@ -69,12 +68,20 @@ final class StoreTableViewCell: UITableViewCell { storeImageView.image = .basicStore } - func setUIContents(store: Store) { - - } - - func bind(viewModel: StoreTableViewCellViewModel) { - self.viewModel = viewModel + func setUIContents(storeContents: StoreTableViewCellContents) { + storeTitle.text = storeContents.storeTitle + category.text = storeContents.category + storeContents.certificationTypes.map({ + CertificationLabel(certificationType: $0) + }) + .forEach { [weak self] in + self?.certificationStackView.addArrangedSubview($0) + } + guard let thumbnailImageData = storeContents.thumbnailImageData, + let thumbnailImage = UIImage(data: thumbnailImageData) else { + return + } + storeImageView.image = thumbnailImage } } diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift b/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift index 58fff037..8e072c2a 100644 --- a/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift +++ b/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreListViewModel.swift @@ -9,6 +9,8 @@ import RxRelay protocol StoreListViewModel: StoreListViewModelInput, StoreListViewModelOutput { + var fetchImageUseCase: FetchImageUseCase { get } + } protocol StoreListViewModelInput { @@ -19,8 +21,12 @@ protocol StoreListViewModelInput { enum StoreListViewModelInputCase { + case updateList(stores: [Store]) + } protocol StoreListViewModelOutput { + var updateListOutput: BehaviorRelay<[StoreTableViewCellContents]> { get } + } diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreTableViewCellViewModel.swift b/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreTableViewCellViewModel.swift deleted file mode 100644 index 2f1e87fa..00000000 --- a/KCS/KCS/Presentation/StoreList/ViewModel/Protocol/StoreTableViewCellViewModel.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// StoreTableViewCellViewModel.swift -// KCS -// -// Created by ์กฐ์„ฑ๋ฏผ on 2/1/24. -// - -import RxRelay - -protocol StoreTableViewCellViewModel: StoreTableViewCellViewModelInput, StoreTableViewCellViewModelOutput { - -} - -protocol StoreTableViewCellViewModelInput { - - func action(input: StoreTableViewCellViewModelInputCase) - -} - -enum StoreTableViewCellViewModelInputCase { - -} - -protocol StoreTableViewCellViewModelOutput { - -} diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift b/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift index 6efcc43a..7ea88ac1 100644 --- a/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift +++ b/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift @@ -6,17 +6,57 @@ // import RxRelay +import RxSwift final class StoreListViewModelImpl: StoreListViewModel { - let refreshOutput = PublishRelay<[Store]>() + var fetchImageUseCase: FetchImageUseCase + + var updateListOutput = BehaviorRelay<[StoreTableViewCellContents]>(value: []) + + private let disposeBag = DisposeBag() + + init(fetchImageUseCase: FetchImageUseCase) { + self.fetchImageUseCase = fetchImageUseCase + } func action(input: StoreListViewModelInputCase) { - + switch input { + case .updateList(let stores): + updateList(stores: stores) + } } } private extension StoreListViewModelImpl { + func updateList(stores: [Store]) { + Observable.zip(stores.map({ [weak self] store in + guard let self = self, + let url = store.localPhotos.first else { return Observable.just(nil) } + + return fetchImageUseCase.execute(url: url) + .flatMap { data in + Observable.just(data) + } + })) + .bind { [weak self] imageDataArray in + var storeContentsArray: [StoreTableViewCellContents] = [] + for index in stores.indices { + let store = stores[index] + storeContentsArray.append( + StoreTableViewCellContents( + storeTitle: store.title, + category: store.category, + certificationTypes: store.certificationTypes, + thumbnailImageData: imageDataArray[index] + ) + ) + } + self?.updateListOutput.accept(storeContentsArray) + } + .disposed(by: disposeBag) + } + } diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/StoreTableViewCellViewModelImpl.swift b/KCS/KCS/Presentation/StoreList/ViewModel/StoreTableViewCellViewModelImpl.swift deleted file mode 100644 index 5af174a8..00000000 --- a/KCS/KCS/Presentation/StoreList/ViewModel/StoreTableViewCellViewModelImpl.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// StoreTableViewCellViewModelImpl.swift -// KCS -// -// Created by ์กฐ์„ฑ๋ฏผ on 2/1/24. -// - -import Foundation - -final class StoreTableViewCellViewModelImpl: StoreTableViewCellViewModel { - - func action(input: StoreTableViewCellViewModelInputCase) { - - } - -} From f46f19dbcc685225532df8a61276a8527410f41d Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 1 Feb 2024 13:08:43 +0900 Subject: [PATCH 102/231] =?UTF-8?q?fix=20:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EB=8B=A8=EC=B6=95=EC=9D=B8?= =?UTF-8?q?=EC=9E=90=20=EC=82=AC=EC=9A=A9=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StoreList/ViewModel/StoreListViewModelImpl.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift b/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift index 7ea88ac1..dd29fe88 100644 --- a/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift +++ b/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift @@ -37,9 +37,7 @@ private extension StoreListViewModelImpl { let url = store.localPhotos.first else { return Observable.just(nil) } return fetchImageUseCase.execute(url: url) - .flatMap { data in - Observable.just(data) - } + .flatMap { Observable.just($0) } })) .bind { [weak self] imageDataArray in var storeContentsArray: [StoreTableViewCellContents] = [] From 800ad966fd83b73bb9ec9afbdf77f1d5ea17dfc0 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 2 Feb 2024 23:45:19 +0900 Subject: [PATCH 103/231] =?UTF-8?q?refactor=20:=20SummaryInformation=20->?= =?UTF-8?q?=20Summary=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20(#141)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 8 ++++---- KCS/KCS/Application/SceneDelegate.swift | 4 ++-- .../Home/View/HomeViewController.swift | 16 +++++++-------- .../Home/View/StoreInformationView.swift | 12 +++++------ ...nformationView.swift => SummaryView.swift} | 20 +++++++++---------- 5 files changed, 30 insertions(+), 30 deletions(-) rename KCS/KCS/Presentation/Home/View/{SummaryInformationView.swift => SummaryView.swift} (93%) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 7b03e74a..8672a820 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -84,7 +84,7 @@ A89087042B4E7F3500767225 /* FilterButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087032B4E7F3500767225 /* FilterButton.swift */; }; A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; - A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870E2B4F836C00767225 /* SummaryInformationView.swift */; }; + A890870F2B4F836C00767225 /* SummaryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870E2B4F836C00767225 /* SummaryView.swift */; }; A8A7E05B2B642EC900D015E5 /* DetailViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */; }; A8A7E05D2B64AF1300D015E5 /* StoreInformationViewConstraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05C2B64AF1200D015E5 /* StoreInformationViewConstraints.swift */; }; A8A7E0602B64E62200D015E5 /* NMFMyPosition+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */; }; @@ -201,7 +201,7 @@ A89087032B4E7F3500767225 /* FilterButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterButton.swift; sourceTree = ""; }; A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; - A890870E2B4F836C00767225 /* SummaryInformationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryInformationView.swift; sourceTree = ""; }; + A890870E2B4F836C00767225 /* SummaryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryView.swift; sourceTree = ""; }; A8A7E05A2B642EC900D015E5 /* DetailViewContents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewContents.swift; sourceTree = ""; }; A8A7E05C2B64AF1200D015E5 /* StoreInformationViewConstraints.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewConstraints.swift; sourceTree = ""; }; A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NMFMyPosition+.swift"; sourceTree = ""; }; @@ -399,7 +399,7 @@ children = ( 591A88802B384E600059E40F /* HomeViewController.swift */, A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */, - A890870E2B4F836C00767225 /* SummaryInformationView.swift */, + A890870E2B4F836C00767225 /* SummaryView.swift */, 592262232B61203000CA5A11 /* DetailView.swift */, 59C306A32B4D7EBA00862625 /* Marker.swift */, A89087032B4E7F3500767225 /* FilterButton.swift */, @@ -880,7 +880,7 @@ 59B886482B6A5CE9005750EF /* StoreListViewModelImpl.swift in Sources */, A81EFBB52B5D477600D0C0D7 /* UILabel+.swift in Sources */, 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */, - A890870F2B4F836C00767225 /* SummaryInformationView.swift in Sources */, + A890870F2B4F836C00767225 /* SummaryView.swift in Sources */, A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */, 59B886262B6A3A02005750EF /* StoreListViewController.swift in Sources */, 5977BE612B55374000725C90 /* HomeViewModel.swift in Sources */, diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 30d2b040..c287106d 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -24,13 +24,13 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { fetchStoresUseCase: FetchStoresUseCaseImpl(repository: repository), getStoreInformationUseCase: GetStoreInformationUseCaseImpl(repository: repository) ) - let summaryInformationViewModel = SummaryViewModelImpl( + let summaryViewModel = SummaryViewModelImpl( getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) ) window?.rootViewController = HomeViewController( viewModel: viewModel, - summaryInformationViewModel: summaryInformationViewModel, + summaryViewModel: summaryViewModel, detailViewModel: DetailViewModelImpl( getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 7c5c569a..b812c17c 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -162,8 +162,8 @@ final class HomeViewController: UIViewController { private lazy var storeInformationView: StoreInformationView = { let view = StoreInformationView( - summaryViewModel: summaryInformationViewModel, - summaryInformationHeightObserver: summaryInformationHeightObserver, + summaryViewModel: summaryViewModel, + summaryViewHeightObserver: summaryViewHeightObserver, detailViewModel: detailViewModel ) view.translatesAutoresizingMaskIntoConstraints = false @@ -216,7 +216,7 @@ final class HomeViewController: UIViewController { private let storeListViewController: StoreListViewController private let viewModel: HomeViewModel - private let summaryInformationViewModel: SummaryViewModel + private let summaryViewModel: SummaryViewModel private let detailViewModel: DetailViewModel private lazy var storeInformationHeightConstraint = storeInformationView.heightAnchor.constraint(equalToConstant: 0) private lazy var locationButtonBottomConstraint = locationButton.bottomAnchor.constraint( @@ -227,16 +227,16 @@ final class HomeViewController: UIViewController { equalTo: storeInformationView.topAnchor, constant: -37 ) - private let summaryInformationHeightObserver = PublishRelay() + private let summaryViewHeightObserver = PublishRelay() init( viewModel: HomeViewModel, - summaryInformationViewModel: SummaryViewModel, + summaryViewModel: SummaryViewModel, detailViewModel: DetailViewModel, storeListViewController: StoreListViewController ) { self.viewModel = viewModel - self.summaryInformationViewModel = summaryInformationViewModel + self.summaryViewModel = summaryViewModel self.detailViewModel = detailViewModel self.storeListViewController = storeListViewController super.init(nibName: nil, bundle: nil) @@ -373,7 +373,7 @@ private extension HomeViewController { .disposed(by: disposeBag) // MARK: ์ถ”ํ›„ ์ˆ˜์ • ํ•„์š” - summaryInformationHeightObserver.bind { [weak self] height in + summaryViewHeightObserver.bind { [weak self] height in self?.viewModel.action( input: .setStoreInformationOriginalHeight(height: height) ) @@ -441,7 +441,7 @@ private extension HomeViewController { } .disposed(by: disposeBag) - summaryInformationViewModel.errorAlertOutput + summaryViewModel.errorAlertOutput .bind { [weak self] error in self?.presentErrorAlert(error: error) } diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift index 0fb38e78..ba3ba5a2 100644 --- a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/StoreInformationView.swift @@ -10,10 +10,10 @@ import RxRelay final class StoreInformationView: UIView { - private lazy var summaryView: SummaryInformationView = { - let view = SummaryInformationView( + private lazy var summaryView: SummaryView = { + let view = SummaryView( viewModel: summaryViewModel, - summaryInformationHeightObserver: summaryInformationHeightObserver + summaryViewHeightObserver: summaryViewHeightObserver ) view.translatesAutoresizingMaskIntoConstraints = false @@ -21,7 +21,7 @@ final class StoreInformationView: UIView { }() private let summaryViewModel: SummaryViewModel - private let summaryInformationHeightObserver: PublishRelay + private let summaryViewHeightObserver: PublishRelay private lazy var detailView: DetailView = { let view = DetailView(viewModel: detailViewModel) @@ -34,11 +34,11 @@ final class StoreInformationView: UIView { init( summaryViewModel: SummaryViewModel, - summaryInformationHeightObserver: PublishRelay, + summaryViewHeightObserver: PublishRelay, detailViewModel: DetailViewModel ) { self.summaryViewModel = summaryViewModel - self.summaryInformationHeightObserver = summaryInformationHeightObserver + self.summaryViewHeightObserver = summaryViewHeightObserver self.detailViewModel = detailViewModel super.init(frame: .zero) diff --git a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift b/KCS/KCS/Presentation/Home/View/SummaryView.swift similarity index 93% rename from KCS/KCS/Presentation/Home/View/SummaryInformationView.swift rename to KCS/KCS/Presentation/Home/View/SummaryView.swift index 0b6f29e8..8c40f38c 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryInformationView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryView.swift @@ -1,5 +1,5 @@ // -// SummaryInformationView.swift +// SummaryView.swift // KCS // // Created by ๊น€์˜ํ˜„ on 1/11/24. @@ -9,7 +9,7 @@ import UIKit import RxSwift import RxCocoa -final class SummaryInformationView: UIView { +final class SummaryView: UIView { private let disposeBag = DisposeBag() @@ -95,11 +95,11 @@ final class SummaryInformationView: UIView { }() private let viewModel: SummaryViewModel - private let summaryInformationHeightObserver: PublishRelay + private let summaryViewHeightObserver: PublishRelay - init(viewModel: SummaryViewModel, summaryInformationHeightObserver: PublishRelay) { + init(viewModel: SummaryViewModel, summaryViewHeightObserver: PublishRelay) { self.viewModel = viewModel - self.summaryInformationHeightObserver = summaryInformationHeightObserver + self.summaryViewHeightObserver = summaryViewHeightObserver super.init(frame: .zero) setBackgroundColor() @@ -114,7 +114,7 @@ final class SummaryInformationView: UIView { } } -private extension SummaryInformationView { +private extension SummaryView { func bind() { viewModel.setUIContentsOutput @@ -122,9 +122,9 @@ private extension SummaryInformationView { guard let self = self else { return } storeTitle.text = contents.storeTitle if storeTitle.numberOfVisibleLines == 1 { - summaryInformationHeightObserver.accept(230) + summaryViewHeightObserver.accept(230) } else { - summaryInformationHeightObserver.accept(253) + summaryViewHeightObserver.accept(253) } storeOpenClosed.text = contents.openClosedContent.openClosedType.rawValue openingHour.text = contents.openClosedContent.nextOpeningHour @@ -159,7 +159,7 @@ private extension SummaryInformationView { } -private extension SummaryInformationView { +private extension SummaryView { func setBackgroundColor() { backgroundColor = .white @@ -233,7 +233,7 @@ private extension SummaryInformationView { } -extension SummaryInformationView { +extension SummaryView { func setUIContents(store: Store) { resetUIContents() From 07137cda8b8512cd02519e8cd6c27ba6fbe09ec5 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 3 Feb 2024 00:00:41 +0900 Subject: [PATCH 104/231] =?UTF-8?q?fix=20:=20refresh=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=9D=BC=EB=B6=80=EB=A5=BC=20apply=20filter=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20(#143)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index b812c17c..8d671d49 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -278,7 +278,6 @@ private extension HomeViewController { viewModel.refreshOutput .bind { [weak self] _ in self?.refreshButton.animationInvalidate() - self?.storeInformationViewDismiss() } .disposed(by: disposeBag) } @@ -300,6 +299,7 @@ private extension HomeViewController { stores.append(store) } } + storeInformationViewDismiss() storeListViewController.updateList(stores: stores) } .disposed(by: disposeBag) From efbd848554a8d1c6dba4a14bb4e8f562b4568533 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 3 Feb 2024 00:07:51 +0900 Subject: [PATCH 105/231] =?UTF-8?q?feat=20:=20scaleAspectFill=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20(#146)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/DetailView.swift | 1 + KCS/KCS/Presentation/Home/View/SummaryView.swift | 1 + KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift | 1 + 3 files changed, 3 insertions(+) diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/Home/View/DetailView.swift index 35d282cd..66051433 100644 --- a/KCS/KCS/Presentation/Home/View/DetailView.swift +++ b/KCS/KCS/Presentation/Home/View/DetailView.swift @@ -56,6 +56,7 @@ final class DetailView: UIView { imageView.setLayerCorner(cornerRadius: 6) imageView.clipsToBounds = true imageView.image = UIImage.basicStore + imageView.contentMode = .scaleAspectFill return imageView }() diff --git a/KCS/KCS/Presentation/Home/View/SummaryView.swift b/KCS/KCS/Presentation/Home/View/SummaryView.swift index 8c40f38c..c4cb833f 100644 --- a/KCS/KCS/Presentation/Home/View/SummaryView.swift +++ b/KCS/KCS/Presentation/Home/View/SummaryView.swift @@ -66,6 +66,7 @@ final class SummaryView: UIView { imageView.setLayerCorner(cornerRadius: 6) imageView.clipsToBounds = true imageView.image = UIImage.basicStore + imageView.contentMode = .scaleAspectFill return imageView }() diff --git a/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift b/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift index 2d574943..07052557 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreTableViewCell.swift @@ -45,6 +45,7 @@ final class StoreTableViewCell: UITableViewCell { imageView.setLayerCorner(cornerRadius: 4) imageView.clipsToBounds = true imageView.image = UIImage.basicStore + imageView.contentMode = .scaleAspectFill return imageView }() From 3d9baf5ae99da7d24138ee38196c70abc804f3c5 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 3 Feb 2024 18:09:27 +0900 Subject: [PATCH 106/231] =?UTF-8?q?chore=20:=20dev=20->=20prod=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20api=20=EB=B3=80=EA=B2=BD=20(#148)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Network/StoreAPI.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 93658693..018a4faa 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -20,7 +20,7 @@ extension StoreAPI: Router, URLRequestConvertible { var baseURL: String? { switch self { case .getStores: - return getURL(type: .develop) + return getURL(type: .product) case .getImage(let url): return url } From 00965b2556be0056861f97baf81c814dc706a3b6 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 3 Feb 2024 18:11:39 +0900 Subject: [PATCH 107/231] =?UTF-8?q?chore=20:=20StoreInformation=20director?= =?UTF-8?q?y=20=EC=83=9D=EC=84=B1=20(#148)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 50 +++++++++++++++---- .../View/CertificationLabel.swift | 0 .../View/DetailView.swift | 0 .../View/OpeningHoursCellView.swift | 0 .../View/StoreInformationView.swift | 0 .../View/SummaryView.swift | 0 .../ViewModel/DetailViewModelImpl.swift | 0 .../ViewModel/Protocol}/DetailViewModel.swift | 0 .../Protocol}/SummaryViewModel.swift | 0 .../ViewModel/SummaryViewModelImpl.swift | 0 10 files changed, 41 insertions(+), 9 deletions(-) rename KCS/KCS/Presentation/{Home => StoreInformation}/View/CertificationLabel.swift (100%) rename KCS/KCS/Presentation/{Home => StoreInformation}/View/DetailView.swift (100%) rename KCS/KCS/Presentation/{Home => StoreInformation}/View/OpeningHoursCellView.swift (100%) rename KCS/KCS/Presentation/{Home => StoreInformation}/View/StoreInformationView.swift (100%) rename KCS/KCS/Presentation/{Home => StoreInformation}/View/SummaryView.swift (100%) rename KCS/KCS/Presentation/{Home => StoreInformation}/ViewModel/DetailViewModelImpl.swift (100%) rename KCS/KCS/Presentation/{Home/ViewModel/protocol => StoreInformation/ViewModel/Protocol}/DetailViewModel.swift (100%) rename KCS/KCS/Presentation/{Home/ViewModel/protocol => StoreInformation/ViewModel/Protocol}/SummaryViewModel.swift (100%) rename KCS/KCS/Presentation/{Home => StoreInformation}/ViewModel/SummaryViewModelImpl.swift (100%) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 8672a820..135d49f1 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -307,8 +307,6 @@ A8ACB7E02B594F5F00540BD1 /* protocol */, 5977BE652B553BA800725C90 /* HomeViewModelImpl.swift */, 5977BE672B553C8300725C90 /* HomeDependency.swift */, - A8ACB7E12B594F7400540BD1 /* SummaryViewModelImpl.swift */, - 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */, ); path = ViewModel; sourceTree = ""; @@ -373,6 +371,7 @@ A890870B2B4EF8F900767225 /* Extension */, 5986DCEA2B392996005AE43B /* Home */, 59B886242B6A39E9005750EF /* StoreList */, + 59B886552B6E3A59005750EF /* StoreInformation */, ); path = Presentation; sourceTree = ""; @@ -398,14 +397,9 @@ isa = PBXGroup; children = ( 591A88802B384E600059E40F /* HomeViewController.swift */, - A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */, - A890870E2B4F836C00767225 /* SummaryView.swift */, - 592262232B61203000CA5A11 /* DetailView.swift */, 59C306A32B4D7EBA00862625 /* Marker.swift */, A89087032B4E7F3500767225 /* FilterButton.swift */, 5977BE572B5524D500725C90 /* RefreshButton.swift */, - A802D1F52B5277620091FDE7 /* CertificationLabel.swift */, - A8AE4B1A2B62A60B00632355 /* OpeningHoursCellView.swift */, ); path = View; sourceTree = ""; @@ -454,6 +448,46 @@ path = Protocol; sourceTree = ""; }; + 59B886552B6E3A59005750EF /* StoreInformation */ = { + isa = PBXGroup; + children = ( + 59B886572B6E3A8A005750EF /* View */, + 59B886562B6E3A7F005750EF /* ViewModel */, + ); + path = StoreInformation; + sourceTree = ""; + }; + 59B886562B6E3A7F005750EF /* ViewModel */ = { + isa = PBXGroup; + children = ( + 59B886582B6E3A8E005750EF /* Protocol */, + A8ACB7E12B594F7400540BD1 /* SummaryViewModelImpl.swift */, + 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 59B886572B6E3A8A005750EF /* View */ = { + isa = PBXGroup; + children = ( + A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */, + A890870E2B4F836C00767225 /* SummaryView.swift */, + 592262232B61203000CA5A11 /* DetailView.swift */, + A802D1F52B5277620091FDE7 /* CertificationLabel.swift */, + A8AE4B1A2B62A60B00632355 /* OpeningHoursCellView.swift */, + ); + path = View; + sourceTree = ""; + }; + 59B886582B6E3A8E005750EF /* Protocol */ = { + isa = PBXGroup; + children = ( + A8ACB7DE2B594F4B00540BD1 /* SummaryViewModel.swift */, + 592262252B61232F00CA5A11 /* DetailViewModel.swift */, + ); + path = Protocol; + sourceTree = ""; + }; 59C306A72B4FF98600862625 /* Repository */ = { isa = PBXGroup; children = ( @@ -603,8 +637,6 @@ isa = PBXGroup; children = ( 5977BE602B55374000725C90 /* HomeViewModel.swift */, - A8ACB7DE2B594F4B00540BD1 /* SummaryViewModel.swift */, - 592262252B61232F00CA5A11 /* DetailViewModel.swift */, ); path = protocol; sourceTree = ""; diff --git a/KCS/KCS/Presentation/Home/View/CertificationLabel.swift b/KCS/KCS/Presentation/StoreInformation/View/CertificationLabel.swift similarity index 100% rename from KCS/KCS/Presentation/Home/View/CertificationLabel.swift rename to KCS/KCS/Presentation/StoreInformation/View/CertificationLabel.swift diff --git a/KCS/KCS/Presentation/Home/View/DetailView.swift b/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift similarity index 100% rename from KCS/KCS/Presentation/Home/View/DetailView.swift rename to KCS/KCS/Presentation/StoreInformation/View/DetailView.swift diff --git a/KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift b/KCS/KCS/Presentation/StoreInformation/View/OpeningHoursCellView.swift similarity index 100% rename from KCS/KCS/Presentation/Home/View/OpeningHoursCellView.swift rename to KCS/KCS/Presentation/StoreInformation/View/OpeningHoursCellView.swift diff --git a/KCS/KCS/Presentation/Home/View/StoreInformationView.swift b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationView.swift similarity index 100% rename from KCS/KCS/Presentation/Home/View/StoreInformationView.swift rename to KCS/KCS/Presentation/StoreInformation/View/StoreInformationView.swift diff --git a/KCS/KCS/Presentation/Home/View/SummaryView.swift b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift similarity index 100% rename from KCS/KCS/Presentation/Home/View/SummaryView.swift rename to KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift diff --git a/KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/DetailViewModelImpl.swift similarity index 100% rename from KCS/KCS/Presentation/Home/ViewModel/DetailViewModelImpl.swift rename to KCS/KCS/Presentation/StoreInformation/ViewModel/DetailViewModelImpl.swift diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/DetailViewModel.swift similarity index 100% rename from KCS/KCS/Presentation/Home/ViewModel/protocol/DetailViewModel.swift rename to KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/DetailViewModel.swift diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/SummaryViewModel.swift similarity index 100% rename from KCS/KCS/Presentation/Home/ViewModel/protocol/SummaryViewModel.swift rename to KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/SummaryViewModel.swift diff --git a/KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/SummaryViewModelImpl.swift similarity index 100% rename from KCS/KCS/Presentation/Home/ViewModel/SummaryViewModelImpl.swift rename to KCS/KCS/Presentation/StoreInformation/ViewModel/SummaryViewModelImpl.swift From 7e2c5458c072c76e252b3dee271dc969328e39bb Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 3 Feb 2024 23:05:49 +0900 Subject: [PATCH 108/231] =?UTF-8?q?feat=20:=20presentErrorAlert=20extensio?= =?UTF-8?q?n=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20(#148)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 16 +++++++++++++++ .../UIViewController+ErrorAlert.swift | 20 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 135d49f1..3a4ab741 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -41,6 +41,10 @@ 59B886482B6A5CE9005750EF /* StoreListViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */; }; 59B8864A2B6A9CCB005750EF /* UIStackView+clear.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */; }; 59B886502B6AB9F7005750EF /* StoreTableViewCellContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8864F2B6AB9F7005750EF /* StoreTableViewCellContents.swift */; }; + 59B8865A2B6E3B40005750EF /* StoreInformationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886592B6E3B40005750EF /* StoreInformationViewController.swift */; }; + 59B8865C2B6E4B8B005750EF /* StoreInformationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865B2B6E4B8B005750EF /* StoreInformationViewModel.swift */; }; + 59B8865E2B6E4B98005750EF /* StoreInformationViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865D2B6E4B98005750EF /* StoreInformationViewModelImpl.swift */; }; + 59B886602B6E7CF6005750EF /* UIViewController+ErrorAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -154,6 +158,10 @@ 59B886472B6A5CE9005750EF /* StoreListViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListViewModelImpl.swift; sourceTree = ""; }; 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+clear.swift"; sourceTree = ""; }; 59B8864F2B6AB9F7005750EF /* StoreTableViewCellContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreTableViewCellContents.swift; sourceTree = ""; }; + 59B886592B6E3B40005750EF /* StoreInformationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewController.swift; sourceTree = ""; }; + 59B8865B2B6E4B8B005750EF /* StoreInformationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewModel.swift; sourceTree = ""; }; + 59B8865D2B6E4B98005750EF /* StoreInformationViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewModelImpl.swift; sourceTree = ""; }; + 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+ErrorAlert.swift"; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -463,6 +471,7 @@ 59B886582B6E3A8E005750EF /* Protocol */, A8ACB7E12B594F7400540BD1 /* SummaryViewModelImpl.swift */, 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */, + 59B8865D2B6E4B98005750EF /* StoreInformationViewModelImpl.swift */, ); path = ViewModel; sourceTree = ""; @@ -470,6 +479,7 @@ 59B886572B6E3A8A005750EF /* View */ = { isa = PBXGroup; children = ( + 59B886592B6E3B40005750EF /* StoreInformationViewController.swift */, A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */, A890870E2B4F836C00767225 /* SummaryView.swift */, 592262232B61203000CA5A11 /* DetailView.swift */, @@ -484,6 +494,7 @@ children = ( A8ACB7DE2B594F4B00540BD1 /* SummaryViewModel.swift */, 592262252B61232F00CA5A11 /* DetailViewModel.swift */, + 59B8865B2B6E4B8B005750EF /* StoreInformationViewModel.swift */, ); path = Protocol; sourceTree = ""; @@ -601,6 +612,7 @@ A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */, 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */, 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */, + 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */, ); path = Extension; sourceTree = ""; @@ -944,6 +956,7 @@ 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */, 59B8862B2B6A3F7F005750EF /* UITableViewCell+Identifier.swift in Sources */, 59B886462B6A5CDC005750EF /* StoreListViewModel.swift in Sources */, + 59B8865E2B6E4B98005750EF /* StoreInformationViewModelImpl.swift in Sources */, A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */, 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, 59B886292B6A3F1E005750EF /* StoreTableViewCell.swift in Sources */, @@ -960,7 +973,9 @@ A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, 59C306B62B50027300862625 /* Store.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, + 59B8865A2B6E3B40005750EF /* StoreInformationViewController.swift in Sources */, A8A7E0622B652F0D00D015E5 /* MarkerContents.swift in Sources */, + 59B8865C2B6E4B8B005750EF /* StoreInformationViewModel.swift in Sources */, 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */, 5977BE942B59738800725C90 /* FetchStoresUseCase.swift in Sources */, 59B886502B6AB9F7005750EF /* StoreTableViewCellContents.swift in Sources */, @@ -980,6 +995,7 @@ A8ACB7EF2B5AEBB900540BD1 /* GetStoreInformationUseCaseImpl.swift in Sources */, A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */, 59C306D82B50650D00862625 /* Encodable+.swift in Sources */, + 59B886602B6E7CF6005750EF /* UIViewController+ErrorAlert.swift in Sources */, 5977BE682B553C8300725C90 /* HomeDependency.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift b/KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift new file mode 100644 index 00000000..8e30f0e9 --- /dev/null +++ b/KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift @@ -0,0 +1,20 @@ +// +// UIViewController+ErrorAlert.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/3/24. +// + +import UIKit + +extension UIViewController { + + func presentErrorAlert(error: ErrorAlertMessage) { + let alertController = UIAlertController(title: nil, message: error.errorDescription, preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: "ํ™•์ธ", style: .default)) + if !(presentedViewController is UIAlertController) { + present(alertController, animated: true) + } + } + +} From 536ad2d688b247e8952df75073c611ea0d47c0a3 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 3 Feb 2024 23:06:35 +0900 Subject: [PATCH 109/231] =?UTF-8?q?feat=20:=20SummaryView=20=EB=B0=8F=20De?= =?UTF-8?q?tailView=EB=A5=BC=20StoreInformationViewController=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20(#148)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StoreInformation/View/DetailView.swift | 95 ++++----- .../View/StoreInformationViewController.swift | 161 +++++++++++++++ .../StoreInformation/View/SummaryView.swift | 85 +++----- .../Protocol/StoreInformationViewModel.swift | 37 ++++ .../StoreInformationViewModelImpl.swift | 184 ++++++++++++++++++ 5 files changed, 450 insertions(+), 112 deletions(-) create mode 100644 KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift create mode 100644 KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/StoreInformationViewModel.swift create mode 100644 KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift diff --git a/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift b/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift index 66051433..77951afd 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift @@ -11,8 +11,6 @@ import RxRelay final class DetailView: UIView { - private let disposeBag = DisposeBag() - private lazy var storeTitle: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false @@ -139,19 +137,16 @@ final class DetailView: UIView { return view }() - private let viewModel: DetailViewModel private lazy var addressConstraint = address.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16) private lazy var phoneNumberConstraint = phoneNumber.topAnchor.constraint(equalTo: openingHoursStackView.bottomAnchor, constant: 20) - init(viewModel: DetailViewModel) { - self.viewModel = viewModel + init() { super.init(frame: .zero) setBackgroundColor() setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) addUIComponents() configureConstraints() - bind() } required init?(coder: NSCoder) { @@ -160,55 +155,6 @@ final class DetailView: UIView { } -private extension DetailView { - - func bind() { - viewModel.thumbnailImageOutput - .subscribe(onNext: { [weak self] data in - self?.storeImageView.image = UIImage(data: data) - }) - .disposed(by: disposeBag) - - viewModel.setUIContentsOutput - .bind { [weak self] detailViewContents in - guard let self = self else { return } - storeTitle.text = detailViewContents.storeTitle - category.text = detailViewContents.category - detailViewContents.certificationTypes - .map({ - CertificationLabel(certificationType: $0) - }) - .forEach { [weak self] in - self?.certificationStackView.addArrangedSubview($0) - } - address.text = detailViewContents.address - phoneNumber.text = detailViewContents.phoneNumber - setOpeningHourText(openClosedContent: detailViewContents.openClosedContent) - - var detailOpeningHours = detailViewContents.detailOpeningHour - if detailOpeningHours.isEmpty { return } - let today = detailOpeningHours.removeFirst() - openingHoursStackView.addArrangedSubview( - OpeningHoursCellView( - weekday: today.weekDay, - openingHour: today.openingHour, - isToday: true - ) - ) - detailOpeningHours.forEach { [weak self] detailOpeningHour in - self?.openingHoursStackView.addArrangedSubview( - OpeningHoursCellView( - weekday: detailOpeningHour.weekDay, - openingHour: detailOpeningHour.openingHour - ) - ) - } - } - .disposed(by: disposeBag) - } - -} - private extension DetailView { func setBackgroundColor() { @@ -351,9 +297,42 @@ private extension DetailView { extension DetailView { - func setUIContents(store: Store) { - resetUIContents() - viewModel.action(input: .setUIContents(store: store)) + func setUIContents(contents: DetailViewContents) { + storeTitle.text = contents.storeTitle + category.text = contents.category + contents.certificationTypes + .map({ + CertificationLabel(certificationType: $0) + }) + .forEach { [weak self] in + self?.certificationStackView.addArrangedSubview($0) + } + address.text = contents.address + phoneNumber.text = contents.phoneNumber + setOpeningHourText(openClosedContent: contents.openClosedContent) + + var detailOpeningHours = contents.detailOpeningHour + if detailOpeningHours.isEmpty { return } + let today = detailOpeningHours.removeFirst() + openingHoursStackView.addArrangedSubview( + OpeningHoursCellView( + weekday: today.weekDay, + openingHour: today.openingHour, + isToday: true + ) + ) + detailOpeningHours.forEach { [weak self] detailOpeningHour in + self?.openingHoursStackView.addArrangedSubview( + OpeningHoursCellView( + weekday: detailOpeningHour.weekDay, + openingHour: detailOpeningHour.openingHour + ) + ) + } + } + + func setThumbnailImage(imageData: Data) { + storeImageView.image = UIImage(data: imageData) } func resetUIContents() { diff --git a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift new file mode 100644 index 00000000..2968e8b5 --- /dev/null +++ b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift @@ -0,0 +1,161 @@ +// +// StoreInformationViewController.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/3/24. +// + +import UIKit +import RxRelay +import RxSwift + +final class StoreInformationViewController: UIViewController { + + private let disposeBag = DisposeBag() + + private lazy var summaryView: SummaryView = { + let view = SummaryView( + summaryViewHeightObserver: summaryViewHeightObserver + ) + view.translatesAutoresizingMaskIntoConstraints = false + + return view + }() + + private let summaryViewHeightObserver: PublishRelay + + private lazy var detailView: DetailView = { + let view = DetailView() + view.translatesAutoresizingMaskIntoConstraints = false + + return view + }() + + private let viewModel: StoreInformationViewModel + + init( + summaryViewHeightObserver: PublishRelay, + viewModel: StoreInformationViewModel + ) { + self.summaryViewHeightObserver = summaryViewHeightObserver + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + dismissAll() + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) + setBackgroundColor() + addUIComponents() + configureConstraints() + bind() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension StoreInformationViewController { + + func bind() { + viewModel.errorAlertOutput + .bind { [weak self] error in + self?.presentErrorAlert(error: error) + } + .disposed(by: disposeBag) + + viewModel.thumbnailImageOutput + .bind { [weak self] imageData in + self?.summaryView.setThumbnailImage(imageData: imageData) + self?.detailView.setThumbnailImage(imageData: imageData) + } + .disposed(by: disposeBag) + + viewModel.summaryCallButtonOutput + .bind { [weak self] phoneNumber in + self?.summaryView.setCallButton(phoneNumber: phoneNumber) + } + .disposed(by: disposeBag) + + viewModel.setSummaryUIContentsOutput + .bind { [weak self] contents in + self?.summaryView.setUIContents(contents: contents) + } + .disposed(by: disposeBag) + + viewModel.setDetailUIContentsOutput + .bind { [weak self] contents in + self?.detailView.setUIContents(contents: contents) + } + .disposed(by: disposeBag) + } + + func setUIContents(store: Store) { + summaryView.resetUIContents() + detailView.resetUIContents() + viewModel.action(input: .setUIContents(store: store)) + } + + func changeToSummary() { + summaryView.isUserInteractionEnabled = true + detailView.isUserInteractionEnabled = false + UIView.animate(withDuration: 0.3) { [weak self] in + self?.summaryView.alpha = 1 + self?.detailView.alpha = 0 + } + } + + func changeToDetail() { + summaryView.isUserInteractionEnabled = false + detailView.isUserInteractionEnabled = true + UIView.animate(withDuration: 0.3) { [weak self] in + self?.summaryView.alpha = 0 + self?.detailView.alpha = 1 + } + } + + func dismissAll() { + summaryView.isUserInteractionEnabled = false + detailView.isUserInteractionEnabled = false + UIView.animate(withDuration: 0.3) { [weak self] in + self?.summaryView.alpha = 0 + self?.detailView.alpha = 0 + } + } + +} + +private extension StoreInformationViewController { + + func setBackgroundColor() { + view.backgroundColor = .white + } + + func addUIComponents() { + view.addSubview(summaryView) + view.addSubview(detailView) + } + + func configureConstraints() { + + NSLayoutConstraint.activate([ + summaryView.topAnchor.constraint(equalTo: view.topAnchor), + summaryView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + summaryView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + summaryView.trailingAnchor.constraint(equalTo: view.trailingAnchor) + ]) + + NSLayoutConstraint.activate([ + detailView.topAnchor.constraint(equalTo: view.topAnchor), + detailView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + detailView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + detailView.trailingAnchor.constraint(equalTo: view.trailingAnchor) + ]) + + } + +} diff --git a/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift index c4cb833f..dc5b160c 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift @@ -11,8 +11,6 @@ import RxCocoa final class SummaryView: UIView { - private let disposeBag = DisposeBag() - private lazy var storeTitle: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false @@ -95,11 +93,9 @@ final class SummaryView: UIView { return view }() - private let viewModel: SummaryViewModel private let summaryViewHeightObserver: PublishRelay - init(viewModel: SummaryViewModel, summaryViewHeightObserver: PublishRelay) { - self.viewModel = viewModel + init(summaryViewHeightObserver: PublishRelay) { self.summaryViewHeightObserver = summaryViewHeightObserver super.init(frame: .zero) @@ -107,7 +103,6 @@ final class SummaryView: UIView { setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) addUIComponents() configureConstraints() - bind() } required init?(coder: NSCoder) { @@ -115,51 +110,6 @@ final class SummaryView: UIView { } } -private extension SummaryView { - - func bind() { - viewModel.setUIContentsOutput - .bind { [weak self] contents in - guard let self = self else { return } - storeTitle.text = contents.storeTitle - if storeTitle.numberOfVisibleLines == 1 { - summaryViewHeightObserver.accept(230) - } else { - summaryViewHeightObserver.accept(253) - } - storeOpenClosed.text = contents.openClosedContent.openClosedType.rawValue - openingHour.text = contents.openClosedContent.nextOpeningHour - category.text = contents.category - contents.certificationTypes - .map({ - CertificationLabel(certificationType: $0) - }) - .forEach { [weak self] in - self?.certificationStackView.addArrangedSubview($0) - } - } - .disposed(by: disposeBag) - - viewModel.thumbnailImageOutput - .subscribe(onNext: { [weak self] data in - self?.storeImageView.image = UIImage(data: data) - }) - .disposed(by: disposeBag) - - viewModel.callButtonOutput - .bind { [weak self] phoneNumber in - guard let self = self else { return } - storeCallButton.isHidden = false - callDisposable = storeCallButton.rx.tap - .bind { [weak self] _ in - self?.callButtonTapped(phoneNum: phoneNumber) - } - } - .disposed(by: disposeBag) - } - -} - private extension SummaryView { func setBackgroundColor() { @@ -236,11 +186,38 @@ private extension SummaryView { extension SummaryView { - func setUIContents(store: Store) { - resetUIContents() - viewModel.action(input: .setUIContents(store: store)) + func setUIContents(contents: SummaryViewContents) { + storeTitle.text = contents.storeTitle + if storeTitle.numberOfVisibleLines == 1 { + summaryViewHeightObserver.accept(230) + } else { + summaryViewHeightObserver.accept(253) + } + storeOpenClosed.text = contents.openClosedContent.openClosedType.rawValue + openingHour.text = contents.openClosedContent.nextOpeningHour + category.text = contents.category + contents.certificationTypes + .map({ + CertificationLabel(certificationType: $0) + }) + .forEach { [weak self] in + self?.certificationStackView.addArrangedSubview($0) + } + } + + func setThumbnailImage(imageData: Data) { + storeImageView.image = UIImage(data: imageData) + } + + func setCallButton(phoneNumber: String) { + storeCallButton.isHidden = false + callDisposable = storeCallButton.rx.tap + .bind { [weak self] _ in + self?.callButtonTapped(phoneNum: phoneNumber) + } } + // TODO: ์ดˆ๊ธฐํ™” ์‹œ์  ์žฌ์„ค์ • func resetUIContents() { storeTitle.text = nil category.text = nil diff --git a/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/StoreInformationViewModel.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/StoreInformationViewModel.swift new file mode 100644 index 00000000..a226b0eb --- /dev/null +++ b/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/StoreInformationViewModel.swift @@ -0,0 +1,37 @@ +// +// StoreInformationViewModel.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/3/24. +// + +import RxRelay + +protocol StoreInformationViewModel: StoreInformationViewModelInput, StoreInformationViewModelOutput { + + var getOpenClosedUseCase: GetOpenClosedUseCase { get } + var fetchImageUseCase: FetchImageUseCase { get } + +} + +enum StoreInformationViewModelInputCase { + + case setUIContents(store: Store) + +} + +protocol StoreInformationViewModelInput { + + func action(input: StoreInformationViewModelInputCase) + +} + +protocol StoreInformationViewModelOutput { + + var setDetailUIContentsOutput: PublishRelay { get } + var setSummaryUIContentsOutput: PublishRelay { get } + var thumbnailImageOutput: PublishRelay { get } + var summaryCallButtonOutput: PublishRelay { get } + var errorAlertOutput: PublishRelay { get } + +} diff --git a/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift new file mode 100644 index 00000000..dd6e0750 --- /dev/null +++ b/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift @@ -0,0 +1,184 @@ +// +// StoreInformationViewModelImpl.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/3/24. +// + +import RxRelay +import RxSwift + +final class StoreInformationViewModelImpl: StoreInformationViewModel { + + private let disposeBag = DisposeBag() + + let getOpenClosedUseCase: GetOpenClosedUseCase + let fetchImageUseCase: FetchImageUseCase + + let setDetailUIContentsOutput = PublishRelay() + let setSummaryUIContentsOutput = PublishRelay() + let thumbnailImageOutput = PublishRelay() + let summaryCallButtonOutput = PublishRelay() + let errorAlertOutput = PublishRelay() + + init(getOpenClosedUseCase: GetOpenClosedUseCase, fetchImageUseCase: FetchImageUseCase) { + self.getOpenClosedUseCase = getOpenClosedUseCase + self.fetchImageUseCase = fetchImageUseCase + } + + func action(input: StoreInformationViewModelInputCase) { + switch input { + case .setUIContents(let store): + setUIContents(store: store) + } + } + +} + +private extension StoreInformationViewModelImpl { + + func setUIContents(store: Store) { + fetchThumbnailImage(localPhotos: store.localPhotos) + + if let phoneNumber = store.phoneNumber { + summaryCallButtonOutput.accept(phoneNumber) + } + + do { + let openClosedContent = try getOpenClosedUseCase.execute(openingHours: store.openingHour) + setSummaryUIContentsOutput.accept( + SummaryViewContents( + storeTitle: store.title, + category: store.category, + certificationTypes: store.certificationTypes, + openClosedContent: openClosedContent + ) + ) + setDetailUIContentsOutput.accept( + DetailViewContents( + storeTitle: store.title, + category: store.category, + certificationTypes: store.certificationTypes, + address: store.address, + phoneNumber: store.phoneNumber ?? "์ „ํ™”๋ฒˆํ˜ธ ์ •๋ณด ์—†์Œ", + openClosedContent: openClosedContent, + detailOpeningHour: detailOpeningHour(openingHours: store.openingHour) + ) + ) + } catch { + errorAlertOutput.accept(.data) + } + } + + func fetchThumbnailImage(localPhotos: [String]) { + guard let url = localPhotos.first else { return } + fetchImageUseCase.execute(url: url) + .subscribe( + onNext: { [weak self] imageData in + self?.thumbnailImageOutput.accept(imageData) + }, + onError: { [weak self] _ in + self?.errorAlertOutput.accept(.server) + } + ) + .disposed(by: disposeBag) + } + +} + + +private extension StoreInformationViewModelImpl { + + func detailOpeningHour(openingHours: [RegularOpeningHours]) -> [DetailOpeningHour] { + if openingHours.isEmpty { return [] } + var detailOpeningHourArray: [DetailOpeningHour] = [] + + let today = Date().weekDay + for idx in today.. String { + var format = "%02d:%02d - %02d:%02d" + if isBreakTime { + format = "%02d:%02d - %02d:%02d ๋ธŒ๋ ˆ์ดํฌ ํƒ€์ž„" + } + + return String( + format: format, + open.hour, + open.minute, + close.hour, + close.minute + ) + } + +} From eb310843f1ba57ad6d9d08c7225d94f30139d429 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sat, 3 Feb 2024 23:17:25 +0900 Subject: [PATCH 110/231] =?UTF-8?q?build=20:=20deployment=20target=2016.0?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20(#148)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 3a4ab741..8f9343fc 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -1089,7 +1089,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -1147,7 +1147,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -1177,7 +1177,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1214,7 +1214,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", From ac8ba3411a46c366ac312cb40eb97bb6366535f0 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 03:21:21 +0900 Subject: [PATCH 111/231] =?UTF-8?q?chore=20:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20(#148)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 24 +-- .../View/StoreInformationView.swift | 123 ------------- .../ViewModel/DetailViewModelImpl.swift | 167 ------------------ .../ViewModel/Protocol/DetailViewModel.swift | 36 ---- .../ViewModel/Protocol/SummaryViewModel.swift | 39 ---- .../ViewModel/SummaryViewModelImpl.swift | 75 -------- 6 files changed, 4 insertions(+), 460 deletions(-) delete mode 100644 KCS/KCS/Presentation/StoreInformation/View/StoreInformationView.swift delete mode 100644 KCS/KCS/Presentation/StoreInformation/ViewModel/DetailViewModelImpl.swift delete mode 100644 KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/DetailViewModel.swift delete mode 100644 KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/SummaryViewModel.swift delete mode 100644 KCS/KCS/Presentation/StoreInformation/ViewModel/SummaryViewModelImpl.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 8f9343fc..13e3cdf4 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -14,8 +14,6 @@ 591A88862B384E610059E40F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 591A88852B384E610059E40F /* Assets.xcassets */; }; 591A88892B384E610059E40F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 591A88872B384E610059E40F /* LaunchScreen.storyboard */; }; 592262242B61203000CA5A11 /* DetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262232B61203000CA5A11 /* DetailView.swift */; }; - 592262262B61232F00CA5A11 /* DetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262252B61232F00CA5A11 /* DetailViewModel.swift */; }; - 592262282B6124C400CA5A11 /* DetailViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */; }; 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */; }; 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */; }; 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE572B5524D500725C90 /* RefreshButton.swift */; }; @@ -45,6 +43,7 @@ 59B8865C2B6E4B8B005750EF /* StoreInformationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865B2B6E4B8B005750EF /* StoreInformationViewModel.swift */; }; 59B8865E2B6E4B98005750EF /* StoreInformationViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865D2B6E4B98005750EF /* StoreInformationViewModelImpl.swift */; }; 59B886602B6E7CF6005750EF /* UIViewController+ErrorAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */; }; + 59B886622B6E8484005750EF /* UISheetPresentationController+Detent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -84,7 +83,6 @@ A81EFBC72B5D597400D0C0D7 /* Pretendard-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBBE2B5D597400D0C0D7 /* Pretendard-Bold.ttf */; }; A81EFBC82B5D597400D0C0D7 /* Pretendard-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */; }; A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */; }; - A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */; }; A89087042B4E7F3500767225 /* FilterButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087032B4E7F3500767225 /* FilterButton.swift */; }; A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; @@ -96,8 +94,6 @@ A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */; }; A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DA2B58B51A00540BD1 /* Date+.swift */; }; A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */; }; - A8ACB7DF2B594F4B00540BD1 /* SummaryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7DE2B594F4B00540BD1 /* SummaryViewModel.swift */; }; - A8ACB7E22B594F7400540BD1 /* SummaryViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E12B594F7400540BD1 /* SummaryViewModelImpl.swift */; }; A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */; }; A8ACB7EA2B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */; }; A8ACB7ED2B59647400540BD1 /* OpeningHourError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8ACB7EC2B59647400540BD1 /* OpeningHourError.swift */; }; @@ -129,8 +125,6 @@ 591A88882B384E610059E40F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 591A888A2B384E610059E40F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 592262232B61203000CA5A11 /* DetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailView.swift; sourceTree = ""; }; - 592262252B61232F00CA5A11 /* DetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewModel.swift; sourceTree = ""; }; - 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewModelImpl.swift; sourceTree = ""; }; 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlertMessage.swift; sourceTree = ""; }; 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewContents.swift; sourceTree = ""; }; 5977BE572B5524D500725C90 /* RefreshButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshButton.swift; sourceTree = ""; }; @@ -162,6 +156,7 @@ 59B8865B2B6E4B8B005750EF /* StoreInformationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewModel.swift; sourceTree = ""; }; 59B8865D2B6E4B98005750EF /* StoreInformationViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewModelImpl.swift; sourceTree = ""; }; 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+ErrorAlert.swift"; sourceTree = ""; }; + 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISheetPresentationController+Detent.swift"; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -205,7 +200,6 @@ A81EFBBE2B5D597400D0C0D7 /* Pretendard-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.ttf"; sourceTree = ""; }; A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Light.ttf"; sourceTree = ""; }; A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = ""; }; - A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationView.swift; sourceTree = ""; }; A89087032B4E7F3500767225 /* FilterButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterButton.swift; sourceTree = ""; }; A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; @@ -217,8 +211,6 @@ A8ACB7D72B57BE7D00540BD1 /* StoreRepositoryError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepositoryError.swift; sourceTree = ""; }; A8ACB7DA2B58B51A00540BD1 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A8ACB7DC2B58E3DE00540BD1 /* OpenClosedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenClosedType.swift; sourceTree = ""; }; - A8ACB7DE2B594F4B00540BD1 /* SummaryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewModel.swift; sourceTree = ""; }; - A8ACB7E12B594F7400540BD1 /* SummaryViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewModelImpl.swift; sourceTree = ""; }; A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetOpenClosedUseCase.swift; sourceTree = ""; }; A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetOpenClosedUseCaseImpl.swift; sourceTree = ""; }; A8ACB7EC2B59647400540BD1 /* OpeningHourError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpeningHourError.swift; sourceTree = ""; }; @@ -469,8 +461,6 @@ isa = PBXGroup; children = ( 59B886582B6E3A8E005750EF /* Protocol */, - A8ACB7E12B594F7400540BD1 /* SummaryViewModelImpl.swift */, - 592262272B6124C400CA5A11 /* DetailViewModelImpl.swift */, 59B8865D2B6E4B98005750EF /* StoreInformationViewModelImpl.swift */, ); path = ViewModel; @@ -480,7 +470,6 @@ isa = PBXGroup; children = ( 59B886592B6E3B40005750EF /* StoreInformationViewController.swift */, - A81EFBD32B6019FD00D0C0D7 /* StoreInformationView.swift */, A890870E2B4F836C00767225 /* SummaryView.swift */, 592262232B61203000CA5A11 /* DetailView.swift */, A802D1F52B5277620091FDE7 /* CertificationLabel.swift */, @@ -492,8 +481,6 @@ 59B886582B6E3A8E005750EF /* Protocol */ = { isa = PBXGroup; children = ( - A8ACB7DE2B594F4B00540BD1 /* SummaryViewModel.swift */, - 592262252B61232F00CA5A11 /* DetailViewModel.swift */, 59B8865B2B6E4B8B005750EF /* StoreInformationViewModel.swift */, ); path = Protocol; @@ -613,6 +600,7 @@ 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */, 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */, 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */, + 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */, ); path = Extension; sourceTree = ""; @@ -932,8 +920,6 @@ A8AE4B1B2B62A60B00632355 /* OpeningHoursCellView.swift in Sources */, A89087042B4E7F3500767225 /* FilterButton.swift in Sources */, 59F478B12B59BB00002FEF9E /* ImageRepositoryError.swift in Sources */, - 592262282B6124C400CA5A11 /* DetailViewModelImpl.swift in Sources */, - 592262262B61232F00CA5A11 /* DetailViewModel.swift in Sources */, 59C306C92B501B9D00862625 /* RegularOpeningHours.swift in Sources */, 59F478B52B59BE0B002FEF9E /* FetchImageUseCase.swift in Sources */, 59C306BF2B50109100862625 /* Location.swift in Sources */, @@ -957,13 +943,11 @@ 59B8862B2B6A3F7F005750EF /* UITableViewCell+Identifier.swift in Sources */, 59B886462B6A5CDC005750EF /* StoreListViewModel.swift in Sources */, 59B8865E2B6E4B98005750EF /* StoreInformationViewModelImpl.swift in Sources */, - A81EFBD42B6019FD00D0C0D7 /* StoreInformationView.swift in Sources */, 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, 59B886292B6A3F1E005750EF /* StoreTableViewCell.swift in Sources */, 592262242B61203000CA5A11 /* DetailView.swift in Sources */, A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, - A8ACB7E22B594F7400540BD1 /* SummaryViewModelImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */, A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */, @@ -989,11 +973,11 @@ 59C306AD2B4FFAC700862625 /* StoreDTO.swift in Sources */, 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */, 5977BE982B5999E000725C90 /* FetchStoresUseCaseImpl.swift in Sources */, - A8ACB7DF2B594F4B00540BD1 /* SummaryViewModel.swift in Sources */, A8ACB7F12B5AEBE300540BD1 /* GetStoreInformationUseCase.swift in Sources */, 591A887F2B384E600059E40F /* SceneDelegate.swift in Sources */, A8ACB7EF2B5AEBB900540BD1 /* GetStoreInformationUseCaseImpl.swift in Sources */, A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */, + 59B886622B6E8484005750EF /* UISheetPresentationController+Detent.swift in Sources */, 59C306D82B50650D00862625 /* Encodable+.swift in Sources */, 59B886602B6E7CF6005750EF /* UIViewController+ErrorAlert.swift in Sources */, 5977BE682B553C8300725C90 /* HomeDependency.swift in Sources */, diff --git a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationView.swift b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationView.swift deleted file mode 100644 index ba3ba5a2..00000000 --- a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationView.swift +++ /dev/null @@ -1,123 +0,0 @@ -// -// StoreInformationView.swift -// KCS -// -// Created by ๊น€์˜ํ˜„ on 1/24/24. -// - -import UIKit -import RxRelay - -final class StoreInformationView: UIView { - - private lazy var summaryView: SummaryView = { - let view = SummaryView( - viewModel: summaryViewModel, - summaryViewHeightObserver: summaryViewHeightObserver - ) - view.translatesAutoresizingMaskIntoConstraints = false - - return view - }() - - private let summaryViewModel: SummaryViewModel - private let summaryViewHeightObserver: PublishRelay - - private lazy var detailView: DetailView = { - let view = DetailView(viewModel: detailViewModel) - view.translatesAutoresizingMaskIntoConstraints = false - - return view - }() - - private let detailViewModel: DetailViewModel - - init( - summaryViewModel: SummaryViewModel, - summaryViewHeightObserver: PublishRelay, - detailViewModel: DetailViewModel - ) { - self.summaryViewModel = summaryViewModel - self.summaryViewHeightObserver = summaryViewHeightObserver - self.detailViewModel = detailViewModel - super.init(frame: .zero) - - setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) - setBackgroundColor() - addUIComponents() - configureConstraints() - dismissAll() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} - -extension StoreInformationView { - - func setUIContents(store: Store) { - summaryView.setUIContents(store: store) - detailView.setUIContents(store: store) - } - - func changeToSummary() { - summaryView.isUserInteractionEnabled = true - detailView.isUserInteractionEnabled = false - UIView.animate(withDuration: 0.3) { [weak self] in - self?.summaryView.alpha = 1 - self?.detailView.alpha = 0 - } - } - - func changeToDetail() { - summaryView.isUserInteractionEnabled = false - detailView.isUserInteractionEnabled = true - UIView.animate(withDuration: 0.3) { [weak self] in - self?.summaryView.alpha = 0 - self?.detailView.alpha = 1 - } - } - - func dismissAll() { - summaryView.isUserInteractionEnabled = false - detailView.isUserInteractionEnabled = false - UIView.animate(withDuration: 0.3) { [weak self] in - self?.summaryView.alpha = 0 - self?.detailView.alpha = 0 - } - } - -} - -private extension StoreInformationView { - - func setBackgroundColor() { - backgroundColor = .white - } - - func addUIComponents() { - addSubview(summaryView) - addSubview(detailView) - } - - func configureConstraints() { - - NSLayoutConstraint.activate([ - summaryView.topAnchor.constraint(equalTo: topAnchor), - summaryView.bottomAnchor.constraint(equalTo: bottomAnchor), - summaryView.leadingAnchor.constraint(equalTo: leadingAnchor), - summaryView.trailingAnchor.constraint(equalTo: trailingAnchor) - ]) - - NSLayoutConstraint.activate([ - detailView.topAnchor.constraint(equalTo: topAnchor), - detailView.bottomAnchor.constraint(equalTo: bottomAnchor), - detailView.leadingAnchor.constraint(equalTo: leadingAnchor), - detailView.trailingAnchor.constraint(equalTo: trailingAnchor) - ]) - - } - -} diff --git a/KCS/KCS/Presentation/StoreInformation/ViewModel/DetailViewModelImpl.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/DetailViewModelImpl.swift deleted file mode 100644 index 202b4197..00000000 --- a/KCS/KCS/Presentation/StoreInformation/ViewModel/DetailViewModelImpl.swift +++ /dev/null @@ -1,167 +0,0 @@ -// -// DetailViewModelImpl.swift -// KCS -// -// Created by ์กฐ์„ฑ๋ฏผ on 1/24/24. -// - -import RxSwift -import RxRelay - -final class DetailViewModelImpl: DetailViewModel { - - private let disposeBag = DisposeBag() - - let getOpenClosedUseCase: GetOpenClosedUseCase - let fetchImageUseCase: FetchImageUseCase - - let setUIContentsOutput = PublishRelay() - let thumbnailImageOutput = PublishRelay() - let errorAlertOutput = PublishRelay() - - init(getOpenClosedUseCase: GetOpenClosedUseCase, fetchImageUseCase: FetchImageUseCase) { - self.getOpenClosedUseCase = getOpenClosedUseCase - self.fetchImageUseCase = fetchImageUseCase - } - - func action(input: DetailViewModelInputCase) { - switch input { - case .setUIContents(let store): - setUIContents(store: store) - } - } - -} - -private extension DetailViewModelImpl { - - func setUIContents(store: Store) { - fetchThumbnailImage(localPhotos: store.localPhotos) - do { - setUIContentsOutput.accept( - DetailViewContents( - storeTitle: store.title, - category: store.category, - certificationTypes: store.certificationTypes, - address: store.address, - phoneNumber: store.phoneNumber ?? "์ „ํ™”๋ฒˆํ˜ธ ์ •๋ณด ์—†์Œ", - openClosedContent: try getOpenClosedUseCase.execute(openingHours: store.openingHour), - detailOpeningHour: detailOpeningHour(openingHours: store.openingHour) - ) - ) - } catch { - errorAlertOutput.accept(.data) - } - } - - func fetchThumbnailImage(localPhotos: [String]) { - guard let url = localPhotos.first else { return } - fetchImageUseCase.execute(url: url) - .subscribe( - onNext: { [weak self] imageData in - self?.thumbnailImageOutput.accept(imageData) - }, - onError: { [weak self] _ in - self?.errorAlertOutput.accept(.server) - } - ) - .disposed(by: disposeBag) - } - -} - -private extension DetailViewModelImpl { - - func detailOpeningHour(openingHours: [RegularOpeningHours]) -> [DetailOpeningHour] { - if openingHours.isEmpty { return [] } - var detailOpeningHourArray: [DetailOpeningHour] = [] - - let today = Date().weekDay - for idx in today.. String { - var format = "%02d:%02d - %02d:%02d" - if isBreakTime { - format = "%02d:%02d - %02d:%02d ๋ธŒ๋ ˆ์ดํฌ ํƒ€์ž„" - } - - return String( - format: format, - open.hour, - open.minute, - close.hour, - close.minute - ) - } - -} diff --git a/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/DetailViewModel.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/DetailViewModel.swift deleted file mode 100644 index 540bb5dd..00000000 --- a/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/DetailViewModel.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// DetailViewModel.swift -// KCS -// -// Created by ์กฐ์„ฑ๋ฏผ on 1/24/24. -// - -import RxSwift -import RxRelay - -protocol DetailViewModel: DetailViewModelInput, DetailViewModelOutput { - - var getOpenClosedUseCase: GetOpenClosedUseCase { get } - var fetchImageUseCase: FetchImageUseCase { get } - -} - -enum DetailViewModelInputCase { - - case setUIContents(store: Store) - -} - -protocol DetailViewModelInput { - - func action(input: DetailViewModelInputCase) - -} - -protocol DetailViewModelOutput { - - var setUIContentsOutput: PublishRelay { get } - var thumbnailImageOutput: PublishRelay { get } - var errorAlertOutput: PublishRelay { get } - -} diff --git a/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/SummaryViewModel.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/SummaryViewModel.swift deleted file mode 100644 index 2323a16c..00000000 --- a/KCS/KCS/Presentation/StoreInformation/ViewModel/Protocol/SummaryViewModel.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// SummaryViewModel.swift -// KCS -// -// Created by ๊น€์˜ํ˜„ on 1/18/24. -// - -import RxSwift -import RxRelay - -protocol SummaryViewModel: SummaryViewModelInput, SummaryViewModelOutput { - - var getOpenClosedUseCase: GetOpenClosedUseCase { get } - var fetchImageUseCase: FetchImageUseCase { get } - -} - -enum SummaryViewInputCase { - - case setUIContents( - store: Store - ) - -} - -protocol SummaryViewModelInput { - - func action(input: SummaryViewInputCase) - -} - -protocol SummaryViewModelOutput { - - var setUIContentsOutput: PublishRelay { get } - var thumbnailImageOutput: PublishRelay { get } - var callButtonOutput: PublishRelay { get } - var errorAlertOutput: PublishRelay { get } - -} diff --git a/KCS/KCS/Presentation/StoreInformation/ViewModel/SummaryViewModelImpl.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/SummaryViewModelImpl.swift deleted file mode 100644 index f46da113..00000000 --- a/KCS/KCS/Presentation/StoreInformation/ViewModel/SummaryViewModelImpl.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// SummaryViewModelImpl.swift -// KCS -// -// Created by ๊น€์˜ํ˜„ on 1/18/24. -// - -import RxSwift -import RxRelay - -final class SummaryViewModelImpl: SummaryViewModel { - - private let disposeBag = DisposeBag() - - let getOpenClosedUseCase: GetOpenClosedUseCase - let fetchImageUseCase: FetchImageUseCase - - let setUIContentsOutput = PublishRelay() - let thumbnailImageOutput = PublishRelay() - let callButtonOutput = PublishRelay() - let errorAlertOutput = PublishRelay() - - init(getOpenClosedUseCase: GetOpenClosedUseCase, fetchImageUseCase: FetchImageUseCase) { - self.getOpenClosedUseCase = getOpenClosedUseCase - self.fetchImageUseCase = fetchImageUseCase - } - - func action(input: SummaryViewInputCase) { - switch input { - case .setUIContents(store: let store): - setUIContents(store: store) - } - } - -} - -private extension SummaryViewModelImpl { - - func setUIContents(store: Store) { - do { - let openClosedContent = try getOpenClosedUseCase.execute(openingHours: store.openingHour) - - fetchThumbnailImage(localPhotos: store.localPhotos) - if let phoneNumber = store.phoneNumber { - callButtonOutput.accept(phoneNumber) - } - - setUIContentsOutput.accept( - SummaryViewContents( - storeTitle: store.title, - category: store.category, - certificationTypes: store.certificationTypes, - openClosedContent: openClosedContent - ) - ) - } catch { - errorAlertOutput.accept(.data) - } - } - - func fetchThumbnailImage(localPhotos: [String]) { - guard let url = localPhotos.first else { return } - fetchImageUseCase.execute(url: url) - .subscribe( - onNext: { [weak self] imageData in - self?.thumbnailImageOutput.accept(imageData) - }, - onError: { [weak self] _ in - self?.errorAlertOutput.accept(.server) - } - ) - .disposed(by: disposeBag) - } - -} From 11f88b0344c4a2ed925e53647f3f9f58aff290f4 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 03:22:27 +0900 Subject: [PATCH 112/231] feat : UISheetPresentationController Detent (#148) --- ...UISheetPresentationController+Detent.swift | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift diff --git a/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift b/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift new file mode 100644 index 00000000..0e40274c --- /dev/null +++ b/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift @@ -0,0 +1,28 @@ +// +// UISheetPresentationController+Detent.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/3/24. +// + +import UIKit + +extension UISheetPresentationController.Detent.Identifier { + static let smallSummaryDetentIdentifier = UISheetPresentationController.Detent.Identifier("SmallSummaryDetent") + static let largeSummaryDetentIdentifier = UISheetPresentationController.Detent.Identifier("LargeSummaryDetent") + static let detailDetentIdentifier = UISheetPresentationController.Detent.Identifier("DetailDetent") +} + +extension UISheetPresentationController.Detent { + + static let smallSummaryViewDetent = custom(identifier: .smallSummaryDetentIdentifier) { _ in + return 230 - 21 + } + static let largeSummaryViewDetent = custom(identifier: .largeSummaryDetentIdentifier) { _ in + return 253 - 21 + } + static let detailViewDetent = custom(identifier: .detailDetentIdentifier) { _ in + return 616 - 21 + } + +} From 0059f070269e84accc507adda3dfb65f7d73c4d1 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 03:23:33 +0900 Subject: [PATCH 113/231] =?UTF-8?q?feat=20:=20DetailView,=20SummaryView?= =?UTF-8?q?=EB=A5=BC=20StoreInformationViewController=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20(#148)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StoreInformation/View/DetailView.swift | 18 ---------------- .../View/StoreInformationViewController.swift | 4 ++-- .../StoreInformation/View/SummaryView.swift | 21 ++----------------- .../StoreInformationViewModelImpl.swift | 1 - 4 files changed, 4 insertions(+), 40 deletions(-) diff --git a/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift b/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift index 77951afd..c3117252 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift @@ -128,15 +128,6 @@ final class DetailView: UIView { return label }() - private let dismissIndicatorView: UIView = { - let view = UIView() - view.translatesAutoresizingMaskIntoConstraints = false - view.backgroundColor = UIColor.swipeBar - view.layer.cornerRadius = 2 - - return view - }() - private lazy var addressConstraint = address.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16) private lazy var phoneNumberConstraint = phoneNumber.topAnchor.constraint(equalTo: openingHoursStackView.bottomAnchor, constant: 20) @@ -144,7 +135,6 @@ final class DetailView: UIView { super.init(frame: .zero) setBackgroundColor() - setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) addUIComponents() configureConstraints() } @@ -175,7 +165,6 @@ private extension DetailView { addSubview(phoneNumber) addSubview(addressIcon) addSubview(address) - addSubview(dismissIndicatorView) } func configureConstraints() { @@ -209,13 +198,6 @@ private extension DetailView { divideView.heightAnchor.constraint(equalToConstant: 6) ]) - NSLayoutConstraint.activate([ - dismissIndicatorView.topAnchor.constraint(equalTo: topAnchor, constant: 8), - dismissIndicatorView.centerXAnchor.constraint(equalTo: centerXAnchor), - dismissIndicatorView.widthAnchor.constraint(equalToConstant: 35), - dismissIndicatorView.heightAnchor.constraint(equalToConstant: 4) - ]) - NSLayoutConstraint.activate([ storeImageView.topAnchor.constraint(equalTo: divideView.bottomAnchor, constant: 16), storeImageView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16), diff --git a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift index 2968e8b5..e832d725 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift @@ -40,13 +40,13 @@ final class StoreInformationViewController: UIViewController { self.summaryViewHeightObserver = summaryViewHeightObserver self.viewModel = viewModel super.init(nibName: nil, bundle: nil) - dismissAll() + + isModalInPresentation = true } override func viewDidLoad() { super.viewDidLoad() - view.setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) setBackgroundColor() addUIComponents() configureConstraints() diff --git a/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift index dc5b160c..d35c06ae 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift @@ -84,15 +84,6 @@ final class SummaryView: UIView { private var callDisposable: Disposable? - private let dismissIndicatorView: UIView = { - let view = UIView() - view.translatesAutoresizingMaskIntoConstraints = false - view.backgroundColor = UIColor.swipeBar - view.layer.cornerRadius = 2 - - return view - }() - private let summaryViewHeightObserver: PublishRelay init(summaryViewHeightObserver: PublishRelay) { @@ -100,7 +91,6 @@ final class SummaryView: UIView { super.init(frame: .zero) setBackgroundColor() - setLayerCorner(cornerRadius: 15, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner]) addUIComponents() configureConstraints() } @@ -108,6 +98,7 @@ final class SummaryView: UIView { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + } private extension SummaryView { @@ -124,7 +115,6 @@ private extension SummaryView { addSubview(openingHour) addSubview(storeImageView) addSubview(storeCallButton) - addSubview(dismissIndicatorView) } func configureConstraints() { @@ -167,13 +157,7 @@ private extension SummaryView { storeImageView.widthAnchor.constraint(equalToConstant: 132), storeImageView.heightAnchor.constraint(equalToConstant: 132) ]) - - NSLayoutConstraint.activate([ - dismissIndicatorView.topAnchor.constraint(equalTo: topAnchor, constant: 8), - dismissIndicatorView.centerXAnchor.constraint(equalTo: centerXAnchor), - dismissIndicatorView.widthAnchor.constraint(equalToConstant: 35), - dismissIndicatorView.heightAnchor.constraint(equalToConstant: 4) - ]) + } func callButtonTapped(phoneNum: String) { @@ -217,7 +201,6 @@ extension SummaryView { } } - // TODO: ์ดˆ๊ธฐํ™” ์‹œ์  ์žฌ์„ค์ • func resetUIContents() { storeTitle.text = nil category.text = nil diff --git a/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift index dd6e0750..851d3053 100644 --- a/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift +++ b/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift @@ -86,7 +86,6 @@ private extension StoreInformationViewModelImpl { } - private extension StoreInformationViewModelImpl { func detailOpeningHour(openingHours: [RegularOpeningHours]) -> [DetailOpeningHour] { From 9737fff19001c47ffde90b7f082799fc943f159a Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 03:24:11 +0900 Subject: [PATCH 114/231] =?UTF-8?q?refactor=20:=20Home=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20=EB=B0=8F=20Gesture=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20(#148)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 29 ++- .../Home/View/HomeViewController.swift | 233 +++++------------- .../Home/ViewModel/HomeDependency.swift | 10 - .../Home/ViewModel/HomeViewModelImpl.swift | 110 +-------- .../ViewModel/protocol/HomeViewModel.swift | 10 +- 5 files changed, 84 insertions(+), 308 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index c287106d..a419877e 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -6,11 +6,12 @@ // import UIKit +import RxRelay class SceneDelegate: UIResponder, UIWindowSceneDelegate { - + var window: UIWindow? - + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } @@ -24,27 +25,31 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { fetchStoresUseCase: FetchStoresUseCaseImpl(repository: repository), getStoreInformationUseCase: GetStoreInformationUseCaseImpl(repository: repository) ) - let summaryViewModel = SummaryViewModelImpl( - getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), - fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) + let summaryViewHeightObserver = PublishRelay() + let storeInformationViewController = StoreInformationViewController( + summaryViewHeightObserver: summaryViewHeightObserver, + viewModel: StoreInformationViewModelImpl( + getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), + fetchImageUseCase: FetchImageUseCaseImpl( + repository: ImageRepositoryImpl(cache: ImageCache()) + ) + ) ) + window?.rootViewController = HomeViewController( viewModel: viewModel, - summaryViewModel: summaryViewModel, - detailViewModel: DetailViewModelImpl( - getOpenClosedUseCase: GetOpenClosedUseCaseImpl(), - fetchImageUseCase: FetchImageUseCaseImpl(repository: ImageRepositoryImpl()) - ), + storeInformationViewController: storeInformationViewController, storeListViewController: StoreListViewController( viewModel: StoreListViewModelImpl( fetchImageUseCase: FetchImageUseCaseImpl( repository: ImageRepositoryImpl(cache: ImageCache()) ) ) - ) + ), + summaryViewHeightObserver: summaryViewHeightObserver ) window?.makeKeyAndVisible() } - + } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 8d671d49..251ee4bc 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -14,8 +14,6 @@ import RxGesture final class HomeViewController: UIViewController { - private let disposeBag = DisposeBag() - private lazy var goodPriceFilterButton: FilterButton = { let type = CertificationType.goodPrice let button = FilterButton(type: type) @@ -79,9 +77,6 @@ final class HomeViewController: UIViewController { return button }() - private var markers: [Marker] = [] - private var clickedMarker: Marker? - private lazy var mapView: NMFNaverMapView = { let map = NMFNaverMapView() map.translatesAutoresizingMaskIntoConstraints = false @@ -160,85 +155,24 @@ final class HomeViewController: UIViewController { return view }() - private lazy var storeInformationView: StoreInformationView = { - let view = StoreInformationView( - summaryViewModel: summaryViewModel, - summaryViewHeightObserver: summaryViewHeightObserver, - detailViewModel: detailViewModel - ) - view.translatesAutoresizingMaskIntoConstraints = false - - view.rx.panGesture() - .when(.changed) - .bind { [weak self] recognizer in - guard let self = self else { return } - let transition = recognizer.translation(in: storeInformationView) - recognizer.setTranslation(.zero, in: storeInformationView) - - viewModel.action( - input: .storeInformationViewPanGestureChanged( - height: storeInformationHeightConstraint.constant - transition.y - ) - ) - } - .disposed(by: disposeBag) - - view.rx.panGesture() - .when(.ended) - .bind { [weak self] recognizer in - guard let self = self else { return } - viewModel.action( - input: .storeInformationViewSwipe( - velocity: recognizer.velocity(in: view).y - ) - ) - viewModel.action( - input: .storeInformationViewPanGestureEnded( - height: storeInformationHeightConstraint.constant - ) - ) - } - .disposed(by: disposeBag) - - view.rx.tapGesture() - .when(.ended) - .bind { [weak self] _ in - guard let self = self else { return } - viewModel.action( - input: .storeInformationViewTapGestureEnded - ) - } - .disposed(by: disposeBag) - - return view - }() - + private let disposeBag = DisposeBag() + private var markers: [Marker] = [] + private let storeInformationViewController: StoreInformationViewController + private var clickedMarker: Marker? private let storeListViewController: StoreListViewController - private let viewModel: HomeViewModel - private let summaryViewModel: SummaryViewModel - private let detailViewModel: DetailViewModel - private lazy var storeInformationHeightConstraint = storeInformationView.heightAnchor.constraint(equalToConstant: 0) - private lazy var locationButtonBottomConstraint = locationButton.bottomAnchor.constraint( - equalTo: storeInformationView.topAnchor, - constant: -37 - ) - private lazy var refreshButtonBottomConstraint = refreshButton.bottomAnchor.constraint( - equalTo: storeInformationView.topAnchor, - constant: -37 - ) - private let summaryViewHeightObserver = PublishRelay() + private let summaryViewHeightObserver: PublishRelay init( viewModel: HomeViewModel, - summaryViewModel: SummaryViewModel, - detailViewModel: DetailViewModel, - storeListViewController: StoreListViewController + storeInformationViewController: StoreInformationViewController, + storeListViewController: StoreListViewController, + summaryViewHeightObserver: PublishRelay ) { self.viewModel = viewModel - self.summaryViewModel = summaryViewModel - self.detailViewModel = detailViewModel + self.storeInformationViewController = storeInformationViewController self.storeListViewController = storeListViewController + self.summaryViewHeightObserver = summaryViewHeightObserver super.init(nibName: nil, bundle: nil) } @@ -252,6 +186,7 @@ final class HomeViewController: UIViewController { addUIComponents() configureConstraints() bind() + unDimmedView() viewModel.action( input: .checkLocationAuthorization( @@ -338,54 +273,38 @@ private extension HomeViewController { func bindStoreInformationView() { viewModel.getStoreInformationOutput .bind { [weak self] store in - self?.storeInformationView.setUIContents(store: store) - } - .disposed(by: disposeBag) - - viewModel.storeInformationViewHeightOutput - .bind { [weak self] constraints in - self?.setStoreInformationConstraints( - heightConstraint: constraints.heightConstraint, - bottomConstraint: constraints.bottomConstraint, - animated: constraints.animated - ) + self?.storeInformationViewController.setUIContents(store: store) } .disposed(by: disposeBag) - viewModel.detailToSummaryOutput + viewModel.dimViewTapGestureEndedOutput .bind { [weak self] _ in - self?.storeInformationView.changeToSummary() + self?.storeInformationViewController.changeToSummary() self?.unDimmedView() - self?.viewModel.action( - input: .changeState(state: .summary) - ) - } - .disposed(by: disposeBag) - - viewModel.summaryToDetailOutput - .bind { [weak self] _ in - self?.storeInformationView.changeToDetail() - self?.dimmedView() - self?.viewModel.action( - input: .changeState(state: .detail) - ) } .disposed(by: disposeBag) - // MARK: ์ถ”ํ›„ ์ˆ˜์ • ํ•„์š” summaryViewHeightObserver.bind { [weak self] height in - self?.viewModel.action( - input: .setStoreInformationOriginalHeight(height: height) - ) - self?.setStoreInformationConstraints( - heightConstraint: height, - bottomConstraint: -16, - animated: true - ) - self?.storeInformationView.changeToSummary() - self?.viewModel.action( - input: .changeState(state: .summary) - ) + guard let self = self else { return } + if let sheet = storeInformationViewController.sheetPresentationController { + sheet.animateChanges { + if height == 230 { // TODO: ํ•˜๋“œ์ฝ”๋”ฉ ์‚ญ์ œ + sheet.detents = [.smallSummaryViewDetent, .detailViewDetent] + sheet.selectedDetentIdentifier = .smallSummaryDetentIdentifier + } else { + sheet.detents = [.largeSummaryViewDetent, .detailViewDetent] + sheet.selectedDetentIdentifier = .largeSummaryDetentIdentifier + } + } + sheet.delegate = self + sheet.prefersGrabberVisible = true + sheet.preferredCornerRadius = 15 + sheet.largestUndimmedDetentIdentifier = .detailDetentIdentifier + } + storeInformationViewController.changeToSummary() + if !(presentedViewController is StoreInformationViewController) { + present(storeInformationViewController, animated: true) + } } .disposed(by: disposeBag) } @@ -440,18 +359,6 @@ private extension HomeViewController { self?.presentErrorAlert(error: error) } .disposed(by: disposeBag) - - summaryViewModel.errorAlertOutput - .bind { [weak self] error in - self?.presentErrorAlert(error: error) - } - .disposed(by: disposeBag) - - detailViewModel.errorAlertOutput - .bind { [weak self] error in - self?.presentErrorAlert(error: error) - } - .disposed(by: disposeBag) } } @@ -464,7 +371,7 @@ private extension HomeViewController { if let clickedMarker = self?.clickedMarker { if clickedMarker == marker { return true } clickedMarker.deselect() - self?.storeInformationViewDismiss() + self?.storeInformationViewDismiss(changeMarker: true) } self?.viewModel.action( @@ -477,29 +384,11 @@ private extension HomeViewController { } } - func storeInformationViewDismiss() { + func storeInformationViewDismiss(changeMarker: Bool = false) { clickedMarker?.deselect() clickedMarker = nil - setStoreInformationConstraints( - heightConstraint: 0, - bottomConstraint: -37, - animated: true - ) - storeInformationView.dismissAll() - viewModel.action( - input: .changeState(state: .normal) - ) - unDimmedView() - } - - func setStoreInformationConstraints(heightConstraint: CGFloat, bottomConstraint: CGFloat, animated: Bool = false) { - locationButtonBottomConstraint.constant = bottomConstraint - refreshButtonBottomConstraint.constant = bottomConstraint - storeInformationHeightConstraint.constant = heightConstraint - if animated { - UIView.animate(withDuration: 0.3) { [weak self] in - self?.view.layoutIfNeeded() - } + if !changeMarker { + storeInformationViewController.dismiss(animated: true) } } @@ -515,6 +404,11 @@ private extension HomeViewController { UIView.animate(withDuration: 0.3) { [weak self] in self?.dimView.backgroundColor = .clear } + if let sheet = storeInformationViewController.sheetPresentationController { + sheet.animateChanges { + sheet.selectedDetentIdentifier = .smallSummaryDetentIdentifier + } + } } func makeRequestLocation(projection: NMFProjection) -> RequestLocation { @@ -542,14 +436,6 @@ private extension HomeViewController { ) ) } - - func presentErrorAlert(error: ErrorAlertMessage) { - let alertController = UIAlertController(title: nil, message: error.errorDescription, preferredStyle: .alert) - alertController.addAction(UIAlertAction(title: "ํ™•์ธ", style: .default)) - if !(presentedViewController is UIAlertController) { - present(alertController, animated: true) - } - } } @@ -561,7 +447,6 @@ private extension HomeViewController { mapView.addSubview(filterButtonStackView) mapView.addSubview(refreshButton) mapView.addSubview(dimView) - mapView.addSubview(storeInformationView) } func configureConstraints() { @@ -582,8 +467,7 @@ private extension HomeViewController { NSLayoutConstraint.activate([ locationButton.leadingAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.leadingAnchor, constant: 16), locationButton.widthAnchor.constraint(equalToConstant: 48), - locationButton.heightAnchor.constraint(equalToConstant: 48), - locationButtonBottomConstraint + locationButton.heightAnchor.constraint(equalToConstant: 48) ]) NSLayoutConstraint.activate([ @@ -594,15 +478,7 @@ private extension HomeViewController { NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), refreshButton.widthAnchor.constraint(equalToConstant: 110), - refreshButton.heightAnchor.constraint(equalToConstant: 35), - refreshButtonBottomConstraint - ]) - - NSLayoutConstraint.activate([ - storeInformationView.leadingAnchor.constraint(equalTo: mapView.leadingAnchor, constant: 0), - storeInformationView.trailingAnchor.constraint(equalTo: mapView.trailingAnchor, constant: 0), - storeInformationView.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: 0), - storeInformationHeightConstraint + refreshButton.heightAnchor.constraint(equalToConstant: 35) ]) } @@ -656,3 +532,22 @@ extension HomeViewController: NMFMapViewTouchDelegate { } } + +extension HomeViewController: UISheetPresentationControllerDelegate { + + func sheetPresentationControllerDidChangeSelectedDetentIdentifier(_ sheetPresentationController: UISheetPresentationController) { + if let identifier = sheetPresentationController.selectedDetentIdentifier { + switch identifier { + case .smallSummaryDetentIdentifier, .largeSummaryDetentIdentifier: + storeInformationViewController.changeToSummary() + unDimmedView() + case .detailDetentIdentifier: + storeInformationViewController.changeToDetail() + dimmedView() + default: + break + } + } + } + +} diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift index e1b5bd19..5b473684 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift @@ -7,19 +7,9 @@ import RxSwift -enum HomeViewState { - - case normal - case summary - case detail - -} - struct HomeDependency { let disposeBag = DisposeBag() - var state: HomeViewState = .normal - var storeInformationOriginalHeight: CGFloat = 0 var activatedFilter: [CertificationType] = [] } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 197d6c42..ba20b191 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -20,15 +20,13 @@ final class HomeViewModelImpl: HomeViewModel { let refreshOutput = PublishRelay() let locationButtonOutput = PublishRelay() let locationButtonImageNameOutput = PublishRelay() - let storeInformationViewHeightOutput = PublishRelay() - let summaryToDetailOutput = PublishRelay() - let detailToSummaryOutput = PublishRelay() let setMarkerOutput = PublishRelay() let locationAuthorizationStatusDeniedOutput = PublishRelay() let locationStatusNotDeterminedOutput = PublishRelay() let locationStatusAuthorizedWhenInUse = PublishRelay() let errorAlertOutput = PublishRelay() let applyFiltersOutput = PublishRelay<[FilteredStores]>() + let dimViewTapGestureEndedOutput = PublishRelay() var dependency: HomeDependency @@ -54,20 +52,8 @@ final class HomeViewModelImpl: HomeViewModel { markerTapped(tag: tag) case .locationButtonTapped(let locationAuthorizationStatus, let positionMode): locationButtonTapped(locationAuthorizationStatus: locationAuthorizationStatus, positionMode: positionMode) - case .setStoreInformationOriginalHeight(let height): - setStoreInformationOriginalHeight(height: height) - case .storeInformationViewPanGestureChanged(let height): - storeInformationViewPanGestureChanged(height: height) - case .storeInformationViewPanGestureEnded(let height): - storeInformationViewPanGestureEnded(height: height) - case .storeInformationViewSwipe(let velocity): - storeInformationViewSwipe(velocity: velocity) - case .storeInformationViewTapGestureEnded: - storeInformationViewTapGestureEnded() case .dimViewTapGestureEnded: dimViewTapGestureEnded() - case .changeState(let state): - changeState(state: state) case .setMarker(let store, let certificationType): setMarker(store: store, certificationType: certificationType) case .checkLocationAuthorization(let status): @@ -212,100 +198,8 @@ private extension HomeViewModelImpl { } } - func setStoreInformationOriginalHeight(height: CGFloat) { - dependency.storeInformationOriginalHeight = height - } - - func storeInformationViewPanGestureChanged(height: CGFloat) { - if height > 420 && height < 630 { - storeInformationViewHeightOutput.accept( - StoreInformationViewConstraints( - heightConstraint: height, - bottomConstraint: height - (420 + 21) - ) - ) - summaryToDetailOutput.accept(()) - } else if height > 230 && height <= 420 { - storeInformationViewHeightOutput.accept( - StoreInformationViewConstraints( - heightConstraint: height, - bottomConstraint: -16 - ) - ) - detailToSummaryOutput.accept(()) - } - } - - func storeInformationViewPanGestureEnded(height: CGFloat) { - if height > 420 { - storeInformationViewHeightOutput.accept( - StoreInformationViewConstraints( - heightConstraint: 616, - bottomConstraint: 616 - 441, - animated: true - ) - ) - summaryToDetailOutput.accept(()) - } else { - storeInformationViewHeightOutput.accept( - StoreInformationViewConstraints( - heightConstraint: dependency.storeInformationOriginalHeight, - bottomConstraint: -16, - animated: true - ) - ) - detailToSummaryOutput.accept(()) - } - } - - func storeInformationViewSwipe(velocity: Double) { - if velocity < -1000 { - storeInformationViewHeightOutput.accept( - StoreInformationViewConstraints( - heightConstraint: 616, - bottomConstraint: 616 - 441, - animated: true - ) - ) - summaryToDetailOutput.accept(()) - } else if velocity > 1000 { - storeInformationViewHeightOutput.accept( - StoreInformationViewConstraints( - heightConstraint: dependency.storeInformationOriginalHeight, - bottomConstraint: -16, - animated: true - ) - ) - detailToSummaryOutput.accept(()) - } - } - - func storeInformationViewTapGestureEnded() { - if dependency.state == .summary { - storeInformationViewHeightOutput.accept( - StoreInformationViewConstraints( - heightConstraint: 616, - bottomConstraint: 616 - 441, - animated: true - ) - ) - summaryToDetailOutput.accept(()) - } - } - func dimViewTapGestureEnded() { - storeInformationViewHeightOutput.accept( - StoreInformationViewConstraints( - heightConstraint: dependency.storeInformationOriginalHeight, - bottomConstraint: -16, - animated: true - ) - ) - detailToSummaryOutput.accept(()) - } - - func changeState(state: HomeViewState) { - dependency.state = state + dimViewTapGestureEndedOutput.accept(()) } func checkLocationAuthorization(status: CLAuthorizationStatus) { diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 5d2d0eb4..fa4a24b1 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -31,13 +31,7 @@ enum HomeViewModelInputCase { case filterButtonTapped(activatedFilter: CertificationType, fetchCount: Int) case markerTapped(tag: UInt) case locationButtonTapped(locationAuthorizationStatus: CLAuthorizationStatus, positionMode: NMFMyPositionMode) - case setStoreInformationOriginalHeight(height: CGFloat) - case storeInformationViewPanGestureChanged(height: CGFloat) - case storeInformationViewPanGestureEnded(height: CGFloat) - case storeInformationViewSwipe(velocity: Double) - case storeInformationViewTapGestureEnded case dimViewTapGestureEnded - case changeState(state: HomeViewState) case setMarker(store: Store, certificationType: CertificationType) case checkLocationAuthorization(status: CLAuthorizationStatus) case checkLocationAuthorizationWhenCameraDidChange(status: CLAuthorizationStatus) @@ -57,13 +51,11 @@ protocol HomeViewModelOutput { var applyFiltersOutput: PublishRelay<[FilteredStores]> { get } var locationButtonOutput: PublishRelay { get } var locationButtonImageNameOutput: PublishRelay { get } - var storeInformationViewHeightOutput: PublishRelay { get } - var summaryToDetailOutput: PublishRelay { get } - var detailToSummaryOutput: PublishRelay { get } var setMarkerOutput: PublishRelay { get } var locationAuthorizationStatusDeniedOutput: PublishRelay { get } var locationStatusNotDeterminedOutput: PublishRelay { get } var locationStatusAuthorizedWhenInUse: PublishRelay { get } var errorAlertOutput: PublishRelay { get } + var dimViewTapGestureEndedOutput: PublishRelay { get } } From 88472e06794fba11c54ed13d62411e4bcda8d9a3 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 03:26:25 +0900 Subject: [PATCH 115/231] =?UTF-8?q?build=20:=20marketing=20version=203.0?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20View?= =?UTF-8?q?=EA=B3=BC=20ViewModel=20=EC=9C=84=EC=B9=98=20=EA=B3=A0=EC=A0=95?= =?UTF-8?q?=20(#148)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 13e3cdf4..521f2c29 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -416,8 +416,8 @@ 59B886242B6A39E9005750EF /* StoreList */ = { isa = PBXGroup; children = ( - 59B886432B6A5CB6005750EF /* ViewModel */, 59B886272B6A3AF0005750EF /* View */, + 59B886432B6A5CB6005750EF /* ViewModel */, ); path = StoreList; sourceTree = ""; @@ -1166,7 +1166,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.0; + MARKETING_VERSION = 3.0; PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1203,7 +1203,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.0; + MARKETING_VERSION = 3.0; PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; From 78331c76ede4c28433d0c8392ef027d62e79a6fd Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 04:19:42 +0900 Subject: [PATCH 116/231] =?UTF-8?q?feat=20:=20Summary=20Height=20Case=20en?= =?UTF-8?q?um=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20(#148)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ++++ KCS/KCS/Application/SceneDelegate.swift | 2 +- KCS/KCS/Domain/Entity/SummaryViewHeightCase.swift | 15 +++++++++++++++ .../Home/View/HomeViewController.swift | 11 ++++++----- .../View/StoreInformationViewController.swift | 13 ++----------- .../StoreInformation/View/SummaryView.swift | 8 ++++---- 6 files changed, 32 insertions(+), 21 deletions(-) create mode 100644 KCS/KCS/Domain/Entity/SummaryViewHeightCase.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 521f2c29..30b89e2f 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -44,6 +44,7 @@ 59B8865E2B6E4B98005750EF /* StoreInformationViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865D2B6E4B98005750EF /* StoreInformationViewModelImpl.swift */; }; 59B886602B6E7CF6005750EF /* UIViewController+ErrorAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */; }; 59B886622B6E8484005750EF /* UISheetPresentationController+Detent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */; }; + 59B886642B6EC816005750EF /* SummaryViewHeightCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886632B6EC816005750EF /* SummaryViewHeightCase.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -157,6 +158,7 @@ 59B8865D2B6E4B98005750EF /* StoreInformationViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewModelImpl.swift; sourceTree = ""; }; 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+ErrorAlert.swift"; sourceTree = ""; }; 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISheetPresentationController+Detent.swift"; sourceTree = ""; }; + 59B886632B6EC816005750EF /* SummaryViewHeightCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewHeightCase.swift; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -513,6 +515,7 @@ A8A7E0612B652F0D00D015E5 /* MarkerContents.swift */, 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */, 59B8864F2B6AB9F7005750EF /* StoreTableViewCellContents.swift */, + 59B886632B6EC816005750EF /* SummaryViewHeightCase.swift */, ); path = Entity; sourceTree = ""; @@ -939,6 +942,7 @@ A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */, A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */, 5977BE9E2B59ACE800725C90 /* ImageCache.swift in Sources */, + 59B886642B6EC816005750EF /* SummaryViewHeightCase.swift in Sources */, 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */, 59B8862B2B6A3F7F005750EF /* UITableViewCell+Identifier.swift in Sources */, 59B886462B6A5CDC005750EF /* StoreListViewModel.swift in Sources */, diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index a419877e..1dcf8878 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -25,7 +25,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { fetchStoresUseCase: FetchStoresUseCaseImpl(repository: repository), getStoreInformationUseCase: GetStoreInformationUseCaseImpl(repository: repository) ) - let summaryViewHeightObserver = PublishRelay() + let summaryViewHeightObserver = PublishRelay() let storeInformationViewController = StoreInformationViewController( summaryViewHeightObserver: summaryViewHeightObserver, viewModel: StoreInformationViewModelImpl( diff --git a/KCS/KCS/Domain/Entity/SummaryViewHeightCase.swift b/KCS/KCS/Domain/Entity/SummaryViewHeightCase.swift new file mode 100644 index 00000000..8354fec2 --- /dev/null +++ b/KCS/KCS/Domain/Entity/SummaryViewHeightCase.swift @@ -0,0 +1,15 @@ +// +// SummaryViewHeightCase.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/4/24. +// + +import Foundation + +enum SummaryViewHeightCase { + + case small + case large + +} diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 251ee4bc..258317a7 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -161,13 +161,13 @@ final class HomeViewController: UIViewController { private var clickedMarker: Marker? private let storeListViewController: StoreListViewController private let viewModel: HomeViewModel - private let summaryViewHeightObserver: PublishRelay + private let summaryViewHeightObserver: PublishRelay init( viewModel: HomeViewModel, storeInformationViewController: StoreInformationViewController, storeListViewController: StoreListViewController, - summaryViewHeightObserver: PublishRelay + summaryViewHeightObserver: PublishRelay ) { self.viewModel = viewModel self.storeInformationViewController = storeInformationViewController @@ -284,14 +284,15 @@ private extension HomeViewController { } .disposed(by: disposeBag) - summaryViewHeightObserver.bind { [weak self] height in + summaryViewHeightObserver.bind { [weak self] heightCase in guard let self = self else { return } if let sheet = storeInformationViewController.sheetPresentationController { sheet.animateChanges { - if height == 230 { // TODO: ํ•˜๋“œ์ฝ”๋”ฉ ์‚ญ์ œ + switch heightCase { + case .small: sheet.detents = [.smallSummaryViewDetent, .detailViewDetent] sheet.selectedDetentIdentifier = .smallSummaryDetentIdentifier - } else { + case .large: sheet.detents = [.largeSummaryViewDetent, .detailViewDetent] sheet.selectedDetentIdentifier = .largeSummaryDetentIdentifier } diff --git a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift index e832d725..b87e6414 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift @@ -22,7 +22,7 @@ final class StoreInformationViewController: UIViewController { return view }() - private let summaryViewHeightObserver: PublishRelay + private let summaryViewHeightObserver: PublishRelay private lazy var detailView: DetailView = { let view = DetailView() @@ -34,7 +34,7 @@ final class StoreInformationViewController: UIViewController { private let viewModel: StoreInformationViewModel init( - summaryViewHeightObserver: PublishRelay, + summaryViewHeightObserver: PublishRelay, viewModel: StoreInformationViewModel ) { self.summaryViewHeightObserver = summaryViewHeightObserver @@ -118,15 +118,6 @@ extension StoreInformationViewController { } } - func dismissAll() { - summaryView.isUserInteractionEnabled = false - detailView.isUserInteractionEnabled = false - UIView.animate(withDuration: 0.3) { [weak self] in - self?.summaryView.alpha = 0 - self?.detailView.alpha = 0 - } - } - } private extension StoreInformationViewController { diff --git a/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift index d35c06ae..ed0606d3 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift @@ -84,9 +84,9 @@ final class SummaryView: UIView { private var callDisposable: Disposable? - private let summaryViewHeightObserver: PublishRelay + private let summaryViewHeightObserver: PublishRelay - init(summaryViewHeightObserver: PublishRelay) { + init(summaryViewHeightObserver: PublishRelay) { self.summaryViewHeightObserver = summaryViewHeightObserver super.init(frame: .zero) @@ -173,9 +173,9 @@ extension SummaryView { func setUIContents(contents: SummaryViewContents) { storeTitle.text = contents.storeTitle if storeTitle.numberOfVisibleLines == 1 { - summaryViewHeightObserver.accept(230) + summaryViewHeightObserver.accept(.small) } else { - summaryViewHeightObserver.accept(253) + summaryViewHeightObserver.accept(.large) } storeOpenClosed.text = contents.openClosedContent.openClosedType.rawValue openingHour.text = contents.openClosedContent.nextOpeningHour From a622331fc123a24a6eaa136cef0f9f004d106f2e Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 14:13:56 +0900 Subject: [PATCH 117/231] =?UTF-8?q?feat=20:=20StoreListViewController=20?= =?UTF-8?q?=EC=A0=84=EC=9A=A9=20detent=20=EC=B6=94=EA=B0=80=20(#152)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension/UISheetPresentationController+Detent.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift b/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift index 0e40274c..1d1429b6 100644 --- a/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift +++ b/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift @@ -8,9 +8,12 @@ import UIKit extension UISheetPresentationController.Detent.Identifier { + static let smallSummaryDetentIdentifier = UISheetPresentationController.Detent.Identifier("SmallSummaryDetent") static let largeSummaryDetentIdentifier = UISheetPresentationController.Detent.Identifier("LargeSummaryDetent") static let detailDetentIdentifier = UISheetPresentationController.Detent.Identifier("DetailDetent") + static let smallStoreListViewDetentIdentifier = UISheetPresentationController.Detent.Identifier("SmallListDetent") + static let largeStoreListViewDetentIdentifier = UISheetPresentationController.Detent.Identifier("LargeListDetent") } extension UISheetPresentationController.Detent { @@ -23,6 +26,10 @@ extension UISheetPresentationController.Detent { } static let detailViewDetent = custom(identifier: .detailDetentIdentifier) { _ in return 616 - 21 + } + static let smallStoreListViewDetent = custom(identifier: .smallStoreListViewDetentIdentifier) { _ in + return 35 } + static let largeStoreListViewDetent = large() } From 74d1ac84487e2e4e671ca086a6996d333a0c5f44 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 14:14:28 +0900 Subject: [PATCH 118/231] =?UTF-8?q?feat=20:=20StoreListViewController=20pr?= =?UTF-8?q?esent=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20s?= =?UTF-8?q?etup=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20(#152)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 26 +++++++++++++++---- .../View/StoreInformationViewController.swift | 11 ++++---- .../View/StoreListViewController.swift | 6 +++++ 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 258317a7..1b8c1b7a 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -186,8 +186,15 @@ final class HomeViewController: UIViewController { addUIComponents() configureConstraints() bind() + setup() + } + +} + +private extension HomeViewController { + + func setup() { unDimmedView() - viewModel.action( input: .checkLocationAuthorization( status: locationManager.authorizationStatus @@ -195,10 +202,6 @@ final class HomeViewController: UIViewController { ) } -} - -private extension HomeViewController { - func bind() { bindRefresh() bindApplyFilters() @@ -524,12 +527,25 @@ extension HomeViewController: NMFMapViewCameraDelegate { } } + func presentStoreListView() { + let newNC = UINavigationController(rootViewController: storeListViewController) + newNC.navigationBar.backgroundColor = .white + newNC.navigationBar.isTranslucent = false + if let sheet = newNC.sheetPresentationController { + sheet.detents = [.smallStoreListViewDetent, .largeStoreListViewDetent] + sheet.largestUndimmedDetentIdentifier = .smallStoreListViewDetentIdentifier + sheet.prefersGrabberVisible = true + } + present(newNC, animated: true) + } + } extension HomeViewController: NMFMapViewTouchDelegate { func mapView(_ mapView: NMFMapView, didTapMap latlng: NMGLatLng, point: CGPoint) { storeInformationViewDismiss() + presentStoreListView() } } diff --git a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift index b87e6414..5a324e8e 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift @@ -41,16 +41,15 @@ final class StoreInformationViewController: UIViewController { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) - isModalInPresentation = true } override func viewDidLoad() { super.viewDidLoad() - setBackgroundColor() addUIComponents() configureConstraints() bind() + setup() } required init?(coder: NSCoder) { @@ -61,6 +60,11 @@ final class StoreInformationViewController: UIViewController { extension StoreInformationViewController { + func setup() { + view.backgroundColor = .white + isModalInPresentation = true + } + func bind() { viewModel.errorAlertOutput .bind { [weak self] error in @@ -122,9 +126,6 @@ extension StoreInformationViewController { private extension StoreInformationViewController { - func setBackgroundColor() { - view.backgroundColor = .white - } func addUIComponents() { view.addSubview(summaryView) diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index 6b301d09..e6d53754 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -60,6 +60,7 @@ final class StoreListViewController: UIViewController { addUIComponents() configureConstraints() bind() + setup() } func updateList(stores: [Store]) { @@ -70,6 +71,11 @@ final class StoreListViewController: UIViewController { private extension StoreListViewController { + func setup() { + title = "๊ฐ€๊ฒŒ ๋ชจ์•„๋ณด๊ธฐ" + isModalInPresentation = true + } + func addUIComponents() { view.addSubview(storeTableView) } From d764329cd9a9fe2218ff266db77cfe9027bcce0d Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 14:15:13 +0900 Subject: [PATCH 119/231] =?UTF-8?q?fix=20:=20=ED=99=95=EC=9D=B8=EC=9A=A9?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20(#152)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 1b8c1b7a..3fbdaf99 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -545,7 +545,6 @@ extension HomeViewController: NMFMapViewTouchDelegate { func mapView(_ mapView: NMFMapView, didTapMap latlng: NMGLatLng, point: CGPoint) { storeInformationViewDismiss() - presentStoreListView() } } From 70595e2eec24dde5dbe6e6a0fddbc7329de0852a Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 14:29:17 +0900 Subject: [PATCH 120/231] =?UTF-8?q?refactor=20:=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95=20(#152)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/HomeViewController.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 3fbdaf99..dc46a015 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -528,15 +528,15 @@ extension HomeViewController: NMFMapViewCameraDelegate { } func presentStoreListView() { - let newNC = UINavigationController(rootViewController: storeListViewController) - newNC.navigationBar.backgroundColor = .white - newNC.navigationBar.isTranslucent = false - if let sheet = newNC.sheetPresentationController { + let listNavigationController = UINavigationController(rootViewController: storeListViewController) + listNavigationController.navigationBar.backgroundColor = .white + listNavigationController.navigationBar.isTranslucent = false + if let sheet = listNavigationController.sheetPresentationController { sheet.detents = [.smallStoreListViewDetent, .largeStoreListViewDetent] sheet.largestUndimmedDetentIdentifier = .smallStoreListViewDetentIdentifier sheet.prefersGrabberVisible = true } - present(newNC, animated: true) + present(listNavigationController, animated: true) } } From cafe99b0db00631745db90a15ff8bd15f4e40dab Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 14:43:18 +0900 Subject: [PATCH 121/231] =?UTF-8?q?feat=20:=20UINavigationController=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=ED=9B=84=20UINavigationBar=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#152)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 8 +++---- .../View/StoreListViewController.swift | 21 +++++++++++++++++-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index dc46a015..76d2dfcd 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -528,15 +528,12 @@ extension HomeViewController: NMFMapViewCameraDelegate { } func presentStoreListView() { - let listNavigationController = UINavigationController(rootViewController: storeListViewController) - listNavigationController.navigationBar.backgroundColor = .white - listNavigationController.navigationBar.isTranslucent = false - if let sheet = listNavigationController.sheetPresentationController { + if let sheet = storeListViewController.sheetPresentationController { sheet.detents = [.smallStoreListViewDetent, .largeStoreListViewDetent] sheet.largestUndimmedDetentIdentifier = .smallStoreListViewDetentIdentifier sheet.prefersGrabberVisible = true } - present(listNavigationController, animated: true) + present(storeListViewController, animated: true) } } @@ -545,6 +542,7 @@ extension HomeViewController: NMFMapViewTouchDelegate { func mapView(_ mapView: NMFMapView, didTapMap latlng: NMGLatLng, point: CGPoint) { storeInformationViewDismiss() + presentStoreListView() } } diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index e6d53754..8e0b1158 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -12,6 +12,17 @@ final class StoreListViewController: UIViewController { private let disposeBag = DisposeBag() + private let titleBar: UINavigationBar = { + let navigationBar = UINavigationBar() + navigationBar.translatesAutoresizingMaskIntoConstraints = false + let titleItem = UINavigationItem(title: "๊ฐ€๊ฒŒ ๋ชจ์•„๋ณด๊ธฐ") + navigationBar.setItems([titleItem], animated: true) + navigationBar.backgroundColor = .white + navigationBar.isTranslucent = false + + return navigationBar + }() + private let storeTableView: UITableView = { let tableView = UITableView() tableView.translatesAutoresizingMaskIntoConstraints = false @@ -72,17 +83,23 @@ final class StoreListViewController: UIViewController { private extension StoreListViewController { func setup() { - title = "๊ฐ€๊ฒŒ ๋ชจ์•„๋ณด๊ธฐ" isModalInPresentation = true } func addUIComponents() { view.addSubview(storeTableView) + view.addSubview(titleBar) } func configureConstraints() { NSLayoutConstraint.activate([ - storeTableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + titleBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + titleBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + titleBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor) + ]) + + NSLayoutConstraint.activate([ + storeTableView.topAnchor.constraint(equalTo: titleBar.bottomAnchor), storeTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor), storeTableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), storeTableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor) From 5641c411283af7ba8950af259c53cfb0d4f99096 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 14:57:43 +0900 Subject: [PATCH 122/231] =?UTF-8?q?feat=20:=20corner=20radius=2015?= =?UTF-8?q?=EB=A1=9C=20=EC=84=A4=EC=A0=95=20(#152)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 76d2dfcd..4c236888 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -532,6 +532,7 @@ extension HomeViewController: NMFMapViewCameraDelegate { sheet.detents = [.smallStoreListViewDetent, .largeStoreListViewDetent] sheet.largestUndimmedDetentIdentifier = .smallStoreListViewDetentIdentifier sheet.prefersGrabberVisible = true + sheet.preferredCornerRadius = 15 } present(storeListViewController, animated: true) } From 8301df4b226596e39e5d969dd37bc67ed5aa1936 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Sun, 4 Feb 2024 15:28:43 +0900 Subject: [PATCH 123/231] =?UTF-8?q?feat=20:=20viewDidAppear=EC=97=90=20pre?= =?UTF-8?q?sent,=20dismiss=20flow=20=EC=A0=81=EC=9A=A9=20(#154)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 4c236888..a4007bac 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -189,6 +189,12 @@ final class HomeViewController: UIViewController { setup() } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + presentStoreListView() + } + } private extension HomeViewController { @@ -307,6 +313,7 @@ private extension HomeViewController { } storeInformationViewController.changeToSummary() if !(presentedViewController is StoreInformationViewController) { + dismiss(animated: true) present(storeInformationViewController, animated: true) } } @@ -393,6 +400,7 @@ private extension HomeViewController { clickedMarker = nil if !changeMarker { storeInformationViewController.dismiss(animated: true) + presentStoreListView() } } @@ -528,13 +536,15 @@ extension HomeViewController: NMFMapViewCameraDelegate { } func presentStoreListView() { - if let sheet = storeListViewController.sheetPresentationController { - sheet.detents = [.smallStoreListViewDetent, .largeStoreListViewDetent] - sheet.largestUndimmedDetentIdentifier = .smallStoreListViewDetentIdentifier - sheet.prefersGrabberVisible = true - sheet.preferredCornerRadius = 15 + if !(presentedViewController is StoreListViewController) { + if let sheet = storeListViewController.sheetPresentationController { + sheet.detents = [.smallStoreListViewDetent, .largeStoreListViewDetent] + sheet.largestUndimmedDetentIdentifier = .smallStoreListViewDetentIdentifier + sheet.prefersGrabberVisible = true + sheet.preferredCornerRadius = 15 + } + present(storeListViewController, animated: true) } - present(storeListViewController, animated: true) } } @@ -543,7 +553,6 @@ extension HomeViewController: NMFMapViewTouchDelegate { func mapView(_ mapView: NMFMapView, didTapMap latlng: NMGLatLng, point: CGPoint) { storeInformationViewDismiss() - presentStoreListView() } } From be3d182b3e63e7e6df34361048334c96523f96e5 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 4 Feb 2024 19:14:18 +0900 Subject: [PATCH 124/231] =?UTF-8?q?feat=20:=20API=202=EC=A4=91=20=EB=B0=B0?= =?UTF-8?q?=EC=97=B4=EB=A1=9C=20=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#1?= =?UTF-8?q?56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Network/Response/Protocol/APIResponse.swift | 2 +- .../Data/Network/Response/StoreResponse.swift | 2 +- KCS/KCS/Data/Network/StoreAPI.swift | 2 +- .../Data/Repository/StoreRepositoryImpl.swift | 13 ++++++++----- .../UseCase/FetchRefreshStoresUseCaseImpl.swift | 4 ++-- .../Home/View/HomeViewController.swift | 9 +++++---- .../Home/ViewModel/HomeDependency.swift | 1 + .../Home/ViewModel/HomeViewModelImpl.swift | 16 ++++++++-------- .../Home/ViewModel/protocol/HomeViewModel.swift | 6 +++--- 9 files changed, 30 insertions(+), 25 deletions(-) diff --git a/KCS/KCS/Data/Network/Response/Protocol/APIResponse.swift b/KCS/KCS/Data/Network/Response/Protocol/APIResponse.swift index e3df41ec..519490ac 100644 --- a/KCS/KCS/Data/Network/Response/Protocol/APIResponse.swift +++ b/KCS/KCS/Data/Network/Response/Protocol/APIResponse.swift @@ -13,6 +13,6 @@ protocol APIResponse: Codable { var code: Int { get } var message: String { get } - var data: [ResponseType] { get } + var data: [[ResponseType]] { get } } diff --git a/KCS/KCS/Data/Network/Response/StoreResponse.swift b/KCS/KCS/Data/Network/Response/StoreResponse.swift index 38016877..5af345c2 100644 --- a/KCS/KCS/Data/Network/Response/StoreResponse.swift +++ b/KCS/KCS/Data/Network/Response/StoreResponse.swift @@ -13,6 +13,6 @@ struct StoreResponse: APIResponse { let code: Int let message: String - let data: [ResponseType] + let data: [[ResponseType]] } diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 018a4faa..93658693 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -20,7 +20,7 @@ extension StoreAPI: Router, URLRequestConvertible { var baseURL: String? { switch self { case .getStores: - return getURL(type: .product) + return getURL(type: .develop) case .getImage(let url): return url } diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 1fbf5f57..a4a293cb 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -16,7 +16,6 @@ final class StoreRepositoryImpl: StoreRepository { self.stores = stores } - // TODO: ํ˜„์žฌ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ์˜ค๋Š” ๋กœ์ง์œผ๋กœ ์ ์šฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, 2์ฐจ์› ๋ฐฐ์—ด ๋กœ์ง์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. func fetchRefreshStores( requestLocation: RequestLocation ) -> Observable<[Store]> { @@ -35,9 +34,13 @@ final class StoreRepositoryImpl: StoreRepository { do { switch response.result { case .success(let result): - let resultStores = try result.data.map { try $0.toEntity() } - self?.stores = [resultStores] - observer.onNext(resultStores) + let resultStores = try result.data.map { try $0.map { try $0.toEntity() } } + self?.stores = resultStores + if let firstIndexStore = resultStores.first { + observer.onNext(firstIndexStore) + } else { + observer.onError(JSONContentsError.bundleRead) + } case .failure(let error): throw error } @@ -51,7 +54,7 @@ final class StoreRepositoryImpl: StoreRepository { func fetchStores(count: Int) -> [Store] { var fetchResult: [Store] = [] - for index in 0.. Observable<[Store]> { - let newLocation = parallelTranslate(requestLocation: requestLocation) - return repository.fetchRefreshStores(requestLocation: newLocation) +// let newLocation = parallelTranslate(requestLocation: requestLocation) + return repository.fetchRefreshStores(requestLocation: requestLocation) } } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index a4007bac..df882295 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -219,7 +219,7 @@ private extension HomeViewController { } func bindRefresh() { - viewModel.refreshOutput + viewModel.refreshDoneOutput .bind { [weak self] _ in self?.refreshButton.animationInvalidate() } @@ -227,7 +227,7 @@ private extension HomeViewController { } func bindApplyFilters() { - viewModel.applyFiltersOutput + viewModel.filteredStoresOutput .bind { [weak self] filteredStores in guard let self = self else { return } self.markers.forEach { $0.mapView = nil } @@ -355,7 +355,7 @@ private extension HomeViewController { .scan(false) { [weak self] (lastState, _) in guard let self = self else { return lastState } viewModel.action( - input: .filterButtonTapped(activatedFilter: type, fetchCount: 1) + input: .filterButtonTapped(activatedFilter: type) // TODO: fetchCount Dependency์—์„œ ์ฒ˜๋ฆฌ ) return !lastState @@ -490,7 +490,8 @@ private extension HomeViewController { NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), refreshButton.widthAnchor.constraint(equalToConstant: 110), - refreshButton.heightAnchor.constraint(equalToConstant: 35) + refreshButton.heightAnchor.constraint(equalToConstant: 35), + refreshButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) ]) } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift index 5b473684..00fed3da 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift @@ -11,5 +11,6 @@ struct HomeDependency { let disposeBag = DisposeBag() var activatedFilter: [CertificationType] = [] + var fetchCount: Int = .zero } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index ba20b191..b973801f 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -17,7 +17,7 @@ final class HomeViewModelImpl: HomeViewModel { let getStoreInformationUseCase: GetStoreInformationUseCase let getStoreInformationOutput = PublishRelay() - let refreshOutput = PublishRelay() + let refreshDoneOutput = PublishRelay() let locationButtonOutput = PublishRelay() let locationButtonImageNameOutput = PublishRelay() let setMarkerOutput = PublishRelay() @@ -25,7 +25,7 @@ final class HomeViewModelImpl: HomeViewModel { let locationStatusNotDeterminedOutput = PublishRelay() let locationStatusAuthorizedWhenInUse = PublishRelay() let errorAlertOutput = PublishRelay() - let applyFiltersOutput = PublishRelay<[FilteredStores]>() + let filteredStoresOutput = PublishRelay<[FilteredStores]>() let dimViewTapGestureEndedOutput = PublishRelay() var dependency: HomeDependency @@ -46,8 +46,8 @@ final class HomeViewModelImpl: HomeViewModel { switch input { case .refresh(let requestLocation): refresh(requestLocation: requestLocation) - case .filterButtonTapped(let filter, let fetchCount): - filterButtonTapped(filter: filter, fetchCount: fetchCount) + case .filterButtonTapped(let filter): + filterButtonTapped(filter: filter) case .markerTapped(let tag): markerTapped(tag: tag) case .locationButtonTapped(let locationAuthorizationStatus, let positionMode): @@ -77,7 +77,7 @@ private extension HomeViewModelImpl { onNext: { [weak self] stores in guard let self = self else { return } applyFilters(stores: stores, filters: getActivatedTypes()) - refreshOutput.accept(()) + refreshDoneOutput.accept(()) }, onError: { [weak self] error in if error is StoreRepositoryError { @@ -90,13 +90,13 @@ private extension HomeViewModelImpl { .disposed(by: dependency.disposeBag) } - func filterButtonTapped(filter: CertificationType, fetchCount: Int) { + func filterButtonTapped(filter: CertificationType) { if let lastIndex = dependency.activatedFilter.lastIndex(of: filter) { dependency.activatedFilter.remove(at: lastIndex) } else { dependency.activatedFilter.append(filter) } - applyFilters(stores: fetchStoresUseCase.execute(fetchCount: fetchCount), filters: getActivatedTypes()) + applyFilters(stores: fetchStoresUseCase.execute(fetchCount: dependency.fetchCount), filters: getActivatedTypes()) } func getActivatedTypes() -> [CertificationType] { @@ -139,7 +139,7 @@ private extension HomeViewModelImpl { } } } - applyFiltersOutput.accept([goodPriceStores, exemplaryStores, safeStores]) + filteredStoresOutput.accept([goodPriceStores, exemplaryStores, safeStores]) } func markerTapped(tag: UInt) { diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index fa4a24b1..3780b504 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -28,7 +28,7 @@ protocol HomeViewModel: HomeViewModelInput, HomeViewModelOutput { enum HomeViewModelInputCase { case refresh(requestLocation: RequestLocation) - case filterButtonTapped(activatedFilter: CertificationType, fetchCount: Int) + case filterButtonTapped(activatedFilter: CertificationType) case markerTapped(tag: UInt) case locationButtonTapped(locationAuthorizationStatus: CLAuthorizationStatus, positionMode: NMFMyPositionMode) case dimViewTapGestureEnded @@ -47,8 +47,8 @@ protocol HomeViewModelInput { protocol HomeViewModelOutput { var getStoreInformationOutput: PublishRelay { get } - var refreshOutput: PublishRelay { get } - var applyFiltersOutput: PublishRelay<[FilteredStores]> { get } + var refreshDoneOutput: PublishRelay { get } + var filteredStoresOutput: PublishRelay<[FilteredStores]> { get } var locationButtonOutput: PublishRelay { get } var locationButtonImageNameOutput: PublishRelay { get } var setMarkerOutput: PublishRelay { get } From 478cbc38869df217efb0144ed45688fb6657a299 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 4 Feb 2024 19:34:45 +0900 Subject: [PATCH 125/231] =?UTF-8?q?feat=20:=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EB=8D=94=EB=B3=B4=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ++ .../Home/View/HomeViewController.swift | 24 +++++++++- .../Home/View/MoreStoreButton.swift | 44 +++++++++++++++++++ .../Home/ViewModel/HomeViewModelImpl.swift | 8 ++++ .../ViewModel/protocol/HomeViewModel.swift | 1 + 5 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 KCS/KCS/Presentation/Home/View/MoreStoreButton.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 30b89e2f..f20b9b37 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -84,6 +84,7 @@ A81EFBC72B5D597400D0C0D7 /* Pretendard-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBBE2B5D597400D0C0D7 /* Pretendard-Bold.ttf */; }; A81EFBC82B5D597400D0C0D7 /* Pretendard-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */; }; A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */; }; + A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */; }; A89087042B4E7F3500767225 /* FilterButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087032B4E7F3500767225 /* FilterButton.swift */; }; A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; @@ -202,6 +203,7 @@ A81EFBBE2B5D597400D0C0D7 /* Pretendard-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.ttf"; sourceTree = ""; }; A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Light.ttf"; sourceTree = ""; }; A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = ""; }; + A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreStoreButton.swift; sourceTree = ""; }; A89087032B4E7F3500767225 /* FilterButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterButton.swift; sourceTree = ""; }; A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; @@ -402,6 +404,7 @@ 59C306A32B4D7EBA00862625 /* Marker.swift */, A89087032B4E7F3500767225 /* FilterButton.swift */, 5977BE572B5524D500725C90 /* RefreshButton.swift */, + A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */, ); path = View; sourceTree = ""; @@ -934,6 +937,7 @@ 5977BE742B57FA7A00725C90 /* FilteredStores.swift in Sources */, A8A7E05D2B64AF1300D015E5 /* StoreInformationViewConstraints.swift in Sources */, 5977BE5E2B5535C700725C90 /* FetchRefreshStoresUseCase.swift in Sources */, + A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */, 59C306B02B4FFE4400862625 /* StoreResponse.swift in Sources */, A8A7E0602B64E62200D015E5 /* NMFMyPosition+.swift in Sources */, A8ACB7EA2B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift in Sources */, diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index df882295..a608d104 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -131,7 +131,20 @@ final class HomeViewController: UIViewController { ) ) } - .disposed(by: self.disposeBag) + .disposed(by: disposeBag) + + return button + }() + + private lazy var moreStoreButton: MoreStoreButton = { + let button = MoreStoreButton() + button.isHidden = true + button.translatesAutoresizingMaskIntoConstraints = false + button.rx.tap + .bind { [weak self] in + self?.viewModel.action(input: .moreStoreButtonTapped) + } + .disposed(by: disposeBag) return button }() @@ -222,6 +235,8 @@ private extension HomeViewController { viewModel.refreshDoneOutput .bind { [weak self] _ in self?.refreshButton.animationInvalidate() + self?.refreshButton.isHidden = true + self?.moreStoreButton.isHidden = false } .disposed(by: disposeBag) } @@ -458,6 +473,7 @@ private extension HomeViewController { mapView.addSubview(locationButton) mapView.addSubview(filterButtonStackView) mapView.addSubview(refreshButton) + mapView.addSubview(moreStoreButton) mapView.addSubview(dimView) } @@ -493,6 +509,11 @@ private extension HomeViewController { refreshButton.heightAnchor.constraint(equalToConstant: 35), refreshButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) ]) + + NSLayoutConstraint.activate([ + moreStoreButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), + moreStoreButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) + ]) } } @@ -516,6 +537,7 @@ extension HomeViewController: NMFMapViewCameraDelegate { locationButton.setImage(UIImage.locationButtonNone, for: .normal) } refreshButton.isHidden = false + moreStoreButton.isHidden = true } func mapView(_ mapView: NMFMapView, cameraDidChangeByReason reason: Int, animated: Bool) { diff --git a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift new file mode 100644 index 00000000..9f7c0890 --- /dev/null +++ b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift @@ -0,0 +1,44 @@ +// +// MoreStoreButton.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/4/24. +// + +import UIKit + +final class MoreStoreButton: UIButton { + + private let originalTitle: AttributedString = { + var titleAttribute = AttributedString("๊ฒฐ๊ณผ ๋”๋ณด๊ธฐ") + titleAttribute.font = UIFont.pretendard(size: 10, weight: .medium) + + return titleAttribute + }() + + init() { + super.init(frame: .zero) + setUI() + setLayerShadow(shadowOffset: CGSize(width: 0, height: 2)) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +private extension MoreStoreButton { + + func setUI() { + var config = UIButton.Configuration.filled() + config.attributedTitle = originalTitle + config.baseBackgroundColor = .white + config.baseForegroundColor = .black + config.cornerStyle = .capsule + config.contentInsets = NSDirectionalEdgeInsets(top: 11, leading: 10, bottom: 11, trailing: 10) + configuration = config + } + +} + diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index b973801f..66b80979 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -46,6 +46,8 @@ final class HomeViewModelImpl: HomeViewModel { switch input { case .refresh(let requestLocation): refresh(requestLocation: requestLocation) + case .moreStoreButtonTapped: + moreStoreButtonTapped() case .filterButtonTapped(let filter): filterButtonTapped(filter: filter) case .markerTapped(let tag): @@ -76,6 +78,7 @@ private extension HomeViewModelImpl { .subscribe( onNext: { [weak self] stores in guard let self = self else { return } + dependency.fetchCount = .zero applyFilters(stores: stores, filters: getActivatedTypes()) refreshDoneOutput.accept(()) }, @@ -90,6 +93,11 @@ private extension HomeViewModelImpl { .disposed(by: dependency.disposeBag) } + func moreStoreButtonTapped() { + dependency.fetchCount += 1 + applyFilters(stores: fetchStoresUseCase.execute(fetchCount: dependency.fetchCount), filters: getActivatedTypes()) + } + func filterButtonTapped(filter: CertificationType) { if let lastIndex = dependency.activatedFilter.lastIndex(of: filter) { dependency.activatedFilter.remove(at: lastIndex) diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 3780b504..d96c0590 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -28,6 +28,7 @@ protocol HomeViewModel: HomeViewModelInput, HomeViewModelOutput { enum HomeViewModelInputCase { case refresh(requestLocation: RequestLocation) + case moreStoreButtonTapped case filterButtonTapped(activatedFilter: CertificationType) case markerTapped(tag: UInt) case locationButtonTapped(locationAuthorizationStatus: CLAuthorizationStatus, positionMode: NMFMyPositionMode) From 0082d54164c94c71556385a9a6825d5163ee714c Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 4 Feb 2024 21:18:03 +0900 Subject: [PATCH 126/231] =?UTF-8?q?feat=20:=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EB=8D=94=EB=B3=B4=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80=20(#156)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 + .../Data/Repository/StoreRepositoryImpl.swift | 13 +++- KCS/KCS/Domain/Entity/FetchStores.swift | 22 ++++++ .../Repository/StoreRepository.swift | 2 +- .../UseCase/FetchRefreshStoresUseCase.swift | 2 +- .../FetchRefreshStoresUseCaseImpl.swift | 78 +------------------ .../Home/View/HomeViewController.swift | 31 ++++++-- .../Home/View/MoreStoreButton.swift | 28 +++---- .../Home/ViewModel/HomeDependency.swift | 7 +- .../Home/ViewModel/HomeViewModelImpl.swift | 21 +++-- .../ViewModel/protocol/HomeViewModel.swift | 2 + .../View/StoreInformationViewController.swift | 1 - 12 files changed, 99 insertions(+), 112 deletions(-) create mode 100644 KCS/KCS/Domain/Entity/FetchStores.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index f20b9b37..df3e029a 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -85,6 +85,7 @@ A81EFBC82B5D597400D0C0D7 /* Pretendard-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */; }; A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */; }; A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */; }; + A83367B82B6FA0E700E0A844 /* FetchStores.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B72B6FA0E700E0A844 /* FetchStores.swift */; }; A89087042B4E7F3500767225 /* FilterButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087032B4E7F3500767225 /* FilterButton.swift */; }; A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; @@ -204,6 +205,7 @@ A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Light.ttf"; sourceTree = ""; }; A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = ""; }; A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreStoreButton.swift; sourceTree = ""; }; + A83367B72B6FA0E700E0A844 /* FetchStores.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStores.swift; sourceTree = ""; }; A89087032B4E7F3500767225 /* FilterButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterButton.swift; sourceTree = ""; }; A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; @@ -519,6 +521,7 @@ 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */, 59B8864F2B6AB9F7005750EF /* StoreTableViewCellContents.swift */, 59B886632B6EC816005750EF /* SummaryViewHeightCase.swift */, + A83367B72B6FA0E700E0A844 /* FetchStores.swift */, ); path = Entity; sourceTree = ""; @@ -927,6 +930,7 @@ A89087042B4E7F3500767225 /* FilterButton.swift in Sources */, 59F478B12B59BB00002FEF9E /* ImageRepositoryError.swift in Sources */, 59C306C92B501B9D00862625 /* RegularOpeningHours.swift in Sources */, + A83367B82B6FA0E700E0A844 /* FetchStores.swift in Sources */, 59F478B52B59BE0B002FEF9E /* FetchImageUseCase.swift in Sources */, 59C306BF2B50109100862625 /* Location.swift in Sources */, A8A7E05B2B642EC900D015E5 /* DetailViewContents.swift in Sources */, diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index a4a293cb..fd07be37 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -18,8 +18,8 @@ final class StoreRepositoryImpl: StoreRepository { func fetchRefreshStores( requestLocation: RequestLocation - ) -> Observable<[Store]> { - return Observable<[Store]>.create { observer -> Disposable in + ) -> Observable { + return Observable.create { observer -> Disposable in AF.request(StoreAPI.getStores(location: RequestLocationDTO( nwLong: requestLocation.northWest.longitude, nwLat: requestLocation.northWest.latitude, @@ -37,7 +37,12 @@ final class StoreRepositoryImpl: StoreRepository { let resultStores = try result.data.map { try $0.map { try $0.toEntity() } } self?.stores = resultStores if let firstIndexStore = resultStores.first { - observer.onNext(firstIndexStore) + observer.onNext( + FetchStores( + fetchCountContent: FetchCountContent(maxFetchCount: resultStores.count), + stores: firstIndexStore + ) + ) } else { observer.onError(JSONContentsError.bundleRead) } @@ -54,7 +59,7 @@ final class StoreRepositoryImpl: StoreRepository { func fetchStores(count: Int) -> [Store] { var fetchResult: [Store] = [] - for index in 0.. Observable<[Store]> + ) -> Observable func fetchStores(count: Int) -> [Store] diff --git a/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift b/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift index be4e4fd4..ad2fb827 100644 --- a/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift +++ b/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift @@ -15,6 +15,6 @@ protocol FetchRefreshStoresUseCase { func execute( requestLocation: RequestLocation - ) -> Observable<[Store]> + ) -> Observable } diff --git a/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift index a72ba676..b677a547 100644 --- a/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift +++ b/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift @@ -13,84 +13,8 @@ struct FetchRefreshStoresUseCaseImpl: FetchRefreshStoresUseCase { func execute( requestLocation: RequestLocation - ) -> Observable<[Store]> { -// let newLocation = parallelTranslate(requestLocation: requestLocation) + ) -> Observable { return repository.fetchRefreshStores(requestLocation: requestLocation) } } - -private extension FetchRefreshStoresUseCaseImpl { - - func parallelTranslate (requestLocation: RequestLocation) -> RequestLocation { - let distance1 = sqrt( - pow(requestLocation.northWest.longitude - requestLocation.southWest.longitude, 2) - + pow(requestLocation.northWest.latitude - requestLocation.southWest.latitude, 2) - ) - let distance2 = sqrt( - pow(requestLocation.northWest.longitude - requestLocation.northEast.longitude, 2) + - pow(requestLocation.northWest.latitude - requestLocation.northEast.latitude, 2) - ) - - let center = Location( - longitude: (requestLocation.northWest.longitude + requestLocation.southEast.longitude) / 2.0, - latitude: (requestLocation.northWest.latitude + requestLocation.southEast.latitude) / 2.0 - ) - - var newLocation: RequestLocation - if distance1 > 0.07 { - newLocation = translateHeightLocations( - loc1: requestLocation.northWest, - loc2: requestLocation.northEast, - center: center - ) - if distance2 > 0.07 { - newLocation = translateHeightLocations( - loc1: newLocation.northEast, - loc2: newLocation.southEast, - center: center - ) - } - return newLocation - } - - return requestLocation - } - - func translateHeightLocations(loc1: Location, loc2: Location, center: Location) -> RequestLocation { - if loc1.latitude == loc2.latitude { - return RequestLocation( - northWest: Location(longitude: loc1.longitude, latitude: center.latitude + 0.035), - southWest: Location(longitude: loc1.longitude, latitude: center.latitude - 0.035), - southEast: Location(longitude: loc2.longitude, latitude: center.latitude - 0.035), - northEast: Location(longitude: loc2.longitude, latitude: center.latitude + 0.035) - ) - } else if loc1.longitude == loc2.longitude { - return RequestLocation( - northWest: Location(longitude: center.longitude + 0.035, latitude: loc1.latitude), - southWest: Location(longitude: center.longitude - 0.035, latitude: loc1.latitude), - southEast: Location(longitude: center.longitude - 0.035, latitude: loc2.latitude), - northEast: Location(longitude: center.longitude + 0.035, latitude: loc2.latitude) - ) - } - - let slope = (loc2.latitude - loc1.latitude) / (loc2.longitude - loc1.longitude) - let constant1 = 0.035 * sqrt(pow(slope, 2) + 1) - slope * center.longitude + center.latitude - let constant2 = (-0.035) * sqrt(pow(slope, 2) + 1) - slope * center.longitude + center.latitude - - return RequestLocation( - northWest: getNewLocation(location: loc1, slope: slope, constant: constant1), - southWest: getNewLocation(location: loc1, slope: slope, constant: constant2), - southEast: getNewLocation(location: loc2, slope: slope, constant: constant2), - northEast: getNewLocation(location: loc2, slope: slope, constant: constant1) - ) - } - - func getNewLocation(location: Location, slope: Double, constant: Double) -> Location { - return Location( - longitude: (location.latitude + (location.longitude / slope) - constant) / (slope + 1 / slope), - latitude: (slope * location.latitude + location.longitude + constant / slope) / (slope + 1 / slope) - ) - } - -} diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index a608d104..de961646 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -138,11 +138,13 @@ final class HomeViewController: UIViewController { private lazy var moreStoreButton: MoreStoreButton = { let button = MoreStoreButton() - button.isHidden = true button.translatesAutoresizingMaskIntoConstraints = false + button.isHidden = true button.rx.tap .bind { [weak self] in - self?.viewModel.action(input: .moreStoreButtonTapped) + self?.viewModel.action( + input: .moreStoreButtonTapped + ) } .disposed(by: disposeBag) @@ -233,10 +235,23 @@ private extension HomeViewController { func bindRefresh() { viewModel.refreshDoneOutput - .bind { [weak self] _ in + .bind { [weak self] in self?.refreshButton.animationInvalidate() self?.refreshButton.isHidden = true self?.moreStoreButton.isHidden = false + self?.moreStoreButton.isUserInteractionEnabled = true + } + .disposed(by: disposeBag) + + viewModel.fetchCountOutput + .bind { [weak self] fetchCount in + self?.moreStoreButton.setFetchCount(fetchCount: fetchCount) + } + .disposed(by: disposeBag) + + viewModel.noMoreStoresOutput + .bind { [weak self] in + self?.moreStoreButton.isUserInteractionEnabled = false } .disposed(by: disposeBag) } @@ -371,7 +386,6 @@ private extension HomeViewController { guard let self = self else { return lastState } viewModel.action( input: .filterButtonTapped(activatedFilter: type) - // TODO: fetchCount Dependency์—์„œ ์ฒ˜๋ฆฌ ) return !lastState } @@ -496,6 +510,7 @@ private extension HomeViewController { locationButton.leadingAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.leadingAnchor, constant: 16), locationButton.widthAnchor.constraint(equalToConstant: 48), locationButton.heightAnchor.constraint(equalToConstant: 48) + // TODO: bottom constraints ํ•„์š” ]) NSLayoutConstraint.activate([ @@ -506,13 +521,13 @@ private extension HomeViewController { NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), refreshButton.widthAnchor.constraint(equalToConstant: 110), - refreshButton.heightAnchor.constraint(equalToConstant: 35), - refreshButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) + refreshButton.heightAnchor.constraint(equalToConstant: 35) + // TODO: bottom constraints ํ•„์š” ]) NSLayoutConstraint.activate([ - moreStoreButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), - moreStoreButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) + moreStoreButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor) + // TODO: bottom constraints ํ•„์š” ]) } diff --git a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift index 9f7c0890..74612bd6 100644 --- a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift +++ b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift @@ -9,16 +9,18 @@ import UIKit final class MoreStoreButton: UIButton { - private let originalTitle: AttributedString = { - var titleAttribute = AttributedString("๊ฒฐ๊ณผ ๋”๋ณด๊ธฐ") - titleAttribute.font = UIFont.pretendard(size: 10, weight: .medium) - - return titleAttribute - }() + override var isUserInteractionEnabled: Bool { + didSet { + if isUserInteractionEnabled { + configuration?.baseForegroundColor = .black + } else { + configuration?.baseForegroundColor = .grayLabel + } + } + } init() { super.init(frame: .zero) - setUI() setLayerShadow(shadowOffset: CGSize(width: 0, height: 2)) } @@ -26,13 +28,12 @@ final class MoreStoreButton: UIButton { fatalError("init(coder:) has not been implemented") } -} - -private extension MoreStoreButton { - - func setUI() { + func setFetchCount(fetchCount: FetchCountContent) { + var titleAttribute = AttributedString(String(format: "๊ฒฐ๊ณผ ๋”๋ณด๊ธฐ %d/%d", fetchCount.fetchCount, fetchCount.maxFetchCount)) + titleAttribute.font = UIFont.pretendard(size: 10, weight: .medium) + var config = UIButton.Configuration.filled() - config.attributedTitle = originalTitle + config.attributedTitle = titleAttribute config.baseBackgroundColor = .white config.baseForegroundColor = .black config.cornerStyle = .capsule @@ -41,4 +42,3 @@ private extension MoreStoreButton { } } - diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift index 00fed3da..c3f24d9f 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift @@ -11,6 +11,11 @@ struct HomeDependency { let disposeBag = DisposeBag() var activatedFilter: [CertificationType] = [] - var fetchCount: Int = .zero + var fetchCount: Int = 1 + var maxFetchCount: Int = 1 + + mutating func resetFetchCount() { + fetchCount = 1 + } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 66b80979..27be5d40 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -26,6 +26,8 @@ final class HomeViewModelImpl: HomeViewModel { let locationStatusAuthorizedWhenInUse = PublishRelay() let errorAlertOutput = PublishRelay() let filteredStoresOutput = PublishRelay<[FilteredStores]>() + let fetchCountOutput = PublishRelay() + let noMoreStoresOutput = PublishRelay() let dimViewTapGestureEndedOutput = PublishRelay() var dependency: HomeDependency @@ -76,10 +78,12 @@ private extension HomeViewModelImpl { requestLocation: requestLocation ) .subscribe( - onNext: { [weak self] stores in + onNext: { [weak self] refreshContent in guard let self = self else { return } - dependency.fetchCount = .zero - applyFilters(stores: stores, filters: getActivatedTypes()) + dependency.resetFetchCount() + dependency.maxFetchCount = refreshContent.fetchCountContent.maxFetchCount + applyFilters(stores: refreshContent.stores, filters: getActivatedTypes()) + fetchCountOutput.accept(FetchCountContent(maxFetchCount: dependency.maxFetchCount)) refreshDoneOutput.accept(()) }, onError: { [weak self] error in @@ -94,8 +98,15 @@ private extension HomeViewModelImpl { } func moreStoreButtonTapped() { - dependency.fetchCount += 1 - applyFilters(stores: fetchStoresUseCase.execute(fetchCount: dependency.fetchCount), filters: getActivatedTypes()) + if dependency.fetchCount < dependency.maxFetchCount { + dependency.fetchCount += 1 + applyFilters(stores: fetchStoresUseCase.execute(fetchCount: dependency.fetchCount), filters: getActivatedTypes()) + fetchCountOutput.accept(FetchCountContent(maxFetchCount: dependency.maxFetchCount, fetchCount: dependency.fetchCount)) + } + + if dependency.fetchCount == dependency.maxFetchCount { + noMoreStoresOutput.accept(()) + } } func filterButtonTapped(filter: CertificationType) { diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index d96c0590..43fd67e9 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -57,6 +57,8 @@ protocol HomeViewModelOutput { var locationStatusNotDeterminedOutput: PublishRelay { get } var locationStatusAuthorizedWhenInUse: PublishRelay { get } var errorAlertOutput: PublishRelay { get } + var fetchCountOutput: PublishRelay { get } + var noMoreStoresOutput: PublishRelay { get } var dimViewTapGestureEndedOutput: PublishRelay { get } } diff --git a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift index 5a324e8e..7181e5b0 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift @@ -126,7 +126,6 @@ extension StoreInformationViewController { private extension StoreInformationViewController { - func addUIComponents() { view.addSubview(summaryView) view.addSubview(detailView) From 92e5aa20574c860bbaf523071ff33a4bb76b8f18 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 4 Feb 2024 21:39:48 +0900 Subject: [PATCH 127/231] =?UTF-8?q?refactor=20:=20=EC=A0=81=EC=A0=88?= =?UTF-8?q?=ED=95=9C=20=ED=95=A8=EC=88=98=EB=AA=85=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(#156)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index de961646..29ff441a 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -224,7 +224,7 @@ private extension HomeViewController { } func bind() { - bindRefresh() + bindFetchStores() bindApplyFilters() bindSetMarker() bindLocationButton() @@ -233,7 +233,7 @@ private extension HomeViewController { bindErrorAlert() } - func bindRefresh() { + func bindFetchStores() { viewModel.refreshDoneOutput .bind { [weak self] in self?.refreshButton.animationInvalidate() From bd900c3b96fe8349fd4f865518db57a223c44f3e Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 4 Feb 2024 23:04:02 +0900 Subject: [PATCH 128/231] =?UTF-8?q?refactor=20:=20MoreStoreButton=20config?= =?UTF-8?q?uration=20=ED=95=A8=EC=88=98=20=EC=83=9D=EC=84=B1=20(#156)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/MoreStoreButton.swift | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift index 74612bd6..babdfffb 100644 --- a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift +++ b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift @@ -21,6 +21,7 @@ final class MoreStoreButton: UIButton { init() { super.init(frame: .zero) + setUI() setLayerShadow(shadowOffset: CGSize(width: 0, height: 2)) } @@ -31,9 +32,15 @@ final class MoreStoreButton: UIButton { func setFetchCount(fetchCount: FetchCountContent) { var titleAttribute = AttributedString(String(format: "๊ฒฐ๊ณผ ๋”๋ณด๊ธฐ %d/%d", fetchCount.fetchCount, fetchCount.maxFetchCount)) titleAttribute.font = UIFont.pretendard(size: 10, weight: .medium) - + configuration?.attributedTitle = titleAttribute + } + +} + +private extension MoreStoreButton { + + func setUI() { var config = UIButton.Configuration.filled() - config.attributedTitle = titleAttribute config.baseBackgroundColor = .white config.baseForegroundColor = .black config.cornerStyle = .capsule From f4486d85306c791d2e009537bbccaab69df4a17a Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 4 Feb 2024 23:04:35 +0900 Subject: [PATCH 129/231] =?UTF-8?q?fix=20:=20=EB=B9=88=20=EB=B0=B0?= =?UTF-8?q?=EC=97=B4=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20(#156)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Repository/StoreRepositoryImpl.swift | 7 ++- .../ViewModel/StoreListViewModelImpl.swift | 44 ++++++++++--------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index fd07be37..52f36707 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -44,7 +44,12 @@ final class StoreRepositoryImpl: StoreRepository { ) ) } else { - observer.onError(JSONContentsError.bundleRead) + observer.onNext( + FetchStores( + fetchCountContent: FetchCountContent(), + stores: [] + ) + ) } case .failure(let error): throw error diff --git a/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift b/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift index dd29fe88..ecb0d8ba 100644 --- a/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift +++ b/KCS/KCS/Presentation/StoreList/ViewModel/StoreListViewModelImpl.swift @@ -32,29 +32,33 @@ final class StoreListViewModelImpl: StoreListViewModel { private extension StoreListViewModelImpl { func updateList(stores: [Store]) { - Observable.zip(stores.map({ [weak self] store in - guard let self = self, - let url = store.localPhotos.first else { return Observable.just(nil) } - - return fetchImageUseCase.execute(url: url) - .flatMap { Observable.just($0) } - })) - .bind { [weak self] imageDataArray in - var storeContentsArray: [StoreTableViewCellContents] = [] - for index in stores.indices { - let store = stores[index] - storeContentsArray.append( - StoreTableViewCellContents( - storeTitle: store.title, - category: store.category, - certificationTypes: store.certificationTypes, - thumbnailImageData: imageDataArray[index] + if stores.isEmpty { + updateListOutput.accept([]) + } else { + Observable.zip(stores.map({ [weak self] store in + guard let self = self, + let url = store.localPhotos.first else { return Observable.just(nil) } + + return fetchImageUseCase.execute(url: url) + .flatMap { Observable.just($0) } + })) + .bind { [weak self] imageDataArray in + var storeContentsArray: [StoreTableViewCellContents] = [] + for index in stores.indices { + let store = stores[index] + storeContentsArray.append( + StoreTableViewCellContents( + storeTitle: store.title, + category: store.category, + certificationTypes: store.certificationTypes, + thumbnailImageData: imageDataArray[index] + ) ) - ) + } + self?.updateListOutput.accept(storeContentsArray) } - self?.updateListOutput.accept(storeContentsArray) + .disposed(by: disposeBag) } - .disposed(by: disposeBag) } } From c64c8c0a71f5cc17a350225bda11866ce55e5e62 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 4 Feb 2024 23:05:47 +0900 Subject: [PATCH 130/231] =?UTF-8?q?refactor=20:=20checkLastFetch=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=83=9D=EC=84=B1=20(#156)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 27be5d40..23ee8c68 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -85,6 +85,7 @@ private extension HomeViewModelImpl { applyFilters(stores: refreshContent.stores, filters: getActivatedTypes()) fetchCountOutput.accept(FetchCountContent(maxFetchCount: dependency.maxFetchCount)) refreshDoneOutput.accept(()) + checkLastFetch() }, onError: { [weak self] error in if error is StoreRepositoryError { @@ -103,7 +104,10 @@ private extension HomeViewModelImpl { applyFilters(stores: fetchStoresUseCase.execute(fetchCount: dependency.fetchCount), filters: getActivatedTypes()) fetchCountOutput.accept(FetchCountContent(maxFetchCount: dependency.maxFetchCount, fetchCount: dependency.fetchCount)) } - + checkLastFetch() + } + + func checkLastFetch() { if dependency.fetchCount == dependency.maxFetchCount { noMoreStoresOutput.accept(()) } From 279bebba9b4ca2206d8522b8ec41b519cdc8c4e9 Mon Sep 17 00:00:00 2001 From: k2645 Date: Sun, 4 Feb 2024 23:23:17 +0900 Subject: [PATCH 131/231] =?UTF-8?q?fix=20:=20isUserInteractionEnabled?= =?UTF-8?q?=EC=97=90=EC=84=9C=20isEnabled=EB=A1=9C=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#156)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/HomeViewController.swift | 10 ++++++---- KCS/KCS/Presentation/Home/View/MoreStoreButton.swift | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 29ff441a..e5625038 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -239,7 +239,7 @@ private extension HomeViewController { self?.refreshButton.animationInvalidate() self?.refreshButton.isHidden = true self?.moreStoreButton.isHidden = false - self?.moreStoreButton.isUserInteractionEnabled = true + self?.moreStoreButton.isEnabled = true } .disposed(by: disposeBag) @@ -251,7 +251,7 @@ private extension HomeViewController { viewModel.noMoreStoresOutput .bind { [weak self] in - self?.moreStoreButton.isUserInteractionEnabled = false + self?.moreStoreButton.isEnabled = false } .disposed(by: disposeBag) } @@ -521,12 +521,14 @@ private extension HomeViewController { NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), refreshButton.widthAnchor.constraint(equalToConstant: 110), - refreshButton.heightAnchor.constraint(equalToConstant: 35) + refreshButton.heightAnchor.constraint(equalToConstant: 35), + refreshButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) // TODO: bottom constraints ํ•„์š” ]) NSLayoutConstraint.activate([ - moreStoreButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor) + moreStoreButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), + moreStoreButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) // TODO: bottom constraints ํ•„์š” ]) } diff --git a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift index babdfffb..8fc3c5ca 100644 --- a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift +++ b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift @@ -9,9 +9,9 @@ import UIKit final class MoreStoreButton: UIButton { - override var isUserInteractionEnabled: Bool { + override var isEnabled: Bool { didSet { - if isUserInteractionEnabled { + if isEnabled { configuration?.baseForegroundColor = .black } else { configuration?.baseForegroundColor = .grayLabel @@ -41,7 +41,7 @@ private extension MoreStoreButton { func setUI() { var config = UIButton.Configuration.filled() - config.baseBackgroundColor = .white + config.background.backgroundColor = .white config.baseForegroundColor = .black config.cornerStyle = .capsule config.contentInsets = NSDirectionalEdgeInsets(top: 11, leading: 10, bottom: 11, trailing: 10) From 104f7ea7c56e426e30865692a8fed082cee7f4af Mon Sep 17 00:00:00 2001 From: k2645 Date: Mon, 5 Feb 2024 01:34:50 +0900 Subject: [PATCH 132/231] =?UTF-8?q?fix=20:=2024=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=EC=98=81=EC=97=85=20=EC=A4=91=EC=9D=B8=20=EA=B0=80=EA=B2=8C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD=20(#159)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Domain/Entity/OpenClosedType.swift | 19 ++- .../UseCase/GetOpenClosedUseCaseImpl.swift | 5 + .../StoreInformation/View/DetailView.swift | 4 +- .../StoreInformation/View/SummaryView.swift | 2 +- .../StoreInformationViewModelImpl.swift | 116 +++++++++--------- 5 files changed, 83 insertions(+), 63 deletions(-) diff --git a/KCS/KCS/Domain/Entity/OpenClosedType.swift b/KCS/KCS/Domain/Entity/OpenClosedType.swift index 893c3896..b5a3326c 100644 --- a/KCS/KCS/Domain/Entity/OpenClosedType.swift +++ b/KCS/KCS/Domain/Entity/OpenClosedType.swift @@ -12,8 +12,23 @@ enum OpenClosedType: String { case open = "์˜์—… ์ค‘" case closed = "์˜์—… ์ข…๋ฃŒ" case breakTime = "๋ธŒ๋ ˆ์ดํฌ ํƒ€์ž„" - case dayOff = "ํœด๋ฌด์ผ" - case none = "" + case dayOff, none = "" + case alwaysOpen = "24์‹œ๊ฐ„ ์˜์—…" + + var description: String { + switch self { + case .open, .alwaysOpen: + return OpenClosedType.open.rawValue + case .closed: + return OpenClosedType.closed.rawValue + case .breakTime: + return OpenClosedType.breakTime.rawValue + case .dayOff: + return "ํœด๋ฌด์ผ" + case .none: + return "" + } + } } diff --git a/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift index f2bf7bea..335f5816 100644 --- a/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift +++ b/KCS/KCS/Domain/UseCase/GetOpenClosedUseCaseImpl.swift @@ -25,6 +25,8 @@ private extension GetOpenClosedUseCaseImpl { switch nowOpenClosedType { case .none, .dayOff: return OpenClosedType.none.rawValue + case .alwaysOpen: + return OpenClosedType.alwaysOpen.rawValue case .breakTime, .closed: return try getOpenClosedString(openingHour: openingHour, openClosedType: .open) case .open: @@ -42,6 +44,9 @@ private extension GetOpenClosedUseCaseImpl { if openingHour.isEmpty { return OpenClosedType.none } + if !openingHour.filter({ $0.open == $0.close }).isEmpty { + return OpenClosedType.alwaysOpen + } let openCloseTime = try getOpenClosedTimeArray(openingHours: openingHour) if openCloseTime.isEmpty { return OpenClosedType.dayOff diff --git a/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift b/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift index c3117252..6c12c65b 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/DetailView.swift @@ -221,7 +221,7 @@ private extension DetailView { NSLayoutConstraint.activate([ openingHour.bottomAnchor.constraint(equalTo: storeOpenClosed.bottomAnchor), - openingHour.leadingAnchor.constraint(equalTo: storeOpenClosed.trailingAnchor, constant: 12) + openingHour.leadingAnchor.constraint(equalTo: storeOpenClosed.trailingAnchor, constant: 8) ]) NSLayoutConstraint.activate([ @@ -267,7 +267,7 @@ private extension DetailView { addressConstraint.constant = -174 phoneNumberConstraint.constant = 20 - 11 } else { - storeOpenClosed.text = openClosedContent.openClosedType.rawValue + storeOpenClosed.text = openClosedContent.openClosedType.description storeOpenClosed.textColor = UIColor.goodPrice openingHour.text = openClosedContent.nextOpeningHour addressConstraint.constant = -16 diff --git a/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift index ed0606d3..a8f10ceb 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift @@ -177,7 +177,7 @@ extension SummaryView { } else { summaryViewHeightObserver.accept(.large) } - storeOpenClosed.text = contents.openClosedContent.openClosedType.rawValue + storeOpenClosed.text = contents.openClosedContent.openClosedType.description openingHour.text = contents.openClosedContent.nextOpeningHour category.text = contents.category contents.certificationTypes diff --git a/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift index 851d3053..750e73b4 100644 --- a/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift +++ b/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift @@ -97,72 +97,72 @@ private extension StoreInformationViewModelImpl { let weekDayIndex = idx % 7 == 0 ? 7 : idx % 7 if let weekday = Day.allCases.filter({ $0.index == weekDayIndex }).first { let openingHours = openingHours.filter { $0.open.day == weekday } - if openingHours.isEmpty { - detailOpeningHourArray.append( - DetailOpeningHour( - weekDay: weekday, - openingHour: OpeningHour( - openingHour: OpenClosedType.dayOff.rawValue, - breakTime: nil - ) + detailOpeningHourArray.append( + DetailOpeningHour( + weekDay: weekday, + openingHour: getOpeningHour( + openingHours: openingHours ) ) + ) + } + } + return detailOpeningHourArray + } + + func getOpeningHour(openingHours: [RegularOpeningHours]) -> OpeningHour { + if openingHours.isEmpty { + return OpeningHour( + openingHour: OpenClosedType.dayOff.rawValue, + breakTime: nil + ) + } + + if openingHours.count == 1 { + if let openingHour = openingHours.first { + if openingHour.open == openingHour.close { + return OpeningHour( + openingHour: OpenClosedType.alwaysOpen.rawValue, + breakTime: nil + ) + } else { + return OpeningHour( + openingHour: openingHourToString( + open: openingHour.open, + close: openingHour.close + ), + breakTime: nil + ) } - - if openingHours.count == 1 { - if let openingHour = openingHours.first { - detailOpeningHourArray.append( - DetailOpeningHour( - weekDay: weekday, - openingHour: OpeningHour( - openingHour: openingHourToString( - open: openingHour.open, - close: openingHour.close - ), - breakTime: nil) - ) - ) - } + } + } else { + if let firstOpeningHour = openingHours.first, + let lastOpeningHour = openingHours.last { + if firstOpeningHour.open == lastOpeningHour.close { + return OpeningHour( + openingHour: openingHourToString( + open: lastOpeningHour.open, + close: firstOpeningHour.close + ), + breakTime: nil + ) } else { - if let firstOpeningHour = openingHours.first, - let lastOpeningHour = openingHours.last { - if firstOpeningHour.open == lastOpeningHour.close { - detailOpeningHourArray.append( - DetailOpeningHour( - weekDay: weekday, - openingHour: OpeningHour( - openingHour: openingHourToString( - open: lastOpeningHour.open, - close: firstOpeningHour.close - ), - breakTime: nil - ) - ) - ) - } else { - detailOpeningHourArray.append( - DetailOpeningHour( - weekDay: weekday, - openingHour: OpeningHour( - openingHour: openingHourToString( - open: firstOpeningHour.open, - close: lastOpeningHour.close - ), - breakTime: openingHourToString( - open: firstOpeningHour.close, - close: lastOpeningHour.open, - isBreakTime: true - ) - ) - ) - ) - } - } + return OpeningHour( + openingHour: openingHourToString( + open: firstOpeningHour.open, + close: lastOpeningHour.close + ), + breakTime: openingHourToString( + open: firstOpeningHour.close, + close: lastOpeningHour.open, + isBreakTime: true + ) + ) } } } - return detailOpeningHourArray + return OpeningHour(openingHour: nil, breakTime: nil) } func openingHourToString(open: BusinessHour, close: BusinessHour, isBreakTime: Bool = false) -> String { From 32c1bbf37eec20061eec3201fc508818c156470f Mon Sep 17 00:00:00 2001 From: k2645 Date: Mon, 5 Feb 2024 01:48:23 +0900 Subject: [PATCH 133/231] =?UTF-8?q?refactor=20:=20=EC=9E=84=EC=9D=98?= =?UTF-8?q?=EB=A1=9C=20=EC=84=A4=EC=A0=95=ED=95=B4=EC=A4=80=20constraint?= =?UTF-8?q?=20=EA=B0=92=20=EC=82=AD=EC=A0=9C=20(#159)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index e5625038..48935696 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -521,14 +521,12 @@ private extension HomeViewController { NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), refreshButton.widthAnchor.constraint(equalToConstant: 110), - refreshButton.heightAnchor.constraint(equalToConstant: 35), - refreshButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) + refreshButton.heightAnchor.constraint(equalToConstant: 35) // TODO: bottom constraints ํ•„์š” ]) NSLayoutConstraint.activate([ - moreStoreButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), - moreStoreButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) + moreStoreButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor) // TODO: bottom constraints ํ•„์š” ]) } From 9e9750c748b4e4b24bd4f506e3d1eba6a034b48a Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 5 Feb 2024 02:38:12 +0900 Subject: [PATCH 134/231] =?UTF-8?q?fix=20:=20error=20alert=20present?= =?UTF-8?q?=EC=8B=9C=20=EC=B5=9C=EC=83=81=EB=8B=A8=20=EB=B7=B0=EC=97=90?= =?UTF-8?q?=EC=84=9C=20present=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#161)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Extension/UIViewController+ErrorAlert.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift b/KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift index 8e30f0e9..60c59f72 100644 --- a/KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift +++ b/KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift @@ -12,9 +12,12 @@ extension UIViewController { func presentErrorAlert(error: ErrorAlertMessage) { let alertController = UIAlertController(title: nil, message: error.errorDescription, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "ํ™•์ธ", style: .default)) - if !(presentedViewController is UIAlertController) { + if let presentController = presentedViewController { + presentController.presentErrorAlert(error: error) + } else { present(alertController, animated: true) } + } } From 3754163e1e47bf46c2385ec8d16275e84a2b3fba Mon Sep 17 00:00:00 2001 From: k2645 Date: Mon, 5 Feb 2024 02:53:06 +0900 Subject: [PATCH 135/231] =?UTF-8?q?feat=20:=20=EB=82=98=EC=B9=A8=EB=B0=98?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9=20(#162)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 48935696..16e2a664 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -77,11 +77,19 @@ final class HomeViewController: UIViewController { return button }() + private lazy var compassView: NMFCompassView = { + let compass = NMFCompassView() + compass.translatesAutoresizingMaskIntoConstraints = false + compass.mapView = mapView.mapView + + return compass + }() + private lazy var mapView: NMFNaverMapView = { let map = NMFNaverMapView() map.translatesAutoresizingMaskIntoConstraints = false - map.showZoomControls = false map.showCompass = false + map.showZoomControls = false map.showScaleBar = false map.showIndoorLevelPicker = false map.showLocationButton = false @@ -486,6 +494,7 @@ private extension HomeViewController { view.addSubview(mapView) mapView.addSubview(locationButton) mapView.addSubview(filterButtonStackView) + mapView.addSubview(compassView) mapView.addSubview(refreshButton) mapView.addSubview(moreStoreButton) mapView.addSubview(dimView) @@ -518,6 +527,11 @@ private extension HomeViewController { filterButtonStackView.topAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.topAnchor, constant: 8) ]) + NSLayoutConstraint.activate([ + compassView.leadingAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.leadingAnchor, constant: 16), + compassView.topAnchor.constraint(equalTo: filterButtonStackView.bottomAnchor, constant: 16) + ]) + NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), refreshButton.widthAnchor.constraint(equalToConstant: 110), From ed1797a3ef0c1a776dafc07d9919b2b4f0ab865f Mon Sep 17 00:00:00 2001 From: k2645 Date: Mon, 5 Feb 2024 13:13:32 +0900 Subject: [PATCH 136/231] =?UTF-8?q?feat=20:=20=EC=B2=AB=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=9D=B8=EC=A7=80=20=EA=B5=AC=EB=B3=84=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20(#165)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Interface/Repository/StoreRepository.swift | 3 ++- .../UseCase/FetchRefreshStoresUseCase.swift | 3 ++- .../UseCase/FetchRefreshStoresUseCaseImpl.swift | 5 +++-- .../Home/ViewModel/HomeViewModelImpl.swift | 14 ++++++++------ .../Home/ViewModel/protocol/HomeViewModel.swift | 4 ++-- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift index 73f11fde..dc90dc7b 100644 --- a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift +++ b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift @@ -10,7 +10,8 @@ import RxSwift protocol StoreRepository { func fetchRefreshStores( - requestLocation: RequestLocation + requestLocation: RequestLocation, + isFirst: Bool ) -> Observable func fetchStores(count: Int) -> [Store] diff --git a/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift b/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift index ad2fb827..9b8a56cd 100644 --- a/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift +++ b/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift @@ -14,7 +14,8 @@ protocol FetchRefreshStoresUseCase { init(repository: StoreRepository) func execute( - requestLocation: RequestLocation + requestLocation: RequestLocation, + isFirst: Bool ) -> Observable } diff --git a/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift index b677a547..1bf2484f 100644 --- a/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift +++ b/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift @@ -12,9 +12,10 @@ struct FetchRefreshStoresUseCaseImpl: FetchRefreshStoresUseCase { let repository: StoreRepository func execute( - requestLocation: RequestLocation + requestLocation: RequestLocation, + isFirst: Bool ) -> Observable { - return repository.fetchRefreshStores(requestLocation: requestLocation) + return repository.fetchRefreshStores(requestLocation: requestLocation, isFirst: isFirst) } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 23ee8c68..b3daf252 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -17,7 +17,7 @@ final class HomeViewModelImpl: HomeViewModel { let getStoreInformationUseCase: GetStoreInformationUseCase let getStoreInformationOutput = PublishRelay() - let refreshDoneOutput = PublishRelay() + let refreshDoneOutput = PublishRelay() let locationButtonOutput = PublishRelay() let locationButtonImageNameOutput = PublishRelay() let setMarkerOutput = PublishRelay() @@ -46,8 +46,8 @@ final class HomeViewModelImpl: HomeViewModel { func action(input: HomeViewModelInputCase) { switch input { - case .refresh(let requestLocation): - refresh(requestLocation: requestLocation) + case .refresh(let requestLocation, let isFirst): + refresh(requestLocation: requestLocation, isFirst: isFirst) case .moreStoreButtonTapped: moreStoreButtonTapped() case .filterButtonTapped(let filter): @@ -72,10 +72,12 @@ final class HomeViewModelImpl: HomeViewModel { private extension HomeViewModelImpl { func refresh( - requestLocation: RequestLocation + requestLocation: RequestLocation, + isFirst: Bool ) { fetchRefreshStoresUseCase.execute( - requestLocation: requestLocation + requestLocation: requestLocation, + isFirst: isFirst ) .subscribe( onNext: { [weak self] refreshContent in @@ -84,7 +86,7 @@ private extension HomeViewModelImpl { dependency.maxFetchCount = refreshContent.fetchCountContent.maxFetchCount applyFilters(stores: refreshContent.stores, filters: getActivatedTypes()) fetchCountOutput.accept(FetchCountContent(maxFetchCount: dependency.maxFetchCount)) - refreshDoneOutput.accept(()) + refreshDoneOutput.accept(isFirst) checkLastFetch() }, onError: { [weak self] error in diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 43fd67e9..9a075034 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -27,7 +27,7 @@ protocol HomeViewModel: HomeViewModelInput, HomeViewModelOutput { enum HomeViewModelInputCase { - case refresh(requestLocation: RequestLocation) + case refresh(requestLocation: RequestLocation, isFirst: Bool = false) case moreStoreButtonTapped case filterButtonTapped(activatedFilter: CertificationType) case markerTapped(tag: UInt) @@ -48,7 +48,7 @@ protocol HomeViewModelInput { protocol HomeViewModelOutput { var getStoreInformationOutput: PublishRelay { get } - var refreshDoneOutput: PublishRelay { get } + var refreshDoneOutput: PublishRelay { get } var filteredStoresOutput: PublishRelay<[FilteredStores]> { get } var locationButtonOutput: PublishRelay { get } var locationButtonImageNameOutput: PublishRelay { get } From ce2d840f4c2b0116e711660ada1a22e4c433439b Mon Sep 17 00:00:00 2001 From: k2645 Date: Mon, 5 Feb 2024 13:14:24 +0900 Subject: [PATCH 137/231] =?UTF-8?q?feat=20:=20=EC=B2=AB=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=9D=BC=20=EA=B2=BD=EC=9A=B0=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EA=B0=80=EA=B2=8C=20show,=20=EA=B0=80=EA=B2=8C=20=EB=8D=94?= =?UTF-8?q?=EB=B3=B4=EA=B8=B0=20hidden=20(#165)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Repository/StoreRepositoryImpl.swift | 24 ++++++++++++------- .../Home/View/HomeViewController.swift | 13 ++++++---- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 52f36707..c5bc1b9e 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -17,7 +17,8 @@ final class StoreRepositoryImpl: StoreRepository { } func fetchRefreshStores( - requestLocation: RequestLocation + requestLocation: RequestLocation, + isFirst: Bool ) -> Observable { return Observable.create { observer -> Disposable in AF.request(StoreAPI.getStores(location: RequestLocationDTO( @@ -35,22 +36,27 @@ final class StoreRepositoryImpl: StoreRepository { switch response.result { case .success(let result): let resultStores = try result.data.map { try $0.map { try $0.toEntity() } } + var fetchStores: FetchStores self?.stores = resultStores - if let firstIndexStore = resultStores.first { - observer.onNext( - FetchStores( + if isFirst { + fetchStores = FetchStores( + fetchCountContent: FetchCountContent(), + stores: resultStores.flatMap { $0 } + ) + } else { + if let firstIndexStore = resultStores.first { + fetchStores = FetchStores( fetchCountContent: FetchCountContent(maxFetchCount: resultStores.count), stores: firstIndexStore ) - ) - } else { - observer.onNext( - FetchStores( + } else { + fetchStores = FetchStores( fetchCountContent: FetchCountContent(), stores: [] ) - ) + } } + observer.onNext(fetchStores) case .failure(let error): throw error } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 16e2a664..614cbb14 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -243,10 +243,10 @@ private extension HomeViewController { func bindFetchStores() { viewModel.refreshDoneOutput - .bind { [weak self] in + .bind { [weak self] isFirst in self?.refreshButton.animationInvalidate() self?.refreshButton.isHidden = true - self?.moreStoreButton.isHidden = false + self?.moreStoreButton.isHidden = isFirst self?.moreStoreButton.isEnabled = true } .disposed(by: disposeBag) @@ -535,12 +535,14 @@ private extension HomeViewController { NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), refreshButton.widthAnchor.constraint(equalToConstant: 110), - refreshButton.heightAnchor.constraint(equalToConstant: 35) + refreshButton.heightAnchor.constraint(equalToConstant: 35), + refreshButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) // TODO: bottom constraints ํ•„์š” ]) NSLayoutConstraint.activate([ - moreStoreButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor) + moreStoreButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), + moreStoreButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) // TODO: bottom constraints ํ•„์š” ]) } @@ -581,7 +583,8 @@ extension HomeViewController: NMFMapViewCameraDelegate { refreshButton.animationFire() viewModel.action( input: .refresh( - requestLocation: makeRequestLocation(projection: mapView.projection) + requestLocation: makeRequestLocation(projection: mapView.projection), + isFirst: true ) ) } From 858ec7c058cfc9fdf5d99d6dae122f36d3cc607a Mon Sep 17 00:00:00 2001 From: k2645 Date: Mon, 5 Feb 2024 13:56:37 +0900 Subject: [PATCH 138/231] =?UTF-8?q?refactor=20:=20=ED=99=95=EC=A0=95?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EB=A7=A4=EA=B0=9C?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#165)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Repository/StoreRepositoryImpl.swift | 4 ++-- .../Domain/Interface/Repository/StoreRepository.swift | 2 +- .../Interface/UseCase/FetchRefreshStoresUseCase.swift | 2 +- .../Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift | 4 ++-- .../Presentation/Home/View/HomeViewController.swift | 6 +++--- .../Home/ViewModel/HomeViewModelImpl.swift | 10 +++++----- .../Home/ViewModel/protocol/HomeViewModel.swift | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index c5bc1b9e..cbdce69f 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -18,7 +18,7 @@ final class StoreRepositoryImpl: StoreRepository { func fetchRefreshStores( requestLocation: RequestLocation, - isFirst: Bool + isEntire: Bool ) -> Observable { return Observable.create { observer -> Disposable in AF.request(StoreAPI.getStores(location: RequestLocationDTO( @@ -38,7 +38,7 @@ final class StoreRepositoryImpl: StoreRepository { let resultStores = try result.data.map { try $0.map { try $0.toEntity() } } var fetchStores: FetchStores self?.stores = resultStores - if isFirst { + if isEntire { fetchStores = FetchStores( fetchCountContent: FetchCountContent(), stores: resultStores.flatMap { $0 } diff --git a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift index dc90dc7b..1dbe8af2 100644 --- a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift +++ b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift @@ -11,7 +11,7 @@ protocol StoreRepository { func fetchRefreshStores( requestLocation: RequestLocation, - isFirst: Bool + isEntire: Bool ) -> Observable func fetchStores(count: Int) -> [Store] diff --git a/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift b/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift index 9b8a56cd..29c2b212 100644 --- a/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift +++ b/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift @@ -15,7 +15,7 @@ protocol FetchRefreshStoresUseCase { func execute( requestLocation: RequestLocation, - isFirst: Bool + isEntire: Bool ) -> Observable } diff --git a/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift index 1bf2484f..dbc26fa7 100644 --- a/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift +++ b/KCS/KCS/Domain/UseCase/FetchRefreshStoresUseCaseImpl.swift @@ -13,9 +13,9 @@ struct FetchRefreshStoresUseCaseImpl: FetchRefreshStoresUseCase { func execute( requestLocation: RequestLocation, - isFirst: Bool + isEntire: Bool ) -> Observable { - return repository.fetchRefreshStores(requestLocation: requestLocation, isFirst: isFirst) + return repository.fetchRefreshStores(requestLocation: requestLocation, isEntire: isEntire) } } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 614cbb14..455a2f15 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -243,10 +243,10 @@ private extension HomeViewController { func bindFetchStores() { viewModel.refreshDoneOutput - .bind { [weak self] isFirst in + .bind { [weak self] isEntire in self?.refreshButton.animationInvalidate() self?.refreshButton.isHidden = true - self?.moreStoreButton.isHidden = isFirst + self?.moreStoreButton.isHidden = isEntire self?.moreStoreButton.isEnabled = true } .disposed(by: disposeBag) @@ -584,7 +584,7 @@ extension HomeViewController: NMFMapViewCameraDelegate { viewModel.action( input: .refresh( requestLocation: makeRequestLocation(projection: mapView.projection), - isFirst: true + isEntire: true ) ) } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index b3daf252..13e357a8 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -46,8 +46,8 @@ final class HomeViewModelImpl: HomeViewModel { func action(input: HomeViewModelInputCase) { switch input { - case .refresh(let requestLocation, let isFirst): - refresh(requestLocation: requestLocation, isFirst: isFirst) + case .refresh(let requestLocation, let isEntire): + refresh(requestLocation: requestLocation, isEntire: isEntire) case .moreStoreButtonTapped: moreStoreButtonTapped() case .filterButtonTapped(let filter): @@ -73,11 +73,11 @@ private extension HomeViewModelImpl { func refresh( requestLocation: RequestLocation, - isFirst: Bool + isEntire: Bool ) { fetchRefreshStoresUseCase.execute( requestLocation: requestLocation, - isFirst: isFirst + isEntire: isEntire ) .subscribe( onNext: { [weak self] refreshContent in @@ -86,7 +86,7 @@ private extension HomeViewModelImpl { dependency.maxFetchCount = refreshContent.fetchCountContent.maxFetchCount applyFilters(stores: refreshContent.stores, filters: getActivatedTypes()) fetchCountOutput.accept(FetchCountContent(maxFetchCount: dependency.maxFetchCount)) - refreshDoneOutput.accept(isFirst) + refreshDoneOutput.accept(isEntire) checkLastFetch() }, onError: { [weak self] error in diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 9a075034..c8596c57 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -27,7 +27,7 @@ protocol HomeViewModel: HomeViewModelInput, HomeViewModelOutput { enum HomeViewModelInputCase { - case refresh(requestLocation: RequestLocation, isFirst: Bool = false) + case refresh(requestLocation: RequestLocation, isEntire: Bool = false) case moreStoreButtonTapped case filterButtonTapped(activatedFilter: CertificationType) case markerTapped(tag: UInt) From 8f20b9c1d6822b476fbfc417db80ebeabd4bd18b Mon Sep 17 00:00:00 2001 From: k2645 Date: Mon, 5 Feb 2024 14:15:17 +0900 Subject: [PATCH 139/231] =?UTF-8?q?feat=20:=20=EC=95=B1=20=EC=B5=9C?= =?UTF-8?q?=EC=B4=88=20=EC=8B=A4=ED=96=89=20=ED=99=95=EC=9D=B8=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20UserDefault=20=EC=B6=94=EA=B0=80=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 16 ++++++++++++++++ KCS/KCS/Data/Storage.swift | 22 ++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 KCS/KCS/Data/Storage.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index df3e029a..645270ee 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -86,6 +86,8 @@ A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */; }; A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */; }; A83367B82B6FA0E700E0A844 /* FetchStores.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B72B6FA0E700E0A844 /* FetchStores.swift */; }; + A83367BB2B709C0200E0A844 /* OnBoardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BA2B709C0200E0A844 /* OnBoardingViewController.swift */; }; + A83367BD2B70A52900E0A844 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BC2B70A52900E0A844 /* Storage.swift */; }; A89087042B4E7F3500767225 /* FilterButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087032B4E7F3500767225 /* FilterButton.swift */; }; A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; @@ -206,6 +208,8 @@ A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = ""; }; A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreStoreButton.swift; sourceTree = ""; }; A83367B72B6FA0E700E0A844 /* FetchStores.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStores.swift; sourceTree = ""; }; + A83367BA2B709C0200E0A844 /* OnBoardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnBoardingViewController.swift; sourceTree = ""; }; + A83367BC2B70A52900E0A844 /* Storage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = ""; }; A89087032B4E7F3500767225 /* FilterButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterButton.swift; sourceTree = ""; }; A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; @@ -357,6 +361,7 @@ A8ACB7CD2B54ED6400540BD1 /* Repository */, 59C306AE2B4FFE3700862625 /* Network */, 5977BE9D2B59ACE800725C90 /* ImageCache.swift */, + A83367BC2B70A52900E0A844 /* Storage.swift */, ); path = Data; sourceTree = ""; @@ -378,6 +383,7 @@ 5986DCEA2B392996005AE43B /* Home */, 59B886242B6A39E9005750EF /* StoreList */, 59B886552B6E3A59005750EF /* StoreInformation */, + A83367B92B709BE900E0A844 /* OnBoarding */, ); path = Presentation; sourceTree = ""; @@ -598,6 +604,14 @@ path = font; sourceTree = ""; }; + A83367B92B709BE900E0A844 /* OnBoarding */ = { + isa = PBXGroup; + children = ( + A83367BA2B709C0200E0A844 /* OnBoardingViewController.swift */, + ); + path = OnBoarding; + sourceTree = ""; + }; A890870B2B4EF8F900767225 /* Extension */ = { isa = PBXGroup; children = ( @@ -919,6 +933,7 @@ buildActionMask = 2147483647; files = ( 59B886482B6A5CE9005750EF /* StoreListViewModelImpl.swift in Sources */, + A83367BD2B70A52900E0A844 /* Storage.swift in Sources */, A81EFBB52B5D477600D0C0D7 /* UILabel+.swift in Sources */, 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */, A890870F2B4F836C00767225 /* SummaryView.swift in Sources */, @@ -941,6 +956,7 @@ 5977BE742B57FA7A00725C90 /* FilteredStores.swift in Sources */, A8A7E05D2B64AF1300D015E5 /* StoreInformationViewConstraints.swift in Sources */, 5977BE5E2B5535C700725C90 /* FetchRefreshStoresUseCase.swift in Sources */, + A83367BB2B709C0200E0A844 /* OnBoardingViewController.swift in Sources */, A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */, 59C306B02B4FFE4400862625 /* StoreResponse.swift in Sources */, A8A7E0602B64E62200D015E5 /* NMFMyPosition+.swift in Sources */, diff --git a/KCS/KCS/Data/Storage.swift b/KCS/KCS/Data/Storage.swift new file mode 100644 index 00000000..52eb58e0 --- /dev/null +++ b/KCS/KCS/Data/Storage.swift @@ -0,0 +1,22 @@ +// +// Storage.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/5/24. +// + +import Foundation + +final class Storage { + + static func isFirstTime() -> Bool { + let defaults = UserDefaults.standard + if defaults.object(forKey: "isFirstTime") == nil { + defaults.set(false, forKey:"isFirstTime") + return true + } else { + return false + } + } + +} From b67fd18aaee332c3a10c2344b831d7b710a398ec Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 5 Feb 2024 14:25:16 +0900 Subject: [PATCH 140/231] =?UTF-8?q?feat=20:=20HomeViewController=EC=97=90?= =?UTF-8?q?=20=EC=84=A0=ED=83=9D=EB=90=9C=20Cell=EC=9D=98=20Index=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=20(#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 7 +++++-- .../Home/View/HomeViewController.swift | 15 +++++++++++++-- .../StoreList/View/StoreListViewController.swift | 15 ++++++++++++++- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 1dcf8878..624d41a7 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -26,6 +26,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { getStoreInformationUseCase: GetStoreInformationUseCaseImpl(repository: repository) ) let summaryViewHeightObserver = PublishRelay() + let cellSelectedIndexObserver = PublishRelay() let storeInformationViewController = StoreInformationViewController( summaryViewHeightObserver: summaryViewHeightObserver, viewModel: StoreInformationViewModelImpl( @@ -44,9 +45,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { fetchImageUseCase: FetchImageUseCaseImpl( repository: ImageRepositoryImpl(cache: ImageCache()) ) - ) + ), + cellSelectedIndexObserver: cellSelectedIndexObserver ), - summaryViewHeightObserver: summaryViewHeightObserver + summaryViewHeightObserver: summaryViewHeightObserver, + cellSelectedIndexObserver: cellSelectedIndexObserver ) window?.makeKeyAndVisible() } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 16e2a664..eb36bbaa 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -185,17 +185,20 @@ final class HomeViewController: UIViewController { private let storeListViewController: StoreListViewController private let viewModel: HomeViewModel private let summaryViewHeightObserver: PublishRelay - + private let cellSelectedIndexObserver: PublishRelay init( viewModel: HomeViewModel, storeInformationViewController: StoreInformationViewController, storeListViewController: StoreListViewController, - summaryViewHeightObserver: PublishRelay + summaryViewHeightObserver: PublishRelay, + cellSelectedIndexObserver: PublishRelay ) { self.viewModel = viewModel self.storeInformationViewController = storeInformationViewController self.storeListViewController = storeListViewController self.summaryViewHeightObserver = summaryViewHeightObserver + self.cellSelectedIndexObserver = cellSelectedIndexObserver + super.init(nibName: nil, bundle: nil) } @@ -239,6 +242,7 @@ private extension HomeViewController { bindLocationAuthorization() bindStoreInformationView() bindErrorAlert() + bindStoreListCell() } func bindFetchStores() { @@ -409,6 +413,13 @@ private extension HomeViewController { .disposed(by: disposeBag) } + func bindStoreListCell() { + cellSelectedIndexObserver.bind { index in + <#code#> + } + .disposed(by: disposeBag) + } + } private extension HomeViewController { diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index 8e0b1158..f2a9765a 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -7,9 +7,12 @@ import UIKit import RxSwift +import RxRelay final class StoreListViewController: UIViewController { + private let cellSelectedIndexObserver: PublishRelay + private let disposeBag = DisposeBag() private let titleBar: UINavigationBar = { @@ -55,8 +58,9 @@ final class StoreListViewController: UIViewController { private let viewModel: StoreListViewModel - init(viewModel: StoreListViewModel) { + init(viewModel: StoreListViewModel, cellSelectedIndexObserver: PublishRelay) { self.viewModel = viewModel + self.cellSelectedIndexObserver = cellSelectedIndexObserver super.init(nibName: nil, bundle: nil) } @@ -84,6 +88,7 @@ private extension StoreListViewController { func setup() { isModalInPresentation = true + storeTableView.delegate = self } func addUIComponents() { @@ -119,3 +124,11 @@ private extension StoreListViewController { } } + +extension StoreListViewController: UITableViewDelegate { + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + cellSelectedIndexObserver.accept(indexPath.row) + } + +} From ca8bc594fcaae8fb5a4804cf08d7bbe11f724c52 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 5 Feb 2024 14:26:04 +0900 Subject: [PATCH 141/231] =?UTF-8?q?feat=20:=20StoreRepository=EC=97=90?= =?UTF-8?q?=EC=84=9C=20Index=EB=A1=9C=20Store=20=ED=83=90=EC=83=89=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Repository/Error/StoreRepositoryError.swift | 3 +++ KCS/KCS/Data/Repository/StoreRepositoryImpl.swift | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/KCS/KCS/Data/Repository/Error/StoreRepositoryError.swift b/KCS/KCS/Data/Repository/Error/StoreRepositoryError.swift index dd9b7ef0..6d384274 100644 --- a/KCS/KCS/Data/Repository/Error/StoreRepositoryError.swift +++ b/KCS/KCS/Data/Repository/Error/StoreRepositoryError.swift @@ -10,11 +10,14 @@ import Foundation enum StoreRepositoryError: Error, LocalizedError { case wrongStoreId + case wrongStoreIndex var errorDescription: String { switch self { case .wrongStoreId: return "๊ฐ€๊ฒŒ Id๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค." + case .wrongStoreIndex: + return "๊ฐ€๊ฒŒ Index๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€์•Š์Šต๋‹ˆ๋‹ค." } } } diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 52f36707..7e4757a5 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -77,4 +77,15 @@ final class StoreRepositoryImpl: StoreRepository { return store } + func getStoreByIndex( + index: Int + ) throws -> Store { + let flattenStores = stores.flatMap({ $0 }) + if flattenStores.indices ~= index { + return flattenStores[index] + } else { + throw StoreRepositoryError.wrongStoreIndex + } + } + } From 818fe02d3fc50a34618dee7d31929a257e3d4ee0 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 5 Feb 2024 14:34:28 +0900 Subject: [PATCH 142/231] =?UTF-8?q?feat=20:=20Repository=20Interface?= =?UTF-8?q?=EC=97=90=20Index=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20(?= =?UTF-8?q?#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Domain/Interface/Repository/StoreRepository.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift index 73f11fde..300a8cce 100644 --- a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift +++ b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift @@ -19,4 +19,8 @@ protocol StoreRepository { tag: UInt ) throws -> Store + func getStoreByIndex( + index: Int + ) throws -> Store + } From 1e81a707a1ece088cb7f93c19352da067057745f Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 5 Feb 2024 14:34:49 +0900 Subject: [PATCH 143/231] =?UTF-8?q?feat=20:=20Index=EB=A1=9C=20Store=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20UseCase=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20(#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 8 ++++++++ .../UseCase/FetchStoreByIndexUseCase.swift | 18 ++++++++++++++++++ .../UseCase/FetchStoreByIndexUseCaseImpl.swift | 18 ++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 KCS/KCS/Domain/Interface/UseCase/FetchStoreByIndexUseCase.swift create mode 100644 KCS/KCS/Domain/UseCase/FetchStoreByIndexUseCaseImpl.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index df3e029a..4e9a0b49 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -45,6 +45,8 @@ 59B886602B6E7CF6005750EF /* UIViewController+ErrorAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */; }; 59B886622B6E8484005750EF /* UISheetPresentationController+Detent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */; }; 59B886642B6EC816005750EF /* SummaryViewHeightCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886632B6EC816005750EF /* SummaryViewHeightCase.swift */; }; + 59B886662B70A996005750EF /* FetchStoreByIndexUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886652B70A996005750EF /* FetchStoreByIndexUseCase.swift */; }; + 59B886682B70AA58005750EF /* FetchStoreByIndexUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886672B70AA58005750EF /* FetchStoreByIndexUseCaseImpl.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -161,6 +163,8 @@ 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+ErrorAlert.swift"; sourceTree = ""; }; 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISheetPresentationController+Detent.swift"; sourceTree = ""; }; 59B886632B6EC816005750EF /* SummaryViewHeightCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewHeightCase.swift; sourceTree = ""; }; + 59B886652B70A996005750EF /* FetchStoreByIndexUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStoreByIndexUseCase.swift; sourceTree = ""; }; + 59B886672B70AA58005750EF /* FetchStoreByIndexUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStoreByIndexUseCaseImpl.swift; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -290,6 +294,7 @@ A8ACB7F02B5AEBE300540BD1 /* GetStoreInformationUseCase.swift */, A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */, 59F478B42B59BE0B002FEF9E /* FetchImageUseCase.swift */, + 59B886652B70A996005750EF /* FetchStoreByIndexUseCase.swift */, ); path = UseCase; sourceTree = ""; @@ -303,6 +308,7 @@ A8ACB7EE2B5AEBB800540BD1 /* GetStoreInformationUseCaseImpl.swift */, A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */, 59F478B22B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift */, + 59B886672B70AA58005750EF /* FetchStoreByIndexUseCaseImpl.swift */, ); path = UseCase; sourceTree = ""; @@ -958,6 +964,7 @@ 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, 59B886292B6A3F1E005750EF /* StoreTableViewCell.swift in Sources */, 592262242B61203000CA5A11 /* DetailView.swift in Sources */, + 59B886662B70A996005750EF /* FetchStoreByIndexUseCase.swift in Sources */, A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, @@ -967,6 +974,7 @@ 59C306C72B501B1E00862625 /* JSONContentsError.swift in Sources */, 59C306CB2B50357900862625 /* Router.swift in Sources */, A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, + 59B886682B70AA58005750EF /* FetchStoreByIndexUseCaseImpl.swift in Sources */, 59C306B62B50027300862625 /* Store.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, 59B8865A2B6E3B40005750EF /* StoreInformationViewController.swift in Sources */, diff --git a/KCS/KCS/Domain/Interface/UseCase/FetchStoreByIndexUseCase.swift b/KCS/KCS/Domain/Interface/UseCase/FetchStoreByIndexUseCase.swift new file mode 100644 index 00000000..dc300a17 --- /dev/null +++ b/KCS/KCS/Domain/Interface/UseCase/FetchStoreByIndexUseCase.swift @@ -0,0 +1,18 @@ +// +// FetchStoreByIndexUseCase.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/5/24. +// + +import Foundation + +protocol FetchStoreByIndexUseCase { + + var repository: StoreRepository { get } + + init(repository: StoreRepository) + + func execute(index: Int) throws -> Store + +} diff --git a/KCS/KCS/Domain/UseCase/FetchStoreByIndexUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/FetchStoreByIndexUseCaseImpl.swift new file mode 100644 index 00000000..e97a5fb9 --- /dev/null +++ b/KCS/KCS/Domain/UseCase/FetchStoreByIndexUseCaseImpl.swift @@ -0,0 +1,18 @@ +// +// FetchStoreByIndexUseCaseImpl.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/5/24. +// + +import Foundation + +struct FetchStoreByIndexUseCaseImpl: FetchStoreByIndexUseCase { + + let repository: StoreRepository + + func execute(index: Int) throws -> Store { + return try repository.getStoreByIndex(index: index) + } + +} From 2d6e12ec669d56c316f13abd8f8d98053852de5c Mon Sep 17 00:00:00 2001 From: k2645 Date: Mon, 5 Feb 2024 14:37:28 +0900 Subject: [PATCH 144/231] =?UTF-8?q?feat=20:=20onboarding=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20set=20=EC=B6=94=EA=B0=80=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OnBoarding1.imageset/Contents.json | 23 ++++++++++++++++++ .../OnBoarding1.imageset/OnBoarding1.png | Bin 0 -> 18782 bytes .../OnBoarding1.imageset/OnBoarding1@2x.png | Bin 0 -> 37451 bytes .../OnBoarding1.imageset/OnBoarding1@3x.png | Bin 0 -> 56473 bytes .../OnBoarding2.imageset/Contents.json | 23 ++++++++++++++++++ .../OnBoarding2.imageset/OnBoarding2.png | Bin 0 -> 17576 bytes .../OnBoarding2.imageset/OnBoarding2@2x.png | Bin 0 -> 34164 bytes .../OnBoarding2.imageset/OnBoarding2@3x.png | Bin 0 -> 49286 bytes .../OnBoarding3.imageset/Contents.json | 23 ++++++++++++++++++ .../OnBoarding3.imageset/OnBoarding3.png | Bin 0 -> 32001 bytes .../OnBoarding3.imageset/OnBoarding3@2x.png | Bin 0 -> 63389 bytes .../OnBoarding3.imageset/OnBoarding3@3x.png | Bin 0 -> 97146 bytes .../OnBoarding4.imageset/Contents.json | 23 ++++++++++++++++++ .../OnBoarding4.imageset/OnBoarding4.png | Bin 0 -> 26345 bytes .../OnBoarding4.imageset/OnBoarding4@2x.png | Bin 0 -> 52495 bytes .../OnBoarding4.imageset/OnBoarding4@3x.png | Bin 0 -> 80260 bytes .../OnBoarding5.imageset/Contents.json | 23 ++++++++++++++++++ .../OnBoarding5.imageset/OnBoarding5.png | Bin 0 -> 16716 bytes .../OnBoarding5.imageset/OnBoarding5@2x.png | Bin 0 -> 33672 bytes .../OnBoarding5.imageset/OnBoarding5@3x.png | Bin 0 -> 51460 bytes 20 files changed, 115 insertions(+) create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@3x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2@3x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3@3x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@3x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/Contents.json create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5@2x.png create mode 100644 KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5@3x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/Contents.json new file mode 100644 index 00000000..b5133607 --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "OnBoarding1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "OnBoarding1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "OnBoarding1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1.png new file mode 100644 index 0000000000000000000000000000000000000000..a659b06ce8a7414d36456e8cf0c0a29a7a0e4a7b GIT binary patch literal 18782 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@2x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d404ada09c6d2deb6bb5bbfc6a8e2e67ea8a41e8 GIT binary patch literal 37451 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�=P_EH~P(2YzA@@m05$KSLq=7&@Z( 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@3x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..584d37a6bc316ddf95534f116a096759771cb8ee GIT binary patch literal 56473 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/Contents.json new file mode 100644 index 00000000..dad45ccb --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "OnBoarding2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "OnBoarding2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "OnBoarding2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2.png new file mode 100644 index 0000000000000000000000000000000000000000..1976b55652477839fa1efd6e87c2f51b3314bd9a GIT binary patch literal 17576 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

E-yg^9hwt@>!)4aPgSQo0HmP^SGr$_pc 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 d2q6pS{{wO!TFYZ>5$FRmo(R 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2@3x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..298d9a1588a3af16091f392d873617ec807c0f0d GIT binary patch literal 49286 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/Contents.json new file mode 100644 index 00000000..651571c8 --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "OnBoarding3.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "OnBoarding3@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "OnBoarding3@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3.png new file mode 100644 index 0000000000000000000000000000000000000000..7137dad4c9d6b2064136603a219d42562f374013 GIT binary patch literal 32001 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 annplGscCYojqORuV7I%s}#a%;y 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®OGDm;g>)i-Gi$Z9@&be5oAoGZ+r?2-z=H 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 Zdi}UjyJ?M!FZs94tA9COB-z}4@L!0lWrY9$ literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/Contents.json new file mode 100644 index 00000000..9fc3a8fc --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "OnBoarding4.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "OnBoarding4@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "OnBoarding4@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4.png new file mode 100644 index 0000000000000000000000000000000000000000..37d14b894e90f4a965d259a365bd8b9c4f2c683f GIT binary patch literal 26345 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@2x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8a78ceebc5988630908223f7e7a6d6a671f0c7ba GIT binary patch literal 52495 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 Txc5jHbh3n}tDnm{r-UW|q=LjT literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@3x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca3f21d775974eb2e76b3f289d51136746d1ffc GIT binary patch literal 80260 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 Caxy~z literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/Contents.json new file mode 100644 index 00000000..02dcefee --- /dev/null +++ b/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "OnBoarding5.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "OnBoarding5@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "OnBoarding5@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5.png new file mode 100644 index 0000000000000000000000000000000000000000..9cbb6eb84f038f3b84ac2f68df04721faa40957e GIT binary patch literal 16716 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 literal 0 HcmV?d00001 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5@3x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6684baaae6dbe5c84428b1b0768d31d804e299ff GIT binary patch literal 51460 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 literal 0 HcmV?d00001 From 23b9f4fa291e5b52611ac5da4c707fe4bd0611dd Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Mon, 5 Feb 2024 14:58:00 +0900 Subject: [PATCH 145/231] =?UTF-8?q?Revert=20"feat=20:=20HomeViewController?= =?UTF-8?q?=EC=97=90=20=EC=84=A0=ED=83=9D=EB=90=9C=20Cell=EC=9D=98=20Index?= =?UTF-8?q?=20=EC=A0=84=EB=8B=AC=20(#168)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit b67fd18aaee332c3a10c2344b831d7b710a398ec. --- KCS/KCS/Application/SceneDelegate.swift | 7 ++----- .../Home/View/HomeViewController.swift | 15 ++------------- .../StoreList/View/StoreListViewController.swift | 15 +-------------- 3 files changed, 5 insertions(+), 32 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 624d41a7..1dcf8878 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -26,7 +26,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { getStoreInformationUseCase: GetStoreInformationUseCaseImpl(repository: repository) ) let summaryViewHeightObserver = PublishRelay() - let cellSelectedIndexObserver = PublishRelay() let storeInformationViewController = StoreInformationViewController( summaryViewHeightObserver: summaryViewHeightObserver, viewModel: StoreInformationViewModelImpl( @@ -45,11 +44,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { fetchImageUseCase: FetchImageUseCaseImpl( repository: ImageRepositoryImpl(cache: ImageCache()) ) - ), - cellSelectedIndexObserver: cellSelectedIndexObserver + ) ), - summaryViewHeightObserver: summaryViewHeightObserver, - cellSelectedIndexObserver: cellSelectedIndexObserver + summaryViewHeightObserver: summaryViewHeightObserver ) window?.makeKeyAndVisible() } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index eb36bbaa..16e2a664 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -185,20 +185,17 @@ final class HomeViewController: UIViewController { private let storeListViewController: StoreListViewController private let viewModel: HomeViewModel private let summaryViewHeightObserver: PublishRelay - private let cellSelectedIndexObserver: PublishRelay + init( viewModel: HomeViewModel, storeInformationViewController: StoreInformationViewController, storeListViewController: StoreListViewController, - summaryViewHeightObserver: PublishRelay, - cellSelectedIndexObserver: PublishRelay + summaryViewHeightObserver: PublishRelay ) { self.viewModel = viewModel self.storeInformationViewController = storeInformationViewController self.storeListViewController = storeListViewController self.summaryViewHeightObserver = summaryViewHeightObserver - self.cellSelectedIndexObserver = cellSelectedIndexObserver - super.init(nibName: nil, bundle: nil) } @@ -242,7 +239,6 @@ private extension HomeViewController { bindLocationAuthorization() bindStoreInformationView() bindErrorAlert() - bindStoreListCell() } func bindFetchStores() { @@ -413,13 +409,6 @@ private extension HomeViewController { .disposed(by: disposeBag) } - func bindStoreListCell() { - cellSelectedIndexObserver.bind { index in - <#code#> - } - .disposed(by: disposeBag) - } - } private extension HomeViewController { diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index f2a9765a..8e0b1158 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -7,12 +7,9 @@ import UIKit import RxSwift -import RxRelay final class StoreListViewController: UIViewController { - private let cellSelectedIndexObserver: PublishRelay - private let disposeBag = DisposeBag() private let titleBar: UINavigationBar = { @@ -58,9 +55,8 @@ final class StoreListViewController: UIViewController { private let viewModel: StoreListViewModel - init(viewModel: StoreListViewModel, cellSelectedIndexObserver: PublishRelay) { + init(viewModel: StoreListViewModel) { self.viewModel = viewModel - self.cellSelectedIndexObserver = cellSelectedIndexObserver super.init(nibName: nil, bundle: nil) } @@ -88,7 +84,6 @@ private extension StoreListViewController { func setup() { isModalInPresentation = true - storeTableView.delegate = self } func addUIComponents() { @@ -124,11 +119,3 @@ private extension StoreListViewController { } } - -extension StoreListViewController: UITableViewDelegate { - - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - cellSelectedIndexObserver.accept(indexPath.row) - } - -} From abfd7cfa21bd7f8aee8b627c995e84259c2694e7 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Tue, 6 Feb 2024 22:30:05 +0900 Subject: [PATCH 146/231] =?UTF-8?q?feat=20:=20=ED=95=84=EC=9A=94=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=80=20UseCase=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20(#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 8 -------- .../UseCase/FetchStoreByIndexUseCase.swift | 18 ------------------ .../UseCase/FetchStoreByIndexUseCaseImpl.swift | 18 ------------------ 3 files changed, 44 deletions(-) delete mode 100644 KCS/KCS/Domain/Interface/UseCase/FetchStoreByIndexUseCase.swift delete mode 100644 KCS/KCS/Domain/UseCase/FetchStoreByIndexUseCaseImpl.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 4e9a0b49..df3e029a 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -45,8 +45,6 @@ 59B886602B6E7CF6005750EF /* UIViewController+ErrorAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */; }; 59B886622B6E8484005750EF /* UISheetPresentationController+Detent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */; }; 59B886642B6EC816005750EF /* SummaryViewHeightCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886632B6EC816005750EF /* SummaryViewHeightCase.swift */; }; - 59B886662B70A996005750EF /* FetchStoreByIndexUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886652B70A996005750EF /* FetchStoreByIndexUseCase.swift */; }; - 59B886682B70AA58005750EF /* FetchStoreByIndexUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886672B70AA58005750EF /* FetchStoreByIndexUseCaseImpl.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; @@ -163,8 +161,6 @@ 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+ErrorAlert.swift"; sourceTree = ""; }; 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISheetPresentationController+Detent.swift"; sourceTree = ""; }; 59B886632B6EC816005750EF /* SummaryViewHeightCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewHeightCase.swift; sourceTree = ""; }; - 59B886652B70A996005750EF /* FetchStoreByIndexUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStoreByIndexUseCase.swift; sourceTree = ""; }; - 59B886672B70AA58005750EF /* FetchStoreByIndexUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStoreByIndexUseCaseImpl.swift; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; @@ -294,7 +290,6 @@ A8ACB7F02B5AEBE300540BD1 /* GetStoreInformationUseCase.swift */, A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */, 59F478B42B59BE0B002FEF9E /* FetchImageUseCase.swift */, - 59B886652B70A996005750EF /* FetchStoreByIndexUseCase.swift */, ); path = UseCase; sourceTree = ""; @@ -308,7 +303,6 @@ A8ACB7EE2B5AEBB800540BD1 /* GetStoreInformationUseCaseImpl.swift */, A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */, 59F478B22B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift */, - 59B886672B70AA58005750EF /* FetchStoreByIndexUseCaseImpl.swift */, ); path = UseCase; sourceTree = ""; @@ -964,7 +958,6 @@ 5977BE662B553BA800725C90 /* HomeViewModelImpl.swift in Sources */, 59B886292B6A3F1E005750EF /* StoreTableViewCell.swift in Sources */, 592262242B61203000CA5A11 /* DetailView.swift in Sources */, - 59B886662B70A996005750EF /* FetchStoreByIndexUseCase.swift in Sources */, A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, @@ -974,7 +967,6 @@ 59C306C72B501B1E00862625 /* JSONContentsError.swift in Sources */, 59C306CB2B50357900862625 /* Router.swift in Sources */, A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, - 59B886682B70AA58005750EF /* FetchStoreByIndexUseCaseImpl.swift in Sources */, 59C306B62B50027300862625 /* Store.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, 59B8865A2B6E3B40005750EF /* StoreInformationViewController.swift in Sources */, diff --git a/KCS/KCS/Domain/Interface/UseCase/FetchStoreByIndexUseCase.swift b/KCS/KCS/Domain/Interface/UseCase/FetchStoreByIndexUseCase.swift deleted file mode 100644 index dc300a17..00000000 --- a/KCS/KCS/Domain/Interface/UseCase/FetchStoreByIndexUseCase.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// FetchStoreByIndexUseCase.swift -// KCS -// -// Created by ์กฐ์„ฑ๋ฏผ on 2/5/24. -// - -import Foundation - -protocol FetchStoreByIndexUseCase { - - var repository: StoreRepository { get } - - init(repository: StoreRepository) - - func execute(index: Int) throws -> Store - -} diff --git a/KCS/KCS/Domain/UseCase/FetchStoreByIndexUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/FetchStoreByIndexUseCaseImpl.swift deleted file mode 100644 index e97a5fb9..00000000 --- a/KCS/KCS/Domain/UseCase/FetchStoreByIndexUseCaseImpl.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// FetchStoreByIndexUseCaseImpl.swift -// KCS -// -// Created by ์กฐ์„ฑ๋ฏผ on 2/5/24. -// - -import Foundation - -struct FetchStoreByIndexUseCaseImpl: FetchStoreByIndexUseCase { - - let repository: StoreRepository - - func execute(index: Int) throws -> Store { - return try repository.getStoreByIndex(index: index) - } - -} From cb371ad0c8b74a66753a572c6d03874d335a4250 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Tue, 6 Feb 2024 22:30:24 +0900 Subject: [PATCH 147/231] =?UTF-8?q?feat=20:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=95=A8=EC=88=98=20Repositor?= =?UTF-8?q?y=EC=97=90=EC=84=9C=20=EC=82=AD=EC=A0=9C=20(#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Repository/StoreRepositoryImpl.swift | 11 ----------- .../Domain/Interface/Repository/StoreRepository.swift | 4 ---- 2 files changed, 15 deletions(-) diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 7e4757a5..52f36707 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -77,15 +77,4 @@ final class StoreRepositoryImpl: StoreRepository { return store } - func getStoreByIndex( - index: Int - ) throws -> Store { - let flattenStores = stores.flatMap({ $0 }) - if flattenStores.indices ~= index { - return flattenStores[index] - } else { - throw StoreRepositoryError.wrongStoreIndex - } - } - } diff --git a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift index 300a8cce..73f11fde 100644 --- a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift +++ b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift @@ -19,8 +19,4 @@ protocol StoreRepository { tag: UInt ) throws -> Store - func getStoreByIndex( - index: Int - ) throws -> Store - } From 222d245129d219be2e2a9cc92da0f548cade7512 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Tue, 6 Feb 2024 22:30:48 +0900 Subject: [PATCH 148/231] =?UTF-8?q?feat=20:=20Cell=20=EC=84=A0=ED=83=9D?= =?UTF-8?q?=EC=8B=9C=20Marker=20Tapped=20=EA=B5=AC=ED=98=84=20(#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 7 +++-- .../Home/View/HomeViewController.swift | 30 +++++++++++++++++-- .../View/StoreListViewController.swift | 15 +++++++++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 1dcf8878..ee7e10d4 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -26,6 +26,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { getStoreInformationUseCase: GetStoreInformationUseCaseImpl(repository: repository) ) let summaryViewHeightObserver = PublishRelay() + let listCellSelectedObserver = PublishRelay() let storeInformationViewController = StoreInformationViewController( summaryViewHeightObserver: summaryViewHeightObserver, viewModel: StoreInformationViewModelImpl( @@ -44,9 +45,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { fetchImageUseCase: FetchImageUseCaseImpl( repository: ImageRepositoryImpl(cache: ImageCache()) ) - ) + ), + listCellSelectedObserver: listCellSelectedObserver ), - summaryViewHeightObserver: summaryViewHeightObserver + summaryViewHeightObserver: summaryViewHeightObserver, + listCellSelectedObserver: listCellSelectedObserver ) window?.makeKeyAndVisible() } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 16e2a664..c83fbc0e 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -185,17 +185,21 @@ final class HomeViewController: UIViewController { private let storeListViewController: StoreListViewController private let viewModel: HomeViewModel private let summaryViewHeightObserver: PublishRelay + private let listCellSelectedObserver: PublishRelay init( viewModel: HomeViewModel, storeInformationViewController: StoreInformationViewController, storeListViewController: StoreListViewController, - summaryViewHeightObserver: PublishRelay + summaryViewHeightObserver: PublishRelay, + listCellSelectedObserver: PublishRelay ) { self.viewModel = viewModel self.storeInformationViewController = storeInformationViewController self.storeListViewController = storeListViewController self.summaryViewHeightObserver = summaryViewHeightObserver + self.listCellSelectedObserver = listCellSelectedObserver + super.init(nibName: nil, bundle: nil) } @@ -239,6 +243,7 @@ private extension HomeViewController { bindLocationAuthorization() bindStoreInformationView() bindErrorAlert() + bindListCellSelected() } func bindFetchStores() { @@ -269,6 +274,7 @@ private extension HomeViewController { .bind { [weak self] filteredStores in guard let self = self else { return } self.markers.forEach { $0.mapView = nil } + self.markers = [] var stores: [Store] = [] filteredStores.forEach { filteredStore in filteredStore.stores.forEach { [weak self] store in @@ -409,6 +415,25 @@ private extension HomeViewController { .disposed(by: disposeBag) } + func bindListCellSelected() { + listCellSelectedObserver + .bind { [weak self] index in + guard let self = self else { return } + if markers.indices ~= index { + let targetMarker = markers[index] + // TODO: target Marker๋ฅผ ๊ฐ€์šด๋ฐ๋กœ ์นด๋ฉ”๋ผ ์ด๋™ + viewModel.action( + input: .markerTapped(tag: targetMarker.tag) + ) + targetMarker.select() + clickedMarker = targetMarker + } else { + presentErrorAlert(error: .data) + } + } + .disposed(by: disposeBag) + } + } private extension HomeViewController { @@ -535,7 +560,8 @@ private extension HomeViewController { NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), refreshButton.widthAnchor.constraint(equalToConstant: 110), - refreshButton.heightAnchor.constraint(equalToConstant: 35) + refreshButton.heightAnchor.constraint(equalToConstant: 35), + refreshButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -400) // TODO: bottom constraints ํ•„์š” ]) diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index 8e0b1158..dc3cc900 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -7,9 +7,12 @@ import UIKit import RxSwift +import RxRelay final class StoreListViewController: UIViewController { + private let listCellSelectedObserver: PublishRelay + private let disposeBag = DisposeBag() private let titleBar: UINavigationBar = { @@ -55,8 +58,9 @@ final class StoreListViewController: UIViewController { private let viewModel: StoreListViewModel - init(viewModel: StoreListViewModel) { + init(viewModel: StoreListViewModel, listCellSelectedObserver: PublishRelay) { self.viewModel = viewModel + self.listCellSelectedObserver = listCellSelectedObserver super.init(nibName: nil, bundle: nil) } @@ -84,6 +88,7 @@ private extension StoreListViewController { func setup() { isModalInPresentation = true + storeTableView.delegate = self } func addUIComponents() { @@ -119,3 +124,11 @@ private extension StoreListViewController { } } + +extension StoreListViewController: UITableViewDelegate { + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + listCellSelectedObserver.accept(indexPath.row) + } + +} From 181f7c804917f2150112f97aabe3636c523ae5f0 Mon Sep 17 00:00:00 2001 From: k2645 Date: Tue, 6 Feb 2024 23:06:37 +0900 Subject: [PATCH 149/231] =?UTF-8?q?feat=20:=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20custom=20view=20=EC=83=9D=EC=84=B1=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 20 ++++ .../OnBoarding/FifthOnBoardingView.swift | 81 ++++++++++++++++ .../OnBoarding/FirstOnBoardingView.swift | 83 +++++++++++++++++ .../OnBoarding/FourthOnBoardingView.swift | 87 +++++++++++++++++ .../OnBoarding/SecondOnBoardingView.swift | 88 ++++++++++++++++++ .../OnBoarding/ThirdOnBoardingView.swift | 87 +++++++++++++++++ .../OnBoarding1.imageset/OnBoarding1.png | Bin 18782 -> 10313 bytes .../OnBoarding1.imageset/OnBoarding1@2x.png | Bin 37451 -> 21463 bytes .../OnBoarding1.imageset/OnBoarding1@3x.png | Bin 56473 -> 33152 bytes .../OnBoarding2.imageset/OnBoarding2.png | Bin 17576 -> 6374 bytes .../OnBoarding2.imageset/OnBoarding2@2x.png | Bin 34164 -> 12515 bytes .../OnBoarding2.imageset/OnBoarding2@3x.png | Bin 49286 -> 18974 bytes .../OnBoarding3.imageset/OnBoarding3.png | Bin 32001 -> 18437 bytes .../OnBoarding3.imageset/OnBoarding3@2x.png | Bin 63389 -> 37245 bytes .../OnBoarding3.imageset/OnBoarding3@3x.png | Bin 97146 -> 57129 bytes .../OnBoarding4.imageset/OnBoarding4.png | Bin 26345 -> 11992 bytes .../OnBoarding4.imageset/OnBoarding4@2x.png | Bin 52495 -> 24028 bytes .../OnBoarding4.imageset/OnBoarding4@3x.png | Bin 80260 -> 37074 bytes .../OnBoarding5.imageset/OnBoarding5.png | Bin 16716 -> 11352 bytes .../OnBoarding5.imageset/OnBoarding5@2x.png | Bin 33672 -> 22899 bytes .../OnBoarding5.imageset/OnBoarding5@3x.png | Bin 51460 -> 35240 bytes 21 files changed, 446 insertions(+) create mode 100644 KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift create mode 100644 KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift create mode 100644 KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift create mode 100644 KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift create mode 100644 KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 645270ee..4adea435 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -88,6 +88,11 @@ A83367B82B6FA0E700E0A844 /* FetchStores.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B72B6FA0E700E0A844 /* FetchStores.swift */; }; A83367BB2B709C0200E0A844 /* OnBoardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BA2B709C0200E0A844 /* OnBoardingViewController.swift */; }; A83367BD2B70A52900E0A844 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BC2B70A52900E0A844 /* Storage.swift */; }; + A83367BF2B7246E700E0A844 /* FirstOnBoardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BE2B7246E700E0A844 /* FirstOnBoardingView.swift */; }; + A83367C12B726E2600E0A844 /* SecondOnBoardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C02B726E2600E0A844 /* SecondOnBoardingView.swift */; }; + A83367C32B72714C00E0A844 /* ThirdOnBoardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C22B72714B00E0A844 /* ThirdOnBoardingView.swift */; }; + A83367C52B7271B900E0A844 /* FourthOnBoardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C42B7271B900E0A844 /* FourthOnBoardingView.swift */; }; + A83367C72B72725700E0A844 /* FifthOnBoardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C62B72725700E0A844 /* FifthOnBoardingView.swift */; }; A89087042B4E7F3500767225 /* FilterButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087032B4E7F3500767225 /* FilterButton.swift */; }; A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; @@ -210,6 +215,11 @@ A83367B72B6FA0E700E0A844 /* FetchStores.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStores.swift; sourceTree = ""; }; A83367BA2B709C0200E0A844 /* OnBoardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnBoardingViewController.swift; sourceTree = ""; }; A83367BC2B70A52900E0A844 /* Storage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = ""; }; + A83367BE2B7246E700E0A844 /* FirstOnBoardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstOnBoardingView.swift; sourceTree = ""; }; + A83367C02B726E2600E0A844 /* SecondOnBoardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondOnBoardingView.swift; sourceTree = ""; }; + A83367C22B72714B00E0A844 /* ThirdOnBoardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdOnBoardingView.swift; sourceTree = ""; }; + A83367C42B7271B900E0A844 /* FourthOnBoardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FourthOnBoardingView.swift; sourceTree = ""; }; + A83367C62B72725700E0A844 /* FifthOnBoardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FifthOnBoardingView.swift; sourceTree = ""; }; A89087032B4E7F3500767225 /* FilterButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterButton.swift; sourceTree = ""; }; A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; @@ -608,6 +618,11 @@ isa = PBXGroup; children = ( A83367BA2B709C0200E0A844 /* OnBoardingViewController.swift */, + A83367BE2B7246E700E0A844 /* FirstOnBoardingView.swift */, + A83367C02B726E2600E0A844 /* SecondOnBoardingView.swift */, + A83367C22B72714B00E0A844 /* ThirdOnBoardingView.swift */, + A83367C42B7271B900E0A844 /* FourthOnBoardingView.swift */, + A83367C62B72725700E0A844 /* FifthOnBoardingView.swift */, ); path = OnBoarding; sourceTree = ""; @@ -939,6 +954,7 @@ A890870F2B4F836C00767225 /* SummaryView.swift in Sources */, A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */, 59B886262B6A3A02005750EF /* StoreListViewController.swift in Sources */, + A83367C72B72725700E0A844 /* FifthOnBoardingView.swift in Sources */, 5977BE612B55374000725C90 /* HomeViewModel.swift in Sources */, 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */, A8AE4B1B2B62A60B00632355 /* OpeningHoursCellView.swift in Sources */, @@ -965,6 +981,7 @@ 59C306CD2B5035B100862625 /* StoreAPI.swift in Sources */, A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */, A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */, + A83367C52B7271B900E0A844 /* FourthOnBoardingView.swift in Sources */, 5977BE9E2B59ACE800725C90 /* ImageCache.swift in Sources */, 59B886642B6EC816005750EF /* SummaryViewHeightCase.swift in Sources */, 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */, @@ -977,15 +994,18 @@ A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, + A83367C32B72714C00E0A844 /* ThirdOnBoardingView.swift in Sources */, A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */, A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */, 59B8864A2B6A9CCB005750EF /* UIStackView+clear.swift in Sources */, 59C306C72B501B1E00862625 /* JSONContentsError.swift in Sources */, 59C306CB2B50357900862625 /* Router.swift in Sources */, A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, + A83367BF2B7246E700E0A844 /* FirstOnBoardingView.swift in Sources */, 59C306B62B50027300862625 /* Store.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, 59B8865A2B6E3B40005750EF /* StoreInformationViewController.swift in Sources */, + A83367C12B726E2600E0A844 /* SecondOnBoardingView.swift in Sources */, A8A7E0622B652F0D00D015E5 /* MarkerContents.swift in Sources */, 59B8865C2B6E4B8B005750EF /* StoreInformationViewModel.swift in Sources */, 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */, diff --git a/KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift new file mode 100644 index 00000000..8147a1e6 --- /dev/null +++ b/KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift @@ -0,0 +1,81 @@ +// +// FifthOnBoardingView.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/6/24. +// + +import UIKit + +final class FifthOnBoardingView: UIView { + + private let topLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.text = "๋‚˜์ธ๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ" + label.font = UIFont.pretendard(size: 24, weight: .bold) + label.textColor = .primary1 + label.textAlignment = .center + + return label + }() + + private let centerImageView: UIImageView = { + let imageView = UIImageView(image: UIImage.onBoarding5) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFit + + return imageView + }() + + private let bottomLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.text = "์ด์   ์ •๋ง ๋‚˜์ธ๊ฐ€์™€ ํ•จ๊ป˜ ํ•  ์‹œ๊ฐ„์ด์—์š”!" + label.font = UIFont.pretendard(size: 19, weight: .medium) + label.textColor = .black + label.textAlignment = .center + + return label + }() + + init() { + super.init(frame: .zero) + + addUIComponents() + configureConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +private extension FifthOnBoardingView { + + func addUIComponents() { + addSubview(topLabel) + addSubview(centerImageView) + addSubview(bottomLabel) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + topLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + topLabel.topAnchor.constraint(equalTo: topAnchor) + ]) + + NSLayoutConstraint.activate([ + centerImageView.centerXAnchor.constraint(equalTo: centerXAnchor), + centerImageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 83), + centerImageView.topAnchor.constraint(equalTo: topLabel.bottomAnchor, constant: 73) + ]) + + NSLayoutConstraint.activate([ + bottomLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + bottomLabel.topAnchor.constraint(equalTo: centerImageView.bottomAnchor, constant: 93) + ]) + } + +} diff --git a/KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift new file mode 100644 index 00000000..a5a950c1 --- /dev/null +++ b/KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift @@ -0,0 +1,83 @@ +// +// FirstOnBoardingView.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/6/24. +// + +import UIKit + +final class FirstOnBoardingView: UIView { + + private let topLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.text = "์ธ์ฆ์ œ ๋ณ„ ๊ฐ€๊ฒŒ ์œ„์น˜๋ฅผ\n ์ง€๋„๋กœ ํ•œ ๋ˆˆ์— ์•Œ์•„๋ด์š”!" + label.font = UIFont.pretendard(size: 24, weight: .bold) + label.textColor = .primary1 + label.textAlignment = .center + label.numberOfLines = 2 + + return label + }() + + private let centerImageView: UIImageView = { + let imageView = UIImageView(image: UIImage.onBoarding1) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFit + + return imageView + }() + + private let bottomLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.text = "์—ฌ๊ธฐ์„œ ์ž ๊น,\n ์ธ์ฆ์ œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”" + label.font = UIFont.pretendard(size: 19, weight: .medium) + label.textColor = .black + label.textAlignment = .center + label.numberOfLines = 2 + + return label + }() + + init() { + super.init(frame: .zero) + + addUIComponents() + configureConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +private extension FirstOnBoardingView { + + func addUIComponents() { + addSubview(topLabel) + addSubview(centerImageView) + addSubview(bottomLabel) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + topLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + topLabel.topAnchor.constraint(equalTo: topAnchor) + ]) + + NSLayoutConstraint.activate([ + centerImageView.centerXAnchor.constraint(equalTo: centerXAnchor), + centerImageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 83), + centerImageView.topAnchor.constraint(equalTo: topLabel.bottomAnchor, constant: 79) + ]) + + NSLayoutConstraint.activate([ + bottomLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + bottomLabel.topAnchor.constraint(equalTo: centerImageView.bottomAnchor, constant: 52) + ]) + } + +} diff --git a/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift new file mode 100644 index 00000000..6f621528 --- /dev/null +++ b/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift @@ -0,0 +1,87 @@ +// +// FourthOnBoardingView.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/6/24. +// + +import UIKit + +final class FourthOnBoardingView: UIView { + + private let topLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.text = "์•ˆ์‹ฌ์‹๋‹น์ด๋ž€?" + label.font = UIFont.pretendard(size: 24, weight: .bold) + label.textColor = .primary1 + label.textAlignment = .center + + return label + }() + + private let centerImageView: UIImageView = { + let imageView = UIImageView(image: UIImage.onBoarding4) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFit + + return imageView + }() + + private let bottomLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + + let text = "๊ฐ์—ผ๋ณ‘์— ์ทจ์•ฝํ•œ ์‹์‚ฌ๋ฌธํ™” ๊ฐœ์„ ์„ ์œ„ํ•ด\n๋œ์–ด๋จน๊ธฐ, ์œ„์ƒ์  ์ˆ˜์ €๊ด€๋ฆฌ, ์ข…์‚ฌ์ž ๋งˆ์Šคํฌ\n์ฐฉ์šฉ ๋ฐ ์ƒํ™œ ๋ฐฉ์—ญ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ณณ์œผ๋กœ\n์†Œ์žฌ์ง€ ์ง€์ž์ฒด์˜ ์ธ์ฆ์„\n๋ฐ›์€ ์Œ์‹์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค." + let attributeString = NSMutableAttributedString(string: text) + attributeString.addAttribute(.foregroundColor, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "๋œ์–ด๋จน๊ธฐ, ์œ„์ƒ์  ์ˆ˜์ €๊ด€๋ฆฌ, ์ข…์‚ฌ์ž ๋งˆ์Šคํฌ\n์ฐฉ์šฉ ๋ฐ ์ƒํ™œ ๋ฐฉ์—ญ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ณณ")) + + label.attributedText = attributeString + label.font = UIFont.pretendard(size: 19, weight: .medium) + label.textColor = .black + label.textAlignment = .center + label.numberOfLines = 5 + + return label + }() + + init() { + super.init(frame: .zero) + + addUIComponents() + configureConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +private extension FourthOnBoardingView { + + func addUIComponents() { + addSubview(topLabel) + addSubview(centerImageView) + addSubview(bottomLabel) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + topLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + topLabel.topAnchor.constraint(equalTo: topAnchor) + ]) + + NSLayoutConstraint.activate([ + centerImageView.centerXAnchor.constraint(equalTo: centerXAnchor), + centerImageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 83), + centerImageView.topAnchor.constraint(equalTo: topLabel.bottomAnchor, constant: 60) + ]) + + NSLayoutConstraint.activate([ + bottomLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + bottomLabel.topAnchor.constraint(equalTo: centerImageView.bottomAnchor, constant: 89) + ]) + } + +} diff --git a/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift new file mode 100644 index 00000000..bcab7551 --- /dev/null +++ b/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift @@ -0,0 +1,88 @@ +// +// SecondOnBoardingView.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/6/24. +// + +import UIKit + +final class SecondOnBoardingView: UIView { + + private let topLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.text = "์ฐฉํ•œ ๊ฐ€๊ฒฉ ์—…์†Œ๋ž€?" + label.font = UIFont.pretendard(size: 24, weight: .bold) + label.textColor = .primary1 + label.textAlignment = .center + + return label + }() + + private let centerImageView: UIImageView = { + let imageView = UIImageView(image: UIImage.onBoarding2) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFit + + return imageView + }() + + private let bottomLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + + let text = "2011๋…„๋ถ€ํ„ฐ ๋ฌผ๊ฐ€์•ˆ์ •์„ ์œ„ํ•ด\n๊ฐ€๊ฒฉ์ด ์ €๋ ดํ•˜์ง€๋งŒ ์–‘์งˆ์˜ ์„œ๋น„์Šค๋ฅผ\n์ œ๊ณตํ•˜๋Š” ๊ณณ์„ ์ •๋ถ€๊ฐ€ ์ง€์ •ํ•œ\n์šฐ๋ฆฌ ๋™๋„ค์˜ ์ข‹์€ ์—…์†Œ์ž…๋‹ˆ๋‹ค." + let attributeString = NSMutableAttributedString(string: text) + attributeString.addAttribute(.foregroundColor, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "๊ฐ€๊ฒฉ์ด ์ €๋ ด")) + attributeString.addAttribute(.foregroundColor, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "์–‘์งˆ์˜ ์„œ๋น„์Šค")) + + label.attributedText = attributeString + label.font = UIFont.pretendard(size: 19, weight: .medium) + label.textColor = .black + label.textAlignment = .center + label.numberOfLines = 4 + + return label + }() + + init() { + super.init(frame: .zero) + + addUIComponents() + configureConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +private extension SecondOnBoardingView { + + func addUIComponents() { + addSubview(topLabel) + addSubview(centerImageView) + addSubview(bottomLabel) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + topLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + topLabel.topAnchor.constraint(equalTo: topAnchor) + ]) + + NSLayoutConstraint.activate([ + centerImageView.centerXAnchor.constraint(equalTo: centerXAnchor), + centerImageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 83), + centerImageView.topAnchor.constraint(equalTo: topLabel.bottomAnchor, constant: 60) + ]) + + NSLayoutConstraint.activate([ + bottomLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + bottomLabel.topAnchor.constraint(equalTo: centerImageView.bottomAnchor, constant: 89) + ]) + } + +} diff --git a/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift new file mode 100644 index 00000000..4f5aaf8f --- /dev/null +++ b/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift @@ -0,0 +1,87 @@ +// +// ThirdOnBoardingView.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/6/24. +// + +import UIKit + +final class ThirdOnBoardingView: UIView { + + private let topLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.text = "๋ชจ๋ฒ” ์Œ์‹์ ์ด๋ž€?" + label.font = UIFont.pretendard(size: 24, weight: .bold) + label.textColor = .primary1 + label.textAlignment = .center + + return label + }() + + private let centerImageView: UIImageView = { + let imageView = UIImageView(image: UIImage.onBoarding3) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFit + + return imageView + }() + + private let bottomLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + + let text = "์‹ํ’ˆ์œ„์ƒ๋ฒ•์— ๊ทผ๊ฑฐํ•˜์—ฌ\n์œ„์ƒ๊ด€๋ฆฌ ์ƒํƒœ ๋“ฑ์ด ์šฐ์ˆ˜ํ•œ ์—…์†Œ๋ฅผ\n๋ชจ๋ฒ”์—…์†Œ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.\n์„œ๋น„์Šค ์ˆ˜์ค€ ํ–ฅ์ƒ๊ณผ ์œ„์ƒ์  ๊ฐœ์„ ์„ ๋„๋ชจํ•˜๊ธฐ\n์œ„ํ•ด ์šด์˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค." + let attributeString = NSMutableAttributedString(string: text) + attributeString.addAttribute(.foregroundColor, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "์œ„์ƒ๊ด€๋ฆฌ ์ƒํƒœ ๋“ฑ์ด ์šฐ์ˆ˜ํ•œ ์—…์†Œ")) + + label.attributedText = attributeString + label.font = UIFont.pretendard(size: 19, weight: .medium) + label.textColor = .black + label.textAlignment = .center + label.numberOfLines = 5 + + return label + }() + + init() { + super.init(frame: .zero) + + addUIComponents() + configureConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +private extension ThirdOnBoardingView { + + func addUIComponents() { + addSubview(topLabel) + addSubview(centerImageView) + addSubview(bottomLabel) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + topLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + topLabel.topAnchor.constraint(equalTo: topAnchor) + ]) + + NSLayoutConstraint.activate([ + centerImageView.centerXAnchor.constraint(equalTo: centerXAnchor), + centerImageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 83), + centerImageView.topAnchor.constraint(equalTo: topLabel.bottomAnchor, constant: 60) + ]) + + NSLayoutConstraint.activate([ + bottomLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + bottomLabel.topAnchor.constraint(equalTo: centerImageView.bottomAnchor, constant: 67) + ]) + } + +} diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1.png index a659b06ce8a7414d36456e8cf0c0a29a7a0e4a7b..2f6aa77ac9e66c1fee10b94e628cc92eb750a72c 100644 GIT binary patch literal 10313 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 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@2x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@2x.png index d404ada09c6d2deb6bb5bbfc6a8e2e67ea8a41e8..c22455063d38e75e163ad8034343b3ba2b631555 100644 GIT binary patch literal 21463 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 literal 37451 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�=P_EH~P(2YzA@@m05$KSLq=7&@Z( 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 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@3x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@3x.png index 584d37a6bc316ddf95534f116a096759771cb8ee..1896807ed0f2d1508092ca3b5b45fd3ef4395a11 100644 GIT binary patch literal 33152 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 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2.png index 1976b55652477839fa1efd6e87c2f51b3314bd9a..9ed6076d622ec99191335c6b80e11ebe3c5ca37c 100644 GIT binary patch literal 6374 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 literal 17576 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

E-yg^9hwt@>!)4aPgSQo0HmP^SGr$_pc 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 SL;X_$02F1_-c?DPhy4%OG~rqR literal 34164 zcmeFYXH-*9)INF=0)*asFA6{D9Yi32GywsXCM|T7t~9BEP^6$FRmo(R zwuAr>MWS<8^-%z1`^u(t*(qbqAJ411@#IIj?icYI%|=O?Jb++?QznOR&d2x&$P;ZU zUcIM<(5Y#b`@Z#nAjn?uAsTxw%D3w#toc5|le|`%r9*Vgx(HGbe8bqr0sij4(HS33 zNSQZPrRD>Xq8U`P(SKhh>`g!aeP-6ronQbDF^>nc>{|1 zfBR#Xp_y4G)C$b$XG_lhlhyWa*3i7}RqNjCh&;{Q1)UcRPg(VmQ^&y~FXjfJ?01+4Hx)HY4l1U5P#I zV+HHGdLeYgigM4h-k0-{&dC<9r zMx@C!wZkdxoQu}Bt1jZt?&r5xXc@aoHTFH&r+O}>85i+!jg{irR_nmCns{HU*s<** z6gd=zF<$dwXMlxgNaA9iVb3sAx6Nz=E&np?U#_7`0&5pK>U2_PHWF4dMSk~~KD?>0 zEj>kFAOH6a{z}B&M>K=e+##V5?+t@=adMBetpE7Clk}o|YZkz<286U0 zcFqn^iaIwAwy=c^1SwjxX*!Dz7P+o5Z4N$sIPmAS^7GTJu^Ve*R=<|FG;4qU`tMEY z!rH70OL$wuS=x}8cRtQEEzx#7EUce#(wl#P`DcE+r$VL#D+x4Gy^6qLRw~J=LUA0! zg6({ry<57spFc3DS2;VGx3In-EJ^HK)8YQP)`f*B!r+O{9GyCqJ3Zk^8Olv4VVo`s?fvXl2E75kh#fa8u1daf^dF^X&JKol>=viO*dW zw4kXiVdfvdq3FGEOJ}P1aM#%C17SivyMV(jCOyV&jlY=|9~I=r;o{2qSw+PMSiKik zvD4Me)1UmjDkWn>m#+CwA6y@7c}?$X({Qs7d>I~iQ&GRK9gLW@=9cl+bdCDmnf7ov zm7t(yJ7lwg+uT=h(Xhmy(j#Z0MAEjPpy!uCg&Xw&nZM$)WL+1LMrRnZmW2-r*GAB$d`Tc6naB9n= z9Pz&%#mZ9G^G}Jl#hlXngy%mjM3zY`z0WdJeoBlr$nUvNJns0PN@DQf`(5U1&Tz|v zoXYz9Z#~j?bsE)8gKpQ(s!qOoILc!+QFs3)F1BZ_hDkCxOH>lJuk*@u?_U2fHMh@8 z0BaSBUDAqQZ;54`Nu9Yx?z!o@Xte7Vu!5XSHzzDw`qV!xd|S6+?BW;lBW{v>;3mbG z$nIt+c3vS>gsNt_`ck~6cKN%_`onY z713qBeG>7cEUh=~^N(hv-uPtf1)($6`P@vjfx6{^eBo=3lIPMbVzKBpv zY{)*Vou3@{Cn9#QA@dIrI$_aeNq2p(96J^k3Sshi@%BsIw~O`dh!c3a^X6nuceSD4 zs*O9>`j@<2X3|zw)O;SX;z*2ECZ~(Z?Av1oVd94O#hy2Bf4{;fvp2-?43xK6480Xj zDE9w+Tbj&pfH+r{>|y&OUvo?5?BzRj9`2RXhcDl6W`7Zs7ava>Tp_GW(^nk!)VSD5 zdAQR!CSjfb?10j z;TFSys+>=ch2|`+EJ8RdkV&H&1p~xsJl{84y{ikW<4V}nWCVUSvTiQts{eOU(=m6u zr~?rL+O^%2;7onpLC+@_yM)CY{BIQGyR3di%&ZOMK?Q@5$z(qo;y+n=+DT35q?w9- z-HN_soRs}*W9%Hy<8UzWs$+Q8bV+LBL%btH{4__fT*iro1!a>}m1;JpaJSk7`(7`R z-?_DytG7haC!F()#?E5eF0&@YaCW|-DL|#6e4A^$dL@{ck2gs)_+u>} z_=8(lJh~Bu?{drg%n#W;7J3wInVK5}gU2`#UlGUGVDp|5D(=k;d1?_ZUTLsS^uHG{ z<8;W_ePAX%@x77Och@_&@+{yj<3w79^732S_=j0F1FY9ws(oE9iVCdy>j9W<~U$pWPvnW{=Tx+~n<9j)Sits|LzTu#OM!RyQ=D)yPkVLohOX7 z_45)EH%;YhiHg_ILGcny#YwpKt0syI-DK;>$Cne5mdWc;Uw^2kF&xe%MnrnLyHC8^ zd;3wx!t1KAZNyBGX_{;4R$G3Ttc%GT`kv2M&7hsz*G!%7%S zd=^_2amD#0I?wgVrxK&rb!;oC4QUE}Tzzr_citAIACHbk1q-L{%?cLa%eu~Iud=?s z<>b2izE+kj&Z{cy=U1iCOuXI-`t9j+6_%^I5mJ^n<^}VZ;wNqCEKE75} z4E)t7OO>G&Uv4e?*ZjCtW`KP{b?@1ZB$s^XLdNLYyM`eItzo}R9+{>HMO;D9oeb6H@U|#V6yMU^E7+PX=P2T69UyPB&8jWsmxxJ#1@4I7SC71q1l=Ah>_|laE7nMmBg1A;{ZuSm79CiVl z7v&c^cVtzxXywc|7TBcIMXc{BA-oaQHF|7PHn{7lpFi+Xg)gA8fNlDd6V_1UPR5L- zhI6$e6y2tM68PkI5RT>0ULl!@m`!6-`OokLvj6yl+@f>!k6M2DbC25V$2sD-1BIT5 z&TRpGo2=XY(Q%<>0SR!XZHiu2`EX!?da*l5mh-F_GV@d~{I5NX-r`$C^mxfnPj6t_`TS8ri5UH<@Nl@RRFJHKsY6o2l9E)O4?XbU_V8iv~+H zm)vgDouf3Z_F$Hg>7uNVl<%&*+GKXt*1e?0Sf=4X>Iw)t>h`P$XDju@iT! z{_;NTTGSOyRuBHZ+j6UV1f9^^pg-xFG(QigHq^hs>NL@Nnp{srtqRLG@XDhBEQ348 zWjot;%G`!3YKVa?h_}ryyS~BGx7L@qNbQ4la%job6lzAy_voA19c#6mRSucjnfKB2 z*fDGM^n75E^&(FZPAx9#w^v1`H#xaDPRx7>UokUro~s#`7lNj5wSB8sGCTLBs-kWS@SWSg}XEwL4>%QfxRe-g01ao2s$9a|pNRx<1x($EJ$0xBXf0 zGDf-P2+zH?5$O9k)E`UqE0EvWkjIs~$BgFxmX81b_5Yu0fYO#1xLP6ny?9OV;`YPf zpz4MzGoMYt_pWExf`OOoAI7u#XXc#pf&!WKOD=3TCcVxkzQkWUJG15bM;N|s6EFop83tW ziQ##HHKK5wLX^1#GDy z#HCA63pl|ML^PyV0|hvgO;O+B(if=ZVs2^JU%Kmwi-wqi0D#_1Kle)yC4=3FSBfJd z)np(9)BU5EGBiIPXFV_EVF`CI_gfG#&)1p~MLPWR1WZsHsv|cap_~nXAqwZC%P3AQ zjD&&T1efTA%SeABg%5zcpmsr_~CeCa<_M)9ecJ1rPl@s*(3co7H{bB2!bYND8m zmu`?5S<{(H@0&SVaOxp3M&`?#q@=x!IbmwAj1kGy+&Nq>7AV{I63_T7wNOBPCRN1x zt_BS=@?D2ZljaeDC8(Se!$j0RiDNj_>c#>!6xM*o0B{XOLU~Z@FxHySyp`!w7+ijQsp`rL*H0ZoE*9lUqa^*=SPIv+A?tJ{e)72bN%VJ1M%GznYgMWcfE-*<7)umkE^vXI7JZX|~} z0rE%h&3QHl>PkB$`d(JRUQ-q_$BhO81%Y0v1R_WWbC)q`eU}V9@J5TE`&I6%#R)U@Z^ZG@ zFSCH0mIlaD7;TC#JBcLRUiB>$wQ9H`4u!$(5&xczR>Zv?Ns!N;M9>w}1GSj@cXou6 zB$)Y|6e!x?w@*x#EK0JFmXV1>}6VP4`L(gSGlCRZerk>&^{~m?;(h5Nl#2FZFnMMB2r|2-8I3;pE-_-~r z0AhUU^|=gELAd{L<4$`lHi>MhgpAF{bqpZ{Rx!)uP`+elCY4KKUnTQyKarr!47 z{PQh(prHM37_}mnxwJN?fOW1w`9tzn=JVBHFFh|HCuWh3O%baqmZG{&M@D%Q zN9kARa)TTQad4-}8eyt=h<)NfeZF{E5RaQvgb@RQ14*|2X+6^N2_8uyNPBh{Z+$|5 zIgaisJGuSWb>O)!RtE+zw@)Ad)Mao6%tBZz7+f^IqFbH;AZH-Br4SEbjlpiZBe?%H z6y=o%#ARV513U;X3M>Rw#jEW_3W?B#QvwMbsu5CPzOU*901^=}0c!3B)I0!;(eSgg zgW)e|CkW+;NHi}({!>8YT_RN|ikFdJd~p$6V(jZZN%HkNdeod7 zGM0EIj9IqrZUCrTSqryPW*43&S=G4aPT%+d0gPv@vyiz2Ft}Cq{CsF_`19{hKw)Q6 z=B{W`feVK*xs^@?dOZyQF5pLnSr6sOqQ=1d2}_oghJ_SK0508sB()m^Y9nq%i{2U1 z|0i5(Qa)Y9rkd;e>VzyCT<1It4h+@W6FqoJ1yTFJe1is<>O$Nr%cW4W5QVi3tPj9} z%y;VwA<7@f5_u3V1WJrRj_b)`VOFlQ`g1sS2IGlYr4g+X1ZbicMZ*GRrBT-8`td=+ z0Z_o_=ZGg`4^kSX8K<8I&N%zn-FEfCXeYz2p*OpP0=TJQQvlVeI6`(lx|L?g22rCc zHCiN?U0@{x=E+$_c47fr8|iy6z!c}=O(p$cW<12anZN)5#sm88rJv@!T2vN=Roo5x z0tFg2E)r_ZsEo;dyU;wd3;@QrR;w`lR`hL?bWb9nK}^|cx{9rUhWnRlGXb#9HpTbo zE`z%98k+mOU)u^8(n?4+WQC|PSVocn=Sj!#8%AA*T_CUu080L~chc;Mn-tO<$Iagf zQUf`=cbb%UG#S)ce4fBiJb{`vKki3aK9YE&nyv{j^A@w#<;2;hH#}Xq3!rk($~hIY z)=NejD?wS@3m*e0iJW2{Vq@}Y!><5fk1$rJEM|`TpJ&zodH(zFdFh}q%K<20C}#fO zVkdCVwa~6NuHq{-95hPuoHuF=>a62nZ&l6prB55ayvmQ`N$i&=z)W!bk$WV=ED4YO zpM#NRD1gjcJ3MnMr{P1V1Qc#U0nEo&8ac1>Y<~~{n5O)yB$Hb}uw{(wSGEV$taLw&m0xWDn; zAUs7M4TeiN>9gzG0CReF=mpr$BsZtV7o&W>nYr}nBus>!%iva-T z_oh36*jIrb@(`#M8wBu>AND*C>$v@i9GVEug2%hVu=!86(hoj)^8y&9!F4b$3Vh1U z0%H|`0+v#^*g!WyV{-6x&`W2qVsPjhSlGw#N`tGWVWn`8Pv}?$fm{Y{vn23NwOu>g zf5Y-Lzl{l?Cqvi>F?6yE1gt4Ev>qUkV!Iktz0YG!m zH2F{pv2I&T1c*OVVwd5)4=`l2R(k zS|3N~{7x&u^57@T*!k zgApYVLhJl(?U`8^G*XA&{pb!F@Ncls@@}v2)R~M|8yWv?5%eRPs?L>Bn#c1DKoL6kHA(vuz?x0!)UDWC zd#=Ue`(>JY%m1s~^(E{W#0M@_<@ew{?B^6b&y3A6&n|y0Jq3HYAHe(gTHmVg;xKj4 zXSXD*{rDYW`tPXrFE^J(xG<_5Vtp-Meg>4@a)FqEe=f?fFA>~fgg?0dtK*17Ow#Z3-|LZdN1%a06k%N~QB8M34yOe$7 z`}}Y1xI-j>!W9N3k~P1Z;qFpmxxWIOKw+C$40S&sPO5LcWJmq4r5#_F01Ut|XEr|U znzuv!lT{+4VPq873WUqT0o4Ap&rE0wck0rho)CpUV;5nc&$PmFn?9S~_t`I)GyUMv zvj4mlznWc~6l8-37ZT+_)9pY~=UmDkWdL?TH0h-6{3O08siZ=AF3<}p+J4EGiJxx& zW#M`4+Sna*xhquINV&>&r5Kfcb+mY$s&cxfxYn+G)&6I>=ep6-VLWq=!DY&yP~7fh zwwJeofm_cEtYHHZ5ixJJPr(yeIAova?3F%CFaIgJ@0 zBJQq>nLN3EOZn&TAU?;Wk}VWJo}s`ToRsN!ofWj-Zo*{!;*9F!?{=cjSLI0_gm41a zFr?zcbgb&)tlV{c7i8%$wf)z`Obfo+a@Fee!szoFRo+HUps}icz{<)-$Uq`t<|JSX zn%HAKtIGM^e`Z-Z5YbwGA0ELpJs7DrHj0ZSk8n+-CzkqFZT#QNJN%q4e5~RWY&fX# zI83h;sDe)Tno?0qL)RGu0wo({4TrhA5%QrMT*42oV&1?=(sY=0GmpENE+i)6u4GMS z7az+|H$7Ln{i2XgaH?&_*cVEnevkeZlYnI zDiS0i^DeWp4t~HyLfzdLarXntl1}b^npHn{z=nj--BSEq0f!0+ZPpoXbgEVSJja8e zSJ*%QF#BxZSl_1kt%a9`EKk6ZzE#k+(sq9+85u3W9V0;8K*ufbL$OtCNl8g- z!aUo8m!cSLiz*|8IhNQ7qg;5kD@!II2vIiSKN!nCP{Lf#K=Q+!qn0C^wzDa5bYutt zti+^n_Oy#H{g}7=uXXfSQBn%6M>GDS+02$Nau_xcga&++sfPsIh(tf zA3T0~AztTEh{)PIXpc?Os(&;}$ArgMiqTymy@%O1P%|Xdf%0*AnTaP=oC+*0PXtvX z{1oozLB?xUo%Bs^`^C2GH{N0J8VrP(r?Qn_&YRSG~SEnz^3on*RQUv)``stmMW< zP&0|`{3@_{enWR2$*k6lVPT2<{p4a%*92+d8t7`Aosco+bQ7x?ytQ~Q)x8OHKSRow zTw|_UmHvYyP&z<^omqY;6TpVMJV_Ttqdhq<+zzTfPs;F}&j^Ig`P#E&+@8B$?iqC9 zB7Y4-#`pLj9jNbB*KCPKpj!gB>(G&(N}O!aFbkE7@(-q=$HZ?}>xrT-k_u1v;T3fx zIVzT<)E`?7Qxmy{R=d*c2#HBt)4d$e=ZZua`6tA2A@1hwo@iB9ug3+&U93er)3Tp_ z7V`m0YX~u-@$#a5iAcfNZS_(HB8L#(HAB8U(@QQgge#BF~*!l_4(`S1wC=TE~qg z{ae>0_!%8}b2bs0#E*G`PSn}EN1&wZW=YWOcDU(@x2*r&exN_vm3MEUYtH7-`iWgo zp>pjryGu%yJ}v*&^Ht|`dJjo?ZObft*vYx2?5}6p zQp8Wj$~#wfz2hSw2n85Cq}l-NwUS}ky%JirvsRs;`8tXjdXZ=ywzT%l_=CMUnEb)1 zZ&i0pu!@>AVqP)KxHEOc@6%i3J#Wbrx-~U*GWh*5D|zZg(Mk*)l0ek-P3F@T9_q8= zeRKP|GNW19`Adtj1)&!vtv;O#KZpPa8t$!yXFi$@WhJ=`hJGe1%jdiP&ky0Er((?p{rZ7xHSj@2bI8h!V{_VB27yw2z7c>t09O4TK$V8=># zuKDymB{m|Gn>1~;{n9^P&%k05wy9JF?^`bea@Ih|?-rx5IS&|-Bs1k3$TA2{NLDCJ zwbB9`UQY^Fg36OWzqGBa2`Ztj{x9GUmze01rE|dQGStYg=n0enplJR=@LT{PZ&3=8 zv3zb7MO0Z+GV-&l95rP9+Z80qw35qCf*Vd&+HGo=PEY6Xj)&J$5m3M#^h}n>Nuc?D zgg(gkgSpu{{}^XwHT*u%00FKR9<#yZzYP?BvCxdW>%Ud+^<>=z5cweZE4*=x2!cpr zi+5GHEJCSQ6E*6?iuK9EIYaSsi4OALJs9)jAb??E&VVxNMMFXlA1H zEBuwJ*E`?l1J3Ip*4GxhbKZ-j@nAOR@@c(tzH4s0D;-}I&40PozB79Y!BgRLJ*>mb z^#lK2j8<67`T16yr}qS|KMMV6dYxP4E_b=*33HQC2sW850J9bPh0^j0SZuJUB@Y8L zS$d#EBovU}{M#RvV``0m6}{Sea;=yC3F+cXe~J8w6saF zm6`n|2yJ+EC_p3M62n0Lqp-YqK#uMbHvj+!>k9@Mvn15`r;OlGv=@?_^P&VvnvGZ4xXbd z9SGipIwiU3YE&C|-LXDpLa?O1(axg)m3aWMOgk_yEY1tU;b6VN#6bQR`f&+h%u0}Hxa3KtN`JD zV7%%5&PBARfsI>!%!~j)jmev>HvYebVC4_}5@4XdpVAKle)uqoHDI#)nc>(15 zN8wFN4q~3}mvI35-(~~-!(_Zs@WsJkflaW_O{Ayuj*Ox7zf4CmP2E z(1lz~ZzhKwpWUr!_4`~u2V&WroDaGTXKj9}iC&S<8-|{uV?*(H1^q7{u;DK*BYdvD z#+F<8w$?FHk})}EqG#rc2MD*HR5WB`Z$_w+QwFZZbF#g}y6b!PVcC6J=Y8na{R*zdjc% zjnfrd9XuE{9X7DJJ(3*ySN#0iaPAtb9)h1dzvDn-h^`U9?hyZ*v7x+l>jVOHi{{HG zreBrHn%?I+Ii3JXy3oEla<@rweljDkR2%+O%P+aQ~Vx4 zcoTe62?;xazl?E6WN1_-kd^=4DuJs2u*EFDk{QTyIR4O3$2YMwbwr@U&Ur`4&6a{s zy6;|#+9~5=pyIcaZ3^X}i@B}ZD3q^fk-#|<_nn*!2y^Nu$fB6ahAA>7VBLlq&0EuN3ZhRIi@W@SMo8nwLNyFFP3~$1-gDqjjJW+I|v!z4agX zjzo!dzyqb>aqi~trW1)!yV&2!r(ib_1NIk7+d zR*NTsdwWJV0_5Gg1YA;>rYDlsi*WtC>S6&jU%^ph9MIS6#z2_Ui;=A%3g(IfsflzVr|9-f=LX@( z$t|Li>BgHttCKrb_anJ$$x(89$%h6k!&+RKA|BJ%LKWr2WFgH1SY5HilE;p3+IIXIPQ{^-ryFL^ zA?umdXyO}K)!$2u!V}`%VW-d7g%86CiLZV5mE<&wzSwhpq9};NwvmjIBL*L_T+DC# z`wbpoiA#`JeAr(2$7B0IDRNVT9%XH|`=~t;oEgpf`)cr|5+>S_k~LDcb8}y`BQ1V! zCFUGYwTN8EPhMs(v0gYQM>{Y%WfZMN({X>Z=S|T7VaAv_F}XS7-3nsjvCV~K>$)C+ z^A)YNJkYJ-1430@u~CF%VV9pj7*na7y%N9koC4zog&n-~fFs1rcx>td7cy1M#b!o| z&U(bmWO+#GLnUy7b1L;_9@dqWu3o(ThU|IwBD&)UejRkj#@Z6X6H4KSnv>`L{lMj! zK*`0vcI4TC^3j`rZua+!ppePq3@g*PT3O0Jw_?ki42R9Uy_`ZkKfYr&K_QvVX}q!$ zLk#^~R^;Z)207obe3rMkQMD?rN7bk%8D@_!|731wy!NHLp1g^Te@7S$y|8 zxaJBg>Ur6}cq{hKBvFbnk>^urdN^l-mpKtd#~w6t0?8|nd>MLN1M2Xu^I_4Wu=f$u z(e?vvPNsFd(^1dHgC^FVHnn!xCzD*s6_Ou|6TmjD)zY;vItEHIxLsvqkKbE4T8^wT zZLj{6RhCo^ZmKo9?tKpP4rwKGq!YEw$;e$J!hMx+FJytKgRiL?mph!|#Ky^NgnIoG zT~k7Smfwo?|81Q;2Yu%ru6;YFaynb?m&t->`$i8uMNqoo*t3&@y0o7U9FhV!q+Sy- z{@0q3Dj`pNiLSp3oK^hy@W#I1XR?)Y;O4Z8q-UkTMX<5h&9^&6;lD|aj`pV7l=5<` zMU$DJ{k)b8fPk4j796P=7BAqLZ9!klbu~k5iiq&>X`rAH~9UV)8}yIoJR21#ir;o%QFT7P&f&dqKV8w z(g3z`43TOz($>N^oRBQrVW7j`SZtZ$M_t0<5&N()%Or|-_rhWAzk@`pb|;u0b1z2Q zyz?hFb2S_#B|Mw$U+2zbcK)}dp>lR?RBV7q?_RchdXaT+ovF5N`C5ttxN1{l@sg?T z0Yy21JnrL1H-#%-ToXvbm1N(Azp9STR26ri0R-q7#z4!xXA>?VCSMsZyOQ~RcVo&W zT<2VGE+TcaV#WEtQtIm^xdFxs9eP6U$sGIfHNmC?nLxXoNdl=$09y@r4m1ELiwo!V znNlW&#GOjWtDUF(8eN)QMm~7z9jb&r^Dx3(d%f`eW|c@$11dDdmL*B!ZMW8De_tvS zyRarwkC5Xy)1LzMXjO8|YYbUK>@;Ca9$O(ZTJK{7Q0A?>DJt?mm2swfa0-3B3|(K@eVOUjcY%1sg}yj?jfCT zVtQ1pT>CdrHA@u#w5794U%CWIUl+JO%8_Wyl;DFHH=9VKqJ?2fX_}BQ-5}hnXTtGTsa^tFT0)VL@?lT|5^Iex|$b4 zr)BlnIvVmCb)gS`4ofR-KZ&Stux}O9N;F5i%91DjvghmNe7A4K5h)BEVks%9|4n#N zUE?kUhF6&3ixpCn{#$01uQ+TLzKCURyD`6$PPi1nxo$5SgneuR-WbQ29fgN{_RkwU zjQ{A^HG8AJEvoIhGp12pr_(!CP#)YK(tZlZ_O{eDKRMgNwU zkSM=JWWU7gRiKqaC)PT#rJz0h7B?l$Z_jYK^Kg2OuOfUoIm|M&1?{sN)#B(_BIRb@ zT*4F?+9aDck4ZRyE~jZUR4DrC0*`H5$wSYK1?=fvz{2=EJD)L65Y^ee=^E3!pvM$uZa_vaA)WHZ}rU0Pj?Od!l$1J)h%Py zYM92bIEL7tGA$M{k3O46f0yIC?F7P!C8WIZ8&TG`6RU}(5`P2`!0gM62I17G&u@!j zJg3WX^!?Sxq$;9Oxe%#sgLPqz7(Ae_N}0ad;vEarqTb+{Y=6jW(=Hz?v#b zQcrfY{TS+dVK0t(f#!P9*xNt=J17*D3ZNY-wMv)wd+(d8XA?Trt=MaCObJfOXu;?H z;I;beNFdj=)Q$Ojj`oZ0$#|Z4Y$~c-TIpCdJuX`1e)RJ?A^BC~Of%VqDo@XfF{H~1 zCo2wY+RObefB;U2^b|X42+Vbv|KuRQHg~bGv8eZFpGp`tF}fO_`!+~`{ka#IMDmNm zLf>dKhyY)G6^>O$N`HnM3q7(;WGZ`_t7rIas88wnXQsoFNs&ZmmdHpMvyU#n*a#{s zZY@zZ+*Ha6k1e@Zmt5_le$zscuz6xcR+bB^TJfWslbsnFS*zs}OB9a?G0~bcePP8| z(|Mc8%KYyaMM=2d6}aKbuSUl{c_iVGNhPWkRzZfi;TOA<-99&{e$Vf8$=&#dU+x!` z;1@Ex<-0$J`dXhqNkH?i@SszUy0$bA{Y8Pdpi{wTc?R#{0~xUWDneOu77SIJK~mxm zDk5RTAYbf7TN1A}@b+@=VxvqBzY@sP=H9!U9NMV-zdb71r9bPIgH!*VC^VU@tp}36?PE+JZkn5q}Wfn8r@t-_Z~zAtS{<_O$(b%6R?S% zWeQH5b!jAGC`>L7vA_V~8~rvxoMv3v&utO@)I5sGCSyGt zU)#sm^}aM z*Kiu5mO)7B=j4&vZ%)W|v7n`rdlG?m@i(M%|9@Jf6L6Ua#dKjbxH3mdDzYpRN|5dh zr4l*1?hL;JQi}Q{M@u|*kIto)o>i+^*=DgAD=|ISmoIR9<-i0r*`!wWruMRlgU0^61bM-tXNRN zCy(9^G6+(U?)L8(I0iNTgek&5zxU`aMth<+LglPVaooJuy6LP)5cT5BdEa?P zhSZKjw)XF?#whzS7v;P4H0A78?yW>1_ldRFr;8^0dRRh&>$rJk7U5XH-c^^^fO8p4 zG9hH1-u2BX`8H(+NV_H?GJ<|=3bcPF)6HKpU zIL}s|_|iXQGW>piT~4gL6-UE9 z%6RFfE*Uly>sFqgEFSU9==0o_)=H1)M7kp-KIU3=eM-S}h~i5MP$8{qZDHK#KJe(pLuuv5SjoLCM%d3ix7jER~bD66~$7aA%f?U)iV z%h@~SRN@Xj)^e7{D?r!(?-B@eE*b2 z5K^>X`QJP@xE|TAsKVIYcAP=qr)HN&YsQJ@E$|K%EpNP@j82rbTjXkgQRfnbq6EK; z`bW_t!Kj*vz3k!qu--5B#B=Ds2!b`kuK8QVY$$Z4H8msiM3_(HJmw#Tk53yA_kj@) z@FKi22}u$f;K+C7AX_HvhI}lLONBo^Ot)-?U~;~Vn;=geVsP431`Us-QEfH4ve|zW z%KO&ao~wmTP&$sQrK>>@*WkW*rAm~W+{PAQv@*24o+bdS#~9jZVX+|6n9J15efVk{ zS(mSKcL6w`e>0yG2B$vn^Q+a$=kUn0fCB!lU*%0`*bga<$<;B1@qpzwX5v;&xgH)Q z;s&r|n}E*ZLyPl+Kvy6C41FRKggwsJ{*CoZN#f_Z<8bQeXiiFiGA4_ZK#i{}HV@O%lbeiGnS?UIh!`vGJ)ZBuY=ybhJ&vsXa; zql`AgfS>uTSPYKHmfU2U)|v^}+V!1cBj*B%sR~?{NqDg45ra+aeg=5io|*`xbtV)( z0}MHgN%_2JZzKwaiS>x**05jeDgJbfZck z&uF-ja@8al@mDe!Mi^W$#tkaYerSjwfx!!-z3EVRyF!OYdm<3y%k4i!c!QqZKOfuZ zW)&Gxp`Zif#63TElVvi5vcP_UTF8ruCsTO=oi7%@J!~_)1|uqr1|SzTnhC=~MjL;% zff?i|i5~?aD^K3dV&=;Biu-Hl%{|vD#TanimDuTc%@e-*rjz*K6jRKQ(1`hgu17iy3l&19+w zOX!A6M`8dDkO%F*h-3bOD~pF3a)d)}-$kKzXaoV@mU6B9t7xzV4+675EeK3^sq@VZ zk2iJu(hY&iW#B!4rbX2z((;9hJ? zg2-OC5kND>doGPi_Zt|M4q`jIk2qwi``fqZWpmoKQcJXVO3Itqoa-iXn8 zVo%X|D(=(S0Y)WOz$$lGQ3$il;%eG;&Zs^ z#X)0aPCvkUAIiP_yrxl!dfKu6^33Eg>^=ju8yw*h12LJ7%(p63X@fpC#(`8^6THJ< z{?$AniztbY@kCj^Kp%oY0n56Y9v|1ARFk2ZG)IDPo*_bg^dD*I0q~j;GW}>Pf{-k0 z$R_PZB@(<`mQ)R^FT4%>rQrsQyWE+QNSFg7P{6;7PoN)V=1hb}#l#DD);!W-pK!oM z&#RkTL})Q}vc*6RSs>7%=mv_;eO_cGIf1IWg<7VC<>vg71`@#r&5?k?5lk)f+EjVm zJVmc7yOST!sL=XZ9EqL=?5hk=M#2aXL16ZyK1I%+HDo45`G4B`&afog@b8vdnbuR9 zl{qR$Im^9mJPmVTDejpA7n%|%?veRq!?GN>&{7fH3mmA~&=i#tae#`cXo5(JVv6X? z|NZ_R$NPSN`FtP8eRIQgUe|A&zw`8=0(FY0ll&j_;X{cj7X^x6)}iC?E)yPO2lT$~ ze>$}}($(|!m)5BhdkHPyg})+_?ta{BlH6BtGjZQKLg=4ODMZ@GZ|jd&X|5(xBBxx0 zPf=QAL}ck0gUm+WdYn2NaC+|W;@Ik_Yw^Ng^ho9&4DJP7VUM78fI(>L*oQ#O>gvZO7-JXmQ%7nTAJCTH zmT)D{pOL-z33PAZ!_w>;?2I)4BP*(f4=@__|4}ls1~vkki|SHwJ9Jj-EWff!B`J3> zGP5nglF3w!t1_O)l5+1JYN1Eyn0Dd8#xzk3F{8W^&2yBHJCybav%wxyu#w#+*qwJf zy}@?lt^TLW{f4*?4~s&vv*gJpgwU+ek{f&D^dsRSPB>JA#+a>F) zy`QGvq+15}Mqk5O9HoCY%xV~aKy}uZ4L6{smD|f|mG^ZmFTdX?%k$nJ^9CMLZgA_L zphn6K!XB(3>JATd607?xKZt**l%*#lrM+3rvZ-L){3f(Ya*<4wYW8ftP1zWTao*@R z(axB{6@RtcafK6l!ErEw>u@!oH0Mxr`drABKzHU1=c~r_l>VF<%nEDrk zJ~zIqx@1(Ley-QgZeuTEy@e6I3+Z-|78f27Q6xx@-rBrZR<9%eMl^=#2!WOWQxz9h z?P*vUEEsF*b~4>*>PeQD3Ex=n?d)c=M?h*nAeGAgeP#M?W>pa`mSxXc)!GER>#lYX z>NbxwBiBLIYsO(dOq%5s?o{Je_SUU$0_A9A@vyz=#|PYheW~xSj&E-|FHiI zG$CHA&IW3ep*{qBWHZ7{m4g6pH|yDT+`jU?Jli`K3@Bt>>X;0Cz6A*sq8t2 zVGQHH5g&}|G`cxvXF=aP!#p)V`rfl*J z-r0zp)y^_*ZvuWHx?;5ym=a@z0H+QCq zvmExNJZF*_^em^%-A{TvGNyja9K|0G8?#p`(|>kCUO^gmafHh_;3NH#Wl&oxOAtM= z_Ryw%c!)!vN68vLSWWtF_M(h}DId)9c=lpBX0Qo)P3Ulqa4I}$*$h9x-?X=Z?M+L{ zM^Q{HoBWnl>SDpCm2L~|awxUuH2zW1I7A~yvtKE^xsQ=)K=SV~-MdMdbNw}QfzH?! z4gYDJ)h~8g=vZLaBlfki-NPrMzsEOSh3+-YGaIDKbF?#%tzm?sU|cX_jA9dR2?!}lvV`}(*$4C5#S2;&}!8JkJzg4u4`g_X4Sp@|^!{zr^1^eBsHB{0xyvit0MnBuEZLwfpXzf^Tz%+* z3$ez-BfbcKEiiN6#kfb37zAs|ZdKk|nXuVR)FFL;1+SnlYHxlifENu-A}dX(eLEv@ z?WWY#c%Y1m!S77eHbZ>gXZiZCoC5to)36O{QQN70el|INA^sF7v1Ih%V@n$GK3>Ch zW`&Y)6I??B3!zYhB~jJwCAtlkM?sYbqBNQd;N1-eSYaBQ2fmlS%Esa4)KE`sGjmvn zn-h!=sMGYfOtFIyh#^tz)wt8ar`MSxYYIU_{nUGeZ5;@WRQDeIw-F#30N@?Zws-tF zF{)QY;TM|9_|Kd1s+p&kmn8UZ^vx0`#ft6f(>k9BM*OFcB^N+0YyJMfA6^2JDgq8& zeD|4VX_~E*jioD)!(mqS2UL!z^eWl!Of`0|uV#-8kll1K9bpZgR9In%{$@5(*}W`0 zZfp8Bm5e36ELv-tki2#|SD#8QyPtFo$Pa}~Y;M@QXZii5Ovi!bmgqK?1LmY%_sn!9 zPr7+bv*VziXQykT?W3*_xTu)V`F<}fSE)ws#ZMt?e3c%#8vIZc2V-Je= zpK%rLJ{raA?ilgWrXv;Sg${y82x3XNf&~iAZB=~qnMxPUiY#(prN82@(PSbZZ8orR zH>!MLKoW`YwCQ9>ESOw672}}oDz?qzZa}lc=wHpS%)SdiQrtatt#y-=U1-Wgi&74 z<_Mw%sAE=qLGFvBTy4L2z?l6Md4$#4uaC7JF*NYMt5?0<3hu&}v5-D(JILMmPAn2S z)J#+Sda6(8Cw^eg0+6i6Th_yK#Hu4}x%TEj(=qR+2Tsov7dcHv+yVPn$Tt3H_SS++ z*xc+D^W2uQ4d_1sUOf`>zG;`lo2Q*B0*kgQZ8pE5Qn8ZFSrdxxi7tW_*YHS`SzE;zmi1kSqlH^J&A@%L~v^m3#lrDPfeCefM>U-vI zqo?h5ox~;%xEN0>gU90Ehx*35UG3seb4K{r4{B%c>wXBo!RQ3rw`=%kZcYZ+S-UET ztQiSOJ?lN%8OVsQ;A)bLU2S$F8oYET9INGV$qIr0jlOp!EdBdUN=8M?)kc{>)LHjQ zmq{?yt*x9}4anH?5pe&>2VdX`5&=s(@9e=T19z&B{qEet1tDT8nu-j9Ubhr)DdGD3 z+(H|CANTNjZ8el zdlvqs4;8_efi1v(}vTDbrqDKYKe<1T>Eo%CbZES4UTZD4V=i#2k->*u94^PZ| zvKJFC-FWdL7i8HvG`8S;6M0mOx4iT$9rh`&QU*dMc$D&#sf+n&=g#zYrD)3X#M`=* zAAZm|Ar_6QA5ZPxyZ9O6KAe;)wF~}*8E#B`-+}9$`pB3I|T|G`3Q^%|)ZwHt|z*3v&f5z`# zK0oZnbe~`5N&-Q>x$@91n@hiJLynK1+J6&XGTT^wJ)EJbX?yRSuF_bNTzZ4pcz^DT zgHn_%R%+vMDvE%;kQdzXpb=>3LY~*n5*S82Ks<^L=da&>k*iPlU3gjkyiMEHrf5_I zWC+~&W&T2EH7?IhIVsP0M(^iiiTv1aWA$Of7kW>QrwJXl)*TlGR=*9$N*CgG)bu8< zU0hnt%(nNGl~mKThvLXp_{!i%GXkARDqY*V<=ZK7b^G&9){>iMe;yKnfv0rG;@w#$ zy3Bjuxe;e$sR9%Bd?4gdeVd3$$bAi$l)uY*_8i9P19sJIKNa1VOeCe6N@nA}P^3q; zG&V<8us>kl0jy^K2v=Ca%WkHY?s1(y%PE@->zRwH62qVj3(Q$2egr(0Kx)f;dx~_^ zTW$h+j&T(~!YT>v`oG55|8t>_)`ND9U=C%GLmyGp%u6ol4XbDmh9UnYg)h`!&GU~S z=q%Q|{(OQ79p^?EF0N`MsA@uaZ^oeJ^U#&!Tho4Uqn-G|+y#?Sdc4otYn*$+Gxy~) zQJHYTSz4Mgq_cQ!Y?O3)@>O}`fDUjo79200Zvq8nb9Qm`BK(F#g>g~dR`s&{6K!2` z+}`yxZ4v`A3B<)#*NS+qtU~|tjlzHPdnTbX+RG;cINGodaQh!uvUfLp~_t=-V30VI)wQx7?z zl?X58m*vW26998U+PLSjKlOOF5L}Iu%a3;)c{yK-5`)DS_{j|jA1>ma3QFkYx*n;m z+}hVI-~rN)`!5}wSX$!?Cgiyx4{M*7Ov9WV7=tURzsbXC0B@Co4*JOZ?IL zBylEi&pxA2atP{VEqgDdxB1nOX4JIa9Z`R^s5-VRMw%4RR^jhP^2WqjMF=An(4JLq zVmt=x4tiEFmbKl0abVo-`y2_Ws~&xDRJ!Pp3NNQRV?EqUDKf=N^jJAX_VNUzJEGz9 z5O?C5uO=%d2GNU8=de#1wENdAXw_OwV6$ETkMXvf^Cs>s>qgq|UiTO2&`5cDAwb)2 zR8sVDY{@YIJtYM{mNnJo(Km@C4DyGQ+t8T$83FFp=sBU_rDzYK);s!_mmhqpr03*% z$0@=?bFp4JNU7|JJ6YUUuU6)3(N6=|WNZKJMp&KM1J2s;^T3JX$BwY7SKITq5bUUF zlDC#FH96(6A>A*lDYj7P9k1v{NAb=n;TR%b8-tkD=9ZI>h@Z4rSQF}2^yv1%cIZA( ziV9lsEgi9dkoMoK;7>hl?Xl>jFojN3v;diIs~KQpbPjxI#r3H<`A@3KW{gPCT@R!1 zd=-vEJ#*7WM2UT+OB8f*WcMaZ<6jh|_Wp<0*SEU5(X*JWC$~)UH8uCG=aAesBy}~o zq6?cNvD|LERoGQWeBn6AD!B~L_*b+oPNws|)U^ZxgeyJNYz~kCxsmoKgWvdlgaEeW znh4s9<%}7EhVe*rI>~PL#=uanddkm*w!`*re_WF0{bcjeTMj$7LD9~D5O~dH*Lk#g z`q2Ut2fk!b!5Ss-X+I!KIb#vHI?-u3216nIvbW;WUn_U!Y5o^SM|Mj#i!}7E%;Og@ zf@FyLYLf=9&>Go(;lq%ucR5;Sz(|wkNPor^^K(tv72b@_DQrrv}GR*+4QX}sb!~7l2EvZx0YkLl8QZE zqrn-ewLhBlTE)yvxConbmm5R1@Tu@`{t59NG$hY0nsCvAF2luo+wkCJJo>)(Ly4Wq ze)y#LqcFP3Zq?*kZX#dd)ish`*3AoH)9%WWC6vX$Na%~&9iJgHHezG?_1Hj!Y^BTK z=%L#AxjqoV=9bB67Dey%$TF9NXak>EJNl`$&D$8_aUtG%@H;P5E)qIsJpoR|0%s)W?p$Nm@``uo!hdMV1KcoGtu8(;`|; zi5blKt>7MzNm3!f@jPbaU+BXRwCHg+v(5W3kME`5g^zV8|}?FUDc6a6yf(Qz0(2Y3={iy z0mpzMdrmw{c-YLMKKvcOaIGB~=>RRAz0S^NSW-mjlDkWEqJ)S9d_t%_toH*GW8PNc zr_k8j;Jz^e@5SP2rQq91*O53DCQ~J)cxG#{>D*oA;I`NyY<^8bdp|}{Th}71S~2Qh zDzAoVDFn;9b_1mqSP`ZEI?V+tJ2J#9vDs}U>GR_-ZxMEB(D!&z>T5hbj^_!RDa0po zeX^v3=M)4e*!w`Q(zx@6+s2^8p3MaR5$5mpU}|~wn6gBzfDux*=UaJ4eBxpUP6g?z z)l6YobFl8dVD4itn&>&ULJ?y{inftHU)mLp zEN~bZ9rPy+K4+mv=hk_P8|nAP!xds0ym2_8BhW@a0W~C8iT1mUk0ovFE6tVGH;Tzv z@E*vJ^OvGY3huId;N?r$7%}l&?FrJWiw6{>TXv zI_mLa(896l7mK@3K2BNiqI`eC*-dSn+OJ7@g9ohE#q$+-+GJCJASbU z<9v99bHUDA}H;FPIxU5$x@F)kG?*Zhk&4*Z6)a2eFq%4ORXXRH}RSef@H(gZn;ePJ_c!s_kh zRn4@1I5pm;CjXrfO}|2Umf4&B`bCk$97W+q$l5v2H0kutwLY9o6EQ-mYc@Cp)q+60 zFB>MV>!UxwpBRN(Dqub*MxIp0X($QP`^2Dst`TdlfBs{59%!b z%46lN!At=31XT!XcGH-$I)xwLz&>%bN#V~oE%sy~)nU}mengoEB$5zo$J#WWUj@dS z*Y?}tSvgxFdbIF9VoR{AMOROJhBU^bxIhBG5<1kRdTAE@x5Y(gV&^vVQkZj6-ai$S zi=1FJQ~)d1kS_SRm%a|s4v^yD8=@P zdolupx?NR2th2bP5Z&hTrwxJCKYWxt;M{)O+GC*}ER^h6_fi8+nY?!k>>)h95Pl_# z{BNP(Hg2os>kc=*WR!X-#HWkyMvijXGxbl8YFX8+!{(1jBKPysMIR6XqFlho zxp;myZe#~*tB^U|df3AXnMbI)XW)tN39k3` z*uA^Cdy^k9#zHS3e$|2!k3v6p}*C&6nL^y3}H@9W#)ZdJo}d|g*1*pAlj z%AFN$-=Pp0B`0fn*`iq*;JBnk2*t}_x@<@=fv4f$< zbNZ-XR~oVn8Jp8O>m?xU)P7^ZEOi#!{tK%lb0|3#vAAr!2<|PxsMG9>U#kq6=fsGS zLt?}uWRZc*e1AY@2vviU!BYy{d(@j<-d}2431tLB@rUWTANF;VxP&DKR?&lRV!E}z zuV;d4c24)`H&5@=I8uxsh~>sQ?oVdnNd>(im$)Ik%(&zEE&Ztz&EN+~xBlbJ3=dEOTM!8L|VG@cKsMateHZa^Wv4;CX&$*@^}z z_5-Z9&PM8QAgp{5B+HS|Pqug%$DLRk{prf^PrKa6$@Bf#AMap%nC8&fJ?-Ay`w;9s zG^bsCK%V!SI-FlL$~<*TH*%q{ir5rl8$|t9HW1rLUkq9cArSB=rpRyi-h!$*L2bmF z+eLo#Y5PRlZWdn%(o31YVs>FovLQwHt=Y&?I({J#cP3wmES_DdwrL@o#tH(`W(cfuSL z4`@#tsrlTQP#k`gyyMr4YuM-Q=$i8H19M`@{h@VyCdc*0dI81MwUO2@Ug6QrfxQu+ zt}ZR7#&-b~f{ftpt-Kx^-_8v-FPe>8Q~*to)N3t|)<1dUwZBbLi}o`rTHk)6 ztG{mJEXGCBb4>YyqX7C0B7!^I0ePk#5+O<{UNVdL@>*rN8U)4})b3xmuUq_%XDC8B zu=E5exT-f%qz*8w?S2> zuR9(&Q6992Nr7iFiZ1CgkLaR)pE(u8llSdohVW6F&oy4Z2(Wng?Xh$C*g12~j$8i6 zOlV+@|L{kP4GUlicGC`9_<G2W-uE;I_MN3_N$J##WZLuyA#sl+fE1YZUCnCZf_5o*Gdx<^C94 z)H)0GW2(1%Qlr=DGj+|DC3&rD-W5^2E&D)dNtfOrvTEY>cCKW#VmZ#WdH8N3oxqqnr45!?I=uxdL-+3s#*fIeJDd|HeHn z(dUo1_AIN9XG1V6!bC(MbnrbUiD@;su7O}YZmWsD&p9f~-q9{Q_|$f_d*}mIgZLj$ z;l1%v1DYW=>djbQ|DIEz>zz=9S$&VJp>2*!Vp?}soO8(FeeD@&hG;6*-43zh$etxyz_KiSY z4HN)_P*DM{o!Yh9Vx1^=Y0hdzZCp37sE<|&{jE>h1quAg)X;Y;*xypT!90^&wHM!C z5?EEdIU|#bK8ryb*K>m*CjT`ViEZ7~h1hP6xVf|6{S9yY@&8sFbr9UNkQW&^JJL-CPR*L6t8SN$F&HBLpXKMEC zRCsP&F>7D}-z9O?rAymWbonAlnmz*N^oecXd$yF-Ur^(jNZW}kAdC|3!NrrwQsSIdpB zwWW)m2ZUdzS9S_2zF}VIWwS4V7b_pT@*0V&$=pSBYvRh~Mm0y=&(2lyfZ0Yi16kpH z{MOMECalO$xkn7t0O1#w%VZl5kdwPJBt_18Gr}S7^VBZaRiz-K`E>f6wSC$a#j|3! z@g~vElxsX~%WH6c8#kg}Y^vKh7+Vo-0^Tbu`aWqseJ#PWk{u-NlK9weV{oLZHLv<^ zb77%&K6hZm%@o78VPo1tx_y9$?7-%i%aHl18nJjfPfk;Av$Z7k1EaZn*T?R-Oc5r-eDVdG1g^XD4zR=P*=czzi0o#Qto-a`sH&!!UmaYK8V7HnFi7YjyBSjHj_G zKG)f%0#=zm%v9Vu->E11Fb0o)265&!ZPpX_(kbBut)BWb(&x+}v~yz%Ky;xRl0Z?O zn^Di5~`#v?7J`E4@&g&S`}-!%{?qGXcR za6Xl%^DAYr0Ll?(1e~L)KcGATWM&g{Nva5gQmCMnutox#lK%keVbhWo?U^KJJ z!s@cdN1OHqiouUgC`lETh7#$oL$cmjyGsTvb-xR7wSL{*snA};~Ja}XJAT>eW)YfN!H%RjFzOvJ77i}gABR{Cb`{3bxl z0sP0_(-rjNhW`XG+N?>P{k7r+|BCTw8Ze=Zv}d7Pq2ikh z)N=0~-EkbTK0Rb1kPCPIhtn{>!N8&-LOMepUv-R4DpweN4H*UZ}VIEkqq3diZYRmJLkYb5%IMDAa!ekY6Snc2P09{TIE=udBDo%M7sEt=kcg zFWB-&(COAi&(u4L$|=a&DP~i3AdSdp4y+}QaEeC9$P;V3tJ!|#iyi2x@}RJ(zZB2n z*^PJftiM)%qZZCNknDu^&&-2BPfy3@R?{fgY(y-m)(ak=N_^}}9-FJ7)eO`(Z$2x! z@u#WvSLvnCzV{oq4w4(eDMOHgR(C&T>&Bh{+`~=N>V!1k@6#qFg7Ez(hvWjzgZRKP zTuxiu1E$yyOr3VQE#HUwOy+kZr~!u6x12gI8D@u#@1Xl|Y1sO$h}~8$1jF5KVdvX$ zn-HeCeKK&d)HwR)#qpflDEGhU-VnZj%;-Q<>vS^Rm*{TCk5l5uL@O>3hfW2RK9iOI zE0jSM*K#ywFADUzw^lL}ZG+1QO3izh3WHR5IGnZ%zzramXW)d@k!inok!VW9xMN%q zmzdk+tV}CaxO%t=k*C2}IjbUma(L|N)y_Qh3jpJVyDzifa;lahtQ__qr=0QWV08la z$)#?kj2A^~?Gj32Kn_N`oX|@W6KZz5Lx$%1i$ww+5*p^HSnyTq-+C5C>imC&^$LN- zAufZeQLi+~HIG^$hz*U^LFnKfOd)e3B&Tw8ZuT z9`j>2nC$QQ*Ybu5D)r(_RxznB8>K&#)3!TqZV>HP zcjp43Wy5vz!63qwA9d}+l(TSa_CV?w$N$r5kZekg;ey zQ?{ZkH0qZBv*GsN67esty8x-#&2xWEmW;GrYgi{5Woj)lo<&-2q@Lrx_G4-piXI_{ zBra7_Hkg%lUIruan2~SMF1m+pEU~M0)p8?|lJ~F$l}0ZSSgGsW)^bE|W>S>fnOcZa^Z=Mip2xx0B=(6&cf5Y_ zFrVH+W5sNwBLLaSz2{QwkF73Ut*rjiKz$jP6LP8NRseJJ<_nFWm|w`;g@K%crN4;9 zVSkK=fr9ak37O)6Hgu36K@r~3(ZzD=+gyK7yS(V%z2@)Y>FGDY6H;+p924PARfZl+ zo2f*kL``h=pVk1P*3EKzNf=d+tSkIhf8Ct7y+c?IcZq-*vNINXjT)rUZN6=>;@==N zf9z66fzSjiox3VS_Vzz}*r}(Tf8|UiCaZIZO|6#{)SXEgQXLCe80US$%+AKz1~v(x zO?pL#+^$uHV6$>D6!FNr-;4#D?}4Z2^f3@Ein3$sMi1Ugi8|{D#K%#wAwvFd@-%{* zUoC=Dq{vn4@jB$)Sb752vvSvnI}(y)_vB%OW4q{Wz*cY3lbKTiU0~+xwS!;t)4O8c zAeQSRarhxSxHj4NwV&=*jA8IS@c--=%QNcENwd-ArPC}ST~D^J$Vp9TLQPQ0*YUGi ztlYjEBv>r951Y#A>lv|b+iY-gTjVRR4@HR!+tx>PDN z*%$|CHo zt0$n?zb=kc!x^y421Js|TA@SKlwbAT-p;%}`9nb({p;EUOk<<4%k5v0IV5nkMsOR! zYHmnAs^5IBI$F4K(26XOfRsE3+Y#{NfQ`RF?3c@-UkKJ2BHp0iNrE%=7CRx+#e;kQ znV(R9*SKr(Hr2tX@&Vl-6MAa{+u?kRogv%sePk>?R`-#BbxDgsAvNhjMy}=92k}i2dfz-|xA&nZ3zM$jr9MP|C5{ zi&k0rC>_MnLdQXXgGb0#iC)nD&UDf|H9BgXM;neN1VO3>gOl7I!i(~1FR7E#JJMrZ z-0Oe3nhB(xTbGZ#{5%po%>Tg|{z`nV(sZGbuh>^{4#1N+rGBQPDmv4{+xqZrFXN*{ zqrHmv^3fh2tFH6J6ga`U)XSLHh`hkk@%a(^{n5@_%t>*7kF9SZZmBgvmoOj3^mO4t zX}CpD7=+hZxgfo#J7{P8N`iW_!sF7nWv!K|Ho<)abwrJruIjej~R8*5VOSld2yt6KQrTJv^whJDTI ztm%ffu|yD`5kpj+#%4s~{cED6kud2q3$AYEBz#ZBYljSMIUU$z&e~;&waWX<%>^G zRl`O}^!F_?*1Kz5wLA@hS8JB08XmZHmiyN9YID+ce`9WU6tbWBTJiUs!f$Ag8BE$6R~5H@fVqz`^zr2z`@92Q zH^+MgeGwGSD}eAiZqqCgUb>@Q?YnKex+{r^yGtPYl1>S_7DiNxkLk*GIvpSXa^m12 z^SqiMs2-x109Uh*J<(nsWSoK877rJes*ouW9C9hM0*LP-l-VQx;k3!nw{D$Z!JC~~ zf0|r!y4Uth1mRzTUTG69wd169PO~XT%WfkMA1ELmAiDX8-=yfoIf3D6e8>xwo5Wbn zu5Av)L@i#Kt6{WbV{5Pd`MC6m(J6E)%_fYR^aQhW5RGgzwc8XS+0u_b1mp|BDk9F- z9|yj!mLr%HN(iLf-_eGgEf>FyydA#jw~5oWU-3z^Y;VLn*K?-<;{S2^d1{G`ylnNc(G->|b(lQ8 z2F0!ncYD{x);!k+0rFEn#C77DjK-;u)9?Qhczx`>m(T3vqf|VO|60SE=6D?U$Fwkh zJ>%vKeUeE>ZNGkcqakJ9IjHU9n#kV2#Rk%EJccZuk4@DWl;xODHB7F90vj~imU;T> z-|;vUW0>ii2iNEb4O?*_*p7J-YGn{;i$q*4i9B zMcY=NwAxvI$-sP$Q@Q4PI%-4i2aM77wivY`gF>g=jNUqQm>RhT&O3bK08sT$Ic2i5 z!2~KTuRsoj@3+~mk8IvMI|XL#wJVzFwkN<{_CoY6@d8I8-~eS@gg?OBbKx0}`aiba zfJ|OCM0WWhNCSB5Bld#ylVc)e&Gl^0fk{BLE9;W<{QDy(1kPF18b0ymg{B*Sv^F=Z?Mw!pcWoJ0 zdWVimXhOR}zI;K?9*lYDHNGES!!2uHHmwEbd~Rx;l~+EJjw0+WUB4{oeW?W#Mq%>y zt?VLkY({g}$7H{;x4R|+$fzlY@?ciBClc-AVSVwHtz6g8N3QvA)TrV+1%CTPZwZX8 zE`T%)dt!iZ`(@*)z!E=1$A@G(H9(1QsN32UnURWvhbL0h4#w)U_770ANzC;o!z ztYybYVh!BqJ*L%Cxh2m`huw<(nFM7D62*-|@Jc3qQxn?uStxXfRGkYcijKtqb-z1;0j~2--Vvts_iU9i_!%k`TmIhwj)V zc84Z!SKtB`isa^Rp%)i1In`DPAOPLez3!No_hEr$C#rWXXOq=c80Y@5`M{?!e|PYd zw&KWKU{|;ztWP$!x>yuw)ApGEkkxo#{OAUt`5eE-=GQ+#S=atFVH%=b=slKo$zR$o zl}noxsi9(A%9_jv@hi_qcyuA7c1ryFw;pm9yq8O_$D&-0+lQD+38^dvmBl&zGPf20 zR6%%ZI`y4G_p9o;MflfKUhlE(xlxy5-KN`C+frQr%52Kf zIHu=q4Q)f4&~&iZsvQ_OH90cz-K_tRsY6sj=?b;&%;&Rr1XKAS#ueFyS1E0O9&WZ9 zIjzaf;Inh;@UnE0&4Koyz)@F_=UcWaKQSM@% zs0cCwPKdj3XO=5H%M}-nG<8mgxIbm|#1bHI&`01n?2*Xl`4Ga`iV+l$?{jp3ESL^$ ziAv81((rNZ4!W6D+3;Q4adO(Ld;xcf$J(KTc`K3G?03iB`*yXW{NtYcQDYu z>A3uLqkclc3J>E|1N6$eA;BgF#t1e_1#7=b?||I zXQd&>Ml>5yq-+}p63IJ2_7N(s9n?s+81+LY)>K^|T#0$!j_EwU-EY1--hdUdx1%Qv z<*RhnS^?us@s(3FWz#OtU;O-&6_fQ}9Jh!r*#ZXTPq}c=e^SA1&4SaRxCbBra^{CE z(-C4dq{qE>>TN0W=C_G*s!Q1Im7J*R!dKR*I#LfSwZC-*BR-FC!;Q5y^Dn4GCy$qZ-^tYL4O!~YV_-?PpUAuT>Rqam@*%T-)<5juY1fK+K}q+I%);RN8lEh z&mJro`Gs!loyXc%9-x0%yE|B*YL-jc-&vWmIo}NQx zWkxlyn&(`x0{tmjcVy{+q9I8@w_Z9DVO7CDc*ygr=KF%Mn!f{DBV3ile~lo(_kp6# zK~l4-yRU9RyWEvbovz-D6Qt59qH9+MN4oTclWa##!=LFKTDs%ouy1VevQu%E?`N}7 z?k8qLKd0&FiGE+o0;Wi;F7aY(XEK=ND6mbw?8t1R`4f*DJW~;FQ8Ub!^C>Aby&A>| zVZes1YhL0%YumeRL>w;3`=>P2Rk%7d(Mzc6e;D**b}I%0)(PxvMO+vY=4xHuuwH4>SEJ(e~4B@(9a!FJ28w zwF`F~k2}x~HmOc1n&*>xWgr#u6ITQ;gCTJyX_Qz+sc__E(a0*T$eOt!PIjA*adPu} zZZlsSj@VNs?3K)_2H=smVi?cLYQiK;a%$3!H+vYAPw>&RY**0E--bMfSbeqST+OHI zd-)=7S}Eo)u5h;0WM$)wc&>!AG0Uo_A7VSD!@wa;h9i!Nm^jy8a3V4O3wiF+zmS97F^2Bf4~z zEvW0RWeeR9P^qG#xd`psE(o495knQz(ooz~7uxja0nTXSmALZ;z}4`Qz@<~jb^hb6 z)|=3n^D9CJp7Oz!n0sOGC&bomhY!|0O>d9LQvWS5e^`Zc<(;!pQ;x&!Wnc7+wwu11 zcrU>80_v$Kqsg!(RgXmrFWXVK@O=iSdQ|L9fepdhGB9busxNi@WfxSsIx)YN*)4+u&H&+=4c}5pnX%nYLx%EFuuRi20pj(5l&DRs-U8%h( zU6mUfb~+iTpaZ(*opID*WF%%A#!4x|c=C$TePb}Y>b(`{mLv@)melY5qC~6{BQQdf z6I4Nkr+P}48mD7~aPIF*Pu z2d1|rzqBZzS4$J?deXDG$AN{l8-*7nC=r=$rjD($27;D_&)hx6T6maY^HlsJwVV4@ zy@!0{FsQ>PdcGweWM=1Ts4c(LI-77ot^Sy2_`m0UWl=@drc1>d=u)&;?ssfD zjXOV&V~5nf#R$>d`0d$;f82$L?c4u3YB2jnnhgK| diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2@3x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2@3x.png index 298d9a1588a3af16091f392d873617ec807c0f0d..e2d5ae52abe7a4a07b51c0bcf334d0bb858552cd 100644 GIT binary patch literal 18974 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 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3.png index 7137dad4c9d6b2064136603a219d42562f374013..670a860bf09b0a1bb8399931833a076bf40fa9e3 100644 GIT binary patch literal 18437 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%0DtXs)llar&WJT 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 literal 32001 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 D(Ln|! literal 63389 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

vemy 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 L8$U*9I>-MX3d~A* literal 97146 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®OGDm;g>)i-Gi$Z9@&be5oAoGZ+r?2-z=H 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 Zdi}UjyJ?M!FZs94tA9COB-z}4@L!0lWrY9$ diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4.png index 37d14b894e90f4a965d259a365bd8b9c4f2c683f..b1b762c700315fbc72b3cc2ed2f581c7841100a7 100644 GIT binary patch literal 11992 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 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@2x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@2x.png index 8a78ceebc5988630908223f7e7a6d6a671f0c7ba..babca338b88243bdb382ec4f14299c2118a1d0f7 100644 GIT binary patch literal 24028 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 literal 52495 zcmeFYWmH>V&^H<=)Wa{QJd_SABbqzKG$hD*FLYF-CQO{s+raQb`g3sE)yZFu?`@ zMhfIVN~(Kc96$QTQr&v~^%RrFsD1nCquNw#JmC9N&$;dJnJW3!EWA(Ph%I8tRa#7P z)+yHY(`sW0$D1+h^PjK<=nHpd+n$q!qvwE73(Hn|73SkHU7IOlEM7{JAOcG1BkUP3 zC0?z9WS0fB&@hf_$sbSTN%gT=sm28t+8H2DYCpBZ$ep- zWR|oTO7GhyO$s#9i6`?`P^}j}j*;jsdjZJj2;X`{ecxbx+$jG_lN^Z3+~W6a_?ig_ zHnw%iAS__gSSU&{Pq{_i3_Oyx1yp~n^i-(#T(-;EKtBGI)VVM15XU5ulE6tc@%@En zB-X9P+g&YN`r0EqzciH(GXV64PRjW|DO2{dAs@Q=aKj%B+pQ`0+VR7Wc`volk44*c zKWaGlcsP8~dGibU_pxHtbhyb-Yv?Cp@ApfBodd2D(3$48SjqBbP)bt`gzk2@!Mh(T zfCS6DSU_~J^$^H+@O&)9L}`@n()Ce0I1~TpVs`s2D&G*Nl&Lt($fIkRl0eECdh{tS zi0)XdX#}5z^DaWJ#YZI#98y6=TP@c@dk} z&hN6cCV%oh$L`awll3|G8&4^FcXbxC(A~v}#U03Pv)?(FoKNDL^pF`})$P+yueP}Dn*m@|_tZNv)_pTi3X`+mAuU0r`G0vQ`s z`O{oJ`R+n>wtJGWe1^83md18xr#rE;f`w#ZsukGUvgN}G(F_3w#i1-weffx#ve!3p zou*v2$EQ>pN!BQ;>qeE>DjM}C)%7DE8c;1FLjLQhMz;sX>{fQZ^V`SEyUZ$Kc(R zM0^b$KJsbFGd?bx2je+g6(@Z|<9|O$-i~LZmT+{qR?kYI%9_2{{x8Gc zxVf~_-CHr-lF)^sxyQ{Mh*rrO9#ez;7zPOT13ec-Oin@fUf+zg!e2g6f8Lzu^w7F_ z9aiA8{IUZay9_b3I&aP6@$!FoOKTpV8P{*k#UCr8Npg%!dn9%MqHH}BJ8&T!T^;HA z+crsYg{Q?^H7n*JYy$&3cpJqBgE<25>m7^&!t+B3V2)B2S3cyq zijXnZJ1($jaFHY4FFC8{I8Si0#jMMu;a}qV>ET};59V^}uAe7`JPnlRF(B9D*&VX+ zGxi=B2Osi_E{p6w{$54(*ZocXM)?U9|4!q*3ym9sIgSTZOd8srVYvFIVr&NXd8&>?qqeKeuX6>_m^aMuVO&4<{Z@ zJVN>;oLVpJM2hki;)Sv%5#99gc9i-QtH_A8b+;bMWE*>%z+{1$+4M$#eVbNyr6FUMcg`7Z z%x&-5MYe1Q!`>GT=Q5<7hhw4r>B$3+L!NMssD3u&4}|v^5&P_ zgYJ@|%)}q##d9i|GyG?5ZFDwOB95u*mQnA3Lv!x6NgtQbnPr1ugbpcnhWzX?xw7*H zRBvC!9 zIgJhBKzOmQ?hWP`+(Iyz{>HHoFpZlb@${cEK)eRmPk!FXe>D-TO=&gucpk~Xmvo}^ zFG%h|izE55bbW2zrt4~>NvkS5+LuW`J8TE zP6k+R&h>Z3_6_miht~MJ_R$x16vL3kp%*KmG zi1a0UK$>Pedus3c-D%1zPk5xlCM&xxRvPEo2Z>O4+WXp+xyhbRE6uGM5B834-YsO? zR2g?X=7PNM-W>|2&3&UOg_nt&N5f79aLn?Oa?4nEJ16Vf?M|F~lXL62#^P#i z`Hix&x3GmQWln))u^m;1?VX+9)_?m&WwUxdvru#E7b{}$73XoQ5D^s(B%5t3pzY@U>>|Her zuAXpz+_4cxUPa`5?;d=%^UbK^z-_wY3VZ-uj@Wl@TO2kw+;LbYW6!F^y-d77))W}ruBtBx z5NYu&m=GzN_SRabN^^{YsfB8Ay3x?A2zw9$r=cAxTPtQYs?MV{`e)vh1{<+ZJpa({E}GV}QsvPk zgAvM_kg;dsZ1P9ZIEZ_O3WFk@o`&E*8-Qk8@k+9DTML9#q;14uHcxWGiT(_lOjetIbj-;4mv9DvW?2#* zm`d2B&z3vJ_~}VVscl4^U%;e*Pw(259>rX}>v+)8mV-K3LoQqy zp5Oc^xOr2N)YqXDKl5p~Mo9OFI7$X>(9;%W?A=|>a67V6rqtfKWK-Bj3o92&ixiH5 z(-F^{zvi^pRnu;7Y})pC?3CGo+wm#MhlF8_XJi*)*p)CXC%IFt2BYV{L>E`$ym5u* zD=@IpTSt8SN&CMhR;waot0@^yVd4`^|E1xtb~(Zdg`$^p9_u!QwNy_L(@{3sWjul7 zBx(ehN$QOw9G{) z9i}Apz`&N%miU$=SY}0gODVR#NPyyx00J(Zt*jnS&}X?|szVJNzpW|TkijP%p+j+= z-%J$Oo2qisafr7Vd9h%65#4UYEpI)SMcE{&4ZVb&U43Q6)A^b4K{U{tO^+_&vd;`q z4+$JB^MD^mmeSz|{3skD4oe=wFXd+|9Q>FyniV{Aq%Yxig=FUa!cUE6`|4NKp`U{L zufrOo{HRT*e!@TiMeoh|+~ce)ze9%hTG=&_zfQTuj8wUj$C>@PJ7y{x*ah+uT zu`yJj5}rYtK<9s910566Z>BtIZG)cr*l z%5jqO^=Sk!W&1msoH?so4ih`)U(nkM#)*q3Ww0y;ahs`2hrO`2f$Ms%W2qvk%!oC! z;Ibv-k+bx1{#OxAZT`AQghlgfpSC+s%RR#GvRMXB<959O96GuuDxB#+bP*wLVlW|n z*5g1}j}t%lC3(Fx_S@W7mA@Slv|wH!21NjTQbOKaWiXYoTF1&F(zq;rtY%+0{l`x~ z0IcBTZ7tMy_-y1X9JoZRxNQ-{4Uk6XcZ`kemG~@Ey%d-MxzU3p3&aFwCpQjVDw@m7 zWcDC6Gtxb;ltSM#M0R}LR7Up?kb)n7mE6d8tVmrVWT=3+%2iNpJ3s;&sanprruRq7z_K!VH zu#Q)^$3%!V$ko;fk=~|F(%}Mu?|*+*G|5>dk-$&MJKGS;>H_b;BHXzTK3S3pa=2 z?~nA6zvuBm-4tu}Z8uXyJC`~2+smk(8>ED8j8Xlr>Y0K6f-|;+-HTWZ*WG^*&T?x^ z{n{<9ZiG?mR$a&(L!5#*q9peo$M0l4x9#Y6xo=JT^zErIi%lUXM;C>P0G7GLs_lO5 zPW%c7`9SG}W%G zSrL5w#M*2w;}$o3oOga)$$kDGM&98C!Hr3gf|dSWBuIi3om6or!Fzhwqh7>%pITQ z*(udk5Nc~J)NDE z%ZuKx?qQpB#coRklz#hYL+ZNl-Zo!yj(`~pgF*!h*khPv;Kv`y5TQb3hm!esS%C?| zbIN28mX%=Gx52zJ0W`!s$*!SZ86F%SzywlK^{k4e4a!#CF5pNFEW)=U_=>QE>5Kf{its zt8RaD>=ievh5u|b8?kZJm1@yN1YfXB4O-Dd`M zx9~>!(+hq>dZgdCO^!Gwv9-%vqPEIERAilS)gG%E#)I2D$64c8kp%T zT{;j~)pe}f6l|h6g5I)`hHtyux#>Ji4lP9t?q1z-9ruPoRV@3WcO*hCcVAFjzTOQ( zn_TDNB7U2-s7i~8p@J?%7tx_CyO87O?Km=N8lU!fsr0cb4V(~Esveeks?pg^#Sp8Y zGnguVrKU?H5Bv)XuI0Byb!{R0LEl}`uFoeE$G)`f-mB!%JH3)6!rRAcU^o?uiMMXmfR-wHeVDtc zlxRU|h2MLAA@q`5;4k^k27L=N_u5>MKpuO>rEq#+tj@Ay)?`|(E==*PUy83aSlXDf zMp*f#ja9If?u5+!uvRIgsA}OaSSNDHnbwnrT0~>PAPqc`KRhMSQdi~W+p)3mIIBWm z-L?x1d{;^UPABZnw+qB}k7G-cU;YZzUf499AB*|4w?;%s>wesmP$~YI#|%QC^))LM z=Kz7!d;&G5RUqD%g<7O@d+#e&0@{v&8YMDnu+>uC2!d-|3pH zw7hG~@-1Y*&8`^vX0gC%Mh4}cRL3&6;$UAQ<7CyufMS_~e0=99KTN^tYD{((&LFLS z=m!#r9^2XU?{}+XrYn!ONDKKR@`lnNo$ASpR1W2Sw4UtBf4^Pmc#Y~1#Q)jQRGd#nGxg&Mq5+gY$ zyIK1*Lb7z4*pr2EOBt1vBI*=kpKXTS&RW$Djg!mLa4gbyW+T%G!!(UC0gGVXXa8!; zVv=c1(n3h@AEe3jt3#U?H+wnx{AFK%ma|4vtq9#XmJX1T)uT7ryDf6jPD{Bxwow3# zk$c@4X-fe@J8sx79%fwC!{gu9p^OyCW%X7^;g0Mawcq`xUVd`@DLI?XgoEt;Z)`%5 zCzArlV##gm99oEDVLq(ljYjAzjTiIZK*n-cYVsIRFm^0crAcv^Z7C_4b&5)9{yu>c zuyG2@Lil|L#8<_v2;pIkaF1nQ-h~XGGU|mkHz@`P>vlYfH8D3E8|!__g)*WZ1avP$ zViXDccx@(po#<%ai=A8kei5mWV$q*SC`ogOOupcrWJoNX*nF)FO7%Tgcp~o1Z>=p_ z#_fG=#x8EA|5N(x!^w8lw73eT`G5-NXUi@l0)3p8VeK0^GMhDjg=UKk(06O!sO%XP zqI7ySVf8d~L^iIW(T9?+>>QVu#^#s-79)Kps0%j=1{k;V+x<)b>8fE=4S)oVdBXBS z5M&Q!+8a>jx(b;m)v{;lRFNTdf(?EpE5^q)0&P06*%s{|K(=XCIP9R>**1Gy-E;;- zj}hU6UV7xe?UP?ib*gtHbVKwLusZ-)qS5-#4MDIwkiTxcWKXofYH#OD6%~pmls@&Y zd5~b6c}GbRBsqF{Z@4J&&J?cDM1t4auab*x0DE z!^9;*+|>U92xg0<5+xm~rKBsRN?c8iP#zN|{`!>oz@FOt_POuYU1Em{-q9seVYCVP zM1DIk1Rr@seWT#QV*#Dj^2@nYrDr29L7h^D^~Y-SN$N(VY;7(R;zaLU7 z4^73&&0GIm2EDl$e<~x~#)7>&mWN}r5eYhy}IUV(Y^cP$hQ zYnyG8HV-39Jh`s1QSNvvJxxDiw^kjJ4JoDqn->?kyVnCPzX+?+wRz3!m?i{O6LW^I z+>?!@+lJqb3|56IKB?v+$B($%E4Q}=fl?1tiYy}gCp(XO3<`l}!hQx6P_8fBXrrVt zc-6{4L?-mHq&q>ks#5E0E0oEoGVA{66I(5T!e&IUtfkJ^^3*kVcn?wrMmZcI-m=i5 zBCn=EL1>md!6+5OF8g2xRC$3eGlheaNr@B!+j@ELrs$J-u@PRg%2C=^`zjC@$8RJS z!@T4oPR3!zUK_Ss-Q(dt8}t1{W{0*TEprVI^4uYY`&Mrj-Q7udoEE#EGY+8}1GCR( zB1o3@HK3+3zP3(WMK(&RRqKkAd7s$#=X<-lZFREdf0e~sCQp+f9Tw^QlAF(eqLOW| zY&5K+0^`vbwhyK7$?K!uKiQ^4kJA?hH?AI+W3o6?zVX7b^oqK)pDu#?#Yw+tg~p@t+V@_6 zr;(=Eav3D}mdfDwi?$bxm0c=3j^cVn=nNzW|1y8klDdydfRbki6pk4ER+D;|B3X*qYl zwI_Zh%Nf838UB-&y3}B+uLt_gd?VY1Ce2J5Lqx>$h+5gu@mEx)X5-Z+hx~lJH_?p& z3#*qr_NhekE`m?=ilQ>`ss8A{WtRGaCW?e*_5Mtje1?DPTKq;{o3*HpEtPgsQCm=* z0>`Sw%`Y);D86ts`G8IFgjPHD?+4Ww6NzZNfmrdZPiriUv zk31$DDm$wpVtf8$Dv-K@!Q_*+FX8%LgBSL-y%H5@x=Psc8SBq-X~B<8w~vD{7l?4~ zU?+~WP?owq?Z(fAI96=rhV1F=i2XND?jKTbZ5pptB_$Vw{Mn|>K(S9S!P~Olk%PHR zLeoKy@=}Sqjg>Idk=#t>qP(H~OSx;R-$f}#BnM(b?Zf_p|LN$DgU?cB^a!@m{l9zW z;(l$x2(a~cux?|_y*a4V+_S*zY0E-$&xB5OU8#Xr!szf$E=AH0-PDsqMV zdkLe(9J0yE$Xo)7=dmVkLbzsL(ufcvWsWtXqh71)@K_Fz-~M?%vVWuM?eLpXTy_m| zvc!;HBo?HY1)bY6?isUX$~QsU?vI3d<=Ym%I<)EUrsEhc--`Y9r=m`d9IG`iu37xk z3^w>Z_c4YwWTf*gb2kCr0GH@Vr;!9#vdhHG=A(Bp8D(`vPk2H{{Z zRdOrp-0XMypPKioSJnn;6&e}pTD!DH$P)MJ2Fc69{sDJaH~iQs5Ju5PrIOG<`4fNg zNQTh@G(%s1g*NRZs~5hhA*#apj?2jzkRyYJSN!iAOBa8e{8R02%v{nBf=DP^@R#tp7C?kFuyxKoqO6i4!wrf!bg62ZaeN)v)$0odI9Km zR&4aNW9zF2`N2WEc`VVs_@W{kE*a?jSK%{kQF^=1rKVe{N+RG_I=2Bz{+UkO>D~1! zn^s<9=pgUEJ;SpmUKF8~=eU`#CvU=qJn+^Jd4;{;0L5S~YSQ;k#=lyxM^R%$(Y%7w1W8l5@=qA3*9d~4W=u8Z@N8an z3X2h!{lvUaR;ve%6sg!)5U*pO1@UCer^WQ$9wuD7zHfyljF118?^Yg66p-$L6Ka+W z$w@Cc%k&JmD(lR>)Y3^rPO**pKWE-N;Sm=UL6C^&PDya+x+mA4`>m)zQn^JMQ4Lrs z!cXObYYIRbz@gfg{`v`vkwIo9(@jz<*{l)-6yUec!uV?#+a~Ym$?=J@vCKwuG3L8Y z9R}0X{MmjfAK#L}4O>m}QGDfBQ;ItM!>Im7N1xwNmo2xJ24(e3@Pe46DBm()Vp{7-GXiLE9XW&|w# zBMdE|$XN1Rf8~(|kHz?6QVH&;i>7Cr%C+q#DX&hz0P9`{)da6~EMtGCqYF;s=cAJ2 zu;dM@ws;2Bn4XYev6X*;W4SR=^emVstFA;+-`ly$Hu&=^75M#-3d8Uldg>DmQbMEj zAh5w#`7lmrf+69Wb|@R?%?%zG`pkY2a@$}cx1j+hegLVD3M-NW$6Uy-V9ik3&xo9( z$Wbcg_<6+~9X~1OxWBp^C}c|O>G(eEs#vKo21BaoZN|X zsR3}6s|MEu8g2XY@NjmqDPRRrBsJAGOb|YV;q`&o%TAu*pG3SgqInl%{QOEX7;N|2 zCjRPpIK)JRz`}4$2owB|AX=NWLdp6o{1ew4m0nn&iZ(*yRkCc55(5rotg83<~(^B zJy_-`l!7;~tD)VK(;c+26;!SKJd$rIE?C6SA=vSDY+OknX+LTSN2$?T))UeF24uh=9gWe>cbTHfxIj*mJbptq`f)sf)iD;4k0D`Jo@znBM#faNm zmySDl*%0FNF?KzIU|_hhj+2kvn>kNr4%4!+_2n*}@4)V4=okklPrV)+I;OKPdS>0* z=rU*UdOwBbcg5l8!z%~tTkJ0)PGQ^`_K%|C-17vPTwggDIZ+J`QSB7wB$4q=kA*QGXeELN0%WWd8KvaaIS1HAK!K+ z;C}*DCfYuC4ho%+DO)vZ`BBT8I+ei=+Fxzka#n>jn*v~Vqq%91>&PQI=7?pVIsx!` zV6r%-@hW6Zt`Gj%$nco`DJX`1*t2HpVU~sZ=P~2;*29DI6QOgUq?A=2^7J(4GfCtq zD^T~Wf&9Op`oG#ae?&x`J=CpuC0bK2cF!b?;)2bu-i9@Ei$hQ^t^(zVj8~bkfljC= zk^y;APH1o9@5?SIa-pcWh=I;5D!mF1bH7U!?G zHe0<`gEuP?S~eJzH&mfrpyiJ%ZiNJ$u~3a$%Tz(S3nE&{4ydLc5Iu zS2KC(2VH^CdlKLfuUYcEa57|C0t&sYLRBNniNw#xvC$e_+GXOQf zw7iZhCL=WMG9T0Y;}w`tt2KGf`eQJ7kPIE2&Ff*Qq;x0LNYrkn^$YPX@()Y98v|X` z$Ql_?;%aNJS3}ZNNEf+{#_Pi!t%Uj3na{}a2kqm^J&|)Vx*Xp)ZS`kpi4wY1AgZgW zH2Tb&vYDjUw8ws`>7Sr}SY}+4x=Z88vt7jnq@Gg=liqcWxq;-HSbCdys!*2x*{GeG zR1T2I?U=};JxodON|h&oK+QC>+n=dsgZ*_*xNGRsqrp?3o=ZpPznl_&kvb_bS&6x~ z$zd%0Fv@&lamG9a(cRg=U$~dmz+JDJN7{kHY{f7RYjQnjwAJ*Y9ZI#Jx=_VBxvLo< zmaUA5$DsDB=;E$T4?n1nAAq4lysxs;dHQF=dtG^z95C`#Uv#mHXm{e-7T955bsW1G z4f`?TkrKN1ytH$4JS&<+@Ugo6rJRYvkO1i_TO2Cyj_aeC=2A3uW3@uo%=u&_G~Lk? zq^&6To_I9obMwAS1(Nk8(vWlMmaX>NP6ifCeSZR?P(O%Hu~ZbW%w63FPf5N^sT5YI zSvOBf`F_;nvx=!I8V#_0X|O{Fhfi4Kw?BB*bnwTp`D}Cx5f~6^YnGskn8OjL@#+hy zq@eVccl<}y{)ak}e6WsscwN&Eir;lbWY8RenYFL1kx~u1w9PL2N}9^(wF-MPQWjaa zX$90v*f~`EFKBdQh+{S8&_FvJ-ro!kxN(tcvu2HS4vmjtr*tB3rW)WlqpGGWCc&&} zp89|c)b{RBBi~9VKfgc-N_^~-sh~pYf_4gkLz+O{Z1uVdfDG=}T5WJRn~Uo=fM3LD`uasj6zR%=nn$eXAYqs&FM7J)`S_Pr+J96a&Q<{G ztWntERlY0|9bC>!O@=GnFPRiHfuP7$$8p+wVvY}>$h2p0|BI1B3HU(@7GE5%OWJVR zaNzpOr+ktUngT~6)RWi{c9Y^7o$Mc(sYZ`CR-uZ))vF@naQL3r<+}gh#$0{jj}%0G zE*?!S?im*s9S>ni#u&uq<*ox_i4w?lXSXTqCc)= z+14C{m~93npFJFPc?m{SVJ~vqh+4EG9i812DJilAnTqp9wIUww9m-nE*S+>MJ&$B% zZDRjO(3NfhEg6AvCUuXv(ek9iiay6Z2O5&vay({eH5lSj&pqsPoDS(3;bYp3*00>- zEglO`C6jp(M3Y_ZU8dKYcVr&9Vke;unM`-UU-EN!VY`{`fP?OP{mLb@Ig_|&S)&J2 z)0&T!9FpCU^Qfge!O_T*13$-YKj26v(1DEd=EQEz>c?2nO8YIwU^j<@;62)tMjA~U zAB!KO-rOsbYCeODqgEuEM}~{p%PE&pfs@l!787D74WaHjb3=^iN$j8@-8aQyT03H# zK5jih1t0w8N^NmQ?L#rr2z8L#)mwdRi}vXA*&7T73fg{ERVhj+~{fF^&`B~IS4de$8omQc%Pu)!CCLHzWo-!>dM%}i zE9rI|sqJ*G>6{Vat4z4fg?qOYK@?(@d`#WaQnPEfnJy>g$ z&4T3mzh!2Nn!{bYx z8qW_Bnz%OT@rdC&XD+?%d>-laoKk{HvVHb%3r{y)-E}?ucV}o73?FP)0=F(hnP?K)&Ws-Uvam;cGIsaZrs9QkrYckYq68@8!{k3nXp-j|E|MCtbF(YLggQFtomo3ph(ODj<$>ZZ|=C>sdehS&B7U*U7UUov8K={RsN$GObkh5+t#s4XtSIl(3GfE}h@YedO!ExZbW!>j1}?WQrifqth2yj-Eg4M0 zAM|1-zA5MvdYu}~8Z&)Ift+`0q*DhlonS|UnFl7r&MH&~yg>gVE~Wymd)ry9p=8OI zI+A&rEuw8Ukjr5TnK<;YG z2Z#vWv|Ps;B!er(y$zRjW81O?O({oA^(i9deq=MACl=1G5IA+uI)$MGGly+P&$i`>A0O^=)7Tstn@X zxAU{r_o5?Zr_c!RldOa$pBCF!=lp2xTv0oFE&}mY`GfFof19l zz1YDu^S@jlD$L3De-z6qd06*V1N^QnI!D21%Ug3kcqukC_N-EtF#IM&JAx*s3zI=^ zk)rOzGOZu)A39t5{4T>JBa&3mZaQ%6Uj-Lbnd2F_usDA<4^R?$2&3Qu4rNBUg@Ivv zHvYUPoTQJdpZwQ5;3+w=;`iN%?Wm3#uU2M)zMniSb>~PTqzvFFzQ+8BW1L>$CZSOL zWnwg_hDB%nzyl@zn)K~#^q0M$)&oDX4swsJD1qTWZ6Y$y9+TV}=l?QWJ30dgc=PLB zhe!Rg7Hdzyyog!U64X!T6y0vG7#fnc);u2Q%IeeQKjFLCTI)zw=+M456s7;_z#M)T zmr|fxL&XTOOCj?Xl`O#MIIi{yX7=K z-)08Cnv34^<)mwoQei=>bYa5U+w7jH7wwFSF|%CnLyU}kT`MVSSjCZpal6%D(z!(r zu`SV1R&uM=^LaEZXE=9~+#{iw(f*b028yzC{T+=vPGG*iKJ|v6S1!}BiKb(^d#9UYRAN6P`2B!JR zeqpOlFhRZnUG2Tq3ZDcc{34j8 zK--zwrPM$>9NI&)7(=Y+3??X{p-Q;Xi9TBYE|1Ix8Etaiq-1fFpi8T9p}siPi~( zN?-YpE&Z=%<0KRhp6>)YsBnf}k|Z*i2^GGa3@fvh{2dXkeI61M$pI?Yx}9mwW#O&5 zr$w!`4%~O*f9LQ)l;xDbcdo|64LR%A?kvoHN3wDFA@nYXh<)z|&HCGxQ?_RvL_124 z+NTmSEqZA#IgyFBg@@;9j|y2) zy$oju%Vig*&Pjwjv~@x6<*RT4oivUCv1$or(+gw8IBF?_|0sA2emU&9vNw$`=O|IE zGm9f&Q$!F=;hrnYaabgbkQHDDc< zUFBxe=BpQ=uAl8_0J+olicj)Jz;NV!`8Ny~>Lt(Z%=0w~yEK`P*QqF4ly^k$Bj-&8 zT9$w^w*UD6@I4#FBp&J2hbLg*lzr%#-q8Z+EVbs@H3=zaoCraCrA^}@U z&5El?QYUkVl-%W%lUynpLb32}cm6o=X?K!U`aF-mUlticU^k^5_xka92l=ESB&SMa zMf_ahD?I3rJ|lBB=@rofHyjATt9(Rbvn0>9l#KO&(hMFQ&QWMJ@ z()jmepLE5ou4y)e)E5(wuApa}8oJS7Tc!QOrR#HyVu6%|CLwEg(rv5zwb*E+s8wMc z4j{L*_B+ZZ)T=tHBiR>I@nds{g$Xu>&ZJADYK`SUZK}8!R8{mN7Y@LAtvpMD8* ztKMCAIKD1ykL^`JK$#WU@k}%W$rX?OQ^1wvQAiGVnQ(~?*oFgatMdx8X7l7FKJzXv zAX8ApD<`Vmw-P$@0+8?`mSpgNEj&b~YAG$p)DI9qdYfUj=chomIAM+NgpO5j6-w5# zLIps*4*)Lz+Q#)-oTFr*shVD_2xiS|;PHrd(`c1FL&WPRoj%}llY>e}pQwedDhNH^ zK)9)OBe?o@fg+R@!W8uAU*_FS$*vgAD@!bw9h4iNwUc zI!gGaMpEt4(9D0<9vAqWfoHHY1(^T=LN^0K&dT73?&Jo1Cus@I|BO$DqzC0vdbpGz z{Cv1rfRUJQT^EAr`(<`%JZRChK^44^{#v(yH8ViKN*KG&GFS`Cym!E^@iK1@8xZjD z|6H_ODjqr=L0l`|D&ljm_+V=Kps=5o0kA-O3T>)GmiU;>IwwYvLcR z9nE|ltRA#?5pk3qAe_F zzBT%(bhYmbZAOD-RoO3_-HGt~U^g$Vuc5Xroh%kQyS)ciT)T2I=wXpHt-f!C+2(|9 z;_v<;njZ*T;Ud@JGkq#%Stm>PUxa*3J7#SQp7F$^?>;uIwSTd-;r(G9wT1o&gB{yD<@ChO2q7-0P5*&!<96YgnKT=7~ z=*${1I7__@QgUO-i#`r*_(5H{cu@BPjS|w}EV`>2?EcXgXKb2IP)`cOc@)kJ9xdyh ztbYx``2)dbhM+ZbP}{S!!kT}3bl)4Uz{YD&jG-fDpAxCK$nEQ#?o@U3#W(q^X`6jnC+}7Y>dTg(G{yWps4V(F3*x=KYS@^U!y%(YbV> zt0Q_ol+yjfGzs<)KPUEH^Rd<<^Qr7w{NVtb&h@xwRZzf4eZ)PCcDTi_tPFEc=fHWj z?J9rj6@(}+#HA^>Xxh#o#MqCfo^L2gUDj<&!?a&Il--UVz0wCaHfz!mffNR4oN@q?q=$#V<>iKp!}LH3yiFG%g4dmnnouVVX~Tgk^h#Yj_1eg;>{zOUZy zlQ~(q5hWTZt3UIV7|Vp44Vq4hm&^*#IrFy~)M$I{9+!^u8Bc6%=ol?CR#NEJ*(rsx zNl+X3)#B(-_SiR?!XBF^8j}_gDffF~m^G2b^w5%|Hb1n%r;)vCh}Ha@Sl20(DKB(& zn=^XzSjr;31RVka(k!aPl1wyh5`zCLwL4u5y7H> zbEZK_O?{Lgav&jo_JVlPPiFPW_Y81mBA=95ri7#YO{A0{qVmV(!ko?_nXBG(HLWL4 zmMk0T4bSuxCMGyT_x{!Oo@h7t=!g43#v&pDa`HvmyL)spPX6r_q4TP zKOPTaqqrn}byG=7dZQ;1I)bLw3t~tBbJCj-3>XeINcryuA)$+(AL`l4emh7c@BHT@ zMlX`UH(>WQv@Cqt>jFpDh|Wl!?B>ifVxg+@<)_6Lv5TfAp@kflCe6A+DOW+8%vv;j zN-Q>UF2t574OhK+>p}30n)U+iZToLF*W-@ZwotFN|4TIH!R;x$2LdOuBFe;_V`J6N z5;cj#CQF;kkHp?#!;FRh4|`wz7uEB=y?~&S7Tq8v-I5C;C?$##OAAYbNJ^)mbT1uJ z(y>cO3kWRTOM^%^61&v0&++~FC!Qa^{Ko6d&diy)XXc*!zOL(}=o{Kxi-hqb*jNzV zJ){EmB8jn)_U*ejOG*}u?uWJRgw&SShDdw$W*J9Fy zP9Fr5CBXt3&h@Y{oSPS{mF@DC%^w+^-RGkBoszX|Ion3FOm+fG9bNs7=?LG@QMC z81@)Z-P@pMgDQ?wGA5UD1_) zLmygs9a=Rae5JLX#cE-gPp+ZP4dLDUex}TM3o4;s%nTH=2!Crw|c=4yA0Cx4(wH7n@2d*StS3ZNEz*0!7Yyb%nOokr;za51&&XP=`|5rVcuFY#I3S?!Ak)a@jCi$Dx-XINpa5z3n z!emTjNs9t*1rk9;b;An)2R57?UpQ<#S{bl86_NOd@eRCCfa$!_16Yd^hD*CoVr2be zGPp==>sPpkS&ij+U zESfV<*C*k4(;6NN8U8_KXHdkHLiL4j`YvGYx_G++%&k>O(lnEyU7d?^Dj<|$Cap}J z&bu#>vyMTD+jrHgP`=~&DUT~f)7#%I4P_nJbAdGP`UcU$`MP-fd-~Yb6=+J;RXTc_ zA`mTBkX_^suv?ZpW}V4(YpAdB*xu?(&YKTFE*_gsy3Vr^W|N#y0zZm{uvQ)9`g#OXj`_XPn$VlhGYB7 zr7`|bU03P^_Kc||lV491z{$5!&VcPUF*zjhvBH~#c+*- zPwZvFnk*e>P-o6-zsVbMNBM=x%nUwjZWU_G@bR>3OD=+HIy{JO6U@^24AUs(|EF&d zFU^YmRnCmyB0(<{7qn`@+&n=4XU`iVPOn6Xt)dh)@;dFP@(h@F?(0;k@qk?xl<(8* zh+V}x8Vh<~16Xf40uJ^Q3p|V2GmCFaA*N?v7#(lD zq_eR#P9;*K+X~goxO0S)sQjOmsfi{;UWy`3$5sD@M)xQPY?NzGc2MQ`>W9i!MEC8gied>chZv9)(@DoZ? zt@0;|ki`(;WOvl^TNGSkmMT$CCkNQI1V(@qv0h}jqQcZYAR~}q*{3l5undT{*A|tR zU*03Tv&$4!(oYI8K-TI=+2=zz>fOCgo!VBj!ED@R-%?EL;N)gSu77}oV8Bj@StbVs zz%49IzuksljlIpP?1%J|vfL>V)`rg@roB%_ZVX#keN@67vovXv7y&?et~_7#%>UL` z9!lpUQ4|wYa`Do~|I@WBf#}dLAe6l!gAuo?F{MY`I9PEbP#5pK&^giW+Ow$H?Z3|q zx7PexemY1Pu@=+d!-+j-Kk8_&^YqQJf@6R3k^VZhw%09JeY>>}c;b}m){cH}*5B8n zH+DIA>+9skR+ZlhR0qmd|M1i`P=Yzn81Eu0%U2#jZt@YYW$6 z2?1FXo502`vaX#`_>J){A5_edrok^|1jjcauR{&4c{8!_Ku;(U#*zWh7?*JK2_4hm zB|25+!;2gS5I)Fky!D=;LTR!|7%Mr_)C4bY&a^9h0_+d{&)&4FGDcqG{VW1Tc?~@@ef97Q z6`6R6^4RP*g9zu-Z&hM!3Zg@QMvP>r>@1nZ(}B3ttmTJb>m8I5lLJLNt{cegdYI=OX?mfq{IyB&+L1lAS8)=pn`c)@`!011TNqliG^2!*X?@nt^8S z?Sn;K15Q4&#cUuIm*lr}Qf_Z%CEc!X*b`e%{oeugw)6)vE&Lxn4EjxPtu`D~%1);- zGc0ZOZMGkX)l5FIhfF!9g_S(+F;GC$sdEhh4gzm09a3M(D&5W~ln!3rMd&WAfOqmd zX|4u(>jfci# zo>h4wS6S38%LmM-nHLayW2{5b?~-NN2&02T?#Ef40YNcZj@J7q;fV(d!`F2-huFAB z+h&-=tL)toUAqXp%{n^}ox%ekh}itu(U&9N1cTY?>f_7=KkkhDad(XTSR6qM%fi!4QF? zXkIH}*+v-Q31Fxt&=&)dz&888x+Rsy>2HG^3<0?DnkpBCjfX?Fje3*_muBi?{tReg zF)ksKdN3+*FlJC)IkU`0Py}?cQiNHbCvaHKu5g_`*N?m!NEH(v4r_>7!bDY+3W`9} z0IydF`8{ketn3zu*m}`YD=1jK*vL9EEFz^Pi6Y=e zHZcGgCZKg4+hVj|n0BhQ$paaIz63KXx1EOf6%7xq7y>BLyDFLHr+I0~`t?sK6^v(x zW466BmCNz-x}xi0F5{$WH!bTa0i2eib#J9#q}-?h?)nP#(yMc#zBPx=t5dlpPuxU( zr3on4Od@PoEDku^EyjJectZvHiaG!i=%;=lp2zKq(93d$gx2|K77C%f<0@E{V1#&S zWOEE2O4bk}k&~8}j9t@ZNuGx_7~`p9d=YggDzR(<7bEc|-4!6B`7&8n=lC*O!gloa zy7|S`K_ALZcY3Y`U{b0<==B0N0YGQ}x7$p~Unl~k-}dZzfQ9%aSti2Gi?o4DhDdtn zzuS*`wZC4G3Z*rmN-@Coo(`Zjt4+Bb@YIv|(ls}mCUI^v&TLydm#QGtARM-cUDGgeCqV714rI6*+aoalD z8{s|NXilUNg`zp58~-Z|$&h2YD*EPW8Yxu5PVo8#VpwDH*-fcs@3Zu1qjYEOm)S#~ zCWHu~-`kvQ$Mu0rU^!s0&K&F&tfFTO^S)$}Q3R>XI*h?&Lzmab4s9~3&8^_NED z$7}!{+0d=2D%6r)W7~p?_O_4~Rb_#0SA7933;-ZH=ohUkdjN|CQp_$&2z6(K*G{d| z{q*H&KKDz25cHgISluL8=^H@qhOMaa04B@Ub^=mS9||pNmEQampUjYgmhSJu{jZ z2Ujn7wC;gF4uTZ~+pk>}<=qyMSW5k$G_O0Zu-2lc+ze7bx(-pMp;R<|k~6XCNGvWeIOv^=6hz=yR0a*h)=mbEcxXQP?B0a$881$zeOTUZ{WUv*2GzQPg^;xns^;hIyb(D24{DrLS( zuehwiBg9JlFQ6?`V*BlH-WUG91j^k}g4nyG@6uW4C$M>gA@DCxbjAs#y+KAVjb>j80buPf^lx= zcvouQHd|~X*-fvDPE1-HDIw1U@`UB3KeFZlZr+FKzWt?kZ(p9{A9;AGFml=TMK{Og zrl>m%Ep;524+efYL>4*c>gtrFutOJBwoPw8#eXxf zfrhoR4h-@vS;K~muMYhLEdxP;Yb*V?NA&GKjqNGFR0n{NQG+ry!=+;G`;uqrc%Z?Y zf)zFU#CDrc@w`BCw>&vp{|M-Yo)lf&qGvJ)v|)76m0YE28b=R2-Ks8xF2^T^@i#b_ z%{%~YK!9h`%?V2ujli{BO`Rzv%57#`Z2mY~6Cadn(MX|3jNm;1noNrH2;Z*p`ybT-XD>W6!7(HvMW?&g{D0&9tjW1*G{sb+y~M z9;E*gaRAc%tD=%IOW!+E$sqc-|YWxrPkrQQy2?agj@YSg#a z-+3>Nl0UU%JSD1@YgRNYSTl?t&rJUD8I#XZ)XdoNu+Cs5A1NM0s+`o&A5FjU$KN{v zPXS>ojB5=m`mO5|OJ+l4_!u89qHi!S0wnXTKR|)uP3J2~UEbMKLsjxU!h_KARXCQA zgJry#Nn!{T5bGv`;3E|mn*W|b4B)1G=hw?=kynSa&tasXbnX(-_9=6J?^wzh0MDVQ z1-Aq+S{=^P7y<>+G`rq%suTOe8YfJuF+>O-?gH69OqguUp`rne@)-=a&sN9%SRcOj zQv@j0{bJP<%b~+qkPtJv4U8GSHW+j&EFhX-W#N5W&7f?`_tGxNd0GVy1&!WPtq^c4 z9ybsMxAv+5IE?y%JyJu?x}PlSM4+L#Bu0d^k?LX1_`SH~eKPaHAEq32KXc#kfhIGo zdV#cS%yv@`)pW&V=r5mOZJ-SQmMVZLgH7UxsMLU7J7GSEG&GH_wki85+5)&UvuK6~ zB(;P@z=Ydm`;hJG%C8y^=UisbCq0h`GGg_t ztG<6@p9)ijFWk``QG9fg5*1kfq}CM-)TQuT+hfp$UH_9O`Ll4Kn(lr|;(twqJ%d|3 z+t;TAaFpS%Bp8 zIDg_^Q^K{pJ?2yX3;>qu;6dP6$w;F{T@Z-!+pKV+oM}TgV}5G8Iq+&via8LdlsyFQ zYAfTSe?VE@T}~+l^qR22crn38GJ2`X-9mS|9GX_31`HcK(u0ao?+b32KF`qW-s+{1$;Z&PXvn2fC-a1BD>1&^daxiqSpX5um)Xv&)KJ$+>W z@4HC1Jy*&hbB6s*^_|CM&J3g=)gvCnAtM0>dNgcqDsndaSyIwb2$ahpQzdHMOAeM~ zk&$>|D~4k~$-B zjU)vHGJ5Y#k(jmKi<$pxdBUwi-wyCj#0xZ*zBJpBDgss=oC9ug1~55Z@cZb=8vJ(J`CWxx)&NY> z;d1aQk>n!BOLcEtg1VS2;&OLuokOqEX!0{APd}FyPQQ#gCb`V7^iQO|sx#<00QT7J zt>>lS>-LzXDy3wfoN5!~a^m4>46$7ZDa5!Ud9i-ZtawrDF^1D(>j4Np_N_mJSu8-) zCkDd5HtkBF{&p&`5r6q&^Zb$Z8?T-o9qf=MB$*#UJwr!DxZUo8vO z<1DmGuBOXXY)mn#>pDDZRbzyyDu19$oFo?$L^^wXx56H;}n{EYeUpRh# zV5MWgT>6f{ry?G3E#XZv)4M*3v%)pcDach30<`~1?fC_KQ%aV*@EDo90Clsm*awT7 zzy{5OaN({S1j;`qZ-dO>BMYeuAdlr`gF~qeZKSEwWSn?VrRxQ%+tizRkppH^7U?)0 zQ;8_55cYTZwmzK!9G0i}=pa)`)1ONxdLgnX606q!bao}wBSAEIcsKdYDqRo2H=?h6 z016C(c>uhW)DU6gvT<($eN>slEr3PkHS{4UVB8=jUEJq4`y?=bs@jq_nW)l93mjwc zoCOlD>fcn$w@Y;fFX#W)et|BHUVF)ZP2=Y@RdV<&13)e!3(R%l85MPhw)dlBNnrDt zxYgQM@5S8umTycW4Lx>|JhKFVzJTf#6ai9;L)UAK) zp+^9ru1F~bM&Dy6gkGZv33;7aw99jRTS&0>!yZYyy!48yZF@}s24l{wlpL+BfN}#v zyq{GXIruP3nTLC%qIzmRwfKl}+qbK){fcA*pNE1JEJBs9aa+;(rV|#wnXjW~rW4vS zcOhA|p*va^ zufYu87gxhHC=8s_dGZ;F0-K1f-=)tP%AO=3V+7Sr&;T_(_Ra=AKwcf!rGf4CC0TVO zr05aPS;|_tS8{>Y?2UXP%^(GeCIdaTi~4#(lEthUdQy{#B?pNizgGGR(o{jOmEQ}& zCYRWHX_F_ThghFfZqCZc#89VZ!Gid{Dod|wQ+_bSS)zzUEB2L$fUku19B#2n-JiM^% zc`o493k|Mmd`>poLUNgCTU5(WwN1Ge?%F5UU+;<8opvp41qG&k?$Fov>IT%P{Bhkz zThhsb=$q$402e%05wc9uPt_V*NgXLRGwuzqn2s5K#l}tWS{aA#;t#O;5ss#lxz1e6 z=jdHCI{ZZF8p*1D3w5rPQmJ25XP&+!Noc(CK%LYSzc@Ig;h&J+$uuDAb41n`DI-f{ z5pzF|^*0)}F5cLMW?NJH$I`YxF>k(Q2`W_xsqv9aYlry=74@3P5m{6UL&GWO#L)fS zRX)t_zeM8{hJyelor}C18y6? zKEn?d&U$kpEH!;q2?A7>XtbIj$rIbRQt@Op03 zS+s+u2M{Qd2170@Tc+sS9$hf@1(B=oTz>r2V(+%EUZ|dSF9|Od)tX^&>;#@XCb`fg zMn;tk9cL{e@S_wJ!cN7wn_d1A9_BkH5RmmJP(9Y8OLFv87b18F;=K4r)yLrpTP-EO z;_G*G>>ss+8xNl`-8Td9I2xN=>grzNF*lJlqfF6hl<9i2ow^q4Yg}Its~ds zavs+Qdbf`Yom7|5fGSANoj5?=u_(o2RUg3SWmMVrO@*b$mMuT85&>CBi(P;h#}X>0 z)7$;gl<~N7FtYtRsHZCR0UoVYezb)vd4G(LUKMUk`s9(jW8}9w)&ShY_yA7`=x2`V zMf*b9f(5|q^to|i3CO_+D}~g!wpN1PvaodRxsdn!U!+qfwchgu0(TqrG}5Ap<^dq@ zsL^^VRZ*TCFCJu+?Q0lsu<#&YCbMe{NhLxvB7~M|k=SXhntJy2H|k%;4?wOPZ>Q_l zmKR_~Ex6xlLD$r#{JDK%9W)~U$>9)M&QbI^fEo^w4Dp@*THQT$!N(&%NvS!fS?})j2U<;d*WgMPk7I6cRPBb& zGGA-rIr2a1paJxDLgWAulte4DOM5eIJtDDm6VGjp{^+{{ETN)2b#ku`?(~@5#iQMO z!p(ifjFUh2G%`-}*9;K}6AIcGy)nOX0#tfPA~CqOuY6KKeQYcten5Tw6!j)#JN+7` zJCLe^F2X^)$&|L7_M_cCZ1?154n43vQoG$(5h5A@)M6;e`d#+6n7xl*uu){un(7r{ z`)N9F?eH?>iJd)uM;C~d)FNB^IiZ~-CkDXi`0s(i^z~k0$W%CNe*i z2$fZ@CoLw-QocyTG(b1q`(np1CozH)*Wdb|ZOtWF`^e$(0fNoGg!ZOPm}fZLdTpaLj5bj;l46p)ZXI*$xQnIQ(F{5T@|%%DmmC2y}yOC}O|W`Pu?42YIa?8MwQ6 zfDYqHxrMw-EAnXdyZV4jXbMlWM!i=K|I3(K`iA>ZlnK@eo#!m!7Tp=CrBWE9IMh_Sc*R@ z7$U6;tgXV^C)FsZQ3n|4^Hb@NW1MS<0I|G0Z_&P8?O0j;51uGAjZaO(JXrTXd3Z14 z9UZE1g61VLZqYNox05iuiwR6_rBb7%(y>M7l6k<9WT+|2m<4H}8S=sU{HX1~&qJM! zmv~|{^F9{;h(YJQV-2L$yqc!Mh19QnvboP&scY+g7y^<6_(_2L)f50Uj*3H-Gc>vT zI;Kfqe_Gmy;ES@5@Xsw@-LP=0=cQGT_~(y$P<=DwAf``y97np3&DY5MGzPZQ_8wz>|>%jDNqL!lNyAK%@< zqb;?yu+A{mlR!3vJ1h*FKD-zN+eS0$zHz&}J$TxBQnDK&U88!)zW+}(fMd`OOJNzBp5N=xxm4}BGe`OuLRaK zqZvl?l?RYKfirRJ0JC@Y-@>k{5N6;}oGXGy{3Lak)MU{$cb%q`emYJ<|qS4VqEbsnMbPxwg>-58}Q@Kt~5^qZsv)H}cZ3dR-N;)@oNSur2If@-z@ z`pDTYuBoJ_Q={O}*X)Q1uHnG5ivZ;6wSyee(j|l@02xW^$+T}a6Qt^;5rpP^0iSz- z{rcqHW5c2%vO${R=l8`3&>8J>zz${4@HL)NsSB98#wQ8iRQ)V zJ-$r1iv>14%?sy3|4-i$#pEnoNIB_1HI!qcD@oe*_Eb7ZHXcrvds!|7Q54IZ*lKjD=}Gz za;qF1Q5Y+98;~Xg2RlHfueRh%?%;kkzHgF7ynb4s`jM#cYCPJ>zE3VA*zd`HTtVqt zHME$c7aE;HnLjU22Z&^zSObP@bWHu^Q^7MU+F{cBnM2?C6jR5sD%4o{vsR%0O+=Oh zB)|SG$w53oJx!4Rl6rQXEL7tSBoWLwJo(!JR-QJVxEBtH{z|ETL_Hr{LDE;I%ikeE zya$x!?DRznx)Pg+IFzqa0p*8OCrXB%DB$%cQ0bwy8+-Oks+c!|3RiQO)O)Y>BuywE zt?%9lIcn+`C)B;q_lE1Dg=E9MfMbxGY!HR)GO2fX^F&RQEuD63=?!9Z@GH5d+#f>g zW#4ex3>_+~4zcreOKy=hYxNPbwUO+qwYW9nEIA&3-pDqPD=^hxOJ^K35)sab+eem=L)XG+II^la>cXRu-dtHeNfbqY4Kx*MpI=&x} zP#voBbW(g*NG~aSD+e8na1uyV&d{OpwMFmtlv(lqlDzwcomomRkwxSFS3Dr#7O48f z_xMH${t|OP~1( z-jOlDi4jlfUmbuMPvTErU;9_dIQ@ zoB#4(IKBmxr(y6v2=?AaQV==aAY>~ZVezxjv9};kKrzx)!q+t)t1#ts}pHQ8VF>x9S z-hG9?4Ty0g>=ewX#zC5*a_Nc_zq>Z>ZHf((*?;Ry=N|fz)n0vR?>u(NLsqPz__o%@ zf0eQfH)QY{%-c@ZhY6XY6eG~x1@ZkFef&>VoTV)J=blH&dHGtax!B!`8@_IqK$3P{@%Pp1xT_ttpM}i! zf)dzIALf0lf87U?2_m_7$jU_#9H}cm9%R}cZQy*m`&W4AesEA8^xBRVbi92D5POB< z#zDL-hwFMTxE`_uzgPVihgTSLdx}`M93=8@rG2fLPS(6eXrAJOd+-&nk)4I0{~3x@ z=b=?s?U$LzRt~(^G(bbd5+3zlT#7^Kjt_HfCd2RwfpVpf9kM#&IFG3YlVk<#3wz@p zzm^AzmInU@M3tLAvue)NtTCR&4$y(`0IK_z!0@FR#2vIntKKgz^OxHF z!X5|hu(1&AaNZg2d_Sa&_a`{Ly0`B$9uSHnnw(V|n$_jJHCSWjvGzdxy@DSg-mm$f zl5{j71DP$Jy}KCWQ*|aR_^|%@J)%i^JlfHBWe97!OsU|@alTX{)08zHK@yLsZ!dEp zz{>EtKbg({Ab08(9*vORzyAwqYwJwRJo-lR7KiUy_Zj$;&8+6tnb~94BaHBbBmt@V z@;i2;R9L{^Y;M_lIj@TZR3N`!D@4%=nH>NuTLlmw@sBa}!4Ep=_ z<0O&(jkioee}Eb^oWx!?>u!kW7b#Bvtip`{+$Cf^!WRM*KtUd%9R>pfd1PU;wJc^6 zBa9`>Q2bA++r&4mYu3%dgVP3wrgp6$ec)>jxt?^j#z&&|BscpBxT@6v{yR%hnwCCf zuVQY>2c+1bi8454Ws|=>HpR33>iWp}U>8$G>#tD_d~5Un{{C+S{=XW5{_%uMLz<;$ zl}WwfzAdsXL#wXE0%hQupA>t@#1&|xfkFhgKl-?fmQew@*?(eF^`(7pi_y*OPh>5 zRsjNPTDmtdQBi->+1|OhY}xsE!^|5$OQyv9cHGy&;lCf|AJ0%Xhs__XOwYrmbBh!C zdY^N-WSnAlEu`ZO-x;d;R#n~q%mA4^ue?Y5y+-i3W_J+=ZF?FYYuxeFJ8psTq6OR{ z4!L%!FA*GC_P5;%{oRM$)TBAPTh}_Tdp9`DHiS=(3e!4|)gG+ri~oJG(?0FpK>Zl0 z5;nr_#AUhexp4AfzE`%Mzbs@m``z;~Jjh7%A{WBBb)K`PjKAY#j5qR}yh>(5_^{q| z?{F0Og9mlBC$KFE4o$*-4;}tG_{8D)kU7ysDnT}risEa%noC5Z;Or~2 z7!CQCJruzbXj-h-YGq7SwBHi!ub55kg-L0mP@Jxx?FWTbjq}SU9_B;hh(E|3hgf2Q z^zV;7aZT}8Q_t3ldP(HS>)DsveLQgmBsg2fBsbdMM@Dn#51$6EqYDaj-4u#s;$*s4 zvt}@Jc{11Ldu>9kPei;Q?2#Y(sHIzGeDZm^Vn2Lj&v;iv-qQK8AME}75v)KE0seBX zsI46N83-g5=_Vj+4iN`gU zKUCeJUgQKjp#!Mxw!#P05nf{!Sr0FaFlm)h0V68ys1&md=?4t$T_;9{!4_UxdtbT4 zI&=Rz-yQx-(zRKwu6x6T)x!*Bgt9CbZv{Fu6jYUrQlAzgH|v907vu9fQnSxb$(CZ} zD*4MqUnIUlD~~byqTVlazfg(P$k#Js^>h8=1oxr@cbswDslAN9I^A`I_$lmrH=I0h z=yH}8NhfSkN>A>9+^_FWT+-L64wiH-KZG$EuTWTLk!?Tr~sAcfd*vkg2+}hg= z2RHA?p|_Vmemrk%^LPQRcQ7_g81W;i>E+POMcQwnBA!q{dPMalD!($&F2=j{3K{#I za(rFWQm?bp2`$+!M|bx^dKt)+kliMiFMCKF-14Uk>G7?9EVLF{*ax zZ^e~Yes`eA8TfH1?EHAq;mA3*%x(KkG6CG?@t)cx??C-Zn}6rD+l%xhVw4$+^t)W1 zwSvSezKQgC?dwM_FLV#9n-bA%IbUeAgl2399GqC_PsO)5d@C5Qu3KhugdZ+bG(Tjj ziXAJf{>c5be0MAMBAbJD@p~uMMcbo7VD6#(7deELPXB0pAJ^=;jcR-*vR98owurZ{ zsMYgepx?(LBMQ8%@t}PR;J&UsmwzSW?ebFhwu@uQ=w450v7N#O(q>1Z!ZRzBmlq-0 z(Bogkn;07F%7!_6z$BxtAW>038twAf*z}vnnuX-bW~fu{5!qtA%jJ2LYtG6^<;)O% z9Xm6#)`eUz^enlAN&m`%sS4b{I{{&kZ^(dJE|c1eF{kWI&HUQ^%y2h5!1VQ_MP_%? z7FAue=A!lK^Tm`MtL)5~O#~75L`3ZPLiW+q3{hKgkUa$$HU091jrW7ezhUl$tDmd> z`iXdFHn=-)0`EZ2J^z#w!*TU8nwL^{Dv*z9W=2g^rHaZ(Rf~C-6kIR&=w6maTmipF zH^IbX?|U=i*XJH3R4-Jj%DZYkP2BM(GVkQ!r49M@#P=cO#FhT^+iW2C9BJhmdHgCa zwPS2WsoghTR#(V8WSUMfd;T-o&Y6w*OV>wbn_hX-xNAYS(`RbS4Pz`-?7UT3yc^S8 z<=vwD)0gL}T@e%d2~(k$w!fBfl^P?-VHA3L!Yq*(v9$V6s)FbXm(E_*ZR^CXSNp&*hm?dSZxJBDEPWy`PJI8~bgIIXaQGBkY$C-?jfJvVQXM@tp-R`UFk| zal(c7MS^8pgs_9RD{Yf7a|CqE??=?Mi;*F$Wo!BRWB>9zjHPQS-o;wC7nm06WX8A6 zq!` zE8#{;B>?@Q%OcMd%$#XSCeu1?jM zuULYOKIAHZLJpyIV(c1md5rDo7QWWZLh^5as_VXa#Yp~w)6p7xN!v9Y`}JaN9M;Fh z;{LJ-XBbm(o~>GC?9+LY>h@EP)~mc^xGQZ%N@G`^){pU9CE`rSF{#aE`UBHb-Fy$ z6!F_><0|_iaH=5sVR?b843m~UGaKs^;ai>v;w-#&pRfJGyxV8t+=;RA2Fv^I_wTu7 zFh*d@kNkjxiAKDI#pUtS*SmgleZBRcuP#O8-c~;#CsW>T^Z2sXrTI5?>q-HrF$(8( zDf#*EZ~d*Sp&yvY#3NUSIqIuf?A_Rg``kN+ZfrS+Daj6bK8lcpsRz{1;gp)K9he=_6&yB|GWRe(pM|cIW=o8%`RkIg zShJboK`%9K7IRC+cl^g8YZ~yT%YCQa((K!&Nd?q$0{i6dE)mOeLyFzua`lOSgojge zsH>W#M6R(b|LpktIb-7UT}rp+eb{Liq2t|GY(>*m{AD>7KAj^w{ccqg1%90S_H+^1 zMiZ0pZi<(GdBOi)Z{p)GUslm=>rdS+*gx)0a%neyOm+iXs^;nK&Fr&FDVDT)K9=M0 zQvq+U{ZNU0^BqNgA{S4`VPhEMQy5xY?MX(sQ^-VEuUpUc!j|h(w#1x(_y*ah@bLzb zeP`*Ujk<`OMCm^8hpC!%=-LgiyQ#!HDn_ynh$dY3o^jArrizhTs6R#2@UEt?jz6+y zLcHsLgp=uMwf$onIpVp z$d@X2!~T{2E!T(xQSVHd$9;$2s#Qb_s%8tY4T2ZW&@F;$tq#TUWbLI0-e*ZhN)(P{E_bnvYao*_kBDhRBr&)eJ> zHnuL7;9vCcY9ZO>)Y4=4$kfm8%*jLax@GAI#k5q(c;ma6-88c0AeE^3Y2R{zMh|MF=u^)m zkJZx@^=dufyuFhvw_(2`PvsJZGoim&5SD#~yUE~aJ;%hX_Q-$wbxr3O>$?Dxx{GXr zk9R4DAZl;#s-7xu_wAiZF+7x!Q(u@F(KJ8V381Ph&#XRME@+qY)*hj|^GZDcQ$ORk z`zv!SvaOG?%kPbM-nP1gAI}XN8>wer7gMw4v4|91HDz7lzxzb)OEG|vsOa3ZiAkCtzOo~)?T1Qza{amuln;C(w36J%%zc$~(Sa&#sEtNV0jLd1joE6|9YumaLNiT%gRAu_@&cF8^_TKW zdG&e*sXBtk&U23QiODOi=+C`7R~lMS<=Z&9zAra&l^VTn<`lNSJ+01bm}bNgDM^%R zDq2OG$en3dSfGdP;K{anlV49VOEve2XX)X^ma>ZJamC04=7ncwhDU9YWXpEVBQ^eg$@{C`Atg|9Esa_k{S&S-3zv}@v|uBT8;s{;ppqK25M+wOnza=>@_AyK}Iq zLveb@0=J&-q3GC(>f#HrNN6ys3ZYwyDZ0+OOx>D_VY;)rdOl`0oBXFL-Iz8&2vzkZEjq3wriat- z@ z?c;fc#>&+X#>SCkU+*{RV%wb@T3L@`!v)R?=EY-A!m>9zKL@u>Ux_s3Y)#A59G0{^ z5ew^%5Hil;yc21_uq6GU1#f&()aJ-V=ol;Qn;#U^7T(WIEV-?D-o)N*fZYD{>dITD zX2iIJlMH#>G9lUAPtC%fjCel2w^{pxCe%)c7tNIx7V;6c`E7YVd~s8)TGQ=?A#7^(eE7&Cv3%*Gv;0>9fq}lveg7)q=8*zj+Cz*L%9&+`k1>T(+zNa1)<>g1Y zN;<|hS`A*n?bj4e!J0Q~bQc}(=~PqDyTmH480PR!%SzH-0Tn+blSHKGt+Sls#&B1} zeyrrW3Gqt$%@-N>@#^vMBjG!zzn1R0v#jsFkoV|r%buaXoZ$U~POWN&OYfF(oz|)g zH^RMV`N@7aX=^bGrX(#>RFou+>0HMMM$J00U&S*152aFgd=rd8&LXOA8bbKi0m4)`}hgBA??3h-TGHa*i1l;I*y+DV{@i^6|x1du97R11DD`-cH zfZMQxv41^ckx#QRCB=_l}$^472`N*5cF5#?yPr5%7 zG>O(6BN7=Vz1XQ)Dx4gk4_VWdYfF8t_mU&D0euTJT;n(KifXROr!{-tRCLE)A!XDr$4$odSvEsoytCy-I5d+2>w%gfxtXjAbD<58%#EO?WMwt zKA-;dTNZD=OV^VwWJ&0D3j>z$(OfSD?{P8R-kpY$s8fxc`P^qgtE0Apb%6QWM_=jx zkb_zGhK<50Nn-)kaI6mg|HW}mv9XVA{PI~LYC9b6yLDGin7e|RQWp1O1nUp$S+uXOl^#aLp%h&j0# zgFnRm64dDhGEv`Y;u^R=l)#4>w^?qSZJvK$??sPqN^3V4whU4uA2C-5dld|-{LOR! z>fC$IX{0~8VxEWK3?-ASvsHP7*yxW+Le#fnd_@}(#7FKevo6^;zQYl6T&a3h|)b1j88 zX(sec;4|8+(xqqm2b^*=Bd9F+e@Va*NnZUZa6AQ5X$dlc{%_#warUQZ^c7sI$YBB9 zxF4?F6m&L$lHLPm47C$P@_yQmDgttt8y0oo#TCf)I08kQV<^!4J3REy6Z%7pQ$N33 zves6!(^yaR5oM28($6#V^|BW53!4Pw_HrnMEeu%Y{3qpW@6Vme0M{CNZ_OG$opPwL z{&RhU&PwZ-Nkw9K)bmYan|WBa^HXhCZ12CZSaCgG>!Fe^ee+jt^OekthoO?TLB!$q z2*Z40emi2#B%JLq-?ajG;os8!-k2Kdy{NX19RknV$Qrk~kJXD~Nsg6>67qA&=CuL7 zM@nN?(KQRxyk9&p>X|ZQNA(>->4M6k!0Esl`btP{+Vtr%q5r$3M(wIDIt^m3({r${ zPfIoJ_QttyH_>(J^S=f>#+&m-U$QCS*;`uDTwp8h+q}XI`>Nxgi~(@)=vx-wBvV{%Bem2*ORps#u?8aT3XFQ&v^nM`8(Gw%F1ZU zYTYVv|FuWKc|HwTm)YphQ7Bt}sC$VBSzjQS4i?y^*2u*B_O;%(mzP|z^zqT6sEl@r zP2D$G@XmJ{`BR`7vW^&-w#Ok?pgbnXoN?0u0BQ!_-}VRnD|?0~F%N6+Co(vtyprMf z!HOaAgS6htMI)C31%Z0Y)a!4?+gjsPa}AxZHJl^QUektB(8&5D<<=59Cnbruqq_zi zba*BUn$HM>i-viVoE?uG$WN1-l(mc0K8tDx0Xv$kAa*KkEZp3AX{Hs4hG9t14QB_v z0@}S0g>&;{&y`MEZ}l)G#Ns&A$&&H+Uxe`O>fnlV4Xix^jr@pf+^at6y0S~zVItE` zC5)2!dzjlG!OF3O00#=ViiO}d zn*WoVlK#>?>Dda)^$;KXJ#z&Xv}Y#e61htZR_fjR+6MCi8Jxnchkb4;gNii;-nQvk z2ePNem^*Rde`~IAGFE&mpL<4>xJkH6+%=g#B9gKqU{}gj`CEFH)G%4Us-2dt#9dgUQLc4+jxX&XDHVFQq8p4D`*GEWr?)cqeEy9M;Sax?Gt=H z8!-q+J+D5H3n1{k0{!c>clH4kybe+V9IRWT2eD?7^LU10n2wdhoS6FKD^z4rbrpFR zyp{OL%;IiC@2M5S@J#vg&glZWS-sWuet>`8IM|`h^zD{^P(Kc!G_T>jT0c=02p6SJP=00!P)C18wK8Vts$DC?{!^ZpWQT zwqqoHOe*qq8GC4@dV4%gmH8Pm&Nm4`=(8Y)RAZ91+ zx8T}c!6eM8Q+TX=i%u0bC~@3>TFp<><_9}`VN!nP*sC-9ki?|s(Y z?nSMIX4A;UEw5#C&IQ@l4Y%J6Z|7v9Qq6gZ;c0KmjdT<5p2Jhy9k8IeL`c2&6+F%{ zjxQK_#_81e8i>kMDsCuj@pGMY69mq$Qnj2a^zXU2Hc=W%*$E8P`ieJ+eZ0|NGrmp4 zAQs)F%GePTXY})eY_w4NvzXK}-=;s`;*qjDSCesAzl!J`|5~C*6?tckS}|?qB;*GI z*f9P>tQ|sKA}DhgRV3=!EZN?bPB@Dxj&`r@N0;soEV%ljG-3{{jhKcg+UuWztlG`CyfUq z^U=A?bffxi_du&b+jq>ee<@LX8WW@lR+*{h^JOm1x-yL!5mN-MG{BROv}cUe07OVGTyk4H=g> zWe3w9>Xn?6P%NZhPFQ`*XY_c;-p;>P>H{VXpWM;E1Tk)2s`qY-YF8y@HOt+UW>3RU zpP)a@%A8NQElQ~m?>*@jIXKn6aVV`+!P}EpHpRnol0N01XLBcs^1iHXdb?S*1yUva zi0Za!9uK-KV$8^ocUEA0O(Jer+gfRd6Ty|_*;VXNm+gmzHeita4dLsX^q{e^ychl2 zn^CEud6`{a+F`SKIs2hmI4{pS4oUDTNm1** z$jU-&AOuO9Q|+OPmdAH(A`ujPR==)37+i7ML>$ujvrg?pnsf+@u$t&d5WX zg$o1dt5Q-<2C!xFhQ_PJke@_JUmOZL8QU8@IL1es*qk`VfOYEWA+*>ET+x%?DQ4cr4`&3WQ>!5{CT>X`KWG6UIt1w{8L`5uhjFlL!DQ$i_&$T0sa zX6S_FMGVm);xp22WcCxZL-e%+?LS+aR*B4}9CCg)QCeS^$wgo036$DVe-Jy8$aY*V z)J&osD*c9KeHhzHHbTBmM#7o9mWR(9A+7iGA4j~Y>SPHc>m)D0q&4a}!#V(?c(R1N z-NlNu|9#!5rTNS|o(cZd1&Zs30p=j}A9Un9e%jTQ%nGT|R(*e14?T>rlr&#f5?A-X z3)`M6)x0KRP*Q^Hv-zox<9v~l*CDrVO33f?$m)&t3dCmSB~@85!p5-8rm}@B!DF%K zoGbn60!6$7Ksb~i0T##$v_U*E?j4+r0|ee0-c5sgZ<2ppkeL{Enm5u5A(5qeUWr7n zloAoXMnDoOfu|q4*E2^VdhAEGk^mJC~nt8%@!(ZU4Dz;7KtL1X7 zu|7B)y!Z+E@e;*yOXu}zbUJg#ut5Qr0z&d+8Z~5(Eqcb{MWzqG0AER{FizqT2s!rW zk+_Y8@&lHn_GBehI)9p4Pzyew_FcB|kBbap=J8loo;1O>B59!JZHeWk@Zg*;t?6~0iE00Mk zJu#ZTl;ksgl|V$dQMA$KS|W1OnW?Lf&(Q;F_C9fVTCex*seJZQ7@yo+yg0rDer+*t z=b`MCQkqQKwtrVP{Ud#Ow`s>bj-UF|xJp=|fq;y>(OgOv7^|E$gkrW{;b&Hy$@cn;Q)75zs%m zv8@CI2K!*%-&^h8E^JG8V3n~;3wX}!F+cJ4g}@N|7Ph_UN&|m6wsni7a?V$afHlHNv9GGb%rZ4zZ zpYtxWv>M?pV+q&nw)IiOQKLTJe01%9DV-i_vD_dTNupr#NqY1X`jnk!{o5}EVsdE^4mD!V$ zn;&^@;T$yXT{M$!5A7DjAkG_pP2B8aBHuby@e;1{8@v@UJk+HGx7E=>ty^WuN%E@j z2rvQ9mRL9GXD&}&Yqa%<*2wgaEre?je@o{<@TB?s#+8!AEBwH9sH%5Q`3mMe3Fj0e zqE*|q_1cA#(gp^fDrSzl-imgBIR)8>#?02RQ?^OBzWhI)>il>~=A*=;{xen{=)d8e z$iyEF)+Gl`oZCb)iRksjpWReTC8rPl`QGwR#!ez@oJcnQ<1stOAzYJi{8mNF$_Ozm zNSav~@$@1^LY6a5TjH7cEauxpFT{Bu!FPIntb#3c%OIxCdG;~k(J!Dt`zc6(JTpyV zl0N&ab0yRG@&JE{OMKA+6`HtY_MP^==sVB$<)9_{puQuLIwdN{d~n z)_kEzZoj|t>(;x{nT8Z1r-G^CxPDk}e}QJCmsTs31broO7cGGAtDxwRx4a0*u~Lmg zi}`z{K+Y4DhpuP(99PQN6}sEsP-Diqq7~iuX-(r`cGh<SsiV7kY9gHM?=Y77)}IPM(piB^*cMqD5P%>hJzA z5}*=?sxlBzc&=S;oOLIXbK88qIf5mkZfp>VKF@{i7{}?+>C2B1+`JZ)N_C3{I4%}L zIOj&Ge5{}Lp#>MW2Lm#TnR zB*2bqj(6X&`b@^*cW`lAs#5|dsrq+cHTEB}bx&|R5>@za%*eqG6*w$?S?49`x^Dml zvkxAQ-Z)Gx?ZiCtd(j1pkL-&RoIRUntIc4~u{{SFkFIq29w_?`^)zKQmvpT|$tHam zUvk%&yC!i&-zM)S9+aJbJU?%U?LSIB>wVD<6(oqzO;$tHW4VwZs4@x7L({9E%0bfu zQ>i1yvDWB>Zgfh<(nh^QrQ@3!50cz>m6t)`4*BQaN=2^JH+$XvrE3jxHQ~T^uD>8p zovR^&`?eCLUNkOfmDyqls3Salwiy^s2X${*t3l@u^mLY9-J1U4Y$7?1?B)1V&%S$! z3+Q4PRGXY(+=DkK+uVY3|9cv2%F9n%)=1kHJ;5WmFy_&*aOzLn=hXQo_<9?RO*p(u zkyOJ}2wTIJ zmS$&rj~IvbN^z!o!YOlOj0+*`9raKIpA|bt<#eT%GivKvPze%srgS-`fxRf35m&7= zKT|mWY2g}GD@r*vEwxPXHowFw2h=}^c4Nzvud@<+-OTzsp=lRiVIWE?85lc1mD8f` z%al_U>oV8##4cMzt+CZbCoR!Xnp9Ki(^(p)_OQXqzlIlrZ+kO1Hdx*tDGHKntI-~+ zEhOi^NYo+BxeObR7xyF+CTwf$4YyW9kix~s=kuhiR5emKDn1Tg^Dc6#{h9odOZeP) z`BT8#;6Nl5ha}LrF*GZGHRoixFrJFLL`T+0PZr ziNm+(g~*BnUr+v1TWil*pDc9vK$=$6d!=49Xs3m;Z^4Tjgi6i6Y_KXxozKWV zf4Ep(vw0m-BXEo~1RE&~Sl%H4nC6$inao^&R4=obAND_wSZrS?goXgv6sXxQG8k+^ zaAc{grrFbp{0j$brS9!7dWxPT3y`p2;^4ceiUl zD!{?}DmUCJ`}i&@X-6rNhso2c)6cs*>?htPT7)N)=XoPW*U5NN+?>dm|20ut&z1?_ zJf5l?t=YD!5OSz0z#@-C;!|7)a|&@u1UFHn^Jry+ro5ukZ2dFdkbrq@&DGlo-xf@h z(D(dzEZhY%0j&z)k@oxdcQ$yfgtc|LRGj1qe3%WDUSKZU+zo2V$ldP|#7H(D%Gj>U zv55waJZTXh8!_8ombJ=yxd^Pw0!(&HMCx&6XsPKn4~T-jOrG5l?h0U)xS2UfvSanN;}SC;QaN z3GZRh_`E}`6Vv?zk?VSml@_e)P7q&b{s)|m4WNHX$ z#AT1X7a~X7RM$BwRaIz8EQlb*ThG9)M1~|M^$H|3_BKq>c>7__SDLd>W6m&){O57% zlaxk!z)p^>lvkeX;X5<{o>5)3L4L->B4SeX`^5BwV+VtP0`Cnyun@9!<256pDCm41 zn4adF22ysN9^n_mM%1u@C+01ei#pQ z^Wc8*83y#Mf9M5x(wcW)IzBn5C>(N2++MOy!U#=8cAq4Po2j2EOiiIE*CDr>2Yg%h zG`Xk4^I2C~icm5pM$8ks$#8mv>|P5|rt_KHI>_|gl0T!`%;1^b=i@VBQ-gp!zmcF%3Ws;r5ZK=s9>=E$~Pxi;xq76OUR7I7CW)^l5x+bOJOe` zz>zwLbX+(+r$Nv%za`X7m-{lATKV}_5wJs!j>&V{@S}$hw^U9TV_y1AKY@qO0A>ny zHTlY(cx@EvqH&}WkZ=ge+Cb(%xO#93HYeOiLYt8Ce3<0t%70eH0nou-2W5+na|7P%xiKREl?EM!GvZTaBertv4I~xL z?8Lj#9*2X8s9QjRF(CFKEOvs*#stic50$YfPV!Y;j?uJ-4&0FI<~(5JCErWJ1x+y{ z2J1e?7N1bk+I96`9aN(#&g20?iH3FGlQqGt!M{mJW3V3`DlU1~q^b)EtZA%7q#K6r zV1#U$fKLJ8zB(}#itoQ7)-&VJa4F{0ck{9In^Po!*(hBB_`Ti^EVw~&nd{AKbrB-B zCF3M>LFP>P#7KGbM#Yt)MRTJ%a8tv^Ss6vLo+*3cTN*&{qv?>o?<$62qJ9!Et9(u8 zYd(lD^Cwe@>ktI?7Um#5!t}UwLtQ_g8)5MNC;T2KfkVSgG^n5_J&j%q2bR`$iY5d5 zB8)WDj;>05%kPu1O(U!ys!DfJi#4szTpg<0gl1Z-+dFJjs$ySNHlMDpjrh_`A;$zF zAvS(4;*Q6&L8IB}ynO*#`1NkqTP~}iLM;L2#f^F-oYGglY70Yef}qn>X~l4%g%tlF zC6r9rIBMAGfssWAurACXkt^l9ykGRpFKGWyc%;7t2E+ai2ZFuJdfZ<9Ked(WUi~5e zZ}dD%lff1PAs@74pT>bJ&H4InLc}tt>O`PMY@zh^%c5B^T=<#!}c~me~xM=V;BdfML~_Qf0=)O zI*7ktc#B`1gZdC1p_ick=ZO|uqG{9}d_jO0B})w2uUAF^BDUxPJe_*xKIPUPYPB+W zmB=jH&-uKQ!~yY_rg(GAQV@HFS$w~Pp@sjWpz-R7mwA)#b=TN^Bq2jDcYnh?t}TO4 zd?ZN0qUQ5k?l(w}=Eh!ECCA-khVY{zsKr zfsR_l0@Dz1heUWnL7|sJ!oe$lb2&XwGeLBhlLjZ|L{ z&E?v?-Nl*?ouhItnp?j7j2l$+aFw#QV_n>DavpJuEj`*O`KkMx45c~KF@$2c#lq$!tPaANGE2zmui#}Atxq9)(H)GoWMGcLq z?5-Y_Y?%Hnqd)R#>+OA6y+YmLGL*^wqisCoE;aF(zjxQ9xT9(0OHIl&O4(^rijB&m zPKH|~lm@Ujq$t9IO+=!)SYcQ(#>3;n4Ve(=)DddvNxk+-@dr_SzdN3|gl7+zI5B^A zrEc4j-PSAhw}`%bnhYdVouvLp)V|=Wikg?4nEj9m6jIzRbBi~sF3bm|yw<}cf~ZJ3 z4^1I(utOG#37bFBFo-*gN4=3X#BtWH7Ti&JsX`#r+a=y?#1u>9~BuYPM${nW!^(Iz0w%IWh$yk zC#a%aY_Zb$f$0sOwFOHgnhe&x6~#UWJD%R$DE^eW?JvYTF&@&OUez1J7&ZwV4@}Zf zoA~#PGgi*!!exd1rmPg#cdCE%CaBM(Bg6r14O@$|K8Hu}2ClD8JQ$^zI>E9M-BcQp zzf+xq(vlw-HOPj)T_2_-l{V-k)ySTYq+7RA9@9|?+;>+(K5x+s;1KucG{Iu z&Pn5=HCxC+9qo|YKlr$XP@PY(&-d8341OqO`N!zwdHhHc(Fg%t>kp5?%w`1Gih6uq z46VjwZuj{`5Tnx8(n8oyTN{tPSG+mqvwGGM>i`y^Okb%Sro8st3pOqV3ZG^b%nCJ! zm>$zawp0cR{V!oRFLK1_>BaGT_GI8eqwg;elTgR+=e1bu8CsU8?IqHg6m}qbn2eV^ z7#8ZD;2QVfqi`QFcxUUVumT(WaPoCWB7D2a6xe~)i1Ja)A-R>9>|@wzuh1c~5yok( zY3?1`W#Ag98q8f_oOT*)lsiJm`ajF73F`9}y(Ao>l_k1_Om)s)If#Dwt&vna*e)@H zvrN?6l`P?*KN(Z1Dz8gJ_8R3z-8wiWM9L<3$CnlD7Bmnz_=S?XyQEPZ=^5$`@C>WZ zBW(A6@hEk4FR(*Z6U?+qkRE2%T+~y!H-#rW(r~w(w%)PcFQlryx5+%Rqqj(Q=Dl1( z`T6;M#%W~(B(7NUuOB;~<2xX|&7GCp=9nBYMTbU4$;@|C(gyE0v}cJW6m!Dd5>GuD z#JY8jRAEH=Es6wu7`+Ive7JDkXROD`*vf$bBhShTlkt9W%kc7AiZiN+9UwxG4ua>w zQ%Pn|eq$F>9&YhqO%~9;hIyC%)YsPjr_~j?83WDfb3$liN((-VYLbLGwc|ba-Cvop zG;t;7s&}2e7TF}8b`9M!1iN~8U{~){!6MA~_oS|(fAhvaSC6gP&f|$v7s=)X3;w%`tqiovX;dLJ z*=?$cK*JL4fWe0{4dqR}brWsfLCkra;i~T@@-_gwU8kwtvR5*77PR9ti`icRvg}@J zqfIhF$W~KcTfr9j7u4kCy&?^Z_rKDJ`LDE4(5?8dmXuL0Ysnk#UUpwo-T4y>WWN2J z`w}$NTB_MVKSLO`T&}~clVRVd!=>oZ-01N_K-6OUZ}meR+HOJ}`!Dyub{HUPjA{-N zSqw1SFi*;37e4?MB5@|g}Ovku()F*jO^(bPfA z7*}OIpdTLtt*s6{e|GpRU+WxvcqBA6f;@5Qr#!0^y$?d#UzqnXY@KY4E2JgFCvooh)13J!1EMe-Tk$3P2f%?x7; zpLbfPVD>d<&wO%`t`uqi-tVQu3PM}#$03YGHo8KRJFuv?xWTdFo(oukYiREA&_FXt zW?hg|r~G*%mG)EYaZ)T7je!~R3#n@G`|(0DAkxY_*62UiPvzLn5NsCJ6_N%fpjBn9 zbF>jPn8ab4U8#B56bfU(xbvy)yg93#XgC5yboJK?ItF!HIg0-^WM0_nxW6<)C*e9A zZWNu0dD{{a3?28LP|?boH0|#mnBoRt2w?v1b|yV8z@Ar~Jt(!_Th@%2;f<1c>9+L@ z8)p`=kGvSZ)hUP~gzBQWn6Tu9qm7$<=-9vW&uNHcao*P~FgMYex_*j(O(alNu;;tH0E zIRM<^?f#H&OdF_@*s@jPsIk-_DO+Pft)$kQ>< zskF!1IXSS_b<~{#$uzojx|3LvT4RNZQ#VfC)mAH?a0nWLbm;vBw@HRE*AC+j6YSS1 zy@a(UG>M;?Q-;)6_5*JAdqqA3SCR?Vr%9k97wKVZU=4>#S(g!6(=?Ll^KHn@z0O$$ zR|9m0p@o6F1ZjNdQ$TcPtS#xwXZt(rthmMntr*gi74_*afu03etS{+VqRpJ`FBx_9 z09lKg$ohnFR*X9yu`u2HF3r94B`28AJcz}u7j-0Ok@(>Um~ zSi9iFquIvL)6$yozT`j8u#_P0q=`r7QN`QIM!xl0_Ig57KlKqoveI3_6Fg?#HOgk8 zK#BBEA6z5B?3c(WgwS@4!erI2SLWF6ONz8dXn6d?Dzcjf<-D|;a0<<5f;5?5YZBbs z7E^eWjAJI*Za#&%hkwO&5HaPm2$|10!A7$J;iE+_mm)orcmBwX?!B}1d>^quJOj*M zlRSt(3_qPd_<*BSCX>l9{SeUaXQwMf##b#J&KIiMU``Xi@kIhHFU0V6vgC_=YN3?; zUHo7G#wcGH0ah77=7l7j9pRs1TBvwU6mtsO#j!TvEohPw@nOz6PT@MAw)<>_4RrPU zErI#wnR^uM@^p;Jq5mft_9mEkdIREki?mRld0O$W`f>G&8r^FWdA9a~lRHX>2WMFQ zzbYYf=E*1QGO^)dn1X94&~|4Yk@t$UqWG^5XJfEEa)|Ycp*#x*N9PqSvQO>WMJoHV z4K7$TJ0M#qK_W8wuT}@H1SJ%mO-MZNdHHKMoXMVPZ!^K(7@OY^&K7bctSefwT|wQfs_((ZfoC~vJTu=Fqr{;(qR%V8EA{$yqR zIsJ3u8Kx1(qgb{WZxZY|Lvu(Bjj9s1rp~h!b$`{su%_D_-9&l#CpEZO(tf2uqpT~-0S41D}$+A&l&*YL~Q<5()( zVqo`k?<=l+F&-i5`7*N;!bo;6vx+u?&kZByPp1yPw!xEk$I{09mfR>VQomh=(jQsp zP3g-!u9FlMn*L0^Uh>cPfiW6DrL_Z_qF_ym*mfD4=F(0Fnnk|X+O%6*EdCt8_5FYK zap>#*ZhEh^rfww4=LEgJmjo--x%4(jh&*-p(_wb|CXUKhx(=dvIP)MJUIX~uGj``P zZ;oDzQCk>pzHed+;3xm}iTzHiP78t|>PZI9)(M4e(M{}^ZLBj4ks{S);3<99o&8EF4KzX-BhZa)_;z)V@ZuKmTP9`*-t;f7*&NAz%#+z3E)osN3ip9MH z(Rt_+?Rj9Xi7A&t(gk0=j9*jew7wfDKXcS!Uq~(_Yb=#-FCtF{xH{;lT*G~^oPlQQ z56X4W8*V?HBn3G^EVyh3_@Z71z+A6~bknXz(#hB|dI|tKt>bq2N*;PpE?0Btu^>~p zOT4&zqjnH^`}Ck$x$E~M|TTefP!Xt9oi zl!I7RNy9WuCpXb&-s0lAFR1R+_la*Mw_1X}n8*^$1j8m-6}qy4TTjQYj2~v) zznpy^@!TGEccS!BeAZRqkkYsJ$4&}ogBfz~ZolvV^3I&8(l#E}MhS6};uzx>u87PV zT_#$grNe=?q;@3g2on^*W=a*`sQpfti2J1fxWhNr9j~*Z3+}R%A>h~l@dVMg)YWaF zyx^~^=D=(zJ!%tV?Wrt|X6By$g{&5YFy)wylGy(3ZFJ5%NqwQ&CnirFCv#kw&IBx9 z#&_~Htfi2{A~3X8K34&>3(a5xHDi|KAy88^P}2fqzV0%T`Ost#u6=KW(7MeYII@_$ zQw?(QXLNg+gOx6hzu;axqn5!>DgKOjF05ntdi86J-ryf%q-Xcm&^SAJ{#$)Lul893 zWOGVy-RZv@Jr^%UWcK~2Uc32Qx*2d87|a1Po?-A>Je%bVvRv>E?-P&$&l$)^I@$Jo zPO^%I$5dc{g8@?X*kswaKQ-=$2|jA~XXK@bJi+Nu{UHsLIJ;HyErPwI_4C|qjX;z6 zfBGN(0-g(dHKR&>0A(s=y+wJ`l*C6NI~H+bK@%NAM09KfB0Wq0zExthHt9ZpU_1jH z=ET3PM@yzlar#m{ZqM5|z`3=f=haEH*0kYm;TVfxC}s0vlsM)h3bjqh;H7So=azm} zlFS0J1a}UK5d^-|8zsq_z8`c-G_Bj43E-P>D)q943#XpbV zO_mM59A@~FWu&;gFK0Yk$leTGJsd@{^8)u?F{@A}Z2O&;%6*_s$4>I!5FahV&JXj+ zo6QvAmJkFRNCd77f2M*@h^+je?R3H-rU-jxHVSNqY^CH#0x4Q$)FoL$xzi&NcChWY z-CyGN69+DkiDrV-_chyv+jitkOFpjVgHoCMgdF-Kf$Wo$NbsPD;*#D(Yg+aiuGD?d z)r&S|#hsSW?8MwbsRo2gH7EFwoh|pQTF!k~j|A7jQ7FndAbQ1RIC`QwquomQHOk3W zdKjxnO1`w^FG^+ZHa@0SoS22G?>&Ib=ZyYd6kTi6V3_N*7Ntnfw&O5q!-5n9tj@be zk`*y+r(UDXY%Mw|6xSG~dB9;}`^48`P1nu*K4B(cAgHWL!eZ@p z(gbjV?rRg=Bcdoe9fmEV9wExESxkm@Spi7cKBU|=foM99YWD_T=I^5A7o~go&|dP# zlsTb}swmjnU*Q}cR;5T<9}b!OE=W>2J*m+`;@NysoxhR~s}1 zdz#@;kd^F%n_Ha^ej=%-{_*TDsNcgT!MxH?dM1`WlzQmxHxy9zI^5QK3HunhFbOY1 zPf#yz?3b9L2@CU{ASH8e85c+-1!aKk*Mk#6Iq5g^W-b?UmdOpXv=tQuBgKmRfppoh`=y!vqTp7rl;4b+dg5HlUKReB1l=lg zd@;>r^SxbsX3E%eENm0{Va5SAW)gZrF=UQg!=X#5op-d&NzXN~XhhXM)KYlsLs{UZ z_az}xe-SD2#!qn=CS4p{@VLnY4Wb4we<5*CRC6Vm zrZeP49lgFVPiQldq5ru$DZtCO>1#c7Otx`#LX-*Ko=QU`6v#zcS?Jsl9cOJn@3^k$ zykfzq1cvgUqg%=Sk`cyGx3MzE&2F2_dm{{ObDt=2>?bQ4Xprt$6IDAZI(psFKf3*> z*f*#ZhN}aMz~&+K`D6eT_MWUl^2N+0ZR!oc%>JkDG?%52P?J$8E#}nP@*KDHSHhzL zyQ%CqcQv&~nIvpbtmxBQI0SJ{aUt1|{g7y<8Vl^ogrb`Tp}sy(uyd~ZA+#g8Q9Nd& z)NHE{!Qtrhm`>jP<(jMD5eWzud1AQi0$lTF>3|WaBgUnGol$n9%$)2h3RMIds8%z~ zd&k`on+#rOxuhTY@Dq?r&C4td3Nq+K6?eJL%WNZ_3NF zFs*O|k|k_)!_?0DTh9d599^N0%ILDK0e|j@9h2UT?AmXMMQeY3SD}-~TxIcFiUR}9 ziY|hW0x1I99bk0+g4IXF<(}ei8hS>%XCXC=3io}P7`@*+2g%s(K}=~-EYf(=y|G(l zj5{-)Q?|R1IxgDX<9GV6oi46IYj#iHP?yB<;ieW5F~wx_W6{#D1XT4)kJ$0Q-Nof# z!|F~5cl`$9=g@UrA5q`3VxcO<861 zk1R3UO$U+L>esZH(3^Xyis8v3Q+?DEnVN&Mb)t$s=4X5jW>orL9?VC;Hmg3SNRNu+ z0BDthO9Q+3lx->PTxxhsUU$#!d$A5``ZvLk_Gs*pc@g6#ylo8mIU=C&(?)u@9;;> z=wOJgA3%L=-V-b17Y;sOuR3yU?g6HZo(UJ_7Y?xJS`D2zD79Th{u(Foj9?_FInX;; zyd61hMAr8%!DIbP-k@O-29ovk!Kl=g6!k}An;>LSKKLwD|6vv66e+6`fE-%Sgq6-#ewKN1nlcznR?c!}_{X)O$XGA9b48=Lh~uN{gHTw!_l= ztK}AYSUr0~;D|7Ib*qJALhkAlUzZ4Xz+9P}<8O+Zcy7_Q*=LR0lc|5B-4dB4kD3UP zk5$!;^fnlXJlcTBJ}gZUbrOOm)O(}9X)To!`OWGbG*an2Pjf;i1|@wj1dn_NGspJd zKA~XuI46GH)5W}73{HprdIpByVphYcf^ZJl9vs6-0%Rr3ipi)gs^kQx9*)E`9RKMC zJ4dz%4_*PYVvluXaHy?pG^yHEf5T5{j@`EN;!4ZqBxZV)hECKmN6!gHNhaH05+AeP z-tNs_*srwk_A_JL6EicaO%WX;Q_i)b(4u>@q)mVhjqYa+c^C}J>JT-%IR4QkEB^|pILItt{N0x6FEvdevqmAtJhUO-7kXX}L2{1|*T+%-7ElR) z)3O^Hd8@{Y&RhGM-Y(9NZ&?kQq=t5xF2uFPZ($NW@-U!Dci1?#Eai@(G|FSdFgrjp zMX!0h>x)6Pz3FZwr1L>Vi*c|rrNCTAcbL`Ky+~8mJNrez%~T|-*&v!Qdig{4U{3pt z+IEe!0F&UBvwvBhjd)T0tDj;(;#|n;mZoc#gXA5LRtP?pYda$u|wfzU5ErH~VP&NiyH8-Q&^L+S9cO^@RvsCBl-4 z5a4qR%5DLta3+(G!P`j`6%P~@()Mm_4C8t3m~qG7@#CCp5^_6cP7J6|Gkendxp@=( zY6;Hs?;5IUtw!sIb0F16IzspolER0$?|dA+?3wXQ~w6GKMOxbE5e59#t{0c_#@~Xv{lT@KKA7=(1uGQNo zeASKo4mb)|vl|?PA=ok#F=)Qt1b{~YD}t+vl&>~?dlXuO>a>X2M)p&7H>ESTB_HpL zq@K>OCytFL%_Hh6V_Wi*ZMv;}kHsqoYfp857xD{Y`VTZC`m1(m0AI+p6@!OZ99?Af zwrk$X{&lGo+1)Gb>^dZLG;yShaGNFEyeOAkZFTf;QPrx4nuyINr|?(6Pm=(7NXjA) z%%L(|!~!W!ZXy(}Eo~aqZ*Feky9V2~KK4xmh1Nf?R7=l2gE=r8cPyA!n8rxSyfcu( z_hd_9tLb4$tYX3Ei*{4(@Q^bE)Hy&K>a~pAfG3?yC4M*4 zO;2L7GoV!@4*`lp8Sni}3~3ePH(O6=+QRzv3nEF;;Ra*cGg}g9bN>2yNjSp+;%b}4 zF$v+`DAfSApA(MqRZ2_H)O`P9kBraXCRS_iUE`%!gy$-YE{-ulx=qHasv*4$Z%txn zCSyj2Kg{vN|0I*0)H>3s#)x0~11nBg1JNK=m2X`oVu`8?8SJ-@2O>rSFjVt_9lL-4 zcWr;+^?IMfQb^EIIEKm&k$t3H67Q@tO$_(6wjEdR2sE1@fDNBt@+UOs!k@~vmw1s& zME@c3T%{&s$!y>75l8%-nt3C%kRGN2*Ti@{rbA=KvO;DlD1WjqKTE8Jh~rQklZeM;igY zzuGF4@+N7>TK9Lv_@9EjYFEEc*HiyGY`GV$cfA*J)#WD%+L9oXc|2)IuxS-&mXvM9 z^lmeOBkA~9@L@;rps(eW9le|}lgPb!!I$Y#UGK^iOTHu97ya%4_ng||cRP3s*SH2u%A znE?lbgYtQU6@yay-icc7Aj5AXB_8G#lPB*{MfNr(}?L(?{dN;fPGI zAv&}W^HD&;k~~z^LNUobAGWOYqXFk74PQ6}fyD6rDH-XB&X*riZq=vK7*`*7e0Hsr z0J+iJUXi}$VJJnlYZNx4qD|zrWGgO(%Umj=+tqK|>jqa?-GlCX8SfjPcmBsCG?{#?P1*t&M z2ur&j6UG?1xHwX9UABHEQy>M{;#zw(K{T_bze}E)lQX~{M9-AA>#!+=$>H&1k}(%4 zywA_BbK>BQ=y1;snGA13m(qP z%o`MT8UgAkzz*OFYOwdj|2O-@ncH?9{P}k0b~fH^XWPHstZjcgu`#@Lot^27{pyN0 z1wl=86~ErZZXsr&#lRKSnN`0-?j+sV=Jsjbu_|s6aI>G|rZ8LT@*C4{Wl!C7a8Jpz zbxT5TJS$Fneny|so|h{nouAdn>BKz)g_a`%(cy1@N>11e@^Eta=P3siPVuW)J1^vareocC1Tfm;c( zb_w?L!)`HWzrASI>hx2zdjBJ%aI<%v!D~0E+!fhX^B^uc!oW$7fh(nD!rp}eVp6@6 zy_c}=)BqZ$wyCw*u`;N4_W4xKvhGp?3;Uvdv9p{{-OF2kOTBB#;RQ9d3zxO;$@sQm zK9}MWnNya}xDM7P@6XQISUq*`7LzxO|5tOfEq8wSVQ;P@u>V3zci@TZhyRQZw%l*> Txc5jHbh3n}tDnm{r-UW|q=LjT diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@3x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@3x.png index 5ca3f21d775974eb2e76b3f289d51136746d1ffc..ce7a220b46c174c558298101140bb76808ef45af 100644 GIT binary patch literal 37074 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 literal 80260 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 Caxy~z diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5.png index 9cbb6eb84f038f3b84ac2f68df04721faa40957e..20e4a75647c972b721fcf2069b234a5eccda4e03 100644 GIT binary patch literal 11352 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


F38YI*d!3hRi1 zEo+p+xOUdZlPS(We=(--*jd%*|2m(Bllp?&f3#zjbs@`D@LW3E}lO^zM4!!bMGDLpBIjCbHyy7P;7|?3flkPx23K}MJnaIo7Xp(3dT7% zwizU@(eP?ZEm2sKAjkp7)q#1SEVLI)$RvO}>%TcC`L+Mhl&-#J#u`W<+$!VJxj%WL zqpJEkT`~-Q4f59??W=WXaZ^Z1jVNI*k~SraYr?x0F#AT+&=soK^Y9&M2O6bGg@gIY zQ_5$}tenZ!$ULr%f4qV#FU}#N-UyGjsADhh@MZC$qK-CN-_FK-3%HfK63d(CTNg$@ zvxgmGOLYdb49<(;Ea$^*gkkgs-qGN;5VJjBqLN6igEjCKKFi9?tVp}|3hhLOLzv3W z7UP4nDd`z*JaA98<=~a3iH1!r7*ab#s1;$WG9|){MSO{O_g&WAE$o5~3eB|5!*=Tl zYt^{#)))}nXcoIe;0P*F*YZ7X;?en0#y^)(r&`((wo}*1^<<=;$lz2TQOd)?2o^z8MA9AK;0PmIxZD1>F;}Fo6O3@ zXpIRlhsL>f&k^xKG#?_jB5RF!z(z6kS{b0?;4H}Hr7Q_odY(BJO6Hr&E$w6xq*qS2 zKB7tX&lDOcPZG2*_fBX>@^qqb%X)pz-0llVTk{y+ZO5|GkivKaVxQFEtV`&{dRVO=s5p5sSQX<&Re2SU6~Q zjU*tQeR=zf@bswUbfWMV6`LS96=AhF~fGF4zI&ReCGuZ2Dx z&;=)Ivm02nOxe5~IGE}F>)Dk*N)c%rf6}}@6G&#O%G>&x2Jwao`UW8cti3(5)z+z| zu9c-K`N3A`T_xut9D~US+Prtmx&b9JjBi7-eO!ATMevt68(a5k8o4*4+FmIhPU^37W?@4tiR6s0Ti9B$yR4MwI5Z>KDm)Kf$0B0InH4Icx!6R>BY-)v;`_~@2FDuiG}EMx{2sE z4r5Tes2ifO}eKK&@z3PtfKoFzXjnumOe5 ztdmC&)y8>|0>#d}J1woKJyTt6#?sjg&1m%I?A#+3hI+z@*B1Z1d_T(C~2Hc|)6le2Z!#sewkFD)BVW^~LKE&~)Ew)#>1|>*|w)3)UUIB<2 zR6qC5r<~QQy3f(ij$uAyrL6Zib8ipk_@Ga)oZvpd!XgeOxrs`@(9Db0$?ZcQTS=mh z{5Jl;WYKb^ZiTM~+D8T7XujI4Pm^52g9pqnt*coOs4D8|(+XB6&j-J9C9Yv9zlE5b ziYZriIomKv2i%lD6>EEz$Vx09!VV$-IWb6WzP=Zj$xGv2PheoSz{n@3-crb6*e4l@ zzGfO*qpgQzH>cXhi8A*R6F#4hc(%9*GOl=p1?W~y!xX}X>fB5kBO~b)i$wj7X-6_` z_ShS_pt7~#`KYw|+=b5;`APlu9Vyg{E|bjp&X5jWBjzjQxhc!KR+6Te-z&|6V=2XI?I3#GHQH!}VY|I4t>7It)RY$l^-Rwm%h&!>g{+sAM!h|Xt#)1@g7#BNT0o* ztLifpK~-op=`4S>;0>C4CKQ6 zG{ntSUaAtx&e|2F17uy9HN?du)rvZLolnH%6p^OJ96f9TDijYRA)T+F4j-Oh`}0i` z@jYm`zR%eBDGl=ai^(|Wh{jZ?TYFVkC~IC(%I0?ARF1xp4WE{wCJEmbdPLJkRT1i= zvX(mj7rGgCY1ath_+dKz{(~LsCoM+Z-YbEm@d zrj4Is9n3BA*}=rW_CbU^GB=?&KICy(%Q7~ka%MwV2&+Sr4ZVQDW%@7BNj2P5re^&q zMr8lvdW5(_eg=O@6BT5`wcGvNT$wI3rIYmfI)q~1GlbGzTh$AeQekuZpW&#bb3o! zokq(Wb(Y%SiY*(5#_{^Wzb}2Xbz*eqSZ2hu!)A9*yRCn{dc|g3LqQg2&(j-f zT6AWSYQ~br8_b`5cqkD=hV@N7UO{E@$<*bi?2et>FJdwtNzyjysgH43B5o)WzYIoR z{}#V06VC(h1|NPCj4>>%CHi}JEo;%1Ve`4&M0#2qOx#>o zUplkp>qNLh!7{NW9uvdpKhC7qCT#ty#d^yjH0>Uz@BWwJpa z#`;6->t>FWq=TK;!G|F@Us+8>k#8XBKl@d%j2t_46Q>3oQZB+i;@h}Q8>*R5I=1Q! zM%HwDR|#DcO})$J!I4UIaZY#n04Cq%s?)y>pl?J$&-G-EQsRZN{!Cd(ns1R4$0cSa z0-|qy#5U%~?i+!=ncUvIjGmfRz#qK(!yStG!$sjLByN@^`E_%R`LstP;?U7mbhVCl zW|-wDvgLYnT%EvmiAGxD4-J7T>D0^P_>5)q5}IOWaWD-1kHSJI7HyFPt{G{Iv!iVP zYQ(;WXp;pCt=^bCt7Es-re0u_D$rS4mREHCv!8(&%4LYk^RoGENLHUL=jSjhsL+~W?TNi};&N+DuPq>t_^cFn;b{Ud}JH)i_cyZYY4((Xz4D5*Gf4x0MlH@ zJ8g|3bxBO>ep5POX3g-2q%df419rDryOf?Ld#Y!?ltzD`_AE+Qns(+M;tb^%nUar~^W^|;O)M`=A#hb2RdYeAo8 zB5*c5c^1^)WKKg?sHtG$YBW{uR!v-R{yTC~Gv4hE(S#8VqC3nuW}E0niGG$c zFODbPu@ltWcrZv=oz!chn~Hvhmb?#9 znjnY7c2S#E0zj>~pgN7cq^##X26bzb%!;t*z4FS}F-axE#yW?OMoQ7+s!8y5n6FZj zZ<`o(kCF)4#}TJX;I7P-?5uw>o)+Y`stH%AnA~Yi>`%t$5!nn?4fXV)^uM^I`87iI zY3zti)HQA|t*9#SkcuKn>Tk5OBKOlw&l7~#+lQkx%Sl!|UARVi-|oOqKR_p?*Bh?U z=Q=BoimrgI=tR1_eF?h!gZ4D#M9r)Td?o=o?4`=`;xR&m>} z&bh@KP=;4bQ}Ieq+p9It=Wnq{;d?Qmjt2{uR+rwi(aA;D#QWQ1q>aA>@uc=o@75G z>PX22jBY&m50U1maa}cz2w*u@pEK8L^H|k8N5z9Ln3AlXM~2PJwY;6a{PRz}I;8>Q zXD8UdX)ud`OS+aPzuKsXN!-t3aOAa0W}V58;H{LaB!O31H}vdymhVcMg@AaJ0Y86b zSF2Zn@5On}*Zzw_k19MX;sD%|7@mIyU!`{Ru)T!e|UKaUU_?ueDL(m1}&@C8?qfK?yuo zJ|2x|>uIi3Q$JvP)gskgVZYV>pS&hx%Q8SYF{NVgMumvZdcDLcc5=&nEGXgv;3Ah> zkO=Apq5w+bksFM^>>GmRh_(!EACit>OuPWf-qiFNfm>wO#tjf7Ju8!53; zMD7;?04Ox^DorR!D>$rOIJ%WP$%;{vTW}y>n>rNS+QU?W>Ark^UnU6{OenRTzg0~s zKoQd&woIMTwWrT?;B5;0egsfAO%+XYRW#RyqB{%$#B>oh&tPCV zV5FSA%4U~eGLfRS59K`RPTCxlHmW$kaI7RNBco{p2aw}yyyuyk<>SGy(Nl>mevBqk zBM;o31h_!HaEjplkx}}6iq(PSlzbB~XaRZX5O_XO7RbB+0IISR>zGd`VIBb<|F|jA zGT+UebqG}E-U9%gc<+?L-c1IBLLQMVdh0*8Gr>~SD@fTP3>5;3;6qAF2zAs^M(ExyL zj?5U|)-M#KiK#@V%T!+(mx^u=)nt(4W0b3trAQAMo{}`W0Gfg(#(qX1W0S%TAwiAA zFg@kwa^<+)7DmPgusfTw_M(RF#{G*#Kda%h$d})rVy3*>Nc8ePlL!FY;Gb58{f0N~=AU`OD7Ra|YUUh#dE2ht$_Xj^I%w$x86r0kH% zH7KJF+wC$&M!Uv;Uehyy_%~qzweS)f4u)B=xBoamji+E1sU}rqG)000#8CPqk`fB;Hb|6n31r1Wi+(2Rrf^xyCI z?cH}X*%|g;w0&o3l5TXQo*jj4xw@sWcG zc+7dU;Nb9m12z%xISv*3H<5m88(xM%p!NX4-kQUSx5%Dqx8W67^e<~vhn%A{e@!4p)BLM_o=@+efG}IV_^j9jutr3x{hCnf`yGN7nG)u_h>r@}M zcZ}hb8<=vr7ZF4qg1>cia0!*P;AV*5=x6TqbdhKHxe7)MdW?@}jQIT9vEq)*a*v{z z*1d&Je-BOyn|0MzpFe2mCeX~vPK8^tVDUpJUk`* zsXQ?m!8k}4v#(;mLu=WAwuRrTzswWpo>JYqfcEYB(IXEDFD9+?8E_X^k9qF%^ zP%&F}{dj$b5Xdd@P~WEewz3W^r#pMuX;m8k>+{vwEOM@5KM3a&wKbmgj@J&#{XhhSe8h74yKQ=)r6pG$C zI$q`0-R%PbBO6|OBwuE2c&ZirE~?-HHR|W?+iyD!BC;>7DhN-X%x2_CW{2Kn+H?A% zwgZd~18-RyXL^GCE5>;mR{Qs}aeo_6?LHbZ_(?M-OWg{h!nLfUi z?@vVHTq%!VLHlywG2+_3!CX_vOMwxce)Qxm#y`ZX0tEj99xVV2i8=sg!2h5OjO6nn zOPFE=NT>@ynnM;kK{a2kB#;6iw(}o`0{(v`wD%nUpl^+!>i_nUg4rw~nUny)-^051 z(zugh|GEI8Is5=$|AD3hJnZmG)IXO18;;`|CcOXk4v5eu0RAr!87XEc)&Bydh-mJ7 zeq;PE1Tk2+-&@GPaATRPdv2Kj7kR8iE>BsyYd!zuc z_y_8F?*E)Qqay(s=b0=j#|m*hy>3&rFMpCJ@PP)Wd@%Kt~2|x)~A{nCHeP7 z?+~z)#{|R%A$iixBIk<#9lAm4r9;d<2;44KMu@!mDCy%qh~V<>d3FcqtDNf4F)N<6qPe+#9Xi#{stf<5cq=6^lSOo%R@S+)7^nRtq&t6Oxl zucf6{c(=k9Dju|79|&dqX5{;JTd9`qzJ8$k^y5gJDb4UI`^#w=tC(>D_o~h2pW8H) zOW7!nCuS&yOX&4%?YthzPz{r4W)vq~t&e|$LrJD^D+1>2X=e*Q%N+A)gbx@#J@!x% zd)67;ZLMb7s@5-iQR~SOhg1?ptmY1e$dG(KQQImb1Ea8k`>GZ~>`I5t1LKaTtgJ)* zpSxy<4IkA`hXL0AYJHxtA5W_SP?iK-w`+IeyA2wK+34F1Y^e33Y9)Z*VY*C&c+sx7=O4agHM&dV zJNI~@Oo4{rnVk4g{yc5HLaUMUCk@mQ=Hr`qz0<*$)K@sobN)5^G>FqWgim+He%vdu z9!B=6T61PokiJ?om_BJGXW*Kx!`#htgR*S+EKhE^l2939a0gOe6kT<^ zyUfmfe|9rzVyGqjR7{ryKi2M{CI)@PJ!$txJeusKMGZFjM5g$#kwG8}gVpHL2;Xd+ z>R6u2+mq+8jcSjMjT3+Rm1n}!`&nU8L`qq>38&~KJYJX<#AABKZjftO(BVI=AWn2@ znsIsW-e?|wZC_a&BUYLgjF)?c~g7mJHu)cNkv!h*jLcbRh*w%<9k!da_Rayix;dY36+^{>{ zfc2*q?^cYnmUg8)bRx52%OLWy{sW+8`f`E>VZIt$gb`0eq%;!@+n*YIVasfVCr1?brUmd017f%pt?=m6*d%&k{;iywAx$M<-grW_} zkU91FsK1iml~33CmPxhEW@q|D=5Unq!t;QuLrgbAy{wMrU4)IuIOU;2S@zotN{Q1FX!T#W+fl9=ty>DBy2d%uWd|8pi>pVRuO?2J}@ z6o7vG#1G`wXzRhaF7!nXkOASghvaMiBRCeWDj7WT>)*mGEFUoqMV??O6_NgY#mvHQ zyeq#ggiGV^oXP_L2@^*w`UIXW*GR^D8rIO^q=}yIMs1-%FM|IGe)8uq?4!1ihonx1 z8IEIK>^UlIX*MGPjC@`M1Ve|9UA{7Ao9?E+7E^mrd*Ak8ypP$J?QwhY<9h-t0B{t` zHE8?u+~hq5Kso#8;qmf&|HQjLyUQI&27C;BzL{Gt_2cHi-pW@XAa?9SyJBfz%h=0% zm~ux=j^@J5{>#4!ixL9K{ghQvdcmCE#Lvez2Lj7|S;*6}95~d@**6Z<>M%*jKAM zB~cL#=R%&Myl7#5iYj>sx0$>`-cPLq09)bb)|ZfA$1nik(kM_U$CZ&Pno)blE392k zDKVx$g&yxoaRT-haDIALZyRxzoe4}HwKIy52Iv(OftqWcSo^8LO1&g~eWMI`HBEG* zjk=_Lc#mo^@DSrh1*LIQ5-q7N(=;EW%>);owFEbDK!CY$9D;E0|CDgv@oatnACEn& zvG?Ai1T~7P5iv^9+O-l<)ZU{;Vl^W6-ij(}YiqZ}3N5vY7A;Yw_^8@S`QHA1f1Z2J z<38>=k9*H~-}n3VdY;#@Zy7Zhas{tEB6%XI>vKIrAH*{ty-V>HI<#ls2c#voGB7Lt zAx~KJO3A|StQSzX7_aaEM_7cRIWA*6x0)PO^Rbji{AhE*yKMJ9e=(g{K(=Ke_mNqL zA&Fl~oU+WYL@`b1V`%)b1&9OP3MTVUD@rs~aAZx|NVli5uguP?!b#^uwVq5;P@(!e zWGDL98W*yLMx_!78=E$fC1#9#-hC;wJV?7Adh7A#Io^QPJ&I@AdzG=%;Z%)b;SR&R z2X$%u5RF3JYS?djeamS7P6_GjAnD)OwPa&|T*m5h?Nenl5J$3FO#4u0BuND|50F{- zBIhO_@Oik?*(iUVQcK-$=a<(WW(&`@lhtgz*ik^A5ac9GgWAnbt<4L5zMu5Ll^YBL zeZhOCPv#!AjVTn59$1>-G1Q=RcN@tuI^i{jN}S3+C--1z69p+&DV zw994e7mb!>?n@e%&VUqhWj&Xhyg=~fOwGDnW2^+X$d*d~7xz()y!`s7xeL;2h(*Kz z?LTem{3ljPTlku#+UMKaz!em_CMU^pBxkJJ!{A?YBJ4;f<|sbne7wH|NC#*+Rdhw6 zw`nR#b?*W3*XCIE-)6XIKmkf?wZBOICxL8AemQFyQxQToJ?tl&|A8X&>FslJP;qa!DZ+gh_+mOxM091WDtXxw;3K z8@F8Hl65ZhV|{vkRK$F39ui2wgy(uUE9?hAQ0M@^HW8`+eGP-SCXfosH{JlGgsxUw zLIgAK>%s7t`vO?t3`cZH?51p}bgyQzSQg?rJ7<<~_G}}8{fS|JqewydP`Q#%fP-RI z>CLE>kCWD&Jr7eK9WfmddwkhdZ{FZH(;(%AsuTQ97G|w=Bi36m71-{bNqcRQjZYe9 z$xS;hwI1xVQ$9>OKTNk_aTuvI@z>xRP0?YyOH?voAnRj^*dAEUleYYC(mGCZwPG2l zy!BUX(##8N!Pw#3XK%qHM;7x^Bkmt5mfnJ`TzFH}q<{Y)20ayh&6agUaEhuoHOsPf z0_If)QP2n%PK3-MRRZCs{a7%nyJNE|vm&M8+ceFd(U70c_>ECtj<`XF6ZL; zT%BB`U50;82n6e1%1Y)PMp-(AIL4nRZt3}2pDcq$0l=cnye z0j}Gph;dd?1xvl8pI*_6;eSr=;@5j+$oI_#F-eZ%k$fu{GY$&Ht&He|j9cKbm_$Ct zn#4TCvGe_>YW3Ac#=6yb08czbqGQ?tiT&u-m2{*V+ z+?k%q;?OIYK7M3KZnwVN%0 zOycFW)qC6pjx5e}4|M^JErd;Yz$f$53T@|P4h0IHgppG)nOV-l-Pd%xU0@keYC)4I zS7v$_G<-O0je>ACsaV>`f+m@_SQcIlk?WHT#+oH}Mi9Lihb{fA+*=_317xN!HI^ zjWrR#($^+eKP*}(z~~mHd6f3?SM=7MPA#{qDLT7IwmTOwUl;!twevSXf4wy=7pdbO z&s_-0HMMh=*8p#<2s-2-RAr1LPBwq^{5ZSkk!P1#6(~zRB)?M4ph+@=NtF1gI=Y7^ zB!?@lkojlz2}Ex3pLbsk#GE_T8$15(@F`+GJCFZ%D(k)6qYoyK*4ZVESw>i1d{8n` zsb&s;Kt^4S$1X{^>a~h*J$L4vs{|BFIeu*fh;6NSxKL<20m6-vc8W~7T)qmA)5{1F zJtewrUaGv)0X%z51mr_%d_-+BEgjKTQ2G4OK>6YPw})$40k1Wggu>O^R*Q=HDp%a!k^K6i;OewyK_>(GLo}VCftk)C~;(C&-P4cQZfb4n30ag z=yRgK(=|K>gBd4_;yy$V_X0-J)^jpm|A_VDA}66NXaAn#VK*8LQ6`~w7!dd+G<|0< zd~!JHtgXRt#j9~k&$aT$z+5Fzgd#s2AcXZb$d)~4V>(O_(f z;@Z=N?KLA4)ZN$YR*t9R57K)7w%-w4?l@`SFOKk9r+Bf3Gh#`mJ+_W33W%dI*GMrM z>(tev((&e+mn#Q0t-A{2YC@CJsSn{|W-{2~^j5Csk>{$MBNl}i1nHnT)vFp?V_j4D zcV;Ku11=Ovl2H<|lwQ}EVD$w&M2=Z&4pUN7Jc=*H6Z)RhYQ-A88fDhw+vzsFJ~}t3 zWU4IS{Mg=9XiGMj9aLeWU4w$)*pxx=d8iv4 zhxuO~Pe5w(Gv0Gj>=0PxkXoUj8OkqtkE-CM5U~_gi#yu;yX%g>{ZwTUQamE5;vxm_ z@bi-F$dHIF{Qpr31`U+Qj5N}siwRvoa`tFc^N@LneEqVBsYc%m<^kh+L@OLO``DTN zVS&1*5>7?n++7x{;Txb77G}h<_*ifQPUe{P-;zz|k9b7%Lr9I?k9p;s+(ZW{vMpFYu)|?Z`; zlsub)ZR~A$*c05=&o(xXi+s~3b|SZ_kgQK{`R}J~Vml^Jk=K7D5vR_5lTOOOgv7Lr z;mWEy=Qq;9j4W5ykG993Aep>w_$=St4wV(DE}0#%42NkQLp-%v{%S)r%=NCQKO@_` zjreC37KCy1iK$kxH(*(VzyJK0_YSN~EYN8YZ(uIlaTc2x_kp%Fum!AZu|=vW&SZJt zL*zjao9?d4-t+~rnTFa z?9@e}Cu_(c2m5LkQmMo1sJJT^?oa>j%z@Ll=d@Fa({q;O4FiAV)rdl4O`G4m$QW(} zD8n(e=mVlIKJ)CW%2W09_(1aR+>$nt7gx)L7_zfalTlX-+hH+V8~|{sxej*a z(c%XJoP+vNpILQ;BA1Ocmd0^+!%f{P#}x?&zShXr3LM#HY@Tg5VHClvkfnZbP_HS5 zsX!R{ARKIAYyeB9P3HVWkGyZM%6IzM^wVZR?A;22WU{PJYvq~JEX@)l%yNy|pIo=C z=mE|LF`e?Tg0S~`Fwlrc_yHBe{19N3KP8V-jTId2E+0OmEzk=zx4$+FOCmBh4sr%x z@u>CRfFlJ`oedBXfGhN)fVGsH*c(BtW1U1m=Sblk``Q9c@|2-Da)}uRi<-<|qfQhs zikf8?f*ZZ4R-Qg$HrM#8qSA!kiF19QkkOQqiWOR`hA8lCtfpRo^(Vz`8)wOM?fN=J zu*IU0$^`5=3@JVOib-ED!{3^N6C=D?^c+X`*bBw|Ny+^C!izj}%}OS}oo=5)dHj3O z5*v(?Nc~4-Y$0K!@FC6{L+o@$WJ~O0UiN$xeX~5it!;Wld0z%ol&^I7+4a#_V5+Ze%xX_IIT^31(2c;fgbs9~kp9*e>LVI9-Tz5N^KQHHRrZ=-am4O{%hlhQ1B$MrjTpmum3R00{Oy^C4#mhq)}}1%|C6J8 z$!nM(ijsaUWAAwc$XV&Uis*@DS9w_ug4oED*@P8-EZG{?gzvZRW7_~br`99;F(-q!2;q@sQDcel0L?fk&AeM_v zy2a92UJaBioGkD#dc*yW2iBqxUBa@+nQXVV<)80^(1k6F zV+PM$1yLTq8Wxd>ZpbDg{G3&86#ZefW#rghFP~eJcUtuKGV9~mFX>*-UO&77ScE8t zmvR&j)O3p}?+7|;*4i0=4MJzPj3y{DM)#YoqEXVp z64{=?%Tu z(Mq{VpwM)v1Lh1c2i5$t^U1cSpbUGRXdYEITQ8+La&BbFW0H7tap&8G1X+7W0rphA z;ewga)OzSLQ!x)EzJ|M*ZyZ14yTmb>8G4^DE~iEk40Avqxl_s;`DjT_$Spn1sksG) zl>nDW-^$>q1o&evS*cu03&qQFK(Ys8YTTnEcG$}FF*lweHI*`c_M(F1HoTivpna}5+KFw*3x{{(6&t3b(&JR3p0NGNE5JhX0=^Tqo^ zc^iztH5;4&ujMNqLd&fuK}lv?Bp=+w$ba+MwWEaua02|nBs7Lch!QiIK_(w7XC}YA zSgaO@c6cf=y$G>Rt|MYA5Jjq`GP%Hg6DT3qRW8*R?H>pD8PXzUmK#9yboIKEq+r-2 zE_6L;za(6F8)~25NSndK42pU-xJLr?vH`seV_5oiZzX4VkC;yrvwcH39h0?W_c5F| zHWv+vJq~BuznP}>^^Va3+938(Gskd{e&jNmBUTpZ^f6=#;lPO0&<=v>fl~G%6_hDk zn5q2nDuzn6A_x5EnwYsER{3xwmXN-CZzkeBVUw|38p@6 zy&#*bYN&bRrA`ct)_PBrZZ$;1fV{6`4c+&Ni(H#57Y~zGOU@Zuk^?i_st3Q%M0Eht zX(51&jR-`VB<`OJw{LGBL>QK#qIqoNeY2!$QBPPn$N)6!P{m>n{231oAZJCK(IT?R zR+B!)H)vmavCzP~d%Urt)I4}$kiGtRG5u-jD@c+RPpd-CX^SX3~w-AH`lkY7%6qcMsaA;~e`xwA@3l literal 33672 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 diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5@3x.png b/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5@3x.png index 6684baaae6dbe5c84428b1b0768d31d804e299ff..c6c4f2ebca369fc399fc84f738ec2e1c8d328d0d 100644 GIT binary patch literal 35240 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%0D7qX=PbF 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 P00000NkvXXu0mjff~*SP literal 51460 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 From 3cc247a4afc969560d219ce5e636bb10bf8bd358 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Tue, 6 Feb 2024 23:19:32 +0900 Subject: [PATCH 150/231] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=A9=94=EB=9D=BC?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84=20(#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index c83fbc0e..e9d15864 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -381,7 +381,8 @@ private extension HomeViewController { viewModel.locationStatusAuthorizedWhenInUse .bind { [weak self] _ in - guard let location = self?.locationManager.location else { return } + guard let self = self else { return } + guard let location = locationManager.location else { return } let cameraUpdate = NMFCameraUpdate( scrollTo: NMGLatLng( lat: location.coordinate.latitude, @@ -389,7 +390,15 @@ private extension HomeViewController { ) ) cameraUpdate.animation = .none - self?.mapView.mapView.moveCamera(cameraUpdate) + mapView.mapView.moveCamera(cameraUpdate) + mapView.mapView.positionMode = .direction + + refreshButton.animationFire() + viewModel.action( + input: .refresh( + requestLocation: makeRequestLocation(projection: mapView.mapView.projection) + ) + ) } .disposed(by: disposeBag) } @@ -421,7 +430,13 @@ private extension HomeViewController { guard let self = self else { return } if markers.indices ~= index { let targetMarker = markers[index] - // TODO: target Marker๋ฅผ ๊ฐ€์šด๋ฐ๋กœ ์นด๋ฉ”๋ผ ์ด๋™ + + let cameraUpdate = NMFCameraUpdate( + position: NMFCameraPosition(targetMarker.position.toLatLng(), zoom: 15) + ) + cameraUpdate.animation = .easeIn + mapView.mapView.moveCamera(cameraUpdate) + viewModel.action( input: .markerTapped(tag: targetMarker.tag) ) @@ -560,8 +575,7 @@ private extension HomeViewController { NSLayoutConstraint.activate([ refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), refreshButton.widthAnchor.constraint(equalToConstant: 110), - refreshButton.heightAnchor.constraint(equalToConstant: 35), - refreshButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -400) + refreshButton.heightAnchor.constraint(equalToConstant: 35) // TODO: bottom constraints ํ•„์š” ]) @@ -597,19 +611,12 @@ extension HomeViewController: NMFMapViewCameraDelegate { func mapView(_ mapView: NMFMapView, cameraDidChangeByReason reason: Int, animated: Bool) { if reason == NMFMapChangedByDeveloper { - mapView.positionMode = .direction - viewModel.action(input: .checkLocationAuthorizationWhenCameraDidChange( status: locationManager.authorizationStatus ) ) - refreshButton.animationFire() - viewModel.action( - input: .refresh( - requestLocation: makeRequestLocation(projection: mapView.projection) - ) - ) + } } From a93b498b0c9b96ee2cd8a16f19d1d93d5afb8abb Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Tue, 6 Feb 2024 23:25:46 +0900 Subject: [PATCH 151/231] =?UTF-8?q?feat=20:=20StoreListViewController=20UI?= =?UTF-8?q?TableView=20Cell=20=EC=84=A0=ED=83=9D=EC=8B=9C=20=EA=B7=B8?= =?UTF-8?q?=EB=A6=BC=EC=9E=90=20=EC=A0=9C=EA=B1=B0=20(#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/StoreList/View/StoreListViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index dc3cc900..a195c257 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -51,6 +51,7 @@ final class StoreListViewController: UIViewController { return StoreTableViewCell() } cell.setUIContents(storeContents: storeContents) + cell.selectionStyle = .none return cell } From 7444a81c7cf5949f43c97c723fa9a1f82606c45f Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 00:55:54 +0900 Subject: [PATCH 152/231] =?UTF-8?q?feat=20:=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20View=20Controller=20=EC=A0=81=EC=9A=A9=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 12 +- KCS/KCS/Data/Storage.swift | 2 +- .../Home/View/HomeViewController.swift | 4 +- .../OnBoarding/FourthOnBoardingView.swift | 6 +- .../OnBoarding/OnBoardingViewController.swift | 147 ++++++++++++++++++ .../OnBoarding/SecondOnBoardingView.swift | 12 +- .../OnBoarding/ThirdOnBoardingView.swift | 6 +- 7 files changed, 181 insertions(+), 8 deletions(-) create mode 100644 KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 1dcf8878..60aba134 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -35,8 +35,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ) ) ) - - window?.rootViewController = HomeViewController( + let homeViewController = HomeViewController( viewModel: viewModel, storeInformationViewController: storeInformationViewController, storeListViewController: StoreListViewController( @@ -48,6 +47,15 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ), summaryViewHeightObserver: summaryViewHeightObserver ) + + var rootViewController: UIViewController + + if Storage.isFirstTime() { + rootViewController = OnBoardingViewController(homeViewController: homeViewController) + } else { + rootViewController = homeViewController + } + window?.rootViewController = rootViewController window?.makeKeyAndVisible() } diff --git a/KCS/KCS/Data/Storage.swift b/KCS/KCS/Data/Storage.swift index 52eb58e0..ec026500 100644 --- a/KCS/KCS/Data/Storage.swift +++ b/KCS/KCS/Data/Storage.swift @@ -12,7 +12,7 @@ final class Storage { static func isFirstTime() -> Bool { let defaults = UserDefaults.standard if defaults.object(forKey: "isFirstTime") == nil { - defaults.set(false, forKey:"isFirstTime") + defaults.set(false, forKey: "isFirstTime") return true } else { return false diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 16e2a664..52ae2b70 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -611,7 +611,9 @@ extension HomeViewController: NMFMapViewTouchDelegate { extension HomeViewController: UISheetPresentationControllerDelegate { - func sheetPresentationControllerDidChangeSelectedDetentIdentifier(_ sheetPresentationController: UISheetPresentationController) { + func sheetPresentationControllerDidChangeSelectedDetentIdentifier( + _ sheetPresentationController: UISheetPresentationController + ) { if let identifier = sheetPresentationController.selectedDetentIdentifier { switch identifier { case .smallSummaryDetentIdentifier, .largeSummaryDetentIdentifier: diff --git a/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift index 6f621528..c8ac6dce 100644 --- a/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift @@ -34,7 +34,11 @@ final class FourthOnBoardingView: UIView { let text = "๊ฐ์—ผ๋ณ‘์— ์ทจ์•ฝํ•œ ์‹์‚ฌ๋ฌธํ™” ๊ฐœ์„ ์„ ์œ„ํ•ด\n๋œ์–ด๋จน๊ธฐ, ์œ„์ƒ์  ์ˆ˜์ €๊ด€๋ฆฌ, ์ข…์‚ฌ์ž ๋งˆ์Šคํฌ\n์ฐฉ์šฉ ๋ฐ ์ƒํ™œ ๋ฐฉ์—ญ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ณณ์œผ๋กœ\n์†Œ์žฌ์ง€ ์ง€์ž์ฒด์˜ ์ธ์ฆ์„\n๋ฐ›์€ ์Œ์‹์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค." let attributeString = NSMutableAttributedString(string: text) - attributeString.addAttribute(.foregroundColor, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "๋œ์–ด๋จน๊ธฐ, ์œ„์ƒ์  ์ˆ˜์ €๊ด€๋ฆฌ, ์ข…์‚ฌ์ž ๋งˆ์Šคํฌ\n์ฐฉ์šฉ ๋ฐ ์ƒํ™œ ๋ฐฉ์—ญ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ณณ")) + attributeString.addAttribute( + .foregroundColor, + value: UIFont.pretendard(size: 19, weight: .heavy), + range: (text as NSString).range(of: "๋œ์–ด๋จน๊ธฐ, ์œ„์ƒ์  ์ˆ˜์ €๊ด€๋ฆฌ, ์ข…์‚ฌ์ž ๋งˆ์Šคํฌ\n์ฐฉ์šฉ ๋ฐ ์ƒํ™œ ๋ฐฉ์—ญ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ณณ") + ) label.attributedText = attributeString label.font = UIFont.pretendard(size: 19, weight: .medium) diff --git a/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift b/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift new file mode 100644 index 00000000..ddc2a1e9 --- /dev/null +++ b/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift @@ -0,0 +1,147 @@ +// +// OnBoardingViewController.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/5/24. +// + +import UIKit +import RxSwift +import RxCocoa + +final class OnBoardingViewController: UIViewController { + + private let disposeBag = DisposeBag() + + private let onBoardingViews: [UIView] = [ + FirstOnBoardingView(), + SecondOnBoardingView(), + ThirdOnBoardingView(), + FourthOnBoardingView(), + FifthOnBoardingView() + ] + + private lazy var onBoardingScrollView: UIScrollView = { + let scrollView = UIScrollView() + scrollView.translatesAutoresizingMaskIntoConstraints = false + scrollView.contentSize = CGSize( + width: UIScreen.main.bounds.width * CGFloat(onBoardingViews.count), + height: scrollView.bounds.height + ) + scrollView.isPagingEnabled = true + scrollView.showsHorizontalScrollIndicator = false + scrollView.showsVerticalScrollIndicator = false + scrollView.bounces = false + scrollView.delegate = self + + for index in 0..<5 { + let view = onBoardingViews[index] + view.frame = UIScreen.main.bounds + view.frame.origin.x = UIScreen.main.bounds.width * CGFloat(index) + scrollView.addSubview(view) + } + + return scrollView + }() + + private lazy var pageControl: UIPageControl = { + let pageControl = UIPageControl() + pageControl.translatesAutoresizingMaskIntoConstraints = false + pageControl.pageIndicatorTintColor = .swipeBar + pageControl.currentPageIndicatorTintColor = .primary1 + pageControl.numberOfPages = onBoardingViews.count + pageControl.currentPage = 0 + pageControl.isUserInteractionEnabled = false + + return pageControl + }() + + private lazy var startButton: UIButton = { + let button = UIButton() + button.translatesAutoresizingMaskIntoConstraints = false + button.setTitle("์‹œ์ž‘ํ•˜๊ธฐ", for: .normal) + button.titleLabel?.font = UIFont.pretendard(size: 16, weight: .medium) + button.titleLabel?.textColor = .white + button.setLayerCorner(cornerRadius: 6) + button.backgroundColor = .primary1 + button.isHidden = true + button.rx.tap + .bind { [weak self] in + guard let self = self else { return } + homeViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen + present(homeViewController, animated: true) + } + .disposed(by: disposeBag) + + return button + }() + + private let homeViewController: HomeViewController + + init(homeViewController: HomeViewController) { + self.homeViewController = homeViewController + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + setBackgroundColor() + addUIComponents() + configureConstraints() + } + +} + +private extension OnBoardingViewController { + + func setBackgroundColor() { + view.backgroundColor = .white + } + + func addUIComponents() { + view.addSubview(onBoardingScrollView) + view.addSubview(pageControl) + view.addSubview(startButton) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + onBoardingScrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 53), + onBoardingScrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + onBoardingScrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), + onBoardingScrollView.bottomAnchor.constraint(equalTo: pageControl.topAnchor, constant: 50) + ]) + + NSLayoutConstraint.activate([ + pageControl.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -99), + pageControl.centerXAnchor.constraint(equalTo: view.centerXAnchor) + ]) + + NSLayoutConstraint.activate([ + startButton.topAnchor.constraint(equalTo: pageControl.bottomAnchor, constant: 10), + startButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), + startButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 16), + startButton.heightAnchor.constraint(equalToConstant: 50) + ]) + } + +} + +extension OnBoardingViewController: UIScrollViewDelegate { + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + pageControl.currentPage = Int(round(scrollView.contentOffset.x / scrollView.frame.size.width)) + + if pageControl.currentPage == onBoardingViews.count - 1 { + startButton.isHidden = false + } else { + startButton.isHidden = true + } + } + +} diff --git a/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift index bcab7551..411ced5d 100644 --- a/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift @@ -34,8 +34,16 @@ final class SecondOnBoardingView: UIView { let text = "2011๋…„๋ถ€ํ„ฐ ๋ฌผ๊ฐ€์•ˆ์ •์„ ์œ„ํ•ด\n๊ฐ€๊ฒฉ์ด ์ €๋ ดํ•˜์ง€๋งŒ ์–‘์งˆ์˜ ์„œ๋น„์Šค๋ฅผ\n์ œ๊ณตํ•˜๋Š” ๊ณณ์„ ์ •๋ถ€๊ฐ€ ์ง€์ •ํ•œ\n์šฐ๋ฆฌ ๋™๋„ค์˜ ์ข‹์€ ์—…์†Œ์ž…๋‹ˆ๋‹ค." let attributeString = NSMutableAttributedString(string: text) - attributeString.addAttribute(.foregroundColor, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "๊ฐ€๊ฒฉ์ด ์ €๋ ด")) - attributeString.addAttribute(.foregroundColor, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "์–‘์งˆ์˜ ์„œ๋น„์Šค")) + attributeString.addAttribute( + .foregroundColor, + value: UIFont.pretendard(size: 19, weight: .heavy), + range: (text as NSString).range(of: "๊ฐ€๊ฒฉ์ด ์ €๋ ด") + ) + attributeString.addAttribute( + .foregroundColor, + value: UIFont.pretendard(size: 19, weight: .heavy), + range: (text as NSString).range(of: "์–‘์งˆ์˜ ์„œ๋น„์Šค") + ) label.attributedText = attributeString label.font = UIFont.pretendard(size: 19, weight: .medium) diff --git a/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift index 4f5aaf8f..df4d1e2e 100644 --- a/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift @@ -34,7 +34,11 @@ final class ThirdOnBoardingView: UIView { let text = "์‹ํ’ˆ์œ„์ƒ๋ฒ•์— ๊ทผ๊ฑฐํ•˜์—ฌ\n์œ„์ƒ๊ด€๋ฆฌ ์ƒํƒœ ๋“ฑ์ด ์šฐ์ˆ˜ํ•œ ์—…์†Œ๋ฅผ\n๋ชจ๋ฒ”์—…์†Œ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.\n์„œ๋น„์Šค ์ˆ˜์ค€ ํ–ฅ์ƒ๊ณผ ์œ„์ƒ์  ๊ฐœ์„ ์„ ๋„๋ชจํ•˜๊ธฐ\n์œ„ํ•ด ์šด์˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค." let attributeString = NSMutableAttributedString(string: text) - attributeString.addAttribute(.foregroundColor, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "์œ„์ƒ๊ด€๋ฆฌ ์ƒํƒœ ๋“ฑ์ด ์šฐ์ˆ˜ํ•œ ์—…์†Œ")) + attributeString.addAttribute( + .foregroundColor, + value: UIFont.pretendard(size: 19, weight: .heavy), + range: (text as NSString).range(of: "์œ„์ƒ๊ด€๋ฆฌ ์ƒํƒœ ๋“ฑ์ด ์šฐ์ˆ˜ํ•œ ์—…์†Œ") + ) label.attributedText = attributeString label.font = UIFont.pretendard(size: 19, weight: .medium) From 711df94b534c88dde7ed1deda5e7bb274b692c12 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 01:08:07 +0900 Subject: [PATCH 153/231] =?UTF-8?q?fix=20:=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20=ED=99=94=EB=A9=B4=20=ED=8A=B9=EC=A0=95=20=EA=B8=80=EC=9E=90?= =?UTF-8?q?=20=EB=91=90=EA=BB=98=20=EB=B3=80=EA=B2=BD=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OnBoarding/FourthOnBoardingView.swift | 11 +++++------ .../OnBoarding/SecondOnBoardingView.swift | 13 ++++++------- .../OnBoarding/ThirdOnBoardingView.swift | 11 +++++------ 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift index c8ac6dce..6b3ccef1 100644 --- a/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift @@ -31,20 +31,19 @@ final class FourthOnBoardingView: UIView { private let bottomLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 19, weight: .medium) + label.textColor = .black + label.textAlignment = .center + label.numberOfLines = 5 let text = "๊ฐ์—ผ๋ณ‘์— ์ทจ์•ฝํ•œ ์‹์‚ฌ๋ฌธํ™” ๊ฐœ์„ ์„ ์œ„ํ•ด\n๋œ์–ด๋จน๊ธฐ, ์œ„์ƒ์  ์ˆ˜์ €๊ด€๋ฆฌ, ์ข…์‚ฌ์ž ๋งˆ์Šคํฌ\n์ฐฉ์šฉ ๋ฐ ์ƒํ™œ ๋ฐฉ์—ญ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ณณ์œผ๋กœ\n์†Œ์žฌ์ง€ ์ง€์ž์ฒด์˜ ์ธ์ฆ์„\n๋ฐ›์€ ์Œ์‹์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค." let attributeString = NSMutableAttributedString(string: text) attributeString.addAttribute( - .foregroundColor, + .font, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "๋œ์–ด๋จน๊ธฐ, ์œ„์ƒ์  ์ˆ˜์ €๊ด€๋ฆฌ, ์ข…์‚ฌ์ž ๋งˆ์Šคํฌ\n์ฐฉ์šฉ ๋ฐ ์ƒํ™œ ๋ฐฉ์—ญ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ณณ") ) - label.attributedText = attributeString - label.font = UIFont.pretendard(size: 19, weight: .medium) - label.textColor = .black - label.textAlignment = .center - label.numberOfLines = 5 return label }() diff --git a/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift index 411ced5d..cbf27c0f 100644 --- a/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift @@ -31,25 +31,24 @@ final class SecondOnBoardingView: UIView { private let bottomLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 19, weight: .medium) + label.textColor = .black + label.textAlignment = .center + label.numberOfLines = 4 let text = "2011๋…„๋ถ€ํ„ฐ ๋ฌผ๊ฐ€์•ˆ์ •์„ ์œ„ํ•ด\n๊ฐ€๊ฒฉ์ด ์ €๋ ดํ•˜์ง€๋งŒ ์–‘์งˆ์˜ ์„œ๋น„์Šค๋ฅผ\n์ œ๊ณตํ•˜๋Š” ๊ณณ์„ ์ •๋ถ€๊ฐ€ ์ง€์ •ํ•œ\n์šฐ๋ฆฌ ๋™๋„ค์˜ ์ข‹์€ ์—…์†Œ์ž…๋‹ˆ๋‹ค." let attributeString = NSMutableAttributedString(string: text) attributeString.addAttribute( - .foregroundColor, + .font, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "๊ฐ€๊ฒฉ์ด ์ €๋ ด") ) attributeString.addAttribute( - .foregroundColor, + .font, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "์–‘์งˆ์˜ ์„œ๋น„์Šค") ) - label.attributedText = attributeString - label.font = UIFont.pretendard(size: 19, weight: .medium) - label.textColor = .black - label.textAlignment = .center - label.numberOfLines = 4 return label }() diff --git a/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift index df4d1e2e..a237c674 100644 --- a/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift @@ -31,20 +31,19 @@ final class ThirdOnBoardingView: UIView { private let bottomLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.pretendard(size: 19, weight: .medium) + label.textColor = .black + label.textAlignment = .center + label.numberOfLines = 5 let text = "์‹ํ’ˆ์œ„์ƒ๋ฒ•์— ๊ทผ๊ฑฐํ•˜์—ฌ\n์œ„์ƒ๊ด€๋ฆฌ ์ƒํƒœ ๋“ฑ์ด ์šฐ์ˆ˜ํ•œ ์—…์†Œ๋ฅผ\n๋ชจ๋ฒ”์—…์†Œ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.\n์„œ๋น„์Šค ์ˆ˜์ค€ ํ–ฅ์ƒ๊ณผ ์œ„์ƒ์  ๊ฐœ์„ ์„ ๋„๋ชจํ•˜๊ธฐ\n์œ„ํ•ด ์šด์˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค." let attributeString = NSMutableAttributedString(string: text) attributeString.addAttribute( - .foregroundColor, + .font, value: UIFont.pretendard(size: 19, weight: .heavy), range: (text as NSString).range(of: "์œ„์ƒ๊ด€๋ฆฌ ์ƒํƒœ ๋“ฑ์ด ์šฐ์ˆ˜ํ•œ ์—…์†Œ") ) - label.attributedText = attributeString - label.font = UIFont.pretendard(size: 19, weight: .medium) - label.textColor = .black - label.textAlignment = .center - label.numberOfLines = 5 return label }() From 45eac17c4e8754d4845a3a7a485ea472854d301c Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 02:22:05 +0900 Subject: [PATCH 154/231] =?UTF-8?q?refactor=20:=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/OnBoarding/OnBoardingViewController.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift b/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift index ddc2a1e9..ba620a47 100644 --- a/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift +++ b/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift @@ -68,6 +68,7 @@ final class OnBoardingViewController: UIViewController { button.rx.tap .bind { [weak self] in guard let self = self else { return } + UserDefaults.standard.set(false, forKey: "executeOnBoarding") homeViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen present(homeViewController, animated: true) } @@ -90,7 +91,7 @@ final class OnBoardingViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - setBackgroundColor() + setup() addUIComponents() configureConstraints() } @@ -99,7 +100,7 @@ final class OnBoardingViewController: UIViewController { private extension OnBoardingViewController { - func setBackgroundColor() { + func setup() { view.backgroundColor = .white } From a0a49b2d89ad46f928d0590f91baf26cfe087300 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 02:22:49 +0900 Subject: [PATCH 155/231] =?UTF-8?q?fix=20:=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 2 +- KCS/KCS/Data/Storage.swift | 5 ++--- .../Presentation/OnBoarding/OnBoardingViewController.swift | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 60aba134..1b9d0a32 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -50,7 +50,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { var rootViewController: UIViewController - if Storage.isFirstTime() { + if Storage.executeOnBoarding() { rootViewController = OnBoardingViewController(homeViewController: homeViewController) } else { rootViewController = homeViewController diff --git a/KCS/KCS/Data/Storage.swift b/KCS/KCS/Data/Storage.swift index ec026500..f7ee9d40 100644 --- a/KCS/KCS/Data/Storage.swift +++ b/KCS/KCS/Data/Storage.swift @@ -9,10 +9,9 @@ import Foundation final class Storage { - static func isFirstTime() -> Bool { + static func executeOnBoarding() -> Bool { let defaults = UserDefaults.standard - if defaults.object(forKey: "isFirstTime") == nil { - defaults.set(false, forKey: "isFirstTime") + if defaults.object(forKey: "executeOnBoarding") == nil { return true } else { return false diff --git a/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift b/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift index ba620a47..37ecec78 100644 --- a/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift +++ b/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift @@ -34,6 +34,7 @@ final class OnBoardingViewController: UIViewController { scrollView.bounces = false scrollView.delegate = self + for index in 0..<5 { let view = onBoardingViews[index] view.frame = UIScreen.main.bounds From 9309bdf33d01a96de12ccda026d35c7e501ad674 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 02:35:53 +0900 Subject: [PATCH 156/231] =?UTF-8?q?refactor=20:=20AutoLayout=20=EB=B0=A9?= =?UTF-8?q?=EB=B2=95=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OnBoarding/FifthOnBoardingView.swift | 1 + .../OnBoarding/FirstOnBoardingView.swift | 1 + .../OnBoarding/FourthOnBoardingView.swift | 1 + .../OnBoarding/OnBoardingViewController.swift | 36 ++++++++++++++++--- .../OnBoarding/SecondOnBoardingView.swift | 1 + .../OnBoarding/ThirdOnBoardingView.swift | 1 + 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift index 8147a1e6..1dcc6eee 100644 --- a/KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift @@ -42,6 +42,7 @@ final class FifthOnBoardingView: UIView { init() { super.init(frame: .zero) + translatesAutoresizingMaskIntoConstraints = false addUIComponents() configureConstraints() } diff --git a/KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift index a5a950c1..431b6e4f 100644 --- a/KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift @@ -44,6 +44,7 @@ final class FirstOnBoardingView: UIView { init() { super.init(frame: .zero) + translatesAutoresizingMaskIntoConstraints = false addUIComponents() configureConstraints() } diff --git a/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift index 6b3ccef1..d286f5e4 100644 --- a/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift @@ -51,6 +51,7 @@ final class FourthOnBoardingView: UIView { init() { super.init(frame: .zero) + translatesAutoresizingMaskIntoConstraints = false addUIComponents() configureConstraints() } diff --git a/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift b/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift index 37ecec78..2a310640 100644 --- a/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift +++ b/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift @@ -34,11 +34,7 @@ final class OnBoardingViewController: UIViewController { scrollView.bounces = false scrollView.delegate = self - - for index in 0..<5 { - let view = onBoardingViews[index] - view.frame = UIScreen.main.bounds - view.frame.origin.x = UIScreen.main.bounds.width * CGFloat(index) + onBoardingViews.forEach { view in scrollView.addSubview(view) } @@ -130,6 +126,36 @@ private extension OnBoardingViewController { startButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 16), startButton.heightAnchor.constraint(equalToConstant: 50) ]) + + NSLayoutConstraint.activate([ + onBoardingViews[0].leadingAnchor.constraint(equalTo: onBoardingScrollView.leadingAnchor), + onBoardingViews[0].bottomAnchor.constraint(equalTo: onBoardingScrollView.bottomAnchor), + onBoardingViews[0].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) + ]) + + NSLayoutConstraint.activate([ + onBoardingViews[1].leadingAnchor.constraint(equalTo: onBoardingViews[0].trailingAnchor), + onBoardingViews[1].bottomAnchor.constraint(equalTo: onBoardingScrollView.bottomAnchor), + onBoardingViews[1].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) + ]) + + NSLayoutConstraint.activate([ + onBoardingViews[2].leadingAnchor.constraint(equalTo: onBoardingViews[1].trailingAnchor), + onBoardingViews[2].bottomAnchor.constraint(equalTo: onBoardingScrollView.bottomAnchor), + onBoardingViews[2].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) + ]) + + NSLayoutConstraint.activate([ + onBoardingViews[3].leadingAnchor.constraint(equalTo: onBoardingViews[2].trailingAnchor), + onBoardingViews[3].bottomAnchor.constraint(equalTo: onBoardingScrollView.bottomAnchor), + onBoardingViews[3].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) + ]) + + NSLayoutConstraint.activate([ + onBoardingViews[4].leadingAnchor.constraint(equalTo: onBoardingViews[3].trailingAnchor), + onBoardingViews[4].bottomAnchor.constraint(equalTo: onBoardingScrollView.bottomAnchor), + onBoardingViews[4].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) + ]) } } diff --git a/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift index cbf27c0f..c932e37d 100644 --- a/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift @@ -56,6 +56,7 @@ final class SecondOnBoardingView: UIView { init() { super.init(frame: .zero) + translatesAutoresizingMaskIntoConstraints = false addUIComponents() configureConstraints() } diff --git a/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift index a237c674..bea73312 100644 --- a/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift @@ -51,6 +51,7 @@ final class ThirdOnBoardingView: UIView { init() { super.init(frame: .zero) + translatesAutoresizingMaskIntoConstraints = false addUIComponents() configureConstraints() } From 2b3fc4e79ad6a0386e3d7e5913215ff17207961a Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 03:17:25 +0900 Subject: [PATCH 157/231] =?UTF-8?q?fix=20:=20StoreListViewController=20pre?= =?UTF-8?q?sent=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 52ae2b70..df1061fe 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -215,7 +215,9 @@ final class HomeViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - presentStoreListView() + if Storage.executeOnBoarding() { + presentStoreListView() + } } } From 5fcbe083f45484176360ddcbc62e65cff4b470a9 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 03:29:55 +0900 Subject: [PATCH 158/231] =?UTF-8?q?refactor=20:=20onboarding=20=EC=B2=A0?= =?UTF-8?q?=EC=9E=90=20=EC=88=98=EC=A0=95=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 48 ++++++------- KCS/KCS/Application/SceneDelegate.swift | 4 +- KCS/KCS/Data/Storage.swift | 4 +- .../Home/View/HomeViewController.swift | 2 +- ...ngView.swift => FifthOnboardingView.swift} | 6 +- ...ngView.swift => FirstOnboardingView.swift} | 6 +- ...gView.swift => FourthOnboardingView.swift} | 6 +- ...r.swift => OnboardingViewController.swift} | 72 +++++++++---------- ...gView.swift => SecondOnboardingView.swift} | 6 +- ...ngView.swift => ThirdOnboardingView.swift} | 4 +- 10 files changed, 79 insertions(+), 79 deletions(-) rename KCS/KCS/Presentation/OnBoarding/{FifthOnBoardingView.swift => FifthOnboardingView.swift} (95%) rename KCS/KCS/Presentation/OnBoarding/{FirstOnBoardingView.swift => FirstOnboardingView.swift} (95%) rename KCS/KCS/Presentation/OnBoarding/{FourthOnBoardingView.swift => FourthOnboardingView.swift} (96%) rename KCS/KCS/Presentation/OnBoarding/{OnBoardingViewController.swift => OnboardingViewController.swift} (65%) rename KCS/KCS/Presentation/OnBoarding/{SecondOnBoardingView.swift => SecondOnboardingView.swift} (96%) rename KCS/KCS/Presentation/OnBoarding/{ThirdOnBoardingView.swift => ThirdOnboardingView.swift} (97%) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 4adea435..f7b2bb7b 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -86,13 +86,13 @@ A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */; }; A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */; }; A83367B82B6FA0E700E0A844 /* FetchStores.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B72B6FA0E700E0A844 /* FetchStores.swift */; }; - A83367BB2B709C0200E0A844 /* OnBoardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BA2B709C0200E0A844 /* OnBoardingViewController.swift */; }; + A83367BB2B709C0200E0A844 /* OnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BA2B709C0200E0A844 /* OnboardingViewController.swift */; }; A83367BD2B70A52900E0A844 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BC2B70A52900E0A844 /* Storage.swift */; }; - A83367BF2B7246E700E0A844 /* FirstOnBoardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BE2B7246E700E0A844 /* FirstOnBoardingView.swift */; }; - A83367C12B726E2600E0A844 /* SecondOnBoardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C02B726E2600E0A844 /* SecondOnBoardingView.swift */; }; - A83367C32B72714C00E0A844 /* ThirdOnBoardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C22B72714B00E0A844 /* ThirdOnBoardingView.swift */; }; - A83367C52B7271B900E0A844 /* FourthOnBoardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C42B7271B900E0A844 /* FourthOnBoardingView.swift */; }; - A83367C72B72725700E0A844 /* FifthOnBoardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C62B72725700E0A844 /* FifthOnBoardingView.swift */; }; + A83367BF2B7246E700E0A844 /* FirstOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BE2B7246E700E0A844 /* FirstOnboardingView.swift */; }; + A83367C12B726E2600E0A844 /* SecondOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C02B726E2600E0A844 /* SecondOnboardingView.swift */; }; + A83367C32B72714C00E0A844 /* ThirdOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C22B72714B00E0A844 /* ThirdOnboardingView.swift */; }; + A83367C52B7271B900E0A844 /* FourthOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C42B7271B900E0A844 /* FourthOnboardingView.swift */; }; + A83367C72B72725700E0A844 /* FifthOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367C62B72725700E0A844 /* FifthOnboardingView.swift */; }; A89087042B4E7F3500767225 /* FilterButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087032B4E7F3500767225 /* FilterButton.swift */; }; A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89087092B4EF00B00767225 /* SystemImage.swift */; }; A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A890870C2B4EF91600767225 /* UIView+SetLayer.swift */; }; @@ -213,13 +213,13 @@ A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = ""; }; A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreStoreButton.swift; sourceTree = ""; }; A83367B72B6FA0E700E0A844 /* FetchStores.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStores.swift; sourceTree = ""; }; - A83367BA2B709C0200E0A844 /* OnBoardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnBoardingViewController.swift; sourceTree = ""; }; + A83367BA2B709C0200E0A844 /* OnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewController.swift; sourceTree = ""; }; A83367BC2B70A52900E0A844 /* Storage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = ""; }; - A83367BE2B7246E700E0A844 /* FirstOnBoardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstOnBoardingView.swift; sourceTree = ""; }; - A83367C02B726E2600E0A844 /* SecondOnBoardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondOnBoardingView.swift; sourceTree = ""; }; - A83367C22B72714B00E0A844 /* ThirdOnBoardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdOnBoardingView.swift; sourceTree = ""; }; - A83367C42B7271B900E0A844 /* FourthOnBoardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FourthOnBoardingView.swift; sourceTree = ""; }; - A83367C62B72725700E0A844 /* FifthOnBoardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FifthOnBoardingView.swift; sourceTree = ""; }; + A83367BE2B7246E700E0A844 /* FirstOnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstOnboardingView.swift; sourceTree = ""; }; + A83367C02B726E2600E0A844 /* SecondOnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondOnboardingView.swift; sourceTree = ""; }; + A83367C22B72714B00E0A844 /* ThirdOnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdOnboardingView.swift; sourceTree = ""; }; + A83367C42B7271B900E0A844 /* FourthOnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FourthOnboardingView.swift; sourceTree = ""; }; + A83367C62B72725700E0A844 /* FifthOnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FifthOnboardingView.swift; sourceTree = ""; }; A89087032B4E7F3500767225 /* FilterButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterButton.swift; sourceTree = ""; }; A89087092B4EF00B00767225 /* SystemImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemImage.swift; sourceTree = ""; }; A890870C2B4EF91600767225 /* UIView+SetLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SetLayer.swift"; sourceTree = ""; }; @@ -617,12 +617,12 @@ A83367B92B709BE900E0A844 /* OnBoarding */ = { isa = PBXGroup; children = ( - A83367BA2B709C0200E0A844 /* OnBoardingViewController.swift */, - A83367BE2B7246E700E0A844 /* FirstOnBoardingView.swift */, - A83367C02B726E2600E0A844 /* SecondOnBoardingView.swift */, - A83367C22B72714B00E0A844 /* ThirdOnBoardingView.swift */, - A83367C42B7271B900E0A844 /* FourthOnBoardingView.swift */, - A83367C62B72725700E0A844 /* FifthOnBoardingView.swift */, + A83367BA2B709C0200E0A844 /* OnboardingViewController.swift */, + A83367BE2B7246E700E0A844 /* FirstOnboardingView.swift */, + A83367C02B726E2600E0A844 /* SecondOnboardingView.swift */, + A83367C22B72714B00E0A844 /* ThirdOnboardingView.swift */, + A83367C42B7271B900E0A844 /* FourthOnboardingView.swift */, + A83367C62B72725700E0A844 /* FifthOnboardingView.swift */, ); path = OnBoarding; sourceTree = ""; @@ -954,7 +954,7 @@ A890870F2B4F836C00767225 /* SummaryView.swift in Sources */, A802D1F62B5277630091FDE7 /* CertificationLabel.swift in Sources */, 59B886262B6A3A02005750EF /* StoreListViewController.swift in Sources */, - A83367C72B72725700E0A844 /* FifthOnBoardingView.swift in Sources */, + A83367C72B72725700E0A844 /* FifthOnboardingView.swift in Sources */, 5977BE612B55374000725C90 /* HomeViewModel.swift in Sources */, 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */, A8AE4B1B2B62A60B00632355 /* OpeningHoursCellView.swift in Sources */, @@ -972,7 +972,7 @@ 5977BE742B57FA7A00725C90 /* FilteredStores.swift in Sources */, A8A7E05D2B64AF1300D015E5 /* StoreInformationViewConstraints.swift in Sources */, 5977BE5E2B5535C700725C90 /* FetchRefreshStoresUseCase.swift in Sources */, - A83367BB2B709C0200E0A844 /* OnBoardingViewController.swift in Sources */, + A83367BB2B709C0200E0A844 /* OnboardingViewController.swift in Sources */, A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */, 59C306B02B4FFE4400862625 /* StoreResponse.swift in Sources */, A8A7E0602B64E62200D015E5 /* NMFMyPosition+.swift in Sources */, @@ -981,7 +981,7 @@ 59C306CD2B5035B100862625 /* StoreAPI.swift in Sources */, A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */, A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */, - A83367C52B7271B900E0A844 /* FourthOnBoardingView.swift in Sources */, + A83367C52B7271B900E0A844 /* FourthOnboardingView.swift in Sources */, 5977BE9E2B59ACE800725C90 /* ImageCache.swift in Sources */, 59B886642B6EC816005750EF /* SummaryViewHeightCase.swift in Sources */, 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */, @@ -994,18 +994,18 @@ A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, - A83367C32B72714C00E0A844 /* ThirdOnBoardingView.swift in Sources */, + A83367C32B72714C00E0A844 /* ThirdOnboardingView.swift in Sources */, A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */, A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */, 59B8864A2B6A9CCB005750EF /* UIStackView+clear.swift in Sources */, 59C306C72B501B1E00862625 /* JSONContentsError.swift in Sources */, 59C306CB2B50357900862625 /* Router.swift in Sources */, A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, - A83367BF2B7246E700E0A844 /* FirstOnBoardingView.swift in Sources */, + A83367BF2B7246E700E0A844 /* FirstOnboardingView.swift in Sources */, 59C306B62B50027300862625 /* Store.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, 59B8865A2B6E3B40005750EF /* StoreInformationViewController.swift in Sources */, - A83367C12B726E2600E0A844 /* SecondOnBoardingView.swift in Sources */, + A83367C12B726E2600E0A844 /* SecondOnboardingView.swift in Sources */, A8A7E0622B652F0D00D015E5 /* MarkerContents.swift in Sources */, 59B8865C2B6E4B8B005750EF /* StoreInformationViewModel.swift in Sources */, 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */, diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 1b9d0a32..aee6880b 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -50,8 +50,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { var rootViewController: UIViewController - if Storage.executeOnBoarding() { - rootViewController = OnBoardingViewController(homeViewController: homeViewController) + if Storage.isOnboarded() { + rootViewController = OnboardingViewController(homeViewController: homeViewController) } else { rootViewController = homeViewController } diff --git a/KCS/KCS/Data/Storage.swift b/KCS/KCS/Data/Storage.swift index f7ee9d40..39935b1e 100644 --- a/KCS/KCS/Data/Storage.swift +++ b/KCS/KCS/Data/Storage.swift @@ -9,9 +9,9 @@ import Foundation final class Storage { - static func executeOnBoarding() -> Bool { + static func isOnboarded() -> Bool { let defaults = UserDefaults.standard - if defaults.object(forKey: "executeOnBoarding") == nil { + if defaults.object(forKey: "executeOnboarding") == nil { return true } else { return false diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index df1061fe..fdbe1a5b 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -215,7 +215,7 @@ final class HomeViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - if Storage.executeOnBoarding() { + if Storage.isOnboarded() { presentStoreListView() } } diff --git a/KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FifthOnboardingView.swift similarity index 95% rename from KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift rename to KCS/KCS/Presentation/OnBoarding/FifthOnboardingView.swift index 1dcc6eee..defa3e88 100644 --- a/KCS/KCS/Presentation/OnBoarding/FifthOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FifthOnboardingView.swift @@ -1,5 +1,5 @@ // -// FifthOnBoardingView.swift +// FifthOnboardingView.swift // KCS // // Created by ๊น€์˜ํ˜„ on 2/6/24. @@ -7,7 +7,7 @@ import UIKit -final class FifthOnBoardingView: UIView { +final class FifthOnboardingView: UIView { private let topLabel: UILabel = { let label = UILabel() @@ -53,7 +53,7 @@ final class FifthOnBoardingView: UIView { } -private extension FifthOnBoardingView { +private extension FifthOnboardingView { func addUIComponents() { addSubview(topLabel) diff --git a/KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FirstOnboardingView.swift similarity index 95% rename from KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift rename to KCS/KCS/Presentation/OnBoarding/FirstOnboardingView.swift index 431b6e4f..172fbc80 100644 --- a/KCS/KCS/Presentation/OnBoarding/FirstOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FirstOnboardingView.swift @@ -1,5 +1,5 @@ // -// FirstOnBoardingView.swift +// FirstOnboardingView.swift // KCS // // Created by ๊น€์˜ํ˜„ on 2/6/24. @@ -7,7 +7,7 @@ import UIKit -final class FirstOnBoardingView: UIView { +final class FirstOnboardingView: UIView { private let topLabel: UILabel = { let label = UILabel() @@ -55,7 +55,7 @@ final class FirstOnBoardingView: UIView { } -private extension FirstOnBoardingView { +private extension FirstOnboardingView { func addUIComponents() { addSubview(topLabel) diff --git a/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/FourthOnboardingView.swift similarity index 96% rename from KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift rename to KCS/KCS/Presentation/OnBoarding/FourthOnboardingView.swift index d286f5e4..0ff4b21e 100644 --- a/KCS/KCS/Presentation/OnBoarding/FourthOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FourthOnboardingView.swift @@ -1,5 +1,5 @@ // -// FourthOnBoardingView.swift +// FourthOnboardingView.swift // KCS // // Created by ๊น€์˜ํ˜„ on 2/6/24. @@ -7,7 +7,7 @@ import UIKit -final class FourthOnBoardingView: UIView { +final class FourthOnboardingView: UIView { private let topLabel: UILabel = { let label = UILabel() @@ -62,7 +62,7 @@ final class FourthOnBoardingView: UIView { } -private extension FourthOnBoardingView { +private extension FourthOnboardingView { func addUIComponents() { addSubview(topLabel) diff --git a/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift b/KCS/KCS/Presentation/OnBoarding/OnboardingViewController.swift similarity index 65% rename from KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift rename to KCS/KCS/Presentation/OnBoarding/OnboardingViewController.swift index 2a310640..43b11032 100644 --- a/KCS/KCS/Presentation/OnBoarding/OnBoardingViewController.swift +++ b/KCS/KCS/Presentation/OnBoarding/OnboardingViewController.swift @@ -1,5 +1,5 @@ // -// OnBoardingViewController.swift +// OnboardingViewController.swift // KCS // // Created by ๊น€์˜ํ˜„ on 2/5/24. @@ -9,23 +9,23 @@ import UIKit import RxSwift import RxCocoa -final class OnBoardingViewController: UIViewController { +final class OnboardingViewController: UIViewController { private let disposeBag = DisposeBag() - private let onBoardingViews: [UIView] = [ - FirstOnBoardingView(), - SecondOnBoardingView(), - ThirdOnBoardingView(), - FourthOnBoardingView(), - FifthOnBoardingView() + private let onboardingViews: [UIView] = [ + FirstOnboardingView(), + SecondOnboardingView(), + ThirdOnboardingView(), + FourthOnboardingView(), + FifthOnboardingView() ] - private lazy var onBoardingScrollView: UIScrollView = { + private lazy var onboardingScrollView: UIScrollView = { let scrollView = UIScrollView() scrollView.translatesAutoresizingMaskIntoConstraints = false scrollView.contentSize = CGSize( - width: UIScreen.main.bounds.width * CGFloat(onBoardingViews.count), + width: UIScreen.main.bounds.width * CGFloat(onboardingViews.count), height: scrollView.bounds.height ) scrollView.isPagingEnabled = true @@ -34,7 +34,7 @@ final class OnBoardingViewController: UIViewController { scrollView.bounces = false scrollView.delegate = self - onBoardingViews.forEach { view in + onboardingViews.forEach { view in scrollView.addSubview(view) } @@ -46,7 +46,7 @@ final class OnBoardingViewController: UIViewController { pageControl.translatesAutoresizingMaskIntoConstraints = false pageControl.pageIndicatorTintColor = .swipeBar pageControl.currentPageIndicatorTintColor = .primary1 - pageControl.numberOfPages = onBoardingViews.count + pageControl.numberOfPages = onboardingViews.count pageControl.currentPage = 0 pageControl.isUserInteractionEnabled = false @@ -65,7 +65,7 @@ final class OnBoardingViewController: UIViewController { button.rx.tap .bind { [weak self] in guard let self = self else { return } - UserDefaults.standard.set(false, forKey: "executeOnBoarding") + UserDefaults.standard.set(false, forKey: "executeOnboarding") homeViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen present(homeViewController, animated: true) } @@ -95,24 +95,24 @@ final class OnBoardingViewController: UIViewController { } -private extension OnBoardingViewController { +private extension OnboardingViewController { func setup() { view.backgroundColor = .white } func addUIComponents() { - view.addSubview(onBoardingScrollView) + view.addSubview(onboardingScrollView) view.addSubview(pageControl) view.addSubview(startButton) } func configureConstraints() { NSLayoutConstraint.activate([ - onBoardingScrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 53), - onBoardingScrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), - onBoardingScrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), - onBoardingScrollView.bottomAnchor.constraint(equalTo: pageControl.topAnchor, constant: 50) + onboardingScrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 53), + onboardingScrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + onboardingScrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), + onboardingScrollView.bottomAnchor.constraint(equalTo: pageControl.topAnchor, constant: 50) ]) NSLayoutConstraint.activate([ @@ -128,44 +128,44 @@ private extension OnBoardingViewController { ]) NSLayoutConstraint.activate([ - onBoardingViews[0].leadingAnchor.constraint(equalTo: onBoardingScrollView.leadingAnchor), - onBoardingViews[0].bottomAnchor.constraint(equalTo: onBoardingScrollView.bottomAnchor), - onBoardingViews[0].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) + onboardingViews[0].leadingAnchor.constraint(equalTo: onboardingScrollView.leadingAnchor), + onboardingViews[0].bottomAnchor.constraint(equalTo: onboardingScrollView.bottomAnchor), + onboardingViews[0].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) ]) NSLayoutConstraint.activate([ - onBoardingViews[1].leadingAnchor.constraint(equalTo: onBoardingViews[0].trailingAnchor), - onBoardingViews[1].bottomAnchor.constraint(equalTo: onBoardingScrollView.bottomAnchor), - onBoardingViews[1].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) + onboardingViews[1].leadingAnchor.constraint(equalTo: onboardingViews[0].trailingAnchor), + onboardingViews[1].bottomAnchor.constraint(equalTo: onboardingScrollView.bottomAnchor), + onboardingViews[1].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) ]) NSLayoutConstraint.activate([ - onBoardingViews[2].leadingAnchor.constraint(equalTo: onBoardingViews[1].trailingAnchor), - onBoardingViews[2].bottomAnchor.constraint(equalTo: onBoardingScrollView.bottomAnchor), - onBoardingViews[2].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) + onboardingViews[2].leadingAnchor.constraint(equalTo: onboardingViews[1].trailingAnchor), + onboardingViews[2].bottomAnchor.constraint(equalTo: onboardingScrollView.bottomAnchor), + onboardingViews[2].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) ]) NSLayoutConstraint.activate([ - onBoardingViews[3].leadingAnchor.constraint(equalTo: onBoardingViews[2].trailingAnchor), - onBoardingViews[3].bottomAnchor.constraint(equalTo: onBoardingScrollView.bottomAnchor), - onBoardingViews[3].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) + onboardingViews[3].leadingAnchor.constraint(equalTo: onboardingViews[2].trailingAnchor), + onboardingViews[3].bottomAnchor.constraint(equalTo: onboardingScrollView.bottomAnchor), + onboardingViews[3].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) ]) NSLayoutConstraint.activate([ - onBoardingViews[4].leadingAnchor.constraint(equalTo: onBoardingViews[3].trailingAnchor), - onBoardingViews[4].bottomAnchor.constraint(equalTo: onBoardingScrollView.bottomAnchor), - onBoardingViews[4].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) + onboardingViews[4].leadingAnchor.constraint(equalTo: onboardingViews[3].trailingAnchor), + onboardingViews[4].bottomAnchor.constraint(equalTo: onboardingScrollView.bottomAnchor), + onboardingViews[4].widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width) ]) } } -extension OnBoardingViewController: UIScrollViewDelegate { +extension OnboardingViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { pageControl.currentPage = Int(round(scrollView.contentOffset.x / scrollView.frame.size.width)) - if pageControl.currentPage == onBoardingViews.count - 1 { + if pageControl.currentPage == onboardingViews.count - 1 { startButton.isHidden = false } else { startButton.isHidden = true diff --git a/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/SecondOnboardingView.swift similarity index 96% rename from KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift rename to KCS/KCS/Presentation/OnBoarding/SecondOnboardingView.swift index c932e37d..f9df22d6 100644 --- a/KCS/KCS/Presentation/OnBoarding/SecondOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/SecondOnboardingView.swift @@ -1,5 +1,5 @@ // -// SecondOnBoardingView.swift +// SecondOnboardingView.swift // KCS // // Created by ๊น€์˜ํ˜„ on 2/6/24. @@ -7,7 +7,7 @@ import UIKit -final class SecondOnBoardingView: UIView { +final class SecondOnboardingView: UIView { private let topLabel: UILabel = { let label = UILabel() @@ -67,7 +67,7 @@ final class SecondOnBoardingView: UIView { } -private extension SecondOnBoardingView { +private extension SecondOnboardingView { func addUIComponents() { addSubview(topLabel) diff --git a/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift b/KCS/KCS/Presentation/OnBoarding/ThirdOnboardingView.swift similarity index 97% rename from KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift rename to KCS/KCS/Presentation/OnBoarding/ThirdOnboardingView.swift index bea73312..a1975faa 100644 --- a/KCS/KCS/Presentation/OnBoarding/ThirdOnBoardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/ThirdOnboardingView.swift @@ -7,7 +7,7 @@ import UIKit -final class ThirdOnBoardingView: UIView { +final class ThirdOnboardingView: UIView { private let topLabel: UILabel = { let label = UILabel() @@ -62,7 +62,7 @@ final class ThirdOnBoardingView: UIView { } -private extension ThirdOnBoardingView { +private extension ThirdOnboardingView { func addUIComponents() { addSubview(topLabel) From 71e2b4c7bbe6759ae47a9f8dbeacfea6270a1c7b Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 03:31:16 +0900 Subject: [PATCH 159/231] =?UTF-8?q?fix=20:=20image=20name=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/OnBoarding/FifthOnboardingView.swift | 2 +- KCS/KCS/Presentation/OnBoarding/FirstOnboardingView.swift | 2 +- KCS/KCS/Presentation/OnBoarding/FourthOnboardingView.swift | 2 +- KCS/KCS/Presentation/OnBoarding/SecondOnboardingView.swift | 2 +- KCS/KCS/Presentation/OnBoarding/ThirdOnboardingView.swift | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Presentation/OnBoarding/FifthOnboardingView.swift b/KCS/KCS/Presentation/OnBoarding/FifthOnboardingView.swift index defa3e88..72f6e57d 100644 --- a/KCS/KCS/Presentation/OnBoarding/FifthOnboardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FifthOnboardingView.swift @@ -21,7 +21,7 @@ final class FifthOnboardingView: UIView { }() private let centerImageView: UIImageView = { - let imageView = UIImageView(image: UIImage.onBoarding5) + let imageView = UIImageView(image: UIImage.onboarding5) imageView.translatesAutoresizingMaskIntoConstraints = false imageView.contentMode = .scaleAspectFit diff --git a/KCS/KCS/Presentation/OnBoarding/FirstOnboardingView.swift b/KCS/KCS/Presentation/OnBoarding/FirstOnboardingView.swift index 172fbc80..a8e1e479 100644 --- a/KCS/KCS/Presentation/OnBoarding/FirstOnboardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FirstOnboardingView.swift @@ -22,7 +22,7 @@ final class FirstOnboardingView: UIView { }() private let centerImageView: UIImageView = { - let imageView = UIImageView(image: UIImage.onBoarding1) + let imageView = UIImageView(image: UIImage.onboarding1) imageView.translatesAutoresizingMaskIntoConstraints = false imageView.contentMode = .scaleAspectFit diff --git a/KCS/KCS/Presentation/OnBoarding/FourthOnboardingView.swift b/KCS/KCS/Presentation/OnBoarding/FourthOnboardingView.swift index 0ff4b21e..5b76e667 100644 --- a/KCS/KCS/Presentation/OnBoarding/FourthOnboardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/FourthOnboardingView.swift @@ -21,7 +21,7 @@ final class FourthOnboardingView: UIView { }() private let centerImageView: UIImageView = { - let imageView = UIImageView(image: UIImage.onBoarding4) + let imageView = UIImageView(image: UIImage.onboarding4) imageView.translatesAutoresizingMaskIntoConstraints = false imageView.contentMode = .scaleAspectFit diff --git a/KCS/KCS/Presentation/OnBoarding/SecondOnboardingView.swift b/KCS/KCS/Presentation/OnBoarding/SecondOnboardingView.swift index f9df22d6..e6d03642 100644 --- a/KCS/KCS/Presentation/OnBoarding/SecondOnboardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/SecondOnboardingView.swift @@ -21,7 +21,7 @@ final class SecondOnboardingView: UIView { }() private let centerImageView: UIImageView = { - let imageView = UIImageView(image: UIImage.onBoarding2) + let imageView = UIImageView(image: UIImage.onboarding2) imageView.translatesAutoresizingMaskIntoConstraints = false imageView.contentMode = .scaleAspectFit diff --git a/KCS/KCS/Presentation/OnBoarding/ThirdOnboardingView.swift b/KCS/KCS/Presentation/OnBoarding/ThirdOnboardingView.swift index a1975faa..ca607033 100644 --- a/KCS/KCS/Presentation/OnBoarding/ThirdOnboardingView.swift +++ b/KCS/KCS/Presentation/OnBoarding/ThirdOnboardingView.swift @@ -21,7 +21,7 @@ final class ThirdOnboardingView: UIView { }() private let centerImageView: UIImageView = { - let imageView = UIImageView(image: UIImage.onBoarding3) + let imageView = UIImageView(image: UIImage.onboarding3) imageView.translatesAutoresizingMaskIntoConstraints = false imageView.contentMode = .scaleAspectFit From 05d9dc790e3d1d846a819010ef041d0758bc63be Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 7 Feb 2024 03:46:42 +0900 Subject: [PATCH 160/231] =?UTF-8?q?feat=20:=20StoreListViewController=20Ti?= =?UTF-8?q?tleBar=20=ED=81=AC=EA=B8=B0=20=EC=84=A4=EC=A0=95=20(#170)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension/UISheetPresentationController+Detent.swift | 2 +- .../StoreList/View/StoreListViewController.swift | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift b/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift index 1d1429b6..5b05b5b8 100644 --- a/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift +++ b/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift @@ -28,7 +28,7 @@ extension UISheetPresentationController.Detent { return 616 - 21 } static let smallStoreListViewDetent = custom(identifier: .smallStoreListViewDetentIdentifier) { _ in - return 35 + return 40 } static let largeStoreListViewDetent = large() diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index a195c257..228e5f73 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -90,6 +90,7 @@ private extension StoreListViewController { func setup() { isModalInPresentation = true storeTableView.delegate = self + view.backgroundColor = .white } func addUIComponents() { @@ -99,9 +100,10 @@ private extension StoreListViewController { func configureConstraints() { NSLayoutConstraint.activate([ - titleBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + titleBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 8), titleBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), - titleBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor) + titleBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), + titleBar.heightAnchor.constraint(equalToConstant: 65) ]) NSLayoutConstraint.activate([ From 1fb692a8abf7fb6d0c49e865aa4a9d7be48e7ad2 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 04:07:05 +0900 Subject: [PATCH 161/231] =?UTF-8?q?feat=20:=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EC=9E=AC=EA=B2=80=EC=83=89=20=EC=8B=9C=20position=20mode=20nor?= =?UTF-8?q?mal=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#172)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index aa2d3563..cafda54d 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -255,6 +255,8 @@ private extension HomeViewController { self?.refreshButton.isHidden = true self?.moreStoreButton.isHidden = isEntire self?.moreStoreButton.isEnabled = true + self?.mapView.mapView.positionMode = .normal + self?.locationButton.setImage(UIImage.locationButtonNone, for: .normal) } .disposed(by: disposeBag) @@ -560,7 +562,8 @@ private extension HomeViewController { NSLayoutConstraint.activate([ locationButton.leadingAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.leadingAnchor, constant: 16), locationButton.widthAnchor.constraint(equalToConstant: 48), - locationButton.heightAnchor.constraint(equalToConstant: 48) + locationButton.heightAnchor.constraint(equalToConstant: 48), + locationButton.bottomAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.bottomAnchor, constant: -100) // TODO: bottom constraints ํ•„์š” ]) From 3ba16aac323b555f3181730572e59943172425ca Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 7 Feb 2024 04:11:58 +0900 Subject: [PATCH 162/231] =?UTF-8?q?feat=20:=20Buttons=20Constraints=20View?= =?UTF-8?q?Controller=20=EC=9C=84=EB=A1=9C=20=EC=98=A4=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20(#170)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 49af244a..951b2732 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -178,6 +178,18 @@ final class HomeViewController: UIViewController { return view }() + private lazy var refreshButtonBottomConstraint = refreshButton.bottomAnchor.constraint( + equalTo: mapView.bottomAnchor, constant: -90 + ) + + private lazy var moreStoreButtonBottomConstraint = moreStoreButton.bottomAnchor.constraint( + equalTo: mapView.bottomAnchor, constant: -90 + ) + + private lazy var locationButtonBottomConstraint = locationButton.bottomAnchor.constraint( + equalTo: mapView.bottomAnchor, constant: -90 + ) + private let disposeBag = DisposeBag() private var markers: [Marker] = [] private let storeInformationViewController: StoreInformationViewController @@ -327,6 +339,7 @@ private extension HomeViewController { viewModel.getStoreInformationOutput .bind { [weak self] store in self?.storeInformationViewController.setUIContents(store: store) + self?.changeButtonsConstraints(delay: false) } .disposed(by: disposeBag) @@ -358,6 +371,7 @@ private extension HomeViewController { storeInformationViewController.changeToSummary() if !(presentedViewController is StoreInformationViewController) { dismiss(animated: true) + changeButtonsConstraints(delay: true) present(storeInformationViewController, animated: true) } } @@ -558,8 +572,8 @@ private extension HomeViewController { NSLayoutConstraint.activate([ locationButton.leadingAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.leadingAnchor, constant: 16), locationButton.widthAnchor.constraint(equalToConstant: 48), - locationButton.heightAnchor.constraint(equalToConstant: 48) - // TODO: bottom constraints ํ•„์š” + locationButton.heightAnchor.constraint(equalToConstant: 48), + locationButtonBottomConstraint ]) NSLayoutConstraint.activate([ @@ -576,17 +590,32 @@ private extension HomeViewController { refreshButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), refreshButton.widthAnchor.constraint(equalToConstant: 110), refreshButton.heightAnchor.constraint(equalToConstant: 35), - refreshButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) - // TODO: bottom constraints ํ•„์š” + refreshButtonBottomConstraint ]) NSLayoutConstraint.activate([ moreStoreButton.centerXAnchor.constraint(equalTo: mapView.centerXAnchor), - moreStoreButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -100) - // TODO: bottom constraints ํ•„์š” + moreStoreButton.widthAnchor.constraint(equalToConstant: 97), + moreStoreButtonBottomConstraint ]) } + func changeButtonsConstraints(delay: Bool) { + guard let controller = storeInformationViewController.sheetPresentationController else { return } + if controller.detents.contains(.smallSummaryViewDetent) { + refreshButtonBottomConstraint.constant = -260 + locationButtonBottomConstraint.constant = -260 + moreStoreButtonBottomConstraint.constant = -260 + } else { + refreshButtonBottomConstraint.constant = -283 + locationButtonBottomConstraint.constant = -283 + moreStoreButtonBottomConstraint.constant = -283 + } + UIView.animate(withDuration: 0.3, delay: delay ? 0.5 : 0) { + self.view.layoutIfNeeded() + } + } + } extension HomeViewController: CLLocationManagerDelegate { @@ -629,6 +658,9 @@ extension HomeViewController: NMFMapViewCameraDelegate { sheet.prefersGrabberVisible = true sheet.preferredCornerRadius = 15 } + refreshButtonBottomConstraint.constant = -90 + locationButtonBottomConstraint.constant = -90 + moreStoreButtonBottomConstraint.constant = -90 present(storeListViewController, animated: true) } } From 79332160cec2755bfec73f5f1fa2f3e93cb59373 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 04:18:38 +0900 Subject: [PATCH 163/231] =?UTF-8?q?fix=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=9E=84=EC=9D=98=EA=B0=92=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20(#172)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index cafda54d..9867efa2 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -562,8 +562,7 @@ private extension HomeViewController { NSLayoutConstraint.activate([ locationButton.leadingAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.leadingAnchor, constant: 16), locationButton.widthAnchor.constraint(equalToConstant: 48), - locationButton.heightAnchor.constraint(equalToConstant: 48), - locationButton.bottomAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.bottomAnchor, constant: -100) + locationButton.heightAnchor.constraint(equalToConstant: 48) // TODO: bottom constraints ํ•„์š” ]) From 98339ed6237751e6e376c00b056c8ba07ba06fe8 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 7 Feb 2024 04:28:20 +0900 Subject: [PATCH 164/231] =?UTF-8?q?feat=20:=20naver=20logo=20margin=20anim?= =?UTF-8?q?ation=20=EC=84=A4=EC=A0=95=20(#170)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/HomeViewController.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 951b2732..880e7010 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -93,8 +93,8 @@ final class HomeViewController: UIViewController { map.showScaleBar = false map.showIndoorLevelPicker = false map.showLocationButton = false - map.mapView.logoAlign = .rightTop - map.mapView.logoMargin = UIEdgeInsets(top: 28, left: 0, bottom: 0, right: 0) + map.mapView.logoAlign = .rightBottom + map.mapView.logoMargin = UIEdgeInsets(top: 0, left: 0, bottom: 55, right: 0) map.mapView.touchDelegate = self map.mapView.addCameraDelegate(delegate: self) @@ -606,10 +606,12 @@ private extension HomeViewController { refreshButtonBottomConstraint.constant = -260 locationButtonBottomConstraint.constant = -260 moreStoreButtonBottomConstraint.constant = -260 + mapView.mapView.logoMargin.bottom = 225 } else { refreshButtonBottomConstraint.constant = -283 locationButtonBottomConstraint.constant = -283 moreStoreButtonBottomConstraint.constant = -283 + mapView.mapView.logoMargin.bottom = 248 } UIView.animate(withDuration: 0.3, delay: delay ? 0.5 : 0) { self.view.layoutIfNeeded() @@ -661,6 +663,10 @@ extension HomeViewController: NMFMapViewCameraDelegate { refreshButtonBottomConstraint.constant = -90 locationButtonBottomConstraint.constant = -90 moreStoreButtonBottomConstraint.constant = -90 + mapView.mapView.logoMargin.bottom = 55 + UIView.animate(withDuration: 0.5) { + self.view.layoutIfNeeded() + } present(storeListViewController, animated: true) } } From ae22f73b3b638f438c32f7531901fc88a2db55d8 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 15:32:27 +0900 Subject: [PATCH 165/231] =?UTF-8?q?feat=20:=20Error=20Alert=20=EB=AC=B8?= =?UTF-8?q?=EA=B5=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Domain/Entity/ErrorAlertMessage.swift | 9 ++++++--- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 2 +- .../Presentation/Home/ViewModel/HomeViewModelImpl.swift | 4 ++-- .../ViewModel/StoreInformationViewModelImpl.swift | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift b/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift index 0dda525f..5e9537f8 100644 --- a/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift +++ b/KCS/KCS/Domain/Entity/ErrorAlertMessage.swift @@ -10,14 +10,17 @@ import Foundation enum ErrorAlertMessage: LocalizedError { case server - case data + case internet + case client var errorDescription: String? { switch self { case .server: return "์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์ด ์›ํ™œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค" - case .data: - return "๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค" + case .internet: + return "์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”" + case .client: + return "์•Œ ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค" } } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 9867efa2..e8665034 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -447,7 +447,7 @@ private extension HomeViewController { targetMarker.select() clickedMarker = targetMarker } else { - presentErrorAlert(error: .data) + presentErrorAlert(error: .client) } } .disposed(by: disposeBag) diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 13e357a8..bdbf4e83 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -91,7 +91,7 @@ private extension HomeViewModelImpl { }, onError: { [weak self] error in if error is StoreRepositoryError { - self?.errorAlertOutput.accept(.data) + self?.errorAlertOutput.accept(.client) } else { self?.errorAlertOutput.accept(.server) } @@ -173,7 +173,7 @@ private extension HomeViewModelImpl { try getStoreInformationUseCase.execute(tag: tag) ) } catch { - errorAlertOutput.accept(.data) + errorAlertOutput.accept(.client) } } diff --git a/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift b/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift index 750e73b4..359ac21f 100644 --- a/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift +++ b/KCS/KCS/Presentation/StoreInformation/ViewModel/StoreInformationViewModelImpl.swift @@ -66,7 +66,7 @@ private extension StoreInformationViewModelImpl { ) ) } catch { - errorAlertOutput.accept(.data) + errorAlertOutput.accept(.client) } } From 0acc6cf55dee158ace717713deaab0614cd1dd4e Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 7 Feb 2024 16:21:43 +0900 Subject: [PATCH 166/231] =?UTF-8?q?fix=20:=20Onboarding=20Assets=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EB=AA=85=20=EB=B3=80=EA=B2=BD=20(#175)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets.xcassets/OnBoarding1.imageset/Contents.json | 6 +++--- .../Assets.xcassets/OnBoarding2.imageset/Contents.json | 6 +++--- .../Assets.xcassets/OnBoarding3.imageset/Contents.json | 6 +++--- .../Assets.xcassets/OnBoarding4.imageset/Contents.json | 6 +++--- .../Assets.xcassets/OnBoarding5.imageset/Contents.json | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/Contents.json index b5133607..741952d6 100644 --- a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/Contents.json +++ b/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "OnBoarding1.png", + "filename" : "Onboarding1.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "OnBoarding1@2x.png", + "filename" : "Onboarding1@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "OnBoarding1@3x.png", + "filename" : "Onboarding1@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/Contents.json index dad45ccb..69d09f0e 100644 --- a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/Contents.json +++ b/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "OnBoarding2.png", + "filename" : "Onboarding2.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "OnBoarding2@2x.png", + "filename" : "Onboarding2@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "OnBoarding2@3x.png", + "filename" : "Onboarding2@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/Contents.json index 651571c8..43eba381 100644 --- a/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/Contents.json +++ b/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "OnBoarding3.png", + "filename" : "Onboarding3.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "OnBoarding3@2x.png", + "filename" : "Onboarding3@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "OnBoarding3@3x.png", + "filename" : "Onboarding3@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/Contents.json index 9fc3a8fc..6664a0ab 100644 --- a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/Contents.json +++ b/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "OnBoarding4.png", + "filename" : "Onboarding4.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "OnBoarding4@2x.png", + "filename" : "Onboarding4@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "OnBoarding4@3x.png", + "filename" : "Onboarding4@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/Contents.json index 02dcefee..15e08ab7 100644 --- a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/Contents.json +++ b/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "OnBoarding5.png", + "filename" : "Onboarding5.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "OnBoarding5@2x.png", + "filename" : "Onboarding5@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "OnBoarding5@3x.png", + "filename" : "Onboarding5@3x.png", "idiom" : "universal", "scale" : "3x" } From 1f6a99a9e8fbb79d067ba44c1f28c15d04fbcdc4 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 7 Feb 2024 16:37:55 +0900 Subject: [PATCH 167/231] =?UTF-8?q?fix=20:=20present=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=ED=95=B4=EA=B2=B0=20(#175)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 8 ---- .../Home/ViewModel/HomeDependency.swift | 1 + .../Home/ViewModel/HomeViewModelImpl.swift | 48 ++++++++++--------- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 7d38e2a0..12485858 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -228,14 +228,6 @@ final class HomeViewController: UIViewController { setup() } - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - - if Storage.isOnboarded() { - presentStoreListView() - } - } - } private extension HomeViewController { diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift index c3f24d9f..d4b7db28 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift @@ -13,6 +13,7 @@ struct HomeDependency { var activatedFilter: [CertificationType] = [] var fetchCount: Int = 1 var maxFetchCount: Int = 1 + var isRefreshReady: Bool = true mutating func resetFetchCount() { fetchCount = 1 diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 13e357a8..916c3ff9 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -75,29 +75,33 @@ private extension HomeViewModelImpl { requestLocation: RequestLocation, isEntire: Bool ) { - fetchRefreshStoresUseCase.execute( - requestLocation: requestLocation, - isEntire: isEntire - ) - .subscribe( - onNext: { [weak self] refreshContent in - guard let self = self else { return } - dependency.resetFetchCount() - dependency.maxFetchCount = refreshContent.fetchCountContent.maxFetchCount - applyFilters(stores: refreshContent.stores, filters: getActivatedTypes()) - fetchCountOutput.accept(FetchCountContent(maxFetchCount: dependency.maxFetchCount)) - refreshDoneOutput.accept(isEntire) - checkLastFetch() - }, - onError: { [weak self] error in - if error is StoreRepositoryError { - self?.errorAlertOutput.accept(.data) - } else { - self?.errorAlertOutput.accept(.server) + if dependency.isRefreshReady { + dependency.isRefreshReady = false + fetchRefreshStoresUseCase.execute( + requestLocation: requestLocation, + isEntire: isEntire + ) + .subscribe( + onNext: { [weak self] refreshContent in + guard let self = self else { return } + dependency.resetFetchCount() + dependency.maxFetchCount = refreshContent.fetchCountContent.maxFetchCount + applyFilters(stores: refreshContent.stores, filters: getActivatedTypes()) + fetchCountOutput.accept(FetchCountContent(maxFetchCount: dependency.maxFetchCount)) + refreshDoneOutput.accept(isEntire) + checkLastFetch() + dependency.isRefreshReady = true + }, + onError: { [weak self] error in + if error is StoreRepositoryError { + self?.errorAlertOutput.accept(.data) + } else { + self?.errorAlertOutput.accept(.server) + } } - } - ) - .disposed(by: dependency.disposeBag) + ) + .disposed(by: dependency.disposeBag) + } } func moreStoreButtonTapped() { From 3239ff052a52f682d35283acc4c4a5d6f58ccde6 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 17:09:18 +0900 Subject: [PATCH 168/231] =?UTF-8?q?feat=20:=20=EC=9D=B8=ED=84=B0=EB=84=B7?= =?UTF-8?q?=20=EC=97=B0=EA=B2=B0=20=EB=81=8A=EA=B2=BC=EC=9D=84=20=EC=8B=9C?= =?UTF-8?q?=20error=20=EC=B2=98=EB=A6=AC=20(#144)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Repository/StoreRepositoryImpl.swift | 8 ++++++-- .../Presentation/Home/ViewModel/HomeViewModelImpl.swift | 3 +++ KCS/Podfile.lock | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index cbdce69f..96b93c0e 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -57,8 +57,12 @@ final class StoreRepositoryImpl: StoreRepository { } } observer.onNext(fetchStores) - case .failure(let error): - throw error + case .failure(let error as NSError): + if error == AFError.sessionTaskFailed(error: NSError(domain: "NSURLErrorDomain", code: -1009)) as NSError { + observer.onError(ErrorAlertMessage.internet) + } else { + throw error + } } } catch { observer.onError(error) diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index bdbf4e83..28d78629 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -92,6 +92,9 @@ private extension HomeViewModelImpl { onError: { [weak self] error in if error is StoreRepositoryError { self?.errorAlertOutput.accept(.client) + } else if error is ErrorAlertMessage { + self?.errorAlertOutput.accept(.internet) + self?.refreshDoneOutput.accept(true) } else { self?.errorAlertOutput.accept(.server) } diff --git a/KCS/Podfile.lock b/KCS/Podfile.lock index e5af22a1..81ed8ce5 100644 --- a/KCS/Podfile.lock +++ b/KCS/Podfile.lock @@ -193,4 +193,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: a5566a18764ef703abc0265b00efa39f0938cc7c -COCOAPODS: 1.14.3 +COCOAPODS: 1.15.0 From f035d56d7df80477d264218e64e5555713d88eec Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 7 Feb 2024 17:14:40 +0900 Subject: [PATCH 169/231] =?UTF-8?q?fix=20:=20navigationBar=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=ED=9B=84=20UILabel=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#?= =?UTF-8?q?175)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../View/StoreListViewController.swift | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index 228e5f73..33657a35 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -15,15 +15,22 @@ final class StoreListViewController: UIViewController { private let disposeBag = DisposeBag() - private let titleBar: UINavigationBar = { - let navigationBar = UINavigationBar() - navigationBar.translatesAutoresizingMaskIntoConstraints = false - let titleItem = UINavigationItem(title: "๊ฐ€๊ฒŒ ๋ชจ์•„๋ณด๊ธฐ") - navigationBar.setItems([titleItem], animated: true) - navigationBar.backgroundColor = .white - navigationBar.isTranslucent = false + private let titleLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.text = "๊ฐ€๊ฒŒ ๋ชจ์•„๋ณด๊ธฐ" + label.font = UIFont.pretendard(size: 16, weight: .medium) + label.textColor = .black - return navigationBar + return label + }() + + private let divideView: UIView = { + let view = UIView() + view.translatesAutoresizingMaskIntoConstraints = false + view.backgroundColor = UIColor.lightGray + + return view }() private let storeTableView: UITableView = { @@ -95,19 +102,25 @@ private extension StoreListViewController { func addUIComponents() { view.addSubview(storeTableView) - view.addSubview(titleBar) + view.addSubview(titleLabel) + view.addSubview(divideView) } func configureConstraints() { NSLayoutConstraint.activate([ - titleBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 8), - titleBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), - titleBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), - titleBar.heightAnchor.constraint(equalToConstant: 65) + titleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 27), + titleLabel.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor) + ]) + + NSLayoutConstraint.activate([ + divideView.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 27), + divideView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + divideView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), + divideView.heightAnchor.constraint(equalToConstant: 0.5) ]) NSLayoutConstraint.activate([ - storeTableView.topAnchor.constraint(equalTo: titleBar.bottomAnchor), + storeTableView.topAnchor.constraint(equalTo: divideView.bottomAnchor), storeTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor), storeTableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), storeTableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor) From bdb4e9887a7b33249af702903ae97df97a844ceb Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 7 Feb 2024 17:55:20 +0900 Subject: [PATCH 170/231] =?UTF-8?q?feat=20:=20bind=EC=97=90=20debounce=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=20(#175)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 5 +++++ KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift | 1 - KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift | 4 ---- .../Presentation/OnBoarding/OnboardingViewController.swift | 1 + .../View/StoreInformationViewController.swift | 2 ++ KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift | 1 + 6 files changed, 9 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 12485858..7c8a22ef 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -124,6 +124,7 @@ final class HomeViewController: UIViewController { let button = RefreshButton() button.translatesAutoresizingMaskIntoConstraints = false button.rx.tap + .debounce(.milliseconds(10), scheduler: MainScheduler()) .map { [weak self] _ -> RequestLocation? in guard let self = self else { return nil } button.animationFire() @@ -149,6 +150,7 @@ final class HomeViewController: UIViewController { button.translatesAutoresizingMaskIntoConstraints = false button.isHidden = true button.rx.tap + .debounce(.milliseconds(100), scheduler: MainScheduler()) .bind { [weak self] in self?.viewModel.action( input: .moreStoreButtonTapped @@ -390,6 +392,7 @@ private extension HomeViewController { .disposed(by: disposeBag) viewModel.locationStatusAuthorizedWhenInUse + .debounce(.milliseconds(10), scheduler: MainScheduler()) .bind { [weak self] _ in guard let self = self else { return } guard let location = locationManager.location else { return } @@ -428,6 +431,7 @@ private extension HomeViewController { func bindErrorAlert() { viewModel.errorAlertOutput + .debounce(.milliseconds(100), scheduler: MainScheduler()) .bind { [weak self] error in self?.presentErrorAlert(error: error) } @@ -436,6 +440,7 @@ private extension HomeViewController { func bindListCellSelected() { listCellSelectedObserver + .debounce(.milliseconds(10), scheduler: MainScheduler()) .bind { [weak self] index in guard let self = self else { return } if markers.indices ~= index { diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift index d4b7db28..c3f24d9f 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeDependency.swift @@ -13,7 +13,6 @@ struct HomeDependency { var activatedFilter: [CertificationType] = [] var fetchCount: Int = 1 var maxFetchCount: Int = 1 - var isRefreshReady: Bool = true mutating func resetFetchCount() { fetchCount = 1 diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 916c3ff9..398eec1e 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -75,8 +75,6 @@ private extension HomeViewModelImpl { requestLocation: RequestLocation, isEntire: Bool ) { - if dependency.isRefreshReady { - dependency.isRefreshReady = false fetchRefreshStoresUseCase.execute( requestLocation: requestLocation, isEntire: isEntire @@ -90,7 +88,6 @@ private extension HomeViewModelImpl { fetchCountOutput.accept(FetchCountContent(maxFetchCount: dependency.maxFetchCount)) refreshDoneOutput.accept(isEntire) checkLastFetch() - dependency.isRefreshReady = true }, onError: { [weak self] error in if error is StoreRepositoryError { @@ -101,7 +98,6 @@ private extension HomeViewModelImpl { } ) .disposed(by: dependency.disposeBag) - } } func moreStoreButtonTapped() { diff --git a/KCS/KCS/Presentation/OnBoarding/OnboardingViewController.swift b/KCS/KCS/Presentation/OnBoarding/OnboardingViewController.swift index 43b11032..0f81d3e5 100644 --- a/KCS/KCS/Presentation/OnBoarding/OnboardingViewController.swift +++ b/KCS/KCS/Presentation/OnBoarding/OnboardingViewController.swift @@ -63,6 +63,7 @@ final class OnboardingViewController: UIViewController { button.backgroundColor = .primary1 button.isHidden = true button.rx.tap + .debounce(.milliseconds(100), scheduler: MainScheduler()) .bind { [weak self] in guard let self = self else { return } UserDefaults.standard.set(false, forKey: "executeOnboarding") diff --git a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift index 7181e5b0..35a16bd8 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift @@ -67,6 +67,7 @@ extension StoreInformationViewController { func bind() { viewModel.errorAlertOutput + .debounce(.milliseconds(100), scheduler: MainScheduler()) .bind { [weak self] error in self?.presentErrorAlert(error: error) } @@ -80,6 +81,7 @@ extension StoreInformationViewController { .disposed(by: disposeBag) viewModel.summaryCallButtonOutput + .debounce(.milliseconds(100), scheduler: MainScheduler()) .bind { [weak self] phoneNumber in self?.summaryView.setCallButton(phoneNumber: phoneNumber) } diff --git a/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift index a8f10ceb..e64766eb 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/SummaryView.swift @@ -196,6 +196,7 @@ extension SummaryView { func setCallButton(phoneNumber: String) { storeCallButton.isHidden = false callDisposable = storeCallButton.rx.tap + .debounce(.milliseconds(100), scheduler: MainScheduler()) .bind { [weak self] _ in self?.callButtonTapped(phoneNum: phoneNumber) } From c2673e4af61cad08dbe660cb583b1890443a89e7 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 7 Feb 2024 18:12:12 +0900 Subject: [PATCH 171/231] =?UTF-8?q?fix=20:=20SummaryView=20Binding=20?= =?UTF-8?q?=EC=8B=9C=EC=A0=90=20=EB=B3=80=EA=B2=BD=20(#175)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StoreInformation/View/StoreInformationViewController.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift index 35a16bd8..98c06aea 100644 --- a/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift +++ b/KCS/KCS/Presentation/StoreInformation/View/StoreInformationViewController.swift @@ -40,7 +40,7 @@ final class StoreInformationViewController: UIViewController { self.summaryViewHeightObserver = summaryViewHeightObserver self.viewModel = viewModel super.init(nibName: nil, bundle: nil) - + bind() } override func viewDidLoad() { @@ -48,7 +48,6 @@ final class StoreInformationViewController: UIViewController { addUIComponents() configureConstraints() - bind() setup() } From a81ad27d5e4000b267e64fc8364e9c5b5a96db08 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 7 Feb 2024 20:11:11 +0900 Subject: [PATCH 172/231] =?UTF-8?q?feat=20:=20=EC=95=B1=20Appearance=20Lig?= =?UTF-8?q?ht=20=EB=AA=A8=EB=93=9C=EB=A1=9C=20=EA=B3=A0=EC=A0=95=20(#177)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 2 ++ KCS/KCS/Presentation/Home/View/MoreStoreButton.swift | 2 +- KCS/KCS/Resource/Info.plist | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index f7b2bb7b..79b57542 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -1209,6 +1209,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1246,6 +1247,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift index 8fc3c5ca..d35f3e9c 100644 --- a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift +++ b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift @@ -14,7 +14,7 @@ final class MoreStoreButton: UIButton { if isEnabled { configuration?.baseForegroundColor = .black } else { - configuration?.baseForegroundColor = .grayLabel + configuration?.baseForegroundColor = .gray } } } diff --git a/KCS/KCS/Resource/Info.plist b/KCS/KCS/Resource/Info.plist index 642871e0..f35b2cd5 100644 --- a/KCS/KCS/Resource/Info.plist +++ b/KCS/KCS/Resource/Info.plist @@ -2,10 +2,10 @@ - ITSAppUsesNonExemptEncryption - DEV_SERVER_URL $(DEV_SERVER_URL) + ITSAppUsesNonExemptEncryption + NMAP_CLIENT_ID $(NMAP_CLIENT_ID) NSAppTransportSecurity From 6c95c08b131e7024a3ab7eb5faba0ed280af49f3 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Wed, 7 Feb 2024 20:18:41 +0900 Subject: [PATCH 173/231] =?UTF-8?q?fix=20:=20Figma=20=EC=83=89=EC=83=81?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=88=98=EC=A0=95=20(#177)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/MoreStoreButton.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift index d35f3e9c..8fc3c5ca 100644 --- a/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift +++ b/KCS/KCS/Presentation/Home/View/MoreStoreButton.swift @@ -14,7 +14,7 @@ final class MoreStoreButton: UIButton { if isEnabled { configuration?.baseForegroundColor = .black } else { - configuration?.baseForegroundColor = .gray + configuration?.baseForegroundColor = .grayLabel } } } From f03d75e38b69751db95ffebe1843add1a082bb1e Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 20:23:21 +0900 Subject: [PATCH 174/231] =?UTF-8?q?feat=20:=20error=20alert=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=A4=91=20(#144)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Repository/StoreRepositoryImpl.swift | 13 ++++++++----- .../Home/ViewModel/HomeViewModelImpl.swift | 4 +++- KCS/KCS/Resource/Info.plist | 4 ++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 96b93c0e..4ee4aca8 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -57,11 +57,14 @@ final class StoreRepositoryImpl: StoreRepository { } } observer.onNext(fetchStores) - case .failure(let error as NSError): - if error == AFError.sessionTaskFailed(error: NSError(domain: "NSURLErrorDomain", code: -1009)) as NSError { - observer.onError(ErrorAlertMessage.internet) - } else { - throw error + case .failure(let error): + if let underlyingError = error.underlyingError as? NSError { + switch underlyingError.code { + case URLError.notConnectedToInternet.rawValue: + observer.onError(ErrorAlertMessage.internet) + default: + observer.onError(ErrorAlertMessage.server) + } } } } catch { diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index bdbf4e83..7544e9de 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -93,7 +93,9 @@ private extension HomeViewModelImpl { if error is StoreRepositoryError { self?.errorAlertOutput.accept(.client) } else { - self?.errorAlertOutput.accept(.server) + guard let error = error as? ErrorAlertMessage else { return } + self?.errorAlertOutput.accept(error) + self?.refreshDoneOutput.accept(true) } } ) diff --git a/KCS/KCS/Resource/Info.plist b/KCS/KCS/Resource/Info.plist index 642871e0..f35b2cd5 100644 --- a/KCS/KCS/Resource/Info.plist +++ b/KCS/KCS/Resource/Info.plist @@ -2,10 +2,10 @@ - ITSAppUsesNonExemptEncryption - DEV_SERVER_URL $(DEV_SERVER_URL) + ITSAppUsesNonExemptEncryption + NMAP_CLIENT_ID $(NMAP_CLIENT_ID) NSAppTransportSecurity From f2407bae8a6fee243b59965bda29686ab2e9dcd3 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 21:46:32 +0900 Subject: [PATCH 175/231] =?UTF-8?q?fix=20:=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=ED=99=95=EC=9D=B8=20alert=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#144)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension/UIViewController+Alert.swift | 49 +++++++++++++++++++ .../UIViewController+ErrorAlert.swift | 23 --------- .../Home/View/HomeViewController.swift | 21 +------- 3 files changed, 50 insertions(+), 43 deletions(-) create mode 100644 KCS/KCS/Presentation/Extension/UIViewController+Alert.swift delete mode 100644 KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift diff --git a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift new file mode 100644 index 00000000..319db2ef --- /dev/null +++ b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift @@ -0,0 +1,49 @@ +// +// UIViewController+Alert.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/3/24. +// + +import UIKit + +extension UIViewController { + + func presentErrorAlert(error: ErrorAlertMessage) { + let alertController = UIAlertController(title: nil, message: error.errorDescription, preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: "ํ™•์ธ", style: .default)) + if let presentController = presentedViewController { + presentController.presentErrorAlert(error: error) + } else { + present(alertController, animated: true) + } + } + + func presentLocationAlert() { + let requestLocationServiceAlert: UIAlertController = { + let alertController = UIAlertController( + title: "์œ„์น˜ ์ •๋ณด ์ด์šฉ", + message: "์œ„์น˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n๋””๋ฐ”์ด์Šค์˜ '์„ค์ • > ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ'์—์„œ ์œ„์น˜ ์„œ๋น„์Šค๋ฅผ ์ผœ์ฃผ์„ธ์š”.", + preferredStyle: .alert + ) + let goSetting = UIAlertAction(title: "์„ค์ •์œผ๋กœ ์ด๋™", style: .destructive) { _ in + if let appSetting = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.open(appSetting) + } + } + let cancel = UIAlertAction(title: "์ทจ์†Œ", style: .cancel) + + alertController.addAction(cancel) + alertController.addAction(goSetting) + + return alertController + }() + + if let presentController = presentedViewController { + presentController.presentLocationAlert() + } else { + present(requestLocationServiceAlert, animated: true) + } + } + +} diff --git a/KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift b/KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift deleted file mode 100644 index 60c59f72..00000000 --- a/KCS/KCS/Presentation/Extension/UIViewController+ErrorAlert.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// UIViewController+ErrorAlert.swift -// KCS -// -// Created by ์กฐ์„ฑ๋ฏผ on 2/3/24. -// - -import UIKit - -extension UIViewController { - - func presentErrorAlert(error: ErrorAlertMessage) { - let alertController = UIAlertController(title: nil, message: error.errorDescription, preferredStyle: .alert) - alertController.addAction(UIAlertAction(title: "ํ™•์ธ", style: .default)) - if let presentController = presentedViewController { - presentController.presentErrorAlert(error: error) - } else { - present(alertController, animated: true) - } - - } - -} diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index f34e65fc..e8981226 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -101,25 +101,6 @@ final class HomeViewController: UIViewController { return map }() - private let requestLocationServiceAlert: UIAlertController = { - let alertController = UIAlertController( - title: "์œ„์น˜ ์ •๋ณด ์ด์šฉ", - message: "์œ„์น˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n๋””๋ฐ”์ด์Šค์˜ '์„ค์ • > ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ'์—์„œ ์œ„์น˜ ์„œ๋น„์Šค๋ฅผ ์ผœ์ฃผ์„ธ์š”.", - preferredStyle: .alert - ) - let goSetting = UIAlertAction(title: "์„ค์ •์œผ๋กœ ์ด๋™", style: .destructive) { _ in - if let appSetting = URL(string: UIApplication.openSettingsURLString) { - UIApplication.shared.open(appSetting) - } - } - let cancel = UIAlertAction(title: "์ทจ์†Œ", style: .cancel) - - alertController.addAction(cancel) - alertController.addAction(goSetting) - - return alertController - }() - private lazy var refreshButton: RefreshButton = { let button = RefreshButton() button.translatesAutoresizingMaskIntoConstraints = false @@ -380,7 +361,7 @@ private extension HomeViewController { viewModel.locationAuthorizationStatusDeniedOutput .bind { [weak self] _ in guard let self = self else { return } - present(requestLocationServiceAlert, animated: true) + presentLocationAlert() } .disposed(by: disposeBag) From 68b84d91cc420aa8397d657c2f5dffee4a7f2a23 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 21:47:12 +0900 Subject: [PATCH 176/231] =?UTF-8?q?chore=20:=20pbxproj=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B=20(#144)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index f7b2bb7b..ac7adeb6 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -42,7 +42,7 @@ 59B8865A2B6E3B40005750EF /* StoreInformationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886592B6E3B40005750EF /* StoreInformationViewController.swift */; }; 59B8865C2B6E4B8B005750EF /* StoreInformationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865B2B6E4B8B005750EF /* StoreInformationViewModel.swift */; }; 59B8865E2B6E4B98005750EF /* StoreInformationViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865D2B6E4B98005750EF /* StoreInformationViewModelImpl.swift */; }; - 59B886602B6E7CF6005750EF /* UIViewController+ErrorAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */; }; + 59B886602B6E7CF6005750EF /* UIViewController+Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B8865F2B6E7CF6005750EF /* UIViewController+Alert.swift */; }; 59B886622B6E8484005750EF /* UISheetPresentationController+Detent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */; }; 59B886642B6EC816005750EF /* SummaryViewHeightCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B886632B6EC816005750EF /* SummaryViewHeightCase.swift */; }; 59C306A42B4D7EBA00862625 /* Marker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A32B4D7EBA00862625 /* Marker.swift */; }; @@ -165,7 +165,7 @@ 59B886592B6E3B40005750EF /* StoreInformationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewController.swift; sourceTree = ""; }; 59B8865B2B6E4B8B005750EF /* StoreInformationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewModel.swift; sourceTree = ""; }; 59B8865D2B6E4B98005750EF /* StoreInformationViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInformationViewModelImpl.swift; sourceTree = ""; }; - 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+ErrorAlert.swift"; sourceTree = ""; }; + 59B8865F2B6E7CF6005750EF /* UIViewController+Alert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Alert.swift"; sourceTree = ""; }; 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISheetPresentationController+Detent.swift"; sourceTree = ""; }; 59B886632B6EC816005750EF /* SummaryViewHeightCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewHeightCase.swift; sourceTree = ""; }; 59C306A32B4D7EBA00862625 /* Marker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Marker.swift; sourceTree = ""; }; @@ -637,7 +637,7 @@ A8A7E05F2B64E62200D015E5 /* NMFMyPosition+.swift */, 59B8862A2B6A3F7F005750EF /* UITableViewCell+Identifier.swift */, 59B886492B6A9CCB005750EF /* UIStackView+clear.swift */, - 59B8865F2B6E7CF6005750EF /* UIViewController+ErrorAlert.swift */, + 59B8865F2B6E7CF6005750EF /* UIViewController+Alert.swift */, 59B886612B6E8484005750EF /* UISheetPresentationController+Detent.swift */, ); path = Extension; @@ -1027,7 +1027,7 @@ A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */, 59B886622B6E8484005750EF /* UISheetPresentationController+Detent.swift in Sources */, 59C306D82B50650D00862625 /* Encodable+.swift in Sources */, - 59B886602B6E7CF6005750EF /* UIViewController+ErrorAlert.swift in Sources */, + 59B886602B6E7CF6005750EF /* UIViewController+Alert.swift in Sources */, 5977BE682B553C8300725C90 /* HomeDependency.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1199,7 +1199,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 7CQAR4CYZX; + DEVELOPMENT_TEAM = MMM58CZBQF; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = KCS/Resource/Info.plist; @@ -1215,7 +1215,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 3.0; - PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; + PRODUCT_BUNDLE_IDENTIFIER = com.kcs.yeonghyeon.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -1236,7 +1236,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 7CQAR4CYZX; + DEVELOPMENT_TEAM = MMM58CZBQF; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = KCS/Resource/Info.plist; @@ -1252,7 +1252,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 3.0; - PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; + PRODUCT_BUNDLE_IDENTIFIER = com.kcs.yeonghyeon.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; From 78405919be444b7cc755e9d7080ba9633c672c78 Mon Sep 17 00:00:00 2001 From: k2645 Date: Wed, 7 Feb 2024 22:00:29 +0900 Subject: [PATCH 177/231] =?UTF-8?q?fix=20:=20error=20alert=20=EB=91=90=20?= =?UTF-8?q?=EB=B2=88=20=EB=9C=A8=EB=8A=94=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#144)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension/UIViewController+Alert.swift | 2 +- .../Home/View/HomeViewController.swift | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift index 319db2ef..46872e88 100644 --- a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift +++ b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift @@ -14,7 +14,7 @@ extension UIViewController { alertController.addAction(UIAlertAction(title: "ํ™•์ธ", style: .default)) if let presentController = presentedViewController { presentController.presentErrorAlert(error: error) - } else { + } else if !(self is UIAlertController) { present(alertController, animated: true) } } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index e8981226..ac07c2e8 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -209,6 +209,7 @@ final class HomeViewController: UIViewController { configureConstraints() bind() setup() + refresh() } } @@ -386,13 +387,7 @@ private extension HomeViewController { cameraUpdate.animation = .none mapView.mapView.moveCamera(cameraUpdate) mapView.mapView.positionMode = .direction - - refreshButton.animationFire() - viewModel.action( - input: .refresh( - requestLocation: makeRequestLocation(projection: mapView.mapView.projection) - ) - ) + refresh() } .disposed(by: disposeBag) } @@ -521,6 +516,15 @@ private extension HomeViewController { ) ) } + + func refresh() { + refreshButton.animationFire() + viewModel.action( + input: .refresh( + requestLocation: makeRequestLocation(projection: mapView.mapView.projection) + ) + ) + } } From 44088cf1e02a65ec3d2c9f13a19ad809ca80d63a Mon Sep 17 00:00:00 2001 From: k2645 Date: Thu, 8 Feb 2024 02:32:27 +0900 Subject: [PATCH 178/231] =?UTF-8?q?feat=20:=20baseURL=20PROD=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index b77fe9e0..d1cefa38 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -881,6 +881,7 @@ }; 59B886232B69EE17005750EF /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -1126,6 +1127,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ""; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1183,6 +1185,7 @@ LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + OTHER_LDFLAGS = ""; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; VALIDATE_PRODUCT = YES; @@ -1199,7 +1202,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = MMM58CZBQF; + DEVELOPMENT_TEAM = ""; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = KCS/Resource/Info.plist; @@ -1216,7 +1219,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 3.0; - PRODUCT_BUNDLE_IDENTIFIER = com.kcs.yeonghyeon.nainga; + PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -1237,7 +1240,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = MMM58CZBQF; + DEVELOPMENT_TEAM = ""; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = KCS/Resource/Info.plist; @@ -1254,7 +1257,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 3.0; - PRODUCT_BUNDLE_IDENTIFIER = com.kcs.yeonghyeon.nainga; + PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; From cfa0f133922a13b664733839a9be358f11707645 Mon Sep 17 00:00:00 2001 From: k2645 Date: Thu, 8 Feb 2024 02:32:52 +0900 Subject: [PATCH 179/231] =?UTF-8?q?refactor=20:=20lint=20issue=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/.swiftlint.yml | 2 +- .../Data/Repository/StoreRepositoryImpl.swift | 26 ++++++++----------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/KCS/.swiftlint.yml b/KCS/.swiftlint.yml index 4fb199e9..d765ab53 100644 --- a/KCS/.swiftlint.yml +++ b/KCS/.swiftlint.yml @@ -1,5 +1,6 @@ disabled_rules: - trailing_whitespace + - file_length opt_in_rules: - empty_string @@ -9,7 +10,6 @@ excluded: - KCS/Application line_length: 140 -file_length: 650 cyclomatic_complexity: 20 identifier_name: max_length: 50 diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 4ee4aca8..ac1c496c 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -36,27 +36,23 @@ final class StoreRepositoryImpl: StoreRepository { switch response.result { case .success(let result): let resultStores = try result.data.map { try $0.map { try $0.toEntity() } } - var fetchStores: FetchStores self?.stores = resultStores if isEntire { - fetchStores = FetchStores( + observer.onNext(FetchStores( fetchCountContent: FetchCountContent(), stores: resultStores.flatMap { $0 } - ) + )) + } else if let firstIndexStore = resultStores.first { + observer.onNext(FetchStores( + fetchCountContent: FetchCountContent(maxFetchCount: resultStores.count), + stores: firstIndexStore + )) } else { - if let firstIndexStore = resultStores.first { - fetchStores = FetchStores( - fetchCountContent: FetchCountContent(maxFetchCount: resultStores.count), - stores: firstIndexStore - ) - } else { - fetchStores = FetchStores( - fetchCountContent: FetchCountContent(), - stores: [] - ) - } + observer.onNext(FetchStores( + fetchCountContent: FetchCountContent(), + stores: [] + )) } - observer.onNext(fetchStores) case .failure(let error): if let underlyingError = error.underlyingError as? NSError { switch underlyingError.code { From 8477d30eb6f134da57948128fb73f0b86c14331c Mon Sep 17 00:00:00 2001 From: k2645 Date: Thu, 8 Feb 2024 02:33:55 +0900 Subject: [PATCH 180/231] chore : xcode version update --- KCS/KCS.xcodeproj/project.pbxproj | 2 ++ KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index d1cefa38..7fd39fcc 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -1276,6 +1276,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 7CQAR4CYZX; ENABLE_APP_SANDBOX = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -1301,6 +1302,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 7CQAR4CYZX; ENABLE_APP_SANDBOX = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; diff --git a/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme b/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme index 5ff40d72..34426967 100644 --- a/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme +++ b/KCS/KCS.xcodeproj/xcshareddata/xcschemes/KCS.xcscheme @@ -1,6 +1,6 @@ Date: Thu, 8 Feb 2024 03:50:26 +0900 Subject: [PATCH 181/231] =?UTF-8?q?fix=20:=20base=20URL=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Network/StoreAPI.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 93658693..018a4faa 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -20,7 +20,7 @@ extension StoreAPI: Router, URLRequestConvertible { var baseURL: String? { switch self { case .getStores: - return getURL(type: .develop) + return getURL(type: .product) case .getImage(let url): return url } From 96beba238c7cf3f0a04ba43240a37bb7bedc2bc7 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 8 Feb 2024 05:38:54 +0900 Subject: [PATCH 182/231] =?UTF-8?q?fix=20:=20Lint=20=EB=B0=8F=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/.swiftlint.yml | 4 +-- KCS/KCS.xcodeproj/project.pbxproj | 24 ++++++++++------- .../Data/Repository/StoreRepositoryImpl.swift | 26 ++++++++----------- KCS/Podfile.lock | 2 +- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/KCS/.swiftlint.yml b/KCS/.swiftlint.yml index 4fb199e9..527bd03f 100644 --- a/KCS/.swiftlint.yml +++ b/KCS/.swiftlint.yml @@ -1,6 +1,7 @@ disabled_rules: - trailing_whitespace - + - file_length + opt_in_rules: - empty_string @@ -9,7 +10,6 @@ excluded: - KCS/Application line_length: 140 -file_length: 650 cyclomatic_complexity: 20 identifier_name: max_length: 50 diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index b77fe9e0..2e977e13 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 591A88862B384E610059E40F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 591A88852B384E610059E40F /* Assets.xcassets */; }; 591A88892B384E610059E40F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 591A88872B384E610059E40F /* LaunchScreen.storyboard */; }; 592262242B61203000CA5A11 /* DetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262232B61203000CA5A11 /* DetailView.swift */; }; + 59503A4A2B741F1E0006CF35 /* Secret.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 59503A492B741F1E0006CF35 /* Secret.xcconfig */; }; 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */; }; 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */; }; 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE572B5524D500725C90 /* RefreshButton.swift */; }; @@ -135,6 +136,7 @@ 591A88882B384E610059E40F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 591A888A2B384E610059E40F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 592262232B61203000CA5A11 /* DetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailView.swift; sourceTree = ""; }; + 59503A492B741F1E0006CF35 /* Secret.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Secret.xcconfig; sourceTree = ""; }; 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlertMessage.swift; sourceTree = ""; }; 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewContents.swift; sourceTree = ""; }; 5977BE572B5524D500725C90 /* RefreshButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshButton.swift; sourceTree = ""; }; @@ -151,7 +153,6 @@ 5977BE992B59AC3300725C90 /* ImageRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRepository.swift; sourceTree = ""; }; 5977BE9B2B59AC8D00725C90 /* ImageRepositoryImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRepositoryImpl.swift; sourceTree = ""; }; 5977BE9D2B59ACE800725C90 /* ImageCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageCache.swift; sourceTree = ""; }; - 5986DCE82B390A8D005AE43B /* Secret.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Secret.xcconfig; sourceTree = ""; }; 598CC4D72B5D2E3C0043D064 /* FetchRefreshStoresUseCaseImplTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchRefreshStoresUseCaseImplTests.swift; sourceTree = ""; }; 598CC4DA2B5D344C0043D064 /* MockSuccessStoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSuccessStoreRepository.swift; sourceTree = ""; }; 598CC4DC2B5D44940043D064 /* MockFailStoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFailStoreRepository.swift; sourceTree = ""; }; @@ -263,7 +264,7 @@ 591A88702B384E600059E40F = { isa = PBXGroup; children = ( - 5986DCE82B390A8D005AE43B /* Secret.xcconfig */, + 59503A492B741F1E0006CF35 /* Secret.xcconfig */, 59053D0A2B3889A200D190CC /* .swiftlint.yml */, 59EC537F2B69E5E2004DB2F9 /* GoogleService-Info.plist */, 591A887B2B384E600059E40F /* KCS */, @@ -720,7 +721,7 @@ 591A88772B384E600059E40F /* Resources */, 591A88902B3884930059E40F /* SwiftLint Run Script */, C9DF99EE5FF9433DE46D74ED /* [CP] Embed Pods Frameworks */, - 59B886232B69EE17005750EF /* ShellScript */, + 59B886232B69EE17005750EF /* Firebase Run Script */, ); buildRules = ( ); @@ -800,6 +801,7 @@ A81EFBC52B5D597400D0C0D7 /* Pretendard-SemiBold.ttf in Resources */, A81EFBC22B5D597400D0C0D7 /* Pretendard-Regular.ttf in Resources */, A81EFBC02B5D597400D0C0D7 /* Pretendard-Medium.ttf in Resources */, + 59503A4A2B741F1E0006CF35 /* Secret.xcconfig in Resources */, 59053D0B2B3889A200D190CC /* .swiftlint.yml in Resources */, 591A88892B384E610059E40F /* LaunchScreen.storyboard in Resources */, A81EFBC82B5D597400D0C0D7 /* Pretendard-Light.ttf in Resources */, @@ -879,8 +881,9 @@ shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/SwiftLint/swiftlint\"\n"; }; - 59B886232B69EE17005750EF /* ShellScript */ = { + 59B886232B69EE17005750EF /* Firebase Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -893,6 +896,7 @@ "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)", "$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist", ); + name = "Firebase Run Script"; outputFileListPaths = ( ); outputPaths = ( @@ -1070,7 +1074,7 @@ /* Begin XCBuildConfiguration section */ 591A888B2B384E610059E40F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5986DCE82B390A8D005AE43B /* Secret.xcconfig */; + baseConfigurationReference = 59503A492B741F1E0006CF35 /* Secret.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1134,7 +1138,7 @@ }; 591A888C2B384E610059E40F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5986DCE82B390A8D005AE43B /* Secret.xcconfig */; + baseConfigurationReference = 59503A492B741F1E0006CF35 /* Secret.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1199,7 +1203,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = MMM58CZBQF; + DEVELOPMENT_TEAM = 7CQAR4CYZX; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = KCS/Resource/Info.plist; @@ -1216,7 +1220,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 3.0; - PRODUCT_BUNDLE_IDENTIFIER = com.kcs.yeonghyeon.nainga; + PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -1237,7 +1241,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = MMM58CZBQF; + DEVELOPMENT_TEAM = 7CQAR4CYZX; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = KCS/Resource/Info.plist; @@ -1254,7 +1258,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 3.0; - PRODUCT_BUNDLE_IDENTIFIER = com.kcs.yeonghyeon.nainga; + PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 4ee4aca8..ac1c496c 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -36,27 +36,23 @@ final class StoreRepositoryImpl: StoreRepository { switch response.result { case .success(let result): let resultStores = try result.data.map { try $0.map { try $0.toEntity() } } - var fetchStores: FetchStores self?.stores = resultStores if isEntire { - fetchStores = FetchStores( + observer.onNext(FetchStores( fetchCountContent: FetchCountContent(), stores: resultStores.flatMap { $0 } - ) + )) + } else if let firstIndexStore = resultStores.first { + observer.onNext(FetchStores( + fetchCountContent: FetchCountContent(maxFetchCount: resultStores.count), + stores: firstIndexStore + )) } else { - if let firstIndexStore = resultStores.first { - fetchStores = FetchStores( - fetchCountContent: FetchCountContent(maxFetchCount: resultStores.count), - stores: firstIndexStore - ) - } else { - fetchStores = FetchStores( - fetchCountContent: FetchCountContent(), - stores: [] - ) - } + observer.onNext(FetchStores( + fetchCountContent: FetchCountContent(), + stores: [] + )) } - observer.onNext(fetchStores) case .failure(let error): if let underlyingError = error.underlyingError as? NSError { switch underlyingError.code { diff --git a/KCS/Podfile.lock b/KCS/Podfile.lock index 81ed8ce5..4bb108a1 100644 --- a/KCS/Podfile.lock +++ b/KCS/Podfile.lock @@ -193,4 +193,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: a5566a18764ef703abc0265b00efa39f0938cc7c -COCOAPODS: 1.15.0 +COCOAPODS: 1.15.2 From 5f8795df67d67a46004fa306be34b53838835ab5 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 8 Feb 2024 05:48:37 +0900 Subject: [PATCH 183/231] =?UTF-8?q?fix=20:=20base=20URL=20Product=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Network/StoreAPI.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 93658693..018a4faa 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -20,7 +20,7 @@ extension StoreAPI: Router, URLRequestConvertible { var baseURL: String? { switch self { case .getStores: - return getURL(type: .develop) + return getURL(type: .product) case .getImage(let url): return url } From 1d3ad1834efe6a22b0854b5a36225f8d003f3327 Mon Sep 17 00:00:00 2001 From: k2645 Date: Thu, 8 Feb 2024 16:27:20 +0900 Subject: [PATCH 184/231] =?UTF-8?q?refactor=20:=20Usecase=20protocol=20dir?= =?UTF-8?q?ectory=20=EB=B3=80=EA=B2=BD=20(#182)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 18 +++++++++++++++--- .../protocol}/FetchImageUseCase.swift | 0 .../protocol}/FetchRefreshStoresUseCase.swift | 0 .../protocol}/FetchStoresUseCase.swift | 0 .../protocol}/GetOpenClosedUseCase.swift | 0 .../protocol}/GetStoreInformationUseCase.swift | 0 6 files changed, 15 insertions(+), 3 deletions(-) rename KCS/KCS/Domain/{Interface/UseCase => UseCase/protocol}/FetchImageUseCase.swift (100%) rename KCS/KCS/Domain/{Interface/UseCase => UseCase/protocol}/FetchRefreshStoresUseCase.swift (100%) rename KCS/KCS/Domain/{Interface/UseCase => UseCase/protocol}/FetchStoresUseCase.swift (100%) rename KCS/KCS/Domain/{Interface/UseCase => UseCase/protocol}/GetOpenClosedUseCase.swift (100%) rename KCS/KCS/Domain/{Interface/UseCase => UseCase/protocol}/GetStoreInformationUseCase.swift (100%) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index b77fe9e0..78d8ffe4 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -84,6 +84,7 @@ A81EFBC72B5D597400D0C0D7 /* Pretendard-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBBE2B5D597400D0C0D7 /* Pretendard-Bold.ttf */; }; A81EFBC82B5D597400D0C0D7 /* Pretendard-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */; }; A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */; }; + A821A3742B74B84700089B8F /* SplashViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A821A3732B74B84700089B8F /* SplashViewController.swift */; }; A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */; }; A83367B82B6FA0E700E0A844 /* FetchStores.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B72B6FA0E700E0A844 /* FetchStores.swift */; }; A83367BB2B709C0200E0A844 /* OnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BA2B709C0200E0A844 /* OnboardingViewController.swift */; }; @@ -211,6 +212,7 @@ A81EFBBE2B5D597400D0C0D7 /* Pretendard-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.ttf"; sourceTree = ""; }; A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Light.ttf"; sourceTree = ""; }; A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = ""; }; + A821A3732B74B84700089B8F /* SplashViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashViewController.swift; sourceTree = ""; }; A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreStoreButton.swift; sourceTree = ""; }; A83367B72B6FA0E700E0A844 /* FetchStores.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStores.swift; sourceTree = ""; }; A83367BA2B709C0200E0A844 /* OnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewController.swift; sourceTree = ""; }; @@ -296,7 +298,7 @@ path = KCS; sourceTree = ""; }; - 5977BE592B55355D00725C90 /* UseCase */ = { + 5977BE592B55355D00725C90 /* protocol */ = { isa = PBXGroup; children = ( 5977BE5D2B5535C700725C90 /* FetchRefreshStoresUseCase.swift */, @@ -305,12 +307,13 @@ A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */, 59F478B42B59BE0B002FEF9E /* FetchImageUseCase.swift */, ); - path = UseCase; + path = protocol; sourceTree = ""; }; 5977BE5A2B55356600725C90 /* UseCase */ = { isa = PBXGroup; children = ( + 5977BE592B55355D00725C90 /* protocol */, A8ACB7EB2B59644100540BD1 /* Error */, 5977BE5B2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift */, 5977BE972B5999E000725C90 /* FetchStoresUseCaseImpl.swift */, @@ -394,6 +397,7 @@ 59B886242B6A39E9005750EF /* StoreList */, 59B886552B6E3A59005750EF /* StoreInformation */, A83367B92B709BE900E0A844 /* OnBoarding */, + A821A3722B74B82600089B8F /* Splash */, ); path = Presentation; sourceTree = ""; @@ -614,6 +618,14 @@ path = font; sourceTree = ""; }; + A821A3722B74B82600089B8F /* Splash */ = { + isa = PBXGroup; + children = ( + A821A3732B74B84700089B8F /* SplashViewController.swift */, + ); + path = Splash; + sourceTree = ""; + }; A83367B92B709BE900E0A844 /* OnBoarding */ = { isa = PBXGroup; children = ( @@ -646,7 +658,6 @@ A8ACB7CC2B54ED3800540BD1 /* Interface */ = { isa = PBXGroup; children = ( - 5977BE592B55355D00725C90 /* UseCase */, 59C306A72B4FF98600862625 /* Repository */, ); path = Interface; @@ -993,6 +1004,7 @@ 592262242B61203000CA5A11 /* DetailView.swift in Sources */, A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, + A821A3742B74B84700089B8F /* SplashViewController.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, A83367C32B72714C00E0A844 /* ThirdOnboardingView.swift in Sources */, A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */, diff --git a/KCS/KCS/Domain/Interface/UseCase/FetchImageUseCase.swift b/KCS/KCS/Domain/UseCase/protocol/FetchImageUseCase.swift similarity index 100% rename from KCS/KCS/Domain/Interface/UseCase/FetchImageUseCase.swift rename to KCS/KCS/Domain/UseCase/protocol/FetchImageUseCase.swift diff --git a/KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift b/KCS/KCS/Domain/UseCase/protocol/FetchRefreshStoresUseCase.swift similarity index 100% rename from KCS/KCS/Domain/Interface/UseCase/FetchRefreshStoresUseCase.swift rename to KCS/KCS/Domain/UseCase/protocol/FetchRefreshStoresUseCase.swift diff --git a/KCS/KCS/Domain/Interface/UseCase/FetchStoresUseCase.swift b/KCS/KCS/Domain/UseCase/protocol/FetchStoresUseCase.swift similarity index 100% rename from KCS/KCS/Domain/Interface/UseCase/FetchStoresUseCase.swift rename to KCS/KCS/Domain/UseCase/protocol/FetchStoresUseCase.swift diff --git a/KCS/KCS/Domain/Interface/UseCase/GetOpenClosedUseCase.swift b/KCS/KCS/Domain/UseCase/protocol/GetOpenClosedUseCase.swift similarity index 100% rename from KCS/KCS/Domain/Interface/UseCase/GetOpenClosedUseCase.swift rename to KCS/KCS/Domain/UseCase/protocol/GetOpenClosedUseCase.swift diff --git a/KCS/KCS/Domain/Interface/UseCase/GetStoreInformationUseCase.swift b/KCS/KCS/Domain/UseCase/protocol/GetStoreInformationUseCase.swift similarity index 100% rename from KCS/KCS/Domain/Interface/UseCase/GetStoreInformationUseCase.swift rename to KCS/KCS/Domain/UseCase/protocol/GetStoreInformationUseCase.swift From cf1c73b71a2ede0fd40086ace2bc41664c32d259 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 8 Feb 2024 17:07:54 +0900 Subject: [PATCH 185/231] =?UTF-8?q?fix=20:=20baseURL=20develop=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#184)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Network/StoreAPI.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 018a4faa..93658693 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -20,7 +20,7 @@ extension StoreAPI: Router, URLRequestConvertible { var baseURL: String? { switch self { case .getStores: - return getURL(type: .product) + return getURL(type: .develop) case .getImage(let url): return url } From 4f3d86b904eac98a8c85edc01e3d528a6f1cf734 Mon Sep 17 00:00:00 2001 From: k2645 Date: Thu, 8 Feb 2024 18:10:25 +0900 Subject: [PATCH 186/231] =?UTF-8?q?fix=20:=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=9D=B4=EB=A6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#182)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Onboarding1.png} | Bin .../Onboarding1@2x.png} | Bin .../Onboarding1@3x.png} | Bin .../Contents.json | 0 .../Onboarding2.png} | Bin .../Onboarding2@2x.png} | Bin .../Onboarding2@3x.png} | Bin .../Contents.json | 0 .../Onboarding3.png} | Bin .../Onboarding3@2x.png} | Bin .../Onboarding3@3x.png} | Bin .../Contents.json | 0 .../Onboarding4.png} | Bin .../Onboarding4@2x.png} | Bin .../Onboarding4@3x.png} | Bin .../Contents.json | 0 .../Onboarding5.png} | Bin .../Onboarding5@2x.png} | Bin .../Onboarding5@3x.png} | Bin 19 files changed, 0 insertions(+), 0 deletions(-) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding1.imageset/OnBoarding1.png => Onboarding1.imageset/Onboarding1.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding1.imageset/OnBoarding1@2x.png => Onboarding1.imageset/Onboarding1@2x.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding1.imageset/OnBoarding1@3x.png => Onboarding1.imageset/Onboarding1@3x.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding2.imageset => Onboarding2.imageset}/Contents.json (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding2.imageset/OnBoarding2.png => Onboarding2.imageset/Onboarding2.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding2.imageset/OnBoarding2@2x.png => Onboarding2.imageset/Onboarding2@2x.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding2.imageset/OnBoarding2@3x.png => Onboarding2.imageset/Onboarding2@3x.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding3.imageset => Onboarding3.imageset}/Contents.json (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding3.imageset/OnBoarding3.png => Onboarding3.imageset/Onboarding3.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding3.imageset/OnBoarding3@2x.png => Onboarding3.imageset/Onboarding3@2x.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding3.imageset/OnBoarding3@3x.png => Onboarding3.imageset/Onboarding3@3x.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding4.imageset => Onboarding4.imageset}/Contents.json (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding4.imageset/OnBoarding4.png => Onboarding4.imageset/Onboarding4.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding4.imageset/OnBoarding4@2x.png => Onboarding4.imageset/Onboarding4@2x.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding4.imageset/OnBoarding4@3x.png => Onboarding4.imageset/Onboarding4@3x.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding5.imageset => Onboarding5.imageset}/Contents.json (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding5.imageset/OnBoarding5.png => Onboarding5.imageset/Onboarding5.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding5.imageset/OnBoarding5@2x.png => Onboarding5.imageset/Onboarding5@2x.png} (100%) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding5.imageset/OnBoarding5@3x.png => Onboarding5.imageset/Onboarding5@3x.png} (100%) diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding1.imageset/Onboarding1.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding1.imageset/Onboarding1.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@2x.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding1.imageset/Onboarding1@2x.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@2x.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding1.imageset/Onboarding1@2x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@3x.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding1.imageset/Onboarding1@3x.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/OnBoarding1@3x.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding1.imageset/Onboarding1@3x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/Onboarding2.imageset/Contents.json similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/Contents.json rename to KCS/KCS/Resource/Assets.xcassets/Onboarding2.imageset/Contents.json diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding2.imageset/Onboarding2.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding2.imageset/Onboarding2.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2@2x.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding2.imageset/Onboarding2@2x.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2@2x.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding2.imageset/Onboarding2@2x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2@3x.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding2.imageset/Onboarding2@3x.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding2.imageset/OnBoarding2@3x.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding2.imageset/Onboarding2@3x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/Onboarding3.imageset/Contents.json similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/Contents.json rename to KCS/KCS/Resource/Assets.xcassets/Onboarding3.imageset/Contents.json diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding3.imageset/Onboarding3.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding3.imageset/Onboarding3.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3@2x.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding3.imageset/Onboarding3@2x.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3@2x.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding3.imageset/Onboarding3@2x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3@3x.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding3.imageset/Onboarding3@3x.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding3.imageset/OnBoarding3@3x.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding3.imageset/Onboarding3@3x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/Onboarding4.imageset/Contents.json similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/Contents.json rename to KCS/KCS/Resource/Assets.xcassets/Onboarding4.imageset/Contents.json diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding4.imageset/Onboarding4.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding4.imageset/Onboarding4.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@2x.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding4.imageset/Onboarding4@2x.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@2x.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding4.imageset/Onboarding4@2x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@3x.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding4.imageset/Onboarding4@3x.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding4.imageset/OnBoarding4@3x.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding4.imageset/Onboarding4@3x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/Onboarding5.imageset/Contents.json similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/Contents.json rename to KCS/KCS/Resource/Assets.xcassets/Onboarding5.imageset/Contents.json diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding5.imageset/Onboarding5.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding5.imageset/Onboarding5.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5@2x.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding5.imageset/Onboarding5@2x.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5@2x.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding5.imageset/Onboarding5@2x.png diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5@3x.png b/KCS/KCS/Resource/Assets.xcassets/Onboarding5.imageset/Onboarding5@3x.png similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding5.imageset/OnBoarding5@3x.png rename to KCS/KCS/Resource/Assets.xcassets/Onboarding5.imageset/Onboarding5@3x.png From f647d660cfe35a4ce81fc4e5092f596df0b8d256 Mon Sep 17 00:00:00 2001 From: k2645 Date: Thu, 8 Feb 2024 18:11:05 +0900 Subject: [PATCH 187/231] =?UTF-8?q?feat=20:=20=EB=84=A4=ED=8A=B8=EC=9B=8C?= =?UTF-8?q?=ED=81=AC=20=EC=97=B0=EA=B2=B0=20=ED=99=95=EC=9D=B8=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20Repository=20=EB=B0=8F=20Usecase=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20(#182)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 50 ++++++++++++++++++- .../Repository/NetworkRepositoryImpl.swift | 41 +++++++++++++++ .../Repository/NetworkRepository.swift | 14 ++++++ .../CheckNetworkStatusUseCaseImpl.swift | 18 +++++++ .../protocol/CheckNetworkStatusUseCase.swift | 18 +++++++ 5 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 KCS/KCS/Data/Repository/NetworkRepositoryImpl.swift create mode 100644 KCS/KCS/Domain/Interface/Repository/NetworkRepository.swift create mode 100644 KCS/KCS/Domain/UseCase/CheckNetworkStatusUseCaseImpl.swift create mode 100644 KCS/KCS/Domain/UseCase/protocol/CheckNetworkStatusUseCase.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 78d8ffe4..6bcb4337 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -85,6 +85,12 @@ A81EFBC82B5D597400D0C0D7 /* Pretendard-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */; }; A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */; }; A821A3742B74B84700089B8F /* SplashViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A821A3732B74B84700089B8F /* SplashViewController.swift */; }; + A821A3762B74B9F900089B8F /* NetworkRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A821A3752B74B9F900089B8F /* NetworkRepositoryImpl.swift */; }; + A821A3782B74BAA700089B8F /* NetworkRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A821A3772B74BAA700089B8F /* NetworkRepository.swift */; }; + A821A37A2B74BBE200089B8F /* CheckNetworkStatusUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A821A3792B74BBE200089B8F /* CheckNetworkStatusUseCaseImpl.swift */; }; + A821A37C2B74BC4B00089B8F /* CheckNetworkStatusUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = A821A37B2B74BC4B00089B8F /* CheckNetworkStatusUseCase.swift */; }; + A821A3802B74BDA200089B8F /* SplashViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A821A37F2B74BDA200089B8F /* SplashViewModelImpl.swift */; }; + A821A3832B74C08600089B8F /* SplashViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A821A3822B74C08600089B8F /* SplashViewModel.swift */; }; A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */; }; A83367B82B6FA0E700E0A844 /* FetchStores.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367B72B6FA0E700E0A844 /* FetchStores.swift */; }; A83367BB2B709C0200E0A844 /* OnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83367BA2B709C0200E0A844 /* OnboardingViewController.swift */; }; @@ -213,6 +219,12 @@ A81EFBBF2B5D597400D0C0D7 /* Pretendard-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Light.ttf"; sourceTree = ""; }; A81EFBC92B5D5A2300D0C0D7 /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = ""; }; A821A3732B74B84700089B8F /* SplashViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashViewController.swift; sourceTree = ""; }; + A821A3752B74B9F900089B8F /* NetworkRepositoryImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkRepositoryImpl.swift; sourceTree = ""; }; + A821A3772B74BAA700089B8F /* NetworkRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkRepository.swift; sourceTree = ""; }; + A821A3792B74BBE200089B8F /* CheckNetworkStatusUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckNetworkStatusUseCaseImpl.swift; sourceTree = ""; }; + A821A37B2B74BC4B00089B8F /* CheckNetworkStatusUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckNetworkStatusUseCase.swift; sourceTree = ""; }; + A821A37F2B74BDA200089B8F /* SplashViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashViewModelImpl.swift; sourceTree = ""; }; + A821A3822B74C08600089B8F /* SplashViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashViewModel.swift; sourceTree = ""; }; A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreStoreButton.swift; sourceTree = ""; }; A83367B72B6FA0E700E0A844 /* FetchStores.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchStores.swift; sourceTree = ""; }; A83367BA2B709C0200E0A844 /* OnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewController.swift; sourceTree = ""; }; @@ -306,6 +318,7 @@ A8ACB7F02B5AEBE300540BD1 /* GetStoreInformationUseCase.swift */, A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */, 59F478B42B59BE0B002FEF9E /* FetchImageUseCase.swift */, + A821A37B2B74BC4B00089B8F /* CheckNetworkStatusUseCase.swift */, ); path = protocol; sourceTree = ""; @@ -320,6 +333,7 @@ A8ACB7EE2B5AEBB800540BD1 /* GetStoreInformationUseCaseImpl.swift */, A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */, 59F478B22B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift */, + A821A3792B74BBE200089B8F /* CheckNetworkStatusUseCaseImpl.swift */, ); path = UseCase; sourceTree = ""; @@ -518,6 +532,7 @@ children = ( 59C306A82B4FF9AF00862625 /* StoreRepository.swift */, 5977BE992B59AC3300725C90 /* ImageRepository.swift */, + A821A3772B74BAA700089B8F /* NetworkRepository.swift */, ); path = Repository; sourceTree = ""; @@ -621,11 +636,37 @@ A821A3722B74B82600089B8F /* Splash */ = { isa = PBXGroup; children = ( - A821A3732B74B84700089B8F /* SplashViewController.swift */, + A821A37D2B74BD7B00089B8F /* View */, + A821A37E2B74BD8400089B8F /* ViewModel */, ); path = Splash; sourceTree = ""; }; + A821A37D2B74BD7B00089B8F /* View */ = { + isa = PBXGroup; + children = ( + A821A3732B74B84700089B8F /* SplashViewController.swift */, + ); + path = View; + sourceTree = ""; + }; + A821A37E2B74BD8400089B8F /* ViewModel */ = { + isa = PBXGroup; + children = ( + A821A3812B74C05500089B8F /* protocol */, + A821A37F2B74BDA200089B8F /* SplashViewModelImpl.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + A821A3812B74C05500089B8F /* protocol */ = { + isa = PBXGroup; + children = ( + A821A3822B74C08600089B8F /* SplashViewModel.swift */, + ); + path = protocol; + sourceTree = ""; + }; A83367B92B709BE900E0A844 /* OnBoarding */ = { isa = PBXGroup; children = ( @@ -669,6 +710,7 @@ A8ACB7D62B57BE4E00540BD1 /* Error */, 59C306B12B50001F00862625 /* StoreRepositoryImpl.swift */, 5977BE9B2B59AC8D00725C90 /* ImageRepositoryImpl.swift */, + A821A3752B74B9F900089B8F /* NetworkRepositoryImpl.swift */, ); path = Repository; sourceTree = ""; @@ -958,6 +1000,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A821A3762B74B9F900089B8F /* NetworkRepositoryImpl.swift in Sources */, 59B886482B6A5CE9005750EF /* StoreListViewModelImpl.swift in Sources */, A83367BD2B70A52900E0A844 /* Storage.swift in Sources */, A81EFBB52B5D477600D0C0D7 /* UILabel+.swift in Sources */, @@ -968,9 +1011,12 @@ A83367C72B72725700E0A844 /* FifthOnboardingView.swift in Sources */, 5977BE612B55374000725C90 /* HomeViewModel.swift in Sources */, 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */, + A821A37A2B74BBE200089B8F /* CheckNetworkStatusUseCaseImpl.swift in Sources */, A8AE4B1B2B62A60B00632355 /* OpeningHoursCellView.swift in Sources */, A89087042B4E7F3500767225 /* FilterButton.swift in Sources */, 59F478B12B59BB00002FEF9E /* ImageRepositoryError.swift in Sources */, + A821A3832B74C08600089B8F /* SplashViewModel.swift in Sources */, + A821A3802B74BDA200089B8F /* SplashViewModelImpl.swift in Sources */, 59C306C92B501B9D00862625 /* RegularOpeningHours.swift in Sources */, A83367B82B6FA0E700E0A844 /* FetchStores.swift in Sources */, 59F478B52B59BE0B002FEF9E /* FetchImageUseCase.swift in Sources */, @@ -981,6 +1027,7 @@ 59F478B32B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift in Sources */, A8ACB7ED2B59647400540BD1 /* OpeningHourError.swift in Sources */, 5977BE742B57FA7A00725C90 /* FilteredStores.swift in Sources */, + A821A37C2B74BC4B00089B8F /* CheckNetworkStatusUseCase.swift in Sources */, A8A7E05D2B64AF1300D015E5 /* StoreInformationViewConstraints.swift in Sources */, 5977BE5E2B5535C700725C90 /* FetchRefreshStoresUseCase.swift in Sources */, A83367BB2B709C0200E0A844 /* OnboardingViewController.swift in Sources */, @@ -990,6 +1037,7 @@ A8ACB7EA2B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift in Sources */, A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */, 59C306CD2B5035B100862625 /* StoreAPI.swift in Sources */, + A821A3782B74BAA700089B8F /* NetworkRepository.swift in Sources */, A8ACB7DB2B58B51A00540BD1 /* Date+.swift in Sources */, A81EFBCA2B5D5A2300D0C0D7 /* UIFont+.swift in Sources */, A83367C52B7271B900E0A844 /* FourthOnboardingView.swift in Sources */, diff --git a/KCS/KCS/Data/Repository/NetworkRepositoryImpl.swift b/KCS/KCS/Data/Repository/NetworkRepositoryImpl.swift new file mode 100644 index 00000000..57cd87e5 --- /dev/null +++ b/KCS/KCS/Data/Repository/NetworkRepositoryImpl.swift @@ -0,0 +1,41 @@ +// +// NetworkRepositoryImpl.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/8/24. +// + +import Foundation +import SystemConfiguration + +class NetworkRepositoryImpl: NetworkRepository { + + func checkDeviceNetworkStatus() -> Bool { + var zeroAddress = sockaddr_in( + sin_len: 0, + sin_family: 0, + sin_port: 0, + sin_addr: in_addr(s_addr: 0), + sin_zero: (0, 0, 0, 0, 0, 0, 0, 0) + ) + zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) + zeroAddress.sin_family = sa_family_t(AF_INET) + + let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { + $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in + SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) + } + } + + var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0) + if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false { + return false + } + + let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0 + let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0 + + return isReachable && !needsConnection + } + +} diff --git a/KCS/KCS/Domain/Interface/Repository/NetworkRepository.swift b/KCS/KCS/Domain/Interface/Repository/NetworkRepository.swift new file mode 100644 index 00000000..26aedd6c --- /dev/null +++ b/KCS/KCS/Domain/Interface/Repository/NetworkRepository.swift @@ -0,0 +1,14 @@ +// +// NetworkRepository.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/8/24. +// + +import Foundation + +protocol NetworkRepository { + + func checkDeviceNetworkStatus() -> Bool + +} diff --git a/KCS/KCS/Domain/UseCase/CheckNetworkStatusUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/CheckNetworkStatusUseCaseImpl.swift new file mode 100644 index 00000000..bb19e7ea --- /dev/null +++ b/KCS/KCS/Domain/UseCase/CheckNetworkStatusUseCaseImpl.swift @@ -0,0 +1,18 @@ +// +// CheckNetworkStatusUseCaseImpl.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/8/24. +// + +import Foundation + +struct CheckNetworkStatusUseCaseImpl: CheckNetworkStatusUseCase { + + let repository: NetworkRepository + + func execute() -> Bool { + return repository.checkDeviceNetworkStatus() + } + +} diff --git a/KCS/KCS/Domain/UseCase/protocol/CheckNetworkStatusUseCase.swift b/KCS/KCS/Domain/UseCase/protocol/CheckNetworkStatusUseCase.swift new file mode 100644 index 00000000..b146bf3d --- /dev/null +++ b/KCS/KCS/Domain/UseCase/protocol/CheckNetworkStatusUseCase.swift @@ -0,0 +1,18 @@ +// +// CheckNetworkStatusUseCase.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/8/24. +// + +import Foundation + +protocol CheckNetworkStatusUseCase { + + var repository: NetworkRepository { get } + + init(repository: NetworkRepository) + + func execute() -> Bool + +} From 16de4cf77eb7b4890b8d78cc9a7778cce6f6c9c7 Mon Sep 17 00:00:00 2001 From: k2645 Date: Thu, 8 Feb 2024 18:11:31 +0900 Subject: [PATCH 188/231] =?UTF-8?q?feat=20:=20=EB=84=A4=ED=8A=B8=EC=9B=8C?= =?UTF-8?q?=ED=81=AC=20=EC=97=B0=EA=B2=B0=20=ED=99=95=EC=9D=B8=EC=9A=A9=20?= =?UTF-8?q?SplashViewController=20=EC=83=9D=EC=84=B1=20(#182)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 11 +- .../Splash/View/SplashViewController.swift | 104 ++++++++++++++++++ .../ViewModel/SplashViewModelImpl.swift | 35 ++++++ .../ViewModel/protocol/SplashViewModel.swift | 32 ++++++ 4 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 KCS/KCS/Presentation/Splash/View/SplashViewController.swift create mode 100644 KCS/KCS/Presentation/Splash/ViewModel/SplashViewModelImpl.swift create mode 100644 KCS/KCS/Presentation/Splash/ViewModel/protocol/SplashViewModel.swift diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 359347f7..65f58c0f 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -58,7 +58,16 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } else { rootViewController = homeViewController } - window?.rootViewController = rootViewController + + let splashViewController = SplashViewController( + viewModel: SplashViewModelImpl( + checkNetworkStatusUseCase: CheckNetworkStatusUseCaseImpl( + repository: NetworkRepositoryImpl() + ) + ), rootViewController: rootViewController + ) + + window?.rootViewController = splashViewController window?.makeKeyAndVisible() } diff --git a/KCS/KCS/Presentation/Splash/View/SplashViewController.swift b/KCS/KCS/Presentation/Splash/View/SplashViewController.swift new file mode 100644 index 00000000..1336e63f --- /dev/null +++ b/KCS/KCS/Presentation/Splash/View/SplashViewController.swift @@ -0,0 +1,104 @@ +// +// SplashViewController.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/8/24. +// + +import RxSwift +import RxRelay + +final class SplashViewController: UIViewController { + + let logoImageView: UIImageView = { + let imageView = UIImageView(image: UIImage.kcsLogo) + imageView.translatesAutoresizingMaskIntoConstraints = false + + return imageView + }() + + let disposeBag = DisposeBag() + let viewModel: SplashViewModel + let rootViewController: UIViewController + + init(viewModel: SplashViewModel, rootViewController: UIViewController) { + self.viewModel = viewModel + self.rootViewController = rootViewController + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + addUIComponents() + configureConstraints() + bind() + setup() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + viewModel.input(action: .checkNetworkInput) + } + +} + +private extension SplashViewController { + + func setup() { + view.backgroundColor = .white + } + + func bind() { + viewModel.networkStatusOutput + .bind { [weak self] status in + guard let self = self else { return } + if !status { + presentNetworkAlert() + } else { + rootViewController.modalPresentationStyle = .fullScreen + present(rootViewController, animated: true) + } + } + .disposed(by: disposeBag) + } + + func presentNetworkAlert() { + let alertController = UIAlertController( + title: "๋„คํŠธ์›Œํฌ ์ƒํƒœ ํ™•์ธ", + message: "๋„คํŠธ์›Œํฌ๊ฐ€ ๋ถˆ์•ˆ์ • ํ•ฉ๋‹ˆ๋‹ค.", + preferredStyle: .alert + ) + let alertAction = UIAlertAction( + title: "๋‹ค์‹œ ์‹œ๋„", + style: .default + ) { [weak self] _ in + self?.viewModel.input(action: .checkNetworkInput) + } + alertController.addAction(alertAction) + present(alertController, animated: true) + } + +} + +private extension SplashViewController { + + func addUIComponents() { + view.addSubview(logoImageView) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + logoImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor), + logoImageView.centerYAnchor.constraint(equalTo: view.centerYAnchor), + logoImageView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 100), + logoImageView.heightAnchor.constraint(equalTo: logoImageView.widthAnchor, multiplier: 94/156.45) + ]) + } + +} diff --git a/KCS/KCS/Presentation/Splash/ViewModel/SplashViewModelImpl.swift b/KCS/KCS/Presentation/Splash/ViewModel/SplashViewModelImpl.swift new file mode 100644 index 00000000..8efefe7e --- /dev/null +++ b/KCS/KCS/Presentation/Splash/ViewModel/SplashViewModelImpl.swift @@ -0,0 +1,35 @@ +// +// SplashViewModelImpl.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/8/24. +// + +import RxRelay + +final class SplashViewModelImpl: SplashViewModel { + + let checkNetworkStatusUseCase: CheckNetworkStatusUseCase + + let networkStatusOutput = PublishRelay() + + init(checkNetworkStatusUseCase: CheckNetworkStatusUseCase) { + self.checkNetworkStatusUseCase = checkNetworkStatusUseCase + } + + func input(action: SplashViewModelInputCase) { + switch action { + case .checkNetworkInput: + checkNetworkInput() + } + } + +} + +private extension SplashViewModelImpl { + + func checkNetworkInput() { + networkStatusOutput.accept(checkNetworkStatusUseCase.execute()) + } + +} diff --git a/KCS/KCS/Presentation/Splash/ViewModel/protocol/SplashViewModel.swift b/KCS/KCS/Presentation/Splash/ViewModel/protocol/SplashViewModel.swift new file mode 100644 index 00000000..5d176ed8 --- /dev/null +++ b/KCS/KCS/Presentation/Splash/ViewModel/protocol/SplashViewModel.swift @@ -0,0 +1,32 @@ +// +// SplashViewModel.swift +// KCS +// +// Created by ๊น€์˜ํ˜„ on 2/8/24. +// + +import RxRelay + +protocol SplashViewModel: SplashViewModelInput, SplashViewModelOutput { + + var checkNetworkStatusUseCase: CheckNetworkStatusUseCase { get } + +} + +protocol SplashViewModelInput { + + func input(action: SplashViewModelInputCase) + +} + +enum SplashViewModelInputCase { + + case checkNetworkInput + +} + +protocol SplashViewModelOutput { + + var networkStatusOutput: PublishRelay { get } + +} From 136ebebf03dce05f0f32a650ab32221bc592ae55 Mon Sep 17 00:00:00 2001 From: k2645 Date: Thu, 8 Feb 2024 18:14:30 +0900 Subject: [PATCH 189/231] =?UTF-8?q?fix=20:=20develop=EC=9A=A9=20URL?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#182)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Network/StoreAPI.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 018a4faa..93658693 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -20,7 +20,7 @@ extension StoreAPI: Router, URLRequestConvertible { var baseURL: String? { switch self { case .getStores: - return getURL(type: .product) + return getURL(type: .develop) case .getImage(let url): return url } From fd40011009eb80edd7127e5b9d6cec0200b23593 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 8 Feb 2024 19:21:03 +0900 Subject: [PATCH 190/231] =?UTF-8?q?feat=20:=20toast=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20=EB=B0=8F=20=EC=A0=81=EC=9A=A9=20(#184)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension/UIViewController+Alert.swift | 41 +++++++++++++++++++ .../Home/View/HomeViewController.swift | 3 ++ 2 files changed, 44 insertions(+) diff --git a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift index 46872e88..4a813e8d 100644 --- a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift +++ b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift @@ -46,4 +46,45 @@ extension UIViewController { } } + func showToast(message: String) { + let toastLabel = UILabel() + toastLabel.translatesAutoresizingMaskIntoConstraints = false + toastLabel.backgroundColor = .black.withAlphaComponent(0.7) + toastLabel.textColor = .white + toastLabel.font = .pretendard(size: 14, weight: .medium) + toastLabel.textAlignment = .center + toastLabel.text = message + toastLabel.alpha = 0 + toastLabel.setLayerCorner(cornerRadius: 12) + toastLabel.clipsToBounds = true + view.addSubview(toastLabel) + NSLayoutConstraint.activate([ + toastLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), + toastLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200), + toastLabel.widthAnchor.constraint(equalToConstant: 150), + toastLabel.heightAnchor.constraint(equalToConstant: 30) + ]) + + UIView.animate( + withDuration: 0.4, + delay: 0, + options: .curveEaseIn, + animations: { + toastLabel.alpha = 1.0 + }, + completion: { _ in + UIView.animate( + withDuration: 0.8, + delay: 1.4, + options: .curveEaseOut, + animations: { + toastLabel.alpha = 0.0 + }, completion: { _ in + toastLabel.removeFromSuperview() + } + ) + } + ) + } + } diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index ac07c2e8..dfed0b3a 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -281,6 +281,9 @@ private extension HomeViewController { } storeInformationViewDismiss() storeListViewController.updateList(stores: stores) + if stores.isEmpty { + showToast(message: "๊ฐ€๊ฒŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.") + } } .disposed(by: disposeBag) } From d96c4b66bc2189ac298faffdb3ba9b4e3d8dc773 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 8 Feb 2024 19:24:03 +0900 Subject: [PATCH 191/231] =?UTF-8?q?fix=20:=20toast=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EA=B0=80=EC=9A=B4=EB=8D=B0=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20(#184)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Extension/UIViewController+Alert.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift index 4a813e8d..b28d4f85 100644 --- a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift +++ b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift @@ -49,7 +49,7 @@ extension UIViewController { func showToast(message: String) { let toastLabel = UILabel() toastLabel.translatesAutoresizingMaskIntoConstraints = false - toastLabel.backgroundColor = .black.withAlphaComponent(0.7) + toastLabel.backgroundColor = .black.withAlphaComponent(0.6) toastLabel.textColor = .white toastLabel.font = .pretendard(size: 14, weight: .medium) toastLabel.textAlignment = .center @@ -60,7 +60,7 @@ extension UIViewController { view.addSubview(toastLabel) NSLayoutConstraint.activate([ toastLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), - toastLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200), + toastLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor), toastLabel.widthAnchor.constraint(equalToConstant: 150), toastLabel.heightAnchor.constraint(equalToConstant: 30) ]) From 83b8427efcbba360395c641b424d11db5180befe Mon Sep 17 00:00:00 2001 From: k2645 Date: Thu, 8 Feb 2024 19:25:30 +0900 Subject: [PATCH 192/231] =?UTF-8?q?refactor=20:=20ViewModel=EC=9D=98=20out?= =?UTF-8?q?put=20=EC=88=98=EC=A0=95=20(#182)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Splash/View/SplashViewController.swift | 18 ++++++++++-------- .../Splash/ViewModel/SplashViewModelImpl.swift | 9 +++++++-- .../ViewModel/protocol/SplashViewModel.swift | 3 ++- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/KCS/KCS/Presentation/Splash/View/SplashViewController.swift b/KCS/KCS/Presentation/Splash/View/SplashViewController.swift index 1336e63f..fe742596 100644 --- a/KCS/KCS/Presentation/Splash/View/SplashViewController.swift +++ b/KCS/KCS/Presentation/Splash/View/SplashViewController.swift @@ -55,15 +55,17 @@ private extension SplashViewController { } func bind() { - viewModel.networkStatusOutput - .bind { [weak self] status in + viewModel.networkEnableOutput + .bind { [weak self] in guard let self = self else { return } - if !status { - presentNetworkAlert() - } else { - rootViewController.modalPresentationStyle = .fullScreen - present(rootViewController, animated: true) - } + rootViewController.modalPresentationStyle = .fullScreen + present(rootViewController, animated: true) + } + .disposed(by: disposeBag) + + viewModel.networkDisableOutput + .bind { [weak self] in + self?.presentNetworkAlert() } .disposed(by: disposeBag) } diff --git a/KCS/KCS/Presentation/Splash/ViewModel/SplashViewModelImpl.swift b/KCS/KCS/Presentation/Splash/ViewModel/SplashViewModelImpl.swift index 8efefe7e..a53cf751 100644 --- a/KCS/KCS/Presentation/Splash/ViewModel/SplashViewModelImpl.swift +++ b/KCS/KCS/Presentation/Splash/ViewModel/SplashViewModelImpl.swift @@ -11,7 +11,8 @@ final class SplashViewModelImpl: SplashViewModel { let checkNetworkStatusUseCase: CheckNetworkStatusUseCase - let networkStatusOutput = PublishRelay() + let networkEnableOutput = PublishRelay() + let networkDisableOutput = PublishRelay() init(checkNetworkStatusUseCase: CheckNetworkStatusUseCase) { self.checkNetworkStatusUseCase = checkNetworkStatusUseCase @@ -29,7 +30,11 @@ final class SplashViewModelImpl: SplashViewModel { private extension SplashViewModelImpl { func checkNetworkInput() { - networkStatusOutput.accept(checkNetworkStatusUseCase.execute()) + if checkNetworkStatusUseCase.execute() { + networkEnableOutput.accept(()) + } else { + networkDisableOutput.accept(()) + } } } diff --git a/KCS/KCS/Presentation/Splash/ViewModel/protocol/SplashViewModel.swift b/KCS/KCS/Presentation/Splash/ViewModel/protocol/SplashViewModel.swift index 5d176ed8..66681f7b 100644 --- a/KCS/KCS/Presentation/Splash/ViewModel/protocol/SplashViewModel.swift +++ b/KCS/KCS/Presentation/Splash/ViewModel/protocol/SplashViewModel.swift @@ -27,6 +27,7 @@ enum SplashViewModelInputCase { protocol SplashViewModelOutput { - var networkStatusOutput: PublishRelay { get } + var networkEnableOutput: PublishRelay { get } + var networkDisableOutput: PublishRelay { get } } From ff761ac1e14c5c372a23bd22207d314f7530a038 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Thu, 8 Feb 2024 19:39:21 +0900 Subject: [PATCH 193/231] =?UTF-8?q?fix=20:=20alert=20=EC=84=A0=EC=96=B8=20?= =?UTF-8?q?=EB=B0=A9=EB=B2=95=20=EC=88=98=EC=A0=95=20(#184)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension/UIViewController+Alert.swift | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift index b28d4f85..1a66f66d 100644 --- a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift +++ b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift @@ -20,24 +20,21 @@ extension UIViewController { } func presentLocationAlert() { - let requestLocationServiceAlert: UIAlertController = { - let alertController = UIAlertController( - title: "์œ„์น˜ ์ •๋ณด ์ด์šฉ", - message: "์œ„์น˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n๋””๋ฐ”์ด์Šค์˜ '์„ค์ • > ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ'์—์„œ ์œ„์น˜ ์„œ๋น„์Šค๋ฅผ ์ผœ์ฃผ์„ธ์š”.", - preferredStyle: .alert - ) - let goSetting = UIAlertAction(title: "์„ค์ •์œผ๋กœ ์ด๋™", style: .destructive) { _ in - if let appSetting = URL(string: UIApplication.openSettingsURLString) { - UIApplication.shared.open(appSetting) - } + let requestLocationServiceAlert = UIAlertController( + title: "์œ„์น˜ ์ •๋ณด ์ด์šฉ", + message: "์œ„์น˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n๋””๋ฐ”์ด์Šค์˜ '์„ค์ • > ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ'์—์„œ ์œ„์น˜ ์„œ๋น„์Šค๋ฅผ ์ผœ์ฃผ์„ธ์š”.", + preferredStyle: .alert + ) + let goSetting = UIAlertAction(title: "์„ค์ •์œผ๋กœ ์ด๋™", style: .destructive) { _ in + if let appSetting = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.open(appSetting) } - let cancel = UIAlertAction(title: "์ทจ์†Œ", style: .cancel) - - alertController.addAction(cancel) - alertController.addAction(goSetting) - - return alertController - }() + } + let cancel = UIAlertAction(title: "์ทจ์†Œ", style: .cancel) + + requestLocationServiceAlert.addAction(cancel) + requestLocationServiceAlert.addAction(goSetting) + if let presentController = presentedViewController { presentController.presentLocationAlert() From ca50b50d8d454fb5b0971cf53533417a61599ba4 Mon Sep 17 00:00:00 2001 From: k2645 Date: Thu, 8 Feb 2024 20:34:48 +0900 Subject: [PATCH 194/231] =?UTF-8?q?fix=20:=20=ED=95=84=ED=84=B0=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20error=20issue=20=EC=88=98=EC=A0=95=20(#187?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Repository/StoreRepositoryImpl.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index ac1c496c..6e251055 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -72,6 +72,7 @@ final class StoreRepositoryImpl: StoreRepository { } func fetchStores(count: Int) -> [Store] { + if stores.isEmpty { return [] } var fetchResult: [Store] = [] for index in 0.. Date: Thu, 8 Feb 2024 21:33:21 +0900 Subject: [PATCH 195/231] =?UTF-8?q?build=20:=203.1=20=EB=B2=84=EC=A0=84?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 114ddd11..8c190927 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -1222,7 +1222,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.0; + MARKETING_VERSION = 3.1; PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1261,7 +1261,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.0; + MARKETING_VERSION = 3.1; PRODUCT_BUNDLE_IDENTIFIER = com.kcs.nainga; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; From 51e91e2bbc8df3061b330bf2ff157a99fe8b5316 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 9 Feb 2024 01:59:30 +0900 Subject: [PATCH 196/231] =?UTF-8?q?fix=20:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20detent=20identifier=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20(#183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension/UISheetPresentationController+Detent.swift | 2 +- .../Contents.json | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename KCS/KCS/Resource/Assets.xcassets/{OnBoarding1.imageset => Onboarding1.imageset}/Contents.json (100%) diff --git a/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift b/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift index 5b05b5b8..87b928f8 100644 --- a/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift +++ b/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift @@ -13,7 +13,7 @@ extension UISheetPresentationController.Detent.Identifier { static let largeSummaryDetentIdentifier = UISheetPresentationController.Detent.Identifier("LargeSummaryDetent") static let detailDetentIdentifier = UISheetPresentationController.Detent.Identifier("DetailDetent") static let smallStoreListViewDetentIdentifier = UISheetPresentationController.Detent.Identifier("SmallListDetent") - static let largeStoreListViewDetentIdentifier = UISheetPresentationController.Detent.Identifier("LargeListDetent") + } extension UISheetPresentationController.Detent { diff --git a/KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/Contents.json b/KCS/KCS/Resource/Assets.xcassets/Onboarding1.imageset/Contents.json similarity index 100% rename from KCS/KCS/Resource/Assets.xcassets/OnBoarding1.imageset/Contents.json rename to KCS/KCS/Resource/Assets.xcassets/Onboarding1.imageset/Contents.json From 7639baabf8188b28c14abc8e3913f3b4fc09ff25 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 9 Feb 2024 02:00:10 +0900 Subject: [PATCH 197/231] =?UTF-8?q?feat=20:=20cell=20=ED=81=B4=EB=A6=AD=20?= =?UTF-8?q?=EC=8B=9C=20=EB=92=A4=EB=A1=9C=EA=B0=80=EA=B8=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80=20(#183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 45 +++++++++++++++++++ .../Home/ViewModel/HomeViewModelImpl.swift | 7 +++ .../ViewModel/protocol/HomeViewModel.swift | 2 + .../View/StoreListViewController.swift | 4 ++ KCS/Podfile.lock | 2 +- 5 files changed, 59 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index dfed0b3a..aac9f352 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -142,6 +142,29 @@ final class HomeViewController: UIViewController { return button }() + private lazy var backStoreListButton: UIButton = { + let button = UIButton() + button.translatesAutoresizingMaskIntoConstraints = false + button.backgroundColor = .blue + button.setTitle("๋’ค๋กœ๊ฐ€๊ธฐ", for: .normal) + button.isHidden = true + button.rx.tap + .debounce(.milliseconds(100), scheduler: MainScheduler()) + .bind { [weak self] in + button.isHidden = true + self?.storeInformationViewController.dismiss(animated: true) + self?.presentStoreListView() + if let sheet = self?.storeListViewController.sheetPresentationController { + sheet.animateChanges { + sheet.selectedDetentIdentifier = .large + } + } + } + .disposed(by: disposeBag) + + return button + }() + private lazy var dimView: UIView = { let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false @@ -152,6 +175,7 @@ final class HomeViewController: UIViewController { view.rx.tapGesture() .when(.ended) .subscribe(onNext: { [weak self] _ in + self?.backStoreListButton.isHidden = true self?.viewModel.action( input: .dimViewTapGestureEnded ) @@ -234,6 +258,7 @@ private extension HomeViewController { bindStoreInformationView() bindErrorAlert() bindListCellSelected() + bindBackStoreListButton() } func bindFetchStores() { @@ -263,6 +288,7 @@ private extension HomeViewController { func bindApplyFilters() { viewModel.filteredStoresOutput + .debounce(.milliseconds(100), scheduler: MainScheduler()) .bind { [weak self] filteredStores in guard let self = self else { return } self.markers.forEach { $0.mapView = nil } @@ -436,6 +462,8 @@ private extension HomeViewController { ) targetMarker.select() clickedMarker = targetMarker + + viewModel.action(input: .storeListCellTapped(row: index)) } else { presentErrorAlert(error: .client) } @@ -443,6 +471,15 @@ private extension HomeViewController { .disposed(by: disposeBag) } + func bindBackStoreListButton() { + viewModel.backStoreListButtonOutput + .bind { [weak self] row in + self?.storeListViewController.scrollToPreviousCell(indexPath: IndexPath(row: row, section: 0)) + self?.backStoreListButton.isHidden = false + } + .disposed(by: disposeBag) + } + } private extension HomeViewController { @@ -540,6 +577,7 @@ private extension HomeViewController { mapView.addSubview(compassView) mapView.addSubview(refreshButton) mapView.addSubview(moreStoreButton) + mapView.addSubview(backStoreListButton) mapView.addSubview(dimView) } @@ -587,6 +625,13 @@ private extension HomeViewController { moreStoreButton.widthAnchor.constraint(equalToConstant: 97), moreStoreButtonBottomConstraint ]) + + NSLayoutConstraint.activate([ + backStoreListButton.trailingAnchor.constraint(equalTo: mapView.trailingAnchor, constant: -20), + backStoreListButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -290), + backStoreListButton.widthAnchor.constraint(equalToConstant: 80), + backStoreListButton.heightAnchor.constraint(equalToConstant: 35) + ]) } func changeButtonsConstraints(delay: Bool) { diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 7544e9de..496f8cb2 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -29,6 +29,7 @@ final class HomeViewModelImpl: HomeViewModel { let fetchCountOutput = PublishRelay() let noMoreStoresOutput = PublishRelay() let dimViewTapGestureEndedOutput = PublishRelay() + let backStoreListButtonOutput = PublishRelay() var dependency: HomeDependency @@ -60,6 +61,8 @@ final class HomeViewModelImpl: HomeViewModel { dimViewTapGestureEnded() case .setMarker(let store, let certificationType): setMarker(store: store, certificationType: certificationType) + case .storeListCellTapped(let row): + storeListCellTapped(row: row) case .checkLocationAuthorization(let status): checkLocationAuthorization(status: status) case .checkLocationAuthorizationWhenCameraDidChange(let status): @@ -211,6 +214,10 @@ private extension HomeViewModelImpl { } } + func storeListCellTapped(row: Int) { + backStoreListButtonOutput.accept(row) + } + func locationButtonTapped(locationAuthorizationStatus: CLAuthorizationStatus, positionMode: NMFMyPositionMode) { if locationAuthorizationStatus == .denied { locationAuthorizationStatusDeniedOutput.accept(()) diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index c8596c57..12e3693d 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -34,6 +34,7 @@ enum HomeViewModelInputCase { case locationButtonTapped(locationAuthorizationStatus: CLAuthorizationStatus, positionMode: NMFMyPositionMode) case dimViewTapGestureEnded case setMarker(store: Store, certificationType: CertificationType) + case storeListCellTapped(row: Int) case checkLocationAuthorization(status: CLAuthorizationStatus) case checkLocationAuthorizationWhenCameraDidChange(status: CLAuthorizationStatus) @@ -60,5 +61,6 @@ protocol HomeViewModelOutput { var fetchCountOutput: PublishRelay { get } var noMoreStoresOutput: PublishRelay { get } var dimViewTapGestureEndedOutput: PublishRelay { get } + var backStoreListButtonOutput: PublishRelay { get } } diff --git a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift index 33657a35..921b129a 100644 --- a/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift +++ b/KCS/KCS/Presentation/StoreList/View/StoreListViewController.swift @@ -90,6 +90,10 @@ final class StoreListViewController: UIViewController { viewModel.action(input: .updateList(stores: stores)) } + func scrollToPreviousCell(indexPath: IndexPath) { + storeTableView.scrollToRow(at: indexPath, at: .top, animated: false) + } + } private extension StoreListViewController { diff --git a/KCS/Podfile.lock b/KCS/Podfile.lock index 4bb108a1..81ed8ce5 100644 --- a/KCS/Podfile.lock +++ b/KCS/Podfile.lock @@ -193,4 +193,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: a5566a18764ef703abc0265b00efa39f0938cc7c -COCOAPODS: 1.15.2 +COCOAPODS: 1.15.0 From 4f34b5202499743e560b7d3a9a4763ef04b105f7 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 9 Feb 2024 02:14:24 +0900 Subject: [PATCH 198/231] =?UTF-8?q?refactor=20:=20detent=20identifier=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension/UISheetPresentationController+Detent.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift b/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift index 87b928f8..aea391d8 100644 --- a/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift +++ b/KCS/KCS/Presentation/Extension/UISheetPresentationController+Detent.swift @@ -13,6 +13,7 @@ extension UISheetPresentationController.Detent.Identifier { static let largeSummaryDetentIdentifier = UISheetPresentationController.Detent.Identifier("LargeSummaryDetent") static let detailDetentIdentifier = UISheetPresentationController.Detent.Identifier("DetailDetent") static let smallStoreListViewDetentIdentifier = UISheetPresentationController.Detent.Identifier("SmallListDetent") + static let largeStoreListViewDetentIdentifier = UISheetPresentationController.Detent.Identifier.large } From 610204f6df528b8167b3392345f5bd3327041ea4 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 9 Feb 2024 02:18:13 +0900 Subject: [PATCH 199/231] =?UTF-8?q?feat=20:=20=EB=A7=88=EC=BB=A4=20?= =?UTF-8?q?=ED=95=B4=EC=A0=9C=20=EC=B6=94=EA=B0=80=20(#183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index aac9f352..d2191a2b 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -152,11 +152,10 @@ final class HomeViewController: UIViewController { .debounce(.milliseconds(100), scheduler: MainScheduler()) .bind { [weak self] in button.isHidden = true - self?.storeInformationViewController.dismiss(animated: true) - self?.presentStoreListView() + self?.storeInformationViewDismiss() if let sheet = self?.storeListViewController.sheetPresentationController { sheet.animateChanges { - sheet.selectedDetentIdentifier = .large + sheet.selectedDetentIdentifier = .largeStoreListViewDetentIdentifier } } } From 33bce2fc3e428619fb0af756e314f689389225e1 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 9 Feb 2024 03:26:12 +0900 Subject: [PATCH 200/231] =?UTF-8?q?chore=20:=20=EC=B6=94=ED=9B=84=20?= =?UTF-8?q?=ED=95=B4=EC=95=BC=ED=95=A0=20=EC=9D=BC=20TODO=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index d2191a2b..1231b2b1 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -142,6 +142,7 @@ final class HomeViewController: UIViewController { return button }() + // TODO: BackButton configuration ์ˆ˜์ • ํ•„์š” private lazy var backStoreListButton: UIButton = { let button = UIButton() button.translatesAutoresizingMaskIntoConstraints = false @@ -625,6 +626,7 @@ private extension HomeViewController { moreStoreButtonBottomConstraint ]) + // TODO: BackButton AutoLayout ์ˆ˜์ • ํ•„์š” NSLayoutConstraint.activate([ backStoreListButton.trailingAnchor.constraint(equalTo: mapView.trailingAnchor, constant: -20), backStoreListButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -290), From 19d620d13da84b2d77d7585b373e8368f48b7a26 Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 9 Feb 2024 03:40:34 +0900 Subject: [PATCH 201/231] =?UTF-8?q?fix=20:=20=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?(#183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Extension/UIViewController+Alert.swift | 1 - .../Presentation/Home/ViewModel/HomeViewModelImpl.swift | 7 ------- .../Home/ViewModel/protocol/HomeViewModel.swift | 2 -- 3 files changed, 10 deletions(-) diff --git a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift index 1a66f66d..dd116dc5 100644 --- a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift +++ b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift @@ -35,7 +35,6 @@ extension UIViewController { requestLocationServiceAlert.addAction(cancel) requestLocationServiceAlert.addAction(goSetting) - if let presentController = presentedViewController { presentController.presentLocationAlert() } else { diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 496f8cb2..7544e9de 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -29,7 +29,6 @@ final class HomeViewModelImpl: HomeViewModel { let fetchCountOutput = PublishRelay() let noMoreStoresOutput = PublishRelay() let dimViewTapGestureEndedOutput = PublishRelay() - let backStoreListButtonOutput = PublishRelay() var dependency: HomeDependency @@ -61,8 +60,6 @@ final class HomeViewModelImpl: HomeViewModel { dimViewTapGestureEnded() case .setMarker(let store, let certificationType): setMarker(store: store, certificationType: certificationType) - case .storeListCellTapped(let row): - storeListCellTapped(row: row) case .checkLocationAuthorization(let status): checkLocationAuthorization(status: status) case .checkLocationAuthorizationWhenCameraDidChange(let status): @@ -214,10 +211,6 @@ private extension HomeViewModelImpl { } } - func storeListCellTapped(row: Int) { - backStoreListButtonOutput.accept(row) - } - func locationButtonTapped(locationAuthorizationStatus: CLAuthorizationStatus, positionMode: NMFMyPositionMode) { if locationAuthorizationStatus == .denied { locationAuthorizationStatusDeniedOutput.accept(()) diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 12e3693d..c8596c57 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -34,7 +34,6 @@ enum HomeViewModelInputCase { case locationButtonTapped(locationAuthorizationStatus: CLAuthorizationStatus, positionMode: NMFMyPositionMode) case dimViewTapGestureEnded case setMarker(store: Store, certificationType: CertificationType) - case storeListCellTapped(row: Int) case checkLocationAuthorization(status: CLAuthorizationStatus) case checkLocationAuthorizationWhenCameraDidChange(status: CLAuthorizationStatus) @@ -61,6 +60,5 @@ protocol HomeViewModelOutput { var fetchCountOutput: PublishRelay { get } var noMoreStoresOutput: PublishRelay { get } var dimViewTapGestureEndedOutput: PublishRelay { get } - var backStoreListButtonOutput: PublishRelay { get } } From c8730633e172402716713f785443d47535003baf Mon Sep 17 00:00:00 2001 From: k2645 Date: Fri, 9 Feb 2024 03:42:43 +0900 Subject: [PATCH 202/231] =?UTF-8?q?fix=20:=20backStoreList=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=EC=9D=98=20hidden=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95=20(#183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 1231b2b1..f29f3376 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -152,7 +152,6 @@ final class HomeViewController: UIViewController { button.rx.tap .debounce(.milliseconds(100), scheduler: MainScheduler()) .bind { [weak self] in - button.isHidden = true self?.storeInformationViewDismiss() if let sheet = self?.storeListViewController.sheetPresentationController { sheet.animateChanges { @@ -175,7 +174,6 @@ final class HomeViewController: UIViewController { view.rx.tapGesture() .when(.ended) .subscribe(onNext: { [weak self] _ in - self?.backStoreListButton.isHidden = true self?.viewModel.action( input: .dimViewTapGestureEnded ) @@ -258,7 +256,6 @@ private extension HomeViewController { bindStoreInformationView() bindErrorAlert() bindListCellSelected() - bindBackStoreListButton() } func bindFetchStores() { @@ -463,7 +460,7 @@ private extension HomeViewController { targetMarker.select() clickedMarker = targetMarker - viewModel.action(input: .storeListCellTapped(row: index)) + setBackStoreListButton(row: index) } else { presentErrorAlert(error: .client) } @@ -471,15 +468,6 @@ private extension HomeViewController { .disposed(by: disposeBag) } - func bindBackStoreListButton() { - viewModel.backStoreListButtonOutput - .bind { [weak self] row in - self?.storeListViewController.scrollToPreviousCell(indexPath: IndexPath(row: row, section: 0)) - self?.backStoreListButton.isHidden = false - } - .disposed(by: disposeBag) - } - } private extension HomeViewController { @@ -504,6 +492,7 @@ private extension HomeViewController { } func storeInformationViewDismiss(changeMarker: Bool = false) { + backStoreListButton.isHidden = true clickedMarker?.deselect() clickedMarker = nil if !changeMarker { @@ -565,6 +554,11 @@ private extension HomeViewController { ) ) } + + func setBackStoreListButton(row: Int) { + storeListViewController.scrollToPreviousCell(indexPath: IndexPath(row: row, section: 0)) + backStoreListButton.isHidden = false + } } From 770866ec6b2a3904fce92e95c9b538eba5f7c1c4 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 04:05:06 +0900 Subject: [PATCH 203/231] =?UTF-8?q?feat=20:=20Search=20ViewController=20?= =?UTF-8?q?=EB=B0=8F=20ViewModel=20=EA=B5=AC=ED=98=84=20(#194)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 44 +++++ .../Search/View/SearchViewController.swift | 156 ++++++++++++++++++ .../ViewModel/Protocol/SearchViewModel.swift | 30 ++++ .../ViewModel/SearchViewModelImpl.swift | 35 ++++ 4 files changed, 265 insertions(+) create mode 100644 KCS/KCS/Presentation/Search/View/SearchViewController.swift create mode 100644 KCS/KCS/Presentation/Search/ViewModel/Protocol/SearchViewModel.swift create mode 100644 KCS/KCS/Presentation/Search/ViewModel/SearchViewModelImpl.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 7936c59d..e571d81c 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -15,6 +15,9 @@ 591A88892B384E610059E40F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 591A88872B384E610059E40F /* LaunchScreen.storyboard */; }; 592262242B61203000CA5A11 /* DetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 592262232B61203000CA5A11 /* DetailView.swift */; }; 59503A4A2B741F1E0006CF35 /* Secret.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 59503A492B741F1E0006CF35 /* Secret.xcconfig */; }; + 59503A4E2B751B0B0006CF35 /* SearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A4D2B751B0B0006CF35 /* SearchViewController.swift */; }; + 59503A522B751FCC0006CF35 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A512B751FCC0006CF35 /* SearchViewModel.swift */; }; + 59503A542B751FD50006CF35 /* SearchViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */; }; 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */; }; 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */; }; 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE572B5524D500725C90 /* RefreshButton.swift */; }; @@ -144,6 +147,9 @@ 591A888A2B384E610059E40F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 592262232B61203000CA5A11 /* DetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailView.swift; sourceTree = ""; }; 59503A492B741F1E0006CF35 /* Secret.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Secret.xcconfig; sourceTree = ""; }; + 59503A4D2B751B0B0006CF35 /* SearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewController.swift; sourceTree = ""; }; + 59503A512B751FCC0006CF35 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; + 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModelImpl.swift; sourceTree = ""; }; 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlertMessage.swift; sourceTree = ""; }; 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewContents.swift; sourceTree = ""; }; 5977BE572B5524D500725C90 /* RefreshButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshButton.swift; sourceTree = ""; }; @@ -311,6 +317,40 @@ path = KCS; sourceTree = ""; }; + 59503A4B2B751AEE0006CF35 /* Search */ = { + isa = PBXGroup; + children = ( + 59503A4C2B751AFD0006CF35 /* View */, + 59503A4F2B751FB30006CF35 /* ViewModel */, + ); + path = Search; + sourceTree = ""; + }; + 59503A4C2B751AFD0006CF35 /* View */ = { + isa = PBXGroup; + children = ( + 59503A4D2B751B0B0006CF35 /* SearchViewController.swift */, + ); + path = View; + sourceTree = ""; + }; + 59503A4F2B751FB30006CF35 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 59503A502B751FBE0006CF35 /* Protocol */, + 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 59503A502B751FBE0006CF35 /* Protocol */ = { + isa = PBXGroup; + children = ( + 59503A512B751FCC0006CF35 /* SearchViewModel.swift */, + ); + path = Protocol; + sourceTree = ""; + }; 5977BE592B55355D00725C90 /* protocol */ = { isa = PBXGroup; children = ( @@ -407,6 +447,7 @@ 5986DCDF2B3892EB005AE43B /* Presentation */ = { isa = PBXGroup; children = ( + 59503A4B2B751AEE0006CF35 /* Search */, A890870B2B4EF8F900767225 /* Extension */, 5986DCEA2B392996005AE43B /* Home */, 59B886242B6A39E9005750EF /* StoreList */, @@ -1034,7 +1075,9 @@ A821A37C2B74BC4B00089B8F /* CheckNetworkStatusUseCase.swift in Sources */, A8A7E05D2B64AF1300D015E5 /* StoreInformationViewConstraints.swift in Sources */, 5977BE5E2B5535C700725C90 /* FetchRefreshStoresUseCase.swift in Sources */, + 59503A4E2B751B0B0006CF35 /* SearchViewController.swift in Sources */, A83367BB2B709C0200E0A844 /* OnboardingViewController.swift in Sources */, + 59503A542B751FD50006CF35 /* SearchViewModelImpl.swift in Sources */, A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */, 59C306B02B4FFE4400862625 /* StoreResponse.swift in Sources */, A8A7E0602B64E62200D015E5 /* NMFMyPosition+.swift in Sources */, @@ -1060,6 +1103,7 @@ 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, A83367C32B72714C00E0A844 /* ThirdOnboardingView.swift in Sources */, A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */, + 59503A522B751FCC0006CF35 /* SearchViewModel.swift in Sources */, A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */, 59B8864A2B6A9CCB005750EF /* UIStackView+clear.swift in Sources */, 59C306C72B501B1E00862625 /* JSONContentsError.swift in Sources */, diff --git a/KCS/KCS/Presentation/Search/View/SearchViewController.swift b/KCS/KCS/Presentation/Search/View/SearchViewController.swift new file mode 100644 index 00000000..62655024 --- /dev/null +++ b/KCS/KCS/Presentation/Search/View/SearchViewController.swift @@ -0,0 +1,156 @@ +// +// SearchViewController.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/8/24. +// + +import UIKit +import RxSwift +import RxRelay + +final class SearchViewController: UIViewController { + + private let disposeBag = DisposeBag() + + private lazy var searchController: UISearchController = { + let searchController = UISearchController(searchResultsController: nil) + searchController.searchBar.placeholder = "๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" + searchController.hidesNavigationBarDuringPresentation = false + searchController.searchResultsUpdater = self + searchController.obscuresBackgroundDuringPresentation = false + searchController.automaticallyShowsCancelButton = false + searchController.searchBar.delegate = self + + navigationItem.searchController = searchController + navigationItem.hidesSearchBarWhenScrolling = false + + return searchController + }() + + private lazy var searchTableView: UITableView = { + let tableView = UITableView() + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.delegate = self + tableView.register(UITableViewCell.self, forCellReuseIdentifier: UITableViewCell.identifier) + tableView.backgroundColor = .white + // TODO: ๋””์ž์ธ์— ๋งž์ถฐ์•ผ ํ•จ + tableView.rowHeight = 50 + + return tableView + }() + + enum Section { + case keyword + } + + private lazy var dataSource: UITableViewDiffableDataSource = { + return UITableViewDiffableDataSource( + tableView: searchTableView + ) { (tableView, indexPath, keyword) in + let cell = tableView.dequeueReusableCell( + withIdentifier: UITableViewCell.identifier, + for: indexPath + ) + cell.selectionStyle = .none + var configuration = cell.defaultContentConfiguration() + configuration.text = keyword + cell.contentConfiguration = configuration + + return cell + } + }() + + private let searchObserver: PublishRelay + private let viewModel: SearchViewModel + + init(viewModel: SearchViewModel, searchObserver: PublishRelay) { + self.viewModel = viewModel + self.searchObserver = searchObserver + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + addUIComponents() + configureConstraints() + bind() + setup() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + searchController.searchBar.becomeFirstResponder() + } + +} + +private extension SearchViewController { + + func setup() { + view.backgroundColor = .white + searchController.isActive = true + } + + func addUIComponents() { + view.addSubview(searchTableView) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + searchTableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + searchTableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + searchTableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), + searchTableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) + ]) + } + + func bind() { + viewModel.generateDataOutput + .bind { [weak self] data in + self?.generateData(data: data) + } + .disposed(by: disposeBag) + } + +} + +private extension SearchViewController { + + func generateData(data: [String]) { + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([.keyword]) + snapshot.appendItems(data) + dataSource.apply(snapshot, animatingDifferences: false) + } +} + +extension SearchViewController: UISearchResultsUpdating, UISearchBarDelegate { + + func updateSearchResults(for searchController: UISearchController) { + guard let text = searchController.searchBar.text else { return } + viewModel.action(input: .textChanged(text: text)) + } + + func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { + guard let text = searchBar.text else { return } + searchObserver.accept(text) + } + +} + +extension SearchViewController: UITableViewDelegate { + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard let text = dataSource.itemIdentifier(for: indexPath) else { return } + searchObserver.accept(text) + } + +} diff --git a/KCS/KCS/Presentation/Search/ViewModel/Protocol/SearchViewModel.swift b/KCS/KCS/Presentation/Search/ViewModel/Protocol/SearchViewModel.swift new file mode 100644 index 00000000..d3226d34 --- /dev/null +++ b/KCS/KCS/Presentation/Search/ViewModel/Protocol/SearchViewModel.swift @@ -0,0 +1,30 @@ +// +// SearchViewModel.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/8/24. +// + +import RxRelay + +protocol SearchViewModel: SearchViewModelInput, SearchViewModelOutput { + +} + +protocol SearchViewModelInput { + + func action(input: SearchViewModelInputCase) + +} + +enum SearchViewModelInputCase { + + case textChanged(text: String) + +} + +protocol SearchViewModelOutput { + + var generateDataOutput: PublishRelay<[String]> { get } + +} diff --git a/KCS/KCS/Presentation/Search/ViewModel/SearchViewModelImpl.swift b/KCS/KCS/Presentation/Search/ViewModel/SearchViewModelImpl.swift new file mode 100644 index 00000000..0161d8e3 --- /dev/null +++ b/KCS/KCS/Presentation/Search/ViewModel/SearchViewModelImpl.swift @@ -0,0 +1,35 @@ +// +// SearchViewModelImpl.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/8/24. +// + +import RxRelay + +final class SearchViewModelImpl: SearchViewModel { + + var generateDataOutput = PublishRelay<[String]>() + + func action(input: SearchViewModelInputCase) { + switch input { + case .textChanged(let text): + textChanged(text: text) + } + } + +} + +private extension SearchViewModelImpl { + + func textChanged(text: String) { + if text.isEmpty { + // TODO: recentHistory usecase ์‹คํ–‰(debounce) ํ›„ generateDataOutput.accept([]) + generateDataOutput.accept(["recentHistory1", "recentHistory2", "recentHistory3", "recentHistory4"]) + } else { + // TODO: autoCompletion usecase ์‹คํ–‰(debounce) ํ›„ generateDataOutput.accept([]) + generateDataOutput.accept(["completion1", "completion2", "completion3"]) + } + } + +} From 72626e22e7a47517c75a8f76ef3d3353f8c1d485 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 04:05:34 +0900 Subject: [PATCH 204/231] =?UTF-8?q?fix=20:=20Lint=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=20(#194)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 4 +++- KCS/KCS/Presentation/Extension/UIViewController+Alert.swift | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 65f58c0f..fac09ec2 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -67,7 +67,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ), rootViewController: rootViewController ) - window?.rootViewController = splashViewController +// window?.rootViewController = splashViewController + + window?.rootViewController = UINavigationController(rootViewController: SearchViewController(viewModel: SearchViewModelImpl(), searchObserver: PublishRelay())) window?.makeKeyAndVisible() } diff --git a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift index 1a66f66d..dd116dc5 100644 --- a/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift +++ b/KCS/KCS/Presentation/Extension/UIViewController+Alert.swift @@ -35,7 +35,6 @@ extension UIViewController { requestLocationServiceAlert.addAction(cancel) requestLocationServiceAlert.addAction(goSetting) - if let presentController = presentedViewController { presentController.presentLocationAlert() } else { From 196d8f0a9016d737337887c8ca29bcb9051c8026 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 04:08:14 +0900 Subject: [PATCH 205/231] =?UTF-8?q?feat=20:=20keyword=EB=A5=BC=20=EB=B0=9B?= =?UTF-8?q?=EC=95=84=20=EB=AF=B8=EB=A6=AC=20searchBar=EC=97=90=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#194)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Search/View/SearchViewController.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/KCS/KCS/Presentation/Search/View/SearchViewController.swift b/KCS/KCS/Presentation/Search/View/SearchViewController.swift index 62655024..92f18c66 100644 --- a/KCS/KCS/Presentation/Search/View/SearchViewController.swift +++ b/KCS/KCS/Presentation/Search/View/SearchViewController.swift @@ -89,6 +89,10 @@ final class SearchViewController: UIViewController { searchController.searchBar.becomeFirstResponder() } + + func setSearchKeyword(keyword: String) { + searchController.searchBar.searchTextField.text = keyword + } } From a105b862c3264f877c290b6f4c8531549968cae9 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 04:09:52 +0900 Subject: [PATCH 206/231] =?UTF-8?q?fix=20:=20SceneDelegate=20=EB=B3=B5?= =?UTF-8?q?=EA=B5=AC=20(#194)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index fac09ec2..65f58c0f 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -67,9 +67,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ), rootViewController: rootViewController ) -// window?.rootViewController = splashViewController - - window?.rootViewController = UINavigationController(rootViewController: SearchViewController(viewModel: SearchViewModelImpl(), searchObserver: PublishRelay())) + window?.rootViewController = splashViewController window?.makeKeyAndVisible() } From 162433e3979a52caccea0099eb7aeaaad449e7ef Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 04:22:35 +0900 Subject: [PATCH 207/231] =?UTF-8?q?fix=20:=20=ED=99=95=EC=9D=B8=EC=9A=A9?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20(#194)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Search/ViewModel/SearchViewModelImpl.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/KCS/KCS/Presentation/Search/ViewModel/SearchViewModelImpl.swift b/KCS/KCS/Presentation/Search/ViewModel/SearchViewModelImpl.swift index 0161d8e3..07cc1900 100644 --- a/KCS/KCS/Presentation/Search/ViewModel/SearchViewModelImpl.swift +++ b/KCS/KCS/Presentation/Search/ViewModel/SearchViewModelImpl.swift @@ -25,10 +25,8 @@ private extension SearchViewModelImpl { func textChanged(text: String) { if text.isEmpty { // TODO: recentHistory usecase ์‹คํ–‰(debounce) ํ›„ generateDataOutput.accept([]) - generateDataOutput.accept(["recentHistory1", "recentHistory2", "recentHistory3", "recentHistory4"]) } else { // TODO: autoCompletion usecase ์‹คํ–‰(debounce) ํ›„ generateDataOutput.accept([]) - generateDataOutput.accept(["completion1", "completion2", "completion3"]) } } From d68f7f4283a186a141febe08398911fb806a0f29 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 05:33:05 +0900 Subject: [PATCH 208/231] =?UTF-8?q?feat=20:=20=EC=9E=84=EC=8B=9C=20SearchW?= =?UTF-8?q?ordView=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ++ .../Home/View/SearchWordView.swift | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 KCS/KCS/Presentation/Home/View/SearchWordView.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index e571d81c..3964d99e 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 59503A4E2B751B0B0006CF35 /* SearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A4D2B751B0B0006CF35 /* SearchViewController.swift */; }; 59503A522B751FCC0006CF35 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A512B751FCC0006CF35 /* SearchViewModel.swift */; }; 59503A542B751FD50006CF35 /* SearchViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */; }; + 59503A562B756CCD0006CF35 /* SearchWordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A552B756CCD0006CF35 /* SearchWordView.swift */; }; 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */; }; 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */; }; 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE572B5524D500725C90 /* RefreshButton.swift */; }; @@ -150,6 +151,7 @@ 59503A4D2B751B0B0006CF35 /* SearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewController.swift; sourceTree = ""; }; 59503A512B751FCC0006CF35 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModelImpl.swift; sourceTree = ""; }; + 59503A552B756CCD0006CF35 /* SearchWordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchWordView.swift; sourceTree = ""; }; 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlertMessage.swift; sourceTree = ""; }; 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewContents.swift; sourceTree = ""; }; 5977BE572B5524D500725C90 /* RefreshButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshButton.swift; sourceTree = ""; }; @@ -483,6 +485,7 @@ A89087032B4E7F3500767225 /* FilterButton.swift */, 5977BE572B5524D500725C90 /* RefreshButton.swift */, A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */, + 59503A552B756CCD0006CF35 /* SearchWordView.swift */, ); path = View; sourceTree = ""; @@ -1102,6 +1105,7 @@ A821A3742B74B84700089B8F /* SplashViewController.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, A83367C32B72714C00E0A844 /* ThirdOnboardingView.swift in Sources */, + 59503A562B756CCD0006CF35 /* SearchWordView.swift in Sources */, A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */, 59503A522B751FCC0006CF35 /* SearchViewModel.swift in Sources */, A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */, diff --git a/KCS/KCS/Presentation/Home/View/SearchWordView.swift b/KCS/KCS/Presentation/Home/View/SearchWordView.swift new file mode 100644 index 00000000..856a6cca --- /dev/null +++ b/KCS/KCS/Presentation/Home/View/SearchWordView.swift @@ -0,0 +1,58 @@ +// +// SearchWordView.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/9/24. +// + +import UIKit + +final class SearchWordView: UIView { + + private let searchingKeywordLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + + return label + }() + + func setSearchKeyword(keyword: String) { + searchingKeywordLabel.text = keyword + } + + func getSearchKeyword() -> String? { + return searchingKeywordLabel.text + } + + init() { + super.init(frame: .zero) + + addUIComponents() + configureConstraints() + setup() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +private extension SearchWordView { + + func setup() { + backgroundColor = .white + } + + func addUIComponents() { + addSubview(searchingKeywordLabel) + } + + func configureConstraints() { + NSLayoutConstraint.activate([ + searchingKeywordLabel.centerYAnchor.constraint(equalTo: centerYAnchor), + searchingKeywordLabel.centerXAnchor.constraint(equalTo: centerXAnchor) + ]) + } + +} From bf168c95a5161190c171c2d04d96506bd55dbaee Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 05:33:23 +0900 Subject: [PATCH 209/231] build : pod update (#198) --- KCS/Podfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/Podfile.lock b/KCS/Podfile.lock index 81ed8ce5..4bb108a1 100644 --- a/KCS/Podfile.lock +++ b/KCS/Podfile.lock @@ -193,4 +193,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: a5566a18764ef703abc0265b00efa39f0938cc7c -COCOAPODS: 1.15.0 +COCOAPODS: 1.15.2 From 291e1df4c2027180f59bd3cbbb4e017400800996 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 05:33:37 +0900 Subject: [PATCH 210/231] =?UTF-8?q?feat=20:=20SearchView=20=EB=9D=84?= =?UTF-8?q?=EC=9A=B0=EA=B8=B0=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index f29f3376..58519c02 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -51,6 +51,20 @@ final class HomeViewController: UIViewController { return stack }() + private lazy var searchView: SearchWordView = { + let view = SearchWordView() + view.translatesAutoresizingMaskIntoConstraints = false + view.rx + .tapGesture() + .when(.ended) + .subscribe(onNext: { [weak self] _ in + // TODO: SearchViewController๋กœ ๋„˜์–ด๊ฐ€๊ธฐ. + }) + .disposed(by: disposeBag) + + return view + }() + private lazy var locationManager: CLLocationManager = { let locationManager = CLLocationManager() locationManager.delegate = self @@ -568,6 +582,7 @@ private extension HomeViewController { view.addSubview(mapView) mapView.addSubview(locationButton) mapView.addSubview(filterButtonStackView) + mapView.addSubview(searchView) mapView.addSubview(compassView) mapView.addSubview(refreshButton) mapView.addSubview(moreStoreButton) @@ -602,6 +617,13 @@ private extension HomeViewController { filterButtonStackView.topAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.topAnchor, constant: 8) ]) + NSLayoutConstraint.activate([ + searchView.centerXAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.centerXAnchor), + searchView.topAnchor.constraint(equalTo: filterButtonStackView.bottomAnchor, constant: 10), + searchView.widthAnchor.constraint(equalToConstant: 150), + searchView.heightAnchor.constraint(equalToConstant: 30) + ]) + NSLayoutConstraint.activate([ compassView.leadingAnchor.constraint(equalTo: mapView.safeAreaLayoutGuide.leadingAnchor, constant: 16), compassView.topAnchor.constraint(equalTo: filterButtonStackView.bottomAnchor, constant: 16) From 9ec168d2cce2fc65dd10041354c917d1f7c23ad5 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 05:50:48 +0900 Subject: [PATCH 211/231] =?UTF-8?q?feat=20:=20HomeViewController=EB=A5=BC?= =?UTF-8?q?=20UINavigationController=EC=9D=98=20rootViewController?= =?UTF-8?q?=EB=A1=9C=20=EC=84=A4=EC=A0=95=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 3 ++- .../Presentation/Home/View/HomeViewController.swift | 1 + .../Splash/View/SplashViewController.swift | 10 +++++----- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index 65f58c0f..b814f24a 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -58,13 +58,14 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } else { rootViewController = homeViewController } + let mainNavigationController = UINavigationController(rootViewController: rootViewController) let splashViewController = SplashViewController( viewModel: SplashViewModelImpl( checkNetworkStatusUseCase: CheckNetworkStatusUseCaseImpl( repository: NetworkRepositoryImpl() ) - ), rootViewController: rootViewController + ), mainNavigationController: mainNavigationController ) window?.rootViewController = splashViewController diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 58519c02..6b06d944 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -259,6 +259,7 @@ private extension HomeViewController { status: locationManager.authorizationStatus ) ) + navigationController?.isNavigationBarHidden = true } func bind() { diff --git a/KCS/KCS/Presentation/Splash/View/SplashViewController.swift b/KCS/KCS/Presentation/Splash/View/SplashViewController.swift index fe742596..97336277 100644 --- a/KCS/KCS/Presentation/Splash/View/SplashViewController.swift +++ b/KCS/KCS/Presentation/Splash/View/SplashViewController.swift @@ -19,11 +19,11 @@ final class SplashViewController: UIViewController { let disposeBag = DisposeBag() let viewModel: SplashViewModel - let rootViewController: UIViewController + let mainNavigationController: UINavigationController - init(viewModel: SplashViewModel, rootViewController: UIViewController) { + init(viewModel: SplashViewModel, mainNavigationController: UINavigationController) { self.viewModel = viewModel - self.rootViewController = rootViewController + self.mainNavigationController = mainNavigationController super.init(nibName: nil, bundle: nil) } @@ -58,8 +58,8 @@ private extension SplashViewController { viewModel.networkEnableOutput .bind { [weak self] in guard let self = self else { return } - rootViewController.modalPresentationStyle = .fullScreen - present(rootViewController, animated: true) + mainNavigationController.modalPresentationStyle = .fullScreen + present(mainNavigationController, animated: true) } .disposed(by: disposeBag) From 4370adedbe5ac7358e40b2938ff9b2ba7b429346 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 07:05:00 +0900 Subject: [PATCH 212/231] feat : SearchViewController present (#198) --- KCS/KCS/Application/SceneDelegate.swift | 11 +++++-- .../Home/View/HomeViewController.swift | 31 +++++++++++++++++-- .../Search/View/SearchViewController.swift | 14 ++++++++- .../Splash/View/SplashViewController.swift | 10 +++--- KCS/KCS/Util/SystemImage.swift | 1 + 5 files changed, 55 insertions(+), 12 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index b814f24a..fc06f89e 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -36,6 +36,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ) ) ) + let searchObserver = PublishRelay() let homeViewController = HomeViewController( viewModel: viewModel, storeInformationViewController: storeInformationViewController, @@ -48,7 +49,12 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { listCellSelectedObserver: listCellSelectedObserver ), summaryViewHeightObserver: summaryViewHeightObserver, - listCellSelectedObserver: listCellSelectedObserver + listCellSelectedObserver: listCellSelectedObserver, + searchViewController: SearchViewController( + viewModel: SearchViewModelImpl(), + searchObserver: searchObserver + ), + searchObserver: searchObserver ) var rootViewController: UIViewController @@ -58,14 +64,13 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } else { rootViewController = homeViewController } - let mainNavigationController = UINavigationController(rootViewController: rootViewController) let splashViewController = SplashViewController( viewModel: SplashViewModelImpl( checkNetworkStatusUseCase: CheckNetworkStatusUseCaseImpl( repository: NetworkRepositoryImpl() ) - ), mainNavigationController: mainNavigationController + ), rootViewController: rootViewController ) window?.rootViewController = splashViewController diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 6b06d944..e3140283 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -58,7 +58,9 @@ final class HomeViewController: UIViewController { .tapGesture() .when(.ended) .subscribe(onNext: { [weak self] _ in - // TODO: SearchViewController๋กœ ๋„˜์–ด๊ฐ€๊ธฐ. + guard let self = self else { return } + searchViewController.setSearchKeyword(keyword: view.getSearchKeyword()) + presentSearchViewController() }) .disposed(by: disposeBag) @@ -209,6 +211,8 @@ final class HomeViewController: UIViewController { equalTo: mapView.bottomAnchor, constant: -90 ) + private let searchViewController: SearchViewController + private let searchObserver: PublishRelay private let disposeBag = DisposeBag() private var markers: [Marker] = [] private let storeInformationViewController: StoreInformationViewController @@ -223,13 +227,17 @@ final class HomeViewController: UIViewController { storeInformationViewController: StoreInformationViewController, storeListViewController: StoreListViewController, summaryViewHeightObserver: PublishRelay, - listCellSelectedObserver: PublishRelay + listCellSelectedObserver: PublishRelay, + searchViewController: SearchViewController, + searchObserver: PublishRelay ) { self.viewModel = viewModel self.storeInformationViewController = storeInformationViewController self.storeListViewController = storeListViewController self.summaryViewHeightObserver = summaryViewHeightObserver self.listCellSelectedObserver = listCellSelectedObserver + self.searchViewController = searchViewController + self.searchObserver = searchObserver super.init(nibName: nil, bundle: nil) } @@ -271,6 +279,7 @@ private extension HomeViewController { bindStoreInformationView() bindErrorAlert() bindListCellSelected() + bindSearch() } func bindFetchStores() { @@ -483,6 +492,14 @@ private extension HomeViewController { .disposed(by: disposeBag) } + func bindSearch() { + searchObserver + .bind { keyword in + // TODO: ViewModel.action() search ์ง„ํ–‰ + } + .disposed(by: disposeBag) + } + } private extension HomeViewController { @@ -574,7 +591,15 @@ private extension HomeViewController { storeListViewController.scrollToPreviousCell(indexPath: IndexPath(row: row, section: 0)) backStoreListButton.isHidden = false } - + + func presentSearchViewController() { + if let presentedViewController = presentedViewController { + let navigationController = UINavigationController(rootViewController: searchViewController) + navigationController.modalPresentationStyle = .fullScreen + presentedViewController.present(navigationController, animated: true) + } + } + } private extension HomeViewController { diff --git a/KCS/KCS/Presentation/Search/View/SearchViewController.swift b/KCS/KCS/Presentation/Search/View/SearchViewController.swift index 92f18c66..f3a94932 100644 --- a/KCS/KCS/Presentation/Search/View/SearchViewController.swift +++ b/KCS/KCS/Presentation/Search/View/SearchViewController.swift @@ -13,6 +13,17 @@ final class SearchViewController: UIViewController { private let disposeBag = DisposeBag() + private lazy var backButton: UIBarButtonItem = { + let button = UIBarButtonItem(image: SystemImage.back, style: .plain, target: nil, action: nil) + button.rx.tap + .bind { [weak self] _ in + self?.dismiss(animated: true) + } + .disposed(by: disposeBag) + + return button + }() + private lazy var searchController: UISearchController = { let searchController = UISearchController(searchResultsController: nil) searchController.searchBar.placeholder = "๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" @@ -90,7 +101,7 @@ final class SearchViewController: UIViewController { searchController.searchBar.becomeFirstResponder() } - func setSearchKeyword(keyword: String) { + func setSearchKeyword(keyword: String?) { searchController.searchBar.searchTextField.text = keyword } @@ -105,6 +116,7 @@ private extension SearchViewController { func addUIComponents() { view.addSubview(searchTableView) + navigationItem.setLeftBarButton(backButton, animated: true) } func configureConstraints() { diff --git a/KCS/KCS/Presentation/Splash/View/SplashViewController.swift b/KCS/KCS/Presentation/Splash/View/SplashViewController.swift index 97336277..fe742596 100644 --- a/KCS/KCS/Presentation/Splash/View/SplashViewController.swift +++ b/KCS/KCS/Presentation/Splash/View/SplashViewController.swift @@ -19,11 +19,11 @@ final class SplashViewController: UIViewController { let disposeBag = DisposeBag() let viewModel: SplashViewModel - let mainNavigationController: UINavigationController + let rootViewController: UIViewController - init(viewModel: SplashViewModel, mainNavigationController: UINavigationController) { + init(viewModel: SplashViewModel, rootViewController: UIViewController) { self.viewModel = viewModel - self.mainNavigationController = mainNavigationController + self.rootViewController = rootViewController super.init(nibName: nil, bundle: nil) } @@ -58,8 +58,8 @@ private extension SplashViewController { viewModel.networkEnableOutput .bind { [weak self] in guard let self = self else { return } - mainNavigationController.modalPresentationStyle = .fullScreen - present(mainNavigationController, animated: true) + rootViewController.modalPresentationStyle = .fullScreen + present(rootViewController, animated: true) } .disposed(by: disposeBag) diff --git a/KCS/KCS/Util/SystemImage.swift b/KCS/KCS/Util/SystemImage.swift index 34c88b87..c2ee2ade 100644 --- a/KCS/KCS/Util/SystemImage.swift +++ b/KCS/KCS/Util/SystemImage.swift @@ -12,5 +12,6 @@ enum SystemImage { static let circle = UIImage(systemName: "circle.fill") static let phone = UIImage(systemName: "phone.fill") static let refresh = UIImage(systemName: "arrow.clockwise") + static let back = UIImage(systemName: "lessthan") } From 7e054eb5bb50bf6693dead124e41e9a7b81c4659 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 07:20:25 +0900 Subject: [PATCH 213/231] =?UTF-8?q?fix=20:=20animation=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20=EB=92=A4=EB=A1=9C=EA=B0=80=EA=B8=B0=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 5 +++-- .../Presentation/Search/View/SearchViewController.swift | 7 ++++++- KCS/KCS/Util/SystemImage.swift | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index e3140283..2f9049a0 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -494,8 +494,9 @@ private extension HomeViewController { func bindSearch() { searchObserver - .bind { keyword in + .bind { [weak self] keyword in // TODO: ViewModel.action() search ์ง„ํ–‰ + print(keyword) } .disposed(by: disposeBag) } @@ -596,7 +597,7 @@ private extension HomeViewController { if let presentedViewController = presentedViewController { let navigationController = UINavigationController(rootViewController: searchViewController) navigationController.modalPresentationStyle = .fullScreen - presentedViewController.present(navigationController, animated: true) + presentedViewController.present(navigationController, animated: false) } } diff --git a/KCS/KCS/Presentation/Search/View/SearchViewController.swift b/KCS/KCS/Presentation/Search/View/SearchViewController.swift index f3a94932..5f8ba7c4 100644 --- a/KCS/KCS/Presentation/Search/View/SearchViewController.swift +++ b/KCS/KCS/Presentation/Search/View/SearchViewController.swift @@ -15,9 +15,10 @@ final class SearchViewController: UIViewController { private lazy var backButton: UIBarButtonItem = { let button = UIBarButtonItem(image: SystemImage.back, style: .plain, target: nil, action: nil) + button.tintColor = .primary3 button.rx.tap .bind { [weak self] _ in - self?.dismiss(animated: true) + self?.dismiss(animated: false) } .disposed(by: disposeBag) @@ -157,7 +158,9 @@ extension SearchViewController: UISearchResultsUpdating, UISearchBarDelegate { func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { guard let text = searchBar.text else { return } + searchObserver.accept(text) + navigationController?.dismiss(animated: false) } } @@ -166,7 +169,9 @@ extension SearchViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let text = dataSource.itemIdentifier(for: indexPath) else { return } + self.dismiss(animated: true) searchObserver.accept(text) + navigationController?.dismiss(animated: false) } } diff --git a/KCS/KCS/Util/SystemImage.swift b/KCS/KCS/Util/SystemImage.swift index c2ee2ade..8bc9255a 100644 --- a/KCS/KCS/Util/SystemImage.swift +++ b/KCS/KCS/Util/SystemImage.swift @@ -12,6 +12,6 @@ enum SystemImage { static let circle = UIImage(systemName: "circle.fill") static let phone = UIImage(systemName: "phone.fill") static let refresh = UIImage(systemName: "arrow.clockwise") - static let back = UIImage(systemName: "lessthan") + static let back = UIImage(systemName: "arrow.backward") } From d6d77376551682ba579d0709099ecd10d6a33dee Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 07:22:55 +0900 Subject: [PATCH 214/231] =?UTF-8?q?feat=20:=20Search=20Input=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 2 +- KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift | 6 ++++++ .../Home/ViewModel/protocol/HomeViewModel.swift | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 2f9049a0..bcf9225f 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -496,7 +496,7 @@ private extension HomeViewController { searchObserver .bind { [weak self] keyword in // TODO: ViewModel.action() search ์ง„ํ–‰ - print(keyword) + self?.viewModel.action(input: .search(keyword: keyword)) } .disposed(by: disposeBag) } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 7544e9de..97eb1685 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -64,6 +64,8 @@ final class HomeViewModelImpl: HomeViewModel { checkLocationAuthorization(status: status) case .checkLocationAuthorizationWhenCameraDidChange(let status): checkLocationAuthorizationWhenCameraDidChange(status: status) + case .search(let keyword): + search(keyword: keyword) } } @@ -251,4 +253,8 @@ private extension HomeViewModelImpl { } } + func search(keyword: String) { + // TODO: SearchUsecase ์‹คํ–‰ ํ›„ output accept + } + } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index c8596c57..37b50606 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -36,6 +36,7 @@ enum HomeViewModelInputCase { case setMarker(store: Store, certificationType: CertificationType) case checkLocationAuthorization(status: CLAuthorizationStatus) case checkLocationAuthorizationWhenCameraDidChange(status: CLAuthorizationStatus) + case search(keyword: String) } From ab1af4e1d7d859d90b1d36f8a817aaee99cd7b33 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 07:26:08 +0900 Subject: [PATCH 215/231] =?UTF-8?q?fix=20:=20base=20URL=EA=B3=BC=20path=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Network/StoreAPI.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 93658693..5fd4966d 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -28,7 +28,9 @@ extension StoreAPI: Router, URLRequestConvertible { var path: String { switch self { - case .getStores, .getImage: + case .getStores: + return "/v2/storecertification/byLocation" + case .getImage: return "" } } From 34ce11271d18004e05a2cb10101303ba18dce2e3 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 07:34:27 +0900 Subject: [PATCH 216/231] =?UTF-8?q?feat=20:=20Search=20API=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20DTO=20=EC=9E=91=EC=84=B1=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 4 ++++ KCS/KCS/Data/Network/DTO/SearchDTO.swift | 16 ++++++++++++++++ KCS/KCS/Data/Network/StoreAPI.swift | 13 +++++++++---- 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 KCS/KCS/Data/Network/DTO/SearchDTO.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 3964d99e..16f449a1 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 59503A522B751FCC0006CF35 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A512B751FCC0006CF35 /* SearchViewModel.swift */; }; 59503A542B751FD50006CF35 /* SearchViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */; }; 59503A562B756CCD0006CF35 /* SearchWordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A552B756CCD0006CF35 /* SearchWordView.swift */; }; + 59503A582B758DCE0006CF35 /* SearchDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A572B758DCE0006CF35 /* SearchDTO.swift */; }; 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */; }; 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */; }; 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE572B5524D500725C90 /* RefreshButton.swift */; }; @@ -152,6 +153,7 @@ 59503A512B751FCC0006CF35 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModelImpl.swift; sourceTree = ""; }; 59503A552B756CCD0006CF35 /* SearchWordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchWordView.swift; sourceTree = ""; }; + 59503A572B758DCE0006CF35 /* SearchDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchDTO.swift; sourceTree = ""; }; 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlertMessage.swift; sourceTree = ""; }; 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewContents.swift; sourceTree = ""; }; 5977BE572B5524D500725C90 /* RefreshButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshButton.swift; sourceTree = ""; }; @@ -611,6 +613,7 @@ children = ( 59C306AC2B4FFAC700862625 /* StoreDTO.swift */, 59C306CE2B50399C00862625 /* RequestLocationDTO.swift */, + 59503A572B758DCE0006CF35 /* SearchDTO.swift */, ); path = DTO; sourceTree = ""; @@ -1139,6 +1142,7 @@ A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */, 59B886622B6E8484005750EF /* UISheetPresentationController+Detent.swift in Sources */, 59C306D82B50650D00862625 /* Encodable+.swift in Sources */, + 59503A582B758DCE0006CF35 /* SearchDTO.swift in Sources */, 59B886602B6E7CF6005750EF /* UIViewController+Alert.swift in Sources */, 5977BE682B553C8300725C90 /* HomeDependency.swift in Sources */, ); diff --git a/KCS/KCS/Data/Network/DTO/SearchDTO.swift b/KCS/KCS/Data/Network/DTO/SearchDTO.swift new file mode 100644 index 00000000..ba24e420 --- /dev/null +++ b/KCS/KCS/Data/Network/DTO/SearchDTO.swift @@ -0,0 +1,16 @@ +// +// SearchDTO.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/9/24. +// + +import Foundation + +struct SearchDTO: Encodable { + + let currLong: Double + let currLat: Double + let searchKeyword: String + +} diff --git a/KCS/KCS/Data/Network/StoreAPI.swift b/KCS/KCS/Data/Network/StoreAPI.swift index 5fd4966d..58a368cd 100644 --- a/KCS/KCS/Data/Network/StoreAPI.swift +++ b/KCS/KCS/Data/Network/StoreAPI.swift @@ -12,6 +12,7 @@ enum StoreAPI { case getStores(location: RequestLocationDTO) case getImage(url: String) + case getSearchStores(searchDTO: SearchDTO) } @@ -19,7 +20,7 @@ extension StoreAPI: Router, URLRequestConvertible { var baseURL: String? { switch self { - case .getStores: + case .getStores, .getSearchStores: return getURL(type: .develop) case .getImage(let url): return url @@ -32,19 +33,21 @@ extension StoreAPI: Router, URLRequestConvertible { return "/v2/storecertification/byLocation" case .getImage: return "" + case .getSearchStores: + return "/v1/storecertification/byLocationAndKeyword" } } var method: HTTPMethod { switch self { - case .getStores, .getImage: + case .getStores, .getImage, .getSearchStores: return .get } } var headers: [String: String] { switch self { - case .getStores: + case .getStores, .getSearchStores: return [ "Content-Type": "application/json" ] @@ -60,6 +63,8 @@ extension StoreAPI: Router, URLRequestConvertible { return try location.asDictionary() case .getImage: return [:] + case let .getSearchStores(searchDTO): + return try searchDTO.asDictionary() } } catch { return nil @@ -70,7 +75,7 @@ extension StoreAPI: Router, URLRequestConvertible { /// ๋ฐ”๋””์— ๋‹ด์•„์„œ ๋ณด๋‚ด์•ผํ•  ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด, JSONEncoding.default var encoding: ParameterEncoding? { switch self { - case .getStores: + case .getStores, .getSearchStores: return URLEncoding.default case .getImage: return nil From a06830dfb44432126f3d29a6891d9bfe201e6134 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 07:59:23 +0900 Subject: [PATCH 217/231] =?UTF-8?q?feat=20:=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EA=B0=80=EC=9A=B4=EB=8D=B0=20=EB=A7=A4=EA=B0=9C=EB=B3=80?= =?UTF-8?q?=EC=88=98=EC=97=90=20=EC=B6=94=EA=B0=80=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 7 ++++++- .../Presentation/Home/ViewModel/HomeViewModelImpl.swift | 6 +++--- .../Home/ViewModel/protocol/HomeViewModel.swift | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index bcf9225f..5ff1ad9e 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -496,7 +496,12 @@ private extension HomeViewController { searchObserver .bind { [weak self] keyword in // TODO: ViewModel.action() search ์ง„ํ–‰ - self?.viewModel.action(input: .search(keyword: keyword)) + guard let center = self?.view.center else { return } + let centerPosition = Location( + longitude: Double(center.x), + latitude: Double(center.y) + ) + self?.viewModel.action(input: .search(location: centerPosition, keyword: keyword)) } .disposed(by: disposeBag) } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 97eb1685..82543702 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -64,8 +64,8 @@ final class HomeViewModelImpl: HomeViewModel { checkLocationAuthorization(status: status) case .checkLocationAuthorizationWhenCameraDidChange(let status): checkLocationAuthorizationWhenCameraDidChange(status: status) - case .search(let keyword): - search(keyword: keyword) + case .search(let location, let keyword): + search(location: location, keyword: keyword) } } @@ -253,7 +253,7 @@ private extension HomeViewModelImpl { } } - func search(keyword: String) { + func search(location: Location, keyword: String) { // TODO: SearchUsecase ์‹คํ–‰ ํ›„ output accept } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 37b50606..0765709a 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -36,7 +36,7 @@ enum HomeViewModelInputCase { case setMarker(store: Store, certificationType: CertificationType) case checkLocationAuthorization(status: CLAuthorizationStatus) case checkLocationAuthorizationWhenCameraDidChange(status: CLAuthorizationStatus) - case search(keyword: String) + case search(location: Location, keyword: String) } From c72933c21c1a5ee1282e76820c7ebc12808290ac Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 08:00:02 +0900 Subject: [PATCH 218/231] =?UTF-8?q?feat=20:=20Response=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20Repository=EC=97=90=20Search=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 12 ++++--- .../Response/Protocol/APIResponse.swift | 2 +- .../Response/RefreshStoreResponse.swift | 18 ++++++++++ .../Response/SearchStoreResponse.swift | 18 ++++++++++ .../Data/Network/Response/StoreResponse.swift | 18 ---------- .../Data/Repository/StoreRepositoryImpl.swift | 33 ++++++++++++++++++- .../Repository/StoreRepository.swift | 5 +++ 7 files changed, 82 insertions(+), 24 deletions(-) create mode 100644 KCS/KCS/Data/Network/Response/RefreshStoreResponse.swift create mode 100644 KCS/KCS/Data/Network/Response/SearchStoreResponse.swift delete mode 100644 KCS/KCS/Data/Network/Response/StoreResponse.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 16f449a1..15e3f3dc 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 59503A542B751FD50006CF35 /* SearchViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */; }; 59503A562B756CCD0006CF35 /* SearchWordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A552B756CCD0006CF35 /* SearchWordView.swift */; }; 59503A582B758DCE0006CF35 /* SearchDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A572B758DCE0006CF35 /* SearchDTO.swift */; }; + 59503A5C2B75927F0006CF35 /* SearchStoreResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A5B2B75927F0006CF35 /* SearchStoreResponse.swift */; }; 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */; }; 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */; }; 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE572B5524D500725C90 /* RefreshButton.swift */; }; @@ -55,7 +56,7 @@ 59C306A62B4D966C00862625 /* CertificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A52B4D966C00862625 /* CertificationType.swift */; }; 59C306A92B4FF9AF00862625 /* StoreRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306A82B4FF9AF00862625 /* StoreRepository.swift */; }; 59C306AD2B4FFAC700862625 /* StoreDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306AC2B4FFAC700862625 /* StoreDTO.swift */; }; - 59C306B02B4FFE4400862625 /* StoreResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306AF2B4FFE4400862625 /* StoreResponse.swift */; }; + 59C306B02B4FFE4400862625 /* RefreshStoreResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306AF2B4FFE4400862625 /* RefreshStoreResponse.swift */; }; 59C306B22B50001F00862625 /* StoreRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306B12B50001F00862625 /* StoreRepositoryImpl.swift */; }; 59C306B42B50015500862625 /* APIResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306B32B50015500862625 /* APIResponse.swift */; }; 59C306B62B50027300862625 /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C306B52B50027300862625 /* Store.swift */; }; @@ -154,6 +155,7 @@ 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModelImpl.swift; sourceTree = ""; }; 59503A552B756CCD0006CF35 /* SearchWordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchWordView.swift; sourceTree = ""; }; 59503A572B758DCE0006CF35 /* SearchDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchDTO.swift; sourceTree = ""; }; + 59503A5B2B75927F0006CF35 /* SearchStoreResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchStoreResponse.swift; sourceTree = ""; }; 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlertMessage.swift; sourceTree = ""; }; 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewContents.swift; sourceTree = ""; }; 5977BE572B5524D500725C90 /* RefreshButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshButton.swift; sourceTree = ""; }; @@ -190,7 +192,7 @@ 59C306A52B4D966C00862625 /* CertificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificationType.swift; sourceTree = ""; }; 59C306A82B4FF9AF00862625 /* StoreRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepository.swift; sourceTree = ""; }; 59C306AC2B4FFAC700862625 /* StoreDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreDTO.swift; sourceTree = ""; }; - 59C306AF2B4FFE4400862625 /* StoreResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreResponse.swift; sourceTree = ""; }; + 59C306AF2B4FFE4400862625 /* RefreshStoreResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshStoreResponse.swift; sourceTree = ""; }; 59C306B12B50001F00862625 /* StoreRepositoryImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreRepositoryImpl.swift; sourceTree = ""; }; 59C306B32B50015500862625 /* APIResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIResponse.swift; sourceTree = ""; }; 59C306B52B50027300862625 /* Store.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = ""; }; @@ -635,7 +637,8 @@ isa = PBXGroup; children = ( 59C306B82B50033A00862625 /* Protocol */, - 59C306AF2B4FFE4400862625 /* StoreResponse.swift */, + 59C306AF2B4FFE4400862625 /* RefreshStoreResponse.swift */, + 59503A5B2B75927F0006CF35 /* SearchStoreResponse.swift */, ); path = Response; sourceTree = ""; @@ -1085,7 +1088,7 @@ A83367BB2B709C0200E0A844 /* OnboardingViewController.swift in Sources */, 59503A542B751FD50006CF35 /* SearchViewModelImpl.swift in Sources */, A83367B62B6F993F00E0A844 /* MoreStoreButton.swift in Sources */, - 59C306B02B4FFE4400862625 /* StoreResponse.swift in Sources */, + 59C306B02B4FFE4400862625 /* RefreshStoreResponse.swift in Sources */, A8A7E0602B64E62200D015E5 /* NMFMyPosition+.swift in Sources */, A8ACB7EA2B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift in Sources */, A890870A2B4EF00B00767225 /* SystemImage.swift in Sources */, @@ -1140,6 +1143,7 @@ 591A887F2B384E600059E40F /* SceneDelegate.swift in Sources */, A8ACB7EF2B5AEBB900540BD1 /* GetStoreInformationUseCaseImpl.swift in Sources */, A8ACB7DD2B58E3DE00540BD1 /* OpenClosedType.swift in Sources */, + 59503A5C2B75927F0006CF35 /* SearchStoreResponse.swift in Sources */, 59B886622B6E8484005750EF /* UISheetPresentationController+Detent.swift in Sources */, 59C306D82B50650D00862625 /* Encodable+.swift in Sources */, 59503A582B758DCE0006CF35 /* SearchDTO.swift in Sources */, diff --git a/KCS/KCS/Data/Network/Response/Protocol/APIResponse.swift b/KCS/KCS/Data/Network/Response/Protocol/APIResponse.swift index 519490ac..bad20310 100644 --- a/KCS/KCS/Data/Network/Response/Protocol/APIResponse.swift +++ b/KCS/KCS/Data/Network/Response/Protocol/APIResponse.swift @@ -13,6 +13,6 @@ protocol APIResponse: Codable { var code: Int { get } var message: String { get } - var data: [[ResponseType]] { get } + var data: ResponseType { get } } diff --git a/KCS/KCS/Data/Network/Response/RefreshStoreResponse.swift b/KCS/KCS/Data/Network/Response/RefreshStoreResponse.swift new file mode 100644 index 00000000..f55e317e --- /dev/null +++ b/KCS/KCS/Data/Network/Response/RefreshStoreResponse.swift @@ -0,0 +1,18 @@ +// +// RefreshStoreResponse.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 1/11/24. +// + +import Foundation + +struct RefreshStoreResponse: APIResponse { + + typealias ResponseType = [[StoreDTO]] + + let code: Int + let message: String + let data: ResponseType + +} diff --git a/KCS/KCS/Data/Network/Response/SearchStoreResponse.swift b/KCS/KCS/Data/Network/Response/SearchStoreResponse.swift new file mode 100644 index 00000000..44b330e1 --- /dev/null +++ b/KCS/KCS/Data/Network/Response/SearchStoreResponse.swift @@ -0,0 +1,18 @@ +// +// SearchStoreResponse.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/9/24. +// + +import Foundation + +struct SearchStoreResponse: APIResponse { + + typealias ResponseType = [StoreDTO] + + let code: Int + let message: String + let data: ResponseType + +} diff --git a/KCS/KCS/Data/Network/Response/StoreResponse.swift b/KCS/KCS/Data/Network/Response/StoreResponse.swift deleted file mode 100644 index 5af345c2..00000000 --- a/KCS/KCS/Data/Network/Response/StoreResponse.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// StoreResponse.swift -// KCS -// -// Created by ์กฐ์„ฑ๋ฏผ on 1/11/24. -// - -import Foundation - -struct StoreResponse: APIResponse { - - typealias ResponseType = StoreDTO - - let code: Int - let message: String - let data: [[ResponseType]] - -} diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 6e251055..488a4c08 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -31,7 +31,7 @@ final class StoreRepositoryImpl: StoreRepository { neLong: requestLocation.northEast.longitude, neLat: requestLocation.northEast.latitude ))) - .responseDecodable(of: StoreResponse.self) { [weak self] response in + .responseDecodable(of: RefreshStoreResponse.self) { [weak self] response in do { switch response.result { case .success(let result): @@ -87,4 +87,35 @@ final class StoreRepositoryImpl: StoreRepository { return store } + func fetchSearchStores(location: Location, keyword: String) -> Observable<[Store]> { + return Observable<[Store]>.create { observer -> Disposable in + AF.request(StoreAPI.getSearchStores(searchDTO: SearchDTO( + currLong: location.longitude, + currLat: location.latitude, + searchKeyword: keyword + ))) + .responseDecodable(of: SearchStoreResponse.self) { [weak self] response in + do { + switch response.result { + case .success(let result): + let resultStores = try result.data.map { try $0.toEntity() } + // TODO: ์ผ์ฐจ์› ๋ฐฐ์—ด ๊ฐ€๊ฒŒ๋“ค ์ €์žฅ + case .failure(let error): + if let underlyingError = error.underlyingError as? NSError { + switch underlyingError.code { + case URLError.notConnectedToInternet.rawValue: + observer.onError(ErrorAlertMessage.internet) + default: + observer.onError(ErrorAlertMessage.server) + } + } + } + } catch { + observer.onError(error) + } + } + return Disposables.create() + } + } + } diff --git a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift index 1dbe8af2..9a9f8fc4 100644 --- a/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift +++ b/KCS/KCS/Domain/Interface/Repository/StoreRepository.swift @@ -20,4 +20,9 @@ protocol StoreRepository { tag: UInt ) throws -> Store + func fetchSearchStores( + location: Location, + keyword: String + ) -> Observable<[Store]> + } From 28429c45300b394e7846736582a851014c9f60a6 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 08:04:27 +0900 Subject: [PATCH 219/231] =?UTF-8?q?feat=20:=20Store=EB=A5=BC=201=EC=B0=A8?= =?UTF-8?q?=EC=9B=90=20=EB=B0=B0=EC=97=B4=EB=A1=9C=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Repository/StoreRepositoryImpl.swift | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index 488a4c08..d6bfc6a2 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -10,9 +10,9 @@ import Alamofire final class StoreRepositoryImpl: StoreRepository { - private var stores: [[Store]] + private var stores: [Store] - init(stores: [[Store]] = []) { + init(stores: [Store] = []) { self.stores = stores } @@ -36,7 +36,7 @@ final class StoreRepositoryImpl: StoreRepository { switch response.result { case .success(let result): let resultStores = try result.data.map { try $0.map { try $0.toEntity() } } - self?.stores = resultStores + self?.stores = resultStores.flatMap({ $0 }) if isEntire { observer.onNext(FetchStores( fetchCountContent: FetchCountContent(), @@ -74,8 +74,12 @@ final class StoreRepositoryImpl: StoreRepository { func fetchStores(count: Int) -> [Store] { if stores.isEmpty { return [] } var fetchResult: [Store] = [] - for index in 0.. stores.count { + storeCount = stores.count + } + for index in 0.. Store { - guard let store = stores.flatMap({ $0 }).first(where: { $0.id == tag }) else { throw StoreRepositoryError.wrongStoreId } + guard let store = stores.first(where: { $0.id == tag }) else { throw StoreRepositoryError.wrongStoreId } return store } From 504b8d8905653ab9a886ced5aab5bca8e4edc848 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 08:08:31 +0900 Subject: [PATCH 220/231] =?UTF-8?q?feat=20:=20search=20=ED=95=9C=20?= =?UTF-8?q?=EA=B0=80=EA=B2=8C=EB=93=A4=20Repository=EC=97=90=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Data/Repository/StoreRepositoryImpl.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift index d6bfc6a2..b2b2da67 100644 --- a/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift +++ b/KCS/KCS/Data/Repository/StoreRepositoryImpl.swift @@ -103,7 +103,8 @@ final class StoreRepositoryImpl: StoreRepository { switch response.result { case .success(let result): let resultStores = try result.data.map { try $0.toEntity() } - // TODO: ์ผ์ฐจ์› ๋ฐฐ์—ด ๊ฐ€๊ฒŒ๋“ค ์ €์žฅ + self?.stores = resultStores + observer.onNext(resultStores) case .failure(let error): if let underlyingError = error.underlyingError as? NSError { switch underlyingError.code { From d1913ee216c852629421bc29c09da0ca6055b49a Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 08:12:43 +0900 Subject: [PATCH 221/231] =?UTF-8?q?feat=20:=20FetchSearchStoresUseCase=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 8 +++++++ .../FetchSearchStoresUseCaseImpl.swift | 23 +++++++++++++++++++ .../protocol/FetchSearchStoresUseCase.swift | 21 +++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 KCS/KCS/Domain/UseCase/FetchSearchStoresUseCaseImpl.swift create mode 100644 KCS/KCS/Domain/UseCase/protocol/FetchSearchStoresUseCase.swift diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 15e3f3dc..448329a5 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -21,6 +21,8 @@ 59503A562B756CCD0006CF35 /* SearchWordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A552B756CCD0006CF35 /* SearchWordView.swift */; }; 59503A582B758DCE0006CF35 /* SearchDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A572B758DCE0006CF35 /* SearchDTO.swift */; }; 59503A5C2B75927F0006CF35 /* SearchStoreResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A5B2B75927F0006CF35 /* SearchStoreResponse.swift */; }; + 59503A5E2B7596990006CF35 /* FetchSearchStoresUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A5D2B7596990006CF35 /* FetchSearchStoresUseCase.swift */; }; + 59503A602B75970E0006CF35 /* FetchSearchStoresUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A5F2B75970E0006CF35 /* FetchSearchStoresUseCaseImpl.swift */; }; 595EE2A52B693DE700CC01CE /* ErrorAlertMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */; }; 596DDC4D2B6416AB00A4BBC4 /* SummaryViewContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */; }; 5977BE582B5524D500725C90 /* RefreshButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5977BE572B5524D500725C90 /* RefreshButton.swift */; }; @@ -156,6 +158,8 @@ 59503A552B756CCD0006CF35 /* SearchWordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchWordView.swift; sourceTree = ""; }; 59503A572B758DCE0006CF35 /* SearchDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchDTO.swift; sourceTree = ""; }; 59503A5B2B75927F0006CF35 /* SearchStoreResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchStoreResponse.swift; sourceTree = ""; }; + 59503A5D2B7596990006CF35 /* FetchSearchStoresUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchSearchStoresUseCase.swift; sourceTree = ""; }; + 59503A5F2B75970E0006CF35 /* FetchSearchStoresUseCaseImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchSearchStoresUseCaseImpl.swift; sourceTree = ""; }; 595EE2A42B693DE700CC01CE /* ErrorAlertMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlertMessage.swift; sourceTree = ""; }; 596DDC4C2B6416AB00A4BBC4 /* SummaryViewContents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryViewContents.swift; sourceTree = ""; }; 5977BE572B5524D500725C90 /* RefreshButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshButton.swift; sourceTree = ""; }; @@ -366,6 +370,7 @@ A8ACB7E72B595A2100540BD1 /* GetOpenClosedUseCase.swift */, 59F478B42B59BE0B002FEF9E /* FetchImageUseCase.swift */, A821A37B2B74BC4B00089B8F /* CheckNetworkStatusUseCase.swift */, + 59503A5D2B7596990006CF35 /* FetchSearchStoresUseCase.swift */, ); path = protocol; sourceTree = ""; @@ -381,6 +386,7 @@ A8ACB7E92B595A3E00540BD1 /* GetOpenClosedUseCaseImpl.swift */, 59F478B22B59BDD6002FEF9E /* FetchImageUseCaseImpl.swift */, A821A3792B74BBE200089B8F /* CheckNetworkStatusUseCaseImpl.swift */, + 59503A5F2B75970E0006CF35 /* FetchSearchStoresUseCaseImpl.swift */, ); path = UseCase; sourceTree = ""; @@ -1109,6 +1115,7 @@ A81EFBB32B5BC57800D0C0D7 /* OpenClosedContent.swift in Sources */, 5977BE5C2B5535A100725C90 /* FetchRefreshStoresUseCaseImpl.swift in Sources */, A821A3742B74B84700089B8F /* SplashViewController.swift in Sources */, + 59503A602B75970E0006CF35 /* FetchSearchStoresUseCaseImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, A83367C32B72714C00E0A844 /* ThirdOnboardingView.swift in Sources */, 59503A562B756CCD0006CF35 /* SearchWordView.swift in Sources */, @@ -1120,6 +1127,7 @@ 59C306CB2B50357900862625 /* Router.swift in Sources */, A8ACB7E82B595A2100540BD1 /* GetOpenClosedUseCase.swift in Sources */, A83367BF2B7246E700E0A844 /* FirstOnboardingView.swift in Sources */, + 59503A5E2B7596990006CF35 /* FetchSearchStoresUseCase.swift in Sources */, 59C306B62B50027300862625 /* Store.swift in Sources */, 59C306B42B50015500862625 /* APIResponse.swift in Sources */, 59B8865A2B6E3B40005750EF /* StoreInformationViewController.swift in Sources */, diff --git a/KCS/KCS/Domain/UseCase/FetchSearchStoresUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/FetchSearchStoresUseCaseImpl.swift new file mode 100644 index 00000000..5bb06d92 --- /dev/null +++ b/KCS/KCS/Domain/UseCase/FetchSearchStoresUseCaseImpl.swift @@ -0,0 +1,23 @@ +// +// FetchSearchStoresUseCaseImpl.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/9/24. +// + +import RxSwift + +struct FetchSearchStoresUseCaseImpl: FetchSearchStoresUseCase { + + var repository: StoreRepository + + init(repository: StoreRepository) { + self.repository = repository + } + + func execute(location: Location, keyword: String) -> Observable<[Store]> { + return repository.fetchSearchStores(location: location, keyword: keyword) + } + + +} diff --git a/KCS/KCS/Domain/UseCase/protocol/FetchSearchStoresUseCase.swift b/KCS/KCS/Domain/UseCase/protocol/FetchSearchStoresUseCase.swift new file mode 100644 index 00000000..00307b2f --- /dev/null +++ b/KCS/KCS/Domain/UseCase/protocol/FetchSearchStoresUseCase.swift @@ -0,0 +1,21 @@ +// +// FetchSearchStoresUseCase.swift +// KCS +// +// Created by ์กฐ์„ฑ๋ฏผ on 2/9/24. +// + +import RxSwift + +protocol FetchSearchStoresUseCase { + + var repository: StoreRepository { get } + + init(repository: StoreRepository) + + func execute( + location: Location, + keyword: String + ) -> Observable<[Store]> + +} From 424ff25a9ac9b20cdc192fe0368a5d1524884963 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 08:46:55 +0900 Subject: [PATCH 222/231] =?UTF-8?q?feat=20:=20Stores=EB=A5=BC=20HomeViewCo?= =?UTF-8?q?ntroller=EB=A1=9C=20=EC=A0=84=EB=8B=AC=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Application/SceneDelegate.swift | 3 ++- .../Home/View/HomeViewController.swift | 12 +++++++++++ .../Home/ViewModel/HomeViewModelImpl.swift | 20 ++++++++++++++++++- .../ViewModel/protocol/HomeViewModel.swift | 6 +++++- 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/KCS/KCS/Application/SceneDelegate.swift b/KCS/KCS/Application/SceneDelegate.swift index fc06f89e..34b07744 100644 --- a/KCS/KCS/Application/SceneDelegate.swift +++ b/KCS/KCS/Application/SceneDelegate.swift @@ -23,7 +23,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { dependency: HomeDependency(), fetchRefreshStoresUseCase: FetchRefreshStoresUseCaseImpl(repository: repository), fetchStoresUseCase: FetchStoresUseCaseImpl(repository: repository), - getStoreInformationUseCase: GetStoreInformationUseCaseImpl(repository: repository) + getStoreInformationUseCase: GetStoreInformationUseCaseImpl(repository: repository), + fetchSearchStoresUseCase: FetchSearchStoresUseCaseImpl(repository: repository) ) let summaryViewHeightObserver = PublishRelay() let listCellSelectedObserver = PublishRelay() diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 5ff1ad9e..9c75b3eb 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -504,6 +504,18 @@ private extension HomeViewController { self?.viewModel.action(input: .search(location: centerPosition, keyword: keyword)) } .disposed(by: disposeBag) + + viewModel.searchStoresOutput + .bind { stores in + // TODO: ๋งˆ์ปค ๋ฐ ํ•„ํ„ฐ ์ดˆ๊ธฐํ™”, ์นด๋ฉ”๋ผ ๋ฐ ์คŒ ์ด๋™, ๋งˆ์ปค ์„ค์ • + } + .disposed(by: disposeBag) + + viewModel.searchOneStoreOutput + .bind { store in + // TODO: ๋งˆ์ปค ๋ฐ ํ•„ํ„ฐ ์ดˆ๊ธฐํ™”, ์นด๋ฉ”๋ผ ๋ฐ ์คŒ ์ด๋™, ๋งˆ์ปค ์„ค์ •, ์š”์•ฝ ์นด๋“œ present + } + .disposed(by: disposeBag) } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 82543702..902b9ad0 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -15,6 +15,7 @@ final class HomeViewModelImpl: HomeViewModel { let fetchRefreshStoresUseCase: FetchRefreshStoresUseCase let fetchStoresUseCase: FetchStoresUseCase let getStoreInformationUseCase: GetStoreInformationUseCase + let fetchSearchStoresUseCase: FetchSearchStoresUseCase let getStoreInformationOutput = PublishRelay() let refreshDoneOutput = PublishRelay() @@ -29,6 +30,8 @@ final class HomeViewModelImpl: HomeViewModel { let fetchCountOutput = PublishRelay() let noMoreStoresOutput = PublishRelay() let dimViewTapGestureEndedOutput = PublishRelay() + let searchStoresOutput = PublishRelay<[Store]>() + let searchOneStoreOutput = PublishRelay() var dependency: HomeDependency @@ -36,12 +39,14 @@ final class HomeViewModelImpl: HomeViewModel { dependency: HomeDependency, fetchRefreshStoresUseCase: FetchRefreshStoresUseCase, fetchStoresUseCase: FetchStoresUseCase, - getStoreInformationUseCase: GetStoreInformationUseCase + getStoreInformationUseCase: GetStoreInformationUseCase, + fetchSearchStoresUseCase: FetchSearchStoresUseCase ) { self.dependency = dependency self.fetchRefreshStoresUseCase = fetchRefreshStoresUseCase self.fetchStoresUseCase = fetchStoresUseCase self.getStoreInformationUseCase = getStoreInformationUseCase + self.fetchSearchStoresUseCase = fetchSearchStoresUseCase } func action(input: HomeViewModelInputCase) { @@ -255,6 +260,19 @@ private extension HomeViewModelImpl { func search(location: Location, keyword: String) { // TODO: SearchUsecase ์‹คํ–‰ ํ›„ output accept + fetchSearchStoresUseCase.execute(location: location, keyword: keyword) + .subscribe(onNext: { [weak self] stores in + guard let self = self else { return } + dependency.resetFetchCount() + dependency.maxFetchCount = 1 + if stores.count == 1 { + guard let oneStore = stores.first else { return } + searchOneStoreOutput.accept(oneStore) + } else { + searchStoresOutput.accept(stores) + } + }) + .disposed(by: dependency.disposeBag) } } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index 0765709a..b9a4e893 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -15,12 +15,14 @@ protocol HomeViewModel: HomeViewModelInput, HomeViewModelOutput { var fetchRefreshStoresUseCase: FetchRefreshStoresUseCase { get } var fetchStoresUseCase: FetchStoresUseCase { get } var getStoreInformationUseCase: GetStoreInformationUseCase { get } + var fetchSearchStoresUseCase: FetchSearchStoresUseCase { get } init( dependency: HomeDependency, fetchRefreshStoresUseCase: FetchRefreshStoresUseCase, fetchStoresUseCase: FetchStoresUseCase, - getStoreInformationUseCase: GetStoreInformationUseCase + getStoreInformationUseCase: GetStoreInformationUseCase, + fetchSearchStoresUseCase: FetchSearchStoresUseCase ) } @@ -61,5 +63,7 @@ protocol HomeViewModelOutput { var fetchCountOutput: PublishRelay { get } var noMoreStoresOutput: PublishRelay { get } var dimViewTapGestureEndedOutput: PublishRelay { get } + var searchStoresOutput: PublishRelay<[Store]> { get } + var searchOneStoreOutput: PublishRelay { get } } From c60d0f62ae64688f5d5a058ac9281b62593c8009 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 08:50:47 +0900 Subject: [PATCH 223/231] =?UTF-8?q?chore=20:=20=ED=95=B4=EA=B2=B0=ED=95=9C?= =?UTF-8?q?=20TODO=20=EC=82=AD=EC=A0=9C=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 1 - KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift | 1 - 2 files changed, 2 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 9c75b3eb..80d6b129 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -495,7 +495,6 @@ private extension HomeViewController { func bindSearch() { searchObserver .bind { [weak self] keyword in - // TODO: ViewModel.action() search ์ง„ํ–‰ guard let center = self?.view.center else { return } let centerPosition = Location( longitude: Double(center.x), diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index 902b9ad0..c06e4728 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -259,7 +259,6 @@ private extension HomeViewModelImpl { } func search(location: Location, keyword: String) { - // TODO: SearchUsecase ์‹คํ–‰ ํ›„ output accept fetchSearchStoresUseCase.execute(location: location, keyword: keyword) .subscribe(onNext: { [weak self] stores in guard let self = self else { return } From 91059b629348cc0f52db0b9f5367848a016efab4 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 08:57:09 +0900 Subject: [PATCH 224/231] =?UTF-8?q?feat=20:=20=EB=92=A4=EB=A1=9C=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20navigationController.dismiss?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Search/View/SearchViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KCS/KCS/Presentation/Search/View/SearchViewController.swift b/KCS/KCS/Presentation/Search/View/SearchViewController.swift index 5f8ba7c4..32704fc0 100644 --- a/KCS/KCS/Presentation/Search/View/SearchViewController.swift +++ b/KCS/KCS/Presentation/Search/View/SearchViewController.swift @@ -18,7 +18,7 @@ final class SearchViewController: UIViewController { button.tintColor = .primary3 button.rx.tap .bind { [weak self] _ in - self?.dismiss(animated: false) + self?.navigationController?.dismiss(animated: false) } .disposed(by: disposeBag) From 5f51418de543b226affc787a114fddcbda2329e3 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 12:46:38 +0900 Subject: [PATCH 225/231] =?UTF-8?q?fix=20:=20SearchWordView=20->=20SearchB?= =?UTF-8?q?arView=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95=20(#198)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS.xcodeproj/project.pbxproj | 8 ++++---- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 4 ++-- .../View/{SearchWordView.swift => SearchBarView.swift} | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) rename KCS/KCS/Presentation/Home/View/{SearchWordView.swift => SearchBarView.swift} (92%) diff --git a/KCS/KCS.xcodeproj/project.pbxproj b/KCS/KCS.xcodeproj/project.pbxproj index 448329a5..009f5bdf 100644 --- a/KCS/KCS.xcodeproj/project.pbxproj +++ b/KCS/KCS.xcodeproj/project.pbxproj @@ -18,7 +18,7 @@ 59503A4E2B751B0B0006CF35 /* SearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A4D2B751B0B0006CF35 /* SearchViewController.swift */; }; 59503A522B751FCC0006CF35 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A512B751FCC0006CF35 /* SearchViewModel.swift */; }; 59503A542B751FD50006CF35 /* SearchViewModelImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */; }; - 59503A562B756CCD0006CF35 /* SearchWordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A552B756CCD0006CF35 /* SearchWordView.swift */; }; + 59503A562B756CCD0006CF35 /* SearchBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A552B756CCD0006CF35 /* SearchBarView.swift */; }; 59503A582B758DCE0006CF35 /* SearchDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A572B758DCE0006CF35 /* SearchDTO.swift */; }; 59503A5C2B75927F0006CF35 /* SearchStoreResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A5B2B75927F0006CF35 /* SearchStoreResponse.swift */; }; 59503A5E2B7596990006CF35 /* FetchSearchStoresUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59503A5D2B7596990006CF35 /* FetchSearchStoresUseCase.swift */; }; @@ -155,7 +155,7 @@ 59503A4D2B751B0B0006CF35 /* SearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewController.swift; sourceTree = ""; }; 59503A512B751FCC0006CF35 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; 59503A532B751FD50006CF35 /* SearchViewModelImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModelImpl.swift; sourceTree = ""; }; - 59503A552B756CCD0006CF35 /* SearchWordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchWordView.swift; sourceTree = ""; }; + 59503A552B756CCD0006CF35 /* SearchBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBarView.swift; sourceTree = ""; }; 59503A572B758DCE0006CF35 /* SearchDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchDTO.swift; sourceTree = ""; }; 59503A5B2B75927F0006CF35 /* SearchStoreResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchStoreResponse.swift; sourceTree = ""; }; 59503A5D2B7596990006CF35 /* FetchSearchStoresUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchSearchStoresUseCase.swift; sourceTree = ""; }; @@ -495,7 +495,7 @@ A89087032B4E7F3500767225 /* FilterButton.swift */, 5977BE572B5524D500725C90 /* RefreshButton.swift */, A83367B52B6F993F00E0A844 /* MoreStoreButton.swift */, - 59503A552B756CCD0006CF35 /* SearchWordView.swift */, + 59503A552B756CCD0006CF35 /* SearchBarView.swift */, ); path = View; sourceTree = ""; @@ -1118,7 +1118,7 @@ 59503A602B75970E0006CF35 /* FetchSearchStoresUseCaseImpl.swift in Sources */, 59C306CF2B50399C00862625 /* RequestLocationDTO.swift in Sources */, A83367C32B72714C00E0A844 /* ThirdOnboardingView.swift in Sources */, - 59503A562B756CCD0006CF35 /* SearchWordView.swift in Sources */, + 59503A562B756CCD0006CF35 /* SearchBarView.swift in Sources */, A890870D2B4EF91600767225 /* UIView+SetLayer.swift in Sources */, 59503A522B751FCC0006CF35 /* SearchViewModel.swift in Sources */, A8ACB7D82B57BE7D00540BD1 /* StoreRepositoryError.swift in Sources */, diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 80d6b129..f046336b 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -51,8 +51,8 @@ final class HomeViewController: UIViewController { return stack }() - private lazy var searchView: SearchWordView = { - let view = SearchWordView() + private lazy var searchView: SearchBarView = { + let view = SearchBarView() view.translatesAutoresizingMaskIntoConstraints = false view.rx .tapGesture() diff --git a/KCS/KCS/Presentation/Home/View/SearchWordView.swift b/KCS/KCS/Presentation/Home/View/SearchBarView.swift similarity index 92% rename from KCS/KCS/Presentation/Home/View/SearchWordView.swift rename to KCS/KCS/Presentation/Home/View/SearchBarView.swift index 856a6cca..d6ec6c3c 100644 --- a/KCS/KCS/Presentation/Home/View/SearchWordView.swift +++ b/KCS/KCS/Presentation/Home/View/SearchBarView.swift @@ -1,5 +1,5 @@ // -// SearchWordView.swift +// SearchBarView.swift // KCS // // Created by ์กฐ์„ฑ๋ฏผ on 2/9/24. @@ -7,7 +7,7 @@ import UIKit -final class SearchWordView: UIView { +final class SearchBarView: UIView { private let searchingKeywordLabel: UILabel = { let label = UILabel() @@ -38,7 +38,7 @@ final class SearchWordView: UIView { } -private extension SearchWordView { +private extension SearchBarView { func setup() { backgroundColor = .white From 61ecee41ca36871ca46b867561c3b0f641080135 Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 14:38:03 +0900 Subject: [PATCH 226/231] =?UTF-8?q?fix=20:=20SwiftLint=20=EC=A4=80?= =?UTF-8?q?=EC=88=98=20(#200)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Domain/UseCase/FetchSearchStoresUseCaseImpl.swift | 5 ----- 1 file changed, 5 deletions(-) diff --git a/KCS/KCS/Domain/UseCase/FetchSearchStoresUseCaseImpl.swift b/KCS/KCS/Domain/UseCase/FetchSearchStoresUseCaseImpl.swift index 5bb06d92..0465e0a0 100644 --- a/KCS/KCS/Domain/UseCase/FetchSearchStoresUseCaseImpl.swift +++ b/KCS/KCS/Domain/UseCase/FetchSearchStoresUseCaseImpl.swift @@ -11,13 +11,8 @@ struct FetchSearchStoresUseCaseImpl: FetchSearchStoresUseCase { var repository: StoreRepository - init(repository: StoreRepository) { - self.repository = repository - } - func execute(location: Location, keyword: String) -> Observable<[Store]> { return repository.fetchSearchStores(location: location, keyword: keyword) } - } From c1bdc8a171f1fa8e15a7b62d84ba6b1497f8686b Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 15:02:36 +0900 Subject: [PATCH 227/231] =?UTF-8?q?feat=20:=20Camera=20=EC=84=B8=ED=8C=85?= =?UTF-8?q?=20=EB=B0=8F=20=ED=95=84=ED=84=B0=20=EC=B4=88=EA=B8=B0=ED=99=94?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20(#200)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 27 ++++++++++++++++--- .../Home/ViewModel/HomeViewModelImpl.swift | 6 +++++ .../ViewModel/protocol/HomeViewModel.swift | 1 + 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index f046336b..22dc8e81 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -505,14 +505,18 @@ private extension HomeViewController { .disposed(by: disposeBag) viewModel.searchStoresOutput - .bind { stores in - // TODO: ๋งˆ์ปค ๋ฐ ํ•„ํ„ฐ ์ดˆ๊ธฐํ™”, ์นด๋ฉ”๋ผ ๋ฐ ์คŒ ์ด๋™, ๋งˆ์ปค ์„ค์ • + .bind { [weak self] stores in + self?.setCamera() + self?.resetFilters() + // TODO: ๋งˆ์ปค ์ดˆ๊ธฐํ™”, ๋งˆ์ปค ์„ค์ • } .disposed(by: disposeBag) viewModel.searchOneStoreOutput - .bind { store in - // TODO: ๋งˆ์ปค ๋ฐ ํ•„ํ„ฐ ์ดˆ๊ธฐํ™”, ์นด๋ฉ”๋ผ ๋ฐ ์คŒ ์ด๋™, ๋งˆ์ปค ์„ค์ •, ์š”์•ฝ ์นด๋“œ present + .bind { [weak self] store in + self?.setCamera() + self?.resetFilters() + // TODO: ๋งˆ์ปค ์ดˆ๊ธฐํ™”, ๋งˆ์ปค ์„ค์ •, ์š”์•ฝ ์นด๋“œ present } .disposed(by: disposeBag) } @@ -712,6 +716,21 @@ private extension HomeViewController { } } + func setCamera() { + mapView.mapView.moveCamera(NMFCameraUpdate(heading: 0)) + let cameraUpdate = NMFCameraUpdate( + fit: NMGLatLngBounds(latLngs: markers.map({ $0.position })) + ) + mapView.mapView.moveCamera(cameraUpdate) + } + + func resetFilters() { + safeFilterButton.isSelected = false + exemplaryFilterButton.isSelected = false + goodPriceFilterButton.isSelected = false + viewModel.action(input: .resetFilters) + } + } extension HomeViewController: CLLocationManagerDelegate { diff --git a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift index c06e4728..3f4a6a57 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/HomeViewModelImpl.swift @@ -71,6 +71,8 @@ final class HomeViewModelImpl: HomeViewModel { checkLocationAuthorizationWhenCameraDidChange(status: status) case .search(let location, let keyword): search(location: location, keyword: keyword) + case .resetFilters: + resetFilters() } } @@ -274,4 +276,8 @@ private extension HomeViewModelImpl { .disposed(by: dependency.disposeBag) } + func resetFilters() { + dependency.activatedFilter = [] + } + } diff --git a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift index b9a4e893..f3421517 100644 --- a/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift +++ b/KCS/KCS/Presentation/Home/ViewModel/protocol/HomeViewModel.swift @@ -39,6 +39,7 @@ enum HomeViewModelInputCase { case checkLocationAuthorization(status: CLAuthorizationStatus) case checkLocationAuthorizationWhenCameraDidChange(status: CLAuthorizationStatus) case search(location: Location, keyword: String) + case resetFilters } From d9c9711efcb8bef4db072144b443addce7081f8e Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 15:22:37 +0900 Subject: [PATCH 228/231] =?UTF-8?q?feat=20:=20=EA=B2=80=EC=83=89=ED=9B=84?= =?UTF-8?q?=20=EB=A7=88=EC=BB=A4=20=ED=91=9C=EC=8B=9C=20(#200)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 22dc8e81..46ecd608 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -506,17 +506,18 @@ private extension HomeViewController { viewModel.searchStoresOutput .bind { [weak self] stores in - self?.setCamera() self?.resetFilters() - // TODO: ๋งˆ์ปค ์ดˆ๊ธฐํ™”, ๋งˆ์ปค ์„ค์ • + self?.setSearchStoresMarker(stores: stores) + self?.setCamera() } .disposed(by: disposeBag) viewModel.searchOneStoreOutput .bind { [weak self] store in - self?.setCamera() self?.resetFilters() - // TODO: ๋งˆ์ปค ์ดˆ๊ธฐํ™”, ๋งˆ์ปค ์„ค์ •, ์š”์•ฝ ์นด๋“œ present + self?.setSearchStoresMarker(stores: [store]) + self?.setCamera() + // TODO: ์š”์•ฝ ์นด๋“œ present } .disposed(by: disposeBag) } @@ -719,8 +720,11 @@ private extension HomeViewController { func setCamera() { mapView.mapView.moveCamera(NMFCameraUpdate(heading: 0)) let cameraUpdate = NMFCameraUpdate( - fit: NMGLatLngBounds(latLngs: markers.map({ $0.position })) + fit: NMGLatLngBounds(latLngs: markers.map({ $0.position })), + padding: 30 ) + cameraUpdate.animation = .easeIn + cameraUpdate.animationDuration = 0.5 mapView.mapView.moveCamera(cameraUpdate) } @@ -731,6 +735,23 @@ private extension HomeViewController { viewModel.action(input: .resetFilters) } + func setSearchStoresMarker(stores: [Store]) { + markers.forEach({ $0.mapView = nil }) + markers = [] + stores.forEach { [weak self] store in + guard let certificationType = store.certificationTypes.last else { return } + self?.viewModel.action(input: .setMarker( + store: store, + certificationType: certificationType + )) + } + storeInformationViewDismiss() + storeListViewController.updateList(stores: stores) + if stores.isEmpty { + showToast(message: "๊ฐ€๊ฒŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.") + } + } + } extension HomeViewController: CLLocationManagerDelegate { From c9c84773d41fed9a4bbc55f6c8e048733c00370d Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 15:55:35 +0900 Subject: [PATCH 229/231] =?UTF-8?q?feat=20:=20=EB=A7=88=EC=BB=A4=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C=20=EB=B0=8F=20=EC=9A=94=EC=95=BD=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20present=20=EA=B5=AC=ED=98=84=20(#200)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/HomeViewController.swift | 55 ++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 46ecd608..0df52104 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -506,18 +506,46 @@ private extension HomeViewController { viewModel.searchStoresOutput .bind { [weak self] stores in - self?.resetFilters() - self?.setSearchStoresMarker(stores: stores) - self?.setCamera() + guard let self = self else { return } + resetFilters() + storeInformationViewDismiss() + setSearchStoresMarker(stores: stores) + + mapView.mapView.moveCamera(NMFCameraUpdate(heading: 0)) + let cameraUpdate = NMFCameraUpdate( + fit: NMGLatLngBounds(latLngs: markers.map({ $0.position })), + padding: 30 + ) + cameraUpdate.animation = .easeIn + cameraUpdate.animationDuration = 0.5 + mapView.mapView.moveCamera(cameraUpdate) } .disposed(by: disposeBag) viewModel.searchOneStoreOutput .bind { [weak self] store in - self?.resetFilters() - self?.setSearchStoresMarker(stores: [store]) - self?.setCamera() - // TODO: ์š”์•ฝ ์นด๋“œ present + guard let self = self else { return } + resetFilters() + setSearchStoresMarker(stores: [store]) + + mapView.mapView.moveCamera(NMFCameraUpdate(heading: 0)) + + let cameraUpdate = NMFCameraUpdate( + position: NMFCameraPosition(store.location.toMapLocation(), zoom: 15) + ) + cameraUpdate.animation = .easeIn + cameraUpdate.animationDuration = 0.5 + mapView.mapView.moveCamera(cameraUpdate) + + guard let marker = markers.first(where: { $0.tag == store.id}) else { return } + if let clickedMarker = clickedMarker { + if clickedMarker == marker { return } + clickedMarker.deselect() + storeInformationViewDismiss(changeMarker: true) + } + storeInformationViewController.setUIContents(store: store) + marker.select() + clickedMarker = marker } .disposed(by: disposeBag) } @@ -531,7 +559,6 @@ private extension HomeViewController { if let clickedMarker = self?.clickedMarker { if clickedMarker == marker { return true } - clickedMarker.deselect() self?.storeInformationViewDismiss(changeMarker: true) } @@ -717,17 +744,6 @@ private extension HomeViewController { } } - func setCamera() { - mapView.mapView.moveCamera(NMFCameraUpdate(heading: 0)) - let cameraUpdate = NMFCameraUpdate( - fit: NMGLatLngBounds(latLngs: markers.map({ $0.position })), - padding: 30 - ) - cameraUpdate.animation = .easeIn - cameraUpdate.animationDuration = 0.5 - mapView.mapView.moveCamera(cameraUpdate) - } - func resetFilters() { safeFilterButton.isSelected = false exemplaryFilterButton.isSelected = false @@ -745,7 +761,6 @@ private extension HomeViewController { certificationType: certificationType )) } - storeInformationViewDismiss() storeListViewController.updateList(stores: stores) if stores.isEmpty { showToast(message: "๊ฐ€๊ฒŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.") From ccec05f22bcfe9e6d5b78fed9172a51b264c1ead Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 16:00:37 +0900 Subject: [PATCH 230/231] =?UTF-8?q?fix=20:=20camera=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=ED=9B=84=20position=20mode=20=EB=B3=80=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=98=84=EC=83=81=20=EC=A0=9C=EA=B1=B0=20(#200)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 0df52104..373cdb19 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -519,6 +519,7 @@ private extension HomeViewController { cameraUpdate.animation = .easeIn cameraUpdate.animationDuration = 0.5 mapView.mapView.moveCamera(cameraUpdate) + mapView.mapView.positionMode = .normal } .disposed(by: disposeBag) @@ -536,6 +537,7 @@ private extension HomeViewController { cameraUpdate.animation = .easeIn cameraUpdate.animationDuration = 0.5 mapView.mapView.moveCamera(cameraUpdate) + mapView.mapView.positionMode = .normal guard let marker = markers.first(where: { $0.tag == store.id}) else { return } if let clickedMarker = clickedMarker { From d349679f07264d1921f7d7067bea0aadb298d65b Mon Sep 17 00:00:00 2001 From: SungMinCho-Kor Date: Fri, 9 Feb 2024 16:25:12 +0900 Subject: [PATCH 231/231] =?UTF-8?q?fix=20:=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0=20(#200)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KCS/KCS/Presentation/Home/View/HomeViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/KCS/KCS/Presentation/Home/View/HomeViewController.swift b/KCS/KCS/Presentation/Home/View/HomeViewController.swift index 373cdb19..e7211567 100644 --- a/KCS/KCS/Presentation/Home/View/HomeViewController.swift +++ b/KCS/KCS/Presentation/Home/View/HomeViewController.swift @@ -542,7 +542,6 @@ private extension HomeViewController { guard let marker = markers.first(where: { $0.tag == store.id}) else { return } if let clickedMarker = clickedMarker { if clickedMarker == marker { return } - clickedMarker.deselect() storeInformationViewDismiss(changeMarker: true) } storeInformationViewController.setUIContents(store: store)