From 0185030e4311f35b91406e63b4eb1845aa29afe1 Mon Sep 17 00:00:00 2001 From: dami Date: Fri, 15 Dec 2023 19:27:03 +0900 Subject: [PATCH 01/24] =?UTF-8?q?feat:=20=EB=AA=A9=EC=A0=81=EC=A7=80=20?= =?UTF-8?q?=EC=A7=80=EC=A0=95=20alert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 4 ++ TWTW/TWTW/Map/DefaultMainMapCoordinator.swift | 1 - .../MainMapViewController.swift | 49 ++++++++--------- .../View/SearchPlaceBottomSheet.swift | 54 +++++++++++-------- .../SearchPlaceBottomSheetViewModel.swift | 38 +++++++++++++ 5 files changed, 97 insertions(+), 49 deletions(-) create mode 100644 TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index b1e0e9aa..b3c5d959 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -73,6 +73,7 @@ 37C35EDF2B1CC6FE008A289D /* MakeNewFriendsListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C35EDE2B1CC6FE008A289D /* MakeNewFriendsListViewModel.swift */; }; 37C35EE32B1CC876008A289D /* MakeNewFriendsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C35EE22B1CC876008A289D /* MakeNewFriendsListCoordinator.swift */; }; 37C35EE52B1CC8A6008A289D /* DefaultMakeNewFriendsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C35EE42B1CC8A6008A289D /* DefaultMakeNewFriendsListCoordinator.swift */; }; + 37C733752B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C733742B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift */; }; 37CCCC392B1C8FB3003710DB /* MakeNewFriendsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CCCC382B1C8FB3003710DB /* MakeNewFriendsListViewController.swift */; }; 37CE1EAF2AE75813009CDA21 /* SearchPlace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CE1EAE2AE75813009CDA21 /* SearchPlace.swift */; }; 37D3AFE32B0F3E67006FB449 /* MockSearchPlacesMapCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D3AFE22B0F3E67006FB449 /* MockSearchPlacesMapCoordinator.swift */; }; @@ -231,6 +232,7 @@ 37C35EDE2B1CC6FE008A289D /* MakeNewFriendsListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewFriendsListViewModel.swift; sourceTree = ""; }; 37C35EE22B1CC876008A289D /* MakeNewFriendsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewFriendsListCoordinator.swift; sourceTree = ""; }; 37C35EE42B1CC8A6008A289D /* DefaultMakeNewFriendsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultMakeNewFriendsListCoordinator.swift; sourceTree = ""; }; + 37C733742B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlaceBottomSheetViewModel.swift; sourceTree = ""; }; 37CCCC382B1C8FB3003710DB /* MakeNewFriendsListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewFriendsListViewController.swift; sourceTree = ""; }; 37CE1EAE2AE75813009CDA21 /* SearchPlace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlace.swift; sourceTree = ""; }; 37D3AFE22B0F3E67006FB449 /* MockSearchPlacesMapCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSearchPlacesMapCoordinator.swift; sourceTree = ""; }; @@ -1191,6 +1193,7 @@ 3737AE892AE93EE600FE7453 /* SearchPlacesMapViewController.swift */, 3737AE882AE93EE600FE7453 /* SearchPlacesTableViewCell.swift */, 3772041B2B27045E00FE20A9 /* SearchPlaceBottomSheet.swift */, + 37C733742B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift */, ); path = View; sourceTree = ""; @@ -1566,6 +1569,7 @@ 3B1C36EC2A8FD0BE00838682 /* Map.swift in Sources */, 3772041C2B27045E00FE20A9 /* SearchPlaceBottomSheet.swift in Sources */, 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */, + 37C733752B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift in Sources */, 37D5D78F2B19EAEB00302EAD /* PlanTableViewCell.swift in Sources */, 3788AEBE2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift in Sources */, 3B274D792AD4584600D79698 /* SignInCoordinatorProtocol.swift in Sources */, diff --git a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift index 8ce9284c..8f91deab 100644 --- a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift +++ b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift @@ -68,4 +68,3 @@ extension DefaultMainMapCoordinator: SearchPlacesMapCoordDelegate { } } } - diff --git a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift index bab69efd..4d5b2c39 100644 --- a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift +++ b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift @@ -16,7 +16,6 @@ import UIKit /// MainMapViewController - 지도화면 final class MainMapViewController: KakaoMapViewController { private var currentViewType: ViewState = .mainMap - private var searchPlaceBottomSheet: SearchPlaceBottomSheet? // MARK: - UI Property @@ -64,13 +63,17 @@ final class MainMapViewController: KakaoMapViewController { private let viewModel: MainMapViewModel private var output: MainMapViewModel.Output? private let mainMapCustomTabButtonsView: MainMapCustomTabButtonsView - + private var searchPlaceBottomSheet: SearchPlaceBottomSheet + // MARK: - init init(viewModel: MainMapViewModel, coordinator: DefaultMainMapCoordinator) { self.viewModel = viewModel let tabViewModel = MainMapCustomTabButtonViewModel(coordinator: coordinator) + let bottomSheetViewwModel = SearchPlaceBottomSheetViewModel(coordinator: coordinator) + self.mainMapCustomTabButtonsView = MainMapCustomTabButtonsView(frame: .zero, viewModel: tabViewModel) + self.searchPlaceBottomSheet = SearchPlaceBottomSheet(frame: .zero, viewModel: bottomSheetViewwModel) super.init() } @@ -107,7 +110,7 @@ final class MainMapViewController: KakaoMapViewController { private func setupUI() { addSubViewsSearchBar() addSubViewsMyloctaionImageView() - configureConstraintsMainMapCusomTabButtonView() + addSubViewsMainMapCusomTabButtonView() view.backgroundColor = .white configureUIComponentsFor(currentViewType) } @@ -123,7 +126,7 @@ final class MainMapViewController: KakaoMapViewController { } private func addSubViewsMainMapCusomTabButtonView() { view.addSubview(mainMapCustomTabButtonsView) - configureConstraintsMainMapCusomTabButtonView() + configureConstraintCustomTabButtonView() } /// Add UI - MyloctaionImageView @@ -131,9 +134,10 @@ final class MainMapViewController: KakaoMapViewController { view.addSubview(myloctaionImageView) configureConstraintsMyloctaionImageView() } - private func configureConstraintsMainMapCusomTabButtonView() { - view.addSubview(mainMapCustomTabButtonsView) - configureConstraintCsusomTabButtonView() + + private func configureConstraintsBottomSheet() { + view.addSubview(searchPlaceBottomSheet) + configureConstraintBottomSheet() } // MARK: - Constraints @@ -141,7 +145,7 @@ final class MainMapViewController: KakaoMapViewController { private func configureConstraintsSearchBar() { navigationItem.titleView = searchBar } - private func configureConstraintCsusomTabButtonView() { + private func configureConstraintCustomTabButtonView() { mainMapCustomTabButtonsView.snp.makeConstraints { make in make.centerX.equalToSuperview() make.width.equalToSuperview().multipliedBy(0.35) @@ -149,6 +153,12 @@ final class MainMapViewController: KakaoMapViewController { make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom).inset(3) } } + private func configureConstraintBottomSheet() { + searchPlaceBottomSheet.snp.makeConstraints { make in + make.leading.trailing.bottom.equalToSuperview() + make.height.equalToSuperview().multipliedBy(0.3) + } + } /// Configure Constraints UI - MyloctaionImageView private func configureConstraintsMyloctaionImageView() { @@ -181,28 +191,18 @@ final class MainMapViewController: KakaoMapViewController { currentViewType = newViewState switch currentViewType { case .mainMap: - searchPlaceBottomSheet?.removeFromSuperview() + searchPlaceBottomSheet.removeFromSuperview() case .searchMap: addSearchPlaceBottomSheet(placeName: placeName, roadAddressName: roadAddressName) } configureUIComponentsFor(currentViewType) } - - private func addSearchPlaceBottomSheet(placeName: String, roadAddressName: String) { - searchPlaceBottomSheet?.removeFromSuperview() - searchPlaceBottomSheet = nil - - let bottomSheet = SearchPlaceBottomSheet() - bottomSheet.setupPlace(name: placeName, address: roadAddressName) - self.view.addSubview(bottomSheet) - bottomSheet.snp.makeConstraints { make in - make.leading.trailing.bottom.equalToSuperview() - make.height.equalToSuperview().multipliedBy(0.3) - } - searchPlaceBottomSheet = bottomSheet + searchPlaceBottomSheet.removeFromSuperview() + configureConstraintsBottomSheet() + searchPlaceBottomSheet.setupPlace(name: placeName, address: roadAddressName) } private func configureUIComponentsFor(_ viewType: ViewState) { @@ -214,8 +214,7 @@ final class MainMapViewController: KakaoMapViewController { self.searchBar.isHidden = false self.myloctaionImageView.isHidden = false self.mainMapCustomTabButtonsView.isHidden = false - self.searchPlaceBottomSheet?.removeFromSuperview() - self.searchPlaceBottomSheet = nil + self.searchPlaceBottomSheet.removeFromSuperview() case .searchMap: self.myloctaionImageView.removeFromSuperview() @@ -225,8 +224,6 @@ final class MainMapViewController: KakaoMapViewController { } } - - /// 내 위치 binding private func bindMyLocation(output: MainMapViewModel.Output) { output.myLocatiaonRelay diff --git a/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheet.swift b/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheet.swift index 621918d2..4c34fb60 100644 --- a/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheet.swift +++ b/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheet.swift @@ -5,20 +5,26 @@ // Created by 박다미 on 2023/12/11. // -import UIKit import RxCocoa import RxSwift import SnapKit +import UIKit final class SearchPlaceBottomSheet: UIView { private let titleLabel = UILabel() private let descriptionLabel = UILabel() private let actionButton = UIButton() private let disposeBag = DisposeBag() + private var viewModel: SearchPlaceBottomSheetViewModel? + private let participantsButtonTappedSubject = PublishSubject() + - override init(frame: CGRect) { + // MARK: - Init + init(frame: CGRect, viewModel: SearchPlaceBottomSheetViewModel) { + self.viewModel = viewModel super.init(frame: frame) - setupUI() + addSubViews() + bindViewModel() setupBindings() } @@ -27,7 +33,7 @@ final class SearchPlaceBottomSheet: UIView { fatalError("init(coder:) has not been implemented") } - private func setupUI() { + private func addSubViews() { backgroundColor = .white titleLabel.text = "목적지명" @@ -57,6 +63,13 @@ final class SearchPlaceBottomSheet: UIView { make.height.equalTo(40) } } + private func bindViewModel() { + guard let viewModel = viewModel else { return } + let input = SearchPlaceBottomSheetViewModel.Input( + participantsButtonTapped: participantsButtonTappedSubject.asObservable() + ) + viewModel.bind(input: input) + } private func setupBindings() { actionButton.rx.tap @@ -66,27 +79,18 @@ final class SearchPlaceBottomSheet: UIView { } .disposed(by: disposeBag) } - func setupPlace(name: String, address: String) { - titleLabel.text = name - descriptionLabel.text = address - } - private func showAlert() { - let alert = UIAlertController(title: "목적지 변경", message: "목적지를 변경할 약속을 선택해주세요", preferredStyle: .alert) - let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) - let selectAppointmentAction = UIAlertAction(title: "약속 선택하기", style: .default) { [weak self] _ in - // 약속 선택 로직 구현 - self?.actionButton.setTitle("목적지 변경", for: .normal) - } - - alert.addAction(cancelAction) - alert.addAction(selectAppointmentAction) + private func showAlert() { + let alert = UIAlertController(title: "목적지 변경", message: "목적지를 변경할 약속을 선택해주세요", preferredStyle: .alert) + let selectAppointmentAction = UIAlertAction(title: "약속 선택하기", style: .default) { [weak self] _ in + self?.participantsButtonTappedSubject.onNext(()) + } + alert.addAction(selectAppointmentAction) + alert.addAction(UIAlertAction(title: "취소", style: .cancel)) - if let viewController = self.findViewController() { - viewController.present(alert, animated: true, completion: nil) + findViewController()?.present(alert, animated: true, completion: nil) } - } - + private func findViewController() -> UIViewController? { var nextResponder: UIResponder? = self while nextResponder != nil { @@ -97,4 +101,10 @@ final class SearchPlaceBottomSheet: UIView { } return nil } + + func setupPlace(name: String, address: String) { + titleLabel.text = name + descriptionLabel.text = address + } + } diff --git a/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift b/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift new file mode 100644 index 00000000..ed780d92 --- /dev/null +++ b/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift @@ -0,0 +1,38 @@ +// +// SearchPlaceBottomSheetViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/15. +// + +import Foundation +import RxSwift + +final class SearchPlaceBottomSheetViewModel { + private let disposeBag = DisposeBag() + weak var coordinator: DefaultMainMapCoordinator? + + /// Input + struct Input { + let participantsButtonTapped: Observable + } + + // MARK: - Init + init(coordinator: DefaultMainMapCoordinator) { + self.coordinator = coordinator + } + + // 바인딩 함수 + func bind(input: Input) { + input.participantsButtonTapped + .subscribe(onNext: { [weak self] in + self?.participantsButtonTapped() + }) + .disposed(by: disposeBag) + } + + private func participantsButtonTapped() { + // 친구 목록 화면으로 이동 + coordinator?.moveToParticipantsList() + } +} From 7fb95f560864de7a88f44c493617f6de3e4f9053 Mon Sep 17 00:00:00 2001 From: dami Date: Sat, 16 Dec 2023 18:59:38 +0900 Subject: [PATCH 02/24] =?UTF-8?q?feat:=20tableViewVC=20ViewModel=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 52 +++++++++++++++++++ .../DefaultChangeLocationCoordinator.swift | 4 +- .../View/ChangeLocationViewController.swift | 1 - TWTW/TWTW/Map/DefaultMainMapCoordinator.swift | 8 ++- .../DefaultsParticipantsCoordinator.swift | 23 ++++++-- .../DefaultPartiGetLocationCoordinator.swift | 27 ++++++++++ .../PartiGetLocationCoordinator.swift | 10 ++++ .../PartiGetLocationViewController.swift | 31 +++++++++++ .../PartiGetLocationViewModel.swift | 24 +++++++++ .../Model/ParticipantsSource.swift | 13 +++++ .../DefaultPartiSetLocationCoordinator.swift | 26 ++++++++++ .../PartiSetLocationCoordinator.swift | 10 ++++ .../PartiSetLocationViewController.swift | 32 ++++++++++++ .../PartiSetLocationViewModel.swift | 23 ++++++++ .../View/ParticipantsViewController.swift | 23 ++++---- .../ViewModel/ParticipantsViewModel.swift | 22 ++------ .../SearchPlaceBottomSheetViewModel.swift | 3 +- 17 files changed, 295 insertions(+), 37 deletions(-) create mode 100644 TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift create mode 100644 TWTW/TWTW/Participants/GetParicipants/PartiGetLocationCoordinator.swift create mode 100644 TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewController.swift create mode 100644 TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift create mode 100644 TWTW/TWTW/Participants/Model/ParticipantsSource.swift create mode 100644 TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift create mode 100644 TWTW/TWTW/Participants/SetParicipants/PartiSetLocationCoordinator.swift create mode 100644 TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewController.swift create mode 100644 TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index b3c5d959..add4febb 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -85,6 +85,15 @@ 37E0D8AD2B180804002E0CF5 /* ParticipantsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8AC2B180804002E0CF5 /* ParticipantsViewController.swift */; }; 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */; }; 37E0D8B42B180A68002E0CF5 /* DefaultsParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8B32B180A68002E0CF5 /* DefaultsParticipantsCoordinator.swift */; }; + 37E1B8312B2D94690047C7C7 /* ParticipantsSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8302B2D94690047C7C7 /* ParticipantsSource.swift */; }; + 37E1B8332B2D94950047C7C7 /* PartiGetLocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8322B2D94950047C7C7 /* PartiGetLocationViewModel.swift */; }; + 37E1B8352B2D94A20047C7C7 /* PartiSetLocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8342B2D94A20047C7C7 /* PartiSetLocationViewModel.swift */; }; + 37E1B8372B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */; }; + 37E1B8392B2D96880047C7C7 /* PartiSetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8382B2D96880047C7C7 /* PartiSetLocationCoordinator.swift */; }; + 37E1B83B2B2D970F0047C7C7 /* PartiGetLocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */; }; + 37E1B83D2B2D97170047C7C7 /* PartiSetLocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83C2B2D97170047C7C7 /* PartiSetLocationViewController.swift */; }; + 37E1B83F2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */; }; + 37E1B8412B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8402B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift */; }; 37E9FBFB2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E9FBFA2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift */; }; 37E9FBFE2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E9FBFD2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift */; }; 37EF0CFB2AB85C2400D77B0A /* UIViewController+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37EF0CFA2AB85C2400D77B0A /* UIViewController+Ext.swift */; }; @@ -244,6 +253,15 @@ 37E0D8AC2B180804002E0CF5 /* ParticipantsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsViewController.swift; sourceTree = ""; }; 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsCoordinator.swift; sourceTree = ""; }; 37E0D8B32B180A68002E0CF5 /* DefaultsParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsParticipantsCoordinator.swift; sourceTree = ""; }; + 37E1B8302B2D94690047C7C7 /* ParticipantsSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsSource.swift; sourceTree = ""; }; + 37E1B8322B2D94950047C7C7 /* PartiGetLocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationViewModel.swift; sourceTree = ""; }; + 37E1B8342B2D94A20047C7C7 /* PartiSetLocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiSetLocationViewModel.swift; sourceTree = ""; }; + 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationCoordinator.swift; sourceTree = ""; }; + 37E1B8382B2D96880047C7C7 /* PartiSetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiSetLocationCoordinator.swift; sourceTree = ""; }; + 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationViewController.swift; sourceTree = ""; }; + 37E1B83C2B2D97170047C7C7 /* PartiSetLocationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiSetLocationViewController.swift; sourceTree = ""; }; + 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPartiGetLocationCoordinator.swift; sourceTree = ""; }; + 37E1B8402B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPartiSetLocationCoordinator.swift; sourceTree = ""; }; 37E9FBFA2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCustomTabButtonsView.swift; sourceTree = ""; }; 37E9FBFD2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCustomTabButtonViewModel.swift; sourceTree = ""; }; 37EF0CFA2AB85C2400D77B0A /* UIViewController+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Ext.swift"; sourceTree = ""; }; @@ -815,6 +833,7 @@ isa = PBXGroup; children = ( 37D5D7862B19CEA100302EAD /* Participants.swift */, + 37E1B8302B2D94690047C7C7 /* ParticipantsSource.swift */, ); path = Model; sourceTree = ""; @@ -834,6 +853,8 @@ 37E0D8AB2B1807E0002E0CF5 /* Participants */ = { isa = PBXGroup; children = ( + 37E1B82F2B2D944B0047C7C7 /* GetParicipants */, + 37E1B82E2B2D94380047C7C7 /* SetParicipants */, 37BB02F72B230E93006B2BEB /* ViewModel */, 37E0D8B32B180A68002E0CF5 /* DefaultsParticipantsCoordinator.swift */, 37E0D8B52B180A8D002E0CF5 /* Protocol */, @@ -860,6 +881,28 @@ path = Protocol; sourceTree = ""; }; + 37E1B82E2B2D94380047C7C7 /* SetParicipants */ = { + isa = PBXGroup; + children = ( + 37E1B8342B2D94A20047C7C7 /* PartiSetLocationViewModel.swift */, + 37E1B8382B2D96880047C7C7 /* PartiSetLocationCoordinator.swift */, + 37E1B83C2B2D97170047C7C7 /* PartiSetLocationViewController.swift */, + 37E1B8402B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift */, + ); + path = SetParicipants; + sourceTree = ""; + }; + 37E1B82F2B2D944B0047C7C7 /* GetParicipants */ = { + isa = PBXGroup; + children = ( + 37E1B8322B2D94950047C7C7 /* PartiGetLocationViewModel.swift */, + 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */, + 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */, + 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */, + ); + path = GetParicipants; + sourceTree = ""; + }; 37E9FBFC2B16358A004AFF79 /* CustomTabButton */ = { isa = PBXGroup; children = ( @@ -1524,10 +1567,12 @@ 3B274D712AD3F77600D79698 /* DefaultSignInCoordinator.swift in Sources */, 3799E5072A99D70500E06218 /* FriendsListViewController.swift in Sources */, 3B274D762AD4541E00D79698 /* SignInCoordinatorFinishDelegate.swift in Sources */, + 37E1B8352B2D94A20047C7C7 /* PartiSetLocationViewModel.swift in Sources */, 3B4A660C2B161D8200DF9C84 /* CreateGroupViewModel.swift in Sources */, 375E8B022A95FCB000F8DE42 /* NearbyPlacesCollectionViewCell.swift in Sources */, 3799E5092A99D72D00E06218 /* NotificationViewController.swift in Sources */, 377CB0612AD8699C003453D6 /* MainMapCoordinator.swift in Sources */, + 37E1B83B2B2D970F0047C7C7 /* PartiGetLocationViewController.swift in Sources */, 372109FC2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift in Sources */, 37D5D78A2B19CF2800302EAD /* ParticipantsTableViewCell.swift in Sources */, 37D5D7912B19ECF300302EAD /* Plan.swift in Sources */, @@ -1560,6 +1605,7 @@ 3B20E1E12AE41E4D009572AA /* CallCoordinator.swift in Sources */, 37C35EE52B1CC8A6008A289D /* DefaultMakeNewFriendsListCoordinator.swift in Sources */, 3BC8D6A42B0F0F3700BE22EF /* RouteProtocol.swift in Sources */, + 37E1B83D2B2D97170047C7C7 /* PartiSetLocationViewController.swift in Sources */, 377CB0592AD8665E003453D6 /* GroupViewModel.swift in Sources */, 3B274D7B2AD4CFDA00D79698 /* SignUpCoordinatorFinishDelegate.swift in Sources */, 3760CC8C2AE2C0E800CFC2D5 /* SurroundSearchService.swift in Sources */, @@ -1571,6 +1617,7 @@ 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */, 37C733752B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift in Sources */, 37D5D78F2B19EAEB00302EAD /* PlanTableViewCell.swift in Sources */, + 37E1B83F2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift in Sources */, 3788AEBE2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift in Sources */, 3B274D792AD4584600D79698 /* SignInCoordinatorProtocol.swift in Sources */, 3B4A66062B16147600DF9C84 /* GroupProtocol.swift in Sources */, @@ -1585,6 +1632,7 @@ 3B9693DE2B176DED001DDAE8 /* FriendListTableViewCell.swift in Sources */, 37E9FBFE2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift in Sources */, 3B20E1E62AE41E97009572AA /* FriendsListCoordinatorProtocol.swift in Sources */, + 37E1B8392B2D96880047C7C7 /* PartiSetLocationCoordinator.swift in Sources */, 37F903A82AF9BD88008120B6 /* Header.swift in Sources */, 3760CC8F2AE2CB7800CFC2D5 /* SurroundSearchPlaces.swift in Sources */, 37CCCC392B1C8FB3003710DB /* MakeNewFriendsListViewController.swift in Sources */, @@ -1598,9 +1646,11 @@ 37C35EE32B1CC876008A289D /* MakeNewFriendsListCoordinator.swift in Sources */, 3758F1B72A7DFB6200E2933C /* Bundle+Ext.swift in Sources */, 37BB02F92B230EA8006B2BEB /* ParticipantsViewModel.swift in Sources */, + 37E1B8332B2D94950047C7C7 /* PartiGetLocationViewModel.swift in Sources */, 3BB85C092B19D39200F8BBF3 /* FriendSearchCoordinatorProtocol.swift in Sources */, 3758F18C2A7D007200E2933C /* AppDelegate.swift in Sources */, 3788AEB82B18DCF4007FC2F6 /* PlanCoordinator.swift in Sources */, + 37E1B8312B2D94690047C7C7 /* ParticipantsSource.swift in Sources */, 37EF0CFB2AB85C2400D77B0A /* UIViewController+Ext.swift in Sources */, 37E0D8AD2B180804002E0CF5 /* ParticipantsViewController.swift in Sources */, 3B6BA9892A7F7D0900A11FE4 /* SignInViewModel.swift in Sources */, @@ -1635,7 +1685,9 @@ 3758F18E2A7D007200E2933C /* SceneDelegate.swift in Sources */, 3BB85C052B19D33400F8BBF3 /* FriendSearchViewController.swift in Sources */, 3B274D802AD4D2E200D79698 /* SignUpCoordinatorProtocol.swift in Sources */, + 37E1B8372B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift in Sources */, 37C198C32B2760C000D68196 /* MapViewModelProtocol.swift in Sources */, + 37E1B8412B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift in Sources */, 371C1D2F2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift in Sources */, 37CE1EAF2AE75813009CDA21 /* SearchPlace.swift in Sources */, 3737AE8E2AE93EE600FE7453 /* SearchPlacesTableViewCell.swift in Sources */, diff --git a/TWTW/TWTW/ChangeLocation/DefaultChangeLocationCoordinator.swift b/TWTW/TWTW/ChangeLocation/DefaultChangeLocationCoordinator.swift index ede11f25..6248f3b7 100644 --- a/TWTW/TWTW/ChangeLocation/DefaultChangeLocationCoordinator.swift +++ b/TWTW/TWTW/ChangeLocation/DefaultChangeLocationCoordinator.swift @@ -20,8 +20,6 @@ final class DefaultChangeLocationCoordinator: ChangeLocationCoordinator { } func start() { - let changeLocationVC = ChangeLocationViewController() - let modalNavigationController = UINavigationController(rootViewController: changeLocationVC) - navigationController.present(modalNavigationController, animated: true, completion: nil) + } } diff --git a/TWTW/TWTW/ChangeLocation/View/ChangeLocationViewController.swift b/TWTW/TWTW/ChangeLocation/View/ChangeLocationViewController.swift index 9840726c..d2f7338b 100644 --- a/TWTW/TWTW/ChangeLocation/View/ChangeLocationViewController.swift +++ b/TWTW/TWTW/ChangeLocation/View/ChangeLocationViewController.swift @@ -5,7 +5,6 @@ // Created by 박다미 on 2023/12/01. // -import Foundation import UIKit final class ChangeLocationViewController: UIViewController { diff --git a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift index 8f91deab..53868e5b 100644 --- a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift +++ b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift @@ -46,14 +46,20 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { func moveToParticipantsList() { let participantsCoordinator = DefaultsParticipantsCoordinator(navigationController: navigationController) participantsCoordinator.start() - childCoordinators.append(participantsCoordinator) } + + func moveToParticipantsSetList(from source: ParticipantsSource) { + let participantsCoordinator = DefaultsParticipantsCoordinator(navigationController: navigationController) + participantsCoordinator.startWithViewModel(from: source) + } + /// 알림 화면으로 이동 func moveToPlans() { let plansCoordinator = DefaultPlansCoordinator(navigationController: navigationController) plansCoordinator.start() childCoordinators.append(plansCoordinator) } + } // MARK: - SearchPlacesCoordinator에서 좌표 받는 함수 diff --git a/TWTW/TWTW/Participants/DefaultsParticipantsCoordinator.swift b/TWTW/TWTW/Participants/DefaultsParticipantsCoordinator.swift index ad9b4782..c8e6a84d 100644 --- a/TWTW/TWTW/Participants/DefaultsParticipantsCoordinator.swift +++ b/TWTW/TWTW/Participants/DefaultsParticipantsCoordinator.swift @@ -18,11 +18,28 @@ final class DefaultsParticipantsCoordinator: ParticipantsCoordinator { } func start() { - let participantsViewModel = ParticipantsViewModel(coordinator: self) - let participantsVC = ParticipantsViewController(viewModel: participantsViewModel) - navigationController.pushViewController(participantsVC, animated: false) + let participantsViewModel = PartiGetLocationViewModel(coordinator: self) + let participantsViewController = ParticipantsViewController(viewModel: participantsViewModel) + + navigationController.pushViewController(participantsViewController, animated: true) } + func startWithViewModel(from source: ParticipantsSource) { + let viewModel: PartiLocationViewModel + + switch source { + case .get: + viewModel = PartiGetLocationViewModel(coordinator: self) + + case .set: + viewModel = PartiSetLocationViewModel(coordinator: self) + + } + + let participantsViewController = ParticipantsViewController(viewModel: viewModel) + navigationController.pushViewController(participantsViewController, animated: true) + } + /// 선택한 사람 장소 바꾸기 func moveToChangeLocation() { let changeLocationCoordinator = DefaultChangeLocationCoordinator(navigationController: navigationController) diff --git a/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift b/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift new file mode 100644 index 00000000..80c7ad62 --- /dev/null +++ b/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift @@ -0,0 +1,27 @@ +// +// DefaultPartiGetLocationCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import Foundation +import UIKit + +final class DefaultPartiGetLocationCoordinator: PartiGetLocationCoordinator { + var childCoordinators: [Coordinator] = [] + var navigationController: UINavigationController + + // MARK: - Init + init(navigationController: UINavigationController) { + self.navigationController = navigationController + } + + func start() { + print("get") +// let partiGetLocationViewModel = PartiGetLocationViewModel(coordinator: self) +// let partiGetLocationVC = PartiGetLocationViewController(viewModel: partiGetLocationViewModel) +// navigationController.pushViewController(partiGetLocationVC, animated: false) + + } +} diff --git a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationCoordinator.swift b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationCoordinator.swift new file mode 100644 index 00000000..ef77442a --- /dev/null +++ b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationCoordinator.swift @@ -0,0 +1,10 @@ +// +// PartiGetLocationCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import Foundation + +protocol PartiGetLocationCoordinator: Coordinator {} diff --git a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewController.swift b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewController.swift new file mode 100644 index 00000000..4b39958d --- /dev/null +++ b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewController.swift @@ -0,0 +1,31 @@ +// +// PartiGetLocationViewController.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import RxCocoa +import RxSwift +import UIKit + +final class PartiGetLocationViewController: UIViewController { + private let disposeBag = DisposeBag() + private var viewModel: PartiGetLocationViewModel + + + // MARK: - Init + init(viewModel: PartiGetLocationViewModel) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .green + } +} diff --git a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift new file mode 100644 index 00000000..c894b8d3 --- /dev/null +++ b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift @@ -0,0 +1,24 @@ +// +// PartiGetLocationViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import RxSwift +import UIKit + +final class PartiGetLocationViewModel: PartiLocationViewModel { + private let disposeBag = DisposeBag() + weak var coordinator: DefaultsParticipantsCoordinator? + + + // MARK: - Init + init(coordinator: DefaultsParticipantsCoordinator) { + self.coordinator = coordinator + } + + func moveToGetLocationViewController() { + print("get") + } +} diff --git a/TWTW/TWTW/Participants/Model/ParticipantsSource.swift b/TWTW/TWTW/Participants/Model/ParticipantsSource.swift new file mode 100644 index 00000000..c5eb3c29 --- /dev/null +++ b/TWTW/TWTW/Participants/Model/ParticipantsSource.swift @@ -0,0 +1,13 @@ +// +// ParticipantsSource.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import Foundation + +enum ParticipantsSource { + case get + case set +} diff --git a/TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift b/TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift new file mode 100644 index 00000000..e2d6abad --- /dev/null +++ b/TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift @@ -0,0 +1,26 @@ +// +// DefaultPartiSetLocationCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import Foundation +import UIKit + +final class DefaultPartiSetLocationCoordinator: PartiSetLocationCoordinator { + var childCoordinators: [Coordinator] = [] + var navigationController: UINavigationController + + // MARK: - Init + init(navigationController: UINavigationController) { + self.navigationController = navigationController + } + + func start() { + print("set") +// let partiSetLocationViewModel = PartiSetLocationViewModel(coordinator: self) +// let partiSetLocationVC = PartiSetLocationViewController(viewModel: partiSetLocationViewModel) +// navigationController.pushViewController(partiSetLocationVC, animated: false) + } +} diff --git a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationCoordinator.swift b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationCoordinator.swift new file mode 100644 index 00000000..fdaf3918 --- /dev/null +++ b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationCoordinator.swift @@ -0,0 +1,10 @@ +// +// PartiSetLocationCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import Foundation + +protocol PartiSetLocationCoordinator: Coordinator {} diff --git a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewController.swift b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewController.swift new file mode 100644 index 00000000..8f71835e --- /dev/null +++ b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewController.swift @@ -0,0 +1,32 @@ +// +// PartiSetLocationViewController.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import RxCocoa +import RxSwift +import UIKit + +final class PartiSetLocationViewController: UIViewController { + private let disposeBag = DisposeBag() + private var viewModel: PartiSetLocationViewModel + + + // MARK: - Init + init(viewModel: PartiSetLocationViewModel) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { + super.viewDidLoad() + print("PartiSetLocationViewController") + view.backgroundColor = .orange + } +} diff --git a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift new file mode 100644 index 00000000..b398c85a --- /dev/null +++ b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift @@ -0,0 +1,23 @@ +// +// PartiSetLocationViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import RxSwift +import UIKit + +final class PartiSetLocationViewModel: PartiLocationViewModel { + private let disposeBag = DisposeBag() + weak var coordinator: DefaultsParticipantsCoordinator? + + + // MARK: - Init + init(coordinator: DefaultsParticipantsCoordinator) { + self.coordinator = coordinator + } + func moveToSetLocationViewController() { + print("set") + } +} diff --git a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift index 566df507..bacafe02 100644 --- a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift +++ b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift @@ -28,7 +28,7 @@ final class ParticipantsViewController: UIViewController { locationImage: UIImage(systemName: "map")) ] private let disposeBag = DisposeBag() - private var viewModel: ParticipantsViewModel + private var viewModel: PartiLocationViewModel private lazy var partiTableView: UITableView = { let tableView = UITableView() @@ -36,7 +36,7 @@ final class ParticipantsViewController: UIViewController { }() // MARK: - Init - init(viewModel: ParticipantsViewModel) { + init(viewModel: PartiLocationViewModel) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) } @@ -53,6 +53,7 @@ final class ParticipantsViewController: UIViewController { view.layer.cornerRadius = 20 setupTableView() bindTableView() + print("😙\(viewModel)") } private func setupTableView() { @@ -87,12 +88,16 @@ final class ParticipantsViewController: UIViewController { } .disposed(by: disposeBag) - /// 셀 선택 이벤트 처리 - let changeLocationTapped = partiTableView.rx.itemSelected - .map { _ in () } - .asObservable() - - let input = ParticipantsViewModel.Input(changeLocationButtonTapped: changeLocationTapped) - viewModel.bind(input: input) +// 셀 선택 이벤트 처리 + partiTableView.rx.itemSelected + .subscribe(onNext: {[weak self] indexPath in + guard let self = self else { return } + if let viewModel = self.viewModel as? PartiGetLocationViewModel { + viewModel.moveToGetLocationViewController() + } else if let viewModel = self.viewModel as? PartiSetLocationViewModel { + viewModel.moveToSetLocationViewController() + } + }) + .disposed(by: disposeBag) } } diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift index f11b1323..81625489 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift @@ -12,27 +12,13 @@ import RxSwift final class ParticipantsViewModel { private let disposeBag = DisposeBag() weak var coordinator: DefaultsParticipantsCoordinator? - - /// Input - struct Input { - let changeLocationButtonTapped: Observable - } + // MARK: - Init init(coordinator: DefaultsParticipantsCoordinator) { self.coordinator = coordinator } - - /// bind - func bind(input: Input) { - input.changeLocationButtonTapped - .subscribe(onNext: {[weak self] in - self?.changeLocationButtonTapped() - }) - .disposed(by: disposeBag) - } - /// 화면이동 - private func changeLocationButtonTapped() { - coordinator?.moveToChangeLocation() - } +} +class PartiLocationViewModel { + } diff --git a/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift b/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift index ed780d92..d4274d43 100644 --- a/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift +++ b/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift @@ -32,7 +32,6 @@ final class SearchPlaceBottomSheetViewModel { } private func participantsButtonTapped() { - // 친구 목록 화면으로 이동 - coordinator?.moveToParticipantsList() + coordinator?.moveToParticipantsSetList(from: .set) } } From 73e4cbdeb7496a98069be5ffe15637617b517dc7 Mon Sep 17 00:00:00 2001 From: dami Date: Sat, 16 Dec 2023 20:45:40 +0900 Subject: [PATCH 03/24] =?UTF-8?q?chore:=20=ED=8C=8C=EC=9D=BC=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F,=20coord=EA=B5=AC=EC=A1=B0=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 32 ++++++++++++------- TWTW/TWTW/Map/DefaultMainMapCoordinator.swift | 4 +-- ...t => DefaultParticipantsCoordinator.swift} | 29 +++++++++++------ .../DefaultPartiGetLocationCoordinator.swift | 13 +++++--- .../PartiGetLocationViewModel.swift | 5 ++- .../DefaultPartiSetLocationCoordinator.swift | 8 ++--- .../PartiSetLocationViewModel.swift | 7 ++-- .../View/ParticipantsViewController.swift | 13 ++------ .../ViewModel/ParticipantsGetViewModel.swift | 23 +++++++++++++ .../ViewModel/ParticipantsSetViewModel.swift | 22 +++++++++++++ .../ViewModel/ParticipantsViewModel.swift | 6 ++-- 11 files changed, 108 insertions(+), 54 deletions(-) rename TWTW/TWTW/Participants/{DefaultsParticipantsCoordinator.swift => DefaultParticipantsCoordinator.swift} (52%) create mode 100644 TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift create mode 100644 TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index add4febb..275da0ac 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -84,16 +84,18 @@ 37D5D7912B19ECF300302EAD /* Plan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D5D7902B19ECF300302EAD /* Plan.swift */; }; 37E0D8AD2B180804002E0CF5 /* ParticipantsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8AC2B180804002E0CF5 /* ParticipantsViewController.swift */; }; 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */; }; - 37E0D8B42B180A68002E0CF5 /* DefaultsParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8B32B180A68002E0CF5 /* DefaultsParticipantsCoordinator.swift */; }; + 37E0D8B42B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */; }; 37E1B8312B2D94690047C7C7 /* ParticipantsSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8302B2D94690047C7C7 /* ParticipantsSource.swift */; }; - 37E1B8332B2D94950047C7C7 /* PartiGetLocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8322B2D94950047C7C7 /* PartiGetLocationViewModel.swift */; }; - 37E1B8352B2D94A20047C7C7 /* PartiSetLocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8342B2D94A20047C7C7 /* PartiSetLocationViewModel.swift */; }; + 37E1B8332B2D94950047C7C7 /* ParticipantsGetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8322B2D94950047C7C7 /* ParticipantsGetViewModel.swift */; }; + 37E1B8352B2D94A20047C7C7 /* ParticipantsSetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8342B2D94A20047C7C7 /* ParticipantsSetViewModel.swift */; }; 37E1B8372B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */; }; 37E1B8392B2D96880047C7C7 /* PartiSetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8382B2D96880047C7C7 /* PartiSetLocationCoordinator.swift */; }; 37E1B83B2B2D970F0047C7C7 /* PartiGetLocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */; }; 37E1B83D2B2D97170047C7C7 /* PartiSetLocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83C2B2D97170047C7C7 /* PartiSetLocationViewController.swift */; }; 37E1B83F2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */; }; 37E1B8412B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8402B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift */; }; + 37E1B8432B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8422B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift */; }; + 37E1B8452B2DAD100047C7C7 /* PartiSetLocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8442B2DAD100047C7C7 /* PartiSetLocationViewModel.swift */; }; 37E9FBFB2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E9FBFA2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift */; }; 37E9FBFE2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E9FBFD2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift */; }; 37EF0CFB2AB85C2400D77B0A /* UIViewController+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37EF0CFA2AB85C2400D77B0A /* UIViewController+Ext.swift */; }; @@ -252,16 +254,18 @@ 37D5D7902B19ECF300302EAD /* Plan.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Plan.swift; sourceTree = ""; }; 37E0D8AC2B180804002E0CF5 /* ParticipantsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsViewController.swift; sourceTree = ""; }; 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsCoordinator.swift; sourceTree = ""; }; - 37E0D8B32B180A68002E0CF5 /* DefaultsParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsParticipantsCoordinator.swift; sourceTree = ""; }; + 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultParticipantsCoordinator.swift; sourceTree = ""; }; 37E1B8302B2D94690047C7C7 /* ParticipantsSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsSource.swift; sourceTree = ""; }; - 37E1B8322B2D94950047C7C7 /* PartiGetLocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationViewModel.swift; sourceTree = ""; }; - 37E1B8342B2D94A20047C7C7 /* PartiSetLocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiSetLocationViewModel.swift; sourceTree = ""; }; + 37E1B8322B2D94950047C7C7 /* ParticipantsGetViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsGetViewModel.swift; sourceTree = ""; }; + 37E1B8342B2D94A20047C7C7 /* ParticipantsSetViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsSetViewModel.swift; sourceTree = ""; }; 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationCoordinator.swift; sourceTree = ""; }; 37E1B8382B2D96880047C7C7 /* PartiSetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiSetLocationCoordinator.swift; sourceTree = ""; }; 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationViewController.swift; sourceTree = ""; }; 37E1B83C2B2D97170047C7C7 /* PartiSetLocationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiSetLocationViewController.swift; sourceTree = ""; }; 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPartiGetLocationCoordinator.swift; sourceTree = ""; }; 37E1B8402B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPartiSetLocationCoordinator.swift; sourceTree = ""; }; + 37E1B8422B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationViewModel.swift; sourceTree = ""; }; + 37E1B8442B2DAD100047C7C7 /* PartiSetLocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiSetLocationViewModel.swift; sourceTree = ""; }; 37E9FBFA2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCustomTabButtonsView.swift; sourceTree = ""; }; 37E9FBFD2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCustomTabButtonViewModel.swift; sourceTree = ""; }; 37EF0CFA2AB85C2400D77B0A /* UIViewController+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Ext.swift"; sourceTree = ""; }; @@ -627,6 +631,8 @@ 37BB02F72B230E93006B2BEB /* ViewModel */ = { isa = PBXGroup; children = ( + 37E1B8322B2D94950047C7C7 /* ParticipantsGetViewModel.swift */, + 37E1B8342B2D94A20047C7C7 /* ParticipantsSetViewModel.swift */, 37BB02F82B230EA8006B2BEB /* ParticipantsViewModel.swift */, ); path = ViewModel; @@ -856,7 +862,7 @@ 37E1B82F2B2D944B0047C7C7 /* GetParicipants */, 37E1B82E2B2D94380047C7C7 /* SetParicipants */, 37BB02F72B230E93006B2BEB /* ViewModel */, - 37E0D8B32B180A68002E0CF5 /* DefaultsParticipantsCoordinator.swift */, + 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */, 37E0D8B52B180A8D002E0CF5 /* Protocol */, 37E0D8B22B180A35002E0CF5 /* View */, 37D5D7882B19CEB200302EAD /* Model */, @@ -884,7 +890,7 @@ 37E1B82E2B2D94380047C7C7 /* SetParicipants */ = { isa = PBXGroup; children = ( - 37E1B8342B2D94A20047C7C7 /* PartiSetLocationViewModel.swift */, + 37E1B8442B2DAD100047C7C7 /* PartiSetLocationViewModel.swift */, 37E1B8382B2D96880047C7C7 /* PartiSetLocationCoordinator.swift */, 37E1B83C2B2D97170047C7C7 /* PartiSetLocationViewController.swift */, 37E1B8402B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift */, @@ -895,7 +901,7 @@ 37E1B82F2B2D944B0047C7C7 /* GetParicipants */ = { isa = PBXGroup; children = ( - 37E1B8322B2D94950047C7C7 /* PartiGetLocationViewModel.swift */, + 37E1B8422B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift */, 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */, 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */, 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */, @@ -1567,7 +1573,7 @@ 3B274D712AD3F77600D79698 /* DefaultSignInCoordinator.swift in Sources */, 3799E5072A99D70500E06218 /* FriendsListViewController.swift in Sources */, 3B274D762AD4541E00D79698 /* SignInCoordinatorFinishDelegate.swift in Sources */, - 37E1B8352B2D94A20047C7C7 /* PartiSetLocationViewModel.swift in Sources */, + 37E1B8352B2D94A20047C7C7 /* ParticipantsSetViewModel.swift in Sources */, 3B4A660C2B161D8200DF9C84 /* CreateGroupViewModel.swift in Sources */, 375E8B022A95FCB000F8DE42 /* NearbyPlacesCollectionViewCell.swift in Sources */, 3799E5092A99D72D00E06218 /* NotificationViewController.swift in Sources */, @@ -1585,6 +1591,7 @@ 3788AEBA2B18DD0A007FC2F6 /* PlanViewController.swift in Sources */, 3737AE8C2AE93EE600FE7453 /* DefaultSearchPlacesMapCoordinator.swift in Sources */, 3737AE8D2AE93EE600FE7453 /* SearchPlacesMapViewModel.swift in Sources */, + 37E1B8452B2DAD100047C7C7 /* PartiSetLocationViewModel.swift in Sources */, 3737AE902AE93EE600FE7453 /* SearchPlaceProtocol.swift in Sources */, 37BB03052B2311DA006B2BEB /* ChangeLocationCoordinator.swift in Sources */, 3B6CF3D92ADACA7500325D05 /* MockSignInService.swift in Sources */, @@ -1646,7 +1653,7 @@ 37C35EE32B1CC876008A289D /* MakeNewFriendsListCoordinator.swift in Sources */, 3758F1B72A7DFB6200E2933C /* Bundle+Ext.swift in Sources */, 37BB02F92B230EA8006B2BEB /* ParticipantsViewModel.swift in Sources */, - 37E1B8332B2D94950047C7C7 /* PartiGetLocationViewModel.swift in Sources */, + 37E1B8332B2D94950047C7C7 /* ParticipantsGetViewModel.swift in Sources */, 3BB85C092B19D39200F8BBF3 /* FriendSearchCoordinatorProtocol.swift in Sources */, 3758F18C2A7D007200E2933C /* AppDelegate.swift in Sources */, 3788AEB82B18DCF4007FC2F6 /* PlanCoordinator.swift in Sources */, @@ -1655,12 +1662,13 @@ 37E0D8AD2B180804002E0CF5 /* ParticipantsViewController.swift in Sources */, 3B6BA9892A7F7D0900A11FE4 /* SignInViewModel.swift in Sources */, 3B274D822AD4D40700D79698 /* AppCoordinator.swift in Sources */, - 37E0D8B42B180A68002E0CF5 /* DefaultsParticipantsCoordinator.swift in Sources */, + 37E0D8B42B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift in Sources */, 3737AE922AE93FB000FE7453 /* SearchPlacesMapCoordinator.swift in Sources */, 3B274D7D2AD4D19B00D79698 /* SignUpViewModel.swift in Sources */, 3B4A66112B1634C900DF9C84 /* FriendSearchViewModel.swift in Sources */, 374EAEAC2B260BA900BAA897 /* BaseTabBarCoordinator.swift in Sources */, 3B4A66082B16148C00DF9C84 /* GroupService.swift in Sources */, + 37E1B8432B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift in Sources */, 37C35EDF2B1CC6FE008A289D /* MakeNewFriendsListViewModel.swift in Sources */, 3B26F32F2AC11DAD00EFEE12 /* SignUpViewController.swift in Sources */, 3B4A66012B1609F000DF9C84 /* GroupTableViewCell.swift in Sources */, diff --git a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift index 53868e5b..c62887b0 100644 --- a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift +++ b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift @@ -44,12 +44,12 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { } /// 친구 목록 화면으로 이동 func moveToParticipantsList() { - let participantsCoordinator = DefaultsParticipantsCoordinator(navigationController: navigationController) + let participantsCoordinator = DefaultParticipantsCoordinator(navigationController: navigationController) participantsCoordinator.start() } func moveToParticipantsSetList(from source: ParticipantsSource) { - let participantsCoordinator = DefaultsParticipantsCoordinator(navigationController: navigationController) + let participantsCoordinator = DefaultParticipantsCoordinator(navigationController: navigationController) participantsCoordinator.startWithViewModel(from: source) } diff --git a/TWTW/TWTW/Participants/DefaultsParticipantsCoordinator.swift b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift similarity index 52% rename from TWTW/TWTW/Participants/DefaultsParticipantsCoordinator.swift rename to TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift index c8e6a84d..08acc45e 100644 --- a/TWTW/TWTW/Participants/DefaultsParticipantsCoordinator.swift +++ b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift @@ -1,5 +1,5 @@ // -// DefaultsParticipantsCoordinator.swift +// DefaultParticipantsCoordinator.swift // TWTW // // Created by 박다미 on 2023/11/30. @@ -8,7 +8,7 @@ import Foundation import UIKit -final class DefaultsParticipantsCoordinator: ParticipantsCoordinator { +final class DefaultParticipantsCoordinator: ParticipantsCoordinator { var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController @@ -18,7 +18,7 @@ final class DefaultsParticipantsCoordinator: ParticipantsCoordinator { } func start() { - let participantsViewModel = PartiGetLocationViewModel(coordinator: self) + let participantsViewModel = ParticipantsGetViewModel(coordinator: self) let participantsViewController = ParticipantsViewController(viewModel: participantsViewModel) navigationController.pushViewController(participantsViewController, animated: true) @@ -29,10 +29,10 @@ final class DefaultsParticipantsCoordinator: ParticipantsCoordinator { switch source { case .get: - viewModel = PartiGetLocationViewModel(coordinator: self) + viewModel = ParticipantsGetViewModel(coordinator: self) case .set: - viewModel = PartiSetLocationViewModel(coordinator: self) + viewModel = ParticipantsSetViewModel(coordinator: self) } @@ -40,10 +40,19 @@ final class DefaultsParticipantsCoordinator: ParticipantsCoordinator { navigationController.pushViewController(participantsViewController, animated: true) } - /// 선택한 사람 장소 바꾸기 - func moveToChangeLocation() { - let changeLocationCoordinator = DefaultChangeLocationCoordinator(navigationController: navigationController) - changeLocationCoordinator.start() - childCoordinators.append(changeLocationCoordinator) + + func moveToPartiGetLocation() { + print(#function) + let partiGetLocationCoordinator = DefaultPartiGetLocationCoordinator(navigationController: navigationController) + partiGetLocationCoordinator.start() + childCoordinators.append(partiGetLocationCoordinator) + } + func moveToPartiSetLocation() { + print(#function) + + let partiSetLocationCoordinator = DefaultPartiSetLocationCoordinator(navigationController: navigationController) + partiSetLocationCoordinator.start() + childCoordinators.append(partiSetLocationCoordinator) + } } diff --git a/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift b/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift index 80c7ad62..2a856440 100644 --- a/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift +++ b/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift @@ -11,17 +11,20 @@ import UIKit final class DefaultPartiGetLocationCoordinator: PartiGetLocationCoordinator { var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController - + private var partiGetLocationViewModel: PartiGetLocationViewModel? + // MARK: - Init init(navigationController: UINavigationController) { self.navigationController = navigationController + partiGetLocationViewModel = PartiGetLocationViewModel(coordinator: self) } func start() { - print("get") -// let partiGetLocationViewModel = PartiGetLocationViewModel(coordinator: self) -// let partiGetLocationVC = PartiGetLocationViewController(viewModel: partiGetLocationViewModel) -// navigationController.pushViewController(partiGetLocationVC, animated: false) + + let partiGetLocationViewModel = PartiGetLocationViewModel(coordinator: self) + let partiGetLocationVC = PartiGetLocationViewController(viewModel: partiGetLocationViewModel) + navigationController.pushViewController(partiGetLocationVC, animated: false) } + } diff --git a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift index c894b8d3..44531d3c 100644 --- a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift +++ b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift @@ -10,11 +10,10 @@ import UIKit final class PartiGetLocationViewModel: PartiLocationViewModel { private let disposeBag = DisposeBag() - weak var coordinator: DefaultsParticipantsCoordinator? - + weak var coordinator: DefaultPartiGetLocationCoordinator? // MARK: - Init - init(coordinator: DefaultsParticipantsCoordinator) { + init(coordinator: DefaultPartiGetLocationCoordinator) { self.coordinator = coordinator } diff --git a/TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift b/TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift index e2d6abad..e4182df1 100644 --- a/TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift +++ b/TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift @@ -18,9 +18,9 @@ final class DefaultPartiSetLocationCoordinator: PartiSetLocationCoordinator { } func start() { - print("set") -// let partiSetLocationViewModel = PartiSetLocationViewModel(coordinator: self) -// let partiSetLocationVC = PartiSetLocationViewController(viewModel: partiSetLocationViewModel) -// navigationController.pushViewController(partiSetLocationVC, animated: false) + + let partiSetLocationViewModel = PartiSetLocationViewModel(coordinator: self) + let partiSetLocationVC = PartiSetLocationViewController(viewModel: partiSetLocationViewModel) + navigationController.pushViewController(partiSetLocationVC, animated: false) } } diff --git a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift index b398c85a..ec1a99f8 100644 --- a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift +++ b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift @@ -10,14 +10,13 @@ import UIKit final class PartiSetLocationViewModel: PartiLocationViewModel { private let disposeBag = DisposeBag() - weak var coordinator: DefaultsParticipantsCoordinator? - + weak var coordinator: DefaultPartiSetLocationCoordinator? // MARK: - Init - init(coordinator: DefaultsParticipantsCoordinator) { + init(coordinator: DefaultPartiSetLocationCoordinator) { self.coordinator = coordinator } func moveToSetLocationViewController() { - print("set") + } } diff --git a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift index bacafe02..2bdef830 100644 --- a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift +++ b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift @@ -41,6 +41,7 @@ final class ParticipantsViewController: UIViewController { super.init(nibName: nil, bundle: nil) } + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") @@ -88,16 +89,6 @@ final class ParticipantsViewController: UIViewController { } .disposed(by: disposeBag) -// 셀 선택 이벤트 처리 - partiTableView.rx.itemSelected - .subscribe(onNext: {[weak self] indexPath in - guard let self = self else { return } - if let viewModel = self.viewModel as? PartiGetLocationViewModel { - viewModel.moveToGetLocationViewController() - } else if let viewModel = self.viewModel as? PartiSetLocationViewModel { - viewModel.moveToSetLocationViewController() - } - }) - .disposed(by: disposeBag) } + } diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift new file mode 100644 index 00000000..55108a27 --- /dev/null +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift @@ -0,0 +1,23 @@ +// +// PartiGetLocationViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import RxSwift +import UIKit + +final class ParticipantsGetViewModel: PartiLocationViewModel { + private let disposeBag = DisposeBag() + weak var coordinator: DefaultParticipantsCoordinator? + + // MARK: - Init + init(coordinator: DefaultParticipantsCoordinator) { + self.coordinator = coordinator + } + func moveToGetLocationViewController() { + coordinator?.moveToPartiGetLocation() + print("") + } +} diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift new file mode 100644 index 00000000..a6687a6c --- /dev/null +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift @@ -0,0 +1,22 @@ +// +// PartiSetLocationViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import RxSwift +import UIKit + +final class ParticipantsSetViewModel: PartiLocationViewModel { + private let disposeBag = DisposeBag() + weak var coordinator: DefaultParticipantsCoordinator? + + // MARK: - Init + init(coordinator: DefaultParticipantsCoordinator) { + self.coordinator = coordinator + } + func moveToSetLocationViewController() { + coordinator?.moveToPartiSetLocation() + } +} diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift index 81625489..d762f73c 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift @@ -11,14 +11,14 @@ import RxSwift final class ParticipantsViewModel { private let disposeBag = DisposeBag() - weak var coordinator: DefaultsParticipantsCoordinator? + weak var coordinator: DefaultParticipantsCoordinator? // MARK: - Init - init(coordinator: DefaultsParticipantsCoordinator) { + init(coordinator: DefaultParticipantsCoordinator) { self.coordinator = coordinator } } + class PartiLocationViewModel { - } From bf188558627b411b8e9e0625d6a481e7bf0bbd2e Mon Sep 17 00:00:00 2001 From: dami Date: Sun, 17 Dec 2023 00:05:25 +0900 Subject: [PATCH 04/24] =?UTF-8?q?fix:=20coodinator=20error=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 --- TWTW/TWTW/Map/DefaultMainMapCoordinator.swift | 5 ++++- .../DefaultParticipantsCoordinator.swift | 2 +- .../PartiGetLocationViewModel.swift | 2 +- .../PartiSetLocationViewModel.swift | 2 +- .../View/ParticipantsViewController.swift | 12 +++++++++++ .../ViewModel/ParticipantsGetViewModel.swift | 21 ++++++++++++++----- .../ViewModel/ParticipantsSetViewModel.swift | 18 +++++++++++++--- .../ViewModel/ParticipantsViewModel.swift | 4 +++- 8 files changed, 53 insertions(+), 13 deletions(-) diff --git a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift index c62887b0..5c39498b 100644 --- a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift +++ b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift @@ -43,14 +43,17 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { childCoordinators.append(searchPlacesMapCoordinator) } /// 친구 목록 화면으로 이동 + /// get func moveToParticipantsList() { let participantsCoordinator = DefaultParticipantsCoordinator(navigationController: navigationController) participantsCoordinator.start() + childCoordinators.append(participantsCoordinator) } - + /// set func moveToParticipantsSetList(from source: ParticipantsSource) { let participantsCoordinator = DefaultParticipantsCoordinator(navigationController: navigationController) participantsCoordinator.startWithViewModel(from: source) + childCoordinators.append(participantsCoordinator) } /// 알림 화면으로 이동 diff --git a/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift index 08acc45e..b575eee2 100644 --- a/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift +++ b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift @@ -42,7 +42,7 @@ final class DefaultParticipantsCoordinator: ParticipantsCoordinator { func moveToPartiGetLocation() { - print(#function) + print("#function") let partiGetLocationCoordinator = DefaultPartiGetLocationCoordinator(navigationController: navigationController) partiGetLocationCoordinator.start() childCoordinators.append(partiGetLocationCoordinator) diff --git a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift index 44531d3c..dd808d68 100644 --- a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift +++ b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift @@ -8,7 +8,7 @@ import RxSwift import UIKit -final class PartiGetLocationViewModel: PartiLocationViewModel { +final class PartiGetLocationViewModel { private let disposeBag = DisposeBag() weak var coordinator: DefaultPartiGetLocationCoordinator? diff --git a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift index ec1a99f8..fcf13203 100644 --- a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift +++ b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift @@ -8,7 +8,7 @@ import RxSwift import UIKit -final class PartiSetLocationViewModel: PartiLocationViewModel { +final class PartiSetLocationViewModel { private let disposeBag = DisposeBag() weak var coordinator: DefaultPartiSetLocationCoordinator? diff --git a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift index 2bdef830..cceedf19 100644 --- a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift +++ b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift @@ -88,6 +88,18 @@ final class ParticipantsViewController: UIViewController { .disposed(by: cell.disposeBag) } .disposed(by: disposeBag) + // 셀 선택 + if let getViewModel = viewModel as? ParticipantsGetViewModel { + let selectedPlace = partiTableView.rx.modelSelected(Participant.self).asObservable() + let input = ParticipantsGetViewModel.Input(selectedPlace: selectedPlace) + getViewModel.bind(input: input) + } + if let setViewModel = viewModel as? ParticipantsSetViewModel { + let selectedPlace = partiTableView.rx.modelSelected(Participant.self).asObservable() + let input = ParticipantsSetViewModel.Input(selectedPlace: selectedPlace) + setViewModel.bind(input: input) + } + } diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift index 55108a27..1f1372ca 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift @@ -10,14 +10,25 @@ import UIKit final class ParticipantsGetViewModel: PartiLocationViewModel { private let disposeBag = DisposeBag() - weak var coordinator: DefaultParticipantsCoordinator? - + + struct Input { + let selectedPlace: Observable + } + // MARK: - Init init(coordinator: DefaultParticipantsCoordinator) { + super.init() self.coordinator = coordinator } - func moveToGetLocationViewController() { - coordinator?.moveToPartiGetLocation() - print("") + + func bind(input: Input) { + input.selectedPlace + .bind(onNext: { [weak self] _ in + guard let self = self, let coordinator = self.coordinator else { return print("nil") } + coordinator.moveToPartiGetLocation() + print("get") + + }) + .disposed(by: disposeBag) } } diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift index a6687a6c..37967911 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift @@ -10,13 +10,25 @@ import UIKit final class ParticipantsSetViewModel: PartiLocationViewModel { private let disposeBag = DisposeBag() - weak var coordinator: DefaultParticipantsCoordinator? + // weak var coordinator: DefaultParticipantsCoordinator? + struct Input { + let selectedPlace: Observable + } + // MARK: - Init init(coordinator: DefaultParticipantsCoordinator) { + super.init() self.coordinator = coordinator } - func moveToSetLocationViewController() { - coordinator?.moveToPartiSetLocation() + + func bind(input: Input) { + input.selectedPlace + .bind(onNext: { [weak self] _ in + guard let self = self else { return } + coordinator?.moveToPartiSetLocation() + + }) + .disposed(by: disposeBag) } } diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift index d762f73c..ff115fa7 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift @@ -20,5 +20,7 @@ final class ParticipantsViewModel { } } -class PartiLocationViewModel { +class PartiLocationViewModel { + weak var coordinator: DefaultParticipantsCoordinator? + } From cd7cebb14b3592a08f6d815cb16d3e91d9fd10bd Mon Sep 17 00:00:00 2001 From: dami Date: Sun, 17 Dec 2023 01:38:54 +0900 Subject: [PATCH 05/24] =?UTF-8?q?feat:=20makenewMeeting=20UI=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 24 ++++++++++++ .../DefaultParticipantsCoordinator.swift | 37 ++++++++++--------- .../DefaultMakeNewMeetingCoordinator.swift | 30 +++++++++++++++ .../MakeNewMeetingCoordinator.swift | 10 +++++ .../MakeNewMeetingViewController.swift | 30 +++++++++++++++ .../MakeNewMeetingViewModel.swift | 23 ++++++++++++ .../View/ParticipantsViewController.swift | 26 +++++++++---- .../ViewModel/ParticipantsGetViewModel.swift | 8 ++-- .../ViewModel/ParticipantsSetViewModel.swift | 12 +++++- 9 files changed, 168 insertions(+), 32 deletions(-) create mode 100644 TWTW/TWTW/Participants/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift create mode 100644 TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingCoordinator.swift create mode 100644 TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewController.swift create mode 100644 TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewModel.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index 275da0ac..a71206e3 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -58,6 +58,10 @@ 3788AEB82B18DCF4007FC2F6 /* PlanCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AEB72B18DCF4007FC2F6 /* PlanCoordinator.swift */; }; 3788AEBA2B18DD0A007FC2F6 /* PlanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AEB92B18DD0A007FC2F6 /* PlanViewController.swift */; }; 3788AEBE2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AEBD2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift */; }; + 378FD2A72B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378FD2A62B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift */; }; + 378FD2A92B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378FD2A82B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift */; }; + 378FD2AB2B2DFFF500DFCE25 /* MakeNewMeetingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378FD2AA2B2DFFF500DFCE25 /* MakeNewMeetingViewController.swift */; }; + 378FD2AD2B2E003400DFCE25 /* MakeNewMeetingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378FD2AC2B2E003400DFCE25 /* MakeNewMeetingViewModel.swift */; }; 3799E4F12A99C4D100E06218 /* DefaultAppCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3799E4F02A99C4D100E06218 /* DefaultAppCoordinator.swift */; }; 3799E5022A99D68500E06218 /* CallViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3799E5012A99D68500E06218 /* CallViewController.swift */; }; 3799E5052A99D6DC00E06218 /* PreviousAppointmentsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3799E5042A99D6DC00E06218 /* PreviousAppointmentsViewController.swift */; }; @@ -227,6 +231,10 @@ 3788AEB72B18DCF4007FC2F6 /* PlanCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanCoordinator.swift; sourceTree = ""; }; 3788AEB92B18DD0A007FC2F6 /* PlanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanViewController.swift; sourceTree = ""; }; 3788AEBD2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsPlansCoordinator.swift; sourceTree = ""; }; + 378FD2A62B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultMakeNewMeetingCoordinator.swift; sourceTree = ""; }; + 378FD2A82B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewMeetingCoordinator.swift; sourceTree = ""; }; + 378FD2AA2B2DFFF500DFCE25 /* MakeNewMeetingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewMeetingViewController.swift; sourceTree = ""; }; + 378FD2AC2B2E003400DFCE25 /* MakeNewMeetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewMeetingViewModel.swift; sourceTree = ""; }; 3799E4F02A99C4D100E06218 /* DefaultAppCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultAppCoordinator.swift; sourceTree = ""; }; 3799E5012A99D68500E06218 /* CallViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallViewController.swift; sourceTree = ""; }; 3799E5042A99D6DC00E06218 /* PreviousAppointmentsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviousAppointmentsViewController.swift; sourceTree = ""; }; @@ -577,6 +585,17 @@ path = Model; sourceTree = ""; }; + 378FD2A12B2DFDBD00DFCE25 /* MakeNewMeeting */ = { + isa = PBXGroup; + children = ( + 378FD2A62B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift */, + 378FD2A82B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift */, + 378FD2AA2B2DFFF500DFCE25 /* MakeNewMeetingViewController.swift */, + 378FD2AC2B2E003400DFCE25 /* MakeNewMeetingViewModel.swift */, + ); + path = MakeNewMeeting; + sourceTree = ""; + }; 3799E4ED2A99C4A000E06218 /* Coordinator */ = { isa = PBXGroup; children = ( @@ -859,6 +878,7 @@ 37E0D8AB2B1807E0002E0CF5 /* Participants */ = { isa = PBXGroup; children = ( + 378FD2A12B2DFDBD00DFCE25 /* MakeNewMeeting */, 37E1B82F2B2D944B0047C7C7 /* GetParicipants */, 37E1B82E2B2D94380047C7C7 /* SetParicipants */, 37BB02F72B230E93006B2BEB /* ViewModel */, @@ -1624,6 +1644,7 @@ 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */, 37C733752B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift in Sources */, 37D5D78F2B19EAEB00302EAD /* PlanTableViewCell.swift in Sources */, + 378FD2AB2B2DFFF500DFCE25 /* MakeNewMeetingViewController.swift in Sources */, 37E1B83F2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift in Sources */, 3788AEBE2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift in Sources */, 3B274D792AD4584600D79698 /* SignInCoordinatorProtocol.swift in Sources */, @@ -1639,6 +1660,7 @@ 3B9693DE2B176DED001DDAE8 /* FriendListTableViewCell.swift in Sources */, 37E9FBFE2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift in Sources */, 3B20E1E62AE41E97009572AA /* FriendsListCoordinatorProtocol.swift in Sources */, + 378FD2A92B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift in Sources */, 37E1B8392B2D96880047C7C7 /* PartiSetLocationCoordinator.swift in Sources */, 37F903A82AF9BD88008120B6 /* Header.swift in Sources */, 3760CC8F2AE2CB7800CFC2D5 /* SurroundSearchPlaces.swift in Sources */, @@ -1675,6 +1697,7 @@ 3737AE942AE93FB900FE7453 /* SearchPlacesMapCoordDelegate.swift in Sources */, 3B274D6D2AD3F6F400D79698 /* Coordinator.swift in Sources */, 3B9693D82B175346001DDAE8 /* DefaultCreateGroupCoordinator.swift in Sources */, + 378FD2AD2B2E003400DFCE25 /* MakeNewMeetingViewModel.swift in Sources */, 3737AE982AE983F600FE7453 /* SearchPlacesMapService.swift in Sources */, 3754BB702A9B455100522420 /* Color+Ext.swift in Sources */, 37F903A62AF9BD2F008120B6 /* EncodedQuery.swift in Sources */, @@ -1688,6 +1711,7 @@ 3799E4F12A99C4D100E06218 /* DefaultAppCoordinator.swift in Sources */, 3737AE8F2AE93EE600FE7453 /* SearchPlacesMapViewController.swift in Sources */, 3B274D842AD5207100D79698 /* SignUpService.swift in Sources */, + 378FD2A72B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift in Sources */, 3B20E1DD2AE41D32009572AA /* PreviousAppointmentsCoordinator.swift in Sources */, 377CB05B2AD8666F003453D6 /* GroupCoordinatorProtocol.swift in Sources */, 3758F18E2A7D007200E2933C /* SceneDelegate.swift in Sources */, diff --git a/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift index b575eee2..3362a1e6 100644 --- a/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift +++ b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift @@ -26,33 +26,34 @@ final class DefaultParticipantsCoordinator: ParticipantsCoordinator { func startWithViewModel(from source: ParticipantsSource) { let viewModel: PartiLocationViewModel - - switch source { - case .get: - viewModel = ParticipantsGetViewModel(coordinator: self) - - case .set: - viewModel = ParticipantsSetViewModel(coordinator: self) - - } - let participantsViewController = ParticipantsViewController(viewModel: viewModel) - navigationController.pushViewController(participantsViewController, animated: true) - } - - + switch source { + case .get: + viewModel = ParticipantsGetViewModel(coordinator: self) + + case .set: + viewModel = ParticipantsSetViewModel(coordinator: self) + } + + let participantsViewController = ParticipantsViewController(viewModel: viewModel) + navigationController.pushViewController(participantsViewController, animated: true) + } + func moveToPartiGetLocation() { - print("#function") let partiGetLocationCoordinator = DefaultPartiGetLocationCoordinator(navigationController: navigationController) partiGetLocationCoordinator.start() childCoordinators.append(partiGetLocationCoordinator) } + func moveToPartiSetLocation() { - print(#function) - let partiSetLocationCoordinator = DefaultPartiSetLocationCoordinator(navigationController: navigationController) partiSetLocationCoordinator.start() childCoordinators.append(partiSetLocationCoordinator) - + } + + func moveToMakeNewMeeting() { + let makeNewMeetingCoordinator = DefaultMakeNewMeetingCoordinator(navigationController: navigationController) + makeNewMeetingCoordinator.start() + childCoordinators.append(makeNewMeetingCoordinator) } } diff --git a/TWTW/TWTW/Participants/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift b/TWTW/TWTW/Participants/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift new file mode 100644 index 00000000..2a33a6a5 --- /dev/null +++ b/TWTW/TWTW/Participants/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift @@ -0,0 +1,30 @@ +// +// DefaultMakeNewMeetingCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/17. +// + +import Foundation +import UIKit + +final class DefaultMakeNewMeetingCoordinator: MakeNewMeetingCoordinator { + var childCoordinators: [Coordinator] = [] + var navigationController: UINavigationController + private var makeNewMeetingViewModel: MakeNewMeetingViewModel? + + // MARK: - Init + init(navigationController: UINavigationController) { + self.navigationController = navigationController + makeNewMeetingViewModel = MakeNewMeetingViewModel(coordinator: self) + } + + func start() { + let makeNewMeetingViewModel = MakeNewMeetingViewModel(coordinator: self) + let makeNewMeetingVC = MakeNewMeetingViewController(viewModel: makeNewMeetingViewModel) + + navigationController.pushViewController(makeNewMeetingVC, animated: false) + + } + +} diff --git a/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingCoordinator.swift b/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingCoordinator.swift new file mode 100644 index 00000000..08be66fc --- /dev/null +++ b/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingCoordinator.swift @@ -0,0 +1,10 @@ +// +// MakeNewMeetingCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/17. +// + +import Foundation + +protocol MakeNewMeetingCoordinator: Coordinator {} diff --git a/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewController.swift b/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewController.swift new file mode 100644 index 00000000..140f89e9 --- /dev/null +++ b/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewController.swift @@ -0,0 +1,30 @@ +// +// MakeNewMeetingViewController.swift +// TWTW +// +// Created by 박다미 on 2023/12/17. +// + +import RxCocoa +import RxSwift +import UIKit + +final class MakeNewMeetingViewController: UIViewController { + private let disposeBag = DisposeBag() + private var viewModel: MakeNewMeetingViewModel + + // MARK: - Init + init(viewModel: MakeNewMeetingViewModel) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .brown + } +} diff --git a/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewModel.swift b/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewModel.swift new file mode 100644 index 00000000..656f4795 --- /dev/null +++ b/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewModel.swift @@ -0,0 +1,23 @@ +// +// MakeNewMeetingViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/17. +// + +import RxSwift +import UIKit + +final class MakeNewMeetingViewModel { + private let disposeBag = DisposeBag() + weak var coordinator: DefaultMakeNewMeetingCoordinator? + + // MARK: - Init + init(coordinator: DefaultMakeNewMeetingCoordinator) { + self.coordinator = coordinator + } + + func moveToGetLocationViewController() { + print("get") + } +} diff --git a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift index cceedf19..c88da3b2 100644 --- a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift +++ b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift @@ -29,7 +29,8 @@ final class ParticipantsViewController: UIViewController { ] private let disposeBag = DisposeBag() private var viewModel: PartiLocationViewModel - + private let addButtonTappedSubject = PublishSubject() + private lazy var partiTableView: UITableView = { let tableView = UITableView() return tableView @@ -50,11 +51,9 @@ final class ParticipantsViewController: UIViewController { // MARK: View Did Load override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .orange - view.layer.cornerRadius = 20 setupTableView() bindTableView() - print("😙\(viewModel)") + setupNavigationItem() } private func setupTableView() { @@ -91,16 +90,27 @@ final class ParticipantsViewController: UIViewController { // 셀 선택 if let getViewModel = viewModel as? ParticipantsGetViewModel { let selectedPlace = partiTableView.rx.modelSelected(Participant.self).asObservable() + let input = ParticipantsGetViewModel.Input(selectedPlace: selectedPlace) getViewModel.bind(input: input) } if let setViewModel = viewModel as? ParticipantsSetViewModel { let selectedPlace = partiTableView.rx.modelSelected(Participant.self).asObservable() - let input = ParticipantsSetViewModel.Input(selectedPlace: selectedPlace) + let input = ParticipantsSetViewModel.Input(selectedPlace: selectedPlace, addButtonTapped: addButtonTappedSubject.asObservable()) setViewModel.bind(input: input) } - - } - + + private func setupNavigationItem() { + + if viewModel is ParticipantsGetViewModel { + navigationItem.rightBarButtonItem = nil + } else if viewModel is ParticipantsSetViewModel { + let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: nil) + navigationItem.rightBarButtonItem = addButton + addButton.rx.tap + .bind(to: addButtonTappedSubject) + .disposed(by: disposeBag) + } + } } diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift index 1f1372ca..0f1686d6 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift @@ -24,11 +24,11 @@ final class ParticipantsGetViewModel: PartiLocationViewModel { func bind(input: Input) { input.selectedPlace .bind(onNext: { [weak self] _ in - guard let self = self, let coordinator = self.coordinator else { return print("nil") } + guard let self = self, let coordinator = self.coordinator else { return } coordinator.moveToPartiGetLocation() - print("get") - + }) .disposed(by: disposeBag) + + } } -} diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift index 37967911..d23ffe11 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift @@ -10,10 +10,11 @@ import UIKit final class ParticipantsSetViewModel: PartiLocationViewModel { private let disposeBag = DisposeBag() - // weak var coordinator: DefaultParticipantsCoordinator? - + struct Input { let selectedPlace: Observable + let addButtonTapped: Observable + } // MARK: - Init @@ -30,5 +31,12 @@ final class ParticipantsSetViewModel: PartiLocationViewModel { }) .disposed(by: disposeBag) + + input.addButtonTapped + .bind(onNext: { [weak self] in + self?.coordinator?.moveToMakeNewMeeting() + }) + .disposed(by: disposeBag) } + } From ab0068c04a7f3e925264fd5a888faad7e6b38054 Mon Sep 17 00:00:00 2001 From: dami Date: Sun, 17 Dec 2023 17:56:46 +0900 Subject: [PATCH 06/24] =?UTF-8?q?feat:Participants=20=EC=97=90=EC=84=9C=20?= =?UTF-8?q?friendsList=EC=9D=B4=EB=8F=99=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 24 ++- .../ViewModel/FriendsListViewModel.swift | 1 - .../DefaultMakeNewMeetingCoordinator.swift | 0 .../MakeNewMeetingCoordinator.swift | 0 .../MakeNewMeetingViewController.swift | 0 .../MakeNewMeetingViewModel.swift | 0 .../Set/PartiMeetingViewController.swift | 41 ++++ .../Set/PartiMeetingViewModel.swift | 12 ++ .../DefaultPartiSetLocationCoordinator.swift | 7 + .../PartiSetLocationCoordinator.swift | 0 .../PartiSetLocationViewController.swift | 176 ++++++++++++++++++ .../PartiSetLocationViewModel.swift | 61 ++++++ .../Set/SetParicipants/Text.swift | 1 + .../PartiSetLocationViewController.swift | 32 ---- .../PartiSetLocationViewModel.swift | 22 --- .../View/ParticipantsViewController.swift | 24 +-- .../ViewModel/ParticipantsGetViewModel.swift | 10 +- 17 files changed, 337 insertions(+), 74 deletions(-) rename TWTW/TWTW/Participants/{ => Set}/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift (100%) rename TWTW/TWTW/Participants/{ => Set}/MakeNewMeeting/MakeNewMeetingCoordinator.swift (100%) rename TWTW/TWTW/Participants/{ => Set}/MakeNewMeeting/MakeNewMeetingViewController.swift (100%) rename TWTW/TWTW/Participants/{ => Set}/MakeNewMeeting/MakeNewMeetingViewModel.swift (100%) create mode 100644 TWTW/TWTW/Participants/Set/PartiMeetingViewController.swift create mode 100644 TWTW/TWTW/Participants/Set/PartiMeetingViewModel.swift rename TWTW/TWTW/Participants/{ => Set}/SetParicipants/DefaultPartiSetLocationCoordinator.swift (71%) rename TWTW/TWTW/Participants/{ => Set}/SetParicipants/PartiSetLocationCoordinator.swift (100%) create mode 100644 TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift create mode 100644 TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift create mode 100644 TWTW/TWTW/Participants/Set/SetParicipants/Text.swift delete mode 100644 TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewController.swift delete mode 100644 TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index a71206e3..92ea11ea 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -12,6 +12,9 @@ 371C1D2F2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */; }; 371C1D312ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D302ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift */; }; 371C1D332ADBB00300B30DC5 /* DefaultCallCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D322ADBB00300B30DC5 /* DefaultCallCoordinator.swift */; }; + 371ECB832B2ECAF5005174FF /* PartiMeetingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */; }; + 371ECB852B2ECAFD005174FF /* PartiMeetingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */; }; + 371ECB872B2EE381005174FF /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB862B2EE381005174FF /* Text.swift */; }; 372109F82B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372109F72B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift */; }; 372109FC2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372109FB2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift */; }; 3737AE8C2AE93EE600FE7453 /* DefaultSearchPlacesMapCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3737AE862AE93EE600FE7453 /* DefaultSearchPlacesMapCoordinator.swift */; }; @@ -187,6 +190,9 @@ 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultFriendsListCoordinator.swift; sourceTree = ""; }; 371C1D302ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPreviousAppointmentsCoordinator.swift; sourceTree = ""; }; 371C1D322ADBB00300B30DC5 /* DefaultCallCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultCallCoordinator.swift; sourceTree = ""; }; + 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiMeetingViewController.swift; sourceTree = ""; }; + 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiMeetingViewModel.swift; sourceTree = ""; }; + 371ECB862B2EE381005174FF /* Text.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Text.swift; sourceTree = ""; }; 372109F72B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlaceMapViewModelUnitTests.swift; sourceTree = ""; }; 372109FB2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSearchPlacesMapService.swift; sourceTree = ""; }; 3737AE862AE93EE600FE7453 /* DefaultSearchPlacesMapCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultSearchPlacesMapCoordinator.swift; sourceTree = ""; }; @@ -369,6 +375,17 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 371ECB812B2ECA9D005174FF /* Set */ = { + isa = PBXGroup; + children = ( + 37E1B82E2B2D94380047C7C7 /* SetParicipants */, + 378FD2A12B2DFDBD00DFCE25 /* MakeNewMeeting */, + 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */, + 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */, + ); + path = Set; + sourceTree = ""; + }; 372109F52B0CE70700B0946C /* SearchPlaces */ = { isa = PBXGroup; children = ( @@ -878,9 +895,8 @@ 37E0D8AB2B1807E0002E0CF5 /* Participants */ = { isa = PBXGroup; children = ( - 378FD2A12B2DFDBD00DFCE25 /* MakeNewMeeting */, + 371ECB812B2ECA9D005174FF /* Set */, 37E1B82F2B2D944B0047C7C7 /* GetParicipants */, - 37E1B82E2B2D94380047C7C7 /* SetParicipants */, 37BB02F72B230E93006B2BEB /* ViewModel */, 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */, 37E0D8B52B180A8D002E0CF5 /* Protocol */, @@ -914,6 +930,7 @@ 37E1B8382B2D96880047C7C7 /* PartiSetLocationCoordinator.swift */, 37E1B83C2B2D97170047C7C7 /* PartiSetLocationViewController.swift */, 37E1B8402B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift */, + 371ECB862B2EE381005174FF /* Text.swift */, ); path = SetParicipants; sourceTree = ""; @@ -1708,6 +1725,7 @@ 37BB03032B231198006B2BEB /* DefaultChangeLocationCoordinator.swift in Sources */, 3B4A660A2B161D1600DF9C84 /* CreateGroupViewController.swift in Sources */, 3BB85C032B19B4E200F8BBF3 /* FriendProtocol.swift in Sources */, + 371ECB832B2ECAF5005174FF /* PartiMeetingViewController.swift in Sources */, 3799E4F12A99C4D100E06218 /* DefaultAppCoordinator.swift in Sources */, 3737AE8F2AE93EE600FE7453 /* SearchPlacesMapViewController.swift in Sources */, 3B274D842AD5207100D79698 /* SignUpService.swift in Sources */, @@ -1719,9 +1737,11 @@ 3B274D802AD4D2E200D79698 /* SignUpCoordinatorProtocol.swift in Sources */, 37E1B8372B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift in Sources */, 37C198C32B2760C000D68196 /* MapViewModelProtocol.swift in Sources */, + 371ECB872B2EE381005174FF /* Text.swift in Sources */, 37E1B8412B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift in Sources */, 371C1D2F2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift in Sources */, 37CE1EAF2AE75813009CDA21 /* SearchPlace.swift in Sources */, + 371ECB852B2ECAFD005174FF /* PartiMeetingViewModel.swift in Sources */, 3737AE8E2AE93EE600FE7453 /* SearchPlacesTableViewCell.swift in Sources */, 3B6CF3D72ADAC80200325D05 /* SignInProtocol.swift in Sources */, 375916372A7EB36000C21E1F /* SignInService.swift in Sources */, diff --git a/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift b/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift index 9ee14c1a..e1ada655 100644 --- a/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift +++ b/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift @@ -16,7 +16,6 @@ final class FriendsListViewModel { private let friendService: FriendProtocol private let disposeBag = DisposeBag() - struct Input { let searchBarEvents: Observable? let selectedFriendsEvents: ControlEvent? diff --git a/TWTW/TWTW/Participants/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift b/TWTW/TWTW/Participants/Set/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift similarity index 100% rename from TWTW/TWTW/Participants/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift rename to TWTW/TWTW/Participants/Set/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift diff --git a/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingCoordinator.swift b/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingCoordinator.swift similarity index 100% rename from TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingCoordinator.swift rename to TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingCoordinator.swift diff --git a/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewController.swift b/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewController.swift similarity index 100% rename from TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewController.swift rename to TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewController.swift diff --git a/TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewModel.swift b/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewModel.swift similarity index 100% rename from TWTW/TWTW/Participants/MakeNewMeeting/MakeNewMeetingViewModel.swift rename to TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewModel.swift diff --git a/TWTW/TWTW/Participants/Set/PartiMeetingViewController.swift b/TWTW/TWTW/Participants/Set/PartiMeetingViewController.swift new file mode 100644 index 00000000..c5bc0579 --- /dev/null +++ b/TWTW/TWTW/Participants/Set/PartiMeetingViewController.swift @@ -0,0 +1,41 @@ +// +// PartiMeetingViewController.swift +// TWTW +// +// Created by 박다미 on 2023/12/17. +// + +import Foundation +import UIKit + +class PartiMeetingViewController: UIViewController { + var newPlace: UILabel! + var addParticipantsButton: UIButton! + var confirmButton: UIButton! + + init() { + super.init(nibName: nil, bundle: nil) + commonInit() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + commonInit() + } + + private func commonInit() { + // 공통 뷰 구성 요소 초기화 + newPlace = UILabel() + addParticipantsButton = UIButton() + confirmButton = UIButton() + view.backgroundColor = .red + } + + func setupCommonViews() { + // newPlace, addParticipantsButton, confirmButton 설정 + } + + func setupCommonBindings() { + // 공통 ViewModel 바인딩 코드 작성 + } +} diff --git a/TWTW/TWTW/Participants/Set/PartiMeetingViewModel.swift b/TWTW/TWTW/Participants/Set/PartiMeetingViewModel.swift new file mode 100644 index 00000000..fd1df1f4 --- /dev/null +++ b/TWTW/TWTW/Participants/Set/PartiMeetingViewModel.swift @@ -0,0 +1,12 @@ +// +// PartiMeetingViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/17. +// + +import UIKit + +class PartiMeetingViewModel { + +} diff --git a/TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift b/TWTW/TWTW/Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift similarity index 71% rename from TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift rename to TWTW/TWTW/Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift index e4182df1..af162bb3 100644 --- a/TWTW/TWTW/Participants/SetParicipants/DefaultPartiSetLocationCoordinator.swift +++ b/TWTW/TWTW/Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift @@ -23,4 +23,11 @@ final class DefaultPartiSetLocationCoordinator: PartiSetLocationCoordinator { let partiSetLocationVC = PartiSetLocationViewController(viewModel: partiSetLocationViewModel) navigationController.pushViewController(partiSetLocationVC, animated: false) } + /// 친구추가 화면으로 이동 + func addParticipants() { + let defaultFriendsListCoordinator = DefaultFriendsListCoordinator(navigationController: navigationController) + childCoordinators.append(defaultFriendsListCoordinator) + defaultFriendsListCoordinator.start() + + } } diff --git a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationCoordinator.swift b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationCoordinator.swift similarity index 100% rename from TWTW/TWTW/Participants/SetParicipants/PartiSetLocationCoordinator.swift rename to TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationCoordinator.swift diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift new file mode 100644 index 00000000..7e02c726 --- /dev/null +++ b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift @@ -0,0 +1,176 @@ +// +// PartiSetLocationViewController.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import RxCocoa +import RxSwift +import SnapKit +import UIKit + +final class PartiSetLocationViewController: UIViewController { + private let disposeBag = DisposeBag() + private var viewModel: PartiSetLocationViewModel + + private lazy var originalMeetingNameLabel: UILabel = { + let label = UILabel() + label.text = "약속 명 (수정가능)" + return label + }() + + private lazy var originalPlaceNameLabel: UILabel = { + let label = UILabel() + label.text = "이전 목적지 명" + return label + }() + + private lazy var newPlaceNameLabel: UILabel = { + let label = UILabel() + label.text = "선택한 목적지명" + + return label + }() + + private lazy var addParticipantsButton: UIButton = { + let button = UIButton(type: .system) + button.setTitle("참여 인원", for: .normal) + + return button + }() + + private lazy var confirmButton: UIButton = { + let button = UIButton(type: .system) + button.setTitle("변경", for: .normal) + + return button + }() + + private lazy var datePickerButton: UIButton = { + let button = UIButton(type: .system) + button.setImage(UIImage(systemName: "calendar"), for: .normal) + return button + }() + + private lazy var selectedDateLabel: UILabel = UILabel() + + private lazy var datePicker: UIDatePicker = { + let picker = UIDatePicker() + picker.datePickerMode = .date + return picker + }() + + // MARK: - Init + init(viewModel: PartiSetLocationViewModel) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .white + addSubeViews() + setupBindings() + bind() + } + + private func addSubeViews() { + // 원래 위치 레이블 + view.addSubview(originalPlaceNameLabel) + // 새 위치 레이블 + view.addSubview(newPlaceNameLabel) + // 참여 인원 추가 버튼 + view.addSubview(addParticipantsButton) + // 확인 버튼 + view.addSubview(confirmButton) + // 날짜 선택 버튼 + view.addSubview(datePickerButton) + // 선택된 날짜 레이블 + view.addSubview(selectedDateLabel) + configureConstraints() + } + + private func configureConstraints() { + originalPlaceNameLabel.snp.makeConstraints { make in + make.top.equalTo(view.safeAreaLayoutGuide).offset(20) + make.centerX.equalToSuperview() + } + newPlaceNameLabel.snp.makeConstraints { make in + make.top.equalTo(originalPlaceNameLabel.snp.bottom).offset(10) + make.centerX.equalToSuperview() + } + addParticipantsButton.snp.makeConstraints { make in + make.top.equalTo(newPlaceNameLabel.snp.bottom).offset(10) + make.centerX.equalToSuperview() + } + confirmButton.snp.makeConstraints { make in + make.top.equalTo(addParticipantsButton.snp.bottom).offset(10) + make.centerX.equalToSuperview() + } + datePickerButton.snp.makeConstraints { make in + make.top.equalTo(confirmButton.snp.bottom).offset(10) + make.centerX.equalToSuperview() + } + selectedDateLabel.snp.makeConstraints { make in + make.top.equalTo(datePickerButton.snp.bottom).offset(10) + make.centerX.equalToSuperview() + } + } + private func bind() { + let input = PartiSetLocationViewModel.Input(clickedAddParticipantsEvents: addParticipantsButton.rx.tap) + + let output = viewModel.createOutput(input: input) + + } + + private func setupBindings() { + addParticipantsButton.rx.tap + .bind { [weak self] in + + } + .disposed(by: disposeBag) + + confirmButton.rx.tap + .bind { [weak self] in + print("변경버튼 클릭") + } + .disposed(by: disposeBag) + + datePickerButton.rx.tap + .bind { [weak self] in + self?.presentDatePicker() + } + .disposed(by: disposeBag) + } + private func presentDatePicker() { + let alertController = UIAlertController(title: "\n\n\n", message: nil, preferredStyle: .actionSheet) + alertController.view.addSubview(datePicker) + + datePicker.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(alertController.view) + make.width.equalTo(alertController.view) + } + let selectAction = UIAlertAction(title: "선택", style: .default) { [weak self] _ in + self?.selectedDateLabel.text = self?.formattedDate(self?.datePicker.date) + } + let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) + + alertController.addAction(selectAction) + alertController.addAction(cancelAction) + present(alertController, animated: true, completion: nil) + + } + private func formattedDate(_ date: Date?) -> String { + guard let date = date else { return "" } + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd" + return formatter.string(from: date) + } +} diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift new file mode 100644 index 00000000..13704158 --- /dev/null +++ b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift @@ -0,0 +1,61 @@ +// +// PartiSetLocationViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/16. +// + +import RxCocoa +import RxRelay +import RxSwift +import UIKit + +final class PartiSetLocationViewModel { + private let disposeBag = DisposeBag() + weak var coordinator: DefaultPartiSetLocationCoordinator? + + struct Input { + //1.달력버튼 클릭 + + //2. 친구추가 버튼 클릭 + let clickedAddParticipantsEvents: ControlEvent? + // 3.저장 버튼 클릭 + // let clickedSaveEvents: ControlEvent? + } + + struct Output { + // 1. + + // 2.코디네이터로 친구코디네이터 이동 + + // 3. + } + // MARK: - Init + init(coordinator: DefaultPartiSetLocationCoordinator) { + self.coordinator = coordinator + } + + // create Output + /// - Parameter input: Input Model + /// - Returns: Output Model + func createOutput(input: Input) -> Output { + let output = Output() + input.clickedAddParticipantsEvents? + .bind { [weak self] in + guard let self = self else { return } + print("친구 추가 눌림ㄱㄱ") + moveAddPrticipants() + } + .disposed(by: disposeBag) + + return output + } + + func moveToSetLocationViewController() { + + } + + func moveAddPrticipants() { + coordinator?.addParticipants() + } +} diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/Text.swift b/TWTW/TWTW/Participants/Set/SetParicipants/Text.swift new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/TWTW/TWTW/Participants/Set/SetParicipants/Text.swift @@ -0,0 +1 @@ + diff --git a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewController.swift b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewController.swift deleted file mode 100644 index 8f71835e..00000000 --- a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewController.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// PartiSetLocationViewController.swift -// TWTW -// -// Created by 박다미 on 2023/12/16. -// - -import RxCocoa -import RxSwift -import UIKit - -final class PartiSetLocationViewController: UIViewController { - private let disposeBag = DisposeBag() - private var viewModel: PartiSetLocationViewModel - - - // MARK: - Init - init(viewModel: PartiSetLocationViewModel) { - self.viewModel = viewModel - super.init(nibName: nil, bundle: nil) - } - - @available(*, unavailable) - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - override func viewDidLoad() { - super.viewDidLoad() - print("PartiSetLocationViewController") - view.backgroundColor = .orange - } -} diff --git a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift b/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift deleted file mode 100644 index fcf13203..00000000 --- a/TWTW/TWTW/Participants/SetParicipants/PartiSetLocationViewModel.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// PartiSetLocationViewModel.swift -// TWTW -// -// Created by 박다미 on 2023/12/16. -// - -import RxSwift -import UIKit - -final class PartiSetLocationViewModel { - private let disposeBag = DisposeBag() - weak var coordinator: DefaultPartiSetLocationCoordinator? - - // MARK: - Init - init(coordinator: DefaultPartiSetLocationCoordinator) { - self.coordinator = coordinator - } - func moveToSetLocationViewController() { - - } -} diff --git a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift index c88da3b2..cc70422c 100644 --- a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift +++ b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift @@ -30,7 +30,7 @@ final class ParticipantsViewController: UIViewController { private let disposeBag = DisposeBag() private var viewModel: PartiLocationViewModel private let addButtonTappedSubject = PublishSubject() - + private lazy var partiTableView: UITableView = { let tableView = UITableView() return tableView @@ -90,7 +90,7 @@ final class ParticipantsViewController: UIViewController { // 셀 선택 if let getViewModel = viewModel as? ParticipantsGetViewModel { let selectedPlace = partiTableView.rx.modelSelected(Participant.self).asObservable() - + let input = ParticipantsGetViewModel.Input(selectedPlace: selectedPlace) getViewModel.bind(input: input) } @@ -100,17 +100,17 @@ final class ParticipantsViewController: UIViewController { setViewModel.bind(input: input) } } - + private func setupNavigationItem() { - if viewModel is ParticipantsGetViewModel { - navigationItem.rightBarButtonItem = nil - } else if viewModel is ParticipantsSetViewModel { - let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: nil) - navigationItem.rightBarButtonItem = addButton - addButton.rx.tap - .bind(to: addButtonTappedSubject) - .disposed(by: disposeBag) - } + if viewModel is ParticipantsGetViewModel { + navigationItem.rightBarButtonItem = nil + } else if viewModel is ParticipantsSetViewModel { + let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: nil) + navigationItem.rightBarButtonItem = addButton + addButton.rx.tap + .bind(to: addButtonTappedSubject) + .disposed(by: disposeBag) } + } } diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift index 0f1686d6..824a2d66 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift @@ -10,11 +10,11 @@ import UIKit final class ParticipantsGetViewModel: PartiLocationViewModel { private let disposeBag = DisposeBag() - + struct Input { let selectedPlace: Observable } - + // MARK: - Init init(coordinator: DefaultParticipantsCoordinator) { super.init() @@ -26,9 +26,9 @@ final class ParticipantsGetViewModel: PartiLocationViewModel { .bind(onNext: { [weak self] _ in guard let self = self, let coordinator = self.coordinator else { return } coordinator.moveToPartiGetLocation() - + }) .disposed(by: disposeBag) - - } + } +} From 984da8f1abc9e91877ddd1f39d58c2ddcfdc6516 Mon Sep 17 00:00:00 2001 From: dami Date: Sun, 17 Dec 2023 21:06:26 +0900 Subject: [PATCH 07/24] =?UTF-8?q?feat:=20=20=EC=85=80=20=EC=84=A0=ED=83=9D?= =?UTF-8?q?=EC=9D=B4=ED=9B=84=20=EC=88=98=EC=A0=95=EC=83=81=ED=83=9C?= =?UTF-8?q?=EC=97=90=EC=84=9C=EC=9D=98=20Paricipants=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 8 +++ TWTW/TWTW/FriendsList/Caller.swift | 13 ++++ .../DefaultFriendsListCoordinator.swift | 21 ++++++ .../FriendsListCoordinatorDelegate.swift | 12 ++++ .../View/FriendsListViewController.swift | 2 +- .../ViewModel/FriendsListViewModel.swift | 67 +++++++++++++++---- .../DefaultPartiSetLocationCoordinator.swift | 28 +++++--- .../PartiSetLocationViewController.swift | 30 +++++++-- .../PartiSetLocationViewModel.swift | 20 ++++-- 9 files changed, 169 insertions(+), 32 deletions(-) create mode 100644 TWTW/TWTW/FriendsList/Caller.swift create mode 100644 TWTW/TWTW/FriendsList/Protocol/FriendsListCoordinatorDelegate.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index 92ea11ea..299ce675 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -15,6 +15,8 @@ 371ECB832B2ECAF5005174FF /* PartiMeetingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */; }; 371ECB852B2ECAFD005174FF /* PartiMeetingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */; }; 371ECB872B2EE381005174FF /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB862B2EE381005174FF /* Text.swift */; }; + 371ECB892B2EF20D005174FF /* Caller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB882B2EF20D005174FF /* Caller.swift */; }; + 371ECB8B2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB8A2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift */; }; 372109F82B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372109F72B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift */; }; 372109FC2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372109FB2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift */; }; 3737AE8C2AE93EE600FE7453 /* DefaultSearchPlacesMapCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3737AE862AE93EE600FE7453 /* DefaultSearchPlacesMapCoordinator.swift */; }; @@ -193,6 +195,8 @@ 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiMeetingViewController.swift; sourceTree = ""; }; 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiMeetingViewModel.swift; sourceTree = ""; }; 371ECB862B2EE381005174FF /* Text.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Text.swift; sourceTree = ""; }; + 371ECB882B2EF20D005174FF /* Caller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Caller.swift; sourceTree = ""; }; + 371ECB8A2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendsListCoordinatorDelegate.swift; sourceTree = ""; }; 372109F72B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlaceMapViewModelUnitTests.swift; sourceTree = ""; }; 372109FB2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSearchPlacesMapService.swift; sourceTree = ""; }; 3737AE862AE93EE600FE7453 /* DefaultSearchPlacesMapCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultSearchPlacesMapCoordinator.swift; sourceTree = ""; }; @@ -640,6 +644,7 @@ 3B20E1E22AE41E81009572AA /* Protocol */, 3B76F0922AF9D05C00B2BD1D /* View */, 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */, + 371ECB882B2EF20D005174FF /* Caller.swift */, ); path = FriendsList; sourceTree = ""; @@ -1041,6 +1046,7 @@ isa = PBXGroup; children = ( 3B20E1E32AE41E84009572AA /* Coordinator */, + 371ECB8A2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift */, ); path = Protocol; sourceTree = ""; @@ -1609,6 +1615,7 @@ 3BC8D6A72B0F15D700BE22EF /* CarRoute.swift in Sources */, 3B274D712AD3F77600D79698 /* DefaultSignInCoordinator.swift in Sources */, 3799E5072A99D70500E06218 /* FriendsListViewController.swift in Sources */, + 371ECB8B2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift in Sources */, 3B274D762AD4541E00D79698 /* SignInCoordinatorFinishDelegate.swift in Sources */, 37E1B8352B2D94A20047C7C7 /* ParticipantsSetViewModel.swift in Sources */, 3B4A660C2B161D8200DF9C84 /* CreateGroupViewModel.swift in Sources */, @@ -1651,6 +1658,7 @@ 3BC8D6A42B0F0F3700BE22EF /* RouteProtocol.swift in Sources */, 37E1B83D2B2D97170047C7C7 /* PartiSetLocationViewController.swift in Sources */, 377CB0592AD8665E003453D6 /* GroupViewModel.swift in Sources */, + 371ECB892B2EF20D005174FF /* Caller.swift in Sources */, 3B274D7B2AD4CFDA00D79698 /* SignUpCoordinatorFinishDelegate.swift in Sources */, 3760CC8C2AE2C0E800CFC2D5 /* SurroundSearchService.swift in Sources */, 3799E5022A99D68500E06218 /* CallViewController.swift in Sources */, diff --git a/TWTW/TWTW/FriendsList/Caller.swift b/TWTW/TWTW/FriendsList/Caller.swift new file mode 100644 index 00000000..9ae2abb7 --- /dev/null +++ b/TWTW/TWTW/FriendsList/Caller.swift @@ -0,0 +1,13 @@ +// +// Caller.swift +// TWTW +// +// Created by 박다미 on 2023/12/17. +// + +import Foundation + +enum Caller { + case fromPartiSetLocation + case fromTabBar + } diff --git a/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift b/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift index c77d33ab..35b01090 100644 --- a/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift +++ b/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift @@ -13,6 +13,8 @@ final class DefaultFriendsListCoordinator: FriendsListCoordinatorProtocol { var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController var navigationControllerDelegate = TabBarNavigationControllerDelegate() + + weak var delegate: FriendsSendListCoordinatorDelegate? private var output: FriendsListViewModel.Output? @@ -30,6 +32,20 @@ final class DefaultFriendsListCoordinator: FriendsListCoordinatorProtocol { let friendsListViewController = FriendsListViewController(viewModel: friendsListViewModel) navigationController.pushViewController(friendsListViewController, animated: false) } + + /// mark : 참여자 추가할때 fromPartiSetLocation + func startFromPartiSetLocation() { + let friendsListViewModel = FriendsListViewModel( + coordinator: self, + friendService: FriendService(), + caller: .fromPartiSetLocation + ) + let friendsListViewController = FriendsListViewController(viewModel: friendsListViewModel) + + navigationController.pushViewController(friendsListViewController, animated: false) + + } + /// 새로운 친구추가 화면으로 이동 func makeNewFriends() { @@ -38,4 +54,9 @@ final class DefaultFriendsListCoordinator: FriendsListCoordinatorProtocol { defaultMakeNewFriendsListCoordinator.start() } + + func navigateBackWithSelectedFriends(_ friends: [Friend]) { + delegate?.didSelectFriends(friends) + navigationController.popViewController(animated: true) + } } diff --git a/TWTW/TWTW/FriendsList/Protocol/FriendsListCoordinatorDelegate.swift b/TWTW/TWTW/FriendsList/Protocol/FriendsListCoordinatorDelegate.swift new file mode 100644 index 00000000..c568b440 --- /dev/null +++ b/TWTW/TWTW/FriendsList/Protocol/FriendsListCoordinatorDelegate.swift @@ -0,0 +1,12 @@ +// +// FriendsListCoordinatorDelegate.swift +// TWTW +// +// Created by 박다미 on 2023/12/17. +// + +import Foundation + +protocol FriendsSendListCoordinatorDelegate: AnyObject { + func didSelectFriends(_ friends: [Friend]) +} diff --git a/TWTW/TWTW/FriendsList/View/FriendsListViewController.swift b/TWTW/TWTW/FriendsList/View/FriendsListViewController.swift index de3123b5..5a35d4e1 100644 --- a/TWTW/TWTW/FriendsList/View/FriendsListViewController.swift +++ b/TWTW/TWTW/FriendsList/View/FriendsListViewController.swift @@ -52,7 +52,7 @@ final class FriendsListViewController: UIViewController { view.backgroundColor = .white bind() addSubviews() - + } override func touchesBegan(_ touches: Set, with event: UIEvent?) { super.touchesBegan(touches, with: event) diff --git a/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift b/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift index e1ada655..1de5a2ee 100644 --- a/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift +++ b/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift @@ -15,6 +15,7 @@ final class FriendsListViewModel { var coordinator: DefaultFriendsListCoordinator private let friendService: FriendProtocol private let disposeBag = DisposeBag() + private let caller: Caller struct Input { let searchBarEvents: Observable? @@ -29,9 +30,10 @@ final class FriendsListViewModel { } // MARK: - init - init(coordinator: DefaultFriendsListCoordinator, friendService: FriendProtocol) { + init(coordinator: DefaultFriendsListCoordinator, friendService: FriendProtocol, caller: Caller = .fromTabBar) { self.coordinator = coordinator self.friendService = friendService + self.caller = caller } /// create Output @@ -48,16 +50,43 @@ final class FriendsListViewModel { } .bind(to: output.filteringFriendListRelay) .disposed(by: disposeBag) + + if caller == .fromPartiSetLocation { + input.selectedFriendsEvents? + .bind { indexPath in + var select = output.selectedFriendRelay.value + output.filteringFriendListRelay.accept(output.filteringFriendListRelay.value) + + if select.contains(output.filteringFriendListRelay.value[indexPath.row]) { + select.remove(at: select.firstIndex(of: output.filteringFriendListRelay.value[indexPath.row]) ?? 0) + output.selectedFriendRelay.accept(select) + return + } + select.append(output.filteringFriendListRelay.value[indexPath.row]) + output.selectedFriendRelay.accept(select) + } + .disposed(by: disposeBag) + } + input.clickedAddButtonEvents? .bind { [weak self] _ in guard let self = self else { return } - moveMakeNewFriends() + switch self.caller { + case .fromPartiSetLocation: + // PartiSetLocation에서 호출된 경우의 동작 +// print("Selected friends: \(output.selectedFriendRelay.value)") + coordinator.navigateBackWithSelectedFriends(output.selectedFriendRelay.value) + + case .fromTabBar: + // 탭바에서 호출된 경우의 동작 + print("친구 추가 - 탭바에서 호출됨") + self.coordinator.makeNewFriends() + } }.disposed(by: disposeBag) getAllFriends(output: output) return output } - /// move MakeNewFriends func moveMakeNewFriends() { coordinator.makeNewFriends() @@ -66,14 +95,28 @@ final class FriendsListViewModel { /// 전체 친구 목록 로딩 /// - Parameter output: output private func getAllFriends(output: Output) { - - friendService.getAllFriends() - .subscribe(onNext: { list in - print(#function, list) - output.friendListRelay.accept(list) - }, onError: { error in - print(#function, error) - }) - .disposed(by: disposeBag) + let list = [Friend(memberId: "aasd1", nickname: "1"), + Friend(memberId: "aasd2", nickname: "2"), + Friend(memberId: "aasd3", nickname: "3"), + Friend(memberId: "aasd4", nickname: "4"), + Friend(memberId: "aasd5", nickname: "5"), + Friend(memberId: "aasd6", nickname: "6"), + Friend(memberId: "aasd7", nickname: "7"), + Friend(memberId: "aasd8", nickname: "8"), + Friend(memberId: "aasd9", nickname: "9"), + Friend(memberId: "aasd10", nickname: "10"), + Friend(memberId: "aasd11", nickname: "11"), + Friend(memberId: "aasd12", nickname: "12")] + + output.friendListRelay.accept(list) + +// friendService.getAllFriends() +// .subscribe(onNext: { list in +// print(#function, list) +// output.friendListRelay.accept(list) +// }, onError: { error in +// print(#function, error) +// }) +// .disposed(by: disposeBag) } } diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift b/TWTW/TWTW/Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift index af162bb3..e0fd385a 100644 --- a/TWTW/TWTW/Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift +++ b/TWTW/TWTW/Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift @@ -9,25 +9,37 @@ import Foundation import UIKit final class DefaultPartiSetLocationCoordinator: PartiSetLocationCoordinator { + var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController - + private var partiSetLocationViewModel: PartiSetLocationViewModel? + // MARK: - Init init(navigationController: UINavigationController) { self.navigationController = navigationController + partiSetLocationViewModel = PartiSetLocationViewModel(coordinator: self) + } func start() { - - let partiSetLocationViewModel = PartiSetLocationViewModel(coordinator: self) - let partiSetLocationVC = PartiSetLocationViewController(viewModel: partiSetLocationViewModel) + let viewModel = PartiSetLocationViewModel(coordinator: self) + self.partiSetLocationViewModel = viewModel + let partiSetLocationVC = PartiSetLocationViewController(viewModel: viewModel) navigationController.pushViewController(partiSetLocationVC, animated: false) - } + } /// 친구추가 화면으로 이동 + func addParticipants() { - let defaultFriendsListCoordinator = DefaultFriendsListCoordinator(navigationController: navigationController) - childCoordinators.append(defaultFriendsListCoordinator) - defaultFriendsListCoordinator.start() + let friendsListCoordinator = DefaultFriendsListCoordinator(navigationController: navigationController) + friendsListCoordinator.delegate = self // delegate를 여기에 설정 + childCoordinators.append(friendsListCoordinator) + friendsListCoordinator.startFromPartiSetLocation() + } + +} +extension DefaultPartiSetLocationCoordinator: FriendsSendListCoordinatorDelegate { + func didSelectFriends(_ friends: [Friend]) { + partiSetLocationViewModel?.updateSelectedFriends(friends) } } diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift index 7e02c726..66d4221a 100644 --- a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift +++ b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift @@ -14,6 +14,12 @@ final class PartiSetLocationViewController: UIViewController { private let disposeBag = DisposeBag() private var viewModel: PartiSetLocationViewModel + private lazy var selectedFriendsTableView: UITableView = { + let tableView = UITableView() + tableView.register(FriendListTableViewCell.self, forCellReuseIdentifier: CellIdentifier.friendListTableViewCell.rawValue) + tableView.backgroundColor = .blue + return tableView + }() private lazy var originalMeetingNameLabel: UILabel = { let label = UILabel() label.text = "약속 명 (수정가능)" @@ -78,6 +84,8 @@ final class PartiSetLocationViewController: UIViewController { addSubeViews() setupBindings() bind() + bindTableView() + } private func addSubeViews() { @@ -87,6 +95,8 @@ final class PartiSetLocationViewController: UIViewController { view.addSubview(newPlaceNameLabel) // 참여 인원 추가 버튼 view.addSubview(addParticipantsButton) + + view.addSubview(selectedFriendsTableView) // 확인 버튼 view.addSubview(confirmButton) // 날짜 선택 버튼 @@ -109,8 +119,13 @@ final class PartiSetLocationViewController: UIViewController { make.top.equalTo(newPlaceNameLabel.snp.bottom).offset(10) make.centerX.equalToSuperview() } - confirmButton.snp.makeConstraints { make in + selectedFriendsTableView.snp.makeConstraints { make in make.top.equalTo(addParticipantsButton.snp.bottom).offset(10) + make.leading.trailing.equalToSuperview() + make.height.equalTo(100) + } + confirmButton.snp.makeConstraints { make in + make.top.equalTo(selectedFriendsTableView.snp.bottom).offset(10) make.centerX.equalToSuperview() } datePickerButton.snp.makeConstraints { make in @@ -128,13 +143,16 @@ final class PartiSetLocationViewController: UIViewController { let output = viewModel.createOutput(input: input) } + private func bindTableView() { + viewModel.selectedFriendsObservable + .bind(to: selectedFriendsTableView.rx + .items(cellIdentifier: CellIdentifier.friendListTableViewCell.rawValue, cellType: FriendListTableViewCell.self)) { index, friend, cell in + cell.inputData(info: friend) + } + .disposed(by: disposeBag) + } private func setupBindings() { - addParticipantsButton.rx.tap - .bind { [weak self] in - - } - .disposed(by: disposeBag) confirmButton.rx.tap .bind { [weak self] in diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift index 13704158..c8e33a9b 100644 --- a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift +++ b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift @@ -13,11 +13,19 @@ import UIKit final class PartiSetLocationViewModel { private let disposeBag = DisposeBag() weak var coordinator: DefaultPartiSetLocationCoordinator? - + // 선택된 친구 목록을 저장하는 Relay + private let selectedFriendsRelay = BehaviorRelay<[Friend]>(value: []) + + // 선택된 친구 목록을 외부에 공개하는 Observable + var selectedFriendsObservable: Observable<[Friend]> { + return selectedFriendsRelay.asObservable() + } + + struct Input { - //1.달력버튼 클릭 + // 1.달력버튼 클릭 - //2. 친구추가 버튼 클릭 + // 2. 친구추가 버튼 클릭 let clickedAddParticipantsEvents: ControlEvent? // 3.저장 버튼 클릭 // let clickedSaveEvents: ControlEvent? @@ -43,7 +51,6 @@ final class PartiSetLocationViewModel { input.clickedAddParticipantsEvents? .bind { [weak self] in guard let self = self else { return } - print("친구 추가 눌림ㄱㄱ") moveAddPrticipants() } .disposed(by: disposeBag) @@ -52,10 +59,13 @@ final class PartiSetLocationViewModel { } func moveToSetLocationViewController() { - } func moveAddPrticipants() { coordinator?.addParticipants() } + // 선택된 친구 목록을 업데이트하는 메서드 + func updateSelectedFriends(_ friends: [Friend]) { + selectedFriendsRelay.accept(friends) + } } From 6fece98ca3b7e33129a905e8ac1c48fa8adaf8ab Mon Sep 17 00:00:00 2001 From: dami Date: Sun, 17 Dec 2023 21:47:41 +0900 Subject: [PATCH 08/24] =?UTF-8?q?feat:=20Participate=20tableView=20?= =?UTF-8?q?=EC=99=80=20scroll=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PartiSetLocationViewController.swift | 75 ++++++++++++++----- 1 file changed, 57 insertions(+), 18 deletions(-) diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift index 66d4221a..8648dca7 100644 --- a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift +++ b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift @@ -13,10 +13,13 @@ import UIKit final class PartiSetLocationViewController: UIViewController { private let disposeBag = DisposeBag() private var viewModel: PartiSetLocationViewModel - + private var tableViewHeightConstraint: Constraint? + private lazy var selectedFriendsTableView: UITableView = { let tableView = UITableView() tableView.register(FriendListTableViewCell.self, forCellReuseIdentifier: CellIdentifier.friendListTableViewCell.rawValue) + tableView.rowHeight = 100 + tableView.isScrollEnabled = false tableView.backgroundColor = .blue return tableView }() @@ -59,13 +62,21 @@ final class PartiSetLocationViewController: UIViewController { return button }() - private lazy var selectedDateLabel: UILabel = UILabel() + private lazy var selectedDateLabel: UILabel = { + let label = UILabel() + label.text = "선택한 날짜" + + return label + }() + private lazy var datePicker: UIDatePicker = { let picker = UIDatePicker() picker.datePickerMode = .date return picker }() + let scrollView = UIScrollView() + let contentView = UIView() // MARK: - Init init(viewModel: PartiSetLocationViewModel) { @@ -87,28 +98,41 @@ final class PartiSetLocationViewController: UIViewController { bindTableView() } - + private func addSubeViews() { + view.addSubview(scrollView) + scrollView.addSubview(contentView) // 원래 위치 레이블 - view.addSubview(originalPlaceNameLabel) + contentView.addSubview(originalPlaceNameLabel) // 새 위치 레이블 - view.addSubview(newPlaceNameLabel) + contentView.addSubview(newPlaceNameLabel) // 참여 인원 추가 버튼 - view.addSubview(addParticipantsButton) + contentView.addSubview(addParticipantsButton) - view.addSubview(selectedFriendsTableView) + contentView.addSubview(selectedFriendsTableView) // 확인 버튼 - view.addSubview(confirmButton) + contentView.addSubview(confirmButton) // 날짜 선택 버튼 - view.addSubview(datePickerButton) + contentView.addSubview(datePickerButton) // 선택된 날짜 레이블 - view.addSubview(selectedDateLabel) + contentView.addSubview(selectedDateLabel) configureConstraints() } private func configureConstraints() { + scrollView.snp.makeConstraints { make in + make.edges.equalToSuperview() + + } + + contentView.snp.makeConstraints { make in + make.edges.equalTo(scrollView) + make.width.equalTo(scrollView) + // make.height.equalTo(2000) + } + originalPlaceNameLabel.snp.makeConstraints { make in - make.top.equalTo(view.safeAreaLayoutGuide).offset(20) + make.top.equalTo(contentView.snp.top).offset(20) make.centerX.equalToSuperview() } newPlaceNameLabel.snp.makeConstraints { make in @@ -135,8 +159,10 @@ final class PartiSetLocationViewController: UIViewController { selectedDateLabel.snp.makeConstraints { make in make.top.equalTo(datePickerButton.snp.bottom).offset(10) make.centerX.equalToSuperview() + make.bottom.equalToSuperview().inset(20) } } + private func bind() { let input = PartiSetLocationViewModel.Input(clickedAddParticipantsEvents: addParticipantsButton.rx.tap) @@ -144,13 +170,26 @@ final class PartiSetLocationViewController: UIViewController { } private func bindTableView() { - viewModel.selectedFriendsObservable - .bind(to: selectedFriendsTableView.rx - .items(cellIdentifier: CellIdentifier.friendListTableViewCell.rawValue, cellType: FriendListTableViewCell.self)) { index, friend, cell in - cell.inputData(info: friend) - } - .disposed(by: disposeBag) - } + viewModel.selectedFriendsObservable + .do(onNext: { [weak self] friends in + self?.updateTableViewHeight(friends.count) + }) + + .bind(to: selectedFriendsTableView.rx + .items(cellIdentifier: CellIdentifier.friendListTableViewCell.rawValue, cellType: FriendListTableViewCell.self)) { index, friend, cell in + cell.inputData(info: friend) + }.disposed(by: disposeBag) + } + + private func updateTableViewHeight(_ count: Int) { + let rowHeight = selectedFriendsTableView.rowHeight + let totalHeight = rowHeight * CGFloat(count) + selectedFriendsTableView.snp.updateConstraints { make in + make.height.equalTo(totalHeight) + } + view.layoutIfNeeded() + } + private func setupBindings() { From d843a12f4ce7c49e5e74d54a829fbc44aabaf0f0 Mon Sep 17 00:00:00 2001 From: dami Date: Mon, 18 Dec 2023 02:38:57 +0900 Subject: [PATCH 09/24] =?UTF-8?q?fix:=20=ED=8C=8C=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20participants=20->=20plan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 92 ++++++++++--------- .../MainMapCustomTabButtonViewModel.swift | 4 +- .../DefaultFriendsListCoordinator.swift | 1 - .../{Caller.swift => FriendListCaller.swift} | 2 +- .../ViewModel/FriendsListViewModel.swift | 4 +- TWTW/TWTW/Map/DefaultMainMapCoordinator.swift | 13 ++- .../DefaultParticipantsCoordinator.swift | 45 ++------- .../DefaultPartiGetLocationCoordinator.swift | 3 +- .../PartiSetLocationCoordinator.swift | 10 -- .../Set/SetParicipants/Text.swift | 1 - .../View/ParticipantsViewController.swift | 40 +++----- .../ViewModel/ParticipantsGetViewModel.swift | 34 ------- .../ViewModel/ParticipantsSetViewModel.swift | 42 --------- .../ViewModel/ParticipantsViewModel.swift | 28 ++++-- TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift | 34 ++++++- .../DefaultPlansFromAlertCoordinator.swift} | 22 ++--- .../FromAlert/PlanFromAlertCoordinator.swift | 10 ++ .../PlansFromAlertViewController.swift} | 13 +-- .../FromAlert/PlansFromAlertViewModel.swift} | 31 +++---- TWTW/TWTW/Plan/PlanCaller.swift | 13 +++ ...roller.swift => PlansViewController.swift} | 52 ++++++++++- TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift | 46 ++++++++++ .../SearchPlaceBottomSheetViewModel.swift | 6 +- 23 files changed, 285 insertions(+), 261 deletions(-) rename TWTW/TWTW/FriendsList/{Caller.swift => FriendListCaller.swift} (86%) delete mode 100644 TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationCoordinator.swift delete mode 100644 TWTW/TWTW/Participants/Set/SetParicipants/Text.swift delete mode 100644 TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift delete mode 100644 TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift rename TWTW/TWTW/{Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift => Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift} (50%) create mode 100644 TWTW/TWTW/Plan/FromAlert/PlanFromAlertCoordinator.swift rename TWTW/TWTW/{Participants/Set/SetParicipants/PartiSetLocationViewController.swift => Plan/FromAlert/PlansFromAlertViewController.swift} (95%) rename TWTW/TWTW/{Participants/Set/SetParicipants/PartiSetLocationViewModel.swift => Plan/FromAlert/PlansFromAlertViewModel.swift} (68%) create mode 100644 TWTW/TWTW/Plan/PlanCaller.swift rename TWTW/TWTW/Plan/View/{PlanViewController.swift => PlansViewController.swift} (53%) create mode 100644 TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index 299ce675..abe74614 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -14,8 +14,7 @@ 371C1D332ADBB00300B30DC5 /* DefaultCallCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D322ADBB00300B30DC5 /* DefaultCallCoordinator.swift */; }; 371ECB832B2ECAF5005174FF /* PartiMeetingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */; }; 371ECB852B2ECAFD005174FF /* PartiMeetingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */; }; - 371ECB872B2EE381005174FF /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB862B2EE381005174FF /* Text.swift */; }; - 371ECB892B2EF20D005174FF /* Caller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB882B2EF20D005174FF /* Caller.swift */; }; + 371ECB892B2EF20D005174FF /* FriendListCaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB882B2EF20D005174FF /* FriendListCaller.swift */; }; 371ECB8B2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB8A2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift */; }; 372109F82B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372109F72B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift */; }; 372109FC2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372109FB2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift */; }; @@ -61,7 +60,7 @@ 377CB05B2AD8666F003453D6 /* GroupCoordinatorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377CB05A2AD8666F003453D6 /* GroupCoordinatorProtocol.swift */; }; 377CB0612AD8699C003453D6 /* MainMapCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377CB0602AD8699C003453D6 /* MainMapCoordinator.swift */; }; 3788AEB82B18DCF4007FC2F6 /* PlanCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AEB72B18DCF4007FC2F6 /* PlanCoordinator.swift */; }; - 3788AEBA2B18DD0A007FC2F6 /* PlanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AEB92B18DD0A007FC2F6 /* PlanViewController.swift */; }; + 3788AEBA2B18DD0A007FC2F6 /* PlansViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AEB92B18DD0A007FC2F6 /* PlansViewController.swift */; }; 3788AEBE2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AEBD2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift */; }; 378FD2A72B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378FD2A62B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift */; }; 378FD2A92B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378FD2A82B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift */; }; @@ -91,20 +90,20 @@ 37D5D78D2B19E81F00302EAD /* ChangeLocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D5D78C2B19E81F00302EAD /* ChangeLocationViewController.swift */; }; 37D5D78F2B19EAEB00302EAD /* PlanTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D5D78E2B19EAEB00302EAD /* PlanTableViewCell.swift */; }; 37D5D7912B19ECF300302EAD /* Plan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D5D7902B19ECF300302EAD /* Plan.swift */; }; + 37D71E3B2B2F42130004188A /* PlanCaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E3A2B2F42130004188A /* PlanCaller.swift */; }; + 37D71E3D2B2F43510004188A /* PlansViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E3C2B2F43510004188A /* PlansViewModel.swift */; }; + 37D71E432B2F687B0004188A /* DefaultPlansFromAlertCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E422B2F687B0004188A /* DefaultPlansFromAlertCoordinator.swift */; }; + 37D71E452B2F689E0004188A /* PlansFromAlertViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E442B2F689E0004188A /* PlansFromAlertViewController.swift */; }; + 37D71E472B2F68D30004188A /* PlanFromAlertCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E462B2F68D30004188A /* PlanFromAlertCoordinator.swift */; }; + 37D71E492B2F68F70004188A /* PlansFromAlertViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E482B2F68F70004188A /* PlansFromAlertViewModel.swift */; }; 37E0D8AD2B180804002E0CF5 /* ParticipantsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8AC2B180804002E0CF5 /* ParticipantsViewController.swift */; }; 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */; }; 37E0D8B42B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */; }; 37E1B8312B2D94690047C7C7 /* ParticipantsSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8302B2D94690047C7C7 /* ParticipantsSource.swift */; }; - 37E1B8332B2D94950047C7C7 /* ParticipantsGetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8322B2D94950047C7C7 /* ParticipantsGetViewModel.swift */; }; - 37E1B8352B2D94A20047C7C7 /* ParticipantsSetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8342B2D94A20047C7C7 /* ParticipantsSetViewModel.swift */; }; 37E1B8372B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */; }; - 37E1B8392B2D96880047C7C7 /* PartiSetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8382B2D96880047C7C7 /* PartiSetLocationCoordinator.swift */; }; 37E1B83B2B2D970F0047C7C7 /* PartiGetLocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */; }; - 37E1B83D2B2D97170047C7C7 /* PartiSetLocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83C2B2D97170047C7C7 /* PartiSetLocationViewController.swift */; }; 37E1B83F2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */; }; - 37E1B8412B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8402B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift */; }; 37E1B8432B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8422B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift */; }; - 37E1B8452B2DAD100047C7C7 /* PartiSetLocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8442B2DAD100047C7C7 /* PartiSetLocationViewModel.swift */; }; 37E9FBFB2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E9FBFA2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift */; }; 37E9FBFE2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E9FBFD2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift */; }; 37EF0CFB2AB85C2400D77B0A /* UIViewController+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37EF0CFA2AB85C2400D77B0A /* UIViewController+Ext.swift */; }; @@ -194,8 +193,7 @@ 371C1D322ADBB00300B30DC5 /* DefaultCallCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultCallCoordinator.swift; sourceTree = ""; }; 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiMeetingViewController.swift; sourceTree = ""; }; 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiMeetingViewModel.swift; sourceTree = ""; }; - 371ECB862B2EE381005174FF /* Text.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Text.swift; sourceTree = ""; }; - 371ECB882B2EF20D005174FF /* Caller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Caller.swift; sourceTree = ""; }; + 371ECB882B2EF20D005174FF /* FriendListCaller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendListCaller.swift; sourceTree = ""; }; 371ECB8A2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendsListCoordinatorDelegate.swift; sourceTree = ""; }; 372109F72B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlaceMapViewModelUnitTests.swift; sourceTree = ""; }; 372109FB2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSearchPlacesMapService.swift; sourceTree = ""; }; @@ -239,7 +237,7 @@ 377CB05A2AD8666F003453D6 /* GroupCoordinatorProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupCoordinatorProtocol.swift; sourceTree = ""; }; 377CB0602AD8699C003453D6 /* MainMapCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCoordinator.swift; sourceTree = ""; }; 3788AEB72B18DCF4007FC2F6 /* PlanCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanCoordinator.swift; sourceTree = ""; }; - 3788AEB92B18DD0A007FC2F6 /* PlanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanViewController.swift; sourceTree = ""; }; + 3788AEB92B18DD0A007FC2F6 /* PlansViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlansViewController.swift; sourceTree = ""; }; 3788AEBD2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsPlansCoordinator.swift; sourceTree = ""; }; 378FD2A62B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultMakeNewMeetingCoordinator.swift; sourceTree = ""; }; 378FD2A82B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewMeetingCoordinator.swift; sourceTree = ""; }; @@ -270,20 +268,20 @@ 37D5D78C2B19E81F00302EAD /* ChangeLocationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeLocationViewController.swift; sourceTree = ""; }; 37D5D78E2B19EAEB00302EAD /* PlanTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanTableViewCell.swift; sourceTree = ""; }; 37D5D7902B19ECF300302EAD /* Plan.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Plan.swift; sourceTree = ""; }; + 37D71E3A2B2F42130004188A /* PlanCaller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanCaller.swift; sourceTree = ""; }; + 37D71E3C2B2F43510004188A /* PlansViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlansViewModel.swift; sourceTree = ""; }; + 37D71E422B2F687B0004188A /* DefaultPlansFromAlertCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPlansFromAlertCoordinator.swift; sourceTree = ""; }; + 37D71E442B2F689E0004188A /* PlansFromAlertViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlansFromAlertViewController.swift; sourceTree = ""; }; + 37D71E462B2F68D30004188A /* PlanFromAlertCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanFromAlertCoordinator.swift; sourceTree = ""; }; + 37D71E482B2F68F70004188A /* PlansFromAlertViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlansFromAlertViewModel.swift; sourceTree = ""; }; 37E0D8AC2B180804002E0CF5 /* ParticipantsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsViewController.swift; sourceTree = ""; }; 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsCoordinator.swift; sourceTree = ""; }; 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultParticipantsCoordinator.swift; sourceTree = ""; }; 37E1B8302B2D94690047C7C7 /* ParticipantsSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsSource.swift; sourceTree = ""; }; - 37E1B8322B2D94950047C7C7 /* ParticipantsGetViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsGetViewModel.swift; sourceTree = ""; }; - 37E1B8342B2D94A20047C7C7 /* ParticipantsSetViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsSetViewModel.swift; sourceTree = ""; }; 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationCoordinator.swift; sourceTree = ""; }; - 37E1B8382B2D96880047C7C7 /* PartiSetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiSetLocationCoordinator.swift; sourceTree = ""; }; 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationViewController.swift; sourceTree = ""; }; - 37E1B83C2B2D97170047C7C7 /* PartiSetLocationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiSetLocationViewController.swift; sourceTree = ""; }; 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPartiGetLocationCoordinator.swift; sourceTree = ""; }; - 37E1B8402B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPartiSetLocationCoordinator.swift; sourceTree = ""; }; 37E1B8422B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationViewModel.swift; sourceTree = ""; }; - 37E1B8442B2DAD100047C7C7 /* PartiSetLocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiSetLocationViewModel.swift; sourceTree = ""; }; 37E9FBFA2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCustomTabButtonsView.swift; sourceTree = ""; }; 37E9FBFD2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCustomTabButtonViewModel.swift; sourceTree = ""; }; 37EF0CFA2AB85C2400D77B0A /* UIViewController+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Ext.swift"; sourceTree = ""; }; @@ -382,7 +380,6 @@ 371ECB812B2ECA9D005174FF /* Set */ = { isa = PBXGroup; children = ( - 37E1B82E2B2D94380047C7C7 /* SetParicipants */, 378FD2A12B2DFDBD00DFCE25 /* MakeNewMeeting */, 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */, 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */, @@ -557,11 +554,14 @@ 3788AEB12B18DC59007FC2F6 /* Plan */ = { isa = PBXGroup; children = ( + 37D71E3F2B2F43C00004188A /* FromAlert */, + 37D71E3E2B2F43B50004188A /* FromTabBar */, 3788AEB22B18DC66007FC2F6 /* Protocol */, 3788AEB42B18DC79007FC2F6 /* View */, 3788AEB62B18DC94007FC2F6 /* Model */, 3788AEB52B18DC7F007FC2F6 /* ViewModel */, 3788AEBD2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift */, + 37D71E3A2B2F42130004188A /* PlanCaller.swift */, ); path = Plan; sourceTree = ""; @@ -585,7 +585,7 @@ 3788AEB42B18DC79007FC2F6 /* View */ = { isa = PBXGroup; children = ( - 3788AEB92B18DD0A007FC2F6 /* PlanViewController.swift */, + 3788AEB92B18DD0A007FC2F6 /* PlansViewController.swift */, 37D5D78E2B19EAEB00302EAD /* PlanTableViewCell.swift */, ); path = View; @@ -594,6 +594,7 @@ 3788AEB52B18DC7F007FC2F6 /* ViewModel */ = { isa = PBXGroup; children = ( + 37D71E3C2B2F43510004188A /* PlansViewModel.swift */, ); path = ViewModel; sourceTree = ""; @@ -644,7 +645,7 @@ 3B20E1E22AE41E81009572AA /* Protocol */, 3B76F0922AF9D05C00B2BD1D /* View */, 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */, - 371ECB882B2EF20D005174FF /* Caller.swift */, + 371ECB882B2EF20D005174FF /* FriendListCaller.swift */, ); path = FriendsList; sourceTree = ""; @@ -672,8 +673,6 @@ 37BB02F72B230E93006B2BEB /* ViewModel */ = { isa = PBXGroup; children = ( - 37E1B8322B2D94950047C7C7 /* ParticipantsGetViewModel.swift */, - 37E1B8342B2D94A20047C7C7 /* ParticipantsSetViewModel.swift */, 37BB02F82B230EA8006B2BEB /* ParticipantsViewModel.swift */, ); path = ViewModel; @@ -897,6 +896,24 @@ path = ChangeLocation; sourceTree = ""; }; + 37D71E3E2B2F43B50004188A /* FromTabBar */ = { + isa = PBXGroup; + children = ( + ); + path = FromTabBar; + sourceTree = ""; + }; + 37D71E3F2B2F43C00004188A /* FromAlert */ = { + isa = PBXGroup; + children = ( + 37D71E422B2F687B0004188A /* DefaultPlansFromAlertCoordinator.swift */, + 37D71E442B2F689E0004188A /* PlansFromAlertViewController.swift */, + 37D71E462B2F68D30004188A /* PlanFromAlertCoordinator.swift */, + 37D71E482B2F68F70004188A /* PlansFromAlertViewModel.swift */, + ); + path = FromAlert; + sourceTree = ""; + }; 37E0D8AB2B1807E0002E0CF5 /* Participants */ = { isa = PBXGroup; children = ( @@ -928,18 +945,6 @@ path = Protocol; sourceTree = ""; }; - 37E1B82E2B2D94380047C7C7 /* SetParicipants */ = { - isa = PBXGroup; - children = ( - 37E1B8442B2DAD100047C7C7 /* PartiSetLocationViewModel.swift */, - 37E1B8382B2D96880047C7C7 /* PartiSetLocationCoordinator.swift */, - 37E1B83C2B2D97170047C7C7 /* PartiSetLocationViewController.swift */, - 37E1B8402B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift */, - 371ECB862B2EE381005174FF /* Text.swift */, - ); - path = SetParicipants; - sourceTree = ""; - }; 37E1B82F2B2D944B0047C7C7 /* GetParicipants */ = { isa = PBXGroup; children = ( @@ -1617,7 +1622,6 @@ 3799E5072A99D70500E06218 /* FriendsListViewController.swift in Sources */, 371ECB8B2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift in Sources */, 3B274D762AD4541E00D79698 /* SignInCoordinatorFinishDelegate.swift in Sources */, - 37E1B8352B2D94A20047C7C7 /* ParticipantsSetViewModel.swift in Sources */, 3B4A660C2B161D8200DF9C84 /* CreateGroupViewModel.swift in Sources */, 375E8B022A95FCB000F8DE42 /* NearbyPlacesCollectionViewCell.swift in Sources */, 3799E5092A99D72D00E06218 /* NotificationViewController.swift in Sources */, @@ -1630,15 +1634,16 @@ 3759165E2A80AEE000C21E1F /* KeychainWrapper.swift in Sources */, 3B4A66042B160C7900DF9C84 /* Group.swift in Sources */, 3B1850B02AB5C939001945EE /* Domain.swift in Sources */, + 37D71E432B2F687B0004188A /* DefaultPlansFromAlertCoordinator.swift in Sources */, 3BAA4A192ADC1DEA009D14E7 /* SignUpProtocol.swift in Sources */, 3BB85C012B19B4B800F8BBF3 /* FriendService.swift in Sources */, - 3788AEBA2B18DD0A007FC2F6 /* PlanViewController.swift in Sources */, + 3788AEBA2B18DD0A007FC2F6 /* PlansViewController.swift in Sources */, 3737AE8C2AE93EE600FE7453 /* DefaultSearchPlacesMapCoordinator.swift in Sources */, 3737AE8D2AE93EE600FE7453 /* SearchPlacesMapViewModel.swift in Sources */, - 37E1B8452B2DAD100047C7C7 /* PartiSetLocationViewModel.swift in Sources */, 3737AE902AE93EE600FE7453 /* SearchPlaceProtocol.swift in Sources */, 37BB03052B2311DA006B2BEB /* ChangeLocationCoordinator.swift in Sources */, 3B6CF3D92ADACA7500325D05 /* MockSignInService.swift in Sources */, + 37D71E3D2B2F43510004188A /* PlansViewModel.swift in Sources */, 3BC8D6A22B0F0F0A00BE22EF /* RouteService.swift in Sources */, 3767544C2B1C3AC1006DFF6E /* FriendsListViewModel.swift in Sources */, 376754472B1C2E3E006DFF6E /* DefaultGroupCoordinator.swift in Sources */, @@ -1656,15 +1661,15 @@ 3B20E1E12AE41E4D009572AA /* CallCoordinator.swift in Sources */, 37C35EE52B1CC8A6008A289D /* DefaultMakeNewFriendsListCoordinator.swift in Sources */, 3BC8D6A42B0F0F3700BE22EF /* RouteProtocol.swift in Sources */, - 37E1B83D2B2D97170047C7C7 /* PartiSetLocationViewController.swift in Sources */, 377CB0592AD8665E003453D6 /* GroupViewModel.swift in Sources */, - 371ECB892B2EF20D005174FF /* Caller.swift in Sources */, + 371ECB892B2EF20D005174FF /* FriendListCaller.swift in Sources */, 3B274D7B2AD4CFDA00D79698 /* SignUpCoordinatorFinishDelegate.swift in Sources */, 3760CC8C2AE2C0E800CFC2D5 /* SurroundSearchService.swift in Sources */, 3799E5022A99D68500E06218 /* CallViewController.swift in Sources */, 374DB46A2B24834700AF648C /* TabBar.swift in Sources */, 37BB02FF2B23117E006B2BEB /* ChangeLocationViewModel.swift in Sources */, 3B1C36EC2A8FD0BE00838682 /* Map.swift in Sources */, + 37D71E472B2F68D30004188A /* PlanFromAlertCoordinator.swift in Sources */, 3772041C2B27045E00FE20A9 /* SearchPlaceBottomSheet.swift in Sources */, 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */, 37C733752B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift in Sources */, @@ -1683,10 +1688,10 @@ 37D5D7872B19CEA100302EAD /* Participants.swift in Sources */, 371C1D312ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift in Sources */, 3B9693DE2B176DED001DDAE8 /* FriendListTableViewCell.swift in Sources */, + 37D71E452B2F689E0004188A /* PlansFromAlertViewController.swift in Sources */, 37E9FBFE2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift in Sources */, 3B20E1E62AE41E97009572AA /* FriendsListCoordinatorProtocol.swift in Sources */, 378FD2A92B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift in Sources */, - 37E1B8392B2D96880047C7C7 /* PartiSetLocationCoordinator.swift in Sources */, 37F903A82AF9BD88008120B6 /* Header.swift in Sources */, 3760CC8F2AE2CB7800CFC2D5 /* SurroundSearchPlaces.swift in Sources */, 37CCCC392B1C8FB3003710DB /* MakeNewFriendsListViewController.swift in Sources */, @@ -1700,7 +1705,6 @@ 37C35EE32B1CC876008A289D /* MakeNewFriendsListCoordinator.swift in Sources */, 3758F1B72A7DFB6200E2933C /* Bundle+Ext.swift in Sources */, 37BB02F92B230EA8006B2BEB /* ParticipantsViewModel.swift in Sources */, - 37E1B8332B2D94950047C7C7 /* ParticipantsGetViewModel.swift in Sources */, 3BB85C092B19D39200F8BBF3 /* FriendSearchCoordinatorProtocol.swift in Sources */, 3758F18C2A7D007200E2933C /* AppDelegate.swift in Sources */, 3788AEB82B18DCF4007FC2F6 /* PlanCoordinator.swift in Sources */, @@ -1728,12 +1732,14 @@ 37F903A62AF9BD2F008120B6 /* EncodedQuery.swift in Sources */, 37571BFC2A8619CB0069AC65 /* MainMapViewController.swift in Sources */, 37C07E9D2B281C7E00253438 /* ViewState.swift in Sources */, + 37D71E3B2B2F42130004188A /* PlanCaller.swift in Sources */, 371C1D2D2ADBAFA900B30DC5 /* DefaultNotificationCoordinator.swift in Sources */, 374EAEAA2B2600B400BAA897 /* TabBarNavigationControllerDelegate.swift in Sources */, 37BB03032B231198006B2BEB /* DefaultChangeLocationCoordinator.swift in Sources */, 3B4A660A2B161D1600DF9C84 /* CreateGroupViewController.swift in Sources */, 3BB85C032B19B4E200F8BBF3 /* FriendProtocol.swift in Sources */, 371ECB832B2ECAF5005174FF /* PartiMeetingViewController.swift in Sources */, + 37D71E492B2F68F70004188A /* PlansFromAlertViewModel.swift in Sources */, 3799E4F12A99C4D100E06218 /* DefaultAppCoordinator.swift in Sources */, 3737AE8F2AE93EE600FE7453 /* SearchPlacesMapViewController.swift in Sources */, 3B274D842AD5207100D79698 /* SignUpService.swift in Sources */, @@ -1745,8 +1751,6 @@ 3B274D802AD4D2E200D79698 /* SignUpCoordinatorProtocol.swift in Sources */, 37E1B8372B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift in Sources */, 37C198C32B2760C000D68196 /* MapViewModelProtocol.swift in Sources */, - 371ECB872B2EE381005174FF /* Text.swift in Sources */, - 37E1B8412B2DA3060047C7C7 /* DefaultPartiSetLocationCoordinator.swift in Sources */, 371C1D2F2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift in Sources */, 37CE1EAF2AE75813009CDA21 /* SearchPlace.swift in Sources */, 371ECB852B2ECAFD005174FF /* PartiMeetingViewModel.swift in Sources */, diff --git a/TWTW/TWTW/CustomTabButton/MainMapCustomTabButtonViewModel.swift b/TWTW/TWTW/CustomTabButton/MainMapCustomTabButtonViewModel.swift index 5e8b1492..c2310c99 100644 --- a/TWTW/TWTW/CustomTabButton/MainMapCustomTabButtonViewModel.swift +++ b/TWTW/TWTW/CustomTabButton/MainMapCustomTabButtonViewModel.swift @@ -27,7 +27,7 @@ final class MainMapCustomTabButtonViewModel { func bind(input: Input) { input.participantsButtonTapped .subscribe(onNext: { [weak self] in - self?.participantsButtonTapped() + self?.plansButtonTapped() }) .disposed(by: disposeBag) @@ -39,7 +39,7 @@ final class MainMapCustomTabButtonViewModel { } /// 친구화면으로 이동 - private func participantsButtonTapped() { + private func plansButtonTapped() { coordinator?.moveToParticipantsList() } diff --git a/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift b/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift index 35b01090..d23e2327 100644 --- a/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift +++ b/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift @@ -48,7 +48,6 @@ final class DefaultFriendsListCoordinator: FriendsListCoordinatorProtocol { /// 새로운 친구추가 화면으로 이동 func makeNewFriends() { - let defaultMakeNewFriendsListCoordinator = DefaultMakeNewFriendsListCoordinator(navigationController: navigationController) childCoordinators.append(defaultMakeNewFriendsListCoordinator) defaultMakeNewFriendsListCoordinator.start() diff --git a/TWTW/TWTW/FriendsList/Caller.swift b/TWTW/TWTW/FriendsList/FriendListCaller.swift similarity index 86% rename from TWTW/TWTW/FriendsList/Caller.swift rename to TWTW/TWTW/FriendsList/FriendListCaller.swift index 9ae2abb7..6eb5f343 100644 --- a/TWTW/TWTW/FriendsList/Caller.swift +++ b/TWTW/TWTW/FriendsList/FriendListCaller.swift @@ -7,7 +7,7 @@ import Foundation -enum Caller { +enum FriendListCaller { case fromPartiSetLocation case fromTabBar } diff --git a/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift b/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift index 1de5a2ee..5c463ff2 100644 --- a/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift +++ b/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift @@ -15,7 +15,7 @@ final class FriendsListViewModel { var coordinator: DefaultFriendsListCoordinator private let friendService: FriendProtocol private let disposeBag = DisposeBag() - private let caller: Caller + private let caller: FriendListCaller struct Input { let searchBarEvents: Observable? @@ -30,7 +30,7 @@ final class FriendsListViewModel { } // MARK: - init - init(coordinator: DefaultFriendsListCoordinator, friendService: FriendProtocol, caller: Caller = .fromTabBar) { + init(coordinator: DefaultFriendsListCoordinator, friendService: FriendProtocol, caller: FriendListCaller = .fromTabBar) { self.coordinator = coordinator self.friendService = friendService self.caller = caller diff --git a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift index 5c39498b..c155a89e 100644 --- a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift +++ b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift @@ -43,17 +43,16 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { childCoordinators.append(searchPlacesMapCoordinator) } /// 친구 목록 화면으로 이동 - /// get func moveToParticipantsList() { - let participantsCoordinator = DefaultParticipantsCoordinator(navigationController: navigationController) + let participantsCoordinator = DefaultsParticipantsCoordinator(navigationController: navigationController) participantsCoordinator.start() childCoordinators.append(participantsCoordinator) } - /// set - func moveToParticipantsSetList(from source: ParticipantsSource) { - let participantsCoordinator = DefaultParticipantsCoordinator(navigationController: navigationController) - participantsCoordinator.startWithViewModel(from: source) - childCoordinators.append(participantsCoordinator) + + func moveToPlanFromAlert(from source: PlanCaller) { + let plansCoordinator = DefaultPlansCoordinator(navigationController: navigationController) + plansCoordinator.startFromAlert() + childCoordinators.append(plansCoordinator) } /// 알림 화면으로 이동 diff --git a/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift index 3362a1e6..e771e860 100644 --- a/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift +++ b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift @@ -8,7 +8,7 @@ import Foundation import UIKit -final class DefaultParticipantsCoordinator: ParticipantsCoordinator { +final class DefaultsParticipantsCoordinator: ParticipantsCoordinator { var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController @@ -18,42 +18,15 @@ final class DefaultParticipantsCoordinator: ParticipantsCoordinator { } func start() { - let participantsViewModel = ParticipantsGetViewModel(coordinator: self) - let participantsViewController = ParticipantsViewController(viewModel: participantsViewModel) - - navigationController.pushViewController(participantsViewController, animated: true) + let participantsViewModel = ParticipantsViewModel(coordinator: self) + let participantsVC = ParticipantsViewController(viewModel: participantsViewModel) + navigationController.pushViewController(participantsVC, animated: false) } - func startWithViewModel(from source: ParticipantsSource) { - let viewModel: PartiLocationViewModel - - switch source { - case .get: - viewModel = ParticipantsGetViewModel(coordinator: self) - - case .set: - viewModel = ParticipantsSetViewModel(coordinator: self) - } - - let participantsViewController = ParticipantsViewController(viewModel: viewModel) - navigationController.pushViewController(participantsViewController, animated: true) - } - - func moveToPartiGetLocation() { - let partiGetLocationCoordinator = DefaultPartiGetLocationCoordinator(navigationController: navigationController) - partiGetLocationCoordinator.start() - childCoordinators.append(partiGetLocationCoordinator) - } - - func moveToPartiSetLocation() { - let partiSetLocationCoordinator = DefaultPartiSetLocationCoordinator(navigationController: navigationController) - partiSetLocationCoordinator.start() - childCoordinators.append(partiSetLocationCoordinator) - } - - func moveToMakeNewMeeting() { - let makeNewMeetingCoordinator = DefaultMakeNewMeetingCoordinator(navigationController: navigationController) - makeNewMeetingCoordinator.start() - childCoordinators.append(makeNewMeetingCoordinator) + /// 선택한 사람 장소 바꾸기 + func moveToChangeLocation() { + let changeLocationCoordinator = DefaultChangeLocationCoordinator(navigationController: navigationController) + changeLocationCoordinator.start() + childCoordinators.append(changeLocationCoordinator) } } diff --git a/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift b/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift index 2a856440..e7afec6c 100644 --- a/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift +++ b/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift @@ -23,8 +23,7 @@ final class DefaultPartiGetLocationCoordinator: PartiGetLocationCoordinator { let partiGetLocationViewModel = PartiGetLocationViewModel(coordinator: self) let partiGetLocationVC = PartiGetLocationViewController(viewModel: partiGetLocationViewModel) - navigationController.pushViewController(partiGetLocationVC, animated: false) + navigationController.pushViewController(partiGetLocationVC, animated: true) } - } diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationCoordinator.swift b/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationCoordinator.swift deleted file mode 100644 index fdaf3918..00000000 --- a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationCoordinator.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// PartiSetLocationCoordinator.swift -// TWTW -// -// Created by 박다미 on 2023/12/16. -// - -import Foundation - -protocol PartiSetLocationCoordinator: Coordinator {} diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/Text.swift b/TWTW/TWTW/Participants/Set/SetParicipants/Text.swift deleted file mode 100644 index 8b137891..00000000 --- a/TWTW/TWTW/Participants/Set/SetParicipants/Text.swift +++ /dev/null @@ -1 +0,0 @@ - diff --git a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift index cc70422c..566df507 100644 --- a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift +++ b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift @@ -28,8 +28,7 @@ final class ParticipantsViewController: UIViewController { locationImage: UIImage(systemName: "map")) ] private let disposeBag = DisposeBag() - private var viewModel: PartiLocationViewModel - private let addButtonTappedSubject = PublishSubject() + private var viewModel: ParticipantsViewModel private lazy var partiTableView: UITableView = { let tableView = UITableView() @@ -37,12 +36,11 @@ final class ParticipantsViewController: UIViewController { }() // MARK: - Init - init(viewModel: PartiLocationViewModel) { + init(viewModel: ParticipantsViewModel) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) } - @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") @@ -51,9 +49,10 @@ final class ParticipantsViewController: UIViewController { // MARK: View Did Load override func viewDidLoad() { super.viewDidLoad() + view.backgroundColor = .orange + view.layer.cornerRadius = 20 setupTableView() bindTableView() - setupNavigationItem() } private func setupTableView() { @@ -87,30 +86,13 @@ final class ParticipantsViewController: UIViewController { .disposed(by: cell.disposeBag) } .disposed(by: disposeBag) - // 셀 선택 - if let getViewModel = viewModel as? ParticipantsGetViewModel { - let selectedPlace = partiTableView.rx.modelSelected(Participant.self).asObservable() - - let input = ParticipantsGetViewModel.Input(selectedPlace: selectedPlace) - getViewModel.bind(input: input) - } - if let setViewModel = viewModel as? ParticipantsSetViewModel { - let selectedPlace = partiTableView.rx.modelSelected(Participant.self).asObservable() - let input = ParticipantsSetViewModel.Input(selectedPlace: selectedPlace, addButtonTapped: addButtonTappedSubject.asObservable()) - setViewModel.bind(input: input) - } - } - - private func setupNavigationItem() { - if viewModel is ParticipantsGetViewModel { - navigationItem.rightBarButtonItem = nil - } else if viewModel is ParticipantsSetViewModel { - let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: nil) - navigationItem.rightBarButtonItem = addButton - addButton.rx.tap - .bind(to: addButtonTappedSubject) - .disposed(by: disposeBag) - } + /// 셀 선택 이벤트 처리 + let changeLocationTapped = partiTableView.rx.itemSelected + .map { _ in () } + .asObservable() + + let input = ParticipantsViewModel.Input(changeLocationButtonTapped: changeLocationTapped) + viewModel.bind(input: input) } } diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift deleted file mode 100644 index 824a2d66..00000000 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsGetViewModel.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// PartiGetLocationViewModel.swift -// TWTW -// -// Created by 박다미 on 2023/12/16. -// - -import RxSwift -import UIKit - -final class ParticipantsGetViewModel: PartiLocationViewModel { - private let disposeBag = DisposeBag() - - struct Input { - let selectedPlace: Observable - } - - // MARK: - Init - init(coordinator: DefaultParticipantsCoordinator) { - super.init() - self.coordinator = coordinator - } - - func bind(input: Input) { - input.selectedPlace - .bind(onNext: { [weak self] _ in - guard let self = self, let coordinator = self.coordinator else { return } - coordinator.moveToPartiGetLocation() - - }) - .disposed(by: disposeBag) - - } -} diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift deleted file mode 100644 index d23ffe11..00000000 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsSetViewModel.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// PartiSetLocationViewModel.swift -// TWTW -// -// Created by 박다미 on 2023/12/16. -// - -import RxSwift -import UIKit - -final class ParticipantsSetViewModel: PartiLocationViewModel { - private let disposeBag = DisposeBag() - - struct Input { - let selectedPlace: Observable - let addButtonTapped: Observable - - } - - // MARK: - Init - init(coordinator: DefaultParticipantsCoordinator) { - super.init() - self.coordinator = coordinator - } - - func bind(input: Input) { - input.selectedPlace - .bind(onNext: { [weak self] _ in - guard let self = self else { return } - coordinator?.moveToPartiSetLocation() - - }) - .disposed(by: disposeBag) - - input.addButtonTapped - .bind(onNext: { [weak self] in - self?.coordinator?.moveToMakeNewMeeting() - }) - .disposed(by: disposeBag) - } - -} diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift index ff115fa7..f11b1323 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift @@ -11,16 +11,28 @@ import RxSwift final class ParticipantsViewModel { private let disposeBag = DisposeBag() - weak var coordinator: DefaultParticipantsCoordinator? - + weak var coordinator: DefaultsParticipantsCoordinator? + + /// Input + struct Input { + let changeLocationButtonTapped: Observable + } // MARK: - Init - init(coordinator: DefaultParticipantsCoordinator) { + init(coordinator: DefaultsParticipantsCoordinator) { self.coordinator = coordinator } -} - -class PartiLocationViewModel { - weak var coordinator: DefaultParticipantsCoordinator? - + + /// bind + func bind(input: Input) { + input.changeLocationButtonTapped + .subscribe(onNext: {[weak self] in + self?.changeLocationButtonTapped() + }) + .disposed(by: disposeBag) + } + /// 화면이동 + private func changeLocationButtonTapped() { + coordinator?.moveToChangeLocation() + } } diff --git a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift index 68fcdc09..3524591e 100644 --- a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift +++ b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift @@ -12,13 +12,41 @@ final class DefaultPlansCoordinator: PlanCoordinator { var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController - private lazy var planVC = PlanViewController() init(navigationController: UINavigationController) { self.navigationController = navigationController } func start() { - planVC = PlanViewController() - navigationController.pushViewController(planVC, animated: false) + let plansViewModel = PlansViewModel(coordinator: self) + let plansViewController = PlansViewController(viewModel: plansViewModel) + + navigationController.pushViewController(plansViewController, animated: true) + } + func startFromAlert() { + let plansViewModel = PlansViewModel( + coordinator: self, + caller: .fromAlert + ) + let plansViewController = PlansViewController(viewModel: plansViewModel) + + navigationController.pushViewController(plansViewController, animated: false) + + } + + func moveToPartiGetLocation() { + let partiGetLocationCoordinator = DefaultPartiGetLocationCoordinator(navigationController: navigationController) + partiGetLocationCoordinator.start() + childCoordinators.append(partiGetLocationCoordinator) + } + + func moveToPartiSetLocation() { + let plansFromAlertCoordinator = DefaultPlansFromAlertCoordinator(navigationController: navigationController) + plansFromAlertCoordinator.start() + childCoordinators.append(plansFromAlertCoordinator) + } + func addPlans() { + let plansCoordinator = DefaultPlansCoordinator(navigationController: navigationController) + childCoordinators.append(plansCoordinator) + plansCoordinator.startFromAlert() } } diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift similarity index 50% rename from TWTW/TWTW/Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift rename to TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift index e0fd385a..54185e2b 100644 --- a/TWTW/TWTW/Participants/Set/SetParicipants/DefaultPartiSetLocationCoordinator.swift +++ b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift @@ -1,31 +1,31 @@ // -// DefaultPartiSetLocationCoordinator.swift +// DefaultPlansFromAlertCoordinator.swift // TWTW // -// Created by 박다미 on 2023/12/16. +// Created by 박다미 on 2023/12/18. // import Foundation import UIKit -final class DefaultPartiSetLocationCoordinator: PartiSetLocationCoordinator { +final class DefaultPlansFromAlertCoordinator: PlanFromAlertCoordinator { var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController - private var partiSetLocationViewModel: PartiSetLocationViewModel? + private var plansFromAlertViewModel: PlansFromAlertViewModel? // MARK: - Init init(navigationController: UINavigationController) { self.navigationController = navigationController - partiSetLocationViewModel = PartiSetLocationViewModel(coordinator: self) + plansFromAlertViewModel = PlansFromAlertViewModel(coordinator: self) } func start() { - let viewModel = PartiSetLocationViewModel(coordinator: self) - self.partiSetLocationViewModel = viewModel - let partiSetLocationVC = PartiSetLocationViewController(viewModel: viewModel) - navigationController.pushViewController(partiSetLocationVC, animated: false) + let viewModel = PlansFromAlertViewModel(coordinator: self) + self.plansFromAlertViewModel = viewModel + let plansFromAlertViewController = PlansFromAlertViewController(viewModel: viewModel) + navigationController.pushViewController(plansFromAlertViewController, animated: false) } /// 친구추가 화면으로 이동 @@ -38,8 +38,8 @@ final class DefaultPartiSetLocationCoordinator: PartiSetLocationCoordinator { } -extension DefaultPartiSetLocationCoordinator: FriendsSendListCoordinatorDelegate { +extension DefaultPlansFromAlertCoordinator: FriendsSendListCoordinatorDelegate { func didSelectFriends(_ friends: [Friend]) { - partiSetLocationViewModel?.updateSelectedFriends(friends) + plansFromAlertViewModel?.updateSelectedFriends(friends) } } diff --git a/TWTW/TWTW/Plan/FromAlert/PlanFromAlertCoordinator.swift b/TWTW/TWTW/Plan/FromAlert/PlanFromAlertCoordinator.swift new file mode 100644 index 00000000..ecaed1d2 --- /dev/null +++ b/TWTW/TWTW/Plan/FromAlert/PlanFromAlertCoordinator.swift @@ -0,0 +1,10 @@ +// +// PlanFromAlertCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/18. +// + +import Foundation + +protocol PlanFromAlertCoordinator: Coordinator {} diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift similarity index 95% rename from TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift rename to TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift index 8648dca7..cf88e8c2 100644 --- a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewController.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift @@ -1,8 +1,8 @@ // -// PartiSetLocationViewController.swift +// PlansFromAlertViewController.swift // TWTW // -// Created by 박다미 on 2023/12/16. +// Created by 박다미 on 2023/12/18. // import RxCocoa @@ -10,9 +10,9 @@ import RxSwift import SnapKit import UIKit -final class PartiSetLocationViewController: UIViewController { +final class PlansFromAlertViewController: UIViewController { private let disposeBag = DisposeBag() - private var viewModel: PartiSetLocationViewModel + private var viewModel: PlansFromAlertViewModel private var tableViewHeightConstraint: Constraint? private lazy var selectedFriendsTableView: UITableView = { @@ -79,7 +79,7 @@ final class PartiSetLocationViewController: UIViewController { let contentView = UIView() // MARK: - Init - init(viewModel: PartiSetLocationViewModel) { + init(viewModel: PlansFromAlertViewModel) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) } @@ -164,7 +164,7 @@ final class PartiSetLocationViewController: UIViewController { } private func bind() { - let input = PartiSetLocationViewModel.Input(clickedAddParticipantsEvents: addParticipantsButton.rx.tap) + let input = PlansFromAlertViewModel.Input(clickedAddParticipantsEvents: addParticipantsButton.rx.tap) let output = viewModel.createOutput(input: input) @@ -231,3 +231,4 @@ final class PartiSetLocationViewController: UIViewController { return formatter.string(from: date) } } + diff --git a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift similarity index 68% rename from TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift rename to TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift index c8e33a9b..b4adc1c4 100644 --- a/TWTW/TWTW/Participants/Set/SetParicipants/PartiSetLocationViewModel.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift @@ -1,8 +1,8 @@ // -// PartiSetLocationViewModel.swift +// PlansFromAlertViewModel.swift // TWTW // -// Created by 박다미 on 2023/12/16. +// Created by 박다미 on 2023/12/18. // import RxCocoa @@ -10,25 +10,25 @@ import RxRelay import RxSwift import UIKit -final class PartiSetLocationViewModel { +final class PlansFromAlertViewModel { private let disposeBag = DisposeBag() - weak var coordinator: DefaultPartiSetLocationCoordinator? + weak var coordinator: DefaultPlansFromAlertCoordinator? // 선택된 친구 목록을 저장하는 Relay - private let selectedFriendsRelay = BehaviorRelay<[Friend]>(value: []) - - // 선택된 친구 목록을 외부에 공개하는 Observable - var selectedFriendsObservable: Observable<[Friend]> { - return selectedFriendsRelay.asObservable() - } - - + private let selectedFriendsRelay = BehaviorRelay<[Friend]>(value: []) + + // 선택된 친구 목록을 외부에 공개하는 Observable + var selectedFriendsObservable: Observable<[Friend]> { + return selectedFriendsRelay.asObservable() + } + + struct Input { // 1.달력버튼 클릭 // 2. 친구추가 버튼 클릭 let clickedAddParticipantsEvents: ControlEvent? // 3.저장 버튼 클릭 - // let clickedSaveEvents: ControlEvent? + // let clickedSaveEvents: ControlEvent? } struct Output { @@ -39,7 +39,7 @@ final class PartiSetLocationViewModel { // 3. } // MARK: - Init - init(coordinator: DefaultPartiSetLocationCoordinator) { + init(coordinator: DefaultPlansFromAlertCoordinator) { self.coordinator = coordinator } @@ -54,8 +54,7 @@ final class PartiSetLocationViewModel { moveAddPrticipants() } .disposed(by: disposeBag) - - return output + return output } func moveToSetLocationViewController() { diff --git a/TWTW/TWTW/Plan/PlanCaller.swift b/TWTW/TWTW/Plan/PlanCaller.swift new file mode 100644 index 00000000..c377317d --- /dev/null +++ b/TWTW/TWTW/Plan/PlanCaller.swift @@ -0,0 +1,13 @@ +// +// PlanCaller.swift +// TWTW +// +// Created by 박다미 on 2023/12/17. +// + +import Foundation + +enum PlanCaller { + case fromAlert + case fromTabBar + } diff --git a/TWTW/TWTW/Plan/View/PlanViewController.swift b/TWTW/TWTW/Plan/View/PlansViewController.swift similarity index 53% rename from TWTW/TWTW/Plan/View/PlanViewController.swift rename to TWTW/TWTW/Plan/View/PlansViewController.swift index c6642164..14d823f8 100644 --- a/TWTW/TWTW/Plan/View/PlanViewController.swift +++ b/TWTW/TWTW/Plan/View/PlansViewController.swift @@ -10,10 +10,15 @@ import RxSwift import UIKit /// PlanViewController - 일정 -final class PlanViewController: UIViewController { +final class PlansViewController: UIViewController { + + /// 친구 검색 버튼 + private lazy var rightItemButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: nil) /// sample let plans: [Plan] = [ + Plan(planTitle: "제목", plansubTitle: "부제목"), + Plan(planTitle: "제목", plansubTitle: "부제목"), Plan(planTitle: "제목", plansubTitle: "부제목"), Plan(planTitle: "제목", plansubTitle: "부제목"), Plan(planTitle: "제목", plansubTitle: "부제목"), @@ -26,31 +31,70 @@ final class PlanViewController: UIViewController { let tableView = UITableView() return tableView }() + private let disposeBag = DisposeBag() + var viewModel: PlansViewModel + + // MARK: - Init + + init(viewModel: PlansViewModel) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + setupCallerBinding() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } // MARK: View Did Load override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white - view.layer.cornerRadius = 20 + setupTableView() + addSubviews() bindTableView() + bind() } // MARK: Function /// setupTableView - table addSubView, register + private func setupCallerBinding() { + viewModel.callerObservable + .bind { [weak self] caller in + guard let self = self else { return } + if caller == .fromTabBar { + self.navigationItem.rightBarButtonItem = nil + } else if caller == .fromAlert { + self.navigationItem.rightBarButtonItem = self.rightItemButton + } + } + .disposed(by: disposeBag) + } private func setupTableView() { view.addSubview(planTableView) planTableView.register(PlanTableViewCell.self, forCellReuseIdentifier: CellIdentifier.planTableViewCell.rawValue) - constraintsTableView() } + private func addSubviews() { + constraintsTableView() + } + /// constraintsTableView private func constraintsTableView() { planTableView.snp.makeConstraints { make in make.edges.equalToSuperview() } } + /// binding + private func bind() { + let input = PlansViewModel.Input( + selectedPlansList: planTableView.rx.itemSelected.asObservable()) + let output = viewModel.bind(input: input) + // bindTableView() + } /// bindTableView - touchEvent with rx private func bindTableView() { @@ -61,5 +105,7 @@ final class PlanViewController: UIViewController { (row, plan, cell) in cell.configure(plan: plan) } + } + } diff --git a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift new file mode 100644 index 00000000..ada5d7e0 --- /dev/null +++ b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift @@ -0,0 +1,46 @@ +// +// PlansViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/17. +// + +import RxSwift +import UIKit + +final class PlansViewModel { + var coordinator: DefaultPlansCoordinator + + /// 입력이 아닌 뷰모델의 상태를 나타내는 출력 값 Input 밖에서 + var callerObservable: Observable { + return Observable.just(caller) + } + + private let disposeBag = DisposeBag() + private let caller: PlanCaller + + struct Input { + let selectedPlansList: Observable + } + + // MARK: - Init + init(coordinator: DefaultPlansCoordinator, caller: PlanCaller = .fromTabBar) { + self.coordinator = coordinator + self.caller = caller + } + + func bind(input: Input) { + input.selectedPlansList + .bind { [weak self] _ in + guard let self = self else { return } + switch self.caller { + case .fromAlert: + coordinator.moveToPartiSetLocation() + case .fromTabBar: + print("탭바에서 호출됨") + coordinator.moveToPartiGetLocation() + + } + }.disposed(by: disposeBag) + } +} diff --git a/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift b/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift index d4274d43..64cda037 100644 --- a/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift +++ b/TWTW/TWTW/SearchPlaces/View/SearchPlaceBottomSheetViewModel.swift @@ -26,12 +26,12 @@ final class SearchPlaceBottomSheetViewModel { func bind(input: Input) { input.participantsButtonTapped .subscribe(onNext: { [weak self] in - self?.participantsButtonTapped() + self?.plansButtonTapped() }) .disposed(by: disposeBag) } - private func participantsButtonTapped() { - coordinator?.moveToParticipantsSetList(from: .set) + private func plansButtonTapped() { + coordinator?.moveToPlanFromAlert(from: .fromAlert) } } From 86c2184b208f94f7669c1c441f66aa7c75fc4e5a Mon Sep 17 00:00:00 2001 From: dami Date: Mon, 18 Dec 2023 13:21:42 +0900 Subject: [PATCH 10/24] =?UTF-8?q?feat:=20plan=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20=ED=9B=84=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 44 ------------ .../DefaultFriendsListCoordinator.swift | 2 +- .../Model/ParticipantsSource.swift | 13 ---- .../DefaultMakeNewMeetingCoordinator.swift | 30 -------- .../MakeNewMeetingCoordinator.swift | 10 --- .../MakeNewMeetingViewController.swift | 30 -------- .../MakeNewMeetingViewModel.swift | 23 ------ .../Set/PartiMeetingViewController.swift | 41 ----------- .../Set/PartiMeetingViewModel.swift | 12 ---- .../DefaultPlansFromAlertCoordinator.swift | 9 ++- .../PlansFromAlertViewController.swift | 13 +--- .../FromAlert/PlansFromAlertViewModel.swift | 11 ++- TWTW/TWTW/Plan/Model/Plan.swift | 30 +++++++- TWTW/TWTW/Plan/View/PlanTableViewCell.swift | 12 ++-- TWTW/TWTW/Plan/View/PlansViewController.swift | 70 ++++++++++++++++--- TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift | 7 ++ 16 files changed, 121 insertions(+), 236 deletions(-) delete mode 100644 TWTW/TWTW/Participants/Model/ParticipantsSource.swift delete mode 100644 TWTW/TWTW/Participants/Set/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift delete mode 100644 TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingCoordinator.swift delete mode 100644 TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewController.swift delete mode 100644 TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewModel.swift delete mode 100644 TWTW/TWTW/Participants/Set/PartiMeetingViewController.swift delete mode 100644 TWTW/TWTW/Participants/Set/PartiMeetingViewModel.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index abe74614..5e7c7326 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -12,8 +12,6 @@ 371C1D2F2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */; }; 371C1D312ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D302ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift */; }; 371C1D332ADBB00300B30DC5 /* DefaultCallCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D322ADBB00300B30DC5 /* DefaultCallCoordinator.swift */; }; - 371ECB832B2ECAF5005174FF /* PartiMeetingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */; }; - 371ECB852B2ECAFD005174FF /* PartiMeetingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */; }; 371ECB892B2EF20D005174FF /* FriendListCaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB882B2EF20D005174FF /* FriendListCaller.swift */; }; 371ECB8B2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB8A2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift */; }; 372109F82B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372109F72B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift */; }; @@ -62,10 +60,6 @@ 3788AEB82B18DCF4007FC2F6 /* PlanCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AEB72B18DCF4007FC2F6 /* PlanCoordinator.swift */; }; 3788AEBA2B18DD0A007FC2F6 /* PlansViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AEB92B18DD0A007FC2F6 /* PlansViewController.swift */; }; 3788AEBE2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AEBD2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift */; }; - 378FD2A72B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378FD2A62B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift */; }; - 378FD2A92B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378FD2A82B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift */; }; - 378FD2AB2B2DFFF500DFCE25 /* MakeNewMeetingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378FD2AA2B2DFFF500DFCE25 /* MakeNewMeetingViewController.swift */; }; - 378FD2AD2B2E003400DFCE25 /* MakeNewMeetingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378FD2AC2B2E003400DFCE25 /* MakeNewMeetingViewModel.swift */; }; 3799E4F12A99C4D100E06218 /* DefaultAppCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3799E4F02A99C4D100E06218 /* DefaultAppCoordinator.swift */; }; 3799E5022A99D68500E06218 /* CallViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3799E5012A99D68500E06218 /* CallViewController.swift */; }; 3799E5052A99D6DC00E06218 /* PreviousAppointmentsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3799E5042A99D6DC00E06218 /* PreviousAppointmentsViewController.swift */; }; @@ -99,7 +93,6 @@ 37E0D8AD2B180804002E0CF5 /* ParticipantsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8AC2B180804002E0CF5 /* ParticipantsViewController.swift */; }; 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */; }; 37E0D8B42B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */; }; - 37E1B8312B2D94690047C7C7 /* ParticipantsSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8302B2D94690047C7C7 /* ParticipantsSource.swift */; }; 37E1B8372B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */; }; 37E1B83B2B2D970F0047C7C7 /* PartiGetLocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */; }; 37E1B83F2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */; }; @@ -191,8 +184,6 @@ 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultFriendsListCoordinator.swift; sourceTree = ""; }; 371C1D302ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPreviousAppointmentsCoordinator.swift; sourceTree = ""; }; 371C1D322ADBB00300B30DC5 /* DefaultCallCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultCallCoordinator.swift; sourceTree = ""; }; - 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiMeetingViewController.swift; sourceTree = ""; }; - 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiMeetingViewModel.swift; sourceTree = ""; }; 371ECB882B2EF20D005174FF /* FriendListCaller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendListCaller.swift; sourceTree = ""; }; 371ECB8A2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendsListCoordinatorDelegate.swift; sourceTree = ""; }; 372109F72B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlaceMapViewModelUnitTests.swift; sourceTree = ""; }; @@ -239,10 +230,6 @@ 3788AEB72B18DCF4007FC2F6 /* PlanCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanCoordinator.swift; sourceTree = ""; }; 3788AEB92B18DD0A007FC2F6 /* PlansViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlansViewController.swift; sourceTree = ""; }; 3788AEBD2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsPlansCoordinator.swift; sourceTree = ""; }; - 378FD2A62B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultMakeNewMeetingCoordinator.swift; sourceTree = ""; }; - 378FD2A82B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewMeetingCoordinator.swift; sourceTree = ""; }; - 378FD2AA2B2DFFF500DFCE25 /* MakeNewMeetingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewMeetingViewController.swift; sourceTree = ""; }; - 378FD2AC2B2E003400DFCE25 /* MakeNewMeetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewMeetingViewModel.swift; sourceTree = ""; }; 3799E4F02A99C4D100E06218 /* DefaultAppCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultAppCoordinator.swift; sourceTree = ""; }; 3799E5012A99D68500E06218 /* CallViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallViewController.swift; sourceTree = ""; }; 3799E5042A99D6DC00E06218 /* PreviousAppointmentsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviousAppointmentsViewController.swift; sourceTree = ""; }; @@ -277,7 +264,6 @@ 37E0D8AC2B180804002E0CF5 /* ParticipantsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsViewController.swift; sourceTree = ""; }; 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsCoordinator.swift; sourceTree = ""; }; 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultParticipantsCoordinator.swift; sourceTree = ""; }; - 37E1B8302B2D94690047C7C7 /* ParticipantsSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsSource.swift; sourceTree = ""; }; 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationCoordinator.swift; sourceTree = ""; }; 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationViewController.swift; sourceTree = ""; }; 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPartiGetLocationCoordinator.swift; sourceTree = ""; }; @@ -377,16 +363,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 371ECB812B2ECA9D005174FF /* Set */ = { - isa = PBXGroup; - children = ( - 378FD2A12B2DFDBD00DFCE25 /* MakeNewMeeting */, - 371ECB822B2ECAF5005174FF /* PartiMeetingViewController.swift */, - 371ECB842B2ECAFD005174FF /* PartiMeetingViewModel.swift */, - ); - path = Set; - sourceTree = ""; - }; 372109F52B0CE70700B0946C /* SearchPlaces */ = { isa = PBXGroup; children = ( @@ -607,17 +583,6 @@ path = Model; sourceTree = ""; }; - 378FD2A12B2DFDBD00DFCE25 /* MakeNewMeeting */ = { - isa = PBXGroup; - children = ( - 378FD2A62B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift */, - 378FD2A82B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift */, - 378FD2AA2B2DFFF500DFCE25 /* MakeNewMeetingViewController.swift */, - 378FD2AC2B2E003400DFCE25 /* MakeNewMeetingViewModel.swift */, - ); - path = MakeNewMeeting; - sourceTree = ""; - }; 3799E4ED2A99C4A000E06218 /* Coordinator */ = { isa = PBXGroup; children = ( @@ -879,7 +844,6 @@ isa = PBXGroup; children = ( 37D5D7862B19CEA100302EAD /* Participants.swift */, - 37E1B8302B2D94690047C7C7 /* ParticipantsSource.swift */, ); path = Model; sourceTree = ""; @@ -917,7 +881,6 @@ 37E0D8AB2B1807E0002E0CF5 /* Participants */ = { isa = PBXGroup; children = ( - 371ECB812B2ECA9D005174FF /* Set */, 37E1B82F2B2D944B0047C7C7 /* GetParicipants */, 37BB02F72B230E93006B2BEB /* ViewModel */, 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */, @@ -1674,7 +1637,6 @@ 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */, 37C733752B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift in Sources */, 37D5D78F2B19EAEB00302EAD /* PlanTableViewCell.swift in Sources */, - 378FD2AB2B2DFFF500DFCE25 /* MakeNewMeetingViewController.swift in Sources */, 37E1B83F2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift in Sources */, 3788AEBE2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift in Sources */, 3B274D792AD4584600D79698 /* SignInCoordinatorProtocol.swift in Sources */, @@ -1691,7 +1653,6 @@ 37D71E452B2F689E0004188A /* PlansFromAlertViewController.swift in Sources */, 37E9FBFE2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift in Sources */, 3B20E1E62AE41E97009572AA /* FriendsListCoordinatorProtocol.swift in Sources */, - 378FD2A92B2DFFCA00DFCE25 /* MakeNewMeetingCoordinator.swift in Sources */, 37F903A82AF9BD88008120B6 /* Header.swift in Sources */, 3760CC8F2AE2CB7800CFC2D5 /* SurroundSearchPlaces.swift in Sources */, 37CCCC392B1C8FB3003710DB /* MakeNewFriendsListViewController.swift in Sources */, @@ -1708,7 +1669,6 @@ 3BB85C092B19D39200F8BBF3 /* FriendSearchCoordinatorProtocol.swift in Sources */, 3758F18C2A7D007200E2933C /* AppDelegate.swift in Sources */, 3788AEB82B18DCF4007FC2F6 /* PlanCoordinator.swift in Sources */, - 37E1B8312B2D94690047C7C7 /* ParticipantsSource.swift in Sources */, 37EF0CFB2AB85C2400D77B0A /* UIViewController+Ext.swift in Sources */, 37E0D8AD2B180804002E0CF5 /* ParticipantsViewController.swift in Sources */, 3B6BA9892A7F7D0900A11FE4 /* SignInViewModel.swift in Sources */, @@ -1726,7 +1686,6 @@ 3737AE942AE93FB900FE7453 /* SearchPlacesMapCoordDelegate.swift in Sources */, 3B274D6D2AD3F6F400D79698 /* Coordinator.swift in Sources */, 3B9693D82B175346001DDAE8 /* DefaultCreateGroupCoordinator.swift in Sources */, - 378FD2AD2B2E003400DFCE25 /* MakeNewMeetingViewModel.swift in Sources */, 3737AE982AE983F600FE7453 /* SearchPlacesMapService.swift in Sources */, 3754BB702A9B455100522420 /* Color+Ext.swift in Sources */, 37F903A62AF9BD2F008120B6 /* EncodedQuery.swift in Sources */, @@ -1738,12 +1697,10 @@ 37BB03032B231198006B2BEB /* DefaultChangeLocationCoordinator.swift in Sources */, 3B4A660A2B161D1600DF9C84 /* CreateGroupViewController.swift in Sources */, 3BB85C032B19B4E200F8BBF3 /* FriendProtocol.swift in Sources */, - 371ECB832B2ECAF5005174FF /* PartiMeetingViewController.swift in Sources */, 37D71E492B2F68F70004188A /* PlansFromAlertViewModel.swift in Sources */, 3799E4F12A99C4D100E06218 /* DefaultAppCoordinator.swift in Sources */, 3737AE8F2AE93EE600FE7453 /* SearchPlacesMapViewController.swift in Sources */, 3B274D842AD5207100D79698 /* SignUpService.swift in Sources */, - 378FD2A72B2DFF7700DFCE25 /* DefaultMakeNewMeetingCoordinator.swift in Sources */, 3B20E1DD2AE41D32009572AA /* PreviousAppointmentsCoordinator.swift in Sources */, 377CB05B2AD8666F003453D6 /* GroupCoordinatorProtocol.swift in Sources */, 3758F18E2A7D007200E2933C /* SceneDelegate.swift in Sources */, @@ -1753,7 +1710,6 @@ 37C198C32B2760C000D68196 /* MapViewModelProtocol.swift in Sources */, 371C1D2F2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift in Sources */, 37CE1EAF2AE75813009CDA21 /* SearchPlace.swift in Sources */, - 371ECB852B2ECAFD005174FF /* PartiMeetingViewModel.swift in Sources */, 3737AE8E2AE93EE600FE7453 /* SearchPlacesTableViewCell.swift in Sources */, 3B6CF3D72ADAC80200325D05 /* SignInProtocol.swift in Sources */, 375916372A7EB36000C21E1F /* SignInService.swift in Sources */, diff --git a/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift b/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift index d23e2327..924b956f 100644 --- a/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift +++ b/TWTW/TWTW/FriendsList/DefaultFriendsListCoordinator.swift @@ -42,7 +42,7 @@ final class DefaultFriendsListCoordinator: FriendsListCoordinatorProtocol { ) let friendsListViewController = FriendsListViewController(viewModel: friendsListViewModel) - navigationController.pushViewController(friendsListViewController, animated: false) + navigationController.pushViewController(friendsListViewController, animated: true) } diff --git a/TWTW/TWTW/Participants/Model/ParticipantsSource.swift b/TWTW/TWTW/Participants/Model/ParticipantsSource.swift deleted file mode 100644 index c5eb3c29..00000000 --- a/TWTW/TWTW/Participants/Model/ParticipantsSource.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// ParticipantsSource.swift -// TWTW -// -// Created by 박다미 on 2023/12/16. -// - -import Foundation - -enum ParticipantsSource { - case get - case set -} diff --git a/TWTW/TWTW/Participants/Set/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift b/TWTW/TWTW/Participants/Set/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift deleted file mode 100644 index 2a33a6a5..00000000 --- a/TWTW/TWTW/Participants/Set/MakeNewMeeting/DefaultMakeNewMeetingCoordinator.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// DefaultMakeNewMeetingCoordinator.swift -// TWTW -// -// Created by 박다미 on 2023/12/17. -// - -import Foundation -import UIKit - -final class DefaultMakeNewMeetingCoordinator: MakeNewMeetingCoordinator { - var childCoordinators: [Coordinator] = [] - var navigationController: UINavigationController - private var makeNewMeetingViewModel: MakeNewMeetingViewModel? - - // MARK: - Init - init(navigationController: UINavigationController) { - self.navigationController = navigationController - makeNewMeetingViewModel = MakeNewMeetingViewModel(coordinator: self) - } - - func start() { - let makeNewMeetingViewModel = MakeNewMeetingViewModel(coordinator: self) - let makeNewMeetingVC = MakeNewMeetingViewController(viewModel: makeNewMeetingViewModel) - - navigationController.pushViewController(makeNewMeetingVC, animated: false) - - } - -} diff --git a/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingCoordinator.swift b/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingCoordinator.swift deleted file mode 100644 index 08be66fc..00000000 --- a/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingCoordinator.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// MakeNewMeetingCoordinator.swift -// TWTW -// -// Created by 박다미 on 2023/12/17. -// - -import Foundation - -protocol MakeNewMeetingCoordinator: Coordinator {} diff --git a/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewController.swift b/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewController.swift deleted file mode 100644 index 140f89e9..00000000 --- a/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewController.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// MakeNewMeetingViewController.swift -// TWTW -// -// Created by 박다미 on 2023/12/17. -// - -import RxCocoa -import RxSwift -import UIKit - -final class MakeNewMeetingViewController: UIViewController { - private let disposeBag = DisposeBag() - private var viewModel: MakeNewMeetingViewModel - - // MARK: - Init - init(viewModel: MakeNewMeetingViewModel) { - self.viewModel = viewModel - super.init(nibName: nil, bundle: nil) - } - - @available(*, unavailable) - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - override func viewDidLoad() { - super.viewDidLoad() - view.backgroundColor = .brown - } -} diff --git a/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewModel.swift b/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewModel.swift deleted file mode 100644 index 656f4795..00000000 --- a/TWTW/TWTW/Participants/Set/MakeNewMeeting/MakeNewMeetingViewModel.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// MakeNewMeetingViewModel.swift -// TWTW -// -// Created by 박다미 on 2023/12/17. -// - -import RxSwift -import UIKit - -final class MakeNewMeetingViewModel { - private let disposeBag = DisposeBag() - weak var coordinator: DefaultMakeNewMeetingCoordinator? - - // MARK: - Init - init(coordinator: DefaultMakeNewMeetingCoordinator) { - self.coordinator = coordinator - } - - func moveToGetLocationViewController() { - print("get") - } -} diff --git a/TWTW/TWTW/Participants/Set/PartiMeetingViewController.swift b/TWTW/TWTW/Participants/Set/PartiMeetingViewController.swift deleted file mode 100644 index c5bc0579..00000000 --- a/TWTW/TWTW/Participants/Set/PartiMeetingViewController.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// PartiMeetingViewController.swift -// TWTW -// -// Created by 박다미 on 2023/12/17. -// - -import Foundation -import UIKit - -class PartiMeetingViewController: UIViewController { - var newPlace: UILabel! - var addParticipantsButton: UIButton! - var confirmButton: UIButton! - - init() { - super.init(nibName: nil, bundle: nil) - commonInit() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - commonInit() - } - - private func commonInit() { - // 공통 뷰 구성 요소 초기화 - newPlace = UILabel() - addParticipantsButton = UIButton() - confirmButton = UIButton() - view.backgroundColor = .red - } - - func setupCommonViews() { - // newPlace, addParticipantsButton, confirmButton 설정 - } - - func setupCommonBindings() { - // 공통 ViewModel 바인딩 코드 작성 - } -} diff --git a/TWTW/TWTW/Participants/Set/PartiMeetingViewModel.swift b/TWTW/TWTW/Participants/Set/PartiMeetingViewModel.swift deleted file mode 100644 index fd1df1f4..00000000 --- a/TWTW/TWTW/Participants/Set/PartiMeetingViewModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// PartiMeetingViewModel.swift -// TWTW -// -// Created by 박다미 on 2023/12/17. -// - -import UIKit - -class PartiMeetingViewModel { - -} diff --git a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift index 54185e2b..484b9f92 100644 --- a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift +++ b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift @@ -28,13 +28,18 @@ final class DefaultPlansFromAlertCoordinator: PlanFromAlertCoordinator { navigationController.pushViewController(plansFromAlertViewController, animated: false) } /// 친구추가 화면으로 이동 - func addParticipants() { let friendsListCoordinator = DefaultFriendsListCoordinator(navigationController: navigationController) - friendsListCoordinator.delegate = self // delegate를 여기에 설정 + friendsListCoordinator.delegate = self childCoordinators.append(friendsListCoordinator) friendsListCoordinator.startFromPartiSetLocation() } + /// 설정완료후 처음 지도 화면으로 + func moveToMain() { + let mainMapCoordinator = DefaultMainMapCoordinator(navigationController: navigationController) + childCoordinators.append(mainMapCoordinator) + mainMapCoordinator.start() + } } diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift index cf88e8c2..4b257eaa 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift @@ -52,7 +52,7 @@ final class PlansFromAlertViewController: UIViewController { private lazy var confirmButton: UIButton = { let button = UIButton(type: .system) button.setTitle("변경", for: .normal) - + return button }() @@ -128,7 +128,6 @@ final class PlansFromAlertViewController: UIViewController { contentView.snp.makeConstraints { make in make.edges.equalTo(scrollView) make.width.equalTo(scrollView) - // make.height.equalTo(2000) } originalPlaceNameLabel.snp.makeConstraints { make in @@ -164,7 +163,7 @@ final class PlansFromAlertViewController: UIViewController { } private func bind() { - let input = PlansFromAlertViewModel.Input(clickedAddParticipantsEvents: addParticipantsButton.rx.tap) + let input = PlansFromAlertViewModel.Input(clickedAddParticipantsEvents: addParticipantsButton.rx.tap, clickedConfirmEvents: confirmButton.rx.tap) let output = viewModel.createOutput(input: input) @@ -192,13 +191,6 @@ final class PlansFromAlertViewController: UIViewController { private func setupBindings() { - - confirmButton.rx.tap - .bind { [weak self] in - print("변경버튼 클릭") - } - .disposed(by: disposeBag) - datePickerButton.rx.tap .bind { [weak self] in self?.presentDatePicker() @@ -231,4 +223,3 @@ final class PlansFromAlertViewController: UIViewController { return formatter.string(from: date) } } - diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift index b4adc1c4..fe7745de 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift @@ -28,7 +28,7 @@ final class PlansFromAlertViewModel { // 2. 친구추가 버튼 클릭 let clickedAddParticipantsEvents: ControlEvent? // 3.저장 버튼 클릭 - // let clickedSaveEvents: ControlEvent? + let clickedConfirmEvents: ControlEvent? } struct Output { @@ -54,6 +54,11 @@ final class PlansFromAlertViewModel { moveAddPrticipants() } .disposed(by: disposeBag) + input.clickedConfirmEvents? + .bind { [weak self] in + guard let self = self else {return } + moveToMain()} + return output } @@ -63,6 +68,10 @@ final class PlansFromAlertViewModel { func moveAddPrticipants() { coordinator?.addParticipants() } + /// 초기화면으로 + func moveToMain() { + coordinator?.moveToMain() + } // 선택된 친구 목록을 업데이트하는 메서드 func updateSelectedFriends(_ friends: [Friend]) { selectedFriendsRelay.accept(friends) diff --git a/TWTW/TWTW/Plan/Model/Plan.swift b/TWTW/TWTW/Plan/Model/Plan.swift index 596ae604..4be81714 100644 --- a/TWTW/TWTW/Plan/Model/Plan.swift +++ b/TWTW/TWTW/Plan/Model/Plan.swift @@ -7,7 +7,31 @@ import UIKit -struct Plan { - let planTitle: String - let plansubTitle: String +struct PlaceDetails: Codable { + let placeName: String + let placeUrl: String + let roadAddressName: String + let longitude: Double + let latitude: Double +} + +struct GroupInfo: Codable { + let groupId: String + let leaderId: String + let name: String + let groupImage: String +} + +struct Member: Codable { + let id: String + let nickname: String +} + +struct Plan: Codable { + let planId: String + let placeId: String + let planMakerId: String + let placeDetails: PlaceDetails + let groupInfo: GroupInfo + let members: [Member] } diff --git a/TWTW/TWTW/Plan/View/PlanTableViewCell.swift b/TWTW/TWTW/Plan/View/PlanTableViewCell.swift index e5cdba74..973c129c 100644 --- a/TWTW/TWTW/Plan/View/PlanTableViewCell.swift +++ b/TWTW/TWTW/Plan/View/PlanTableViewCell.swift @@ -19,14 +19,14 @@ final class PlanTableViewCell: UITableViewCell { return stackView }() - private lazy var planTitle: UILabel = { + private lazy var planName: UILabel = { let label = UILabel() label.text = "약속" label.textAlignment = .left label.font = UIFont.systemFont(ofSize: 16, weight: .semibold) return label }() - private lazy var planSubtitle: UILabel = { + private lazy var groupName: UILabel = { let label = UILabel() label.text = "섭" label.textAlignment = .left @@ -53,8 +53,8 @@ final class PlanTableViewCell: UITableViewCell { /// addSubViews() private func addSubViews() { contentView.addSubview(planStackView) - planStackView.addArrangedSubview(planTitle) - planStackView.addArrangedSubview(planSubtitle) + planStackView.addArrangedSubview(planName) + planStackView.addArrangedSubview(groupName) configureConstraints() } @@ -69,8 +69,8 @@ final class PlanTableViewCell: UITableViewCell { /// configure func configure(plan: Plan) { - self.planTitle.text = plan.planTitle - self.planSubtitle.text = plan.plansubTitle + self.planName.text = plan.placeDetails.placeName + self.groupName.text = plan.groupInfo.name } } diff --git a/TWTW/TWTW/Plan/View/PlansViewController.swift b/TWTW/TWTW/Plan/View/PlansViewController.swift index 14d823f8..6b33341f 100644 --- a/TWTW/TWTW/Plan/View/PlansViewController.swift +++ b/TWTW/TWTW/Plan/View/PlansViewController.swift @@ -17,12 +17,60 @@ final class PlansViewController: UIViewController { /// sample let plans: [Plan] = [ - Plan(planTitle: "제목", plansubTitle: "부제목"), - Plan(planTitle: "제목", plansubTitle: "부제목"), - Plan(planTitle: "제목", plansubTitle: "부제목"), - Plan(planTitle: "제목", plansubTitle: "부제목"), - Plan(planTitle: "제목", plansubTitle: "부제목"), - Plan(planTitle: "제목", plansubTitle: "부제목") + Plan( + planId: "3b8e94bc-310a-4ee9-b5cc-624d3c794dd4", + placeId: "91e3045e-f75b-42a5-a5f5-2d63db7e2df8", + planMakerId: "065c66a2-7d21-47f0-bbfd-4751242d0a78", + placeDetails: PlaceDetails( + placeName: "서울 여의도공원", + placeUrl: "https://example.com/place/1", + roadAddressName: "여의도로 123", + longitude: 37.5259, + latitude: 126.9242 + ), + groupInfo: GroupInfo( + groupId: "aa977768-a940-4f89-ba24-aa1bf2f71355", + leaderId: "8df2b9ac-b424-44ca-9f30-25b245dc75f1", + name: "친구와 나들이", groupImage: "aaaaa" + ), + members: [ + Member( + id: "37f64bef-b266-4787-8b53-599b2e0cea3c", + nickname: "친구1" + ), + Member( + id: "2f6f96bf-4e17-41d7-8e17-15e17d41d7b0", + nickname: "친구2" + ) + ] + ), + Plan( + planId: "3b8e94bc-310a-4ee9-b5cc-624d3c794dd4", + placeId: "91e3045e-f75b-42a5-a5f5-2d63db7e2df8", + planMakerId: "065c66a2-7d21-47f0-bbfd-4751242d0a78", + placeDetails: PlaceDetails( + placeName: "서울 여의도공원", + placeUrl: "https://example.com/place/1", + roadAddressName: "여의도로 123", + longitude: 37.5259, + latitude: 126.9242 + ), + groupInfo: GroupInfo( + groupId: "aa977768-a940-4f89-ba24-aa1bf2f71355", + leaderId: "8df2b9ac-b424-44ca-9f30-25b245dc75f1", + name: "친구와 나들이", groupImage: "aaaaa" + ), + members: [ + Member( + id: "37f64bef-b266-4787-8b53-599b2e0cea3c", + nickname: "친구1" + ), + Member( + id: "2f6f96bf-4e17-41d7-8e17-15e17d41d7b0", + nickname: "친구2" + ) + ] + ) ] // MARK: Properties @@ -91,7 +139,9 @@ final class PlansViewController: UIViewController { /// binding private func bind() { let input = PlansViewModel.Input( - selectedPlansList: planTableView.rx.itemSelected.asObservable()) + selectedPlansList: planTableView.rx.itemSelected.asObservable(), + addPlans: rightItemButton.rx.tap.asObservable() + ) let output = viewModel.bind(input: input) // bindTableView() } @@ -103,9 +153,11 @@ final class PlansViewController: UIViewController { cellIdentifier: CellIdentifier.planTableViewCell.rawValue, cellType: PlanTableViewCell.self)) { (row, plan, cell) in + let placeName = plan.placeDetails.placeName + let groupName = plan.groupInfo.name + cell.configure(plan: plan) } - } - + } diff --git a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift index ada5d7e0..e9082d3a 100644 --- a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift +++ b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift @@ -21,6 +21,7 @@ final class PlansViewModel { struct Input { let selectedPlansList: Observable + let addPlans: Observable } // MARK: - Init @@ -42,5 +43,11 @@ final class PlansViewModel { } }.disposed(by: disposeBag) + + input.addPlans + .bind { [weak self] _ in + guard let self = self else { return } + coordinator.moveToPartiSetLocation() + }.disposed(by: disposeBag) } } From abb635275313398f8e83e0321e209eb21ae8695a Mon Sep 17 00:00:00 2001 From: dami Date: Mon, 18 Dec 2023 15:56:24 +0900 Subject: [PATCH 11/24] =?UTF-8?q?fix=20:=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DefaultsFindRoadCoordinator.swift | 29 +++++++++++ TWTW/TWTW/FindRoad/FindRoadCoordinator.swift | 10 ++++ .../FindRoad/FindRoadViewController.swift | 34 +++++++++++++ TWTW/TWTW/FindRoad/FindRoadViewModel.swift | 50 +++++++++++++++++++ .../DefaultPlansFromAlertCoordinator.swift | 13 +++-- .../PlansFromAlertViewController.swift | 6 ++- .../FromAlert/PlansFromAlertViewModel.swift | 8 +-- 7 files changed, 140 insertions(+), 10 deletions(-) create mode 100644 TWTW/TWTW/FindRoad/DefaultsFindRoadCoordinator.swift create mode 100644 TWTW/TWTW/FindRoad/FindRoadCoordinator.swift create mode 100644 TWTW/TWTW/FindRoad/FindRoadViewController.swift create mode 100644 TWTW/TWTW/FindRoad/FindRoadViewModel.swift diff --git a/TWTW/TWTW/FindRoad/DefaultsFindRoadCoordinator.swift b/TWTW/TWTW/FindRoad/DefaultsFindRoadCoordinator.swift new file mode 100644 index 00000000..f7fc056d --- /dev/null +++ b/TWTW/TWTW/FindRoad/DefaultsFindRoadCoordinator.swift @@ -0,0 +1,29 @@ +// +// DefaultsFindRoadCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/18. +// + +import Foundation +import UIKit + +final class DefaultsFindRoadCoordinator: FindRoadCoordinator { + + var childCoordinators: [Coordinator] = [] + var navigationController: UINavigationController + private var findRoadViewModel: FindRoadViewModel? + + // MARK: - Init + init(navigationController: UINavigationController) { + self.navigationController = navigationController + findRoadViewModel = FindRoadViewModel(coordinator: self) + + } + func start() { + guard let findRoadViewModel = findRoadViewModel else { return } + + let findRoadController = FindRoadViewController(viewModel: findRoadViewModel) + self.navigationController.pushViewController(findRoadController, animated: true) + } +} diff --git a/TWTW/TWTW/FindRoad/FindRoadCoordinator.swift b/TWTW/TWTW/FindRoad/FindRoadCoordinator.swift new file mode 100644 index 00000000..296855c4 --- /dev/null +++ b/TWTW/TWTW/FindRoad/FindRoadCoordinator.swift @@ -0,0 +1,10 @@ +// +// FindRoadCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/18. +// + +import Foundation + +protocol FindRoadCoordinator: Coordinator {} diff --git a/TWTW/TWTW/FindRoad/FindRoadViewController.swift b/TWTW/TWTW/FindRoad/FindRoadViewController.swift new file mode 100644 index 00000000..e3ff073f --- /dev/null +++ b/TWTW/TWTW/FindRoad/FindRoadViewController.swift @@ -0,0 +1,34 @@ +// +// FindRoadViewController.swift +// TWTW +// +// Created by 박다미 on 2023/12/18. +// + +import RxCocoa +import RxSwift +import SnapKit +import UIKit + +final class FindRoadViewController: UIViewController { + private let disposeBag = DisposeBag() + private var viewModel: FindRoadViewModel + + // MARK: - Init + init(viewModel: FindRoadViewModel) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: View Did Load + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .white + + } +} diff --git a/TWTW/TWTW/FindRoad/FindRoadViewModel.swift b/TWTW/TWTW/FindRoad/FindRoadViewModel.swift new file mode 100644 index 00000000..44d07160 --- /dev/null +++ b/TWTW/TWTW/FindRoad/FindRoadViewModel.swift @@ -0,0 +1,50 @@ +// +// FindRoadViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/18. +// + +import RxCocoa +import RxRelay +import RxSwift +import UIKit + +final class FindRoadViewModel { + private let disposeBag = DisposeBag() + weak var coordinator: DefaultsFindRoadCoordinator? + + + struct Input { + // 3.길찾기 버튼 + let clickedConfirmEvents: ControlEvent? + } + + struct Output { + } + // MARK: - Init + init(coordinator: DefaultsFindRoadCoordinator) { + self.coordinator = coordinator + } + + // create Output + /// - Parameter input: Input Model + /// - Returns: Output Model + func createOutput(input: Input) -> Output { + let output = Output() + + input.clickedConfirmEvents? + .bind { [weak self] in + guard let self = self else { return } + moveToFindRoad() + } + .disposed(by: disposeBag) + + return output + } + /// 길찾기 화면으로 + func moveToFindRoad() { + coordinator?.start() + } + +} diff --git a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift index 484b9f92..17dc64d4 100644 --- a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift +++ b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift @@ -27,6 +27,7 @@ final class DefaultPlansFromAlertCoordinator: PlanFromAlertCoordinator { let plansFromAlertViewController = PlansFromAlertViewController(viewModel: viewModel) navigationController.pushViewController(plansFromAlertViewController, animated: false) } + /// 친구추가 화면으로 이동 func addParticipants() { let friendsListCoordinator = DefaultFriendsListCoordinator(navigationController: navigationController) @@ -36,11 +37,15 @@ final class DefaultPlansFromAlertCoordinator: PlanFromAlertCoordinator { } /// 설정완료후 처음 지도 화면으로 func moveToMain() { - let mainMapCoordinator = DefaultMainMapCoordinator(navigationController: navigationController) - childCoordinators.append(mainMapCoordinator) - mainMapCoordinator.start() + childCoordinators.removeAll() + navigationController.popToRootViewController(animated: true) + } + /// 길찾기 + func moveToFindRoad() { + let findRoadCoordinator = DefaultsFindRoadCoordinator(navigationController: navigationController) + childCoordinators.append(findRoadCoordinator) + findRoadCoordinator.start() } - } extension DefaultPlansFromAlertCoordinator: FriendsSendListCoordinatorDelegate { diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift index 4b257eaa..534e5dbb 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift @@ -163,7 +163,8 @@ final class PlansFromAlertViewController: UIViewController { } private func bind() { - let input = PlansFromAlertViewModel.Input(clickedAddParticipantsEvents: addParticipantsButton.rx.tap, clickedConfirmEvents: confirmButton.rx.tap) + let input = PlansFromAlertViewModel.Input(clickedAddParticipantsEvents: addParticipantsButton.rx.tap, + clickedConfirmEvents: confirmButton.rx.tap) let output = viewModel.createOutput(input: input) @@ -175,7 +176,8 @@ final class PlansFromAlertViewController: UIViewController { }) .bind(to: selectedFriendsTableView.rx - .items(cellIdentifier: CellIdentifier.friendListTableViewCell.rawValue, cellType: FriendListTableViewCell.self)) { index, friend, cell in + .items(cellIdentifier: CellIdentifier.friendListTableViewCell.rawValue, + cellType: FriendListTableViewCell.self)) { index, friend, cell in cell.inputData(info: friend) }.disposed(by: disposeBag) } diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift index fe7745de..87414225 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift @@ -57,14 +57,14 @@ final class PlansFromAlertViewModel { input.clickedConfirmEvents? .bind { [weak self] in guard let self = self else {return } - moveToMain()} + moveToMain() + } + .disposed(by: disposeBag) return output } - func moveToSetLocationViewController() { - } - + /// 친구추가화면으로 func moveAddPrticipants() { coordinator?.addParticipants() } From 012f31883eeeb5bcf39e6b68228f69b822d23da6 Mon Sep 17 00:00:00 2001 From: dami Date: Tue, 19 Dec 2023 21:20:22 +0900 Subject: [PATCH 12/24] feat: map polyLine UI --- TWTW/TWTW.xcodeproj/project.pbxproj | 95 +++--- TWTW/TWTW/Map/DefaultMainMapCoordinator.swift | 2 +- TWTW/TWTW/Map/Model/CarRoute.swift | 57 ++-- TWTW/TWTW/Map/Protocol/CarRouteProtocol.swift | 9 + TWTW/TWTW/Map/Protocol/RouteProtocol.swift | 13 - TWTW/TWTW/Map/Service/RouteService.swift | 45 ++- .../KakaoMapViewController.swift | 4 +- .../TWTW/Map/ViewModel/MainMapViewModel.swift | 24 +- .../FindRoad/CarRouteService.swift | 8 + .../DefaultsFindRoadCoordinator.swift | 29 ++ .../FindRoad/FindRoadCoordinator.swift | 10 + .../FindRoad/FindRoadViewController.swift | 290 ++++++++++++++++++ .../FindRoadViewModel.swift} | 11 +- .../DefaultPartiGetLocationCoordinator.swift | 29 -- .../PartiGetLocationCoordinator.swift | 10 - .../PartiGetLocationViewController.swift | 31 -- TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift | 8 +- .../DefaultPlansFromAlertCoordinator.swift | 10 +- TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift | 2 +- 19 files changed, 503 insertions(+), 184 deletions(-) create mode 100644 TWTW/TWTW/Map/Protocol/CarRouteProtocol.swift delete mode 100644 TWTW/TWTW/Map/Protocol/RouteProtocol.swift create mode 100644 TWTW/TWTW/Participants/FindRoad/CarRouteService.swift create mode 100644 TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift create mode 100644 TWTW/TWTW/Participants/FindRoad/FindRoadCoordinator.swift create mode 100644 TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift rename TWTW/TWTW/Participants/{GetParicipants/PartiGetLocationViewModel.swift => FindRoad/FindRoadViewModel.swift} (50%) delete mode 100644 TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift delete mode 100644 TWTW/TWTW/Participants/GetParicipants/PartiGetLocationCoordinator.swift delete mode 100644 TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewController.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index 5e7c7326..c3c34d15 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -90,13 +90,16 @@ 37D71E452B2F689E0004188A /* PlansFromAlertViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E442B2F689E0004188A /* PlansFromAlertViewController.swift */; }; 37D71E472B2F68D30004188A /* PlanFromAlertCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E462B2F68D30004188A /* PlanFromAlertCoordinator.swift */; }; 37D71E492B2F68F70004188A /* PlansFromAlertViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E482B2F68F70004188A /* PlansFromAlertViewModel.swift */; }; + 37D71E5A2B305FD90004188A /* FindRoadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E592B305FD90004188A /* FindRoadViewController.swift */; }; + 37D71E5C2B305FF90004188A /* FindRoadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E5B2B305FF90004188A /* FindRoadViewModel.swift */; }; + 37D71E5E2B3060030004188A /* FindRoadCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E5D2B3060030004188A /* FindRoadCoordinator.swift */; }; + 37D71E602B30600F0004188A /* DefaultsFindRoadCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D71E5F2B30600F0004188A /* DefaultsFindRoadCoordinator.swift */; }; 37E0D8AD2B180804002E0CF5 /* ParticipantsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8AC2B180804002E0CF5 /* ParticipantsViewController.swift */; }; 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */; }; 37E0D8B42B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */; }; - 37E1B8372B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */; }; - 37E1B83B2B2D970F0047C7C7 /* PartiGetLocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */; }; - 37E1B83F2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */; }; - 37E1B8432B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E1B8422B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift */; }; + 37E8B83C2B31AE40008D0F3D /* CarRouteProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E8B83B2B31AE40008D0F3D /* CarRouteProtocol.swift */; }; + 37E8B83E2B31AFA0008D0F3D /* CarRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E8B83D2B31AFA0008D0F3D /* CarRoute.swift */; }; + 37E8B8402B31B192008D0F3D /* CarRouteService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E8B83F2B31B192008D0F3D /* CarRouteService.swift */; }; 37E9FBFB2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E9FBFA2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift */; }; 37E9FBFE2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E9FBFD2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift */; }; 37EF0CFB2AB85C2400D77B0A /* UIViewController+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37EF0CFA2AB85C2400D77B0A /* UIViewController+Ext.swift */; }; @@ -158,8 +161,6 @@ 3BC1D27C2AE0D27600A7D0CC /* RxTest in Frameworks */ = {isa = PBXBuildFile; productRef = 3BC1D27B2AE0D27600A7D0CC /* RxTest */; }; 3BC1D27E2AE0D27F00A7D0CC /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 3BC1D27D2AE0D27F00A7D0CC /* RxCocoa */; }; 3BC8D6A22B0F0F0A00BE22EF /* RouteService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BC8D6A12B0F0F0A00BE22EF /* RouteService.swift */; }; - 3BC8D6A42B0F0F3700BE22EF /* RouteProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BC8D6A32B0F0F3700BE22EF /* RouteProtocol.swift */; }; - 3BC8D6A72B0F15D700BE22EF /* CarRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BC8D6A62B0F15D700BE22EF /* CarRoute.swift */; }; 3BC8D6AA2B0F520C00BE22EF /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 3BC8D6A92B0F520C00BE22EF /* Kingfisher */; }; 3BE034982AD83AC800953498 /* SignInViewModelUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE034972AD83AC800953498 /* SignInViewModelUnitTests.swift */; }; 3BE038C92AFB0BE70039B4FD /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = 3BE038C82AFB0BE70039B4FD /* .swiftlint.yml */; }; @@ -261,13 +262,21 @@ 37D71E442B2F689E0004188A /* PlansFromAlertViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlansFromAlertViewController.swift; sourceTree = ""; }; 37D71E462B2F68D30004188A /* PlanFromAlertCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanFromAlertCoordinator.swift; sourceTree = ""; }; 37D71E482B2F68F70004188A /* PlansFromAlertViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlansFromAlertViewModel.swift; sourceTree = ""; }; + 37D71E592B305FD90004188A /* FindRoadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindRoadViewController.swift; sourceTree = ""; }; + 37D71E5B2B305FF90004188A /* FindRoadViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindRoadViewModel.swift; sourceTree = ""; }; + 37D71E5D2B3060030004188A /* FindRoadCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindRoadCoordinator.swift; sourceTree = ""; }; + 37D71E5F2B30600F0004188A /* DefaultsFindRoadCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsFindRoadCoordinator.swift; sourceTree = ""; }; + 37D71F2D2B3188620004188A /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + 37D71F2F2B31888F0004188A /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 37D71F312B3188970004188A /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; + 37D71F332B31889F0004188A /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; }; + 37D71F352B3188A70004188A /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; 37E0D8AC2B180804002E0CF5 /* ParticipantsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsViewController.swift; sourceTree = ""; }; 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsCoordinator.swift; sourceTree = ""; }; 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultParticipantsCoordinator.swift; sourceTree = ""; }; - 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationCoordinator.swift; sourceTree = ""; }; - 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationViewController.swift; sourceTree = ""; }; - 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPartiGetLocationCoordinator.swift; sourceTree = ""; }; - 37E1B8422B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartiGetLocationViewModel.swift; sourceTree = ""; }; + 37E8B83B2B31AE40008D0F3D /* CarRouteProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarRouteProtocol.swift; sourceTree = ""; }; + 37E8B83D2B31AFA0008D0F3D /* CarRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarRoute.swift; sourceTree = ""; }; + 37E8B83F2B31B192008D0F3D /* CarRouteService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarRouteService.swift; sourceTree = ""; }; 37E9FBFA2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCustomTabButtonsView.swift; sourceTree = ""; }; 37E9FBFD2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCustomTabButtonViewModel.swift; sourceTree = ""; }; 37EF0CFA2AB85C2400D77B0A /* UIViewController+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Ext.swift"; sourceTree = ""; }; @@ -323,8 +332,6 @@ 3BB85C082B19D39200F8BBF3 /* FriendSearchCoordinatorProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendSearchCoordinatorProtocol.swift; sourceTree = ""; }; 3BC1D27F2AE0D58600A7D0CC /* TWTWUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TWTWUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3BC8D6A12B0F0F0A00BE22EF /* RouteService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteService.swift; sourceTree = ""; }; - 3BC8D6A32B0F0F3700BE22EF /* RouteProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteProtocol.swift; sourceTree = ""; }; - 3BC8D6A62B0F15D700BE22EF /* CarRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarRoute.swift; sourceTree = ""; }; 3BE034972AD83AC800953498 /* SignInViewModelUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInViewModelUnitTests.swift; sourceTree = ""; }; 3BE038C82AFB0BE70039B4FD /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; 3BF9EF9F2AB1AE220014855E /* TWTW.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TWTW.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -457,6 +464,7 @@ 3799E4F92A99D62100E06218 /* FriendsList */, 37D5D78B2B19E81200302EAD /* ChangeLocation */, 3788AEB12B18DC59007FC2F6 /* Plan */, + 37D71E612B30601B0004188A /* FindRoad */, 37E0D8AB2B1807E0002E0CF5 /* Participants */, 3799E4FD2A99D64B00E06218 /* PreviousAppointments */, 3799E4FF2A99D65900E06218 /* Call */, @@ -878,10 +886,22 @@ path = FromAlert; sourceTree = ""; }; + 37D71E612B30601B0004188A /* FindRoad */ = { + isa = PBXGroup; + children = ( + 37E8B83F2B31B192008D0F3D /* CarRouteService.swift */, + 37D71E5D2B3060030004188A /* FindRoadCoordinator.swift */, + 37D71E592B305FD90004188A /* FindRoadViewController.swift */, + 37D71E5B2B305FF90004188A /* FindRoadViewModel.swift */, + 37D71E5F2B30600F0004188A /* DefaultsFindRoadCoordinator.swift */, + ); + name = FindRoad; + path = Participants/FindRoad; + sourceTree = ""; + }; 37E0D8AB2B1807E0002E0CF5 /* Participants */ = { isa = PBXGroup; children = ( - 37E1B82F2B2D944B0047C7C7 /* GetParicipants */, 37BB02F72B230E93006B2BEB /* ViewModel */, 37E0D8B32B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift */, 37E0D8B52B180A8D002E0CF5 /* Protocol */, @@ -908,17 +928,6 @@ path = Protocol; sourceTree = ""; }; - 37E1B82F2B2D944B0047C7C7 /* GetParicipants */ = { - isa = PBXGroup; - children = ( - 37E1B8422B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift */, - 37E1B8362B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift */, - 37E1B83A2B2D970F0047C7C7 /* PartiGetLocationViewController.swift */, - 37E1B83E2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift */, - ); - path = GetParicipants; - sourceTree = ""; - }; 37E9FBFC2B16358A004AFF79 /* CustomTabButton */ = { isa = PBXGroup; children = ( @@ -1128,8 +1137,8 @@ isa = PBXGroup; children = ( 3B6C7F8F2ADE24340060091C /* Coordinator */, - 3BC8D6A32B0F0F3700BE22EF /* RouteProtocol.swift */, 37C198C22B2760C000D68196 /* MapViewModelProtocol.swift */, + 37E8B83B2B31AE40008D0F3D /* CarRouteProtocol.swift */, ); path = Protocol; sourceTree = ""; @@ -1137,6 +1146,11 @@ 3B6CF3BB2ADAC1A400325D05 /* Frameworks */ = { isa = PBXGroup; children = ( + 37D71F352B3188A70004188A /* libsqlite3.tbd */, + 37D71F332B31889F0004188A /* libxml2.tbd */, + 37D71F312B3188970004188A /* libc++.tbd */, + 37D71F2F2B31888F0004188A /* QuartzCore.framework */, + 37D71F2D2B3188620004188A /* OpenGLES.framework */, ); name = Frameworks; sourceTree = ""; @@ -1400,8 +1414,8 @@ 3BC8D6A52B0F15B900BE22EF /* Model */ = { isa = PBXGroup; children = ( - 3BC8D6A62B0F15D700BE22EF /* CarRoute.swift */, 37C07E9C2B281C7D00253438 /* ViewState.swift */, + 37E8B83D2B31AFA0008D0F3D /* CarRoute.swift */, ); path = Model; sourceTree = ""; @@ -1578,9 +1592,9 @@ 374DB4612B24752800AF648C /* DefaultTabBarCoordinator.swift in Sources */, 371C1D332ADBB00300B30DC5 /* DefaultCallCoordinator.swift in Sources */, 3B6CF3DB2ADAD14A00325D05 /* MockSignInCoordinator.swift in Sources */, + 37D71E602B30600F0004188A /* DefaultsFindRoadCoordinator.swift in Sources */, 3BAA4A222ADCD0C8009D14E7 /* MockSignUpService.swift in Sources */, 37D3AFE32B0F3E67006FB449 /* MockSearchPlacesMapCoordinator.swift in Sources */, - 3BC8D6A72B0F15D700BE22EF /* CarRoute.swift in Sources */, 3B274D712AD3F77600D79698 /* DefaultSignInCoordinator.swift in Sources */, 3799E5072A99D70500E06218 /* FriendsListViewController.swift in Sources */, 371ECB8B2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift in Sources */, @@ -1589,7 +1603,6 @@ 375E8B022A95FCB000F8DE42 /* NearbyPlacesCollectionViewCell.swift in Sources */, 3799E5092A99D72D00E06218 /* NotificationViewController.swift in Sources */, 377CB0612AD8699C003453D6 /* MainMapCoordinator.swift in Sources */, - 37E1B83B2B2D970F0047C7C7 /* PartiGetLocationViewController.swift in Sources */, 372109FC2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift in Sources */, 37D5D78A2B19CF2800302EAD /* ParticipantsTableViewCell.swift in Sources */, 37D5D7912B19ECF300302EAD /* Plan.swift in Sources */, @@ -1621,9 +1634,9 @@ 3BB85C072B19D37500F8BBF3 /* DefaultFriendSearchCoordinator.swift in Sources */, 3B9693DA2B1753AD001DDAE8 /* CreateGroupCoordinatorProtocol.swift in Sources */, 37D5D78D2B19E81F00302EAD /* ChangeLocationViewController.swift in Sources */, + 37E8B83C2B31AE40008D0F3D /* CarRouteProtocol.swift in Sources */, 3B20E1E12AE41E4D009572AA /* CallCoordinator.swift in Sources */, 37C35EE52B1CC8A6008A289D /* DefaultMakeNewFriendsListCoordinator.swift in Sources */, - 3BC8D6A42B0F0F3700BE22EF /* RouteProtocol.swift in Sources */, 377CB0592AD8665E003453D6 /* GroupViewModel.swift in Sources */, 371ECB892B2EF20D005174FF /* FriendListCaller.swift in Sources */, 3B274D7B2AD4CFDA00D79698 /* SignUpCoordinatorFinishDelegate.swift in Sources */, @@ -1637,14 +1650,15 @@ 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */, 37C733752B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift in Sources */, 37D5D78F2B19EAEB00302EAD /* PlanTableViewCell.swift in Sources */, - 37E1B83F2B2DA2F60047C7C7 /* DefaultPartiGetLocationCoordinator.swift in Sources */, 3788AEBE2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift in Sources */, 3B274D792AD4584600D79698 /* SignInCoordinatorProtocol.swift in Sources */, 3B4A66062B16147600DF9C84 /* GroupProtocol.swift in Sources */, 3B7E25072B0E4F4700526ACE /* SurroundSearchProtocol.swift in Sources */, 374DB4662B247CB700AF648C /* MyPageCoordinator.swift in Sources */, + 37E8B83E2B31AFA0008D0F3D /* CarRoute.swift in Sources */, 37BB03012B231188006B2BEB /* ChangeLocationModel.swift in Sources */, 3B79E21C2B1A4C4E000790A2 /* FriendSearchDelegate.swift in Sources */, + 37D71E5C2B305FF90004188A /* FindRoadViewModel.swift in Sources */, 3B0D6AA92ABBD1A900B08CAB /* LoginConstants.swift in Sources */, 374DB4682B247CC800AF648C /* MyPageViewController.swift in Sources */, 37D5D7872B19CEA100302EAD /* Participants.swift in Sources */, @@ -1673,13 +1687,13 @@ 37E0D8AD2B180804002E0CF5 /* ParticipantsViewController.swift in Sources */, 3B6BA9892A7F7D0900A11FE4 /* SignInViewModel.swift in Sources */, 3B274D822AD4D40700D79698 /* AppCoordinator.swift in Sources */, + 37E8B8402B31B192008D0F3D /* CarRouteService.swift in Sources */, 37E0D8B42B180A68002E0CF5 /* DefaultParticipantsCoordinator.swift in Sources */, 3737AE922AE93FB000FE7453 /* SearchPlacesMapCoordinator.swift in Sources */, 3B274D7D2AD4D19B00D79698 /* SignUpViewModel.swift in Sources */, 3B4A66112B1634C900DF9C84 /* FriendSearchViewModel.swift in Sources */, 374EAEAC2B260BA900BAA897 /* BaseTabBarCoordinator.swift in Sources */, 3B4A66082B16148C00DF9C84 /* GroupService.swift in Sources */, - 37E1B8432B2DAD0C0047C7C7 /* PartiGetLocationViewModel.swift in Sources */, 37C35EDF2B1CC6FE008A289D /* MakeNewFriendsListViewModel.swift in Sources */, 3B26F32F2AC11DAD00EFEE12 /* SignUpViewController.swift in Sources */, 3B4A66012B1609F000DF9C84 /* GroupTableViewCell.swift in Sources */, @@ -1687,6 +1701,7 @@ 3B274D6D2AD3F6F400D79698 /* Coordinator.swift in Sources */, 3B9693D82B175346001DDAE8 /* DefaultCreateGroupCoordinator.swift in Sources */, 3737AE982AE983F600FE7453 /* SearchPlacesMapService.swift in Sources */, + 37D71E5E2B3060030004188A /* FindRoadCoordinator.swift in Sources */, 3754BB702A9B455100522420 /* Color+Ext.swift in Sources */, 37F903A62AF9BD2F008120B6 /* EncodedQuery.swift in Sources */, 37571BFC2A8619CB0069AC65 /* MainMapViewController.swift in Sources */, @@ -1706,8 +1721,8 @@ 3758F18E2A7D007200E2933C /* SceneDelegate.swift in Sources */, 3BB85C052B19D33400F8BBF3 /* FriendSearchViewController.swift in Sources */, 3B274D802AD4D2E200D79698 /* SignUpCoordinatorProtocol.swift in Sources */, - 37E1B8372B2D966A0047C7C7 /* PartiGetLocationCoordinator.swift in Sources */, 37C198C32B2760C000D68196 /* MapViewModelProtocol.swift in Sources */, + 37D71E5A2B305FD90004188A /* FindRoadViewController.swift in Sources */, 371C1D2F2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift in Sources */, 37CE1EAF2AE75813009CDA21 /* SearchPlace.swift in Sources */, 3737AE8E2AE93EE600FE7453 /* SearchPlacesTableViewCell.swift in Sources */, @@ -1759,7 +1774,7 @@ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_ARC = NO; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; @@ -1821,7 +1836,7 @@ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_ARC = NO; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; @@ -1875,12 +1890,16 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CLANG_ENABLE_OBJC_ARC = NO; + CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_ENTITLEMENTS = TWTW/TWTW.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = LVBMDY357W; ENABLE_TESTING_SEARCH_PATHS = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/TWTW/DaumMap.embeddedframework", + ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TWTW/Info.plist; INFOPLIST_KEY_NSCameraUsageDescription = "카메라에 접근하기"; @@ -1916,12 +1935,16 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CLANG_ENABLE_OBJC_ARC = NO; + CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_ENTITLEMENTS = TWTW/TWTW.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = LVBMDY357W; ENABLE_TESTING_SEARCH_PATHS = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/TWTW/DaumMap.embeddedframework", + ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TWTW/Info.plist; INFOPLIST_KEY_NSCameraUsageDescription = "카메라에 접근하기"; diff --git a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift index c155a89e..842147c4 100644 --- a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift +++ b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift @@ -20,7 +20,7 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { init(navigationController: UINavigationController) { self.navigationController = navigationController - mainMapViewModel = MainMapViewModel(coordinator: self, routeService: RouteService()) + mainMapViewModel = MainMapViewModel(coordinator: self) } // MARK: - Fuctions diff --git a/TWTW/TWTW/Map/Model/CarRoute.swift b/TWTW/TWTW/Map/Model/CarRoute.swift index d3cdcb11..a0755540 100644 --- a/TWTW/TWTW/Map/Model/CarRoute.swift +++ b/TWTW/TWTW/Map/Model/CarRoute.swift @@ -2,40 +2,12 @@ // CarRoute.swift // TWTW // -// Created by 정호진 on 11/23/23. +// Created by 박다미 on 2023/12/19. // import Foundation -struct CarRoute: Codable { - let code: Int? - let message, currentDateTime: String? - let route: Route? -} - -struct Route: Codable { - let trafast: [Trafast]? -} - -struct Trafast: Codable { - let summary: Summary? - let path: [[Double]]? -} - -struct Summary: Codable { - let start, goal: Goal? - let waypoints: [Goal]? - let distance, duration: Int? - let bbox: [[Double]]? - let tollFare, taxiFare, fuelPrice: Int? -} - -struct Goal: Codable { - let location: [[Double]]? - let dir, distance, duration, pointIndex: Int? -} - -/// 자동차 길찾기 Body +// 자동차 경로 요청 구조체 struct CarRouteRequest: Codable { let start: String let end: String @@ -44,3 +16,28 @@ struct CarRouteRequest: Codable { let fuel: String let car: Int } + +// 자동차 경로 응답 구조체 +struct CarRouteResponse: Codable { + struct Summary: Codable { + let start: String? + let goal: String? + let waypoints: [String]? + let distance: Double + let duration: Double + let bbox: [Double]? + let tollFare: Int + let taxiFare: Int + let fuelPrice: Int + } + + struct Path: Codable { + let path: [[Double]] + } + + let code: Int + let message: String? + let currentDateTime: String? + let route: [String: [Path]] + let summary: Summary +} diff --git a/TWTW/TWTW/Map/Protocol/CarRouteProtocol.swift b/TWTW/TWTW/Map/Protocol/CarRouteProtocol.swift new file mode 100644 index 00000000..e6dee6ab --- /dev/null +++ b/TWTW/TWTW/Map/Protocol/CarRouteProtocol.swift @@ -0,0 +1,9 @@ +// +// CarRouteProtocol.swift +// TWTW +// +// Created by 박다미 on 2023/12/19. +// + +import Foundation + diff --git a/TWTW/TWTW/Map/Protocol/RouteProtocol.swift b/TWTW/TWTW/Map/Protocol/RouteProtocol.swift deleted file mode 100644 index 89481cde..00000000 --- a/TWTW/TWTW/Map/Protocol/RouteProtocol.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// RouteProtocol.swift -// TWTW -// -// Created by 정호진 on 11/23/23. -// - -import Foundation -import RxSwift - -protocol RouteProtocol { - func carRoute(request: CarRouteRequest) -> Observable -} diff --git a/TWTW/TWTW/Map/Service/RouteService.swift b/TWTW/TWTW/Map/Service/RouteService.swift index b758654a..aceb6630 100644 --- a/TWTW/TWTW/Map/Service/RouteService.swift +++ b/TWTW/TWTW/Map/Service/RouteService.swift @@ -13,7 +13,7 @@ final class RouteService: RouteProtocol { /// 자동차 경로 찾기 /// - Parameter request: CarRouteRequest Model /// - Returns: CarRoute - func carRoute(request: CarRouteRequest) -> Observable { + func carRoute(request: CarRouteRequest1) -> Observable { let url = Domain.RESTAPI + RoutePath.car.rawValue let headers = Header.header.getHeader() @@ -23,7 +23,7 @@ final class RouteService: RouteProtocol { parameters: request, encoder: JSONParameterEncoder.default, headers: headers) - .responseDecodable(of: CarRoute.self) { response in + .responseDecodable(of: CarRoute1.self) { response in switch response.result { case .success(let data): observer.onNext(data) @@ -34,5 +34,44 @@ final class RouteService: RouteProtocol { return Disposables.create() } } - +} +protocol RouteProtocol { + func carRoute(request: CarRouteRequest1) -> Observable +} +struct CarRoute1: Codable { + let code: Int? + let message, currentDateTime: String? + let route: Route? +} + +struct Route: Codable { + let trafast: [Trafast]? +} + +struct Trafast: Codable { + let summary: Summary? + let path: [[Double]]? +} + +struct Summary: Codable { + let start, goal: Goal? + let waypoints: [Goal]? + let distance, duration: Int? + let bbox: [[Double]]? + let tollFare, taxiFare, fuelPrice: Int? +} + +struct Goal: Codable { + let location: [[Double]]? + let dir, distance, duration, pointIndex: Int? +} + +/// 자동차 길찾기 Body +struct CarRouteRequest1: Codable { + let start: String + let end: String + let way: String + let option: String + let fuel: String + let car: Int } diff --git a/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift b/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift index c590f5d8..d1a7e10c 100644 --- a/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift +++ b/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift @@ -68,12 +68,12 @@ class KakaoMapViewController: UIViewController, MapControllerDelegate { override func viewDidAppear(_ animated: Bool) { } - +// // override func viewWillDisappear(_ animated: Bool) { // appear = false // mapController?.stopRendering() // 렌더링 중지. // } - +// // override func viewDidDisappear(_ animated: Bool) { // removeObservers() // mapController?.stopEngine() // 엔진 정지. 추가되었던 ViewBase들이 삭제된다. diff --git a/TWTW/TWTW/Map/ViewModel/MainMapViewModel.swift b/TWTW/TWTW/Map/ViewModel/MainMapViewModel.swift index 7b040909..5dbe678b 100644 --- a/TWTW/TWTW/Map/ViewModel/MainMapViewModel.swift +++ b/TWTW/TWTW/Map/ViewModel/MainMapViewModel.swift @@ -17,7 +17,6 @@ import UIKit /// MainMapViewModel final class MainMapViewModel { private let coordinator: DefaultMainMapCoordinator? - private let routeService: RouteProtocol? private let disposeBag = DisposeBag() struct Input { @@ -66,9 +65,8 @@ final class MainMapViewModel { } // MARK: - init - init(coordinator: DefaultMainMapCoordinator?, routeService: RouteProtocol) { + init(coordinator: DefaultMainMapCoordinator?) { self.coordinator = coordinator - self.routeService = routeService } /// bind @@ -115,7 +113,7 @@ final class MainMapViewModel { option: "TRAFAST", fuel: "DIESEL", car: 1) - getCarRoute(body: body, output: output) + // getCarRoute(body: body, output: output) } .disposed(by: disposeBag) @@ -145,13 +143,13 @@ final class MainMapViewModel { } /// 자동차 경로 가져오기 - private func getCarRoute(body: CarRouteRequest, output: Output) { - routeService?.carRoute(request: body) - .subscribe(onNext: { route in - output.destinationPathRelay.accept(route.route?.trafast?.first?.path ?? []) - }, onError: { error in - print(error) - }) - .disposed(by: disposeBag) - } +// private func getCarRoute(body: CarRouteRequest, output: Output) { +// routeService?.carRoute(request: body) +// .subscribe(onNext: { route in +// output.destinationPathRelay.accept(route.route?.trafast?.first?.path ?? []) +// }, onError: { error in +// print(error) +// }) +// .disposed(by: disposeBag) +// } } diff --git a/TWTW/TWTW/Participants/FindRoad/CarRouteService.swift b/TWTW/TWTW/Participants/FindRoad/CarRouteService.swift new file mode 100644 index 00000000..2b10cad3 --- /dev/null +++ b/TWTW/TWTW/Participants/FindRoad/CarRouteService.swift @@ -0,0 +1,8 @@ +// +// CarRouteService.swift +// TWTW +// +// Created by 박다미 on 2023/12/19. +// + +import Foundation diff --git a/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift b/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift new file mode 100644 index 00000000..df84847f --- /dev/null +++ b/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift @@ -0,0 +1,29 @@ +// +// DefaultsFindRoadCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/18. +// + +import Foundation +import UIKit + +final class DefaultsFindRoadCoordinator: FindRoadCoordinator { + var childCoordinators: [Coordinator] = [] + var navigationController: UINavigationController + private var findRoadViewModel: FindRoadViewModel? + + // MARK: - Init + init(navigationController: UINavigationController) { + self.navigationController = navigationController + findRoadViewModel = FindRoadViewModel(coordinator: self) + } + + func start() { + + let findRoadViewModel = FindRoadViewModel(coordinator: self) + let findRoadViewController = FindRoadViewController(viewModel: findRoadViewModel) + navigationController.pushViewController(findRoadViewController, animated: true) + + } +} diff --git a/TWTW/TWTW/Participants/FindRoad/FindRoadCoordinator.swift b/TWTW/TWTW/Participants/FindRoad/FindRoadCoordinator.swift new file mode 100644 index 00000000..296855c4 --- /dev/null +++ b/TWTW/TWTW/Participants/FindRoad/FindRoadCoordinator.swift @@ -0,0 +1,10 @@ +// +// FindRoadCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/18. +// + +import Foundation + +protocol FindRoadCoordinator: Coordinator {} diff --git a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift new file mode 100644 index 00000000..ee3ff409 --- /dev/null +++ b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift @@ -0,0 +1,290 @@ +// +// FindRoadViewController.swift +// TWTW +// +// Created by 박다미 on 2023/12/18. +// + +import CoreLocation +import KakaoMapsSDK +import RxSwift +import UIKit + +final class FindRoadViewController: KakaoMapViewController { + private var destinationCoordinate = CLLocationCoordinate2D(latitude: 37.403419311975, longitude: 126.72003443712) + private var locationManager = CLLocationManager() + + private var currentLocation: CLLocationCoordinate2D? + + private lazy var infoView: UIView = { + let view = UIView() + view.backgroundColor = .white + return view + }() + + private lazy var myLocationLabel: UILabel = { + let label = UILabel() + label.text = "내 위치: 실제 위치" + return label + }() + + private lazy var destinationLabel: UILabel = { + let label = UILabel() + label.text = "목적지: 인천광역시 남동구 논현동 633-8" + return label + }() + + private lazy var carRouteButton: UIButton = { + let button = UIButton() + button.setTitle("자동차 경로", for: .normal) + button.backgroundColor = .blue + return button + }() + + private lazy var walkRouteButton: UIButton = { + let button = UIButton() + button.setTitle("인도", for: .normal) + button.backgroundColor = .green + return button + }() + + private let viewModel: FindRoadViewModel + private let disposeBag = DisposeBag() + + // MARK: - Init + init(viewModel: FindRoadViewModel) { + self.viewModel = viewModel + super.init() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - View Lifecycle + + override func viewDidLoad() { + super.viewDidLoad() + setupUI() + setupLocationManager() + + carRouteButton.rx.tap + .subscribe(onNext: { [weak self] _ in + print("차 길 보기") + self?.drawCarRoute() + + }) + .disposed(by: disposeBag) + walkRouteButton.rx.tap + .subscribe(onNext: { [weak self] _ in + print("인도 길 보기") + self?.drawWalkRoute() + + }) + .disposed(by: disposeBag) + } + + // MARK: - Setup UI + + private func setupUI() { + view.addSubview(infoView) + infoView.addSubview(myLocationLabel) + infoView.addSubview(destinationLabel) + infoView.addSubview(carRouteButton) + infoView.addSubview(walkRouteButton) + + infoView.snp.makeConstraints { make in + make.top.leading.trailing.equalTo(view.safeAreaLayoutGuide).inset(0) + make.height.equalTo(150) + } + + myLocationLabel.snp.makeConstraints { make in + make.top.equalTo(infoView.snp.top).offset(20) + make.leading.trailing.equalTo(infoView).inset(10) + } + + destinationLabel.snp.makeConstraints { make in + make.top.equalTo(myLocationLabel.snp.bottom).offset(10) + make.leading.trailing.equalTo(infoView).inset(10) + } + + carRouteButton.snp.makeConstraints { make in + make.top.equalTo(destinationLabel.snp.bottom).offset(20) + make.leading.equalTo(infoView.snp.leading).offset(10) + make.height.equalTo(50) + } + + walkRouteButton.snp.makeConstraints { make in + make.top.equalTo(destinationLabel.snp.bottom).offset(20) + make.trailing.equalTo(infoView.snp.trailing).offset(-10) + make.height.equalTo(50) + make.leading.equalTo(carRouteButton.snp.trailing).offset(10) + make.width.equalTo(carRouteButton.snp.width) + } + } + + private func setupLocationManager() { + locationManager.delegate = self + locationManager.desiredAccuracy = kCLLocationAccuracyBest + locationManager.requestWhenInUseAuthorization() + locationManager.startUpdatingLocation() + } + +} + + +extension FindRoadViewController { + + // 경로 레이어 제거 함수 + private func removeRouteLayer(layerID: String) { + guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } + let manager = mapView.getRouteManager() + manager.removeRouteLayer(layerID: layerID) + } + + private func drawCarRoute() { + removeRouteLayer(layerID: "CarRouteLayer") + removeRouteLayer(layerID: "WalkRouteLayer") + + guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } + let manager = mapView.getRouteManager() + + let layer = manager.addRouteLayer(layerID: "CarRouteLayer", zOrder: 0) + + createRouteStyleSet() + + guard let currentLocation = currentLocation else { + print("현재 위치 정보가 없습니다.") + return + } + let destination = CLLocationCoordinate2D(latitude: 39.403419311975, longitude: 125.72003443712) + let startMapPoint = MapPoint(longitude: currentLocation.longitude, latitude: currentLocation.latitude) + let endMapPoint = MapPoint(longitude: destination.longitude, latitude: destination.latitude) + let segment = RouteSegment(points: [startMapPoint, endMapPoint], styleIndex: 0) + + let options = RouteOptions(routeID: "CarRoute", styleID: "routeStyleSet1", zOrder: 0) + options.segments = [segment] + let route = layer?.addRoute(option: options) + route?.show() + } + + private func drawWalkRoute() { + removeRouteLayer(layerID: "CarRouteLayer") + removeRouteLayer(layerID: "WalkRouteLayer") + + guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } + let manager = mapView.getRouteManager() + + // 1 RouteLayer 생성 + let layer = manager.addRouteLayer(layerID: "WalkRouteLayer", zOrder: 0) + + // 2 RouteStyleSet 생성 + createRouteStyleSet() + + // 3 RouteSegment 생성 + guard let currentLocation = currentLocation else { + print("현재 위치 정보가 없습니다.") + return + } + let destination = CLLocationCoordinate2D(latitude: 38.403419311975, longitude: 126.72003443712) + let startMapPoint = MapPoint(longitude: currentLocation.longitude, latitude: currentLocation.latitude) + let endMapPoint = MapPoint(longitude: destination.longitude, latitude: destination.latitude) + let segment = RouteSegment(points: [startMapPoint, endMapPoint], styleIndex: 0) + + // 4 Route 추가 + let options = RouteOptions(routeID: "walkRoute", styleID: "routeStyleSet1", zOrder: 0) + options.segments = [segment] + let route = layer?.addRoute(option: options) + route?.show() + } + + /// 선택한 좌표로 카메라 옮기기 + private func moveCameraToCoordinate(_ coordinate: CLLocationCoordinate2D, _ output: MainMapViewModel.Output) { + guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } + mapView.animateCamera(cameraUpdate: CameraUpdate.make(target: MapPoint(longitude: coordinate.longitude, + latitude: coordinate.latitude), + zoomLevel: 15, + rotation: 1.7, + tilt: 0.0, + mapView: mapView), + options: CameraAnimationOptions(autoElevation: true, + consecutive: true, + durationInMillis: 2000), + callback: { }) + } + + // MARK: - Route Functions + + /// 길찾기 표시 + private func createRouteStyleSet() { + guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } + // 라우트 매니저 초기화 + let manager = mapView.getRouteManager() + manager.removeRouteLayer(layerID: "RouteLayer") + // 라우트 레이어 추가 + _ = manager.addRouteLayer(layerID: "RouteLayer", zOrder: 0) + // 라인 패턴 이미지 배열 + let patternImages = [UIImage(named: "route_pattern_arrow.png"), + UIImage(named: "route_pattern_walk.png"), + UIImage(named: "route_pattern_long_dot.png")] + + // pattern + let styleSet = RouteStyleSet(styleID: "routeStyleSet1") + guard let image1 = patternImages[0], let image2 = patternImages[1] else {return} + styleSet.addPattern(RoutePattern(pattern: image1, distance: 60, symbol: nil, pinStart: false, pinEnd: false)) + styleSet.addPattern(RoutePattern(pattern: image2, distance: 6, symbol: nil, pinStart: false, pinEnd: false)) + + let routeStyle = RouteStyle(styles: [ + PerLevelRouteStyle(width: 15, + color: UIColor.mapLineColor ?? .clear, + strokeWidth: 4, + strokeColor: UIColor.mapStrokeColor ?? .clear, + level: 0, + patternIndex: 0) + ]) + + styleSet.addStyle(routeStyle) + manager.addRouteStyleSet(styleSet) + } +} +// MARK: - CLLocationManagerDelegate +extension FindRoadViewController: CLLocationManagerDelegate { + + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + guard let location = locations.last else { return } + let newCoordinate = location.coordinate + + if currentLocation == nil { + currentLocation = newCoordinate + } + + // Update UI with current location + myLocationLabel.text = "내 위치: \(newCoordinate.latitude), \(newCoordinate.longitude)" + + // Move camera to new location + moveCameraToCoordinate(newCoordinate) + } + + + func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + switch status { + case .authorizedWhenInUse, .authorizedAlways: + locationManager.startUpdatingLocation() + default: + // 위치 서비스 권한 처리 + break + } + } + + + private func moveCameraToCoordinate(_ coordinate: CLLocationCoordinate2D) { + guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } + mapView.animateCamera(cameraUpdate: CameraUpdate.make(target: MapPoint(longitude: coordinate.longitude, + latitude: coordinate.latitude), + zoomLevel: 15, + rotation: 1.7, + tilt: 0.0, + mapView: mapView), options: .init()) + } +} diff --git a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift b/TWTW/TWTW/Participants/FindRoad/FindRoadViewModel.swift similarity index 50% rename from TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift rename to TWTW/TWTW/Participants/FindRoad/FindRoadViewModel.swift index dd808d68..af72fe3e 100644 --- a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewModel.swift +++ b/TWTW/TWTW/Participants/FindRoad/FindRoadViewModel.swift @@ -1,19 +1,20 @@ // -// PartiGetLocationViewModel.swift +// FindRoadViewModel.swift // TWTW // -// Created by 박다미 on 2023/12/16. +// Created by 박다미 on 2023/12/18. // +import Foundation import RxSwift import UIKit -final class PartiGetLocationViewModel { +final class FindRoadViewModel { private let disposeBag = DisposeBag() - weak var coordinator: DefaultPartiGetLocationCoordinator? + weak var coordinator: DefaultsFindRoadCoordinator? // MARK: - Init - init(coordinator: DefaultPartiGetLocationCoordinator) { + init(coordinator: DefaultsFindRoadCoordinator) { self.coordinator = coordinator } diff --git a/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift b/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift deleted file mode 100644 index e7afec6c..00000000 --- a/TWTW/TWTW/Participants/GetParicipants/DefaultPartiGetLocationCoordinator.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// DefaultPartiGetLocationCoordinator.swift -// TWTW -// -// Created by 박다미 on 2023/12/16. -// - -import Foundation -import UIKit - -final class DefaultPartiGetLocationCoordinator: PartiGetLocationCoordinator { - var childCoordinators: [Coordinator] = [] - var navigationController: UINavigationController - private var partiGetLocationViewModel: PartiGetLocationViewModel? - - // MARK: - Init - init(navigationController: UINavigationController) { - self.navigationController = navigationController - partiGetLocationViewModel = PartiGetLocationViewModel(coordinator: self) - } - - func start() { - - let partiGetLocationViewModel = PartiGetLocationViewModel(coordinator: self) - let partiGetLocationVC = PartiGetLocationViewController(viewModel: partiGetLocationViewModel) - navigationController.pushViewController(partiGetLocationVC, animated: true) - - } -} diff --git a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationCoordinator.swift b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationCoordinator.swift deleted file mode 100644 index ef77442a..00000000 --- a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationCoordinator.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// PartiGetLocationCoordinator.swift -// TWTW -// -// Created by 박다미 on 2023/12/16. -// - -import Foundation - -protocol PartiGetLocationCoordinator: Coordinator {} diff --git a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewController.swift b/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewController.swift deleted file mode 100644 index 4b39958d..00000000 --- a/TWTW/TWTW/Participants/GetParicipants/PartiGetLocationViewController.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// PartiGetLocationViewController.swift -// TWTW -// -// Created by 박다미 on 2023/12/16. -// - -import RxCocoa -import RxSwift -import UIKit - -final class PartiGetLocationViewController: UIViewController { - private let disposeBag = DisposeBag() - private var viewModel: PartiGetLocationViewModel - - - // MARK: - Init - init(viewModel: PartiGetLocationViewModel) { - self.viewModel = viewModel - super.init(nibName: nil, bundle: nil) - } - - @available(*, unavailable) - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - override func viewDidLoad() { - super.viewDidLoad() - view.backgroundColor = .green - } -} diff --git a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift index 3524591e..9041cb59 100644 --- a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift +++ b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift @@ -33,8 +33,8 @@ final class DefaultPlansCoordinator: PlanCoordinator { } - func moveToPartiGetLocation() { - let partiGetLocationCoordinator = DefaultPartiGetLocationCoordinator(navigationController: navigationController) + func moveToPlan() { + let partiGetLocationCoordinator = DefaultPlansCoordinator(navigationController: navigationController) partiGetLocationCoordinator.start() childCoordinators.append(partiGetLocationCoordinator) } @@ -45,8 +45,6 @@ final class DefaultPlansCoordinator: PlanCoordinator { childCoordinators.append(plansFromAlertCoordinator) } func addPlans() { - let plansCoordinator = DefaultPlansCoordinator(navigationController: navigationController) - childCoordinators.append(plansCoordinator) - plansCoordinator.startFromAlert() + self.startFromAlert() } } diff --git a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift index 17dc64d4..e01c4afa 100644 --- a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift +++ b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift @@ -41,11 +41,11 @@ final class DefaultPlansFromAlertCoordinator: PlanFromAlertCoordinator { navigationController.popToRootViewController(animated: true) } /// 길찾기 - func moveToFindRoad() { - let findRoadCoordinator = DefaultsFindRoadCoordinator(navigationController: navigationController) - childCoordinators.append(findRoadCoordinator) - findRoadCoordinator.start() - } +// func moveToFindRoad() { +// let findRoadCoordinator = DefaultsFindRoadCoordinator(navigationController: navigationController) +// childCoordinators.append(findRoadCoordinator) +// findRoadCoordinator.start() +// } } extension DefaultPlansFromAlertCoordinator: FriendsSendListCoordinatorDelegate { diff --git a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift index e9082d3a..5cc95027 100644 --- a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift +++ b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift @@ -39,7 +39,7 @@ final class PlansViewModel { coordinator.moveToPartiSetLocation() case .fromTabBar: print("탭바에서 호출됨") - coordinator.moveToPartiGetLocation() + coordinator.moveToPartiSetLocation() } }.disposed(by: disposeBag) From afca2e66518159dfd1d1c322d038fa964da528a3 Mon Sep 17 00:00:00 2001 From: dami Date: Wed, 20 Dec 2023 01:22:35 +0900 Subject: [PATCH 13/24] =?UTF-8?q?feat:=20=EC=B5=9C=EA=B7=BC=20search?= =?UTF-8?q?=EC=9E=A5=EC=86=8C=20keychain=EC=9C=BC=EB=A1=9C=20=EB=84=A3?= =?UTF-8?q?=EA=B3=A0=20delegate=EC=A0=84=EB=8B=AC=20=EC=A7=80=EC=9B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 8 +++++ TWTW/TWTW/Login/Model/LoginConstants.swift | 1 + TWTW/TWTW/Map/DefaultMainMapCoordinator.swift | 22 +++++-------- .../MainMapViewController.swift | 19 +++++++++-- TWTW/TWTW/Notification.swift | 12 +++++++ TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift | 23 ++++++++++--- .../DefaultPlansFromAlertCoordinator.swift | 5 ++- .../PlansFromAlertViewController.swift | 5 ++- .../FromAlert/PlansFromAlertViewModel.swift | 14 +++++++- TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift | 6 ++-- .../DefaultSearchPlacesMapCoordinator.swift | 10 +++--- .../TWTW/SearchPlaces/Model/SearchPlace.swift | 4 +-- .../Model/SearchPlacesConstraints.swift | 16 ++++++++++ .../SearchPlacesMapCoordinator.swift | 3 +- .../SearchPlacesMapCoordDelegate.swift | 3 +- .../View/SearchPlacesMapViewController.swift | 10 +++++- .../ViewModel/SearchPlacesMapViewModel.swift | 32 +++++++++++++++---- .../Mock/MockSearchPlacesMapCoordinator.swift | 2 +- .../Mock/MockSearchPlacesMapService.swift | 6 ++-- 19 files changed, 150 insertions(+), 51 deletions(-) create mode 100644 TWTW/TWTW/Notification.swift create mode 100644 TWTW/TWTW/SearchPlaces/Model/SearchPlacesConstraints.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index c3c34d15..7851100b 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -100,6 +100,8 @@ 37E8B83C2B31AE40008D0F3D /* CarRouteProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E8B83B2B31AE40008D0F3D /* CarRouteProtocol.swift */; }; 37E8B83E2B31AFA0008D0F3D /* CarRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E8B83D2B31AFA0008D0F3D /* CarRoute.swift */; }; 37E8B8402B31B192008D0F3D /* CarRouteService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E8B83F2B31B192008D0F3D /* CarRouteService.swift */; }; + 37E8B8422B31E31A008D0F3D /* SearchPlacesConstraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E8B8412B31E31A008D0F3D /* SearchPlacesConstraints.swift */; }; + 37E8B8442B31ED72008D0F3D /* Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E8B8432B31ED72008D0F3D /* Notification.swift */; }; 37E9FBFB2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E9FBFA2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift */; }; 37E9FBFE2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E9FBFD2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift */; }; 37EF0CFB2AB85C2400D77B0A /* UIViewController+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37EF0CFA2AB85C2400D77B0A /* UIViewController+Ext.swift */; }; @@ -277,6 +279,8 @@ 37E8B83B2B31AE40008D0F3D /* CarRouteProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarRouteProtocol.swift; sourceTree = ""; }; 37E8B83D2B31AFA0008D0F3D /* CarRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarRoute.swift; sourceTree = ""; }; 37E8B83F2B31B192008D0F3D /* CarRouteService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarRouteService.swift; sourceTree = ""; }; + 37E8B8412B31E31A008D0F3D /* SearchPlacesConstraints.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlacesConstraints.swift; sourceTree = ""; }; + 37E8B8432B31ED72008D0F3D /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = ""; }; 37E9FBFA2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCustomTabButtonsView.swift; sourceTree = ""; }; 37E9FBFD2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMapCustomTabButtonViewModel.swift; sourceTree = ""; }; 37EF0CFA2AB85C2400D77B0A /* UIViewController+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Ext.swift"; sourceTree = ""; }; @@ -484,6 +488,7 @@ 37BAF8952A949C4900BD85DC /* Config.xcconfig */, 3758F1992A7D007300E2933C /* Info.plist */, 3758F1C12A7E741C00E2933C /* TWTW.entitlements */, + 37E8B8432B31ED72008D0F3D /* Notification.swift */, ); path = TWTW; sourceTree = ""; @@ -1257,6 +1262,7 @@ children = ( 37CE1EAE2AE75813009CDA21 /* SearchPlace.swift */, 3760CC8E2AE2CB7800CFC2D5 /* SurroundSearchPlaces.swift */, + 37E8B8412B31E31A008D0F3D /* SearchPlacesConstraints.swift */, ); path = Model; sourceTree = ""; @@ -1613,6 +1619,7 @@ 37D71E432B2F687B0004188A /* DefaultPlansFromAlertCoordinator.swift in Sources */, 3BAA4A192ADC1DEA009D14E7 /* SignUpProtocol.swift in Sources */, 3BB85C012B19B4B800F8BBF3 /* FriendService.swift in Sources */, + 37E8B8442B31ED72008D0F3D /* Notification.swift in Sources */, 3788AEBA2B18DD0A007FC2F6 /* PlansViewController.swift in Sources */, 3737AE8C2AE93EE600FE7453 /* DefaultSearchPlacesMapCoordinator.swift in Sources */, 3737AE8D2AE93EE600FE7453 /* SearchPlacesMapViewModel.swift in Sources */, @@ -1650,6 +1657,7 @@ 37E0D8AF2B1809EE002E0CF5 /* ParticipantsCoordinator.swift in Sources */, 37C733752B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift in Sources */, 37D5D78F2B19EAEB00302EAD /* PlanTableViewCell.swift in Sources */, + 37E8B8422B31E31A008D0F3D /* SearchPlacesConstraints.swift in Sources */, 3788AEBE2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift in Sources */, 3B274D792AD4584600D79698 /* SignInCoordinatorProtocol.swift in Sources */, 3B4A66062B16147600DF9C84 /* GroupProtocol.swift in Sources */, diff --git a/TWTW/TWTW/Login/Model/LoginConstants.swift b/TWTW/TWTW/Login/Model/LoginConstants.swift index efeb1409..c8718d5c 100644 --- a/TWTW/TWTW/Login/Model/LoginConstants.swift +++ b/TWTW/TWTW/Login/Model/LoginConstants.swift @@ -35,3 +35,4 @@ enum LoginImageTitle: String { case photo = "add_a_photo" case profile } + diff --git a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift index 842147c4..473b0af4 100644 --- a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift +++ b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift @@ -35,8 +35,7 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { /// SearchPlacesMapCoordinator 시작하는 메소드 func moveSearch(output: MainMapViewModel.Output) { mainMapViewModelOutput = output - let searchPlacesMapCoordinator = DefaultSearchPlacesMapCoordinator(navigationController: navigationController, - delegate: self) + let searchPlacesMapCoordinator = DefaultSearchPlacesMapCoordinator(navigationController: navigationController) _ = KeychainWrapper.saveItem(value: "\(output.myLocatiaonRelay.value.latitude)", forKey: "latitude") _ = KeychainWrapper.saveItem(value: "\(output.myLocatiaonRelay.value.longitude)", forKey: "longitude") searchPlacesMapCoordinator.start() @@ -61,18 +60,13 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { plansCoordinator.start() childCoordinators.append(plansCoordinator) } - + /// 알림 화면으로 이동 + func moveToPlansFromTabBar() { + + let plansCoordinator = DefaultPlansCoordinator(navigationController: navigationController) + plansCoordinator.planStartFromTabBar() + childCoordinators.append(plansCoordinator) + } } -// MARK: - SearchPlacesCoordinator에서 좌표 받는 함수 - -extension DefaultMainMapCoordinator: SearchPlacesMapCoordDelegate { - func didSelectCoordinate(coordinate: CLLocationCoordinate2D, placeName: String, roadAddressName: String) { - navigationController.popViewController(animated: true) - mainMapViewModelOutput?.cameraCoordinateObservable.accept(coordinate) - if let mainMapVC = navigationController.viewControllers.last as? MainMapViewController { - mainMapVC.updateViewState(to: .searchMap, placeName: placeName, roadAddressName: roadAddressName) - } - } -} diff --git a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift index 4d5b2c39..7bc5a446 100644 --- a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift +++ b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift @@ -88,6 +88,7 @@ final class MainMapViewController: KakaoMapViewController { super.viewDidLoad() bind() setupUI() + setNotificationFromSearchPlace() } /// 지도 그리기 @@ -105,6 +106,16 @@ final class MainMapViewController: KakaoMapViewController { } // MARK: - Set Up + private func setNotificationFromSearchPlace() { + NotificationCenter.default.addObserver(forName: .didFinishSearchPlaces, object: nil, queue: nil) { [weak self] _ in + self?.updateViewState(to: .searchMap) + + } + } + + deinit { + NotificationCenter.default.removeObserver(self) + } /// Setting UI private func setupUI() { @@ -187,21 +198,23 @@ final class MainMapViewController: KakaoMapViewController { self.output = output } - func updateViewState(to newViewState: ViewState, placeName: String, roadAddressName: String) { + func updateViewState(to newViewState: ViewState) { currentViewType = newViewState switch currentViewType { case .mainMap: searchPlaceBottomSheet.removeFromSuperview() case .searchMap: - addSearchPlaceBottomSheet(placeName: placeName, roadAddressName: roadAddressName) + addSearchPlaceBottomSheet() } configureUIComponentsFor(currentViewType) } - private func addSearchPlaceBottomSheet(placeName: String, roadAddressName: String) { + private func addSearchPlaceBottomSheet() { searchPlaceBottomSheet.removeFromSuperview() configureConstraintsBottomSheet() + let placeName = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.placeName.rawValue) ?? "" + let roadAddressName = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.roadAddressName.rawValue) ?? "" searchPlaceBottomSheet.setupPlace(name: placeName, address: roadAddressName) } diff --git a/TWTW/TWTW/Notification.swift b/TWTW/TWTW/Notification.swift new file mode 100644 index 00000000..ca487945 --- /dev/null +++ b/TWTW/TWTW/Notification.swift @@ -0,0 +1,12 @@ +// +// Notification.swift +// TWTW +// +// Created by 박다미 on 2023/12/20. +// + +import Foundation + +extension Notification.Name { + static let didFinishSearchPlaces = Notification.Name("didFinishSearchPlaces") +} diff --git a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift index 9041cb59..d8ab45fe 100644 --- a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift +++ b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift @@ -22,6 +22,19 @@ final class DefaultPlansCoordinator: PlanCoordinator { navigationController.pushViewController(plansViewController, animated: true) } + //첫 지도화면에서 탭바버튼으로 + func planStartFromTabBar() { + let plansViewModel = PlansViewModel( + coordinator: self, + caller: .fromTabBar + ) + let plansViewController = PlansViewController(viewModel: plansViewModel) + + navigationController.pushViewController(plansViewController, animated: false) + + + } + func startFromAlert() { let plansViewModel = PlansViewModel( coordinator: self, @@ -33,13 +46,13 @@ final class DefaultPlansCoordinator: PlanCoordinator { } - func moveToPlan() { - let partiGetLocationCoordinator = DefaultPlansCoordinator(navigationController: navigationController) - partiGetLocationCoordinator.start() - childCoordinators.append(partiGetLocationCoordinator) + func moveToPlanFromTabBar() { + let findRoadCoordinator = DefaultsFindRoadCoordinator(navigationController: navigationController) + findRoadCoordinator.start() + childCoordinators.append(findRoadCoordinator) } - func moveToPartiSetLocation() { + func moveToplansFromAlert() { let plansFromAlertCoordinator = DefaultPlansFromAlertCoordinator(navigationController: navigationController) plansFromAlertCoordinator.start() childCoordinators.append(plansFromAlertCoordinator) diff --git a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift index e01c4afa..9b168021 100644 --- a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift +++ b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift @@ -38,7 +38,10 @@ final class DefaultPlansFromAlertCoordinator: PlanFromAlertCoordinator { /// 설정완료후 처음 지도 화면으로 func moveToMain() { childCoordinators.removeAll() - navigationController.popToRootViewController(animated: true) + let mainMapCoordinator = DefaultMainMapCoordinator(navigationController: navigationController) + mainMapCoordinator.start() + childCoordinators.append(mainMapCoordinator) + //navigationController.popToRootViewController(animated: true) } /// 길찾기 // func moveToFindRoad() { diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift index 534e5dbb..e3b49f3c 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift @@ -167,7 +167,10 @@ final class PlansFromAlertViewController: UIViewController { clickedConfirmEvents: confirmButton.rx.tap) let output = viewModel.createOutput(input: input) - + + viewModel.newPlaceName + .bind(to: newPlaceNameLabel.rx.text) + .disposed(by: disposeBag) } private func bindTableView() { viewModel.selectedFriendsObservable diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift index 87414225..d49c1c53 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift @@ -20,7 +20,18 @@ final class PlansFromAlertViewModel { var selectedFriendsObservable: Observable<[Friend]> { return selectedFriendsRelay.asObservable() } - + // 새로 선택된 목적지 명 + var newPlaceName: Observable { + return Observable.create { observer in + if let newPlaceName = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.placeName.rawValue) { + observer.onNext(newPlaceName) + } else { + observer.onNext(" ") + } + observer.onCompleted() + return Disposables.create() + } + } struct Input { // 1.달력버튼 클릭 @@ -54,6 +65,7 @@ final class PlansFromAlertViewModel { moveAddPrticipants() } .disposed(by: disposeBag) + input.clickedConfirmEvents? .bind { [weak self] in guard let self = self else {return } diff --git a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift index 5cc95027..2fa19ef7 100644 --- a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift +++ b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift @@ -36,10 +36,10 @@ final class PlansViewModel { guard let self = self else { return } switch self.caller { case .fromAlert: - coordinator.moveToPartiSetLocation() + coordinator.moveToplansFromAlert() case .fromTabBar: print("탭바에서 호출됨") - coordinator.moveToPartiSetLocation() + coordinator.moveToPlanFromTabBar() } }.disposed(by: disposeBag) @@ -47,7 +47,7 @@ final class PlansViewModel { input.addPlans .bind { [weak self] _ in guard let self = self else { return } - coordinator.moveToPartiSetLocation() + coordinator.moveToplansFromAlert() }.disposed(by: disposeBag) } } diff --git a/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift b/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift index a13e8688..6142613c 100644 --- a/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift +++ b/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift @@ -15,14 +15,14 @@ final class DefaultSearchPlacesMapCoordinator: SearchPlacesMapCoordinatorProtoco private let disposeBag = DisposeBag() var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController - weak var delegate: SearchPlacesMapCoordDelegate? + // weak var delegate: SearchPlacesMapCoordDelegate? private var searchPlacesMapViewController: SearchPlacesMapViewController? private var searchPlacesMapViewModel: SearchPlacesMapViewModel? - init(navigationController: UINavigationController, delegate: SearchPlacesMapCoordDelegate) { + init(navigationController: UINavigationController) { self.navigationController = navigationController - self.delegate = delegate + } func start() { @@ -38,8 +38,8 @@ final class DefaultSearchPlacesMapCoordinator: SearchPlacesMapCoordinatorProtoco } /// 서치 완료후 : cLLocation전달 & pop VC - func finishSearchPlaces(coordinate: CLLocationCoordinate2D, placeName: String, roadAddressName: String) { - delegate?.didSelectCoordinate(coordinate: coordinate, placeName: placeName, roadAddressName: roadAddressName) + func finishSearchPlaces() { + // delegate?.didSelectPlace() navigationController.popViewController(animated: true) } } diff --git a/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift b/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift index 88a8b64e..774ba446 100644 --- a/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift +++ b/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift @@ -30,13 +30,13 @@ struct SearchPlace: Codable { let placeName: String? let distance: Int? let placeURL: String? - let addressName, roadAddressName, categoryGroupCode: String? + let roadAddressName: String? let longitude, latitude: Double? enum CodingKeys: String, CodingKey { case placeName, distance case placeURL = "placeUrl" - case addressName, roadAddressName, categoryGroupCode + case roadAddressName case longitude = "longitude" case latitude = "latitude" } diff --git a/TWTW/TWTW/SearchPlaces/Model/SearchPlacesConstraints.swift b/TWTW/TWTW/SearchPlaces/Model/SearchPlacesConstraints.swift new file mode 100644 index 00000000..783466dc --- /dev/null +++ b/TWTW/TWTW/SearchPlaces/Model/SearchPlacesConstraints.swift @@ -0,0 +1,16 @@ +// +// SearchPlacesConstraints.swift +// TWTW +// +// Created by 박다미 on 2023/12/19. +// + +import Foundation + +enum SearchPlaceKeyChain: String { + case placeName + case placeURL + case roadAddressName + case longitude + case latitude +} diff --git a/TWTW/TWTW/SearchPlaces/Protocol/Coordinator/SearchPlacesMapCoordinator.swift b/TWTW/TWTW/SearchPlaces/Protocol/Coordinator/SearchPlacesMapCoordinator.swift index 91076eb8..1e512e0d 100644 --- a/TWTW/TWTW/SearchPlaces/Protocol/Coordinator/SearchPlacesMapCoordinator.swift +++ b/TWTW/TWTW/SearchPlaces/Protocol/Coordinator/SearchPlacesMapCoordinator.swift @@ -11,6 +11,5 @@ import UIKit protocol SearchPlacesMapCoordinatorProtocol: Coordinator { /// 서치 완료후 : cLLocation전달 & pop VC - func finishSearchPlaces(coordinate: CLLocationCoordinate2D, placeName: String, roadAddressName: String) - + func finishSearchPlaces() } diff --git a/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift b/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift index 8e5a6529..8cb9d2b6 100644 --- a/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift +++ b/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift @@ -10,5 +10,6 @@ import Foundation /// SearchPlaces 위치전달로 맵 카메라 이동 protocol SearchPlacesMapCoordDelegate: AnyObject { - func didSelectCoordinate(coordinate: CLLocationCoordinate2D, placeName: String, roadAddressName: String) + func didSelectPlace(searchPlace: SearchPlace) } + diff --git a/TWTW/TWTW/SearchPlaces/View/SearchPlacesMapViewController.swift b/TWTW/TWTW/SearchPlaces/View/SearchPlacesMapViewController.swift index 527ae30a..2b2b5b08 100644 --- a/TWTW/TWTW/SearchPlaces/View/SearchPlacesMapViewController.swift +++ b/TWTW/TWTW/SearchPlaces/View/SearchPlacesMapViewController.swift @@ -44,7 +44,15 @@ final class SearchPlacesMapViewController: UIViewController { hideKeyboard() bindViewModel() } + // MARK: - viewWillDisappear + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + // 제거되는 경우에만 알림을 전송(pop) + if self.isMovingFromParent { + NotificationCenter.default.post(name: .didFinishSearchPlaces, object: nil) + } + } // MARK: - Set Up /// Add UI - SearchBar private func addSubViews() { @@ -121,7 +129,7 @@ final class SearchPlacesMapViewController: UIViewController { cellIdentifier: CellIdentifier.searchPlacesTableViewCell.rawValue, cellType: SearchPlacesTableViewCell.self) ) { _, place, cell in cell.configure(placeName: place.placeName ?? "", - addressName: place.addressName ?? "") + addressName: place.roadAddressName ?? "") } .disposed(by: disposeBag) } diff --git a/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift b/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift index cee57d51..a4ee8c08 100644 --- a/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift +++ b/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift @@ -82,14 +82,32 @@ final class SearchPlacesMapViewModel { input.selectedPlace .bind(onNext: { [weak self] selectedPlace in guard let self = self else { return } + // 장소 이름 저장 + if let placeName = selectedPlace.placeName { + _ = KeychainWrapper.saveItem(value: placeName, forKey: SearchPlaceKeyChain.placeName.rawValue) + } - let placeX = selectedPlace.longitude ?? 0 - let placeY = selectedPlace.latitude ?? 0 - let coordinate = CLLocationCoordinate2D(latitude: placeY, longitude: placeX ) - print(coordinate) - self.coordinator?.finishSearchPlaces(coordinate: coordinate, - placeName: selectedPlace.placeName ?? "", - roadAddressName: selectedPlace.roadAddressName ?? "") + // 장소 URL 저장 + if let placeURL = selectedPlace.placeURL { + _ = KeychainWrapper.saveItem(value: placeURL, forKey: SearchPlaceKeyChain.placeURL.rawValue) + } + + // 도로명 주소 저장 + if let roadAddressName = selectedPlace.roadAddressName { + _ = KeychainWrapper.saveItem(value: roadAddressName, forKey: SearchPlaceKeyChain.roadAddressName.rawValue) + } + + // 경도 저장 + if let longitude = selectedPlace.longitude { + _ = KeychainWrapper.saveItem(value: "\(longitude)", forKey: SearchPlaceKeyChain.longitude.rawValue) + } + + // 위도 저장 + if let latitude = selectedPlace.latitude { + _ = KeychainWrapper.saveItem(value: "\(latitude)", forKey: SearchPlaceKeyChain.latitude.rawValue) + } + //self.coordinator?.finishSearchPlaces(searchPlace: selectedPlace) + self.coordinator?.finishSearchPlaces() }) .disposed(by: disposeBag) diff --git a/TWTW/TWTWServiceUnitTests/SearchPlaces/Mock/MockSearchPlacesMapCoordinator.swift b/TWTW/TWTWServiceUnitTests/SearchPlaces/Mock/MockSearchPlacesMapCoordinator.swift index 8d68f226..c55b0db1 100644 --- a/TWTW/TWTWServiceUnitTests/SearchPlaces/Mock/MockSearchPlacesMapCoordinator.swift +++ b/TWTW/TWTWServiceUnitTests/SearchPlaces/Mock/MockSearchPlacesMapCoordinator.swift @@ -19,7 +19,7 @@ final class MockSearchPlacesMapCoordinator: SearchPlacesMapCoordinatorProtocol { self.navigationController = navigationController } - func finishSearchPlaces(coordinate: CLLocationCoordinate2D, placeName: String, roadAddressName: String) { + func finishSearchPlaces() { finishSearchPlacesCalled = true print("Mock \(#function)") } diff --git a/TWTW/TWTWServiceUnitTests/SearchPlaces/Mock/MockSearchPlacesMapService.swift b/TWTW/TWTWServiceUnitTests/SearchPlaces/Mock/MockSearchPlacesMapService.swift index 1b63e734..3026d6a2 100644 --- a/TWTW/TWTWServiceUnitTests/SearchPlaces/Mock/MockSearchPlacesMapService.swift +++ b/TWTW/TWTWServiceUnitTests/SearchPlaces/Mock/MockSearchPlacesMapService.swift @@ -10,11 +10,9 @@ import RxSwift final class MockSearchPlacesMapService: SearchPlaceProtocol { var mockPlace1 = SearchPlace(placeName: "Place1", distance: 100, placeURL: "url", - addressName: "Address", roadAddressName: "RoadAdd", - categoryGroupCode: "CGC", longitude: 100.0, latitude: 200.0) + roadAddressName: "Address", longitude: 100.0, latitude: 200.0) var mockPlace2 = SearchPlace(placeName: "Place2", distance: 200, placeURL: "url2", - addressName: "Address2", roadAddressName: "RoadAdd2", - categoryGroupCode: "CGC2", longitude: 300.0, latitude: 400.0) + roadAddressName: "Address2", longitude: 300.0, latitude: 400.0) func searchPlaceService(request: PlacesRequest) -> Observable { if request.searchText == "Place1" { From a038fe465b32ea785f75c7dd2456175f489ecf8f Mon Sep 17 00:00:00 2001 From: dami Date: Wed, 20 Dec 2023 16:42:00 +0900 Subject: [PATCH 14/24] =?UTF-8?q?fix:=20searchPlace=20->mainMap=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW/Map/DefaultMainMapCoordinator.swift | 2 - .../MainMapViewController.swift | 46 +++++++++---- .../DefaultsFindRoadCoordinator.swift | 1 - TWTW/TWTW/Plan/View/PlansViewController.swift | 68 +++++++++++++++++-- .../DefaultSearchPlacesMapCoordinator.swift | 2 +- .../View/SearchPlacesMapViewController.swift | 9 --- .../ViewModel/SearchPlacesMapViewModel.swift | 1 - 7 files changed, 93 insertions(+), 36 deletions(-) diff --git a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift index 473b0af4..fd3d3ecd 100644 --- a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift +++ b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift @@ -68,5 +68,3 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { childCoordinators.append(plansCoordinator) } } - - diff --git a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift index 7bc5a446..7290cba1 100644 --- a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift +++ b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift @@ -108,9 +108,22 @@ final class MainMapViewController: KakaoMapViewController { // MARK: - Set Up private func setNotificationFromSearchPlace() { NotificationCenter.default.addObserver(forName: .didFinishSearchPlaces, object: nil, queue: nil) { [weak self] _ in - self?.updateViewState(to: .searchMap) - + guard let self = self else { return } + updateViewStateAndMoveCamera() + + } + } + private func updateViewStateAndMoveCamera() { + // 키체인에서 위치 정보 + if let latitude = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.latitude.rawValue), + let longitude = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.longitude.rawValue) { + let coordinate = CLLocationCoordinate2D(latitude: Double(latitude) ?? 0, longitude: Double(longitude) ?? 0) + moveCameraToCoordinate(coordinate) + updateViewState(to: .searchMap) + addSearchPlaceBottomSheet() + } + } deinit { @@ -233,7 +246,6 @@ final class MainMapViewController: KakaoMapViewController { self.myloctaionImageView.removeFromSuperview() self.mainMapCustomTabButtonsView.removeFromSuperview() } - } } @@ -242,7 +254,9 @@ final class MainMapViewController: KakaoMapViewController { output.myLocatiaonRelay .bind { [weak self] location in guard let self = self else {return} - moveCameraToCoordinate(location, output) + if let output = self.output { + moveCameraToCoordinate(location, output) + } } .disposed(by: disposeBag) } @@ -298,18 +312,20 @@ final class MainMapViewController: KakaoMapViewController { extension MainMapViewController { /// 선택한 좌표로 카메라 옮기기 - private func moveCameraToCoordinate(_ coordinate: CLLocationCoordinate2D, _ output: MainMapViewModel.Output) { + private func moveCameraToCoordinate(_ coordinate: CLLocationCoordinate2D, _ output: MainMapViewModel.Output? = nil) { guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } - mapView.animateCamera(cameraUpdate: CameraUpdate.make(target: MapPoint(longitude: coordinate.longitude, - latitude: coordinate.latitude), - zoomLevel: 15, - rotation: 1.7, - tilt: 0.0, - mapView: mapView), - options: CameraAnimationOptions(autoElevation: true, - consecutive: true, - durationInMillis: 2000), - callback: {self.createPolygonStyleSet(output: output)}) + let cameraUpdate = CameraUpdate.make(target: MapPoint(longitude: coordinate.longitude, latitude: coordinate.latitude), + zoomLevel: 15, + rotation: 1.7, + tilt: 0.0, + mapView: mapView) + let options = CameraAnimationOptions(autoElevation: true, consecutive: true, durationInMillis: 2000) + + mapView.animateCamera(cameraUpdate: cameraUpdate, options: options) { [weak self] in + if let output = output { + self?.createPolygonStyleSet(output: output) + } + } } // MARK: - Route Functions diff --git a/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift b/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift index df84847f..eccd39e5 100644 --- a/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift +++ b/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift @@ -20,7 +20,6 @@ final class DefaultsFindRoadCoordinator: FindRoadCoordinator { } func start() { - let findRoadViewModel = FindRoadViewModel(coordinator: self) let findRoadViewController = FindRoadViewController(viewModel: findRoadViewModel) navigationController.pushViewController(findRoadViewController, animated: true) diff --git a/TWTW/TWTW/Plan/View/PlansViewController.swift b/TWTW/TWTW/Plan/View/PlansViewController.swift index 6b33341f..07b8718e 100644 --- a/TWTW/TWTW/Plan/View/PlansViewController.swift +++ b/TWTW/TWTW/Plan/View/PlansViewController.swift @@ -15,7 +15,7 @@ final class PlansViewController: UIViewController { /// 친구 검색 버튼 private lazy var rightItemButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: nil) - /// sample + /// sample 내가 속한 계획중 GroudID가 겹치는것만 let plans: [Plan] = [ Plan( planId: "3b8e94bc-310a-4ee9-b5cc-624d3c794dd4", @@ -25,13 +25,13 @@ final class PlansViewController: UIViewController { placeName: "서울 여의도공원", placeUrl: "https://example.com/place/1", roadAddressName: "여의도로 123", - longitude: 37.5259, - latitude: 126.9242 + longitude: 35.5259, + latitude: 129.9242 ), groupInfo: GroupInfo( groupId: "aa977768-a940-4f89-ba24-aa1bf2f71355", leaderId: "8df2b9ac-b424-44ca-9f30-25b245dc75f1", - name: "친구와 나들이", groupImage: "aaaaa" + name: "친구와 나들이1", groupImage: "aaaaa" ), members: [ Member( @@ -49,16 +49,16 @@ final class PlansViewController: UIViewController { placeId: "91e3045e-f75b-42a5-a5f5-2d63db7e2df8", planMakerId: "065c66a2-7d21-47f0-bbfd-4751242d0a78", placeDetails: PlaceDetails( - placeName: "서울 여의도공원", + placeName: "서울 여의도공원2", placeUrl: "https://example.com/place/1", - roadAddressName: "여의도로 123", + roadAddressName: "여의도로 1233", longitude: 37.5259, latitude: 126.9242 ), groupInfo: GroupInfo( groupId: "aa977768-a940-4f89-ba24-aa1bf2f71355", leaderId: "8df2b9ac-b424-44ca-9f30-25b245dc75f1", - name: "친구와 나들이", groupImage: "aaaaa" + name: "친구와 나들이2", groupImage: "aaaaa" ), members: [ Member( @@ -70,6 +70,60 @@ final class PlansViewController: UIViewController { nickname: "친구2" ) ] + ), + Plan( + planId: "4b8e94bc-310a-4ee9-b5cc-624d3c794dd4", + placeId: "31e3045e-f75b-42a5-a5f5-2d63db7e2df8", + planMakerId: "165c66a2-7d21-47f0-bbfd-4751242d0a78", + placeDetails: PlaceDetails( + placeName: "인천 투썸", + placeUrl: "https://example.com/place/2", + roadAddressName: "여의도로 1234", + longitude: 38.5259, + latitude: 127.0242 + ), + groupInfo: GroupInfo( + groupId: "ba977768-a940-4f89-ba24-aa1bf2f71355", + leaderId: "9df2b9ac-b424-44ca-9f30-25b245dc75f1", + name: "그룹이름임", groupImage: "aaaaa" + ), + members: [ + Member( + id: "47f64bef-b266-4787-8b53-599b2e0cea3c", + nickname: "친구11" + ), + Member( + id: "3f6f96bf-4e17-41d7-8e17-15e17d41d7b0", + nickname: "친구12" + ) + ] + ), + Plan( + planId: "4b8e94bc-310a-4ee9-b5cc-624d3c794dd4", + placeId: "31e3045e-f75b-42a5-a5f5-2d63db7e2df8", + planMakerId: "165c66a2-7d21-47f0-bbfd-4751242d0a78", + placeDetails: PlaceDetails( + placeName: "인천 투썸2", + placeUrl: "https://example.com/place/2", + roadAddressName: "여의도로 1234", + longitude: 40.5259, + latitude: 125.0242 + ), + groupInfo: GroupInfo( + groupId: "ba977768-a940-4f89-ba24-aa1bf2f71355", + leaderId: "9df2b9ac-b424-44ca-9f30-25b245dc75f1", + name: "그룹이름임", groupImage: "aaaaa" + ), + members: [ + Member( + id: "47f64bef-b266-4787-8b53-599b2e0cea3c", + nickname: "친구11" + ), + Member( + id: "3f6f96bf-4e17-41d7-8e17-15e17d41d7b0", + nickname: "친구12" + ) + ] ) ] diff --git a/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift b/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift index 6142613c..922ce9a4 100644 --- a/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift +++ b/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift @@ -39,7 +39,7 @@ final class DefaultSearchPlacesMapCoordinator: SearchPlacesMapCoordinatorProtoco /// 서치 완료후 : cLLocation전달 & pop VC func finishSearchPlaces() { - // delegate?.didSelectPlace() + NotificationCenter.default.post(name: .didFinishSearchPlaces, object: nil) navigationController.popViewController(animated: true) } } diff --git a/TWTW/TWTW/SearchPlaces/View/SearchPlacesMapViewController.swift b/TWTW/TWTW/SearchPlaces/View/SearchPlacesMapViewController.swift index 2b2b5b08..6c40be2e 100644 --- a/TWTW/TWTW/SearchPlaces/View/SearchPlacesMapViewController.swift +++ b/TWTW/TWTW/SearchPlaces/View/SearchPlacesMapViewController.swift @@ -44,15 +44,6 @@ final class SearchPlacesMapViewController: UIViewController { hideKeyboard() bindViewModel() } - // MARK: - viewWillDisappear - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - // 제거되는 경우에만 알림을 전송(pop) - if self.isMovingFromParent { - NotificationCenter.default.post(name: .didFinishSearchPlaces, object: nil) - } - } // MARK: - Set Up /// Add UI - SearchBar private func addSubViews() { diff --git a/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift b/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift index a4ee8c08..c88ec068 100644 --- a/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift +++ b/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift @@ -106,7 +106,6 @@ final class SearchPlacesMapViewModel { if let latitude = selectedPlace.latitude { _ = KeychainWrapper.saveItem(value: "\(latitude)", forKey: SearchPlaceKeyChain.latitude.rawValue) } - //self.coordinator?.finishSearchPlaces(searchPlace: selectedPlace) self.coordinator?.finishSearchPlaces() }) .disposed(by: disposeBag) From 667ebca796c5687352c34cced84c0f1d51d19ec9 Mon Sep 17 00:00:00 2001 From: dami Date: Wed, 20 Dec 2023 20:38:11 +0900 Subject: [PATCH 15/24] =?UTF-8?q?feat:=20planVC=20=EB=82=A0=EC=A7=9C=20?= =?UTF-8?q?=EB=84=A3=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 4 + TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift | 6 +- .../FromAlert/DatePickerViewController.swift | 70 ++++++++++ .../DefaultPlansFromAlertCoordinator.swift | 9 +- .../PlansFromAlertViewController.swift | 120 ++++++++++-------- .../FromAlert/PlansFromAlertViewModel.swift | 8 +- TWTW/TWTW/Plan/PlanCaller.swift | 5 + TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift | 1 - 8 files changed, 165 insertions(+), 58 deletions(-) create mode 100644 TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index 7851100b..5b4d3013 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -53,6 +53,7 @@ 3760CC8F2AE2CB7800CFC2D5 /* SurroundSearchPlaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3760CC8E2AE2CB7800CFC2D5 /* SurroundSearchPlaces.swift */; }; 376754472B1C2E3E006DFF6E /* DefaultGroupCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376754462B1C2E3E006DFF6E /* DefaultGroupCoordinator.swift */; }; 3767544C2B1C3AC1006DFF6E /* FriendsListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3767544B2B1C3AC1006DFF6E /* FriendsListViewModel.swift */; }; + 376E5B0D2B3306D00008EB5C /* DatePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376E5B0C2B3306D00008EB5C /* DatePickerViewController.swift */; }; 3772041C2B27045E00FE20A9 /* SearchPlaceBottomSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3772041B2B27045E00FE20A9 /* SearchPlaceBottomSheet.swift */; }; 377CB0592AD8665E003453D6 /* GroupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377CB0582AD8665E003453D6 /* GroupViewModel.swift */; }; 377CB05B2AD8666F003453D6 /* GroupCoordinatorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377CB05A2AD8666F003453D6 /* GroupCoordinatorProtocol.swift */; }; @@ -226,6 +227,7 @@ 3760CC8E2AE2CB7800CFC2D5 /* SurroundSearchPlaces.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurroundSearchPlaces.swift; sourceTree = ""; }; 376754462B1C2E3E006DFF6E /* DefaultGroupCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultGroupCoordinator.swift; sourceTree = ""; }; 3767544B2B1C3AC1006DFF6E /* FriendsListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendsListViewModel.swift; sourceTree = ""; }; + 376E5B0C2B3306D00008EB5C /* DatePickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatePickerViewController.swift; sourceTree = ""; }; 3772041B2B27045E00FE20A9 /* SearchPlaceBottomSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlaceBottomSheet.swift; sourceTree = ""; }; 377CB0582AD8665E003453D6 /* GroupViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupViewModel.swift; sourceTree = ""; }; 377CB05A2AD8666F003453D6 /* GroupCoordinatorProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupCoordinatorProtocol.swift; sourceTree = ""; }; @@ -887,6 +889,7 @@ 37D71E442B2F689E0004188A /* PlansFromAlertViewController.swift */, 37D71E462B2F68D30004188A /* PlanFromAlertCoordinator.swift */, 37D71E482B2F68F70004188A /* PlansFromAlertViewModel.swift */, + 376E5B0C2B3306D00008EB5C /* DatePickerViewController.swift */, ); path = FromAlert; sourceTree = ""; @@ -1687,6 +1690,7 @@ 3758F1902A7D007200E2933C /* GroupViewController.swift in Sources */, 37C35EE32B1CC876008A289D /* MakeNewFriendsListCoordinator.swift in Sources */, 3758F1B72A7DFB6200E2933C /* Bundle+Ext.swift in Sources */, + 376E5B0D2B3306D00008EB5C /* DatePickerViewController.swift in Sources */, 37BB02F92B230EA8006B2BEB /* ParticipantsViewModel.swift in Sources */, 3BB85C092B19D39200F8BBF3 /* FriendSearchCoordinatorProtocol.swift in Sources */, 3758F18C2A7D007200E2933C /* AppDelegate.swift in Sources */, diff --git a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift index d8ab45fe..a5989d83 100644 --- a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift +++ b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift @@ -58,6 +58,10 @@ final class DefaultPlansCoordinator: PlanCoordinator { childCoordinators.append(plansFromAlertCoordinator) } func addPlans() { - self.startFromAlert() + let plansFromAlertCoordinator = DefaultPlansFromAlertCoordinator(navigationController: navigationController) + plansFromAlertCoordinator.startToAddPlan() + childCoordinators.append(plansFromAlertCoordinator) } + // } + diff --git a/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift b/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift new file mode 100644 index 00000000..ddba320c --- /dev/null +++ b/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift @@ -0,0 +1,70 @@ +// +// DatePickerViewController.swift +// TWTW +// +// Created by 박다미 on 2023/12/20. +// + +import UIKit +import RxCocoa +import RxSwift + +class DatePickerViewController: UIViewController { + private let datePicker = UIDatePicker() + let selectedDate = PublishSubject() + private let disposeBag = DisposeBag() + + override func viewDidLoad() { + super.viewDidLoad() + setupViews() + bindActions() + } + + // 데이트피커 setup + private func setupViews() { + view.backgroundColor = .white + + datePicker.datePickerMode = .dateAndTime + datePicker.preferredDatePickerStyle = .compact + datePicker.minimumDate = Date() + view.addSubview(datePicker) + + datePicker.snp.makeConstraints { make in + make.center.equalToSuperview() + } + } + // 피커 모달창 action + private func bindActions() { + let selectButton = UIButton(type: .system) + selectButton.setTitle("선택", for: .normal) + view.addSubview(selectButton) + + let cancelButton = UIButton(type: .system) + cancelButton.setTitle("취소", for: .normal) + view.addSubview(cancelButton) + + selectButton.snp.makeConstraints { make in + make.top.equalTo(datePicker.snp.bottom).offset(10) + make.centerX.equalToSuperview().offset(-50) + } + + cancelButton.snp.makeConstraints { make in + make.top.equalTo(datePicker.snp.bottom).offset(10) + make.centerX.equalToSuperview().offset(50) + } + + selectButton.rx.tap + .bind { [weak self] in + self?.selectedDate.onNext(self?.datePicker.date) + self?.dismiss(animated: true, completion: nil) + } + .disposed(by: disposeBag) + + cancelButton.rx.tap + .bind { [weak self] in + self?.selectedDate.onNext(nil) + self?.dismiss(animated: true, completion: nil) + } + .disposed(by: disposeBag) + } +} diff --git a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift index 9b168021..d3ddf1ab 100644 --- a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift +++ b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift @@ -22,7 +22,14 @@ final class DefaultPlansFromAlertCoordinator: PlanFromAlertCoordinator { } func start() { - let viewModel = PlansFromAlertViewModel(coordinator: self) + let viewModel = PlansFromAlertViewModel(coordinator: self, caller: .forRevice) + self.plansFromAlertViewModel = viewModel + let plansFromAlertViewController = PlansFromAlertViewController(viewModel: viewModel) + navigationController.pushViewController(plansFromAlertViewController, animated: false) + } + + func startToAddPlan() { + let viewModel = PlansFromAlertViewModel(coordinator: self, caller: .forNew) self.plansFromAlertViewModel = viewModel let plansFromAlertViewController = PlansFromAlertViewController(viewModel: viewModel) navigationController.pushViewController(plansFromAlertViewController, animated: false) diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift index e3b49f3c..032c8ed3 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift @@ -13,16 +13,15 @@ import UIKit final class PlansFromAlertViewController: UIViewController { private let disposeBag = DisposeBag() private var viewModel: PlansFromAlertViewModel - private var tableViewHeightConstraint: Constraint? + private let datePickerViewController = DatePickerViewController() private lazy var selectedFriendsTableView: UITableView = { - let tableView = UITableView() + let tableView = UITableView() tableView.register(FriendListTableViewCell.self, forCellReuseIdentifier: CellIdentifier.friendListTableViewCell.rawValue) tableView.rowHeight = 100 tableView.isScrollEnabled = false - tableView.backgroundColor = .blue - return tableView - }() + return tableView + }() private lazy var originalMeetingNameLabel: UILabel = { let label = UILabel() label.text = "약속 명 (수정가능)" @@ -48,11 +47,16 @@ final class PlansFromAlertViewController: UIViewController { return button }() - + private lazy var confirmUIView: UIView = { + let uiView = UIView() + uiView.backgroundColor = .white + + return uiView + }() private lazy var confirmButton: UIButton = { let button = UIButton(type: .system) - button.setTitle("변경", for: .normal) - + button.setTitle("수정완료", for: .normal) + button.tintColor = .black return button }() @@ -68,6 +72,12 @@ final class PlansFromAlertViewController: UIViewController { return label }() + private lazy var selectedTimeLabel: UILabel = { + let label = UILabel() + label.text = "선택한 시간" + + return label + }() private lazy var datePicker: UIDatePicker = { @@ -96,11 +106,13 @@ final class PlansFromAlertViewController: UIViewController { setupBindings() bind() bindTableView() - + } - + private func addSubeViews() { view.addSubview(scrollView) + view.addSubview(confirmUIView) + confirmUIView.addSubview(confirmButton) scrollView.addSubview(contentView) // 원래 위치 레이블 contentView.addSubview(originalPlaceNameLabel) @@ -111,11 +123,12 @@ final class PlansFromAlertViewController: UIViewController { contentView.addSubview(selectedFriendsTableView) // 확인 버튼 - contentView.addSubview(confirmButton) // 날짜 선택 버튼 contentView.addSubview(datePickerButton) // 선택된 날짜 레이블 contentView.addSubview(selectedDateLabel) + contentView.addSubview(selectedTimeLabel) + configureConstraints() } @@ -145,21 +158,29 @@ final class PlansFromAlertViewController: UIViewController { selectedFriendsTableView.snp.makeConstraints { make in make.top.equalTo(addParticipantsButton.snp.bottom).offset(10) make.leading.trailing.equalToSuperview() - make.height.equalTo(100) - } - confirmButton.snp.makeConstraints { make in - make.top.equalTo(selectedFriendsTableView.snp.bottom).offset(10) - make.centerX.equalToSuperview() + make.height.equalTo(0) } datePickerButton.snp.makeConstraints { make in - make.top.equalTo(confirmButton.snp.bottom).offset(10) + make.top.equalTo(selectedFriendsTableView.snp.bottom).offset(10) make.centerX.equalToSuperview() } selectedDateLabel.snp.makeConstraints { make in make.top.equalTo(datePickerButton.snp.bottom).offset(10) make.centerX.equalToSuperview() + } + selectedTimeLabel.snp.makeConstraints { make in + make.top.equalTo(selectedDateLabel.snp.bottom).offset(10) + make.centerX.equalToSuperview() make.bottom.equalToSuperview().inset(20) } + confirmUIView.snp.makeConstraints { make in + make.horizontalEdges.equalToSuperview() + make.bottom.equalToSuperview() + make.height.equalTo(view.snp.width).multipliedBy(0.3) + } + confirmButton.snp.makeConstraints { make in + make.center.equalToSuperview() + } } private func bind() { @@ -169,32 +190,30 @@ final class PlansFromAlertViewController: UIViewController { let output = viewModel.createOutput(input: input) viewModel.newPlaceName - .bind(to: newPlaceNameLabel.rx.text) - .disposed(by: disposeBag) + .bind(to: newPlaceNameLabel.rx.text) + .disposed(by: disposeBag) } private func bindTableView() { - viewModel.selectedFriendsObservable + viewModel.selectedFriendsObservable .do(onNext: { [weak self] friends in self?.updateTableViewHeight(friends.count) }) - + .bind(to: selectedFriendsTableView.rx - .items(cellIdentifier: CellIdentifier.friendListTableViewCell.rawValue, - cellType: FriendListTableViewCell.self)) { index, friend, cell in - cell.inputData(info: friend) - }.disposed(by: disposeBag) - } + .items(cellIdentifier: CellIdentifier.friendListTableViewCell.rawValue, + cellType: FriendListTableViewCell.self)) { index, friend, cell in + cell.inputData(info: friend) + }.disposed(by: disposeBag) + } private func updateTableViewHeight(_ count: Int) { - let rowHeight = selectedFriendsTableView.rowHeight - let totalHeight = rowHeight * CGFloat(count) + let rowHeight = selectedFriendsTableView.rowHeight + let totalHeight = rowHeight * CGFloat(count) selectedFriendsTableView.snp.updateConstraints { make in make.height.equalTo(totalHeight) } view.layoutIfNeeded() } - - private func setupBindings() { datePickerButton.rx.tap .bind { [weak self] in @@ -203,28 +222,25 @@ final class PlansFromAlertViewController: UIViewController { .disposed(by: disposeBag) } private func presentDatePicker() { - let alertController = UIAlertController(title: "\n\n\n", message: nil, preferredStyle: .actionSheet) - alertController.view.addSubview(datePicker) + datePickerViewController.modalPresentationStyle = .formSheet + datePickerViewController.modalTransitionStyle = .flipHorizontal - datePicker.snp.makeConstraints { make in - make.centerX.equalToSuperview() - make.top.equalTo(alertController.view) - make.width.equalTo(alertController.view) - } - let selectAction = UIAlertAction(title: "선택", style: .default) { [weak self] _ in - self?.selectedDateLabel.text = self?.formattedDate(self?.datePicker.date) - } - let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) - - alertController.addAction(selectAction) - alertController.addAction(cancelAction) - present(alertController, animated: true, completion: nil) - - } - private func formattedDate(_ date: Date?) -> String { - guard let date = date else { return "" } - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd" - return formatter.string(from: date) + datePickerViewController.selectedDate + .subscribe(onNext: { [weak self] selectedDate in + guard let selectedDate = selectedDate else { return } + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + let formattedDate = dateFormatter.string(from: selectedDate) + + let timeFormatter = DateFormatter() + timeFormatter.dateFormat = "HH:mm" + let formattedTime = timeFormatter.string(from: selectedDate) + + self?.selectedDateLabel.text = formattedDate + self?.selectedTimeLabel.text = formattedTime + }) + .disposed(by: disposeBag) + + present(datePickerViewController, animated: true, completion: nil) } } diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift index d49c1c53..92dc9c36 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift @@ -15,7 +15,8 @@ final class PlansFromAlertViewModel { weak var coordinator: DefaultPlansFromAlertCoordinator? // 선택된 친구 목록을 저장하는 Relay private let selectedFriendsRelay = BehaviorRelay<[Friend]>(value: []) - + private let caller: SettingPlanCaller + // 선택된 친구 목록을 외부에 공개하는 Observable var selectedFriendsObservable: Observable<[Friend]> { return selectedFriendsRelay.asObservable() @@ -50,10 +51,11 @@ final class PlansFromAlertViewModel { // 3. } // MARK: - Init - init(coordinator: DefaultPlansFromAlertCoordinator) { + init(coordinator: DefaultPlansFromAlertCoordinator, caller: SettingPlanCaller = .forNew) { self.coordinator = coordinator + self.caller = caller } - + // create Output /// - Parameter input: Input Model /// - Returns: Output Model diff --git a/TWTW/TWTW/Plan/PlanCaller.swift b/TWTW/TWTW/Plan/PlanCaller.swift index c377317d..87bf3fd4 100644 --- a/TWTW/TWTW/Plan/PlanCaller.swift +++ b/TWTW/TWTW/Plan/PlanCaller.swift @@ -11,3 +11,8 @@ enum PlanCaller { case fromAlert case fromTabBar } + +enum SettingPlanCaller { + case forNew + case forRevice + } diff --git a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift index 2fa19ef7..1859995c 100644 --- a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift +++ b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift @@ -40,7 +40,6 @@ final class PlansViewModel { case .fromTabBar: print("탭바에서 호출됨") coordinator.moveToPlanFromTabBar() - } }.disposed(by: disposeBag) From a7ad802e28658b4fbc5d185bade25e757faf9a41 Mon Sep 17 00:00:00 2001 From: dami Date: Thu, 21 Dec 2023 15:58:10 +0900 Subject: [PATCH 16/24] feat: plansFromAlertViewController UI --- .../PlansFromAlertViewController.swift | 146 ++++++++++++++---- 1 file changed, 113 insertions(+), 33 deletions(-) diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift index 032c8ed3..3cf65ae4 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift @@ -14,7 +14,7 @@ final class PlansFromAlertViewController: UIViewController { private let disposeBag = DisposeBag() private var viewModel: PlansFromAlertViewModel private let datePickerViewController = DatePickerViewController() - + private lazy var selectedFriendsTableView: UITableView = { let tableView = UITableView() tableView.register(FriendListTableViewCell.self, forCellReuseIdentifier: CellIdentifier.friendListTableViewCell.rawValue) @@ -22,20 +22,42 @@ final class PlansFromAlertViewController: UIViewController { tableView.isScrollEnabled = false return tableView }() + private lazy var originalMeetingNameLabel: UILabel = { let label = UILabel() - label.text = "약속 명 (수정가능)" + label.font = UIFont.systemFont(ofSize: 23, weight: .bold) + label.text = "약속 명" return label }() - + private lazy var meetingNameEditButton: UIButton = { + let button = UIButton(type: .system) + button.setImage(UIImage(systemName: "pencil"), for: .normal) + button.tintColor = .gray + return button + }() + // place이전 이후 + private lazy var placeNameStackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .horizontal + stackView.spacing = 5 + stackView.distribution = .fillProportionally + return stackView + }() private lazy var originalPlaceNameLabel: UILabel = { let label = UILabel() + label.font = UIFont.systemFont(ofSize: 15, weight: .regular) label.text = "이전 목적지 명" return label }() + private lazy var placeChangeImage: UIImageView = { + let image = UIImageView(image: UIImage(systemName: "arrowshape.right")) + image.tintColor = .black + return image + }() private lazy var newPlaceNameLabel: UILabel = { let label = UILabel() + label.font = UIFont.systemFont(ofSize: 20, weight: .semibold) label.text = "선택한 목적지명" return label @@ -43,10 +65,12 @@ final class PlansFromAlertViewController: UIViewController { private lazy var addParticipantsButton: UIButton = { let button = UIButton(type: .system) + button.setImage(UIImage(systemName: "person.2.circle"), for: .normal) button.setTitle("참여 인원", for: .normal) - + button.tintColor = .black return button }() + private lazy var confirmUIView: UIView = { let uiView = UIView() uiView.backgroundColor = .white @@ -62,19 +86,21 @@ final class PlansFromAlertViewController: UIViewController { private lazy var datePickerButton: UIButton = { let button = UIButton(type: .system) + button.setTitle("날짜설정", for: .normal) button.setImage(UIImage(systemName: "calendar"), for: .normal) + button.tintColor = .gray return button }() private lazy var selectedDateLabel: UILabel = { let label = UILabel() - label.text = "선택한 날짜" + label.text = "날짜를 선택해주세요" return label }() private lazy var selectedTimeLabel: UILabel = { let label = UILabel() - label.text = "선택한 시간" + label.text = "시간을 선택해주세요" return label }() @@ -85,8 +111,8 @@ final class PlansFromAlertViewController: UIViewController { picker.datePickerMode = .date return picker }() - let scrollView = UIScrollView() - let contentView = UIView() + private let scrollView = UIScrollView() + private let contentView = UIView() // MARK: - Init init(viewModel: PlansFromAlertViewModel) { @@ -103,7 +129,6 @@ final class PlansFromAlertViewController: UIViewController { super.viewDidLoad() view.backgroundColor = .white addSubeViews() - setupBindings() bind() bindTableView() @@ -114,10 +139,18 @@ final class PlansFromAlertViewController: UIViewController { view.addSubview(confirmUIView) confirmUIView.addSubview(confirmButton) scrollView.addSubview(contentView) + + contentView.addSubview(originalMeetingNameLabel) + contentView.addSubview(meetingNameEditButton) + + contentView.addSubview(placeNameStackView) + placeNameStackView.addArrangedSubview(originalPlaceNameLabel) + placeNameStackView.addArrangedSubview(placeChangeImage) + placeNameStackView.addArrangedSubview(newPlaceNameLabel) // 원래 위치 레이블 - contentView.addSubview(originalPlaceNameLabel) - // 새 위치 레이블 - contentView.addSubview(newPlaceNameLabel) + // contentView.addSubview(originalPlaceNameLabel) + // // 새 위치 레이블 + // contentView.addSubview(newPlaceNameLabel) // 참여 인원 추가 버튼 contentView.addSubview(addParticipantsButton) @@ -134,45 +167,63 @@ final class PlansFromAlertViewController: UIViewController { private func configureConstraints() { scrollView.snp.makeConstraints { make in - make.edges.equalToSuperview() - + make.top.horizontalEdges.equalToSuperview() + make.bottom.equalTo(confirmUIView.snp.top).offset(10) } contentView.snp.makeConstraints { make in make.edges.equalTo(scrollView) make.width.equalTo(scrollView) } - - originalPlaceNameLabel.snp.makeConstraints { make in + // 약속명 + originalMeetingNameLabel.snp.makeConstraints { make in make.top.equalTo(contentView.snp.top).offset(20) make.centerX.equalToSuperview() } - newPlaceNameLabel.snp.makeConstraints { make in - make.top.equalTo(originalPlaceNameLabel.snp.bottom).offset(10) - make.centerX.equalToSuperview() + meetingNameEditButton.snp.makeConstraints { make in + make.centerY.equalTo(originalMeetingNameLabel) + make.leading.equalTo(originalMeetingNameLabel.snp.trailing).offset(5) } - addParticipantsButton.snp.makeConstraints { make in - make.top.equalTo(newPlaceNameLabel.snp.bottom).offset(10) + // 목적지 + placeNameStackView.snp.makeConstraints { make in + make.top.equalTo(originalMeetingNameLabel.snp.bottom).offset(20) make.centerX.equalToSuperview() } - selectedFriendsTableView.snp.makeConstraints { make in - make.top.equalTo(addParticipantsButton.snp.bottom).offset(10) - make.leading.trailing.equalToSuperview() - make.height.equalTo(0) - } + // originalPlaceNameLabel.snp.makeConstraints { make in + // make.top.equalTo(originalMeetingNameLabel.snp.bottom).offset(10) + // make.centerX.equalToSuperview() + // } + // newPlaceNameLabel.snp.makeConstraints { make in + // make.top.equalTo(originalPlaceNameLabel.snp.bottom).offset(10) + // make.centerX.equalToSuperview() + // } + // 달력버튼 datePickerButton.snp.makeConstraints { make in - make.top.equalTo(selectedFriendsTableView.snp.bottom).offset(10) + make.top.equalTo(placeNameStackView.snp.bottom).offset(10) make.centerX.equalToSuperview() } + // 날짜 라벨 selectedDateLabel.snp.makeConstraints { make in make.top.equalTo(datePickerButton.snp.bottom).offset(10) make.centerX.equalToSuperview() } + // 시간 라벨 selectedTimeLabel.snp.makeConstraints { make in make.top.equalTo(selectedDateLabel.snp.bottom).offset(10) make.centerX.equalToSuperview() + } + // 참여 인원 추가 버튼 + addParticipantsButton.snp.makeConstraints { make in + make.top.equalTo(selectedTimeLabel.snp.bottom).offset(20) + make.centerX.equalToSuperview() + } + selectedFriendsTableView.snp.makeConstraints { make in + make.top.equalTo(addParticipantsButton.snp.bottom).offset(10) + make.leading.trailing.equalToSuperview().inset(10) + make.height.equalTo(0) make.bottom.equalToSuperview().inset(20) } + confirmUIView.snp.makeConstraints { make in make.horizontalEdges.equalToSuperview() make.bottom.equalToSuperview() @@ -204,6 +255,23 @@ final class PlansFromAlertViewController: UIViewController { cellType: FriendListTableViewCell.self)) { index, friend, cell in cell.inputData(info: friend) }.disposed(by: disposeBag) + + + // alert 창 터치 이벤트 vc에서 진행함. + + datePickerButton.rx.tap + .bind { [weak self] in + self?.presentDatePicker() + } + .disposed(by: disposeBag) + + + meetingNameEditButton.rx.tap + .subscribe(onNext: { [weak self] _ in + self?.showEditAlert() + }) + .disposed(by: disposeBag) + } private func updateTableViewHeight(_ count: Int) { @@ -214,16 +282,28 @@ final class PlansFromAlertViewController: UIViewController { } view.layoutIfNeeded() } - private func setupBindings() { - datePickerButton.rx.tap - .bind { [weak self] in - self?.presentDatePicker() + + + private func showEditAlert() { + let alertController = UIAlertController(title: "약속 명 변경", message: nil, preferredStyle: .alert) + alertController.addTextField { textField in + textField.placeholder = "새 약속 명을 입력하세요" + } + let confirmAction = UIAlertAction(title: "확인", style: .default) { [weak self, unowned alertController] _ in + if let newName = alertController.textFields?.first?.text, !newName.isEmpty { + self?.originalMeetingNameLabel.text = newName } - .disposed(by: disposeBag) + } + let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) + alertController.addAction(confirmAction) + alertController.addAction(cancelAction) + self.present(alertController, animated: true, completion: nil) } + + private func presentDatePicker() { datePickerViewController.modalPresentationStyle = .formSheet - datePickerViewController.modalTransitionStyle = .flipHorizontal + datePickerViewController.modalTransitionStyle = .coverVertical datePickerViewController.selectedDate .subscribe(onNext: { [weak self] selectedDate in From dcff6c81fee5154ff16e978e3b06992140bf3899 Mon Sep 17 00:00:00 2001 From: dami Date: Thu, 21 Dec 2023 23:52:30 +0900 Subject: [PATCH 17/24] =?UTF-8?q?feat:=20RoadView=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=EC=82=BD=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 24 +++++++++++++++ .../KakaoMapViewController.swift | 14 ++++----- .../MainMapViewController.swift | 2 +- .../FindRoad/FindRoadViewController.swift | 30 ++++++++++++++----- .../DefaultsRoadViewCoordinator.swift | 28 +++++++++++++++++ .../RoadView/RoadViewController.swift | 15 ++++++++++ .../RoadView/RoadViewCoordinator.swift | 10 +++++++ .../FindRoad/RoadView/RoadViewModel.swift | 20 +++++++++++++ TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift | 2 +- .../SearchPlacesMapCoordDelegate.swift | 1 - 10 files changed, 126 insertions(+), 20 deletions(-) create mode 100644 TWTW/TWTW/Participants/FindRoad/RoadView/DefaultsRoadViewCoordinator.swift create mode 100644 TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewController.swift create mode 100644 TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewCoordinator.swift create mode 100644 TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewModel.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index 5b4d3013..11141822 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 3701086D2B3430B700F08128 /* RoadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3701086C2B3430B700F08128 /* RoadViewController.swift */; }; + 3701086F2B34414E00F08128 /* RoadViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3701086E2B34414E00F08128 /* RoadViewCoordinator.swift */; }; + 370108712B34415500F08128 /* DefaultsRoadViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370108702B34415500F08128 /* DefaultsRoadViewCoordinator.swift */; }; + 370108732B34419B00F08128 /* RoadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370108722B34419B00F08128 /* RoadViewModel.swift */; }; 370AB45A2ADD12E000951562 /* DefaultMainMapCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370AB4592ADD12E000951562 /* DefaultMainMapCoordinator.swift */; }; 371C1D2D2ADBAFA900B30DC5 /* DefaultNotificationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D2C2ADBAFA900B30DC5 /* DefaultNotificationCoordinator.swift */; }; 371C1D2F2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */; }; @@ -183,6 +187,10 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 3701086C2B3430B700F08128 /* RoadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoadViewController.swift; sourceTree = ""; }; + 3701086E2B34414E00F08128 /* RoadViewCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoadViewCoordinator.swift; sourceTree = ""; }; + 370108702B34415500F08128 /* DefaultsRoadViewCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsRoadViewCoordinator.swift; sourceTree = ""; }; + 370108722B34419B00F08128 /* RoadViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoadViewModel.swift; sourceTree = ""; }; 370AB4592ADD12E000951562 /* DefaultMainMapCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultMainMapCoordinator.swift; sourceTree = ""; }; 371C1D2C2ADBAFA900B30DC5 /* DefaultNotificationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultNotificationCoordinator.swift; sourceTree = ""; }; 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultFriendsListCoordinator.swift; sourceTree = ""; }; @@ -376,6 +384,17 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 3701086B2B34309600F08128 /* RoadView */ = { + isa = PBXGroup; + children = ( + 3701086C2B3430B700F08128 /* RoadViewController.swift */, + 3701086E2B34414E00F08128 /* RoadViewCoordinator.swift */, + 370108702B34415500F08128 /* DefaultsRoadViewCoordinator.swift */, + 370108722B34419B00F08128 /* RoadViewModel.swift */, + ); + path = RoadView; + sourceTree = ""; + }; 372109F52B0CE70700B0946C /* SearchPlaces */ = { isa = PBXGroup; children = ( @@ -897,6 +916,7 @@ 37D71E612B30601B0004188A /* FindRoad */ = { isa = PBXGroup; children = ( + 3701086B2B34309600F08128 /* RoadView */, 37E8B83F2B31B192008D0F3D /* CarRouteService.swift */, 37D71E5D2B3060030004188A /* FindRoadCoordinator.swift */, 37D71E592B305FD90004188A /* FindRoadViewController.swift */, @@ -1676,6 +1696,7 @@ 371C1D312ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift in Sources */, 3B9693DE2B176DED001DDAE8 /* FriendListTableViewCell.swift in Sources */, 37D71E452B2F689E0004188A /* PlansFromAlertViewController.swift in Sources */, + 3701086F2B34414E00F08128 /* RoadViewCoordinator.swift in Sources */, 37E9FBFE2B1635B4004AFF79 /* MainMapCustomTabButtonViewModel.swift in Sources */, 3B20E1E62AE41E97009572AA /* FriendsListCoordinatorProtocol.swift in Sources */, 37F903A82AF9BD88008120B6 /* Header.swift in Sources */, @@ -1684,8 +1705,10 @@ 374DB4632B247C8800AF648C /* DefaultMyPageCoordinator.swift in Sources */, 3B267B9B2A87B81A00F3949A /* MainMapViewModel.swift in Sources */, 3799E5052A99D6DC00E06218 /* PreviousAppointmentsViewController.swift in Sources */, + 370108712B34415500F08128 /* DefaultsRoadViewCoordinator.swift in Sources */, 37E9FBFB2B16337D004AFF79 /* MainMapCustomTabButtonsView.swift in Sources */, 3BF9EFB12AB1DEDB0014855E /* UIImage+Ext.swift in Sources */, + 3701086D2B3430B700F08128 /* RoadViewController.swift in Sources */, 374EAEA62B25D4E500BAA897 /* TabBarController.swift in Sources */, 3758F1902A7D007200E2933C /* GroupViewController.swift in Sources */, 37C35EE32B1CC876008A289D /* MakeNewFriendsListCoordinator.swift in Sources */, @@ -1713,6 +1736,7 @@ 3B274D6D2AD3F6F400D79698 /* Coordinator.swift in Sources */, 3B9693D82B175346001DDAE8 /* DefaultCreateGroupCoordinator.swift in Sources */, 3737AE982AE983F600FE7453 /* SearchPlacesMapService.swift in Sources */, + 370108732B34419B00F08128 /* RoadViewModel.swift in Sources */, 37D71E5E2B3060030004188A /* FindRoadCoordinator.swift in Sources */, 3754BB702A9B455100522420 /* Color+Ext.swift in Sources */, 37F903A62AF9BD2F008120B6 /* EncodedQuery.swift in Sources */, diff --git a/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift b/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift index d1a7e10c..5309bf50 100644 --- a/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift +++ b/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift @@ -11,7 +11,7 @@ import UIKit class KakaoMapViewController: UIViewController, MapControllerDelegate { var mapController: KMController? - var kMViewContainer: KMViewContainer? + var mapContainer: KMViewContainer? var observerAdded: Bool? var auth: Bool? var appear: Bool? @@ -47,7 +47,7 @@ class KakaoMapViewController: UIViewController, MapControllerDelegate { guard let kmController = KMController(viewContainer: mapView) else {return} mapController = kmController - kMViewContainer = mapView + mapContainer = mapView mapController?.delegate = self mapController?.initEngine() // 엔진 초기화. 엔진 내부 객체 생성 및 초기화가 진행된다. @@ -81,13 +81,9 @@ class KakaoMapViewController: UIViewController, MapControllerDelegate { private func set() { view.addSubview(mapView) - - NSLayoutConstraint.activate([ - mapView.topAnchor.constraint(equalTo: view.topAnchor), - mapView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), - mapView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), - mapView.bottomAnchor.constraint(equalTo: view.bottomAnchor) - ]) + mapView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } } /// 인증 성공시 delegate 호출. diff --git a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift index 7290cba1..2bd954a6 100644 --- a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift +++ b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift @@ -201,7 +201,7 @@ final class MainMapViewController: KakaoMapViewController { } private func bind() { - let input = MainMapViewModel.Input(screenTouchEvents: kMViewContainer?.rx.anyGesture(.tap()).when(.recognized).asObservable(), + let input = MainMapViewModel.Input(screenTouchEvents: mapContainer?.rx.anyGesture(.tap()).when(.recognized).asObservable(), searchBarTouchEvents: searchBar.rx.tapGesture().when(.recognized).asObservable(), cLLocationCoordinate2DEvents: Observable.just(configureLocationManager()), myLocationTappedEvents: myloctaionImageView.rx.anyGesture(.tap()) diff --git a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift index ee3ff409..1c520559 100644 --- a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift +++ b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift @@ -24,7 +24,7 @@ final class FindRoadViewController: KakaoMapViewController { private lazy var myLocationLabel: UILabel = { let label = UILabel() - label.text = "내 위치: 실제 위치" + label.text = "출발지: 실제 위치" return label }() @@ -47,7 +47,12 @@ final class FindRoadViewController: KakaoMapViewController { button.backgroundColor = .green return button }() - + private lazy var moveToRouteButton: UIButton = { + let button = UIButton() + button.setTitle("로드맵보기", for: .normal) + button.backgroundColor = .green + return button + }() private let viewModel: FindRoadViewModel private let disposeBag = DisposeBag() @@ -80,15 +85,21 @@ final class FindRoadViewController: KakaoMapViewController { .subscribe(onNext: { [weak self] _ in print("인도 길 보기") self?.drawWalkRoute() - + }) + .disposed(by: disposeBag) + + moveToRouteButton.rx.tap + .subscribe(onNext: { [weak self] _ in + print("로드맵 보기") + self?.navigationController?.pushViewController(RoadViewController(), animated: true) //Test }) .disposed(by: disposeBag) } - // MARK: - Setup UI private func setupUI() { view.addSubview(infoView) + view.addSubview(moveToRouteButton) infoView.addSubview(myLocationLabel) infoView.addSubview(destinationLabel) infoView.addSubview(carRouteButton) @@ -122,6 +133,11 @@ final class FindRoadViewController: KakaoMapViewController { make.leading.equalTo(carRouteButton.snp.trailing).offset(10) make.width.equalTo(carRouteButton.snp.width) } + moveToRouteButton.snp.makeConstraints { make in + make.top.equalTo(infoView.snp.bottom).offset(10) + make.trailing.equalToSuperview().offset(10) + make.height.width.equalTo(100) + } } private func setupLocationManager() { @@ -142,7 +158,7 @@ extension FindRoadViewController { let manager = mapView.getRouteManager() manager.removeRouteLayer(layerID: layerID) } - + /// 차 경로 그리기 private func drawCarRoute() { removeRouteLayer(layerID: "CarRouteLayer") removeRouteLayer(layerID: "WalkRouteLayer") @@ -168,7 +184,7 @@ extension FindRoadViewController { let route = layer?.addRoute(option: options) route?.show() } - + /// MARK: 보도 경로 그리기 private func drawWalkRoute() { removeRouteLayer(layerID: "CarRouteLayer") removeRouteLayer(layerID: "WalkRouteLayer") @@ -259,10 +275,8 @@ extension FindRoadViewController: CLLocationManagerDelegate { currentLocation = newCoordinate } - // Update UI with current location myLocationLabel.text = "내 위치: \(newCoordinate.latitude), \(newCoordinate.longitude)" - // Move camera to new location moveCameraToCoordinate(newCoordinate) } diff --git a/TWTW/TWTW/Participants/FindRoad/RoadView/DefaultsRoadViewCoordinator.swift b/TWTW/TWTW/Participants/FindRoad/RoadView/DefaultsRoadViewCoordinator.swift new file mode 100644 index 00000000..30b4f8db --- /dev/null +++ b/TWTW/TWTW/Participants/FindRoad/RoadView/DefaultsRoadViewCoordinator.swift @@ -0,0 +1,28 @@ +// +// DefaultsRoadViewCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/21. +// + +import Foundation +import UIKit + +final class DefaultsRoadViewCoordinator: RoadViewCoordinator { + var childCoordinators: [Coordinator] = [] + var navigationController: UINavigationController + private var roadViewModel: RoadViewModel? + + // MARK: - Init + init(navigationController: UINavigationController) { + self.navigationController = navigationController + roadViewModel = RoadViewModel(coordinator: self) + } + + func start() { + let roadViewModel = RoadViewModel(coordinator: self) + let roadViewController = RoadViewController() + navigationController.pushViewController(roadViewController, animated: true) + + } +} diff --git a/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewController.swift b/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewController.swift new file mode 100644 index 00000000..0533947b --- /dev/null +++ b/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewController.swift @@ -0,0 +1,15 @@ +// +// RoadViewController.swift +// TWTW +// +// Created by 박다미 on 2023/12/21. +// +import KakaoMapsSDK +import RxCocoa +import RxSwift +import SnapKit +import UIKit + +final class RoadViewController: KakaoMapViewController { + +} diff --git a/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewCoordinator.swift b/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewCoordinator.swift new file mode 100644 index 00000000..1560c49c --- /dev/null +++ b/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewCoordinator.swift @@ -0,0 +1,10 @@ +// +// RoadViewCoordinator.swift +// TWTW +// +// Created by 박다미 on 2023/12/21. +// + +import Foundation + +protocol RoadViewCoordinator: Coordinator {} diff --git a/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewModel.swift b/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewModel.swift new file mode 100644 index 00000000..d3b2c211 --- /dev/null +++ b/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewModel.swift @@ -0,0 +1,20 @@ +// +// RoadViewModel.swift +// TWTW +// +// Created by 박다미 on 2023/12/21. +// + +import Foundation +import RxSwift +import UIKit + +final class RoadViewModel { + private let disposeBag = DisposeBag() + weak var coordinator: DefaultsRoadViewCoordinator? + + // MARK: - Init + init(coordinator: DefaultsRoadViewCoordinator) { + self.coordinator = coordinator + } +} diff --git a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift index a5989d83..15fcdec9 100644 --- a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift +++ b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift @@ -22,7 +22,7 @@ final class DefaultPlansCoordinator: PlanCoordinator { navigationController.pushViewController(plansViewController, animated: true) } - //첫 지도화면에서 탭바버튼으로 + // 첫 지도화면에서 탭바버튼으로 func planStartFromTabBar() { let plansViewModel = PlansViewModel( coordinator: self, diff --git a/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift b/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift index 8cb9d2b6..a145e540 100644 --- a/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift +++ b/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift @@ -12,4 +12,3 @@ import Foundation protocol SearchPlacesMapCoordDelegate: AnyObject { func didSelectPlace(searchPlace: SearchPlace) } - From 6d7c40e598b101c832d41d4c9c62eebf5c9c7145 Mon Sep 17 00:00:00 2001 From: dami Date: Fri, 22 Dec 2023 18:17:48 +0900 Subject: [PATCH 18/24] =?UTF-8?q?feat:=20=EC=83=88=20=EC=9D=BC=EC=A0=95?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EA=B3=BC=20=EC=9D=BC=EC=A0=95=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModel/FriendsListViewModel.swift | 2 - .../KakaoMapViewController.swift | 23 ++++++++- .../MainMapViewController.swift | 40 +++++---------- .../FindRoad/FindRoadViewController.swift | 2 +- .../RoadView/RoadViewController.swift | 16 ++++++ TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift | 5 +- .../DefaultPlansFromAlertCoordinator.swift | 6 --- .../PlansFromAlertViewController.swift | 51 +++++++++++-------- .../FromAlert/PlansFromAlertViewModel.swift | 34 +++++++------ TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift | 2 +- .../TWTW/SearchPlaces/Model/SearchPlace.swift | 2 + .../View/SearchPlacesTableViewCell.swift | 1 + .../ViewModel/SearchPlacesMapViewModel.swift | 7 ++- 13 files changed, 111 insertions(+), 80 deletions(-) diff --git a/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift b/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift index 5c463ff2..0afd6bed 100644 --- a/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift +++ b/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift @@ -73,8 +73,6 @@ final class FriendsListViewModel { guard let self = self else { return } switch self.caller { case .fromPartiSetLocation: - // PartiSetLocation에서 호출된 경우의 동작 -// print("Selected friends: \(output.selectedFriendRelay.value)") coordinator.navigateBackWithSelectedFriends(output.selectedFriendRelay.value) case .fromTabBar: diff --git a/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift b/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift index 5309bf50..79fd3882 100644 --- a/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift +++ b/TWTW/TWTW/Map/View/ViewController/KakaoMapViewController.swift @@ -141,8 +141,27 @@ class KakaoMapViewController: UIViewController, MapControllerDelegate { if mapController?.addView(mapviewInfo) == Result.OK { print("OK") // 추가 성공. 성공시 추가적으로 수행할 작업을 진행한다. } - } - + addRoadView() + } + private func addRoadView() { + let roadviewInfo = RoadviewInfo(viewName: "roadview", viewInfoName: "roadview", enabled: true) + if mapController?.addView(roadviewInfo) == Result.OK { + configureRoadview() + } + } + + private func configureRoadview() { + guard let roadview = mapController?.getView("roadview") as? Roadview else { + print("Failed to retrieve Roadview.") + return + } + + // Roadview 설정... + let defaultPosition = MapPoint(longitude: 126.978365, latitude: 37.566691) + let lookAt = RoadviewLookAt(pan: 0.5, tilt: 0.2) + let markers = [PanoramaMarker(pan: 0.5, tilt: 0.2)] + roadview.requestRoadview(position: defaultPosition, panoID: nil, markers: markers, lookAt: lookAt) + } // Container 뷰가 리사이즈 되었을때 호출된다. 변경된 크기에 맞게 ViewBase들의 크기를 조절할 필요가 있는 경우 여기에서 수행한다. func containerDidResized(_ size: CGSize) { let mapView: KakaoMap? = mapController?.getView("mapview") as? KakaoMap diff --git a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift index 2bd954a6..7414025a 100644 --- a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift +++ b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift @@ -120,7 +120,7 @@ final class MainMapViewController: KakaoMapViewController { let longitude = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.longitude.rawValue) { let coordinate = CLLocationCoordinate2D(latitude: Double(latitude) ?? 0, longitude: Double(longitude) ?? 0) moveCameraToCoordinate(coordinate) - updateViewState(to: .searchMap) + updateViewState(from: .searchMap) addSearchPlaceBottomSheet() } @@ -136,7 +136,7 @@ final class MainMapViewController: KakaoMapViewController { addSubViewsMyloctaionImageView() addSubViewsMainMapCusomTabButtonView() view.backgroundColor = .white - configureUIComponentsFor(currentViewType) + updateViewState(from: currentViewType) } @@ -211,16 +211,20 @@ final class MainMapViewController: KakaoMapViewController { self.output = output } - func updateViewState(to newViewState: ViewState) { + private func updateViewState(from newViewState: ViewState) { currentViewType = newViewState switch currentViewType { - case .mainMap: - searchPlaceBottomSheet.removeFromSuperview() - case .searchMap: - addSearchPlaceBottomSheet() + case .mainMap: + self.navigationItem.titleView = self.searchBar + self.searchBar.isHidden = false + self.myloctaionImageView.isHidden = false + self.mainMapCustomTabButtonsView.isHidden = false + self.searchPlaceBottomSheet.removeFromSuperview() + + case .searchMap: + self.myloctaionImageView.removeFromSuperview() + self.mainMapCustomTabButtonsView.removeFromSuperview() } - - configureUIComponentsFor(currentViewType) } private func addSearchPlaceBottomSheet() { @@ -231,24 +235,6 @@ final class MainMapViewController: KakaoMapViewController { searchPlaceBottomSheet.setupPlace(name: placeName, address: roadAddressName) } - private func configureUIComponentsFor(_ viewType: ViewState) { - DispatchQueue.main.async { [weak self] in - guard let self = self else { return } - switch viewType { - case .mainMap: - self.navigationItem.titleView = self.searchBar - self.searchBar.isHidden = false - self.myloctaionImageView.isHidden = false - self.mainMapCustomTabButtonsView.isHidden = false - self.searchPlaceBottomSheet.removeFromSuperview() - - case .searchMap: - self.myloctaionImageView.removeFromSuperview() - self.mainMapCustomTabButtonsView.removeFromSuperview() - } - } - } - /// 내 위치 binding private func bindMyLocation(output: MainMapViewModel.Output) { output.myLocatiaonRelay diff --git a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift index 1c520559..dbab27e1 100644 --- a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift +++ b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift @@ -47,7 +47,7 @@ final class FindRoadViewController: KakaoMapViewController { button.backgroundColor = .green return button }() - private lazy var moveToRouteButton: UIButton = { + private lazy var moveToRouteButton: UIButton = { let button = UIButton() button.setTitle("로드맵보기", for: .normal) button.backgroundColor = .green diff --git a/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewController.swift b/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewController.swift index 0533947b..90a21e75 100644 --- a/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewController.swift +++ b/TWTW/TWTW/Participants/FindRoad/RoadView/RoadViewController.swift @@ -11,5 +11,21 @@ import SnapKit import UIKit final class RoadViewController: KakaoMapViewController { + override func addViews() { + let defaultPosition: MapPoint = MapPoint(longitude: 126.978365, latitude: 37.566691) + let roadviewInfo: RoadviewInfo = RoadviewInfo(viewName: "roadview", viewInfoName: "roadview", enabled: true) + requestRoadview() + //로드뷰 추가. + if mapController?.addView(roadviewInfo) == Result.OK { + print("Roadview OK") + } + } + + func requestRoadview() { + let view = mapController?.getView("roadview") as? Roadview + let defaultPosition: MapPoint = MapPoint(longitude: 126.978365, latitude: 37.566691) + //좌표로 로드뷰 요청. panoID를 알 경우, panoID를 지정할 수 있다. panoID가 지정되면 해당 panoID로 먼저 검색한 뒤 없으면 좌표로 검색한다. + view?.requestRoadview(position: defaultPosition, panoID: nil) + } } diff --git a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift index 15fcdec9..18181407 100644 --- a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift +++ b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift @@ -57,11 +57,12 @@ final class DefaultPlansCoordinator: PlanCoordinator { plansFromAlertCoordinator.start() childCoordinators.append(plansFromAlertCoordinator) } - func addPlans() { + + func moveToAddPlans() { let plansFromAlertCoordinator = DefaultPlansFromAlertCoordinator(navigationController: navigationController) plansFromAlertCoordinator.startToAddPlan() childCoordinators.append(plansFromAlertCoordinator) } - // + } diff --git a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift index d3ddf1ab..09b25af6 100644 --- a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift +++ b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift @@ -50,12 +50,6 @@ final class DefaultPlansFromAlertCoordinator: PlanFromAlertCoordinator { childCoordinators.append(mainMapCoordinator) //navigationController.popToRootViewController(animated: true) } - /// 길찾기 -// func moveToFindRoad() { -// let findRoadCoordinator = DefaultsFindRoadCoordinator(navigationController: navigationController) -// childCoordinators.append(findRoadCoordinator) -// findRoadCoordinator.start() -// } } extension DefaultPlansFromAlertCoordinator: FriendsSendListCoordinatorDelegate { diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift index 3cf65ae4..f054b3bc 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewController.swift @@ -11,6 +11,8 @@ import SnapKit import UIKit final class PlansFromAlertViewController: UIViewController { + private var currentViewType: SettingPlanCaller = .forNew + private let disposeBag = DisposeBag() private var viewModel: PlansFromAlertViewModel private let datePickerViewController = DatePickerViewController() @@ -79,7 +81,7 @@ final class PlansFromAlertViewController: UIViewController { }() private lazy var confirmButton: UIButton = { let button = UIButton(type: .system) - button.setTitle("수정완료", for: .normal) + button.setTitle("완료", for: .normal) button.tintColor = .black return button }() @@ -131,9 +133,8 @@ final class PlansFromAlertViewController: UIViewController { addSubeViews() bind() bindTableView() - } - + private func addSubeViews() { view.addSubview(scrollView) view.addSubview(confirmUIView) @@ -148,9 +149,7 @@ final class PlansFromAlertViewController: UIViewController { placeNameStackView.addArrangedSubview(placeChangeImage) placeNameStackView.addArrangedSubview(newPlaceNameLabel) // 원래 위치 레이블 - // contentView.addSubview(originalPlaceNameLabel) - // // 새 위치 레이블 - // contentView.addSubview(newPlaceNameLabel) + // 참여 인원 추가 버튼 contentView.addSubview(addParticipantsButton) @@ -189,14 +188,6 @@ final class PlansFromAlertViewController: UIViewController { make.top.equalTo(originalMeetingNameLabel.snp.bottom).offset(20) make.centerX.equalToSuperview() } - // originalPlaceNameLabel.snp.makeConstraints { make in - // make.top.equalTo(originalMeetingNameLabel.snp.bottom).offset(10) - // make.centerX.equalToSuperview() - // } - // newPlaceNameLabel.snp.makeConstraints { make in - // make.top.equalTo(originalPlaceNameLabel.snp.bottom).offset(10) - // make.centerX.equalToSuperview() - // } // 달력버튼 datePickerButton.snp.makeConstraints { make in make.top.equalTo(placeNameStackView.snp.bottom).offset(10) @@ -235,15 +226,19 @@ final class PlansFromAlertViewController: UIViewController { } private func bind() { - let input = PlansFromAlertViewModel.Input(clickedAddParticipantsEvents: addParticipantsButton.rx.tap, - clickedConfirmEvents: confirmButton.rx.tap) + let input = PlansFromAlertViewModel.Input( + clickedAddParticipantsEvents: addParticipantsButton.rx.tap, + clickedConfirmEvents: confirmButton.rx.tap) let output = viewModel.createOutput(input: input) - viewModel.newPlaceName - .bind(to: newPlaceNameLabel.rx.text) - .disposed(by: disposeBag) + output.newPlaceName + .bind(to: newPlaceNameLabel.rx.text) + .disposed(by: disposeBag) + + updateViewState(from: output.callerState) } + private func bindTableView() { viewModel.selectedFriendsObservable .do(onNext: { [weak self] friends in @@ -256,7 +251,6 @@ final class PlansFromAlertViewController: UIViewController { cell.inputData(info: friend) }.disposed(by: disposeBag) - // alert 창 터치 이벤트 vc에서 진행함. datePickerButton.rx.tap @@ -271,7 +265,6 @@ final class PlansFromAlertViewController: UIViewController { self?.showEditAlert() }) .disposed(by: disposeBag) - } private func updateTableViewHeight(_ count: Int) { @@ -282,7 +275,21 @@ final class PlansFromAlertViewController: UIViewController { } view.layoutIfNeeded() } - + private func updateViewState(from newViewState: SettingPlanCaller) { + currentViewType = newViewState + switch currentViewType { + case .forNew: + originalPlaceNameLabel.removeFromSuperview() + placeChangeImage.removeFromSuperview() + originalPlaceNameLabel.isHidden = true + placeChangeImage.isHidden = true + + case .forRevice: + originalPlaceNameLabel.isHidden = false + placeChangeImage.isHidden = false + + } + } private func showEditAlert() { let alertController = UIAlertController(title: "약속 명 변경", message: nil, preferredStyle: .alert) diff --git a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift index 92dc9c36..62a2f75b 100644 --- a/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift +++ b/TWTW/TWTW/Plan/FromAlert/PlansFromAlertViewModel.swift @@ -13,6 +13,7 @@ import UIKit final class PlansFromAlertViewModel { private let disposeBag = DisposeBag() weak var coordinator: DefaultPlansFromAlertCoordinator? + // 선택된 친구 목록을 저장하는 Relay private let selectedFriendsRelay = BehaviorRelay<[Friend]>(value: []) private let caller: SettingPlanCaller @@ -21,18 +22,7 @@ final class PlansFromAlertViewModel { var selectedFriendsObservable: Observable<[Friend]> { return selectedFriendsRelay.asObservable() } - // 새로 선택된 목적지 명 - var newPlaceName: Observable { - return Observable.create { observer in - if let newPlaceName = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.placeName.rawValue) { - observer.onNext(newPlaceName) - } else { - observer.onNext(" ") - } - observer.onCompleted() - return Disposables.create() - } - } + struct Input { // 1.달력버튼 클릭 @@ -48,7 +38,9 @@ final class PlansFromAlertViewModel { // 2.코디네이터로 친구코디네이터 이동 - // 3. + // 3.caller상태에 따른 뷰 로드 수정/ 새plan 생성시 이전 data자리 빽 + let newPlaceName: Observable + let callerState: SettingPlanCaller } // MARK: - Init init(coordinator: DefaultPlansFromAlertCoordinator, caller: SettingPlanCaller = .forNew) { @@ -60,14 +52,26 @@ final class PlansFromAlertViewModel { /// - Parameter input: Input Model /// - Returns: Output Model func createOutput(input: Input) -> Output { - let output = Output() + let newPlaceNameObservable = Observable.create { observer in + if let newPlaceName = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.placeName.rawValue) { + observer.onNext(newPlaceName) + } else { + observer.onNext(" ") + } + observer.onCompleted() + return Disposables.create() + } + + let output = Output(newPlaceName: newPlaceNameObservable, callerState: caller) + + /// 친구추가 input.clickedAddParticipantsEvents? .bind { [weak self] in guard let self = self else { return } moveAddPrticipants() } .disposed(by: disposeBag) - + /// 확인버튼 input.clickedConfirmEvents? .bind { [weak self] in guard let self = self else {return } diff --git a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift index 1859995c..0974be9f 100644 --- a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift +++ b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift @@ -46,7 +46,7 @@ final class PlansViewModel { input.addPlans .bind { [weak self] _ in guard let self = self else { return } - coordinator.moveToplansFromAlert() + coordinator.moveToAddPlans() }.disposed(by: disposeBag) } } diff --git a/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift b/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift index 774ba446..e4add632 100644 --- a/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift +++ b/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift @@ -11,6 +11,8 @@ import Foundation /// Request 저장 변수 struct SearchPlacesMapState { var pageNum: Int = 1 + var isLastPage: Bool = false + } /// 보내는 장소명 text diff --git a/TWTW/TWTW/SearchPlaces/View/SearchPlacesTableViewCell.swift b/TWTW/TWTW/SearchPlaces/View/SearchPlacesTableViewCell.swift index 9f1d9601..11cc5609 100644 --- a/TWTW/TWTW/SearchPlaces/View/SearchPlacesTableViewCell.swift +++ b/TWTW/TWTW/SearchPlaces/View/SearchPlacesTableViewCell.swift @@ -55,6 +55,7 @@ final class SearchPlacesTableViewCell: UITableViewCell { addressNameLabel.snp.makeConstraints { make in make.leading.equalToSuperview().inset(15) make.top.equalTo(placeNameLabel.snp.bottom).offset(6) + make.bottom.equalToSuperview().inset(6) } } diff --git a/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift b/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift index c88ec068..6924f9f9 100644 --- a/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift +++ b/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift @@ -112,13 +112,14 @@ final class SearchPlacesMapViewModel { return output } - + /// 데이터 로드 private func loadData(output: Output) { state.pageNum = 1 searchPlacesServices?.searchPlaceService(request: PlacesRequest(searchText: output.searchText.value, pageNum: state.pageNum)) - .subscribe(onNext: { placeResponse in + .subscribe(onNext: { [weak self] placeResponse in + self?.state.isLastPage = placeResponse.isLast ?? false output.filteredPlaces.accept(placeResponse.results) }) .disposed(by: disposeBag) @@ -126,6 +127,7 @@ final class SearchPlacesMapViewModel { /// 추가 데이터 로드 private func loadMoreData(output: Output) { + guard !state.isLastPage else { return } state.pageNum += 1 searchPlacesServices?.searchPlaceService(request: PlacesRequest(searchText: output.searchText.value, pageNum: state.pageNum)) @@ -136,4 +138,5 @@ final class SearchPlacesMapViewModel { }) .disposed(by: disposeBag) } + } From 93a95e69f35afa5e4aedbed111dc34ea53b5cafa Mon Sep 17 00:00:00 2001 From: dami Date: Fri, 22 Dec 2023 20:48:50 +0900 Subject: [PATCH 19/24] =?UTF-8?q?feat:=20=EC=A7=80=EB=8F=84=20=EB=A7=88?= =?UTF-8?q?=EC=BB=A4UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 544 ++++++++ TWTW/TWTW/Map/DefaultMainMapCoordinator.swift | 8 + .../FindRoad/FindRoadViewController.swift | 117 +- .../DefaultPlansFromAlertCoordinator.swift | 5 +- TWTW/TWTW/Resources/cctv.png | Bin 0 -> 4207 bytes TWTW/TWTW/Resources/circle.png | Bin 0 -> 13790 bytes TWTW/TWTW/Resources/growingbuilding.png | Bin 0 -> 3098 bytes TWTW/TWTW/Resources/hillShading.png | Bin 0 -> 6199 bytes TWTW/TWTW/Resources/kyounggi-lod.tsv | 1096 +++++++++++++++++ TWTW/TWTW/Resources/mapBtnBikeNormal@2x.png | Bin 0 -> 1748 bytes TWTW/TWTW/Resources/mapBtnBusNormal@2x.png | Bin 0 -> 1077 bytes .../Resources/mapBtnCadastralNormal@2x.png | Bin 0 -> 1480 bytes TWTW/TWTW/Resources/mapBtnCctvNormal@2x.png | Bin 0 -> 539 bytes .../Resources/mapBtnLandformNormal@2x.png | Bin 0 -> 1064 bytes TWTW/TWTW/Resources/mapIcoBookmark_01.png | Bin 0 -> 1213 bytes TWTW/TWTW/Resources/mapIcoBookmark_02.png | Bin 0 -> 1351 bytes TWTW/TWTW/Resources/mapIcoBookmark_03.png | Bin 0 -> 1319 bytes .../TWTW/Resources/map_ico_direction_area.png | Bin 0 -> 8776 bytes TWTW/TWTW/Resources/map_ico_marker.png | Bin 0 -> 2332 bytes .../Resources/map_ico_marker_direction.png | Bin 0 -> 670 bytes TWTW/TWTW/Resources/ndm_1.png | Bin 0 -> 11122 bytes TWTW/TWTW/Resources/noti.png | Bin 0 -> 902 bytes TWTW/TWTW/Resources/noti2.png | Bin 0 -> 2289 bytes TWTW/TWTW/Resources/noti3.png | Bin 0 -> 2204 bytes TWTW/TWTW/Resources/p_eat_dot@2x.png | Bin 0 -> 1331 bytes TWTW/TWTW/Resources/pin_blue.png | Bin 0 -> 3318 bytes TWTW/TWTW/Resources/pin_green.png | Bin 0 -> 3282 bytes TWTW/TWTW/Resources/pin_org.png | Bin 0 -> 3241 bytes TWTW/TWTW/Resources/pin_red.png | Bin 0 -> 3313 bytes TWTW/TWTW/Resources/road_30.json | 1 + TWTW/TWTW/Resources/roadview_on.png | Bin 0 -> 7427 bytes TWTW/TWTW/Resources/route.png | Bin 0 -> 3769 bytes TWTW/TWTW/Resources/routeSample_car.txt | 86 ++ TWTW/TWTW/Resources/route_pattern_arrow.png | Bin 0 -> 264 bytes .../Resources/route_pattern_long_airplane.png | Bin 0 -> 1244 bytes .../TWTW/Resources/route_pattern_long_dot.png | Bin 0 -> 629 bytes TWTW/TWTW/Resources/route_pattern_walk.png | Bin 0 -> 629 bytes .../Resources/search/search_ico_pin_map.png | Bin 0 -> 4154 bytes .../search/search_ico_pin_small_map.png | Bin 0 -> 2144 bytes .../Resources/search/search_result01.json | 95 ++ .../Resources/sharemap/Profile_big_01.png | Bin 0 -> 29602 bytes .../Resources/sharemap/Profile_big_02.png | Bin 0 -> 28839 bytes .../Resources/sharemap/Profile_big_03.png | Bin 0 -> 28141 bytes .../Resources/sharemap/Profile_big_04.png | Bin 0 -> 29075 bytes .../Resources/sharemap/Profile_big_05.png | Bin 0 -> 29817 bytes .../Resources/sharemap/Profile_big_06.png | Bin 0 -> 26805 bytes .../Resources/sharemap/Profile_big_07.png | Bin 0 -> 30082 bytes .../Resources/sharemap/Profile_big_08.png | Bin 0 -> 28602 bytes .../Resources/sharemap/Profile_big_09.png | Bin 0 -> 31511 bytes .../Resources/sharemap/Profile_big_10.png | Bin 0 -> 29968 bytes .../Resources/sharemap/Profile_default_01.png | Bin 0 -> 16633 bytes .../Resources/sharemap/Profile_default_02.png | Bin 0 -> 16384 bytes .../Resources/sharemap/Profile_default_03.png | Bin 0 -> 15650 bytes .../Resources/sharemap/Profile_default_04.png | Bin 0 -> 16112 bytes .../Resources/sharemap/Profile_default_05.png | Bin 0 -> 16977 bytes .../Resources/sharemap/Profile_default_06.png | Bin 0 -> 15033 bytes .../Resources/sharemap/Profile_default_07.png | Bin 0 -> 16633 bytes .../Resources/sharemap/Profile_default_08.png | Bin 0 -> 15943 bytes .../Resources/sharemap/Profile_default_09.png | Bin 0 -> 17532 bytes .../Resources/sharemap/Profile_default_10.png | Bin 0 -> 17074 bytes .../Sharemap_marker_bad_badge_big.png | Bin 0 -> 1393 bytes .../Sharemap_marker_bad_badge_normal.png | Bin 0 -> 1019 bytes .../sharemap/Sharemap_marker_big.png | Bin 0 -> 7992 bytes .../Sharemap_marker_crown_badge_big.png | Bin 0 -> 2714 bytes .../sharemap/Sharemap_marker_me_badge_big.png | Bin 0 -> 2357 bytes .../Sharemap_marker_me_badge_normal.png | Bin 0 -> 2200 bytes .../sharemap/Sharemap_marker_nomal.png | Bin 0 -> 5053 bytes .../sharemap_marker_crown_badge_normal.png | Bin 0 -> 1877 bytes TWTW/TWTW/Resources/skyview_1.png | Bin 0 -> 13858 bytes TWTW/TWTW/Resources/svc_off.png | Bin 0 -> 10942 bytes TWTW/TWTW/Resources/tile.png | Bin 0 -> 4780 bytes TWTW/TWTW/Resources/track_location_btn.png | Bin 0 -> 5059 bytes .../track_location_btn_compass_on.png | Bin 0 -> 6165 bytes .../Resources/track_location_btn_pressed.png | Bin 0 -> 6046 bytes TWTW/TWTW/Resources/traffic.png | Bin 0 -> 6279 bytes TWTW/TWTW/Resources/vehicles/1.txt | 1 + TWTW/TWTW/Resources/vehicles/10.txt | 1 + TWTW/TWTW/Resources/vehicles/11.txt | 1 + TWTW/TWTW/Resources/vehicles/12.txt | 1 + TWTW/TWTW/Resources/vehicles/13.txt | 1 + TWTW/TWTW/Resources/vehicles/14.txt | 1 + TWTW/TWTW/Resources/vehicles/15.txt | 1 + TWTW/TWTW/Resources/vehicles/16.txt | 1 + TWTW/TWTW/Resources/vehicles/17.txt | 1 + TWTW/TWTW/Resources/vehicles/18.txt | 1 + TWTW/TWTW/Resources/vehicles/19.txt | 1 + TWTW/TWTW/Resources/vehicles/2.txt | 1 + TWTW/TWTW/Resources/vehicles/20.txt | 1 + TWTW/TWTW/Resources/vehicles/21.txt | 1 + TWTW/TWTW/Resources/vehicles/22.txt | 1 + TWTW/TWTW/Resources/vehicles/23.txt | 1 + TWTW/TWTW/Resources/vehicles/24.txt | 1 + TWTW/TWTW/Resources/vehicles/25.txt | 1 + TWTW/TWTW/Resources/vehicles/3.txt | 1 + TWTW/TWTW/Resources/vehicles/4.txt | 1 + TWTW/TWTW/Resources/vehicles/5.txt | 1 + TWTW/TWTW/Resources/vehicles/6.txt | 1 + TWTW/TWTW/Resources/vehicles/7.txt | 1 + TWTW/TWTW/Resources/vehicles/8.txt | 1 + TWTW/TWTW/Resources/vehicles/9.txt | 1 + .../vehicles/mapbusico_airport_10_lv.png | Bin 0 -> 446 bytes .../vehicles/mapbusico_airport_1_lv.png | Bin 0 -> 3588 bytes .../vehicles/mapbusico_airport_2_lv.png | Bin 0 -> 1429 bytes .../vehicles/mapbusico_airport_3_lv.png | Bin 0 -> 1024 bytes .../vehicles/mapbusico_airport_7_lv.png | Bin 0 -> 566 bytes .../vehicles/mapbusico_blue_10_lv.png | Bin 0 -> 446 bytes .../vehicles/mapbusico_blue_12_lv.png | Bin 0 -> 1060 bytes .../vehicles/mapbusico_blue_17_lv.png | Bin 0 -> 1440 bytes .../vehicles/mapbusico_blue_1_lv.png | Bin 0 -> 3642 bytes .../vehicles/mapbusico_blue_20_lv.png | Bin 0 -> 3642 bytes .../vehicles/mapbusico_blue_2_lv.png | Bin 0 -> 1440 bytes .../vehicles/mapbusico_blue_3_lv.png | Bin 0 -> 1060 bytes .../vehicles/mapbusico_blue_5_lv.png | Bin 0 -> 446 bytes .../vehicles/mapbusico_blue_7_lv.png | Bin 0 -> 569 bytes .../vehicles/mapbusico_blue_8_lv.png | Bin 0 -> 569 bytes .../vehicles/mapbusico_green_10_lv.png | Bin 0 -> 434 bytes .../vehicles/mapbusico_green_1_lv.png | Bin 0 -> 3525 bytes .../vehicles/mapbusico_green_2_lv.png | Bin 0 -> 1350 bytes .../vehicles/mapbusico_green_3_lv.png | Bin 0 -> 988 bytes .../vehicles/mapbusico_green_7_lv.png | Bin 0 -> 539 bytes .../vehicles/mapbusico_red_10_lv.png | Bin 0 -> 441 bytes .../Resources/vehicles/mapbusico_red_1_lv.png | Bin 0 -> 3505 bytes .../Resources/vehicles/mapbusico_red_2_lv.png | Bin 0 -> 1357 bytes .../Resources/vehicles/mapbusico_red_3_lv.png | Bin 0 -> 1011 bytes .../Resources/vehicles/mapbusico_red_7_lv.png | Bin 0 -> 536 bytes .../vehicles/mapbusico_yellow_10_lv.png | Bin 0 -> 429 bytes .../vehicles/mapbusico_yellow_1_lv.png | Bin 0 -> 3526 bytes .../vehicles/mapbusico_yellow_2_lv.png | Bin 0 -> 1369 bytes .../vehicles/mapbusico_yellow_3_lv.png | Bin 0 -> 1016 bytes .../vehicles/mapbusico_yellow_7_lv.png | Bin 0 -> 543 bytes TWTW/TWTW/Resources/white_black.png | Bin 0 -> 633 bytes TWTW/TWTW/Resources/white_black_round10.png | Bin 0 -> 1405 bytes 132 files changed, 1957 insertions(+), 20 deletions(-) create mode 100644 TWTW/TWTW/Resources/cctv.png create mode 100644 TWTW/TWTW/Resources/circle.png create mode 100644 TWTW/TWTW/Resources/growingbuilding.png create mode 100644 TWTW/TWTW/Resources/hillShading.png create mode 100644 TWTW/TWTW/Resources/kyounggi-lod.tsv create mode 100644 TWTW/TWTW/Resources/mapBtnBikeNormal@2x.png create mode 100644 TWTW/TWTW/Resources/mapBtnBusNormal@2x.png create mode 100644 TWTW/TWTW/Resources/mapBtnCadastralNormal@2x.png create mode 100644 TWTW/TWTW/Resources/mapBtnCctvNormal@2x.png create mode 100644 TWTW/TWTW/Resources/mapBtnLandformNormal@2x.png create mode 100644 TWTW/TWTW/Resources/mapIcoBookmark_01.png create mode 100644 TWTW/TWTW/Resources/mapIcoBookmark_02.png create mode 100644 TWTW/TWTW/Resources/mapIcoBookmark_03.png create mode 100644 TWTW/TWTW/Resources/map_ico_direction_area.png create mode 100644 TWTW/TWTW/Resources/map_ico_marker.png create mode 100644 TWTW/TWTW/Resources/map_ico_marker_direction.png create mode 100644 TWTW/TWTW/Resources/ndm_1.png create mode 100644 TWTW/TWTW/Resources/noti.png create mode 100644 TWTW/TWTW/Resources/noti2.png create mode 100644 TWTW/TWTW/Resources/noti3.png create mode 100644 TWTW/TWTW/Resources/p_eat_dot@2x.png create mode 100644 TWTW/TWTW/Resources/pin_blue.png create mode 100644 TWTW/TWTW/Resources/pin_green.png create mode 100644 TWTW/TWTW/Resources/pin_org.png create mode 100644 TWTW/TWTW/Resources/pin_red.png create mode 100644 TWTW/TWTW/Resources/road_30.json create mode 100755 TWTW/TWTW/Resources/roadview_on.png create mode 100755 TWTW/TWTW/Resources/route.png create mode 100644 TWTW/TWTW/Resources/routeSample_car.txt create mode 100644 TWTW/TWTW/Resources/route_pattern_arrow.png create mode 100644 TWTW/TWTW/Resources/route_pattern_long_airplane.png create mode 100644 TWTW/TWTW/Resources/route_pattern_long_dot.png create mode 100644 TWTW/TWTW/Resources/route_pattern_walk.png create mode 100644 TWTW/TWTW/Resources/search/search_ico_pin_map.png create mode 100644 TWTW/TWTW/Resources/search/search_ico_pin_small_map.png create mode 100644 TWTW/TWTW/Resources/search/search_result01.json create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_big_01.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_big_02.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_big_03.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_big_04.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_big_05.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_big_06.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_big_07.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_big_08.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_big_09.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_big_10.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_default_01.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_default_02.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_default_03.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_default_04.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_default_05.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_default_06.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_default_07.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_default_08.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_default_09.png create mode 100644 TWTW/TWTW/Resources/sharemap/Profile_default_10.png create mode 100644 TWTW/TWTW/Resources/sharemap/Sharemap_marker_bad_badge_big.png create mode 100644 TWTW/TWTW/Resources/sharemap/Sharemap_marker_bad_badge_normal.png create mode 100644 TWTW/TWTW/Resources/sharemap/Sharemap_marker_big.png create mode 100644 TWTW/TWTW/Resources/sharemap/Sharemap_marker_crown_badge_big.png create mode 100644 TWTW/TWTW/Resources/sharemap/Sharemap_marker_me_badge_big.png create mode 100644 TWTW/TWTW/Resources/sharemap/Sharemap_marker_me_badge_normal.png create mode 100644 TWTW/TWTW/Resources/sharemap/Sharemap_marker_nomal.png create mode 100644 TWTW/TWTW/Resources/sharemap/sharemap_marker_crown_badge_normal.png create mode 100644 TWTW/TWTW/Resources/skyview_1.png create mode 100644 TWTW/TWTW/Resources/svc_off.png create mode 100644 TWTW/TWTW/Resources/tile.png create mode 100644 TWTW/TWTW/Resources/track_location_btn.png create mode 100644 TWTW/TWTW/Resources/track_location_btn_compass_on.png create mode 100644 TWTW/TWTW/Resources/track_location_btn_pressed.png create mode 100644 TWTW/TWTW/Resources/traffic.png create mode 100755 TWTW/TWTW/Resources/vehicles/1.txt create mode 100755 TWTW/TWTW/Resources/vehicles/10.txt create mode 100755 TWTW/TWTW/Resources/vehicles/11.txt create mode 100755 TWTW/TWTW/Resources/vehicles/12.txt create mode 100755 TWTW/TWTW/Resources/vehicles/13.txt create mode 100755 TWTW/TWTW/Resources/vehicles/14.txt create mode 100755 TWTW/TWTW/Resources/vehicles/15.txt create mode 100755 TWTW/TWTW/Resources/vehicles/16.txt create mode 100755 TWTW/TWTW/Resources/vehicles/17.txt create mode 100755 TWTW/TWTW/Resources/vehicles/18.txt create mode 100755 TWTW/TWTW/Resources/vehicles/19.txt create mode 100755 TWTW/TWTW/Resources/vehicles/2.txt create mode 100755 TWTW/TWTW/Resources/vehicles/20.txt create mode 100755 TWTW/TWTW/Resources/vehicles/21.txt create mode 100755 TWTW/TWTW/Resources/vehicles/22.txt create mode 100755 TWTW/TWTW/Resources/vehicles/23.txt create mode 100755 TWTW/TWTW/Resources/vehicles/24.txt create mode 100755 TWTW/TWTW/Resources/vehicles/25.txt create mode 100755 TWTW/TWTW/Resources/vehicles/3.txt create mode 100755 TWTW/TWTW/Resources/vehicles/4.txt create mode 100755 TWTW/TWTW/Resources/vehicles/5.txt create mode 100755 TWTW/TWTW/Resources/vehicles/6.txt create mode 100755 TWTW/TWTW/Resources/vehicles/7.txt create mode 100755 TWTW/TWTW/Resources/vehicles/8.txt create mode 100755 TWTW/TWTW/Resources/vehicles/9.txt create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_airport_10_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_airport_1_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_airport_2_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_airport_3_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_airport_7_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_blue_10_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_blue_12_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_blue_17_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_blue_1_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_blue_20_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_blue_2_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_blue_3_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_blue_5_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_blue_7_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_blue_8_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_green_10_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_green_1_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_green_2_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_green_3_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_green_7_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_red_10_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_red_1_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_red_2_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_red_3_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_red_7_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_yellow_10_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_yellow_1_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_yellow_2_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_yellow_3_lv.png create mode 100644 TWTW/TWTW/Resources/vehicles/mapbusico_yellow_7_lv.png create mode 100644 TWTW/TWTW/Resources/white_black.png create mode 100644 TWTW/TWTW/Resources/white_black_round10.png diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index 11141822..6b423639 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -81,6 +81,134 @@ 37C35EE32B1CC876008A289D /* MakeNewFriendsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C35EE22B1CC876008A289D /* MakeNewFriendsListCoordinator.swift */; }; 37C35EE52B1CC8A6008A289D /* DefaultMakeNewFriendsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C35EE42B1CC8A6008A289D /* DefaultMakeNewFriendsListCoordinator.swift */; }; 37C733752B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C733742B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift */; }; + 37CCABBA2B35AE11006F4BF8 /* hillShading.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB372B35AE11006F4BF8 /* hillShading.png */; }; + 37CCABBB2B35AE11006F4BF8 /* track_location_btn_compass_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB382B35AE11006F4BF8 /* track_location_btn_compass_on.png */; }; + 37CCABBC2B35AE11006F4BF8 /* tile.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB392B35AE11006F4BF8 /* tile.png */; }; + 37CCABBD2B35AE11006F4BF8 /* mapBtnCadastralNormal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB3A2B35AE11006F4BF8 /* mapBtnCadastralNormal@2x.png */; }; + 37CCABBE2B35AE11006F4BF8 /* map_ico_marker.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB3B2B35AE11006F4BF8 /* map_ico_marker.png */; }; + 37CCABBF2B35AE11006F4BF8 /* pin_red.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB3C2B35AE11006F4BF8 /* pin_red.png */; }; + 37CCABC02B35AE11006F4BF8 /* pin_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB3D2B35AE11006F4BF8 /* pin_blue.png */; }; + 37CCABC12B35AE11006F4BF8 /* kyounggi-lod.tsv in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB3E2B35AE11006F4BF8 /* kyounggi-lod.tsv */; }; + 37CCABC22B35AE11006F4BF8 /* route_pattern_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB3F2B35AE11006F4BF8 /* route_pattern_arrow.png */; }; + 37CCABC32B35AE11006F4BF8 /* white_black_round10.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB402B35AE11006F4BF8 /* white_black_round10.png */; }; + 37CCABC42B35AE11006F4BF8 /* Profile_big_07.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB422B35AE11006F4BF8 /* Profile_big_07.png */; }; + 37CCABC52B35AE11006F4BF8 /* Profile_big_06.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB432B35AE11006F4BF8 /* Profile_big_06.png */; }; + 37CCABC62B35AE11006F4BF8 /* Profile_big_10.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB442B35AE11006F4BF8 /* Profile_big_10.png */; }; + 37CCABC72B35AE11006F4BF8 /* Profile_big_04.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB452B35AE11006F4BF8 /* Profile_big_04.png */; }; + 37CCABC82B35AE11006F4BF8 /* Profile_big_05.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB462B35AE11006F4BF8 /* Profile_big_05.png */; }; + 37CCABC92B35AE11006F4BF8 /* Sharemap_marker_nomal.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB472B35AE11006F4BF8 /* Sharemap_marker_nomal.png */; }; + 37CCABCA2B35AE11006F4BF8 /* sharemap_marker_crown_badge_normal.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB482B35AE11006F4BF8 /* sharemap_marker_crown_badge_normal.png */; }; + 37CCABCB2B35AE11006F4BF8 /* Profile_big_01.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB492B35AE11006F4BF8 /* Profile_big_01.png */; }; + 37CCABCC2B35AE11006F4BF8 /* Profile_big_02.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB4A2B35AE11006F4BF8 /* Profile_big_02.png */; }; + 37CCABCD2B35AE11006F4BF8 /* Profile_default_08.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB4B2B35AE11006F4BF8 /* Profile_default_08.png */; }; + 37CCABCE2B35AE11006F4BF8 /* Profile_default_09.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB4C2B35AE11006F4BF8 /* Profile_default_09.png */; }; + 37CCABCF2B35AE11006F4BF8 /* Profile_big_03.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB4D2B35AE11006F4BF8 /* Profile_big_03.png */; }; + 37CCABD02B35AE11006F4BF8 /* Sharemap_marker_bad_badge_normal.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB4E2B35AE11006F4BF8 /* Sharemap_marker_bad_badge_normal.png */; }; + 37CCABD12B35AE11006F4BF8 /* Sharemap_marker_me_badge_normal.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB4F2B35AE11006F4BF8 /* Sharemap_marker_me_badge_normal.png */; }; + 37CCABD22B35AE11006F4BF8 /* Sharemap_marker_big.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB502B35AE11006F4BF8 /* Sharemap_marker_big.png */; }; + 37CCABD32B35AE11006F4BF8 /* Sharemap_marker_me_badge_big.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB512B35AE11006F4BF8 /* Sharemap_marker_me_badge_big.png */; }; + 37CCABD42B35AE11006F4BF8 /* Profile_default_10.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB522B35AE11006F4BF8 /* Profile_default_10.png */; }; + 37CCABD52B35AE11006F4BF8 /* Profile_default_04.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB532B35AE11006F4BF8 /* Profile_default_04.png */; }; + 37CCABD62B35AE11006F4BF8 /* Profile_default_05.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB542B35AE11006F4BF8 /* Profile_default_05.png */; }; + 37CCABD72B35AE11006F4BF8 /* Sharemap_marker_crown_badge_big.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB552B35AE11006F4BF8 /* Sharemap_marker_crown_badge_big.png */; }; + 37CCABD82B35AE11006F4BF8 /* Profile_default_07.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB562B35AE11006F4BF8 /* Profile_default_07.png */; }; + 37CCABD92B35AE11006F4BF8 /* Sharemap_marker_bad_badge_big.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB572B35AE11006F4BF8 /* Sharemap_marker_bad_badge_big.png */; }; + 37CCABDA2B35AE11006F4BF8 /* Profile_default_06.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB582B35AE11006F4BF8 /* Profile_default_06.png */; }; + 37CCABDB2B35AE11006F4BF8 /* Profile_big_08.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB592B35AE11006F4BF8 /* Profile_big_08.png */; }; + 37CCABDC2B35AE11006F4BF8 /* Profile_default_02.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB5A2B35AE11006F4BF8 /* Profile_default_02.png */; }; + 37CCABDD2B35AE11006F4BF8 /* Profile_default_03.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB5B2B35AE11006F4BF8 /* Profile_default_03.png */; }; + 37CCABDE2B35AE11006F4BF8 /* Profile_big_09.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB5C2B35AE11006F4BF8 /* Profile_big_09.png */; }; + 37CCABDF2B35AE11006F4BF8 /* Profile_default_01.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB5D2B35AE11006F4BF8 /* Profile_default_01.png */; }; + 37CCABE02B35AE11006F4BF8 /* route_pattern_long_dot.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB5E2B35AE11006F4BF8 /* route_pattern_long_dot.png */; }; + 37CCABE12B35AE11006F4BF8 /* noti3.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB5F2B35AE11006F4BF8 /* noti3.png */; }; + 37CCABE22B35AE11006F4BF8 /* circle.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB602B35AE11006F4BF8 /* circle.png */; }; + 37CCABE32B35AE11006F4BF8 /* noti2.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB612B35AE11006F4BF8 /* noti2.png */; }; + 37CCABE42B35AE11006F4BF8 /* growingbuilding.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB622B35AE11006F4BF8 /* growingbuilding.png */; }; + 37CCABE52B35AE11006F4BF8 /* cctv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB632B35AE11006F4BF8 /* cctv.png */; }; + 37CCABE62B35AE11006F4BF8 /* track_location_btn.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB642B35AE11006F4BF8 /* track_location_btn.png */; }; + 37CCABE72B35AE11006F4BF8 /* road_30.json in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB652B35AE11006F4BF8 /* road_30.json */; }; + 37CCABE82B35AE11006F4BF8 /* search_ico_pin_map.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB672B35AE11006F4BF8 /* search_ico_pin_map.png */; }; + 37CCABE92B35AE11006F4BF8 /* search_ico_pin_small_map.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB682B35AE11006F4BF8 /* search_ico_pin_small_map.png */; }; + 37CCABEA2B35AE11006F4BF8 /* search_result01.json in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB692B35AE11006F4BF8 /* search_result01.json */; }; + 37CCABEB2B35AE11006F4BF8 /* mapBtnBikeNormal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB6A2B35AE11006F4BF8 /* mapBtnBikeNormal@2x.png */; }; + 37CCABEC2B35AE11006F4BF8 /* white_black.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB6B2B35AE11006F4BF8 /* white_black.png */; }; + 37CCABED2B35AE11006F4BF8 /* track_location_btn_pressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB6C2B35AE11006F4BF8 /* track_location_btn_pressed.png */; }; + 37CCABEE2B35AE11006F4BF8 /* route.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB6D2B35AE11006F4BF8 /* route.png */; }; + 37CCABEF2B35AE11006F4BF8 /* mapIcoBookmark_01.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB6E2B35AE11006F4BF8 /* mapIcoBookmark_01.png */; }; + 37CCABF02B35AE11006F4BF8 /* traffic.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB6F2B35AE11006F4BF8 /* traffic.png */; }; + 37CCABF12B35AE11006F4BF8 /* roadview_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB702B35AE11006F4BF8 /* roadview_on.png */; }; + 37CCABF22B35AE11006F4BF8 /* map_ico_direction_area.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB712B35AE11006F4BF8 /* map_ico_direction_area.png */; }; + 37CCABF32B35AE11006F4BF8 /* ndm_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB722B35AE11006F4BF8 /* ndm_1.png */; }; + 37CCABF42B35AE11006F4BF8 /* mapIcoBookmark_02.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB732B35AE11006F4BF8 /* mapIcoBookmark_02.png */; }; + 37CCABF52B35AE11006F4BF8 /* route_pattern_long_airplane.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB742B35AE11006F4BF8 /* route_pattern_long_airplane.png */; }; + 37CCABF62B35AE11006F4BF8 /* mapIcoBookmark_03.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB752B35AE11006F4BF8 /* mapIcoBookmark_03.png */; }; + 37CCABF72B35AE11006F4BF8 /* mapBtnLandformNormal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB762B35AE11006F4BF8 /* mapBtnLandformNormal@2x.png */; }; + 37CCABF82B35AE11006F4BF8 /* 15.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB782B35AE11006F4BF8 /* 15.txt */; }; + 37CCABF92B35AE11006F4BF8 /* mapbusico_green_1_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB792B35AE11006F4BF8 /* mapbusico_green_1_lv.png */; }; + 37CCABFA2B35AE11006F4BF8 /* mapbusico_blue_10_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB7A2B35AE11006F4BF8 /* mapbusico_blue_10_lv.png */; }; + 37CCABFB2B35AE11006F4BF8 /* 14.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB7B2B35AE11006F4BF8 /* 14.txt */; }; + 37CCABFC2B35AE11006F4BF8 /* mapbusico_red_10_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB7C2B35AE11006F4BF8 /* mapbusico_red_10_lv.png */; }; + 37CCABFD2B35AE11006F4BF8 /* 16.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB7D2B35AE11006F4BF8 /* 16.txt */; }; + 37CCABFE2B35AE11006F4BF8 /* mapbusico_yellow_1_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB7E2B35AE11006F4BF8 /* mapbusico_yellow_1_lv.png */; }; + 37CCABFF2B35AE11006F4BF8 /* mapbusico_yellow_10_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB7F2B35AE11006F4BF8 /* mapbusico_yellow_10_lv.png */; }; + 37CCAC002B35AE11006F4BF8 /* 17.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB802B35AE11006F4BF8 /* 17.txt */; }; + 37CCAC012B35AE11006F4BF8 /* mapbusico_airport_10_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB812B35AE11006F4BF8 /* mapbusico_airport_10_lv.png */; }; + 37CCAC022B35AE12006F4BF8 /* mapbusico_yellow_3_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB822B35AE11006F4BF8 /* mapbusico_yellow_3_lv.png */; }; + 37CCAC032B35AE12006F4BF8 /* 13.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB832B35AE11006F4BF8 /* 13.txt */; }; + 37CCAC042B35AE12006F4BF8 /* 12.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB842B35AE11006F4BF8 /* 12.txt */; }; + 37CCAC052B35AE12006F4BF8 /* mapbusico_green_3_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB852B35AE11006F4BF8 /* mapbusico_green_3_lv.png */; }; + 37CCAC062B35AE12006F4BF8 /* 10.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB862B35AE11006F4BF8 /* 10.txt */; }; + 37CCAC072B35AE12006F4BF8 /* mapbusico_green_10_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB872B35AE11006F4BF8 /* mapbusico_green_10_lv.png */; }; + 37CCAC082B35AE12006F4BF8 /* mapbusico_blue_8_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB882B35AE11006F4BF8 /* mapbusico_blue_8_lv.png */; }; + 37CCAC092B35AE12006F4BF8 /* 11.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB892B35AE11006F4BF8 /* 11.txt */; }; + 37CCAC0A2B35AE12006F4BF8 /* mapbusico_blue_12_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB8A2B35AE11006F4BF8 /* mapbusico_blue_12_lv.png */; }; + 37CCAC0B2B35AE12006F4BF8 /* mapbusico_yellow_7_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB8B2B35AE11006F4BF8 /* mapbusico_yellow_7_lv.png */; }; + 37CCAC0C2B35AE12006F4BF8 /* mapbusico_airport_2_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB8C2B35AE11006F4BF8 /* mapbusico_airport_2_lv.png */; }; + 37CCAC0D2B35AE12006F4BF8 /* mapbusico_green_7_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB8D2B35AE11006F4BF8 /* mapbusico_green_7_lv.png */; }; + 37CCAC0E2B35AE12006F4BF8 /* mapbusico_blue_20_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB8E2B35AE11006F4BF8 /* mapbusico_blue_20_lv.png */; }; + 37CCAC0F2B35AE12006F4BF8 /* mapbusico_blue_2_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB8F2B35AE11006F4BF8 /* mapbusico_blue_2_lv.png */; }; + 37CCAC102B35AE12006F4BF8 /* 9.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB902B35AE11006F4BF8 /* 9.txt */; }; + 37CCAC112B35AE12006F4BF8 /* mapbusico_red_2_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB912B35AE11006F4BF8 /* mapbusico_red_2_lv.png */; }; + 37CCAC122B35AE12006F4BF8 /* 8.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB922B35AE11006F4BF8 /* 8.txt */; }; + 37CCAC132B35AE12006F4BF8 /* mapbusico_red_7_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB932B35AE11006F4BF8 /* mapbusico_red_7_lv.png */; }; + 37CCAC142B35AE12006F4BF8 /* 5.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB942B35AE11006F4BF8 /* 5.txt */; }; + 37CCAC152B35AE12006F4BF8 /* 4.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB952B35AE11006F4BF8 /* 4.txt */; }; + 37CCAC162B35AE12006F4BF8 /* mapbusico_blue_7_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB962B35AE11006F4BF8 /* mapbusico_blue_7_lv.png */; }; + 37CCAC172B35AE12006F4BF8 /* 6.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB972B35AE11006F4BF8 /* 6.txt */; }; + 37CCAC182B35AE12006F4BF8 /* 7.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB982B35AE11006F4BF8 /* 7.txt */; }; + 37CCAC192B35AE12006F4BF8 /* mapbusico_airport_7_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB992B35AE11006F4BF8 /* mapbusico_airport_7_lv.png */; }; + 37CCAC1A2B35AE12006F4BF8 /* 3.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB9A2B35AE11006F4BF8 /* 3.txt */; }; + 37CCAC1B2B35AE12006F4BF8 /* mapbusico_blue_5_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB9B2B35AE11006F4BF8 /* mapbusico_blue_5_lv.png */; }; + 37CCAC1C2B35AE12006F4BF8 /* mapbusico_green_2_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB9C2B35AE11006F4BF8 /* mapbusico_green_2_lv.png */; }; + 37CCAC1D2B35AE12006F4BF8 /* 2.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB9D2B35AE11006F4BF8 /* 2.txt */; }; + 37CCAC1E2B35AE12006F4BF8 /* mapbusico_yellow_2_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB9E2B35AE11006F4BF8 /* mapbusico_yellow_2_lv.png */; }; + 37CCAC1F2B35AE12006F4BF8 /* 1.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCAB9F2B35AE11006F4BF8 /* 1.txt */; }; + 37CCAC202B35AE12006F4BF8 /* 20.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABA02B35AE11006F4BF8 /* 20.txt */; }; + 37CCAC212B35AE12006F4BF8 /* mapbusico_airport_3_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABA12B35AE11006F4BF8 /* mapbusico_airport_3_lv.png */; }; + 37CCAC222B35AE12006F4BF8 /* mapbusico_blue_17_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABA22B35AE11006F4BF8 /* mapbusico_blue_17_lv.png */; }; + 37CCAC232B35AE12006F4BF8 /* mapbusico_blue_1_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABA32B35AE11006F4BF8 /* mapbusico_blue_1_lv.png */; }; + 37CCAC242B35AE12006F4BF8 /* 21.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABA42B35AE11006F4BF8 /* 21.txt */; }; + 37CCAC252B35AE12006F4BF8 /* 23.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABA52B35AE11006F4BF8 /* 23.txt */; }; + 37CCAC262B35AE12006F4BF8 /* mapbusico_red_1_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABA62B35AE11006F4BF8 /* mapbusico_red_1_lv.png */; }; + 37CCAC272B35AE12006F4BF8 /* 22.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABA72B35AE11006F4BF8 /* 22.txt */; }; + 37CCAC282B35AE12006F4BF8 /* mapbusico_red_3_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABA82B35AE11006F4BF8 /* mapbusico_red_3_lv.png */; }; + 37CCAC292B35AE12006F4BF8 /* 25.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABA92B35AE11006F4BF8 /* 25.txt */; }; + 37CCAC2A2B35AE12006F4BF8 /* 19.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABAA2B35AE11006F4BF8 /* 19.txt */; }; + 37CCAC2B2B35AE12006F4BF8 /* 18.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABAB2B35AE11006F4BF8 /* 18.txt */; }; + 37CCAC2C2B35AE12006F4BF8 /* 24.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABAC2B35AE11006F4BF8 /* 24.txt */; }; + 37CCAC2D2B35AE12006F4BF8 /* mapbusico_blue_3_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABAD2B35AE11006F4BF8 /* mapbusico_blue_3_lv.png */; }; + 37CCAC2E2B35AE12006F4BF8 /* mapbusico_airport_1_lv.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABAE2B35AE11006F4BF8 /* mapbusico_airport_1_lv.png */; }; + 37CCAC2F2B35AE12006F4BF8 /* mapBtnCctvNormal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABAF2B35AE11006F4BF8 /* mapBtnCctvNormal@2x.png */; }; + 37CCAC302B35AE12006F4BF8 /* skyview_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABB02B35AE11006F4BF8 /* skyview_1.png */; }; + 37CCAC312B35AE12006F4BF8 /* mapBtnBusNormal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABB12B35AE11006F4BF8 /* mapBtnBusNormal@2x.png */; }; + 37CCAC322B35AE12006F4BF8 /* pin_org.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABB22B35AE11006F4BF8 /* pin_org.png */; }; + 37CCAC332B35AE12006F4BF8 /* map_ico_marker_direction.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABB32B35AE11006F4BF8 /* map_ico_marker_direction.png */; }; + 37CCAC342B35AE12006F4BF8 /* route_pattern_walk.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABB42B35AE11006F4BF8 /* route_pattern_walk.png */; }; + 37CCAC352B35AE12006F4BF8 /* noti.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABB52B35AE11006F4BF8 /* noti.png */; }; + 37CCAC362B35AE12006F4BF8 /* routeSample_car.txt in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABB62B35AE11006F4BF8 /* routeSample_car.txt */; }; + 37CCAC372B35AE12006F4BF8 /* svc_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABB72B35AE11006F4BF8 /* svc_off.png */; }; + 37CCAC382B35AE12006F4BF8 /* pin_green.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABB82B35AE11006F4BF8 /* pin_green.png */; }; + 37CCAC392B35AE12006F4BF8 /* p_eat_dot@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 37CCABB92B35AE11006F4BF8 /* p_eat_dot@2x.png */; }; 37CCCC392B1C8FB3003710DB /* MakeNewFriendsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CCCC382B1C8FB3003710DB /* MakeNewFriendsListViewController.swift */; }; 37CE1EAF2AE75813009CDA21 /* SearchPlace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CE1EAE2AE75813009CDA21 /* SearchPlace.swift */; }; 37D3AFE32B0F3E67006FB449 /* MockSearchPlacesMapCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D3AFE22B0F3E67006FB449 /* MockSearchPlacesMapCoordinator.swift */; }; @@ -260,6 +388,134 @@ 37C35EE22B1CC876008A289D /* MakeNewFriendsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewFriendsListCoordinator.swift; sourceTree = ""; }; 37C35EE42B1CC8A6008A289D /* DefaultMakeNewFriendsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultMakeNewFriendsListCoordinator.swift; sourceTree = ""; }; 37C733742B2C4DD300D58224 /* SearchPlaceBottomSheetViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlaceBottomSheetViewModel.swift; sourceTree = ""; }; + 37CCAB372B35AE11006F4BF8 /* hillShading.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = hillShading.png; sourceTree = ""; }; + 37CCAB382B35AE11006F4BF8 /* track_location_btn_compass_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = track_location_btn_compass_on.png; sourceTree = ""; }; + 37CCAB392B35AE11006F4BF8 /* tile.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tile.png; sourceTree = ""; }; + 37CCAB3A2B35AE11006F4BF8 /* mapBtnCadastralNormal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "mapBtnCadastralNormal@2x.png"; sourceTree = ""; }; + 37CCAB3B2B35AE11006F4BF8 /* map_ico_marker.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_ico_marker.png; sourceTree = ""; }; + 37CCAB3C2B35AE11006F4BF8 /* pin_red.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pin_red.png; sourceTree = ""; }; + 37CCAB3D2B35AE11006F4BF8 /* pin_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pin_blue.png; sourceTree = ""; }; + 37CCAB3E2B35AE11006F4BF8 /* kyounggi-lod.tsv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "kyounggi-lod.tsv"; sourceTree = ""; }; + 37CCAB3F2B35AE11006F4BF8 /* route_pattern_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_pattern_arrow.png; sourceTree = ""; }; + 37CCAB402B35AE11006F4BF8 /* white_black_round10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = white_black_round10.png; sourceTree = ""; }; + 37CCAB422B35AE11006F4BF8 /* Profile_big_07.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_big_07.png; sourceTree = ""; }; + 37CCAB432B35AE11006F4BF8 /* Profile_big_06.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_big_06.png; sourceTree = ""; }; + 37CCAB442B35AE11006F4BF8 /* Profile_big_10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_big_10.png; sourceTree = ""; }; + 37CCAB452B35AE11006F4BF8 /* Profile_big_04.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_big_04.png; sourceTree = ""; }; + 37CCAB462B35AE11006F4BF8 /* Profile_big_05.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_big_05.png; sourceTree = ""; }; + 37CCAB472B35AE11006F4BF8 /* Sharemap_marker_nomal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Sharemap_marker_nomal.png; sourceTree = ""; }; + 37CCAB482B35AE11006F4BF8 /* sharemap_marker_crown_badge_normal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sharemap_marker_crown_badge_normal.png; sourceTree = ""; }; + 37CCAB492B35AE11006F4BF8 /* Profile_big_01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_big_01.png; sourceTree = ""; }; + 37CCAB4A2B35AE11006F4BF8 /* Profile_big_02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_big_02.png; sourceTree = ""; }; + 37CCAB4B2B35AE11006F4BF8 /* Profile_default_08.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_default_08.png; sourceTree = ""; }; + 37CCAB4C2B35AE11006F4BF8 /* Profile_default_09.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_default_09.png; sourceTree = ""; }; + 37CCAB4D2B35AE11006F4BF8 /* Profile_big_03.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_big_03.png; sourceTree = ""; }; + 37CCAB4E2B35AE11006F4BF8 /* Sharemap_marker_bad_badge_normal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Sharemap_marker_bad_badge_normal.png; sourceTree = ""; }; + 37CCAB4F2B35AE11006F4BF8 /* Sharemap_marker_me_badge_normal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Sharemap_marker_me_badge_normal.png; sourceTree = ""; }; + 37CCAB502B35AE11006F4BF8 /* Sharemap_marker_big.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Sharemap_marker_big.png; sourceTree = ""; }; + 37CCAB512B35AE11006F4BF8 /* Sharemap_marker_me_badge_big.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Sharemap_marker_me_badge_big.png; sourceTree = ""; }; + 37CCAB522B35AE11006F4BF8 /* Profile_default_10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_default_10.png; sourceTree = ""; }; + 37CCAB532B35AE11006F4BF8 /* Profile_default_04.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_default_04.png; sourceTree = ""; }; + 37CCAB542B35AE11006F4BF8 /* Profile_default_05.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_default_05.png; sourceTree = ""; }; + 37CCAB552B35AE11006F4BF8 /* Sharemap_marker_crown_badge_big.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Sharemap_marker_crown_badge_big.png; sourceTree = ""; }; + 37CCAB562B35AE11006F4BF8 /* Profile_default_07.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_default_07.png; sourceTree = ""; }; + 37CCAB572B35AE11006F4BF8 /* Sharemap_marker_bad_badge_big.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Sharemap_marker_bad_badge_big.png; sourceTree = ""; }; + 37CCAB582B35AE11006F4BF8 /* Profile_default_06.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_default_06.png; sourceTree = ""; }; + 37CCAB592B35AE11006F4BF8 /* Profile_big_08.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_big_08.png; sourceTree = ""; }; + 37CCAB5A2B35AE11006F4BF8 /* Profile_default_02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_default_02.png; sourceTree = ""; }; + 37CCAB5B2B35AE11006F4BF8 /* Profile_default_03.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_default_03.png; sourceTree = ""; }; + 37CCAB5C2B35AE11006F4BF8 /* Profile_big_09.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_big_09.png; sourceTree = ""; }; + 37CCAB5D2B35AE11006F4BF8 /* Profile_default_01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Profile_default_01.png; sourceTree = ""; }; + 37CCAB5E2B35AE11006F4BF8 /* route_pattern_long_dot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_pattern_long_dot.png; sourceTree = ""; }; + 37CCAB5F2B35AE11006F4BF8 /* noti3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = noti3.png; sourceTree = ""; }; + 37CCAB602B35AE11006F4BF8 /* circle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = circle.png; sourceTree = ""; }; + 37CCAB612B35AE11006F4BF8 /* noti2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = noti2.png; sourceTree = ""; }; + 37CCAB622B35AE11006F4BF8 /* growingbuilding.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = growingbuilding.png; sourceTree = ""; }; + 37CCAB632B35AE11006F4BF8 /* cctv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cctv.png; sourceTree = ""; }; + 37CCAB642B35AE11006F4BF8 /* track_location_btn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = track_location_btn.png; sourceTree = ""; }; + 37CCAB652B35AE11006F4BF8 /* road_30.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = road_30.json; sourceTree = ""; }; + 37CCAB672B35AE11006F4BF8 /* search_ico_pin_map.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = search_ico_pin_map.png; sourceTree = ""; }; + 37CCAB682B35AE11006F4BF8 /* search_ico_pin_small_map.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = search_ico_pin_small_map.png; sourceTree = ""; }; + 37CCAB692B35AE11006F4BF8 /* search_result01.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = search_result01.json; sourceTree = ""; }; + 37CCAB6A2B35AE11006F4BF8 /* mapBtnBikeNormal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "mapBtnBikeNormal@2x.png"; sourceTree = ""; }; + 37CCAB6B2B35AE11006F4BF8 /* white_black.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = white_black.png; sourceTree = ""; }; + 37CCAB6C2B35AE11006F4BF8 /* track_location_btn_pressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = track_location_btn_pressed.png; sourceTree = ""; }; + 37CCAB6D2B35AE11006F4BF8 /* route.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route.png; sourceTree = ""; }; + 37CCAB6E2B35AE11006F4BF8 /* mapIcoBookmark_01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapIcoBookmark_01.png; sourceTree = ""; }; + 37CCAB6F2B35AE11006F4BF8 /* traffic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = traffic.png; sourceTree = ""; }; + 37CCAB702B35AE11006F4BF8 /* roadview_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = roadview_on.png; sourceTree = ""; }; + 37CCAB712B35AE11006F4BF8 /* map_ico_direction_area.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_ico_direction_area.png; sourceTree = ""; }; + 37CCAB722B35AE11006F4BF8 /* ndm_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ndm_1.png; sourceTree = ""; }; + 37CCAB732B35AE11006F4BF8 /* mapIcoBookmark_02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapIcoBookmark_02.png; sourceTree = ""; }; + 37CCAB742B35AE11006F4BF8 /* route_pattern_long_airplane.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_pattern_long_airplane.png; sourceTree = ""; }; + 37CCAB752B35AE11006F4BF8 /* mapIcoBookmark_03.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapIcoBookmark_03.png; sourceTree = ""; }; + 37CCAB762B35AE11006F4BF8 /* mapBtnLandformNormal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "mapBtnLandformNormal@2x.png"; sourceTree = ""; }; + 37CCAB782B35AE11006F4BF8 /* 15.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 15.txt; sourceTree = ""; }; + 37CCAB792B35AE11006F4BF8 /* mapbusico_green_1_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_green_1_lv.png; sourceTree = ""; }; + 37CCAB7A2B35AE11006F4BF8 /* mapbusico_blue_10_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_blue_10_lv.png; sourceTree = ""; }; + 37CCAB7B2B35AE11006F4BF8 /* 14.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 14.txt; sourceTree = ""; }; + 37CCAB7C2B35AE11006F4BF8 /* mapbusico_red_10_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_red_10_lv.png; sourceTree = ""; }; + 37CCAB7D2B35AE11006F4BF8 /* 16.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 16.txt; sourceTree = ""; }; + 37CCAB7E2B35AE11006F4BF8 /* mapbusico_yellow_1_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_yellow_1_lv.png; sourceTree = ""; }; + 37CCAB7F2B35AE11006F4BF8 /* mapbusico_yellow_10_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_yellow_10_lv.png; sourceTree = ""; }; + 37CCAB802B35AE11006F4BF8 /* 17.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 17.txt; sourceTree = ""; }; + 37CCAB812B35AE11006F4BF8 /* mapbusico_airport_10_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_airport_10_lv.png; sourceTree = ""; }; + 37CCAB822B35AE11006F4BF8 /* mapbusico_yellow_3_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_yellow_3_lv.png; sourceTree = ""; }; + 37CCAB832B35AE11006F4BF8 /* 13.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 13.txt; sourceTree = ""; }; + 37CCAB842B35AE11006F4BF8 /* 12.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 12.txt; sourceTree = ""; }; + 37CCAB852B35AE11006F4BF8 /* mapbusico_green_3_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_green_3_lv.png; sourceTree = ""; }; + 37CCAB862B35AE11006F4BF8 /* 10.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 10.txt; sourceTree = ""; }; + 37CCAB872B35AE11006F4BF8 /* mapbusico_green_10_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_green_10_lv.png; sourceTree = ""; }; + 37CCAB882B35AE11006F4BF8 /* mapbusico_blue_8_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_blue_8_lv.png; sourceTree = ""; }; + 37CCAB892B35AE11006F4BF8 /* 11.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 11.txt; sourceTree = ""; }; + 37CCAB8A2B35AE11006F4BF8 /* mapbusico_blue_12_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_blue_12_lv.png; sourceTree = ""; }; + 37CCAB8B2B35AE11006F4BF8 /* mapbusico_yellow_7_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_yellow_7_lv.png; sourceTree = ""; }; + 37CCAB8C2B35AE11006F4BF8 /* mapbusico_airport_2_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_airport_2_lv.png; sourceTree = ""; }; + 37CCAB8D2B35AE11006F4BF8 /* mapbusico_green_7_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_green_7_lv.png; sourceTree = ""; }; + 37CCAB8E2B35AE11006F4BF8 /* mapbusico_blue_20_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_blue_20_lv.png; sourceTree = ""; }; + 37CCAB8F2B35AE11006F4BF8 /* mapbusico_blue_2_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_blue_2_lv.png; sourceTree = ""; }; + 37CCAB902B35AE11006F4BF8 /* 9.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 9.txt; sourceTree = ""; }; + 37CCAB912B35AE11006F4BF8 /* mapbusico_red_2_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_red_2_lv.png; sourceTree = ""; }; + 37CCAB922B35AE11006F4BF8 /* 8.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 8.txt; sourceTree = ""; }; + 37CCAB932B35AE11006F4BF8 /* mapbusico_red_7_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_red_7_lv.png; sourceTree = ""; }; + 37CCAB942B35AE11006F4BF8 /* 5.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 5.txt; sourceTree = ""; }; + 37CCAB952B35AE11006F4BF8 /* 4.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 4.txt; sourceTree = ""; }; + 37CCAB962B35AE11006F4BF8 /* mapbusico_blue_7_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_blue_7_lv.png; sourceTree = ""; }; + 37CCAB972B35AE11006F4BF8 /* 6.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 6.txt; sourceTree = ""; }; + 37CCAB982B35AE11006F4BF8 /* 7.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 7.txt; sourceTree = ""; }; + 37CCAB992B35AE11006F4BF8 /* mapbusico_airport_7_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_airport_7_lv.png; sourceTree = ""; }; + 37CCAB9A2B35AE11006F4BF8 /* 3.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 3.txt; sourceTree = ""; }; + 37CCAB9B2B35AE11006F4BF8 /* mapbusico_blue_5_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_blue_5_lv.png; sourceTree = ""; }; + 37CCAB9C2B35AE11006F4BF8 /* mapbusico_green_2_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_green_2_lv.png; sourceTree = ""; }; + 37CCAB9D2B35AE11006F4BF8 /* 2.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 2.txt; sourceTree = ""; }; + 37CCAB9E2B35AE11006F4BF8 /* mapbusico_yellow_2_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_yellow_2_lv.png; sourceTree = ""; }; + 37CCAB9F2B35AE11006F4BF8 /* 1.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 1.txt; sourceTree = ""; }; + 37CCABA02B35AE11006F4BF8 /* 20.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 20.txt; sourceTree = ""; }; + 37CCABA12B35AE11006F4BF8 /* mapbusico_airport_3_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_airport_3_lv.png; sourceTree = ""; }; + 37CCABA22B35AE11006F4BF8 /* mapbusico_blue_17_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_blue_17_lv.png; sourceTree = ""; }; + 37CCABA32B35AE11006F4BF8 /* mapbusico_blue_1_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_blue_1_lv.png; sourceTree = ""; }; + 37CCABA42B35AE11006F4BF8 /* 21.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 21.txt; sourceTree = ""; }; + 37CCABA52B35AE11006F4BF8 /* 23.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 23.txt; sourceTree = ""; }; + 37CCABA62B35AE11006F4BF8 /* mapbusico_red_1_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_red_1_lv.png; sourceTree = ""; }; + 37CCABA72B35AE11006F4BF8 /* 22.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 22.txt; sourceTree = ""; }; + 37CCABA82B35AE11006F4BF8 /* mapbusico_red_3_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_red_3_lv.png; sourceTree = ""; }; + 37CCABA92B35AE11006F4BF8 /* 25.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 25.txt; sourceTree = ""; }; + 37CCABAA2B35AE11006F4BF8 /* 19.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 19.txt; sourceTree = ""; }; + 37CCABAB2B35AE11006F4BF8 /* 18.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 18.txt; sourceTree = ""; }; + 37CCABAC2B35AE11006F4BF8 /* 24.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 24.txt; sourceTree = ""; }; + 37CCABAD2B35AE11006F4BF8 /* mapbusico_blue_3_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_blue_3_lv.png; sourceTree = ""; }; + 37CCABAE2B35AE11006F4BF8 /* mapbusico_airport_1_lv.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = mapbusico_airport_1_lv.png; sourceTree = ""; }; + 37CCABAF2B35AE11006F4BF8 /* mapBtnCctvNormal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "mapBtnCctvNormal@2x.png"; sourceTree = ""; }; + 37CCABB02B35AE11006F4BF8 /* skyview_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = skyview_1.png; sourceTree = ""; }; + 37CCABB12B35AE11006F4BF8 /* mapBtnBusNormal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "mapBtnBusNormal@2x.png"; sourceTree = ""; }; + 37CCABB22B35AE11006F4BF8 /* pin_org.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pin_org.png; sourceTree = ""; }; + 37CCABB32B35AE11006F4BF8 /* map_ico_marker_direction.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_ico_marker_direction.png; sourceTree = ""; }; + 37CCABB42B35AE11006F4BF8 /* route_pattern_walk.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_pattern_walk.png; sourceTree = ""; }; + 37CCABB52B35AE11006F4BF8 /* noti.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = noti.png; sourceTree = ""; }; + 37CCABB62B35AE11006F4BF8 /* routeSample_car.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = routeSample_car.txt; sourceTree = ""; }; + 37CCABB72B35AE11006F4BF8 /* svc_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = svc_off.png; sourceTree = ""; }; + 37CCABB82B35AE11006F4BF8 /* pin_green.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pin_green.png; sourceTree = ""; }; + 37CCABB92B35AE11006F4BF8 /* p_eat_dot@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "p_eat_dot@2x.png"; sourceTree = ""; }; 37CCCC382B1C8FB3003710DB /* MakeNewFriendsListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeNewFriendsListViewController.swift; sourceTree = ""; }; 37CE1EAE2AE75813009CDA21 /* SearchPlace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlace.swift; sourceTree = ""; }; 37D3AFE22B0F3E67006FB449 /* MockSearchPlacesMapCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSearchPlacesMapCoordinator.swift; sourceTree = ""; }; @@ -481,6 +737,7 @@ 3758F18A2A7D007200E2933C /* TWTW */ = { isa = PBXGroup; children = ( + 37CCAB362B35AE11006F4BF8 /* Resources */, 374DB4642B247C8F00AF648C /* MyPage */, 374DB45D2B24745B00AF648C /* Tabbar */, 37BB030D2B2329C7006B2BEB /* Friends */, @@ -847,6 +1104,165 @@ path = Coordinator; sourceTree = ""; }; + 37CCAB362B35AE11006F4BF8 /* Resources */ = { + isa = PBXGroup; + children = ( + 37CCAB372B35AE11006F4BF8 /* hillShading.png */, + 37CCAB382B35AE11006F4BF8 /* track_location_btn_compass_on.png */, + 37CCAB392B35AE11006F4BF8 /* tile.png */, + 37CCAB3A2B35AE11006F4BF8 /* mapBtnCadastralNormal@2x.png */, + 37CCAB3B2B35AE11006F4BF8 /* map_ico_marker.png */, + 37CCAB3C2B35AE11006F4BF8 /* pin_red.png */, + 37CCAB3D2B35AE11006F4BF8 /* pin_blue.png */, + 37CCAB3E2B35AE11006F4BF8 /* kyounggi-lod.tsv */, + 37CCAB3F2B35AE11006F4BF8 /* route_pattern_arrow.png */, + 37CCAB402B35AE11006F4BF8 /* white_black_round10.png */, + 37CCAB412B35AE11006F4BF8 /* sharemap */, + 37CCAB5E2B35AE11006F4BF8 /* route_pattern_long_dot.png */, + 37CCAB5F2B35AE11006F4BF8 /* noti3.png */, + 37CCAB602B35AE11006F4BF8 /* circle.png */, + 37CCAB612B35AE11006F4BF8 /* noti2.png */, + 37CCAB622B35AE11006F4BF8 /* growingbuilding.png */, + 37CCAB632B35AE11006F4BF8 /* cctv.png */, + 37CCAB642B35AE11006F4BF8 /* track_location_btn.png */, + 37CCAB652B35AE11006F4BF8 /* road_30.json */, + 37CCAB662B35AE11006F4BF8 /* search */, + 37CCAB6A2B35AE11006F4BF8 /* mapBtnBikeNormal@2x.png */, + 37CCAB6B2B35AE11006F4BF8 /* white_black.png */, + 37CCAB6C2B35AE11006F4BF8 /* track_location_btn_pressed.png */, + 37CCAB6D2B35AE11006F4BF8 /* route.png */, + 37CCAB6E2B35AE11006F4BF8 /* mapIcoBookmark_01.png */, + 37CCAB6F2B35AE11006F4BF8 /* traffic.png */, + 37CCAB702B35AE11006F4BF8 /* roadview_on.png */, + 37CCAB712B35AE11006F4BF8 /* map_ico_direction_area.png */, + 37CCAB722B35AE11006F4BF8 /* ndm_1.png */, + 37CCAB732B35AE11006F4BF8 /* mapIcoBookmark_02.png */, + 37CCAB742B35AE11006F4BF8 /* route_pattern_long_airplane.png */, + 37CCAB752B35AE11006F4BF8 /* mapIcoBookmark_03.png */, + 37CCAB762B35AE11006F4BF8 /* mapBtnLandformNormal@2x.png */, + 37CCAB772B35AE11006F4BF8 /* vehicles */, + 37CCABAF2B35AE11006F4BF8 /* mapBtnCctvNormal@2x.png */, + 37CCABB02B35AE11006F4BF8 /* skyview_1.png */, + 37CCABB12B35AE11006F4BF8 /* mapBtnBusNormal@2x.png */, + 37CCABB22B35AE11006F4BF8 /* pin_org.png */, + 37CCABB32B35AE11006F4BF8 /* map_ico_marker_direction.png */, + 37CCABB42B35AE11006F4BF8 /* route_pattern_walk.png */, + 37CCABB52B35AE11006F4BF8 /* noti.png */, + 37CCABB62B35AE11006F4BF8 /* routeSample_car.txt */, + 37CCABB72B35AE11006F4BF8 /* svc_off.png */, + 37CCABB82B35AE11006F4BF8 /* pin_green.png */, + 37CCABB92B35AE11006F4BF8 /* p_eat_dot@2x.png */, + ); + path = Resources; + sourceTree = ""; + }; + 37CCAB412B35AE11006F4BF8 /* sharemap */ = { + isa = PBXGroup; + children = ( + 37CCAB422B35AE11006F4BF8 /* Profile_big_07.png */, + 37CCAB432B35AE11006F4BF8 /* Profile_big_06.png */, + 37CCAB442B35AE11006F4BF8 /* Profile_big_10.png */, + 37CCAB452B35AE11006F4BF8 /* Profile_big_04.png */, + 37CCAB462B35AE11006F4BF8 /* Profile_big_05.png */, + 37CCAB472B35AE11006F4BF8 /* Sharemap_marker_nomal.png */, + 37CCAB482B35AE11006F4BF8 /* sharemap_marker_crown_badge_normal.png */, + 37CCAB492B35AE11006F4BF8 /* Profile_big_01.png */, + 37CCAB4A2B35AE11006F4BF8 /* Profile_big_02.png */, + 37CCAB4B2B35AE11006F4BF8 /* Profile_default_08.png */, + 37CCAB4C2B35AE11006F4BF8 /* Profile_default_09.png */, + 37CCAB4D2B35AE11006F4BF8 /* Profile_big_03.png */, + 37CCAB4E2B35AE11006F4BF8 /* Sharemap_marker_bad_badge_normal.png */, + 37CCAB4F2B35AE11006F4BF8 /* Sharemap_marker_me_badge_normal.png */, + 37CCAB502B35AE11006F4BF8 /* Sharemap_marker_big.png */, + 37CCAB512B35AE11006F4BF8 /* Sharemap_marker_me_badge_big.png */, + 37CCAB522B35AE11006F4BF8 /* Profile_default_10.png */, + 37CCAB532B35AE11006F4BF8 /* Profile_default_04.png */, + 37CCAB542B35AE11006F4BF8 /* Profile_default_05.png */, + 37CCAB552B35AE11006F4BF8 /* Sharemap_marker_crown_badge_big.png */, + 37CCAB562B35AE11006F4BF8 /* Profile_default_07.png */, + 37CCAB572B35AE11006F4BF8 /* Sharemap_marker_bad_badge_big.png */, + 37CCAB582B35AE11006F4BF8 /* Profile_default_06.png */, + 37CCAB592B35AE11006F4BF8 /* Profile_big_08.png */, + 37CCAB5A2B35AE11006F4BF8 /* Profile_default_02.png */, + 37CCAB5B2B35AE11006F4BF8 /* Profile_default_03.png */, + 37CCAB5C2B35AE11006F4BF8 /* Profile_big_09.png */, + 37CCAB5D2B35AE11006F4BF8 /* Profile_default_01.png */, + ); + path = sharemap; + sourceTree = ""; + }; + 37CCAB662B35AE11006F4BF8 /* search */ = { + isa = PBXGroup; + children = ( + 37CCAB672B35AE11006F4BF8 /* search_ico_pin_map.png */, + 37CCAB682B35AE11006F4BF8 /* search_ico_pin_small_map.png */, + 37CCAB692B35AE11006F4BF8 /* search_result01.json */, + ); + path = search; + sourceTree = ""; + }; + 37CCAB772B35AE11006F4BF8 /* vehicles */ = { + isa = PBXGroup; + children = ( + 37CCAB782B35AE11006F4BF8 /* 15.txt */, + 37CCAB792B35AE11006F4BF8 /* mapbusico_green_1_lv.png */, + 37CCAB7A2B35AE11006F4BF8 /* mapbusico_blue_10_lv.png */, + 37CCAB7B2B35AE11006F4BF8 /* 14.txt */, + 37CCAB7C2B35AE11006F4BF8 /* mapbusico_red_10_lv.png */, + 37CCAB7D2B35AE11006F4BF8 /* 16.txt */, + 37CCAB7E2B35AE11006F4BF8 /* mapbusico_yellow_1_lv.png */, + 37CCAB7F2B35AE11006F4BF8 /* mapbusico_yellow_10_lv.png */, + 37CCAB802B35AE11006F4BF8 /* 17.txt */, + 37CCAB812B35AE11006F4BF8 /* mapbusico_airport_10_lv.png */, + 37CCAB822B35AE11006F4BF8 /* mapbusico_yellow_3_lv.png */, + 37CCAB832B35AE11006F4BF8 /* 13.txt */, + 37CCAB842B35AE11006F4BF8 /* 12.txt */, + 37CCAB852B35AE11006F4BF8 /* mapbusico_green_3_lv.png */, + 37CCAB862B35AE11006F4BF8 /* 10.txt */, + 37CCAB872B35AE11006F4BF8 /* mapbusico_green_10_lv.png */, + 37CCAB882B35AE11006F4BF8 /* mapbusico_blue_8_lv.png */, + 37CCAB892B35AE11006F4BF8 /* 11.txt */, + 37CCAB8A2B35AE11006F4BF8 /* mapbusico_blue_12_lv.png */, + 37CCAB8B2B35AE11006F4BF8 /* mapbusico_yellow_7_lv.png */, + 37CCAB8C2B35AE11006F4BF8 /* mapbusico_airport_2_lv.png */, + 37CCAB8D2B35AE11006F4BF8 /* mapbusico_green_7_lv.png */, + 37CCAB8E2B35AE11006F4BF8 /* mapbusico_blue_20_lv.png */, + 37CCAB8F2B35AE11006F4BF8 /* mapbusico_blue_2_lv.png */, + 37CCAB902B35AE11006F4BF8 /* 9.txt */, + 37CCAB912B35AE11006F4BF8 /* mapbusico_red_2_lv.png */, + 37CCAB922B35AE11006F4BF8 /* 8.txt */, + 37CCAB932B35AE11006F4BF8 /* mapbusico_red_7_lv.png */, + 37CCAB942B35AE11006F4BF8 /* 5.txt */, + 37CCAB952B35AE11006F4BF8 /* 4.txt */, + 37CCAB962B35AE11006F4BF8 /* mapbusico_blue_7_lv.png */, + 37CCAB972B35AE11006F4BF8 /* 6.txt */, + 37CCAB982B35AE11006F4BF8 /* 7.txt */, + 37CCAB992B35AE11006F4BF8 /* mapbusico_airport_7_lv.png */, + 37CCAB9A2B35AE11006F4BF8 /* 3.txt */, + 37CCAB9B2B35AE11006F4BF8 /* mapbusico_blue_5_lv.png */, + 37CCAB9C2B35AE11006F4BF8 /* mapbusico_green_2_lv.png */, + 37CCAB9D2B35AE11006F4BF8 /* 2.txt */, + 37CCAB9E2B35AE11006F4BF8 /* mapbusico_yellow_2_lv.png */, + 37CCAB9F2B35AE11006F4BF8 /* 1.txt */, + 37CCABA02B35AE11006F4BF8 /* 20.txt */, + 37CCABA12B35AE11006F4BF8 /* mapbusico_airport_3_lv.png */, + 37CCABA22B35AE11006F4BF8 /* mapbusico_blue_17_lv.png */, + 37CCABA32B35AE11006F4BF8 /* mapbusico_blue_1_lv.png */, + 37CCABA42B35AE11006F4BF8 /* 21.txt */, + 37CCABA52B35AE11006F4BF8 /* 23.txt */, + 37CCABA62B35AE11006F4BF8 /* mapbusico_red_1_lv.png */, + 37CCABA72B35AE11006F4BF8 /* 22.txt */, + 37CCABA82B35AE11006F4BF8 /* mapbusico_red_3_lv.png */, + 37CCABA92B35AE11006F4BF8 /* 25.txt */, + 37CCABAA2B35AE11006F4BF8 /* 19.txt */, + 37CCABAB2B35AE11006F4BF8 /* 18.txt */, + 37CCABAC2B35AE11006F4BF8 /* 24.txt */, + 37CCABAD2B35AE11006F4BF8 /* mapbusico_blue_3_lv.png */, + 37CCABAE2B35AE11006F4BF8 /* mapbusico_airport_1_lv.png */, + ); + path = vehicles; + sourceTree = ""; + }; 37CCCC372B1C8FA4003710DB /* MakeNewFriends */ = { isa = PBXGroup; children = ( @@ -1576,9 +1992,137 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 37CCAC212B35AE12006F4BF8 /* mapbusico_airport_3_lv.png in Resources */, + 37CCAC222B35AE12006F4BF8 /* mapbusico_blue_17_lv.png in Resources */, + 37CCAC102B35AE12006F4BF8 /* 9.txt in Resources */, + 37CCABE82B35AE11006F4BF8 /* search_ico_pin_map.png in Resources */, + 37CCAC1A2B35AE12006F4BF8 /* 3.txt in Resources */, + 37CCABE32B35AE11006F4BF8 /* noti2.png in Resources */, + 37CCAC0B2B35AE12006F4BF8 /* mapbusico_yellow_7_lv.png in Resources */, + 37CCABC22B35AE11006F4BF8 /* route_pattern_arrow.png in Resources */, + 37CCABEE2B35AE11006F4BF8 /* route.png in Resources */, + 37CCABEC2B35AE11006F4BF8 /* white_black.png in Resources */, + 37CCAC062B35AE12006F4BF8 /* 10.txt in Resources */, + 37CCABF02B35AE11006F4BF8 /* traffic.png in Resources */, + 37CCABD52B35AE11006F4BF8 /* Profile_default_04.png in Resources */, + 37CCABD62B35AE11006F4BF8 /* Profile_default_05.png in Resources */, + 37CCAC162B35AE12006F4BF8 /* mapbusico_blue_7_lv.png in Resources */, + 37CCAC0C2B35AE12006F4BF8 /* mapbusico_airport_2_lv.png in Resources */, + 37CCABD32B35AE11006F4BF8 /* Sharemap_marker_me_badge_big.png in Resources */, + 37CCABBD2B35AE11006F4BF8 /* mapBtnCadastralNormal@2x.png in Resources */, 3BE038C92AFB0BE70039B4FD /* .swiftlint.yml in Resources */, + 37CCAC332B35AE12006F4BF8 /* map_ico_marker_direction.png in Resources */, + 37CCABC32B35AE11006F4BF8 /* white_black_round10.png in Resources */, + 37CCAC202B35AE12006F4BF8 /* 20.txt in Resources */, + 37CCABED2B35AE11006F4BF8 /* track_location_btn_pressed.png in Resources */, + 37CCABDE2B35AE11006F4BF8 /* Profile_big_09.png in Resources */, + 37CCAC312B35AE12006F4BF8 /* mapBtnBusNormal@2x.png in Resources */, + 37CCAC272B35AE12006F4BF8 /* 22.txt in Resources */, + 37CCAC262B35AE12006F4BF8 /* mapbusico_red_1_lv.png in Resources */, + 37CCAC232B35AE12006F4BF8 /* mapbusico_blue_1_lv.png in Resources */, + 37CCAC2B2B35AE12006F4BF8 /* 18.txt in Resources */, + 37CCABF82B35AE11006F4BF8 /* 15.txt in Resources */, + 37CCAC242B35AE12006F4BF8 /* 21.txt in Resources */, + 37CCAC182B35AE12006F4BF8 /* 7.txt in Resources */, + 37CCAC0A2B35AE12006F4BF8 /* mapbusico_blue_12_lv.png in Resources */, + 37CCABF52B35AE11006F4BF8 /* route_pattern_long_airplane.png in Resources */, + 37CCABE62B35AE11006F4BF8 /* track_location_btn.png in Resources */, + 37CCABBF2B35AE11006F4BF8 /* pin_red.png in Resources */, + 37CCABD82B35AE11006F4BF8 /* Profile_default_07.png in Resources */, + 37CCABFE2B35AE11006F4BF8 /* mapbusico_yellow_1_lv.png in Resources */, + 37CCAC1E2B35AE12006F4BF8 /* mapbusico_yellow_2_lv.png in Resources */, + 37CCAC1D2B35AE12006F4BF8 /* 2.txt in Resources */, + 37CCABD42B35AE11006F4BF8 /* Profile_default_10.png in Resources */, + 37CCABFD2B35AE11006F4BF8 /* 16.txt in Resources */, + 37CCABBA2B35AE11006F4BF8 /* hillShading.png in Resources */, + 37CCABE72B35AE11006F4BF8 /* road_30.json in Resources */, + 37CCABDA2B35AE11006F4BF8 /* Profile_default_06.png in Resources */, + 37CCABDF2B35AE11006F4BF8 /* Profile_default_01.png in Resources */, + 37CCAC1C2B35AE12006F4BF8 /* mapbusico_green_2_lv.png in Resources */, + 37CCAC382B35AE12006F4BF8 /* pin_green.png in Resources */, + 37CCABEF2B35AE11006F4BF8 /* mapIcoBookmark_01.png in Resources */, + 37CCAC0F2B35AE12006F4BF8 /* mapbusico_blue_2_lv.png in Resources */, 3758F1982A7D007300E2933C /* LaunchScreen.storyboard in Resources */, + 37CCABF62B35AE11006F4BF8 /* mapIcoBookmark_03.png in Resources */, + 37CCAC2E2B35AE12006F4BF8 /* mapbusico_airport_1_lv.png in Resources */, + 37CCABE22B35AE11006F4BF8 /* circle.png in Resources */, + 37CCABF72B35AE11006F4BF8 /* mapBtnLandformNormal@2x.png in Resources */, + 37CCAC032B35AE12006F4BF8 /* 13.txt in Resources */, + 37CCAC142B35AE12006F4BF8 /* 5.txt in Resources */, + 37CCABC62B35AE11006F4BF8 /* Profile_big_10.png in Resources */, + 37CCABC52B35AE11006F4BF8 /* Profile_big_06.png in Resources */, + 37CCAC372B35AE12006F4BF8 /* svc_off.png in Resources */, + 37CCAC352B35AE12006F4BF8 /* noti.png in Resources */, + 37CCAC052B35AE12006F4BF8 /* mapbusico_green_3_lv.png in Resources */, + 37CCAC112B35AE12006F4BF8 /* mapbusico_red_2_lv.png in Resources */, + 37CCAC022B35AE12006F4BF8 /* mapbusico_yellow_3_lv.png in Resources */, + 37CCAC122B35AE12006F4BF8 /* 8.txt in Resources */, + 37CCAC1F2B35AE12006F4BF8 /* 1.txt in Resources */, + 37CCAC2F2B35AE12006F4BF8 /* mapBtnCctvNormal@2x.png in Resources */, + 37CCABD92B35AE11006F4BF8 /* Sharemap_marker_bad_badge_big.png in Resources */, + 37CCAC1B2B35AE12006F4BF8 /* mapbusico_blue_5_lv.png in Resources */, + 37CCABC42B35AE11006F4BF8 /* Profile_big_07.png in Resources */, + 37CCABFB2B35AE11006F4BF8 /* 14.txt in Resources */, + 37CCABE42B35AE11006F4BF8 /* growingbuilding.png in Resources */, + 37CCABC92B35AE11006F4BF8 /* Sharemap_marker_nomal.png in Resources */, + 37CCAC362B35AE12006F4BF8 /* routeSample_car.txt in Resources */, + 37CCAC292B35AE12006F4BF8 /* 25.txt in Resources */, + 37CCABC72B35AE11006F4BF8 /* Profile_big_04.png in Resources */, + 37CCABCD2B35AE11006F4BF8 /* Profile_default_08.png in Resources */, + 37CCABDB2B35AE11006F4BF8 /* Profile_big_08.png in Resources */, + 37CCABC82B35AE11006F4BF8 /* Profile_big_05.png in Resources */, + 37CCABD72B35AE11006F4BF8 /* Sharemap_marker_crown_badge_big.png in Resources */, + 37CCABE92B35AE11006F4BF8 /* search_ico_pin_small_map.png in Resources */, + 37CCAC192B35AE12006F4BF8 /* mapbusico_airport_7_lv.png in Resources */, + 37CCABCE2B35AE11006F4BF8 /* Profile_default_09.png in Resources */, + 37CCABC12B35AE11006F4BF8 /* kyounggi-lod.tsv in Resources */, + 37CCAC2C2B35AE12006F4BF8 /* 24.txt in Resources */, + 37CCABCC2B35AE11006F4BF8 /* Profile_big_02.png in Resources */, + 37CCAC392B35AE12006F4BF8 /* p_eat_dot@2x.png in Resources */, + 37CCABCF2B35AE11006F4BF8 /* Profile_big_03.png in Resources */, 3758F1952A7D007300E2933C /* Assets.xcassets in Resources */, + 37CCABEA2B35AE11006F4BF8 /* search_result01.json in Resources */, + 37CCABEB2B35AE11006F4BF8 /* mapBtnBikeNormal@2x.png in Resources */, + 37CCABBB2B35AE11006F4BF8 /* track_location_btn_compass_on.png in Resources */, + 37CCAC0D2B35AE12006F4BF8 /* mapbusico_green_7_lv.png in Resources */, + 37CCABF22B35AE11006F4BF8 /* map_ico_direction_area.png in Resources */, + 37CCABBE2B35AE11006F4BF8 /* map_ico_marker.png in Resources */, + 37CCAC282B35AE12006F4BF8 /* mapbusico_red_3_lv.png in Resources */, + 37CCABF32B35AE11006F4BF8 /* ndm_1.png in Resources */, + 37CCABE12B35AE11006F4BF8 /* noti3.png in Resources */, + 37CCAC342B35AE12006F4BF8 /* route_pattern_walk.png in Resources */, + 37CCAC322B35AE12006F4BF8 /* pin_org.png in Resources */, + 37CCABCA2B35AE11006F4BF8 /* sharemap_marker_crown_badge_normal.png in Resources */, + 37CCAC152B35AE12006F4BF8 /* 4.txt in Resources */, + 37CCABFA2B35AE11006F4BF8 /* mapbusico_blue_10_lv.png in Resources */, + 37CCAC092B35AE12006F4BF8 /* 11.txt in Resources */, + 37CCABCB2B35AE11006F4BF8 /* Profile_big_01.png in Resources */, + 37CCAC072B35AE12006F4BF8 /* mapbusico_green_10_lv.png in Resources */, + 37CCABE52B35AE11006F4BF8 /* cctv.png in Resources */, + 37CCAC002B35AE11006F4BF8 /* 17.txt in Resources */, + 37CCAC0E2B35AE12006F4BF8 /* mapbusico_blue_20_lv.png in Resources */, + 37CCAC132B35AE12006F4BF8 /* mapbusico_red_7_lv.png in Resources */, + 37CCAC012B35AE11006F4BF8 /* mapbusico_airport_10_lv.png in Resources */, + 37CCABF42B35AE11006F4BF8 /* mapIcoBookmark_02.png in Resources */, + 37CCAC042B35AE12006F4BF8 /* 12.txt in Resources */, + 37CCABF12B35AE11006F4BF8 /* roadview_on.png in Resources */, + 37CCAC2D2B35AE12006F4BF8 /* mapbusico_blue_3_lv.png in Resources */, + 37CCABFF2B35AE11006F4BF8 /* mapbusico_yellow_10_lv.png in Resources */, + 37CCABFC2B35AE11006F4BF8 /* mapbusico_red_10_lv.png in Resources */, + 37CCABE02B35AE11006F4BF8 /* route_pattern_long_dot.png in Resources */, + 37CCABD12B35AE11006F4BF8 /* Sharemap_marker_me_badge_normal.png in Resources */, + 37CCAC172B35AE12006F4BF8 /* 6.txt in Resources */, + 37CCAC2A2B35AE12006F4BF8 /* 19.txt in Resources */, + 37CCABD02B35AE11006F4BF8 /* Sharemap_marker_bad_badge_normal.png in Resources */, + 37CCABD22B35AE11006F4BF8 /* Sharemap_marker_big.png in Resources */, + 37CCABDD2B35AE11006F4BF8 /* Profile_default_03.png in Resources */, + 37CCABF92B35AE11006F4BF8 /* mapbusico_green_1_lv.png in Resources */, + 37CCABDC2B35AE11006F4BF8 /* Profile_default_02.png in Resources */, + 37CCABBC2B35AE11006F4BF8 /* tile.png in Resources */, + 37CCAC082B35AE12006F4BF8 /* mapbusico_blue_8_lv.png in Resources */, + 37CCABC02B35AE11006F4BF8 /* pin_blue.png in Resources */, + 37CCAC302B35AE12006F4BF8 /* skyview_1.png in Resources */, + 37CCAC252B35AE12006F4BF8 /* 23.txt in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift index fd3d3ecd..416ced93 100644 --- a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift +++ b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift @@ -67,4 +67,12 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { plansCoordinator.planStartFromTabBar() childCoordinators.append(plansCoordinator) } + func startWithNaviInit() { + guard let mainMapViewModel = mainMapViewModel else { return } + let mainMapViewController = MainMapViewController(viewModel: mainMapViewModel, coordinator: self) + self.navigationController.pushViewController(mainMapViewController, animated: true) + print(navigationController.viewControllers) + navigationController.setViewControllers([mainMapViewController], animated: true) + } + } diff --git a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift index dbab27e1..45bbbbc2 100644 --- a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift +++ b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift @@ -47,12 +47,7 @@ final class FindRoadViewController: KakaoMapViewController { button.backgroundColor = .green return button }() - private lazy var moveToRouteButton: UIButton = { - let button = UIButton() - button.setTitle("로드맵보기", for: .normal) - button.backgroundColor = .green - return button - }() + private let viewModel: FindRoadViewModel private let disposeBag = DisposeBag() @@ -87,19 +82,27 @@ final class FindRoadViewController: KakaoMapViewController { self?.drawWalkRoute() }) .disposed(by: disposeBag) + + } + + override func addViews() { + let defaultPosition: MapPoint = MapPoint(longitude: 126.733529, latitude: 37.3401906) + let mapviewInfo: MapviewInfo = MapviewInfo(viewName: "mapview", viewInfoName: "map", defaultPosition: defaultPosition) - moveToRouteButton.rx.tap - .subscribe(onNext: { [weak self] _ in - print("로드맵 보기") - self?.navigationController?.pushViewController(RoadViewController(), animated: true) //Test - }) - .disposed(by: disposeBag) + if mapController?.addView(mapviewInfo) == Result.OK { + print("OK") + + } + createLabelLayer() + createPoiStyle() + createPois() } + + // MARK: - Setup UI private func setupUI() { view.addSubview(infoView) - view.addSubview(moveToRouteButton) infoView.addSubview(myLocationLabel) infoView.addSubview(destinationLabel) infoView.addSubview(carRouteButton) @@ -133,11 +136,6 @@ final class FindRoadViewController: KakaoMapViewController { make.leading.equalTo(carRouteButton.snp.trailing).offset(10) make.width.equalTo(carRouteButton.snp.width) } - moveToRouteButton.snp.makeConstraints { make in - make.top.equalTo(infoView.snp.bottom).offset(10) - make.trailing.equalToSuperview().offset(10) - make.height.width.equalTo(100) - } } private func setupLocationManager() { @@ -149,7 +147,89 @@ final class FindRoadViewController: KakaoMapViewController { } +// 마커 // 37.3401906, 126.733529 +extension FindRoadViewController { + func createLabelLayer() { + let view = mapController?.getView("mapview") as? KakaoMap + let manager = view?.getLabelManager() + let layerOption = LabelLayerOptions(layerID: "PoiLayer", competitionType: .none, competitionUnit: .symbolFirst, orderType: .rank, zOrder: 10001) + let _ = manager?.addLabelLayer(option: layerOption) + } + + func createPoiStyle() { + let view = mapController?.getView("mapview") as? KakaoMap + let manager = view?.getLabelManager() + + let badge1 = PoiBadge(badgeID: "badge1", image: UIImage(named: "noti.png"), offset: CGPoint(x: 0.9, y: 0.1), zOrder: 0) + let iconStyle1 = PoiIconStyle(symbol: UIImage(named: "pin_green.png"), anchorPoint: CGPoint(x: 0.0, y: 0.5), badges: [badge1]) + let text1 = PoiTextLineStyle(textStyle: TextStyle(fontSize: 30, fontColor: UIColor.white, strokeThickness: 2, strokeColor: UIColor.green)) + let textStyle1 = PoiTextStyle(textLineStyles: [text1]) + textStyle1.textLayouts = [PoiTextLayout.center] + let poiStyle1 = PoiStyle(styleID: "customStyle1", styles: [ + PerLevelPoiStyle(iconStyle: iconStyle1, textStyle: textStyle1, level: 0) + ]) + + let badge2 = PoiBadge(badgeID: "badge2", image: UIImage(named: "noti2.png"), offset: CGPoint(x: 0.9, y: 0.1), zOrder: 0) + let iconStyle2 = PoiIconStyle(symbol: UIImage(named: "pin_red.png"), anchorPoint: CGPoint(x: 0.0, y: 0.5), badges: [badge2]) + let text2 = PoiTextLineStyle(textStyle: TextStyle(fontSize: 30, fontColor: UIColor.white, strokeThickness: 2, strokeColor: UIColor.red)) + let textStyle2 = PoiTextStyle(textLineStyles: [text2]) + textStyle2.textLayouts = [PoiTextLayout.center] + let poiStyle2 = PoiStyle(styleID: "customStyle2", styles: [ + PerLevelPoiStyle(iconStyle: iconStyle2, textStyle: textStyle2, level: 0) + ]) + + manager?.addPoiStyle(poiStyle1) + manager?.addPoiStyle(poiStyle2) + } + + func createPois() { + let view = mapController?.getView("mapview") as? KakaoMap + let manager = view?.getLabelManager() + let layer = manager?.getLabelLayer(layerID: "PoiLayer") + let poiOption = PoiOptions(styleID: "customStyle1", poiID: "poi1") + poiOption.rank = 0 + poiOption.addText(PoiText(text: "출발", styleIndex: 0)) + + let poi1 = layer?.addPoi(option: poiOption, at: MapPoint(longitude: 126.7335, latitude: 37.3402)) + poi1?.show() + } +} +// MARK: 마커 +extension FindRoadViewController { + +// func createLabelLayer() { +// let view = mapController?.getView("mapview") as? KakaoMap +// let manager = view?.getLabelManager() +// let layerOption = LabelLayerOptions(layerID: "PoiLayer", competitionType: .none, competitionUnit: .symbolFirst, orderType: .rank, zOrder: 10001) +// let _ = manager?.addLabelLayer(option: layerOption) +// } + // func createPoiStyle() { + // let view = mapController?.getView("mapview") as? KakaoMap + // let manager = view?.getLabelManager() + // let iconStyle = PoiIconStyle(symbol: UIImage(named: "pin_green.png"), anchorPoint: CGPoint(x: 0.0, y: 0.5)) + // let perLevelStyle = PerLevelPoiStyle(iconStyle: iconStyle, level: 0) + // let poiStyle = PoiStyle(styleID: "customStyle1", styles: [perLevelStyle]) + // manager?.addPoiStyle(poiStyle) + // } + // + // func createPois() { + // let view = mapController?.getView("mapview") as? KakaoMap + // let manager = view?.getLabelManager() + // let layer = manager?.getLabelLayer(layerID: "PoiLayer") + // let poiOption = PoiOptions(styleID: "customStyle1") + // poiOption.rank = 0 + // + // let poi1 = layer?.addPoi(option:poiOption, at: MapPoint(longitude: 126.733529, latitude: 37.3401906)) + // // PoiBadge를 생성하여 POI에 추가한다. + // let badge = PoiBadge(badgeID: "noti", image: UIImage(named: "noti.png"), offset: CGPoint(x: 0.1, y: 0.1), zOrder: 1) + // poi1?.addBadge(badge) + // poi1?.show() + // poi1?.showBadge(badgeID: "noti") + // } + // + // +} extension FindRoadViewController { // 경로 레이어 제거 함수 @@ -184,6 +264,7 @@ extension FindRoadViewController { let route = layer?.addRoute(option: options) route?.show() } + /// MARK: 보도 경로 그리기 private func drawWalkRoute() { removeRouteLayer(layerID: "CarRouteLayer") diff --git a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift index 09b25af6..9e76d474 100644 --- a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift +++ b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift @@ -46,9 +46,10 @@ final class DefaultPlansFromAlertCoordinator: PlanFromAlertCoordinator { func moveToMain() { childCoordinators.removeAll() let mainMapCoordinator = DefaultMainMapCoordinator(navigationController: navigationController) - mainMapCoordinator.start() + mainMapCoordinator.startWithNaviInit() + childCoordinators.append(mainMapCoordinator) - //navigationController.popToRootViewController(animated: true) + } } diff --git a/TWTW/TWTW/Resources/cctv.png b/TWTW/TWTW/Resources/cctv.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbe1c46786501e8ca8764fa4efeeca5563f25a0 GIT binary patch literal 4207 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 IY;z#?FHaFQ&j0`b literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/hillShading.png b/TWTW/TWTW/Resources/hillShading.png new file mode 100644 index 0000000000000000000000000000000000000000..fffe6bc54c73239214e7ee4871195dfd8e14e2ba GIT binary patch literal 6199 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 V5X3li9?Ad!002ovPDHLkV1ign$4~$O literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/kyounggi-lod.tsv b/TWTW/TWTW/Resources/kyounggi-lod.tsv new file mode 100644 index 00000000..67bc499b --- /dev/null +++ b/TWTW/TWTW/Resources/kyounggi-lod.tsv @@ -0,0 +1,1096 @@ +1 +6 + 14095612.720573923 4464199.205176805 + 14095632.905818352 4463842.198117705 + 14096661.043345636 4463508.878846089 + 14095239.596157761 4461378.511788499 + 14094962.841654122 4463317.279650585 + 14095612.720573923 4464199.205176805 +1 +8 + 14069466.818744972 4455213.686626673 + 14069703.045888975 4455283.137455444 + 14070224.140693227 4454796.439545403 + 14070290.778982764 4453295.774585837 + 14069935.98489844 4452885.154441744 + 14068571.3367612 4453479.441657688 + 14068540.615846712 4455025.383314672 + 14069466.818744972 4455213.686626673 +5 +967 + 14086837.898720048 4531876.366717851 + 14086694.691248307 4532000.886783979 + 14086590.836528307 4532018.0903199995 + 14086292.737715522 4532272.317018879 + 14086384.01164842 4532662.537439446 + 14084871.1717124 4533408.734633885 + 14085637.511059886 4535194.79500482 + 14085309.417671671 4537753.082781827 + 14084303.032006083 4539121.7666616775 + 14085310.827965107 4543881.072928824 + 14083936.619841645 4545954.416704794 + 14084480.350865569 4546839.371687411 + 14083814.389197681 4547130.34406823 + 14084452.464565713 4549816.524009248 + 14088003.661805172 4548059.074603918 + 14090303.829050815 4545958.871368035 + 14092355.353161113 4545740.708567562 + 14093952.721354982 4546501.850935175 + 14095887.610367075 4548272.185139806 + 14100018.769975754 4548491.331626867 + 14100990.420050254 4556111.884750225 + 14099651.328847907 4556890.521937962 + 14099831.005820464 4557364.114503072 + 14101905.720149891 4557697.834061066 + 14101937.788731478 4558625.673114854 + 14103306.14635129 4560864.5452347025 + 14102328.926663343 4561649.815730678 + 14101965.812686145 4561134.121920597 + 14101127.993788308 4561095.002472357 + 14101600.28574873 4561551.1020949865 + 14101067.512668893 4562212.828793383 + 14102180.134035666 4562457.127699002 + 14101810.572732532 4562710.385970346 + 14101921.091454485 4563145.9744585715 + 14101120.51107689 4562799.908074918 + 14101335.29812734 4563327.909923882 + 14100855.031268355 4563619.665527444 + 14101658.003457822 4564997.273068262 + 14101448.63880881 4566233.99275009 + 14102274.988997558 4567299.810607899 + 14101164.707088063 4567238.0801525945 + 14100394.17976877 4567998.118975517 + 14100950.1062865 4573095.857497809 + 14101601.203308964 4572878.133252942 + 14102097.5227582 4573509.181073198 + 14102766.463202957 4573380.986086014 + 14103059.720988162 4573919.722810415 + 14103541.268336313 4573582.078285593 + 14103632.489794355 4574123.821814029 + 14104074.722921085 4574125.266137308 + 14104146.059300805 4573161.504826904 + 14105652.378901238 4573591.40287537 + 14108444.17307124 4575080.255545611 + 14110010.814188989 4576863.968018095 + 14110707.545386612 4577117.637792659 + 14110811.298352972 4576489.709106725 + 14117058.96281388 4581086.722205195 + 14118742.890405316 4583717.359856969 + 14120637.137084339 4585175.223636811 + 14121636.169414926 4587949.895359363 + 14121177.019191222 4587949.16727588 + 14121678.901563298 4588112.635483035 + 14123213.630818753 4593301.336898668 + 14123923.109258309 4594208.483076252 + 14125369.130569147 4594844.270775989 + 14129896.936156496 4598825.667418483 + 14132496.046028698 4599276.786492012 + 14133319.69888282 4599793.10806619 + 14133720.008967085 4600630.320659299 + 14132182.295908911 4601744.292764392 + 14132044.673998086 4602324.435128291 + 14133436.285847412 4605197.717394332 + 14133408.253076214 4606407.806070436 + 14134564.053380538 4608554.356435389 + 14137737.099311985 4611589.087387639 + 14139097.735543812 4613928.503379054 + 14140582.436803339 4615378.086492675 + 14143296.500317914 4616801.28024697 + 14147995.785523845 4620869.355299715 + 14148162.019864528 4619238.320915799 + 14149112.616207335 4619166.048018823 + 14148890.526019089 4618172.889319158 + 14149943.490918014 4617794.216711183 + 14149608.225060595 4617413.179476937 + 14149605.553090848 4615979.283672944 + 14149809.025074204 4613646.441590084 + 14150218.949671488 4612935.25480593 + 14152112.860046973 4612356.605966208 + 14152600.55690234 4612889.147630457 + 14153495.130122561 4612913.620203381 + 14154129.671511047 4613758.114738579 + 14155753.060263539 4613170.226360976 + 14155440.925388966 4610422.535780561 + 14156629.92202466 4609630.9379205145 + 14157073.148489365 4608506.496028274 + 14156472.522280063 4607379.205660517 + 14157674.421277473 4605754.36869176 + 14158639.749569338 4606063.55077437 + 14158284.841152638 4603979.179594614 + 14158617.186013762 4602368.343868907 + 14161114.895713776 4600257.505312819 + 14161257.936498776 4599707.983151872 + 14162293.020220546 4598858.743186494 + 14162511.500769261 4600249.554289913 + 14163688.380257092 4600221.318993675 + 14164226.181317324 4601577.399367281 + 14166103.495520607 4602501.680762533 + 14166387.785891863 4603403.948754176 + 14167017.108189985 4603716.028358602 + 14167189.375426535 4604918.212232216 + 14169142.764889866 4605288.528338668 + 14169754.145533485 4604523.670404639 + 14170742.32960913 4604213.423686962 + 14169656.789075453 4603191.590582399 + 14169234.11580204 4600156.0875578355 + 14168221.495203244 4598649.57828862 + 14168448.046890438 4597207.595274604 + 14168967.859386059 4597009.640899925 + 14169051.018482203 4595894.764303857 + 14169422.164644754 4595583.900433866 + 14169699.089210324 4595882.785144604 + 14170141.363481512 4595563.41116216 + 14171498.303125476 4595745.39396688 + 14172044.612765115 4596150.037361587 + 14172792.325370645 4593366.467374576 + 14173276.071138537 4592808.960830872 + 14175166.561892636 4592174.432735041 + 14175382.421108952 4593752.829782741 + 14176329.690121131 4594299.053543448 + 14178319.152826011 4594546.633542042 + 14179722.38979992 4596169.387064222 + 14180354.111058807 4595587.911562885 + 14182484.528287267 4595399.9804737475 + 14182592.958883628 4594543.45303855 + 14183586.463654162 4593849.60790543 + 14185516.848357335 4595757.8950803885 + 14185833.093473723 4595120.685508292 + 14186606.270602737 4594811.586945256 + 14187131.118323427 4593204.172048634 + 14187066.13349475 4587517.986248 + 14187249.445448682 4586666.128550984 + 14187992.561661702 4586093.7834355915 + 14187878.288350247 4584316.712386016 + 14188953.801172482 4581242.896408188 + 14190068.535933454 4580337.6508051725 + 14192945.57086077 4579950.525948042 + 14193671.698569376 4579136.68498583 + 14194226.248606948 4579611.022899346 + 14197697.682059307 4579507.541912903 + 14198553.960149048 4576372.84138288 + 14198166.602234857 4574880.7251412505 + 14199901.77418666 4574183.319389647 + 14201636.837713782 4574299.796381909 + 14204532.03107893 4573180.509571479 + 14204648.02606833 4572069.177886324 + 14205783.163705312 4571029.113808573 + 14206237.0424828 4569416.6869888585 + 14205717.686884917 4568260.847380968 + 14206305.906774376 4566519.931624275 + 14205294.957633352 4564192.713160112 + 14205016.697074607 4561992.239027868 + 14204724.557550943 4561669.801821914 + 14202650.789062347 4561956.229127685 + 14201533.759443222 4561403.443786443 + 14200275.648799326 4559081.840058076 + 14199623.365202105 4559123.646026249 + 14198852.029900786 4558546.734101112 + 14198761.072594395 4557764.095638428 + 14197357.326303357 4557555.358883404 + 14196086.912576592 4555850.39559968 + 14196084.568102358 4554445.583451221 + 14197112.118747516 4553734.814021581 + 14197390.502017356 4552675.721641443 + 14195557.786046874 4550173.168770117 + 14197790.090535887 4547122.450502517 + 14198222.492759448 4545586.904640581 + 14197041.982026024 4543983.654717134 + 14194494.156606112 4542261.7940583145 + 14194021.470427586 4541507.374250887 + 14194023.787195275 4540013.16136669 + 14194552.23167879 4539318.434291474 + 14196263.646721812 4540912.542489553 + 14197706.96670678 4539870.071920454 + 14199180.937203538 4541184.303638273 + 14200136.02219645 4541084.721849047 + 14199760.463812402 4537981.2078304235 + 14198873.858168405 4535302.744104847 + 14198697.89341788 4532711.699501171 + 14199117.697887786 4531711.098780432 + 14198384.29833675 4531194.206831911 + 14198125.708162438 4530327.541567753 + 14197210.878816936 4530186.49553412 + 14197212.169967165 4529390.549104644 + 14198494.936828263 4528371.668328317 + 14198608.083736895 4527738.538119971 + 14199851.081626683 4527076.15234254 + 14200435.2828378 4527732.074843652 + 14202206.120340304 4527772.976271093 + 14202681.749878125 4529017.652251934 + 14204236.490464633 4529661.993456732 + 14204606.835598411 4530317.978075583 + 14205102.37379848 4530214.352564968 + 14205792.124327492 4529482.690198574 + 14206365.157773415 4529541.746010752 + 14206768.617067486 4528633.314958603 + 14207305.555075353 4529130.355753129 + 14208195.47704707 4528657.42722034 + 14208104.128841303 4528053.943672271 + 14209597.21946354 4527673.395226729 + 14210105.062229868 4526295.277519125 + 14211430.277605057 4526452.322174363 + 14211885.796726266 4525497.6684315745 + 14215068.91243291 4523190.020318896 + 14215591.969506558 4522526.830921101 + 14215212.962914001 4521926.927570253 + 14216370.426821794 4521162.925265157 + 14217783.00947633 4521769.890076477 + 14220479.436869266 4521377.1989119435 + 14221523.051571103 4521962.6326103555 + 14222908.598246593 4520650.941500936 + 14224898.33666231 4520010.58331728 + 14225971.904497791 4521000.735695248 + 14227708.42060001 4519345.3294450315 + 14228203.506699309 4518036.198232358 + 14230678.77982093 4517511.064820259 + 14231982.104692206 4516372.651008812 + 14231312.291381825 4514490.703788406 + 14229773.101524318 4514168.16892064 + 14227697.397891698 4514345.383654908 + 14227353.370322255 4513407.641409858 + 14226222.662367348 4513041.727466532 + 14226231.005244555 4512269.626724217 + 14225011.52849348 4510895.689515391 + 14224529.100600066 4510862.082139904 + 14223492.2067663 4509757.561171054 + 14222167.965385428 4509491.057590698 + 14222154.747727403 4507980.182234035 + 14223816.71355691 4507875.006936122 + 14225468.581619175 4505504.046344321 + 14226687.806331249 4505008.048734761 + 14226217.031908376 4503848.171711385 + 14226453.565419562 4500974.79901535 + 14227078.175523337 4499084.5350283915 + 14226026.65402412 4498420.970349065 + 14225275.162148884 4495160.67152081 + 14224592.314626986 4494033.461033147 + 14224860.042093838 4493445.654398188 + 14224030.366816264 4492677.017040516 + 14224292.33560909 4490893.839364852 + 14222488.045357363 4490798.798158692 + 14222129.44163787 4490400.860637748 + 14222274.155410202 4488376.54925346 + 14221943.474449974 4487494.240772334 + 14222508.271995781 4485824.798828878 + 14222000.229549602 4485321.814383392 + 14223100.19789949 4482313.162967081 + 14223090.295565533 4481218.5959304115 + 14222389.906638913 4481302.348122057 + 14221053.281299103 4480599.941984783 + 14222253.416724315 4476677.439104223 + 14220717.383726737 4472608.969193246 + 14220800.54753898 4469050.519717481 + 14219425.467650762 4468143.945111854 + 14218439.477090003 4464582.999269109 + 14217464.28241332 4464761.282892208 + 14216654.661009137 4463629.775706076 + 14216043.523263654 4462483.926760322 + 14215974.219001569 4461105.600471909 + 14214964.709472816 4460208.819960442 + 14214996.521454731 4458697.622585653 + 14214229.422235083 4458012.111847465 + 14212182.235423476 4458092.13027894 + 14210553.216614595 4458970.445353489 + 14210637.263583528 4459321.035210559 + 14209722.485873215 4460117.730910669 + 14207521.250168629 4460773.0733399065 + 14207423.68593001 4460277.0743364105 + 14208575.91425266 4458794.926162025 + 14208095.389170501 4455887.9634337295 + 14208429.44969455 4455194.339981381 + 14208201.507291514 4452977.324516917 + 14205889.041475551 4451183.031403575 + 14204414.551144855 4451302.364880855 + 14204319.747428656 4450483.344661076 + 14204919.872986095 4449721.259379128 + 14204944.308088996 4448711.565874695 + 14203952.171892595 4449386.140904325 + 14201923.858444756 4449614.962930862 + 14200467.365141017 4447548.023528819 + 14200977.093191974 4445823.684026635 + 14199562.712028263 4444857.61228465 + 14196795.217016602 4446866.205888767 + 14195786.340873944 4446833.560979127 + 14195253.177918024 4447246.829472594 + 14193741.556559153 4445800.200533172 + 14192863.262625864 4445816.856773673 + 14191695.534439752 4446706.692252622 + 14189698.91305639 4446565.503865501 + 14189713.400854977 4446132.747166488 + 14188482.411419068 4444952.662854712 + 14188774.723742243 4444417.866906315 + 14188364.886189952 4443337.200416739 + 14188719.922584042 4442947.057074233 + 14188599.709820203 4441964.0845225975 + 14187637.552401088 4441665.34850269 + 14187346.973772403 4440615.869861512 + 14186643.903917838 4440786.379014336 + 14185393.930397758 4439281.734296818 + 14184454.122191036 4439656.023822925 + 14183659.461908108 4439010.508374523 + 14182070.856921926 4439037.487790497 + 14181290.453676103 4438648.489255633 + 14180461.262929158 4436865.507672882 + 14182327.040440328 4434652.559397504 + 14181850.50347302 4434181.17792286 + 14180708.398381952 4434121.103493862 + 14180437.842958521 4433427.4425536515 + 14179849.81564826 4433330.009777203 + 14179414.908389686 4431943.736628928 + 14178474.000571735 4432169.285482678 + 14177378.96377747 4431820.687647925 + 14176976.393227194 4432514.868312376 + 14176525.79723536 4432535.073688359 + 14175796.097241566 4431902.809032635 + 14175641.249123508 4431183.287192354 + 14173983.68114023 4430194.9947978025 + 14172794.817143459 4429992.766514224 + 14172009.39659224 4429239.996106719 + 14170538.281644657 4429261.131109637 + 14171418.499064384 4427266.290816256 + 14169894.257714074 4424388.638009344 + 14169400.698727513 4424411.668473178 + 14168652.9290192 4425234.492889878 + 14167977.50708451 4427125.641960766 + 14166343.763204094 4427382.420256127 + 14165755.200230883 4428301.28218117 + 14164710.655729022 4427601.893237312 + 14163841.290309139 4428510.925739649 + 14163019.425358329 4428580.363924983 + 14162094.26496798 4429398.3402773375 + 14160990.698834207 4429420.959135459 + 14161126.746463053 4430441.987669539 + 14160479.467731178 4431014.515071448 + 14160290.323729146 4432152.875825485 + 14157676.006597925 4433067.689522892 + 14157413.810667709 4433883.523776884 + 14156004.90458907 4433758.996845723 + 14154879.75391442 4434146.342973301 + 14155264.315689072 4434911.449949725 + 14153596.465294706 4435079.20656223 + 14152725.282766167 4434650.183127092 + 14152728.289738862 4434308.436613459 + 14151086.533350646 4434684.718371145 + 14151047.074374476 4435072.128424067 + 14150181.759384291 4435349.986827957 + 14148308.355210647 4433448.030995611 + 14148305.918418374 4432937.336554054 + 14149040.739041379 4432569.621392914 + 14148198.005826743 4431054.040842207 + 14147171.769932877 4431824.517629757 + 14145821.848292738 4430555.511272999 + 14144865.311788302 4431015.092776218 + 14141029.238345763 4429088.9235276645 + 14140001.526983764 4429461.766777297 + 14139894.157228269 4429994.772404954 + 14137038.928852329 4430097.641043263 + 14134652.670815377 4428778.022107259 + 14130747.586724108 4427588.567311574 + 14127518.005452275 4425399.291960543 + 14127023.760150062 4428612.3659031205 + 14126054.812768517 4429854.836523265 + 14123748.98195305 4431064.168908795 + 14122089.655904848 4432507.839570823 + 14120832.899090402 4431647.763778722 + 14120464.95795466 4432878.451624161 + 14118560.667753365 4431799.95228007 + 14117659.394466206 4433403.576221724 + 14117749.050892608 4434035.354622876 + 14118011.427852262 4434183.958424935 + 14117711.651167786 4434706.725218502 + 14118033.489678122 4434167.238732523 + 14117668.447769785 4433411.095986743 + 14118174.631196612 4432509.262105668 + 14118773.95969069 4432848.541113567 + 14118978.763842572 4432050.064488061 + 14120459.34259399 4432888.25856554 + 14118133.780383097 4436545.217370493 + 14118466.288474992 4436733.607369053 + 14118213.959355487 4437178.000721759 + 14117973.358046088 4436945.064039361 + 14118384.213243289 4437404.995383043 + 14117627.589531984 4436982.443791827 + 14116747.499043494 4437341.031446778 + 14117595.15469392 4437097.973290575 + 14117913.441034129 4437888.897557888 + 14116650.800783098 4438423.282938931 + 14116405.093195105 4437480.707184659 + 14115466.115561416 4437863.140162776 + 14115771.342200167 4437749.331918291 + 14116360.616268164 4438541.357195539 + 14115077.280006364 4438701.324642072 + 14115121.713628741 4438025.415129951 + 14114990.677395133 4438751.706060196 + 14114161.107539807 4438357.606514098 + 14113209.475549083 4439426.995939317 + 14112974.883137763 4440116.32151477 + 14113904.44585279 4440905.828788488 + 14115028.806578834 4441073.512685116 + 14114702.855407383 4442802.910401851 + 14114104.223866023 4443267.072157544 + 14111689.029944796 4443290.862512124 + 14111297.670902245 4442893.592595705 + 14111264.456795154 4443254.608398683 + 14109808.603952551 4443250.800190039 + 14109606.848201822 4444160.765799733 + 14109496.378930189 4443748.535187856 + 14108929.74749052 4443179.576109736 + 14109461.502881287 4444030.148008044 + 14109248.361139785 4444725.775134528 + 14109615.917398117 4445915.170615621 + 14110489.173489105 4446839.432112962 + 14107913.074698072 4449353.583748676 + 14107560.197667988 4449123.014451914 + 14107793.261117129 4449470.11189773 + 14102370.209662 4455071.178504673 + 14101414.257050784 4455262.495738396 + 14102020.85588559 4455211.945386637 + 14101909.81568598 4455568.695499241 + 14101333.987449003 4455458.549127357 + 14102477.956819631 4455735.246611708 + 14102102.241215393 4457206.553438409 + 14101700.251014179 4457289.175855103 + 14101829.499886021 4457825.846028235 + 14101277.961971203 4458244.696128995 + 14101931.179930305 4459078.417558891 + 14100394.826313443 4458976.688788462 + 14100038.343043394 4458610.114224798 + 14100378.948565794 4458990.008572929 + 14101835.72276024 4459110.057901123 + 14102495.361468079 4460036.080384693 + 14103834.472173555 4460125.740828279 + 14103212.7178377 4461017.618668992 + 14102223.38350578 4461498.378945912 + 14100805.590615949 4460875.365924663 + 14100035.616688743 4460963.172390715 + 14099745.635655593 4460692.661903045 + 14099474.635983264 4460566.757315309 + 14099305.74296658 4460218.0600423375 + 14098967.875960188 4459631.228001136 + 14098613.51528255 4459373.11129803 + 14099472.622688657 4460579.523845083 + 14099727.21850155 4460698.504377677 + 14098589.614730796 4460666.786660586 + 14099836.024135433 4461747.34946253 + 14099179.994702352 4463528.533174366 + 14100304.166048275 4464555.8452420095 + 14100347.42798872 4465395.691070375 + 14100839.692599222 4465511.69615118 + 14100295.80313958 4465915.627198958 + 14098567.673102045 4464674.172962895 + 14098656.19272838 4464901.75535893 + 14098477.99535432 4465038.4240775015 + 14098463.310254749 4465151.341672304 + 14098485.65112983 4465042.909654333 + 14098628.307745093 4464933.416387469 + 14099231.57196246 4465693.10331876 + 14098307.160993068 4465922.85046285 + 14098119.302382778 4465579.342521676 + 14097710.039700251 4467632.022062423 + 14098027.800367478 4467858.865311572 + 14098480.363103013 4467433.615605057 + 14098367.632804286 4466139.269733719 + 14099117.842014262 4468562.604451172 + 14098823.422995564 4468040.363336202 + 14098764.806911044 4468017.477249384 + 14098638.781624034 4468023.519777169 + 14098565.338724671 4467940.92125717 + 14098404.886631828 4467907.855237649 + 14098327.605238292 4467951.025980211 + 14098144.623406636 4467843.090897112 + 14098326.945862753 4467966.463319079 + 14098393.740796816 4467920.797380426 + 14098557.740385715 4467954.242134628 + 14098636.779985182 4468039.2040160075 + 14098799.451993069 4468044.878918934 + 14098737.030097151 4468093.887422224 + 14098616.834410643 4468054.640253447 + 14098543.663202886 4467966.701336948 + 14098196.036466379 4467990.678738737 + 14098269.893689318 4468546.662119521 + 14097220.230493134 4469354.195619846 + 14095945.30835347 4469585.944906835 + 14095757.98631798 4471983.924873185 + 14095378.549913265 4472049.231067351 + 14095151.07014743 4471151.316185919 + 14094259.544857709 4471763.399324893 + 14094135.953172129 4471136.297809506 + 14093339.483034683 4471276.748920881 + 14093079.168221457 4470960.575998789 + 14092526.469821347 4471486.422141456 + 14092680.998679377 4471813.0133220265 + 14092146.661450405 4471727.92152218 + 14092232.185157513 4472059.375032963 + 14091973.419081861 4471697.966640307 + 14091301.200399384 4471869.3748610495 + 14094149.704388017 4469890.98557217 + 14094612.874451296 4468104.567590059 + 14093283.91569064 4469038.407020063 + 14092992.542121125 4468723.1791951265 + 14093391.688806824 4469281.443606299 + 14093198.97170033 4470017.330021054 + 14093245.049391251 4469424.3495236505 + 14092013.78802167 4468910.462319411 + 14091570.913937679 4469900.575715257 + 14090451.76132215 4470092.22154202 + 14089509.367953228 4467677.400936757 + 14089637.80772145 4466958.897762857 + 14088871.088657478 4466078.023991343 + 14088509.431679687 4467021.80000441 + 14087403.400419032 4467807.48077819 + 14086664.620359471 4467837.388327391 + 14086195.41329245 4466792.886807563 + 14085673.526406514 4466894.1768443035 + 14086336.594679145 4468014.881267324 + 14086097.700116187 4468168.082194943 + 14086927.138605691 4467885.744979381 + 14086514.252043769 4469068.208940799 + 14087894.394482486 4469041.77379124 + 14088279.505742801 4469529.403601521 + 14087451.059659418 4470323.663424243 + 14087253.620138276 4469996.789738097 + 14086674.08005414 4469349.939145681 + 14087202.388742212 4469974.702441874 + 14086867.991959864 4470459.627217017 + 14086476.471985778 4470327.329186914 + 14086431.262653945 4471047.602222248 + 14086890.947650068 4471209.848502058 + 14086510.19917508 4471729.222069921 + 14089626.33557532 4472170.505188695 + 14088393.237160793 4473738.045204254 + 14088996.70948543 4474798.080687761 + 14088506.73789275 4475069.085963244 + 14088233.079603499 4474781.209407521 + 14088518.375107013 4475687.807826982 + 14088059.952369794 4477036.056113003 + 14087445.425734373 4477427.813220547 + 14087297.040525416 4478209.716896844 + 14086423.692175321 4478442.497765207 + 14086244.927805316 4479065.1857628 + 14085526.430560121 4479452.7729598675 + 14087700.24096178 4478400.291144518 + 14088163.908584045 4478651.130821974 + 14088119.199628204 4477681.373694266 + 14088794.606042802 4477835.674705186 + 14089493.481977027 4478375.905052049 + 14089504.565938752 4478646.471614674 + 14089280.55108067 4478624.07441034 + 14089228.237003494 4478762.8312613405 + 14090524.787357004 4479657.536251846 + 14090229.508656155 4480351.988249113 + 14089906.49766497 4480552.700893464 + 14089901.612859424 4480689.30615012 + 14090580.807389313 4480040.174134361 + 14090589.813811257 4480449.156101491 + 14090871.174855284 4480288.80583696 + 14093569.801309802 4482267.224927535 + 14093748.078702308 4482816.4156858325 + 14095461.103441754 4483237.153568542 + 14090599.91316037 4479996.76309246 + 14091126.904768296 4479670.286504893 + 14089744.626233038 4478326.038243835 + 14089557.242324708 4476989.514365019 + 14090133.338265242 4477598.805028333 + 14090566.501795534 4477458.42042308 + 14092324.946209343 4475710.4038096545 + 14093985.446456268 4475808.482554328 + 14094104.720709598 4475356.255426745 + 14094881.196516974 4475134.190486991 + 14094598.5703455 4473973.870104696 + 14095357.311512046 4473793.695121796 + 14095182.888146712 4473375.208389946 + 14095681.725758662 4472941.097596564 + 14095460.207963692 4472164.26361293 + 14098644.60352292 4470528.491519358 + 14098328.86802566 4468553.981789676 + 14098589.710481329 4468220.095445438 + 14098802.723605389 4468862.666664271 + 14099120.226827845 4468586.114341632 + 14099031.19370292 4470447.499233597 + 14097627.321007632 4472850.964512942 + 14097542.1270083 4473057.81260216 + 14097331.773661401 4473759.28190423 + 14097156.611060863 4473882.393673989 + 14096814.567048278 4473804.289896373 + 14096749.56193581 4473823.566909439 + 14096697.43850926 4473882.6489634635 + 14096615.264288602 4474151.530259198 + 14097316.292325553 4473804.886493935 + 14097183.645334342 4474325.557999874 + 14097613.389032658 4472912.131913572 + 14098806.861685183 4471078.784674377 + 14098985.43481347 4470667.407596678 + 14099091.130343797 4470208.677484422 + 14099136.301378354 4468586.866140082 + 14099007.016865045 4467750.571290372 + 14098549.453854483 4466353.717583498 + 14098298.660879377 4465976.202971479 + 14099343.709486881 4465738.894205643 + 14099786.30786871 4466508.526270981 + 14101180.823354699 4466128.541827187 + 14102333.118723424 4467164.275951633 + 14103483.142569464 4467460.594843936 + 14103369.745366994 4467923.693373094 + 14104085.33206467 4468955.774072169 + 14103194.894416708 4469188.910866322 + 14102883.93708927 4468091.6640704805 + 14102407.650684122 4468341.882489004 + 14101842.420947904 4468051.279990412 + 14101294.237111287 4466980.7818386005 + 14100353.688720845 4468653.315912082 + 14100511.186019573 4469525.168569539 + 14101667.029175164 4470337.459412375 + 14101211.38671628 4471145.448467414 + 14100561.393629303 4471152.682505992 + 14100265.779195365 4471652.109299202 + 14099985.044446606 4473348.317383177 + 14100694.27145937 4472899.448016636 + 14101251.560588624 4473106.354536656 + 14102821.138110815 4475724.166110326 + 14105971.955901053 4474680.455334442 + 14107036.35581185 4474925.062579826 + 14107933.507036807 4473922.57556946 + 14108713.474227507 4474626.435742549 + 14110555.617900006 4474550.344494117 + 14110604.978885567 4473858.898078642 + 14111267.935959792 4473891.222594279 + 14111238.091842448 4473271.34938797 + 14111606.070635034 4473306.274583356 + 14111592.701153135 4472545.062968103 + 14111210.487548627 4472549.032376908 + 14110532.786065413 4471940.762981299 + 14111575.774520462 4472265.521157702 + 14111613.80880467 4471467.585028566 + 14111315.4418309 4471014.345497218 + 14111382.9756672 4470823.960481257 + 14111707.017907213 4471325.066702202 + 14111639.776234768 4473714.400417815 + 14112462.770384686 4473720.710872165 + 14112685.414712563 4472121.955780647 + 14113257.3518723 4471235.5007867925 + 14112214.57969667 4469895.182516345 + 14111527.0398564 4469964.672187641 + 14112288.686023643 4469541.502358042 + 14112351.085219096 4468460.481190442 + 14110891.211377477 4468733.659334446 + 14112395.72587196 4468416.09488375 + 14112349.318743926 4468037.059642003 + 14112522.36763006 4468389.57906585 + 14112471.043754106 4469579.150062732 + 14112941.715339098 4469456.712750455 + 14112582.555845832 4469832.054396185 + 14113492.29983716 4470689.617566523 + 14113824.9110256 4471627.8745003715 + 14112894.712897586 4472488.649035711 + 14112890.363689577 4473387.823550732 + 14114149.781908803 4473190.196978391 + 14114009.701568166 4474737.182231627 + 14114573.122973405 4475304.413343983 + 14114234.293600686 4476412.358347088 + 14114897.731064254 4476910.115169685 + 14116560.5004715 4476476.671257832 + 14115342.881426465 4477922.823601273 + 14115860.199837474 4478734.073933769 + 14115854.214198055 4480095.148911251 + 14117282.496578515 4479858.828860161 + 14118401.454974622 4477822.203232852 + 14119427.452778773 4477694.184320995 + 14120845.063939696 4474879.280930247 + 14120859.833174964 4476248.640236243 + 14121823.461890012 4476783.847213403 + 14122074.24349962 4476259.107013419 + 14122597.641799303 4476125.030050625 + 14122550.639359126 4475980.690147987 + 14122818.16388574 4475354.565430872 + 14123198.183848493 4475221.807902684 + 14123550.71322243 4475442.387774781 + 14123949.435209716 4475123.612889491 + 14124459.3767447 4474929.7572627375 + 14123608.401343359 4475514.357062331 + 14122824.756716544 4475427.749749515 + 14122595.67928732 4476342.226460511 + 14122188.35123568 4476310.329283131 + 14121987.580656463 4477006.124992991 + 14121651.723165823 4477020.338290542 + 14121705.37361675 4477181.353332049 + 14122417.592924492 4477117.763268059 + 14123604.184492847 4477537.14158729 + 14123694.726604374 4477843.503700759 + 14122469.420624644 4477208.241196638 + 14121778.828141727 4477386.911931414 + 14120578.227334075 4476590.32645484 + 14119775.968506547 4477586.367965319 + 14118496.1910689 4478115.830666804 + 14117880.983329395 4479571.768472681 + 14116899.187458018 4480305.192609706 + 14117229.1656234 4480723.7726862645 + 14115894.813564446 4480938.313673519 + 14115452.146974001 4480392.806035458 + 14114127.663433213 4480083.89266318 + 14112592.88872965 4480635.265245004 + 14112469.628999883 4480328.09132371 + 14112569.252461584 4480643.744627341 + 14107783.046800615 4482317.618804889 + 14103328.261521908 4485771.341498823 + 14095466.748933746 4483242.3383897105 + 14103208.162269672 4486010.275258824 + 14103204.92114848 4486485.107070422 + 14102595.806887612 4486751.074884381 + 14102565.948780071 4487398.16838832 + 14102203.024190506 4487480.193984128 + 14102179.761732584 4487598.688942889 + 14102568.481762474 4487421.4011272965 + 14102907.18408215 4487840.267786822 + 14104344.88356368 4488072.226251038 + 14104194.633958543 4488355.223771978 + 14104546.747740146 4488184.754821376 + 14104270.474420417 4488629.322277825 + 14107578.700288774 4493050.030852907 + 14108863.051984528 4492553.68195692 + 14109262.377142865 4493282.581785217 + 14109187.46597011 4493440.910273129 + 14108852.140494287 4492821.501426833 + 14107954.60949537 4493465.767789367 + 14109071.852260979 4494779.351844993 + 14111107.860035678 4494638.615337915 + 14111193.743456261 4493732.389448403 + 14111340.817222854 4494180.130868596 + 14112775.815808143 4493870.201148209 + 14113093.549558775 4494277.164050321 + 14113611.289903415 4493745.280775207 + 14113349.3814967 4493395.380644442 + 14114149.595582156 4494375.013587862 + 14114339.64448575 4494074.1963608265 + 14114410.23390196 4494043.966798267 + 14114084.45747815 4495290.9389316235 + 14114433.944467235 4495429.526286962 + 14114072.302489182 4495542.92583969 + 14114419.888616662 4495751.455215137 + 14113754.376516394 4495414.274770646 + 14113990.64494342 4496120.925434041 + 14113744.258451257 4495435.63153444 + 14114147.998168638 4494442.8482997995 + 14113583.907510867 4493908.118682297 + 14113100.9912382 4494341.462285458 + 14111580.58731155 4494303.558444489 + 14111286.941039653 4494916.518787943 + 14109803.64619557 4495103.050278296 + 14109635.24607117 4495512.117725173 + 14110347.452503394 4496892.768782751 + 14110107.664238153 4498190.768768761 + 14110745.365823789 4498779.501680369 + 14111993.05644332 4498789.336440045 + 14111775.865767138 4501106.888222657 + 14113133.131233305 4502716.055504891 + 14112792.272367204 4503022.431789194 + 14112884.568621395 4505075.457257632 + 14111720.483254138 4505083.478057374 + 14110187.344982406 4506774.915830613 + 14108906.410213385 4507191.059011478 + 14108795.950549494 4510292.617579216 + 14109295.002709936 4511150.412535279 + 14110897.944101524 4511282.692539115 + 14110874.63094223 4514012.02754559 + 14111491.153571263 4516613.091346807 + 14112144.55575956 4515813.328394089 + 14114400.731432462 4515171.457704561 + 14114691.39187933 4514060.168475528 + 14115700.0483696 4515077.621940627 + 14117776.154588996 4514740.477763538 + 14117741.932740122 4513933.428628104 + 14118519.861774893 4512752.5679809665 + 14117881.279597072 4511299.085127858 + 14118048.77287154 4510195.290558516 + 14117711.690719714 4509341.589324221 + 14116760.278401045 4508526.986044541 + 14117927.406411394 4507309.646197502 + 14117459.323566452 4506994.135429819 + 14117467.371664887 4506206.3149899235 + 14116941.811317578 4505484.902974254 + 14117275.135256322 4505269.924507498 + 14117466.930396618 4505707.436957916 + 14118845.569863636 4505895.99403505 + 14119164.983352026 4505418.828268033 + 14120315.790236514 4505309.8437406495 + 14120489.664748307 4506449.768712141 + 14121182.688471008 4506481.755354285 + 14122919.971897533 4508344.990957084 + 14123128.287646754 4507572.955276653 + 14123563.831208665 4507814.667626506 + 14123409.346160125 4507408.830025898 + 14123859.503975874 4507427.085812188 + 14123299.976492412 4506964.669706603 + 14123409.255974252 4506565.6367416615 + 14124722.503147637 4504279.804272929 + 14124522.593965812 4504036.074280521 + 14125204.665065663 4503553.392565892 + 14124822.96502109 4503437.868389458 + 14124914.34041694 4502910.186604826 + 14125290.308306852 4502342.887748872 + 14125776.31120649 4502389.916808783 + 14126776.046971548 4499783.236221976 + 14127489.856877683 4499755.417045327 + 14127811.946417022 4500413.211246222 + 14128703.21437414 4500676.775148822 + 14129604.503806455 4502046.508607251 + 14130742.558091512 4500058.457424878 + 14133718.56933408 4500640.479115902 + 14133600.048402281 4501494.596164782 + 14134745.51180584 4502636.765575701 + 14136089.159521159 4503018.383921064 + 14137215.578844192 4503683.01748756 + 14137215.178680975 4504412.467087564 + 14137984.973149145 4504492.519197619 + 14138525.033904407 4503135.005829706 + 14139190.91448357 4502692.581428818 + 14140481.887700094 4503117.111827795 + 14140862.254727203 4504174.0465736035 + 14141437.346217593 4504002.963125459 + 14141829.963049773 4501347.780375679 + 14141535.353729699 4500476.2242555395 + 14143382.77234435 4498981.200360202 + 14144886.942153009 4499071.697364174 + 14145499.071128821 4499284.630545583 + 14145583.976728894 4500891.789059632 + 14146619.746834118 4500772.922113069 + 14147365.94565948 4501299.781940367 + 14147988.17998988 4502843.701453515 + 14148606.592008866 4502890.029576053 + 14149190.873793911 4503723.846319615 + 14150588.128193352 4503229.029148411 + 14151477.18241741 4504766.416981332 + 14152134.029313192 4504505.308312865 + 14152351.770660942 4505461.789673948 + 14153552.61205299 4505374.129299443 + 14154126.626938311 4506792.705381436 + 14155219.85085902 4507582.372076575 + 14155541.197907316 4509059.643061859 + 14155133.65240404 4509477.521277367 + 14153287.334338566 4509798.046158514 + 14153553.042348545 4510807.618434684 + 14153228.546650479 4511217.743487052 + 14153765.280751737 4511285.661174315 + 14153800.712258639 4512110.389547857 + 14155739.737902109 4515346.655812105 + 14158035.263525508 4515428.105178887 + 14157834.936725313 4517592.798020088 + 14157132.25426816 4519546.157567493 + 14157294.420246964 4520430.960983936 + 14156137.540903892 4520118.745073907 + 14154156.3264904 4518638.155123648 + 14151892.155482473 4518318.822227701 + 14150413.043543909 4517014.491220164 + 14150076.001100287 4517313.239412949 + 14149256.642683102 4516951.217522315 + 14148920.282777498 4517387.255272192 + 14149185.400685372 4519061.913330084 + 14148834.57609681 4519710.7221503025 + 14150562.007412938 4522231.811024933 + 14150268.226605201 4523067.61075676 + 14150716.26231304 4523718.996516873 + 14150616.037625458 4525586.010859497 + 14149160.308298953 4526115.069112178 + 14150065.77127809 4527659.762818407 + 14150019.887140673 4529081.189373358 + 14149462.031872788 4529420.401923455 + 14148101.134794574 4529346.389884991 + 14147893.954834394 4529900.854134866 + 14147728.436216563 4531412.373105607 + 14148311.533603143 4532866.730391393 + 14147810.785066752 4534204.753779659 + 14148261.556828527 4535594.617092871 + 14147057.219445743 4535780.1461313395 + 14146603.224986592 4536588.865418921 + 14144635.566430971 4536419.837411909 + 14143342.048791515 4535136.013875226 + 14142988.788295731 4536296.906938751 + 14142574.050733281 4536063.677046666 + 14142151.50501189 4536470.86968235 + 14141188.990241893 4535985.028692735 + 14140658.731744997 4537264.640972423 + 14139291.328680426 4537336.882023793 + 14138423.662656901 4535952.974380653 + 14138539.738468964 4534944.49655296 + 14137276.00883653 4534806.190653838 + 14136704.605682198 4534270.473715825 + 14136909.334975036 4532459.785158529 + 14135310.8857878 4530948.928032173 + 14135984.336656332 4529545.422820888 + 14135911.64688785 4528320.038368309 + 14134837.714884484 4527534.809200443 + 14133101.939512173 4527254.913761405 + 14133501.17877666 4527742.831937884 + 14132800.59573291 4530498.769090381 + 14131738.24589808 4531395.603323923 + 14129128.59253171 4529552.788895729 + 14127970.094666349 4529363.606734502 + 14126978.561070882 4529987.10719377 + 14127810.089295823 4529299.688727563 + 14127689.197892973 4528114.038397085 + 14127133.390275566 4527739.951214718 + 14127233.258622482 4526173.622642751 + 14126475.824769475 4524637.506370789 + 14126414.705663005 4521657.445896381 + 14125013.921974344 4521461.259344102 + 14124840.33397499 4522226.4035803955 + 14123944.196836226 4521140.569823576 + 14123800.687358076 4520008.3275132 + 14122540.62122863 4519907.584318971 + 14121281.67279733 4519109.323419316 + 14115598.761029074 4523779.451440843 + 14114986.636397345 4522754.616781524 + 14115415.915031273 4521411.722694537 + 14114836.21348031 4520701.9278646 + 14114581.259501023 4520897.5001126295 + 14114608.990641888 4520485.209502816 + 14113869.600546317 4521046.374807459 + 14113542.915465537 4520625.73959283 + 14111695.364655497 4521441.959436592 + 14111212.329368487 4520959.648598576 + 14110635.60833655 4521010.662811792 + 14110382.806250088 4520308.740751707 + 14109943.1238098 4520203.066518977 + 14109113.607401067 4522017.957013867 + 14107032.02566095 4521926.477251021 + 14105994.863217436 4523000.892446348 + 14105918.500584947 4523607.369042876 + 14105248.447191974 4523793.106177155 + 14104697.271508787 4523430.759576467 + 14104795.57845465 4524777.762635241 + 14103978.450905513 4525578.474220115 + 14102268.0086843 4526555.830898583 + 14101110.328761892 4527827.020623344 + 14098897.37052265 4528622.872357098 + 14098292.27660816 4526938.875506 + 14097105.868457163 4526961.566096108 + 14097118.99823279 4525952.848259369 + 14096575.197899869 4525519.699263948 + 14095906.22907422 4523457.659193338 + 14094929.898846366 4523572.610253026 + 14094682.514757887 4523974.7163429465 + 14092108.029119998 4522091.983170607 + 14091961.748515991 4522621.662252491 + 14092352.634311609 4523012.830436548 + 14090988.180253292 4523099.374386338 + 14090593.054577434 4523775.72502945 + 14089996.579194974 4522918.994813391 + 14089238.746007556 4523628.3782456145 + 14088725.106170224 4523586.401679666 + 14088549.017084952 4523028.2394746225 + 14087668.015899701 4526491.47228361 + 14086595.915290035 4528293.54567932 + 14086771.464126527 4528449.506104881 + 14086837.472924022 4528630.187602212 + 14086581.331560384 4528326.8285218645 + 14086294.083987962 4528657.059035738 + 14085401.267825749 4530804.6566007575 + 14086837.898720048 4531876.366717851 +5 + 14086840.587245677 4531880.67346783 + 14086858.634649951 4531877.486427868 + 14086867.220904417 4531855.074126827 + 14086873.707521737 4531876.090024177 + 14086840.587245677 4531880.67346783 +4 + 14120257.57297613 4475729.473634635 + 14120257.758373536 4475728.757462236 + 14120258.070690237 4475727.93714689 + 14120257.57297613 4475729.473634635 +4 + 14120351.059898278 4475393.5756912725 + 14120354.978585362 4475393.79914109 + 14120361.220716616 4475394.178263405 + 14120351.059898278 4475393.5756912725 +79 + 14115199.4491623 4466252.469293048 + 14114665.661085945 4465750.654574225 + 14114813.862718876 4465085.343176786 + 14114264.00675427 4465269.823642947 + 14114728.717586601 4465028.120635429 + 14114727.003416236 4464440.6312449975 + 14114065.43063972 4463363.6726119425 + 14113487.925995871 4463627.211322751 + 14113686.862869069 4463000.358809528 + 14113053.94989377 4462872.034446465 + 14112806.910550445 4462159.258580087 + 14109430.169308381 4462491.411949647 + 14108804.695599645 4460439.719827494 + 14107609.97221935 4459943.670379185 + 14107168.802546542 4458546.084284669 + 14107266.789810244 4458537.008452234 + 14107427.84081902 4458162.356000722 + 14107234.436991867 4458468.406630194 + 14106651.42958667 4458259.100626488 + 14105712.871200368 4457218.736797012 + 14104866.459256293 4457485.56977194 + 14104389.78886907 4456508.229221395 + 14103224.44399506 4456054.75692073 + 14103328.52988305 4455257.726308099 + 14102403.59987954 4455094.032631086 + 14110500.813828003 4446917.049933563 + 14111279.730792146 4447232.5889816 + 14111397.66826066 4446959.663718659 + 14111331.379043652 4447267.270346022 + 14111974.51100656 4447483.280216627 + 14112239.248597473 4447184.8621359775 + 14112658.509216763 4447226.246799972 + 14111938.325318776 4447584.236714913 + 14111984.211599018 4447919.380235608 + 14112142.34947784 4448301.6363753965 + 14112565.613613812 4448250.538688964 + 14113242.19604932 4449004.705008858 + 14113091.622955028 4449500.227629898 + 14112505.963086942 4448349.551346335 + 14112378.40726128 4449015.492720955 + 14111919.317053398 4448086.580002211 + 14111206.506367555 4447901.132093948 + 14111182.55023368 4450292.555777492 + 14112161.426087782 4453208.952369963 + 14112121.924673103 4453962.607370156 + 14111592.237953996 4453588.444937763 + 14110667.923572022 4454648.940815334 + 14110904.228961457 4455557.034330959 + 14112701.70263522 4457552.556271966 + 14113376.339151083 4457925.804846776 + 14113889.064123895 4457188.29455004 + 14114755.153175024 4457068.553318829 + 14115463.612867875 4458409.91806472 + 14116639.499502508 4458482.468635362 + 14117167.357529635 4459091.407948621 + 14116205.928776795 4459314.597367422 + 14115492.633793026 4460529.259430381 + 14114360.396471743 4459850.661032501 + 14113255.75224011 4460344.860688352 + 14114346.49640925 4460655.135413401 + 14114096.203336641 4460746.256937346 + 14114520.172271725 4460810.117931883 + 14115068.045659797 4461758.041939757 + 14115701.534476142 4461979.932535779 + 14114909.567962015 4462140.757288305 + 14114851.741238317 4462732.513613347 + 14115101.547550209 4462872.4258425925 + 14115200.260782402 4462854.146735774 + 14115202.911901113 4462867.024517789 + 14115263.514217852 4462866.990692643 + 14115292.017420266 4462881.9989129165 + 14114454.325765122 4463281.301787362 + 14114540.305233527 4463773.243971975 + 14115143.558181321 4463950.167844444 + 14114676.428725636 4463974.47454235 + 14115143.424921924 4464195.516752797 + 14114995.464242343 4465516.309560294 + 14115383.774199838 4466485.115464241 + 14115199.4491623 4466252.469293048 +1 +11 + 14125018.204294108 4430229.338679236 + 14126358.999595864 4429351.049139391 + 14126800.707120627 4428744.377129358 + 14126854.197259314 4428630.625063821 + 14126878.56141411 4428494.522305018 + 14126850.787572455 4427332.8780424185 + 14126793.328055445 4428739.664050402 + 14125005.725474227 4430226.962271374 + 14122818.757853325 4429845.229232925 + 14122278.921839166 4432002.946808802 + 14125018.204294108 4430229.338679236 diff --git a/TWTW/TWTW/Resources/mapBtnBikeNormal@2x.png b/TWTW/TWTW/Resources/mapBtnBikeNormal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f701ed47d0c8867ce5666fea79ef77e47e6a4034 GIT binary patch literal 1748 zcmZ8h2{crD9KOa(!&oDX;%S~il%*(CUbbk8N%keOyh2&BJwh@)d6uzLwy{i; zvW6B}ve!hOJzmxnHF(}%|MTWJ{m!|+`~AP~`z`0*dv3G|*^m#n6NexOAL)d?DY$EI zUR<0Y(;ic1zzyxHW2}Q9WeGfMP8e|J@G~{kMM^p(rV#{XWMX7~9FQ3q8JU@xAVUE0 z#>Pf{eLcvK%*n~g%F2RLZf-6BAZRoiPzwtSH!Ht4DK0LC5a2r4Qn004b}c~koy0K+4k_&>c_2m&72n9aaFfl8;-LH@x2NXW4L0D!H)2(TEy zupG?I&(8-u0MH55twRe63SfWe0X7(LXV?Mye^>+9AOrH&5s-xC0J8z)*;QM?)``Fd zouCi|lt2bgl`R3V^<_aGW>5ki0=qd|Vl(W95U>pvaRfi`JvI58lFg8}-`?ZaKCg42 zQLD}(60^%(|2E6r+`dC#fb-Kzd*FxP?`qO7MTIO$Nq(H0k{M6Ie%*HYi^%~EG0e`? zr;7=W-j7-5hr>NRdIUq8c!JXJyYKZ9eP!8i(OMv+tT2x+Qxe{Hy1Mh{iQ6M#vHabc zXY&n9$?^*>yL^)TUYpf5meg3=?srQ3E#}3A!k=uUJ08~CU#0l|TB+~WVl_JX@}NUR zTtzN#d7u9S?&Pt*6$ejc1n{+qM@|+^Ad?@Vqzz%`-o|(LS8u6b^mEp_x7@t>$NLGA@j8>t1cHV_*GTcE(|UaS&FNK zBTIAD^Ru%v9cQ@~)lRQ&#ElIo1!5|z=5TGkRt?H6#vER;yX?fVs7%2(m>M%}f=-5p zo^`2zo={#nvxEnaLiPsQhod>~d~u{eE$)mZ9zEo| z&4^LTxOCFSkzeT6snR;Nf1ibRi(nd`ho{R&elorBz=mEEA=NN2tcZvm)Hvub5hk4} zg5kB%9^6wS%*rlS2|=^mCS<5625p7h(;3z(*Nlto3SniCj(zFRri>i*K@~Ta`s!`V z^5n+;Rg_=i-hSZQ%-U4i@>SLxwmv0F)?~_4F1Y?i``O@*eYK3Po#c0F!iRz|j~G_c zBs-#PTWn9X=&|OOcdqoT0?W=_L>cUUsLy3!eXJOVm<-wI>!g%Q$AR zp4u0{dQcW`CQPcy~KT=)a@ z6#5#U4#rOs2nU)R8rOzAVrF%`2hL#Km20Kcxfc1Jm0IiXXMU#So;&CGhi${sKVnJ! zawxUjM10M8`{bg!@q0=A{JW!DQxca6H_7~m@7W#kQ8{FkEcE82<`XR9C5wL_K-HEv zAZf_slPn`YC)PEoPPKX9nt1ko)f!$^El{c{BsMNrhqu3}yDa645o4s@Bv_0^%U;V% z>60)JO^Cdq7$orvM%hVSwO?S^;;EJ9YO{)yTZ`P3gR0Am^ubW6HJ`|G!3IhFgu~2k zMK^4z0is07U9{F!2;#^~!>hQ`lBg4;4F*uSR8j~YB_enCoImHGR|clB`_|nos#wr-60mdpf{F0!ezm1b<9YS9IL$B zKc_H3p*+Y jyDUF`lOA>7C|}12rFG{pisYlf9|IvBC+nB!I$r+|U{!&% literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/mapBtnBusNormal@2x.png b/TWTW/TWTW/Resources/mapBtnBusNormal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6d3eb4ae5bd779b4b6791e2f9f2b3d0c2b7232c6 GIT binary patch literal 1077 zcmV-51j_q~P)Px&?@2^KRCodHT1{&cK^RWbqy!o$@z{E)9t1C53hF`hAJmHh&7riU$)z6j;Kx5` zJy;MtGzo+pQt@WNi#NrC3cZL}5d;q!@uXH#2q{T?-mtclWp`$FXExcT6WH#|`~5!i z?##|~V=?nH2p9wm0tSKOi$L6O>WxMtyT8A`(C_yb;_>)d+-G1br)y4EBSXYJS%H_Oma zw`09CIXQVr=5a{aHJ$qO%tt7BN@3oL*(seNny>KZ$;^pX z2Vn)!QWwGG372Urb`D0dm=FM3=eZU_%#?{;2mrn0gg8fTXfm-UxfZ|#iu8sj`c)H& z#KS_N@EJ~fB4JfNVoFr2)ib?b?>1}|-0aE3E(8F^MX$HjQmM2;L9DC{Zf@~tqgx<< zBA1(+n`GAw1X1kbIY1OOjl4)ENWQ9n;T#|ep2}V%6C_{NzcK)$c;nhFRK-6+^L6%d6{3Nl7h0YRc01>4FMP^na|k26tK|1!HlZhqL3Zed5Z z#T5#W3I9sgl`BBWdkB;b03jHJv4(K$D?oV?WQMPaz4;sJ<1FqXZejly+8}gY6|k1g zW=|E1#cOm?8(^#tJZSm@d*5;Vbpz(;kamXJL{l}dqXM4dQ1m_u%zG5`pEnUesI$59(* zVZysIOgZZDct=w1Egb-?VlPmzyRc}hcDkQF=8^}P@J`ruiAFp--AiBieE<^a%NWFD z^cHfjEZNHl?1GG*tPHILG~xY!=4s?9d0gBT04o$XM;*)HAO|a9tx2=sP@=dFcbx!& zW&3XHcm#Yq4}+osAPl20&KOJuj1&DZ_&)X(plcb-W4%3GqDC>Y*lFIxviL~VmzD~^ zOUWPAK)mWB`M+LuoaD6tfM7-r0Nx5m0{|R}UWI%3PTzG)?1Z`w8mjJt$c{wpQeTO2 zlY^5QzRDhX1>i8`3w%EpfWVENbcK%qkY0wPj}B;lgZ>&uU(1e9kccCDVq${M2p{A6 v$qG=c6f?!n(oNeSU=T0}7z7Lg!wCEXT%;h%&Yb|~00000NkvXXu0mjf%QD|X literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/mapBtnCadastralNormal@2x.png b/TWTW/TWTW/Resources/mapBtnCadastralNormal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9573719e50f272173c839821bb868933f4d1a9 GIT binary patch literal 1480 zcmYk53pCVu6vv10$Y4t=SrI$2SqYU|Hu9Xtm^@}MbdnHOYfm9XXv!<3lPJ}^jmV?C zQX|`Dj-@26Jy=QdDu%%v^iVX|yZbxmf82Ba_jm92e(wGK{=f78XM1~+H3@nI91f>R zadV}^>iFNY1`nQBpE3=L(l1UPPB>g`uDU!#8FGb_bh0z9szYB2@v`>;UlNFHHk-v_ zRa8_I7Z(cz0!UX@R*(lB3}QZ?4*@XXOG-+R$m8*#1jglZIUEj%pnwNMI(UdtFA@Pm zB#c4~=+F*+wTZ=INC7A+Dgqt=Gzu{&Mn}cE0K;}iC2U_{po+Fb9u%02O+y0_j{&Qz z2oMT|mf(-{9yA8A*R52J+&@@QF zFdl|r20Ao`Bt!?n7f>EY_w>QN|A7By-ABb`h3$TFGjEl(TCe-Jit5(W2Q*)O3jaO3 zVME8<^NaU5nQxRbvebP&ChHfKUl5GOuHBdT>kXYZp%LGX^xD)8TJ?R= zIUZ9G@RvdEVNdP(t{+mwPMhq;Pb5V?QoXSM^Qme^-r0$Sh2gJ;&)T_R8cp2~E3BXV z)XWbm-%b9Gso!&S-<2}b)O6tO&W%qSEtBoN+#by4{Mqt2nqwnT!{HR`D6USv0nIYT zSbV?LIxoE%yhp#WN0;@nW{(gVVOuvt_gepsUH{vZIIz?wwDtN@*k@VuVEar?$)m3a zyQFdPDlVH>^d!-*>^3qFZ*dMky(DLBV`uaTuXf1DN*`?Plc}oDi*C8@6+caLjlA3a zyxPLi*0k*9X?cXPOPvZiz+FqZM2Eo?ZlaC+7hPC-($CjXx1`{|$@ku%J5{6}tZhaX^$IIQ5V50sht&`MiOV z!QRX3j)eQnGVMj0c{ls*OlF6;3VpI;cAsdEX@@-TE~wU|n&gidHm;eowM;U65WBqi zux7Ytv-wW@jAI05WRPiqt^+mK;YCjFAB*2-S;i6X$82aQB!{XqZCbS?F>O4VKK@DR zd}EZ=>v?+UP7C+zgS5U%uWG#Cj8XDu?se9s#9eZc&GuO{(%<#vf(We>_{y}>%tp(b zBVW&TZvV0+U@1sC$1_PXeO(+@yJ5=TEHd++^2l*PD#d}Jde(O=w`@4A>EuV3e0lJl zq6DE(T{M*LAnny&n>Co;Zc6((J|$GL7(`!xn!0g^1&xxHjW^=!J3aGwJ6OP(7|2&T zXikW;COI3Qk9t>cX+`C)XC)WdyIB+r993=`YRzhCP?U6X`regBl8BD;3EHv#iF}e%5_ep9!geL}*8BKT6 zx(?OnANs%#F3Ss4myIQdRaG`6CXPB#>*i*TFcOmoXd+1=NvitdaelM=ttjcs>G0S_ z5wq5qI7YVK^J`#9?8WdFN4LUEm5*`kwrq`a#PaIiPyScNWxf5saiVRPkF#CGLwY&3 f8fQl542Rd!(uTuYVhu0BKZm1`JYB1tgH!(nGsOcB literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/mapBtnCctvNormal@2x.png b/TWTW/TWTW/Resources/mapBtnCctvNormal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1b06c8b06fe79f926ba2e8320836461fddd7ba2c GIT binary patch literal 539 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slf5AX?b1=6!-&HDfU|IC>)feav+J$p8Ugo^;VKsFEnr63HTdWaxgB~TnL zvTD^TID5{VIS?&C5?LH#6p&o9WC>6)L<*v7+qP{GEkG{ZMj#sq;6|lgND&7*-KHeS zFPOoU>GRvEiOXc39qm3a@uQ;hYsTGYxB35?sl6(T=jVcrhWA-dv!(tG)BGCAXV09` z`-A;N=E+jsgRu#hud=zsO$VB@%hSa%B;s&#f&}a0gbxgSWq#6+7{&hTn3;)49>{ZE z$T(+;RD!V)uY+OEm4-lOH(m*|r;JBam5weoI{KCAsHt$7!=y(b@dJ!U9De;gaantD zver_LvIfDERiP3~pRT$3;AC9C$X=gG)7G5Yq;b ei*2V(8_tDj0qOz*xHyChCxP05Y+#tc z&4EavsfTcZ_CjRgCL=3@v*8S&VxfgM_X0z|wj{_en88rx50l&$_aCg+eAu}@-}(3Z z&64v^K1MzhJyF9~&VBJN^Odg>E?hR3)#R-IlJa3)v>K$b=sZ z;Z@a|C}o||+N-Y?p?j$1TLAx=qCJmn%HBPj>on8ZiOx6$Xl8yS^Q~@ z+v4aA_g~$dw`itv4lp?!_H=O!i8%arT4?zp1BtfAhgLU^CG;$8<}5A;f$z2dYnQZM zog@>L_d9NDTPVi+IT#Ij*wM8N3} z4@@+kl%|C-9Oq(nJMqj-@czH^&H28J_sh?6E{JSYIPrL4ftQ*6%O~6lSrfH2m=g6; zKiyW6lRB32@mJDDhIJ{N%N%F9OV(U!7OeQQlRJuW`l2~McQUPE*p)e9o9e~cd*cp$ z7FehDx%}amqSudPm2b?M%xbzqzwbkzV9cFvmAZL%e|>*(D@m1WfsemH$)>&LeR*0Z znO+?D%zg7;K@-pto~Q=|WazSta&>cuZyrak%MapHHmt8h+JK9kx)#>NL>cXq$YsF?Xl z$kA@U{#)jZI~!fa)@&)D-tcJ#x4%s+F{*kfLT*Gl_?Syxg%vGe9Ap1tv;{vPx(cS%G+R9FeESW9SJRT%!xok=E5#x$J?3O+F6#+6hXjP-#~n#bTmd@fvcSLs?1 z+z5(`7F-mU>ZWwll?WnCCe;R{ATF%9D1r)IxGK&gndaS@d;Gq8=f*qF`-p$IbIv{I z|Nrxy|8>p{a0IdzPOXfawN+d{f*McM97REW6)(FMKT1c|!TiiJeo3p(Nh|2dS-c&{ zw=CWX`f1wKK z1;!_U93N5p2<}M*L~eoWyG0-b#-mWobVgz~sem-D;{^*mBDZA5m@#}Z)I@-D)m1zf zd-V`wDj;;rThei83H6WpT1`r;BnINS#SQ?H^MUX;RrVwX!XoxO-SVj1B9{b|9q+gY zc)VJ{LNFe;O$>yJy&Z?$5-b*s(LITao2i!Z0~MVKl*Mh27rQMYxz+)&S&yrsi|>YG z3_4-fH8JvKjBW_KC193&G?$cw!PuL4puUA`48m7AV5g>Ga*3fOTY7&N*lsf0RgVn5 zE9UX8clvU`sjuM@)A9qUJT?hTPA5|ymwTrP?C$v7#=&QWC45K&@Yo6wi_tlrA764P zH_mj-&j4ilUx=H<)&_8}@2T6TCElA|!PP){-!i=DoVEtv5YR(P(dmMJs09LPTDJu> z38KxG0PZrYUN4sLQ&?9Y5KY!9c#J^4%uI~nR#>~q+5O{5U~-2 zsaNm`+mG~~KhEHZnNbIOz&*M{o1o~Yg=Ku)=}T1~jRX>K^Kx7!n3X&;DaVY8LrPJ) zL@}|>po}b-ktLo0GTf7Qc8vXZutj1~)_E47to;*_l951IUlwTF6Ty`*5 zu4G**_0ILaj|9?O$1H7oO1|y|qEg*#0B)O~6|51;kZlEL$U509iy`X}|DI};G1t3z z_Y5QgX8f+fu0p{>T`dW|h2LDB%laJE3 z(1E48pmDnDO3}fyGb^~IdC}}5elI+U17s;b0hboJSjgce{@dY> z#^O-^EbbCeNx@7Vyv>rVuXB)m;K9B*3jf8yIa=X70o>?gh%rEm$QG9yYgngMzheLP bFtL9DhksdF;wOw+00000NkvXXu0mjfq7yRc literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/mapIcoBookmark_02.png b/TWTW/TWTW/Resources/mapIcoBookmark_02.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0f5080888a92add54c716008168ae2ffaed4e7 GIT binary patch literal 1351 zcmV-N1-SZ&P)Px)0ZBwbR9FeESWRpjMHGIsUjHO+lBSeYq#)8;MI2KwB9tH@RV^ig{Isc~g4EtX zz4XEz2;#tjL&cFIp{kdF+B#}%2{^PME{FqEBylT#B#P?5IDI!K#WFahmj~7Hd1`+I@ro+<|k@(oei-^TR z)uoWv?Is^Sh44^cd_4U8PNzG2Yl?_2=?ueLA>qE)u&8TgJINUbL#kmS92O*Lkx0Qf zBbh{yv`vMlVIuP*lP@4FkE@D{ysBDSb0It~aFkCXbc3Y{hniAvTa~m7zQR|vkij;Yz9J4k1+>0!Dw(7)%-`5&yUUxjB*BctR#zh88=HMYT0nGCINY+xTq zK!_WU(Ejti(aW2=N$|TZ5uRj#_~^t3Sk1fq{%B_h?I|7kJYwJ0vs?5am1YBAK_B+d zMy7Z{b{aJ+D=P+~k@w)zuNgqs?O>{mBN9dv;=4d}=KWeESgs}!7LegE4iIUa9qkR| z3Fj1h182|R?-wsto(BwG*6I>j$QdNMdFSx8&}rlQiCb0qq;B8(Yw6{BdUc5iU4NB9 z+He!A*05wk4pp0?cGMzn@QQ&^Rj4>vmk3N4Al1UMna$DS>O;A>vLZLK*$O)*dAMb` zVsh6&O(MUJys;nhAqYvIyRbUe=k;@`UQQ)R)1}}Vfm%TixpbF#hYvxQB6#~AzBhih zk9F-@O(NTrI{^^I>+vAz3lKR}$A1zD;u?X$98Q3D(7Aw5CXK`FZ_H)$`I0>>z|hR= z+cmvXlL$x@@}uYtHnfyjmAQhU-;laTu{AFRqmfUA>JFiF{=#K^DUp!L&5S{Y&n%w6^;CC7{S-T%$N6khYk)x=@TAX-B`yZ zDM_BlgGjczX^}`$FAS9B(0vUM>I(%O)(|`FZ}2h>XCXRSf@XF{VO57LAdT4 zPG%;-O&7Xtp4bw>-Z1{}Ktk#O{AeH)eCcrX+MfoZgRg1B`}=49riE~?o6hhqI6 zs09B5Zs=1;zSSR_xlOT1r9_<(5MWna!mqz?bxr#Wg)MHU@*lL^-i+y}L|gy>002ov JPDHLkV1nL_fjIyG literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/mapIcoBookmark_03.png b/TWTW/TWTW/Resources/mapIcoBookmark_03.png new file mode 100644 index 0000000000000000000000000000000000000000..3c138b76723120449fbc69376951d3f2fface706 GIT binary patch literal 1319 zcmV+?1=#wDP)Px(;Ymb6R9FeUSWReLRTMt=y*EGknM?{|!QbdcSEU+hn#>fTw6?*8h(8M#E`&6b zRg+Y~jSvx3P?Cw8WYQwVO(CFyh{Z))u$iQaR9qB6g)X{k!OXmQGrq~pynFr5o4jN? z|3AeG$-VF0bI$$l`OZ1_z7fXgOH0rN5-bDhfu62_tj^t-0GLOa z7Q-;e=QBuWdXySjncF<#xu=u9DwYIT#)uc7wE1yjUz!I&D_IYHuvWRZS4}wI{tV<@ft)K=7>3=Odo$ zv@r(5=ciM}g1Cerd|5-x4}=CpFt}S6I<*M-a5&sjE1%C(&dMnX5+VFOFucVBa*uN} z`KglXJ$~-%3(~;gAi0zL;sG@TIpwlhvhBQUQE1|`>2TzIu^{AqYptHW{x*cyAQkWf z=Fm`xApAgJDD2AA+h6_#He$?PgRyzeAQ~F%=3I(vPMWBMaCV$7|iz6o{vRAifL>rw0L~ zug%ov6t%1@1GyGkj_SD z+(OmlEUEO4&+zdbg?;wy%IwxirGE9eDG=opPQtPV5Xii8f^n5hZKuf2+bEEtK$@6G z6^P-%=9EpP(o`yy%IiP{7baIxBiYm|O@R>IA0J%Q(kWAwxKs=JQ;FfsP2GpF~i?WY|Q{I8JrbaoSc#*d*@=mG4%X&eEep4>qJxW z@jsq;`rw!l+A@c3HkYHcX}Y)kvWz;uzHqBH&~^ zhg*SQoip+1WuxCXgiZX2^k>hOO*xI}X$V9rD*xUgaA^_ZlV^sb(W%eJZo3xS_&4?O z(Yvvw=p+X-^b2JbS+-e6fB$=+Y7!qWf8!!IVvv}cibt+iO}F(30PKpTwb|q~TmsJH d;Z`HX{{TIc*pL&Ke#rm;002ovPDHLkV1n*RgT4R& literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/map_ico_direction_area.png b/TWTW/TWTW/Resources/map_ico_direction_area.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9c6f351fae7faf7ffed644fb3b4ff56c91c5be GIT binary patch literal 8776 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 JtaD0e0sx*(FuVW& literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/noti3.png b/TWTW/TWTW/Resources/noti3.png new file mode 100644 index 0000000000000000000000000000000000000000..43ec08d56a46432dd1bbbc52ac6f5fafe8dd4af5 GIT binary patch literal 2204 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591|*LjJ{b+9SkfJR9T^xl_H+M9WCijMq(*qA z`TBwtaxkzn3NbJPMHzvRfl-P9qyordNMe+Rv$GgAplXR=p7#2nh z49p7{5w2Ol1UFG@0W*RPGCDcuwK0+>{umUo3Q%e#RDspr3imfVamB1>jfNYSkzLEl1NlCV?QiN}S zf^&XRs)DJWiJpOy9hZWFf=y9MnpKdC8&o@xXRDM^Qc_^0uU}qXu2*iXmtT~wZ)j<0 zsc&GUZ)BtkRH0j3nOBlnp_^B%3^4>|j!SBBa#3bMNoIbY0?6FNr2NtnTO}osMQ{Ld zXG${Mo`TY%9I!1Z$@-}|sky0nCB^!NdWQPg^Z|Vf*O*rf4Gmzp=vO2b05ut4)s$M1 ziSQPRE|3gPZ6%p$IJALeAlkrz2=SXuO0rdPX;M~datV?sP!1f%PKoLINWwPySXJ8q z{b%KypOTqY>5^EIY6nVGx&~&t1{NW(L}jCorUntZVBO9|sh~s|lAoVrhnhwqI+5j( zw1Psy3amcDB@-A2#lT3kGcmH!$0~tUV`n&A*luh zxs`K%Zb4CMG1zSeHu@N1=;|YaQj7C*Nmz07u7zqI1yft2Do-eLC}{Fy4K>-^u0YH@`l)R=f4q z!mHMzD>ogztaxC?)y-%3^{-r=zW%;8+YYN;&dvWOK0WB(`sI+(+5q>Kj@~-m)pPaN z@#Kb2IclKDl2QtCop z>c`vfXG#2Jbj$B=%*I{TYc=ene{N@)vERV#Q|6j~t5&VsDy4m8UZ?8GgEx|y!5j0@p*efWqBep-~1KRxOUQOpH0I1o*@6D8V7gl`<>)VcJHc6v}6&M&UZbO z~u!s~4p$Zp4Zm-#Lnnz|FX;OQY zw8Cal2kYIi&mM}$R7AFT*34Ji(b3xE)wDg}xBBF~J+?Pjh8~^QzT2;|FX_%rXSRk0 z$LqYT%1i3c-&wF}#&e^dTf@u9eM8qbaboO z5#|%eUdhgw2I3^J>UOC1M7?s+(VQ`3Mw+el1IMhin7>k@lX|_6ZI~scuWV!*XR~~B z=kATQJ}#TZY9ux-y(8o;u{9>RbknM=CD$(OP*9v_=&>PUK}O7+-}~g7L|^UQbAX}s z{J94VtzXzfd8Go@>j5Jzx~-&viSLqp$kw<6Mib9?*KJXo{9F3XwnfJkZcmbx{IX1- zNb=3H3CARLPVxRvZ literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/p_eat_dot@2x.png b/TWTW/TWTW/Resources/p_eat_dot@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1675a3b1712e2274d16628f56b68ea03fa0bba47 GIT binary patch literal 1331 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 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/pin_green.png b/TWTW/TWTW/Resources/pin_green.png new file mode 100644 index 0000000000000000000000000000000000000000..351ab8b1143674d2a9025b3842c7fe6621a879ff GIT binary patch literal 3282 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 GG5-OEd9H~7 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/pin_org.png b/TWTW/TWTW/Resources/pin_org.png new file mode 100644 index 0000000000000000000000000000000000000000..2737c0fea9f3bcc0b51af55dcffb411779e4e940 GIT binary patch literal 3241 zcmbVPc{o&iA0HuGQliM!9czXev(GdWHDk>(mN6JvGRvXCEX<6xvL-~0Qr1dYGLeK9 z+biT&Dq1FrP~=t=rMk4-?mN2G`~GpC_mB5H&pE%}?|Z(V&v!r1bF#fWoHflE}~Q1i7Yof*)*tW+0SPFt7 zum^T>wk5^@K8YSQR$?TJz&75x1#A;floN0P5d$30jp7N3@wUd_c!~1;k{E6b{-z>| zv^DjD^7A!FYl-5{t)U@K7)cfyBZQXgC@HL!pTn1QCM*f4_|7 z)?(OUM5=?+cU$t4t?^EgNI-x=z z{9teZgsd2jK*Ztmz)Oq_CSNSFHI{q&cL-boh4Pb_C;Xl$dCK7N3;`Tzjev8xOL2YE z7K*6Af86*-Z6Pf|0Kln$kS~s5$?Fkj@&hc--TyYUq$u}>=o!P27lje!z-NiM08ixN zU~4RYW6kEUiD(1?%?`sbU`PZL2g9HMB#em+!@|&5JQGF0;TTLj{s+%L;q7ovI5Gmc z$pM4IAd!w(G6IEkBHJVJ1Tq$j#r?#(@Pr};j|Kd&&5_&wj>Z2^EYUs&V2JoJG(JD- zM;CbQ!07t;$ zkoYjzrZ5H`hC$%4Fvcb(3x>rJ&Jw{U7_e&wjNcIv(?Zn)c>O%;)Z4 zqYdgIMwG`{Nh~a+RX|ww$kjC33~KiELeyRU@PtzRI4sbxtK&qz+3URspQJUqQ}<`c z%lpRH4?cTbV?8@}r+2i~e6!%-g7R0jfH!SmvE^R3tn9_zZ81-u9_nsBl8@~5RIFY! zkE}JkoP3LK_(ch8t$j$Vw};7aFGMp46R2MT0u&Nbm|lCT*rwI{13;LY%~Q1;A46B5 zH>`)cV`5ThqAW8_NjTYNZ=>!dYGQOrb-*_@pUxrnh+Z_FwlYp!;np4vF~KQ3PTVDX zF7=P+knc)%g)>io0fK_IjOrgfuUbI*JPE1Pu7}ar%{YwSv`_?2y5ClEO`o#C;;gmu z<_Zp8>p^w%AMrO;LG#2u%lqt#ElSrV4sO44J9zcS*Nc~fh79v743ukh5Pc4hEKC5d zs>OTeyKBEaQwXwsapRYF{EH6776w3NT|vw7^7jWMul92IuVy8qMik8MQ@I64Q1*XZ zI`i^sW^I^F{mlXIr;P`^gxkFXX3}m+c0)uD?Sj87!>V`m;V_b>p6$YBN8by<5<}u+ zt>BA38_$t@z22;2G3P^eXV_V0I2xAUw3WSF?5n@*Uv8%g#y365Un$jtW@w*K@T&>) z+WBRyQhHIn(zs!^;=qNp?Yn|$)|!{}D!aIA#TmXZ=~@{^rvbN?N7=Twp=R=f_ahDZ z{e2pi8JV*^cMVb17Z8=*cNjXNs{X3sT59=mhsANUcAAT4`n{|&@~D+EHd;ih&(3rl zF`Lf)JxsGMVnR|Lnt3j_JG9X-sJ=)ewypJ?zPgOv?4}{6G;>eQhBkowuq~z*px`mx zdosM{;BK^TUwcNaXD!KC5S?QfKPtx`?eAncpZoev(#a^r?`{|k;jwJPp&Rd*P zk<4eKD?{h6hkC_1iC_D{8mem(Nr)EZ*|>0{8p8Q2CG{=@bD?#5_Z30xlh`41lu@Zo z4V|{mHg!msBhx=S!!&;kck)7uDH>94Z=~w1qsoSSQcN;%*9~nthCtnT?5WeD@dC!Tsh_1cKr7%(;^Z? z7o^{PW@5dbrjmv0>GsvDb>haCOLZ(3Tz7(xss^1CHF8yGht`U_)JaF&k2V2;We?s= zHUlao*R)1MuifjvZdy&JCG1~T(fJ~=6G$IyXB!*bA@q5@8>$mm8LYVX;H1JM$!fCU z#UrkzewGHZw2=lX(+*DIYT*g`9^uP(hfCy;h$cwD1hR)LD}_;sIu!eas188 ztd3~bO}m=#2wmo9!;_3^4riX-bG=BRe3!8XDs|)-RLOD8XAJjD`NGW)v23#W$E3Yz z?;S>AmnAFfTvrr%d=aI(=cKxVdp<)dI?m>_ZtMa*En4 zPLjrE^9<#qbmd4_zhyZbgBPTkKDMYkjQjv^H6&bSK=M6%00WVi3GZtX7Vrzz%ecHE<#%a3nW9?aF=%m9RTpvDpBv zRp@i_Zj$*CU!~6t1@{P(IO^!_kKIiXR^l`)1Ws=0sL^)wCI=BW1I`Du%&0m~ldi|+NkEA^Uu&-j@M<&92`;|Cco(?@>TS0N-e#@~i zzt{aW`vU@RIrln4Na%swuzC{FwHT6wosu=~ebvs$Zdvt&e#(X6U7exvQV*!Q_28)Q zOh}t>)e~}V{sDX`Fa^tQ^mg)|v>I)HSn#kg8a6{~x?(A~(uS}8_ zsbP!y!|T1Y!DHz%&!x}WRAS5R5Am72ozkXkcUE;cedA2^3JI_Qm_HMBZb9)^dw&}^ zOS(Us=((|}{;}wWV;?D?9Xft6@4oZ>YI*_kNVM8G&lV>=zjCmb7=Q=fw65%oElMs# z^=kLOlT}2=`H8*PP4CJTfA-#YBJgdT8Rf$Kp{H}XiZ}ajL(X1J?);;6L+1c=SH{?L zlkhFW`?5PzzqqGJw=jbDSWbL?x-u}^SM}3MsuA2EE?l!ec-5vXV#s{p!NjsOB;vQk z?gm+MNWE?&^yrPo0B5U|m}S)WPVmGFenmUdS;ZmB1-Iq>WK|ccGFo+X3cjUO*kTB6 z3h5sD04k}vs(#sxQc7Bc-XsNB%|MbmJg1Lkw$)A1>q|$7(EON8HPt{l z0>o?1e@&@^T#}r3!MwN{VRA4yIcnH4k{0TFE4{sXyr&>cS^Qf=?^k!_@Fzto2`$+Z z?wivl;<;{#Sun@`<8yVTm+~8NpYl{T!>aC0Rp)&yo;ofVe$-!1)st$ zL|-R3BCaJi=LFKTVk#=LFz*!-=8ai=Cg~NO<$8i#vkq5Nlh+EjJ`X)f4WbbAQ?xw{ znz#C}sRIpVy|RwmV3tox+Q{qJOpCz>gICE7^U+L#eThz3kOz;)!9XAZ0Rh?paBVjC1Vl$qPY(ixL0~YjNCWH}$l_7>V3zOh zUlwq5Un-Zu;W5}O;HpK68{3bE1&Nsc9RibMW%b)I%lBuZL@9&tDIAE7HWb2SuEzC4 z+m~lU|1XVy)b=F@a_A5nx-Z+0OBL0_efKZ0D0lzvXjM_f24l@-h>Ak-#<8h>Ogf8a zfy07CH`+7?4FiYj!D;RY3Rnl~h5{pCbRDppjyn~==%DqCkVquzH`apX%cHQU^k2RiBHur;h=0XmOt^FkkIf~s z+1|gpfaJmEv3)(*9H5EGkE#PTtSD3lYgMSZTByI{#?iS9e>x4%Wix?4GL2#U0}DDz z4~f!2yMuMzDQGYPib8@Zx^7f35~T;HpxqE|NCXu06HohpGYAopf~>a7|Fq99k*FtE zx4(x$bof0^be3p_xT0b4_iXwM07%PQ;Ec%p!KrkY^D6d=4?aAnpTYZCqm`&2=Wf3~;PC9V9~JnUCjF;@QIg)it)&G2OKlW*VBz6ai-E{%0x zh(2(rxuW3Nr}<=R%d?MFol3n@OvcRw<69SvElcB-K!uU*n#|?=2*-8jPbpuxt3@5I zAA6!eT$$vGBo$svd+EB*qEq@?R!`@Vv-`u zUlwk{dz_ZKDo(8}ky|ErO?fi-Y%9EsFE0xjT>Bn-{maRiPbWEi5}J5Qtf$N$x>r&o8QK29Y%;CwjZavaSR(wh<6u8nD0PdQQxWT# z(Zk9xRT;69_m`PS%uk!MbqI;ud&9}0?2{+DZhaBU1+1a6V`#RNh=CJqLs>a;UegGv zg14!k?H?PS3~VMo8Q20CUrOkjn=Y$!A*r~h_Ye#2+`rL6?mw0t(2$RE-lX6<|K3R* ztEK)h)zgI2Z1Fg}zFjM&({}LU(?i>?-=t+6L_6#Q5+;n0%rMe zQr}HKo3GX-=%+!7#vj-4pZdibGSe$;w;kHEIp}hF3MfG_6V^4HLa1d}RGG-AeeF9v zs7u#JTaTLec}hqmTmUYjdc&)=b`M1m)5*!t%OzUN3-l9;j%w13QFf#&n&WMb7X3G; zdbXYF8i@G#Xk(9>83A42!=DpZ*@^Q82`|)uq-%1rjy1VwHFbmIEDe$AAq2Igvq$%y zsh4kQ%1W``f=i}xv&z7eLHgqlQwhmPas1}9w=D3ry}Ng9TO&ZGOStBDjJ=b>9}$Qp zn@=)~kBHf58g)A75hX}!Pxf@-QbJ*trHXn%WbOJMXWlzIHHgvFB^XAv3-?fRQ-G^j zr{m=a*Y%_}rt<9OgSGj%(Zg0oVX|A7VovtF2uTn1RHKRG)%7wK^4S9O@WM|$q23SA zW)9;|*loBZcQR7quvz;f3-%U4lyY3K(_Y#{gyq9GIn>}<&Xu<+zEzov5tixk(gWna z5P|r+lJgl6FSzRMMO#K{#|^lI_-If9{f;F1QM(7HjyL;IvW@YV6)nrzwA8P0ZVk{;#g`!=&*G8A*7o7ffDaD}h`s1RLVH+k^de@Qf z6nstye5`A?MS)A`aPME1sMUNSr_p+yrfH9*@e=fv!58bOHH<&AU{=<7f=$OF zRa_sgy}I=+)^8B6!qDS33iFVFaTdyfn6Bhx)S2k-JF_O_I4#tpH?S~y{7Up&#~#Kf=#cIZ{S%iQ?^v9-k4 z0<@q=xWz9kuIDl)z{$R{#a}t|-rJGE+^EN;c~@~m!mM{QT0^4`326_agAX14zOqfp z;n0X=x-j+Zh}ZK`!iz<;!oqfi)ZFmX29}=_Rly|n2_>^SpEtL!o^e}evJ#?gQ2%b_ z%Z6udkt1(1qO=2SbE_ue^i}5-j*J8(`EjnqJU+!zFTL67-}2f*bb1m18 z9KBXlx$ge=i#M84O1sT>KFg8wsqD;Gm_4Xe78L*8fZqLmInQ~();LwZblSD7^O5sn z-^{-L;;n+<>M@eTud*ghEy) zdJLmgaJ9a;y-H2cC>A{<)9?z|n4LNXxl_5BE9H3NuHeI@EP~!tS*x93IPcmUR_#A$ z`}NeZr}{CRz-X^xqT2O+b2-pg$tp$A_Dqc@$GKG<=jnKUTg7aZ*Hu`k1VZgrDSc#iF8w=a7 zZ|)+sbXn@IEnfL3Q)QODzp*4?LmptG+0h+%{)k8Jg_5Z~r`^nV?5j);Nz5wJM|fbP zMxNna3!Q=9RkXjRD0NpuH;-;OzF2yA-cDO-2JzZbj1Zxmb^(Ej_{jIj{5(SG@X;_- zt&%f6q_A{=z0cG(%09~I0mb5q{^%%1-iKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000s$Nkl1(ldB=b6J2QK7xx17|E|-^h%Ccn3j$Ku;8|*YaMGD=zoq za(8EUX8K_dab;4LVv@GxzQh3B+1Y2_`Op73-$QUg>+RiA^?7jcwCL*UZIn{pCWP1p z_<>$Pa%DFY7zARLWxZ*d<{w5z24?~5Vm}fq0X8^zT6A{yY*ZBG?}QLvy9xmMSO6`{ z`n6#gPlZB5b1MP2EMS9!r)76{?`|oTe+8TX_uqe?f6tyf{msqI_Rh`@r=lq0N=C;p z3@a2G%}h^E=lc477yHF8o{g2h%9y6{`0()H8zmNA956t3cW-`3O8F?jz4!i=|B*)? z3AVMhIxNe&Dyb!eU}9o2`{a{PhM#-xg&2Tonm-vH9{AaXpeYxE)z#H=hoUI|42UP5 zcs%&nW8Z13t*uo7u2#SRyxv-M&z?K|KA%qF%wqn74~}J|lwWkaYhFnt;tOTalqIUE z*4HFqKk>v99j0mWIl>CdDr(X0-Mf9Wv$NU${(eJBrDlFU`bHVBvgeb{ z&8@9c%KZQjKm4trX_|aqn`xRn{P4Ge08+~R&CRW?Wvpb0U5efA_$nYDeDHy~*47qB z5zx=?(c0SLc<{jo>Ht~7Mgc?_FilE%Gr<1+`|9}r#!@V#ls5qyAk-4eG$BL_Kv!3n zYrT#9_{1dRV-rkHg~?3W{m-#EhbRG69B$g$KjuL2Wpt&W;t-Ei*X4BTZ zk7X=M*rGqVw9W+My_hxpTld$nxC%7Cp~p7`4XuW<5YKLDMb zoA~mVb`c0PE_>~UIzQC;X=!QZ)?063W@eVx4!=n#G{(V$eN0V-*}w0u_3FAT16HlO zAD6Cwg7(W_zR1wf2&$^Gcki8-&5%H#kp~~RhvO$s@$$>R zH6!o^3X#M;C8zi8XDoifmhZp!nh#sUKdsT@c2ni zp6o|eRqng*>jawupIBzFDZqXAeH~R*IeD_5509T*SB9-+8HJ-q-v?mdSNG5qXr!E< zE_axwNiLTom&;L1%~rm)DbUEiukHch=+XBv3}ej!Tk{a&wb$NYem+Kfdn;SFZdoyr zPbQOOvl()^T-ABI-HyZIq_(zp+23v5x`pE>PBA_{$!o8@!5w#edA%97dIrES3XG18 z191Cow_=*+M~-YZLnJawGMPZvbqoW>rwzuZ4GaTxT_>4L5Q#*{W;4smxc#+{ z$1n z1OqzJXcWJ{4x7zZRs3scsHeTXmGSXO1_p=OvSst?6c#VphON@enVJd%u(`MABdo~f zvc%&tgb=*gr}HmATHwQe10huOTmd~-KnRr&`wgD>VTu>~bc7JZ<1uo%>__Bn?(G3! za&mgD$hG!He|owISg^SX!!R%mqw;`@i;D;$_|?k=o_nc)WopEuDI!x7?A$Kcxm^&M znjjucVVN4wy;R^=FBcF(u(-HbkyDo2(h{t?=M`u4P19sXvR z&%$r|Or)YQbb1I)=J?4EZ^Bz!%oF$S3GnDYy+=Hjq-RSHzv(mCaU(Pbik?){w553; zLI|SKc}&wpO1WM}e|1_up9jEZ(-1;bv7t~XAf@2dBNmpWFc+C8nMiTt4St40N!~ja z<-KE3hC@kiyunX0kzy_~k7X&mdc;CXL7`BnVyzIOl8~40eT6a1Dj8*2iLc5Gv#jC+ z9y?X6l1InGEkAo3D~HGm}A4B++wo)Hen=b_)LHet~73mnVe4vMhv4}ML3dYW)6g~ zSAycDfR&l0*|b%825UVTrYH(NpO1JvP9l-S;jmZ23PmZ7y|guH=y_ez7J z$tyy`rctp^hGA5|N+gmPhJnxLtH@s;m9$E)b`@H4a})7+oXN>)dU`r5Oj8sEAq0)} z7UNSUUDpQi)?IucJuz<)>NjYtmlcqf8u!V`>B>Dzf+2x3_WX)MEeZhX+{Q89D7aj@FPvj%K5J+&oVNQVuN3@ z?@kv&2y|U98G1oFy~xDGRMkDN$ZCbEs+ENMt+(GrRaJy2h6MS19+y+{_@iDd%b@R2 zlz;o)DDU<~$GZ>E~g})&r>KAgIHBndFP#@SeC`sty@r4 zb$uDO+7;K`yKf;B8e?c^gsoezq0aBaFbozJ7Vvt#T-)p9KYmcp_kJ|Xk)v^r9F2cO z#-yo)IR*xYaX1|8+O>04`)*yj(OUN3I9o4vRB*?XIRSsCecnnWUjs;b!ScJlcG2M+d;&F0v=xrd!QcdSdrbzJ}h z*!z{c$Sh`hxAzpalMXtG~mz!_80k_*$G2~_M zSB~JNl-O)GG)<#WFnIf&_c(oepjbBA+{50l>_Jr}Yctkmt-sN)ivCrF=H_Mw28IAQ zb7qj?;Sg=DEp&9Y(;N(-X<8Lv`Fx(~@C>7&aV93GC=?1y0^?>BRavwCTA!v$mfPT9 z5v*%Acaun_ID2-M(C8SU(Xq-k9#0Jbsno(pe&5v8h_|+eGXo`?huMzsfpN zY;0_Tsi|o^o*KHkHWiceZPzd}bB@TlIp*hM=z6{iD4R{AuFg+G{YCy*Ab~-!TE7xT*833G4=Zdnf-O|gu zM?WAG3auSrpSDU)htC4VITflRS!tG|$K$!E93cd~z1_Tf^n;4bPZhA$)W~9OOArpv zGB+2+E@<6|YxLbyQWYlx$4XtmK_b+30q=E3#6l1ztMv2Lgdc zdb-=_>TIp@w4Zsvgn&Z9k_1XWa6E>z{ZR zAp~RN)BN$>ehP-bRpUp~Y$%FKCS9!6J6(>dYKGJ4MAvnslP!t8zG}*RA;jS+iuidsqrBEnTY}m=jra*vTFi?rnE^Lv=Il|!?&d$s* zGBS!`n5e3a){gBs93Nk0l|n(P+T}mnTIG@({2rpQOM8P3r-#m-9n6FWNhTr;4vsK5 zI8t@Z#tp^QJ9E+bWo6WQ8wdn@QB>`+`uG{~k``SZO`Mw#AumzG6;-3TZ7YrWZWb34 zWYP&17ZYSNsbzt3I6b&rUYu?(E|(WovtL#ZP0OIGqiI!=zGb{*@$Zu1vY@WcLudO2 z#wO#H2_csRoMy-4ZNTGgs5+m^7Hyl|;l5<=wQ~PVI@>o;SLeaJ%&@|`)G3>n%`wYj z%jOm|O=T!FcUhn<*H!}R^801d)47rE&cLe8=vlQ~(lRZ&I|9_W9h@GVA*UOw;>Q0} zGhw$WZ0QXWXz*dJ;`FE01FXcf#s(kt8@-H}X(Ju&4M-_2TMgH} zL~U6XQb2b{BOPt^glFP}XJW+S*{W1&bqQtR_c;g#`~(9&6r~jOe$uzKUM1@CVsj}4 zEx|fkn>Ucj%@mx5hu-DV&b05zY_ zTSBhRt|vupD3*)t4vnUOpI}ol#wz3sBp0$Qq%-Jxfo%5t@R^=3{%_ONB|)!>&8AZ0 zc2Zm8KrMY&2FX~1Mg94F-dci96=0TSSt%ieKb1-qygt9S+7-((cxAbYD)IZ=_C@)y3K7YQx zzxK{U2tgRI{Jr9z0eVFe8~v z909Cnp80una&j^&KgXy^DVUs`%s%tX&!d1{3;Q zXPhE8TJ^%dku~N*HOC)0d z6N${e4a}F0bjgNQEp?C-_m`=mxRa*O?RGbB+}N<+Zg+g)Q!G8KTZto=%f3H17x`^E zot`c+E4GwfECYfBY$c|7fm*=ra=9CQKL2%gyW<)urCU*y;MIVTVHjc4G}F0U_Dnn; zJF&Q!E*tk`$!?_qohADquC%OKqqw_fP3dp}_R@KU^ZSlnsjMr<5N0X9$^$uIvBao_ zl9A7I!KRTbJ+LeRV*?x|@EoPjWzep46}6Utr32X#NZHb7gG=0&bm@0x;IxucP_I&k z6-q~b2~d}|@$CxNh$SG&tH=RZOTaNNrF{B-0|3_yn*r2KdX)eG002ovPDHLkV1jy( BS|R`d literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/route.png b/TWTW/TWTW/Resources/route.png new file mode 100755 index 0000000000000000000000000000000000000000..75163af40327390a805e7c0087c5d9c716931c99 GIT binary patch literal 3769 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 P00000NkvXXu0mjf^oARP literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/route_pattern_walk.png b/TWTW/TWTW/Resources/route_pattern_walk.png new file mode 100644 index 0000000000000000000000000000000000000000..d76c08a8288f89986462f3578bc1fd19f7786423 GIT binary patch literal 629 zcmV-*0*d{KP)Px%FG)l}R7efQmOU>7Q51&Hh(v*~1qneVwnnIt5FO!XP$^VYR0`GFo?k#G#8MNs zCaNVQDncU><9+Y$xw-R^HDg$Ba^`-X^UR%l=gf#SSY8sI@B2fTHxHYJ4ZwO~)B~&n zJBICho_B-t=K^RHb^=Q(&K*rngi|xD0Q-cc6@BR2oCu7GIampnRg94fLj!w=3B0Q# z*kpL(`8@`1MaqvNPjA)H?lzI(9+87FD9N|7?ZJ$3=pf!qcv6QGX)=G(v`V>^x5Ff1vLc* z-(|bPId_}~j0H3E9(E6z^{tpevZ|{!62WYguCU?`GhJm>Obo+NAirl;%#B$U z6T>hRc;Et9+A?vF!bCTF# z)@LG41J&f+-@yo0jLFzW7Ff&XMIB(ttiQXE?D6t3?kz^X6bw_;F9jQcx1|vuU_t`| z^iO{=0x)fGrLe~QL@AUdpuhf`7}!G>=GFnuqs?z-y&vI&+Uw=I{(t=o<5m~(GPuVl P00000NkvXXu0mjf^oARP literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/search/search_ico_pin_map.png b/TWTW/TWTW/Resources/search/search_ico_pin_map.png new file mode 100644 index 0000000000000000000000000000000000000000..510c0d6903976254128c88e4c081c94c29cc184b GIT binary patch literal 4154 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 Oyp4q;w$kjxh5rDu#!Ynq literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/search/search_ico_pin_small_map.png b/TWTW/TWTW/Resources/search/search_ico_pin_small_map.png new file mode 100644 index 0000000000000000000000000000000000000000..963df7180c45808a82c4f36ca58fa77c24a97241 GIT binary patch literal 2144 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 Y0NO$XZ2ek0Gynhq07*qoM6N<$f}Nr^rvLx| literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Profile_big_04.png b/TWTW/TWTW/Resources/sharemap/Profile_big_04.png new file mode 100644 index 0000000000000000000000000000000000000000..c84bc48feec93d2f0a90fa92b4d6ede5052bf971 GIT binary patch literal 29075 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 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Profile_big_06.png b/TWTW/TWTW/Resources/sharemap/Profile_big_06.png new file mode 100644 index 0000000000000000000000000000000000000000..75473195b49557ed6addae6d5e16f2ec040eff40 GIT binary patch literal 26805 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 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Profile_big_07.png b/TWTW/TWTW/Resources/sharemap/Profile_big_07.png new file mode 100644 index 0000000000000000000000000000000000000000..bd09712ea903bab8df7212e333390ceb6ed7607a GIT binary patch literal 30082 zcmV(;K-<5GP)Pyg07*naRCoc@y$P^o>0Q|O-TmEr-@dQiJv}qsJ)0zi1deNKc#Y|P^ugsAC`0ZQl+2kSB{U4%g6ism0U5U znc0O_zL;;-Mry5Guh%*`K53<1YUNUD74y0M)a`FJ+l{TELTRfuI=a2|`M(Rx5zi>(R%^bgB)H ztq+e5Ul|{*U#<<8FW2frm#bs-PrdKkziIW)8Z`e*Aov5n_=~01XFm7U?RN9e^*XJ0 z_Ivqfrx%xpSI(XX(A88dg1D4RTU$HnxY10Np>i4?9ZB78H}zZ1R3ECRQofLOw(q8U zckia^P%Vv(jHaFY+i7?IFjcs=3bMzl5Ja_-3Z+77x7ulIb2DvjY@|k`kw!;H)AZC- z$`x{{S}mt;8|0syB=|dZx}CJWvzxZ=Z9-7PX=Z69jgC)nT|VXVh>LPDm4^zcP{^(J za=B03T)XvKH*eke#9N+t?0JY4viSFR{Ch+2kNwzB&FmfTytmV8z6Z8@M?aUVr+hw@ z%H?$a;!|nq%%cFil7`@Mgi8-nuh&V#LnV;WPq%N~N_+b|=?uUx zKn%BU-%kBrKaEe#&`uHVmfMTm3nA=^tb3_(cnATN)BM~lL{v(>eh&gDryNi@IXO<1 zatY!or?s`)>DrYmX@48Z(deX+@#!=+IhW=a=hOJ)cq%yVQa9xbT_k-cb$ab|Ywb?D z^76}w`}FJOa`~f^)%0s0``E`Cf7+=2Q$_Gk{^U>Aw|4fwt=;K-cdy%jcRrshmP@5n z0%1Tn^$Ue`_R$Mz5zg)ROQ}*Rr`Aa$-C0`)nYlDJHl8}24&t@}Ex>6*m2`Y?knY}D zMU1x7nUyneW-HyeaRWlBAdaU}58|i~4`)b&`x}j;w0E!{L@+c2SC5Usf#nd#Mc(NM zPRu8CG(*az<73*tyB-8~dv!JK@9w91WjLLC^iq2Csi)K8!UEEvoC@V0V`|5E4xVO_{Tro{L?`8p9+G%`}=?7B1X&KEcAQN z<@1HQTv`ILc_=@Z`iQxFYISqz%wvzIv*#Y;dnpZ%jiv*Dc?+P{>mzAssG2$;aqr*| zKnMOg{Zt&lcuuBLvcmxhPO(qm6PmF8xb zP#NfK2%=gm&~82zxcC0vPHLe4H#YC4YgezN21I!Rakc0R6|{{c`Eaf>@}b}Ummk~y zcZukKrwD%kU;p7J+wGITmGbGmxMcm{D-O%vmj zX=m?#y1lxVMutZKAjXo&-88y$+F)JCUD5JkpNgu5~Wt(1@?Hv-abg` z@p~;D?eC`T`+E>eF)hqYrxs%L`t_S>5+iA9VJRKJEoFYo(N`0$(HhngR=ig*wnBn{ zOf7Ns?lA!GVMt9(OwjJVbZ7NuT3TL&SQbJRbU<_k>)PMDoqjqxI!>2CaD#D`Xz%g! zmmq*q+C~=_`XISYn}^J;!(U? zx|FITV`+SBGUdAcbmz`JIJtsLGLkxQ-XShdx7`8Z!>NhOvx7Cw1!;P20ZuqU1YQFf zOYu5voP^P%2=2o5ie-&7R0GnY5C~R8??EuCh9+WMP94GJQVOhr+#>4Z;>Amd?R+X@ z#b?}I3f(M`sQ>r5Rzt6bWj=x7r%P5uOqVK!P(SEeke$a}J5DX6$>``fTn@4F+3{4W z)s#b$REpeJDi-?P&et@1&F_8e;?q}eTz%oCuM}RsVhDc!`@ip*jeDEFRw@+VU#Zm! z9DzuDSC9!(;U?Xhgt3HyL0d(*X z$Zn=hT$K}$J~K0eYg9r<-^8MwOmmA%=+btGK1Hpf|47b+h-^nIt57M0)My+Z2mCtd z$POGd%s7s*nz!KIlan@fz31kmZt?^bx+}m!K->S?h$5d9x`@^%0ErO$op z=ue91KQV%hExiRbeq0<%HN~9ufL0YH)J%c<*tHgZ{UY&akVMQBZU@|MD zit4M#J6sGARl@p*3!Z8xJph-fE7#T(%lfiIX$AzB@QLX(#-1ZYc63az1Wv})NrxC&wyEklvCZLX zxM4kshWU~|+y};*8>_!sELYxBM*nmXgI%~n&Jd|x#4uP5@$9=? zGvFL2uFtx1?ku`%7^?24ZFFK49VT@KNkU{2GB8_dwcB$h8!*v`d)oIIX)HR zRKz;o2I0%#Fd|$Mhhfrbf*VIjmjhfO#XBlAjpA}0?PJg(HR_xr{*43!CPdoGSmxsp zULB+H7{jhj-vtaUk1p3~bX7_f#5EECF|P|*s}c7ppywJSAA{g3!nY{e;qe` znScIR2>wgYJ-5_q9{xtTTz#97AoZM_D`G{a@7c@IfaDO=pk6gGIMwP}- z1H(vBUd3P$s7*xQ!QpYZH+{sr?vY~g%$f5+Fn8{(!Ht9#r)RUk1;jB4&}+nyHJa|+ zUW>luhCXA{3ZI^u20@1bY(kz_0MIcUcnDG@ z9u1}SjXP<1Wr=`CHNu8{0Jprdf;cOtjSUPVT#lv1MY!rXZ4e?n!c7_>G^v%kgYP>z zHwD)~ga9$&mTjVMJBZs>tC8jiQyS^wM>umn{9=LKgmW_yngwK9%_E3xH;oWP5%HT_ zn}LiLh&O6hAH{fru(gzX__~Hi4PoYU8giY~#y;qQY<+3_YqU@Sz#^^#jwPaDMdqWy z6$l451&CigUgkI2c%x^ z_~A$LCFKF6`Zg~ZLS*}0YVL;~ERqN~_voXcYb1^iqFex}*JuRz_tF94Sm2Q2BQ&@d zNSK@$1E?56AXAPTMwD;e-Aea2@2A00%0ZH{rzaIJ$&cR{pC4gCBNwGx;K z2@N(fj;TIYOPzi*V4|whT33o3V{z|5kX2&rXCcUX74Z(I=P|JCuL$9m713~UfmelK zi9wcO5+P$qpkhA%vp@P@{WtIXqhpNme>oTL>^DAwSowO55R7MD`Jh^7uCY+SZ4og} z9O8`6>MuoAfkdo2X8HV?G^&-1c=IBuRi7p@HxR-$8K4~Zx6oC`7*Rt|@Z9ta06s!Q zZew9jrYXen9wEfFTek=>jD-$WT;95JH7H(@>Nt#CP2!_A5brglL6@l2E^Q3M-Ezki z;mit|D92xdD2_m)6FrS3J#X82T9re*ER^R_WEGMdA; z|6hLmXa4(V|EPHTBP00F|AlY;nS8PIy;{ElL?r0ENO`aW=Wq}(7IJWo1C%R$mGSR< z72u5N*@d)Bcu&q!%xZahG~h0Ewqd;v?@D(+`%W%DT$b(o7&Pea#kslEMrU8U`jTCy z1)@!5B*wkf>xg?ogoHMSh<53BnnD}}nR$$w9B$WrME%%kJ=99Qni*AOI6x4I4mt~! z14p$w7($5ES_!q$CWefUY`_IR!A&*} za}43%dVrmO`|-_x={w$z>+|0lHWZnP(;R@wL!EuNPhI6_v=z7q*%%_hnLz>s335;- zdSv0u3Y}#%n84R(oHgbPr(L;vIUNy6 zT6z2oVZoF-7(5%dS5tLtI#obu69PIyhfYpTK`7gZy*$DHEdnSfX=G>;T}@7z@l+}x zn{f<*pe&48LBMLkH{o#nQY6($$G9#{yZNkBxA0b4myH$bnQONT%e4AsYBV3O}zcDzdHh5|1W0cLt? zh`Kt#huY9^L~Dl7wL=(Aioi0~@epo^mM_D{+``WV2@S-sRp6RIXKaH?c@Hi=%{PDO$vvy;;)k43t%wyLKMhm3?Z8@XcIP$jhB_68ZK z1Gs9K-;Xqk7#lndV&Fpnt2h_Ix;7Y)yqjVK>2Rg;BoD#LMKWW%jhh9!#u-nA$e38b z%0)kl0K_qKMrmU^+)sG|BP9?df#pG17or=6lgB1U(%tpj>4+kN9OqIOgHHPoB39Cc z{+DP_YkkIMT!6tMXkZ~ELmjn*=ki^D<7a6(jxbsUNYg>nZvsxQ|N*$nX6PZ%H zlN-XX(_b_0YuK$M;t|Ul1|q%!AS=Xp3vi3v6#gEA)N*b%+K4`N><~UM;uz6(_uf{z zi-kJ{r87GM87GKV%5fOw_$dA|2>-(KpTV*|NVD?`a38@2{L$4_IKEO#qnb83Z!wbdQtyapM}T~$Rm0Nz`MNbyS5PP`s|8NkyPXQ5iI$| zc@qAkRE#L~^@fCnW zpX<@MF{e;{j86-@Pv3!L8u8sZmr!{Xr0H?v=zsj+hyL;Cm%`we6w%Lp_xE3Hce+1g z5I}!baS_RIsL8_!l8!mn9lybs8d=&`1^J1PAV?z01!s~K!hO)-(idvC$lwsfkmC;# z%K~;Ei+P(kvzD!h+TFoTqRj^4a2iooLr-0~`XZL|J+e<2T3D4@?`w$j6S#0;b}@n& zK|BC#oRr}%zHS*#INaTd;DgA^qtndE)*)E^QQeR|^1kMn4{*(nj`ks1>v z2(V%_X_*(&7y-K~h?e8^2-L+*@Me@dkIIQ$GeqAy!LC5^bdd%fszB7y5}nxA>ZYbE z2z+B>HH{M*?b27dG8zV{(35B+#Sl$?lYltHgCEVjwNBbg+uIxe9bf-5e|x>-OL8ze z^24JeW0e|WM-DaB7B4=_#d5R&@?3B?V#}JRh^Z2u(?T@(AU9hoBNd-O(M@z<3BZet zV`9(7XswSbQGTW8Vu&?=)6RB~iZR8rv1zk5T?SZ0 zzZebD6}r8#nezCxOG{_yqewn?KirXAxF+Moe4CWMd>;MTNmH{cX#@^GfjjTqzKJM2 zNehcB0T5xVM3|eKkAk}n{_F11eTa*Ql8DB~CgMRK5D$K74Xb<`gUC9nEh;ZMgiH;P zh%^yGTq+gt=7y>z5Q>daM`X5{6@-}sx%ncx9F7tO204&TAkf4HA{}Ee$9xfLq1%O# z1av|?eGbciA567KKu`t|=Z6@(Z4~PuO-aXRVd}X7q64-JKQdLEG{)UH&X*)xTzmVv8@K8yAPEcw3wPiy)eRS*I!O|@m~uj1LjN<<}gy$d2Jvj zt6>Cn;kMEH6_HT zPpfDi9|Q3iKpKf6)biR$OEMN?-bw@Q-5#8&#PGLB8xlF|FlSYh_ugKmIFO=0V+p!m z28wjg4sq++%)NtXrvqqEqB+gJ(Z?&5Fj()jV-!$vUBkxdbXp(y;Lrb08ZNInUKhdt z#ozc_Pat}~eH49Y9#khh9Bu{`J{l7haUxS{H4bYol(=bdYUpKtD}XRXw{DXa412gl zMz5sidqkWz(5HEP!G(o+?ni`@KzD*Wh~qKzm{#?Tn=hxAU%rXhB%pz~AI3P@zkfHa zUb~JF)J`K)1WmA7yX`}at0Tr!j_Qx7;Gi#&D?0qhoISq1R| z8-orcwIBw|aZBjUe5a8n#!x*NT}9-s7Pax{BCd@FnBu<7T%&pe@J5Q1_I0ZOO@t?V zSl$|Yql73W_D!N-ZSu~-;siqCB1A3yLzGPnvy$8!5|Rd#i2eh~01j9hFhb+Y<$N7N zo$y|#DB?eV4R$&4x(FtG_+NwETB541mpAyokA z*Dt@64iK%AxJf;Mj8S+0-a1kZH;2qqi&*vnqB={0^e~)`7>hAp&xs5Y{aQnTU|<aG)-g z_qH+c%G_52A%}!4_Xg20^mGeiYD3r^?o&5A56FnusTu@6#u);sz}I%k=zw#AwT0+kv9hr; zbR~uBM4;xT#?t+@TciSS6JJJTqC<^VDf&&rDLOUGj>sK_u2&3K^H2_C1E{xj?x65$LYI>XvdhrO2(%Juh0UAd2L)EEaf7W zGA23t9V8=mJGeZ$fPp9(jeA>+s}C`hu%u;%tR^eVSY?qjDn*Ep^>Fi4B?e&nsIGyH zBg&17m$hH$9q95KnLJ))ENZTtTyNd|3y$pJ<249AIqZHXzgAJ1Hg?$3B3E8_oy$v8=}2V-gg4y?GW8(Wri_hEmqTa z(-hGe*}8J|DwU1f5CS#L5YOD~ByP-o#P!QWn!0HUA_x^izgqvPn_aTZ9>2M#2wd&J2I|cm=14BsZ2RxJra{CZ!N9I#_Iwlaq?IvAJ*swqf zeXW)33X4JfejuU^#I#Xqofxx3Kr=LE^snq3TPLrHY`q4-0P4NwW!0bR**pkigej*F zCznEfk}%On-VtTAATkA}A~-0I&mtaJ#GvnP-buG^-^4c^iA2FDhT0C1s~HQ~(S0Z` z!iPs7cP7nKQE}y^7t-zZwNxe3lVeH9IE8r{R##ud55_1PM|_(w@O69jMz~mGSf88d zb@R9_^(mcO4S9^U9LWX7QvtbSg!*>i+I#D(h*5o0^ef{Z#=R>+j6>+p5fk*Zt(#W> zp!u@$hiI4LSHp*?0utOE^gI0-lkO4*ZNsHZICIVXjrJ@RuA!!sC`P!nD|E%e(#HLw zMp{5JUg4$SM+%_pgHIt?*f#ZmcfcJ<*#`&0RsvC_gf|1+4K5K9{nnrV=l>j~{L0~# z501a{_kVE#UGxo#&x`}*TspBq8y1QDM^cE(j1u|o7#V&XMu~ceEWev36X@$$ywm8~ z8L~oB_PzV}BFkeR$B3j8eNQ4$Q^cNMdg*eyb;IKIi72NXC#p3?pyT@G%ds3~5+aCo zLFk>;n^@NbI>td-3vuk)Awi_!BDd~SG%$=|10w}@TlQ+??An!=$Xaa%H&fJ$L5K0f zcx!M-4S-H!$khRU9er7;XL(wynB_O;?@OCUAGxn?mh0ipK7^(J8wM8FI2Mgk^={69 z2Z@Uk7g%LtRfi#8?Gzvhf`OdlL}Hlf@|=XE-WBc|S?Xl(rCCVAD_%K7Fg@1yHyVHO zm9w<>@E6KZsAC>Nv{!5+URu0ioSaS$7-W-kH1v=&IL<%5VY>4h1L>29FbdN-Zl%5Z zS+V)T(sJly3*)BYTpQV^#AO?o!9`y))063i=RcdSP)Ij5y^tnmrx25)X@s2U%P(F{ zH?gFr@NcIV&&G0-jg6aWm0IX3uG0i1w^v`j95vI{Y3Vu~5CR+quvU*q>E=`?N!DMv z`a%>CWJX{m#PujqDq^Q_ayd;AwHpIiBOqPlg}PsWtIrFl5Y=*4F)w0KJxH+@%Tk7j z(OcxMn1w-E*+6U>xEN_u)YfRPgjC2lA8CO^I$|Y9$GS7Gk!XaUQ9nzEX;1kZ$sEpW z(g|lNK(M2v1LocnjK;Tu2_2*^Wx|T-|HI!rPMglYwEDg8DiO63p@Ub}yNzcrsi@yY zr*xS~PdSawwVBgVT4JMdA;y~+O@;;MNgSvroJ<|yGak};_`vt>2G_2fSxTS(!spYq z8@H&wm{0SMuzC+bmjUiI#PSt_9CeZlbBilcl()WiE4|2hD=2Fq=h_YOz&QQbv{5mk zp494B_bP_vij~C$RuZnIYnML{u&A4YLr2lE54ump9KIP(zaBcP)V z0&YF#W z-=^3w3?YIaJ{-J9hC3S#9L7ZCUy-WFeGqv8$oilzJ()nnDq_^>M{w2-7VLd=>B90^ zis+Wp=RWsY@}zs|{Dmjd1aa9RD6xmwzVhM==_T^MOA9M$arqoTFQbS5Al+pB(KN}6 zF*w2cEPYb_(-P^wLoD|FgFTEJlOKpz#&zlOM@d5Lr_X-o_aa7IC2Cef^bt``d4eiK z+&fJea*9ff@$uovTnTJr&7qFqtNuc2yiLkjx+K_q zRWRCmhZtJiuR&&z=ZG9(3j`~MUDa3{oeGN>=ElIKeQ_MR4+ztK{EP3L514bFYlXib z3>lMa9{t&0{OB`W@CRP?0KvyQt+zoc%xfqpO@d)8afrOrk2cF?^uh(%1Zv9o9y1?u@B{uds zIW>ndM6vquUKmbmHz{Z*C3f!oW0dzyz_C}j_6mgqy>xc@5dtNL=yNP!g6-89Z;E{H z9>EQ(I;JSHo272+31~`9lH!CtfeNei4d&TJ|_)aFkiur!bVnvzKmUcacKa4lv|WghvKe%%(IhJ< z&P)xbOJ`VMhLxUIhvJ*p;p8d>dPNaj#PS8f#*^EKQi8469Zb{=5!CLwrzX0)%C&8R zEQUhOkO>Dl)&PvI+Tq?YZW)Wu$XOqtI*yM(3hfqsWQcgtW(8*!&0BDWj>=wXbamE~ph7*Q&! zDX!eUP40LDcchJ_jpfR{L-ak45p`~HHa)Vufb~8Z#v5XXQXizj2;56e89WonF>%nw z4YF9k@*H!v_;(`B;hoDDwfq)`?X|xtBR3EhBs7N{jnD_oLvTiNrC$G6tvW zu9YSi(lOPQ9mGLTeLp-7%&;YxQ>Zt%AIN4{&_7ljaAazb^Kv=dm4lJ|MX(2>!88nE z<>!9+S5|)F`@elP5d1q=@4S(g>WYhuICOKe8!X_CgS%|JM@xZ1T4yR=6(S>Kc3g@$ zrzfe&6$U#LnR$mi3RPL&Rwd>bd1#zGDv+U3)g>ED0=xMIezdbWQMaXl4 ztrsRi>KNQgFayq0hj+=`pHP7rMeX>u4G2eFCtJ0V9&IW~gn^*%5!kSX%yJ_W1orK2 z1&V7$vehWMipNJTpJBl`$qkpJF0&S^1lP6M4PX?jeVg^r#M+R07BeE^g{as9y4pDU z(sUXymt#XbdkvRFEqX{+NP!zcd5C`(i(2KuYQ!j9 zcky)%?j9p7X&!YKPOwVEy)%q{xva8|ZD4@@1OsK8dT4c-s}kBBqF@A56p8!{H&GBk zc#(au05}y7+&4+UVho?!T>;#P#lDNQkBtKoTXBDbXd0b^1azz6MU0;?o(Pl_NM!WU zw{5u0V1lB$g)Yvx$CZX8HUP&&bu`3!qlGOX8){z=+~`suP{mp|^f@tXbPV-Un@FF! zwUw@1yPJ;h-AIc|i)kDkyydFa!bo@y{Q^dv90rj{R5G>Fi#I+aI}Nt*1)K&k`NiKv zh-Ff2Omo4n8G<{li~5qmhf)C-M6gjx@hZhs+|B)d_sDvpbw2u;S%&z++El;l3z|_e zXR6M;kBeey&IHDir85Vl3{4?wEKQ=5TvK#!_bvdarL%60K-ESK09gXFy}e7wbDc$J zaJu3Ty?h9#L=r2w$(4a{IGLg;IAm!G-y4D%k%QsZ8l0ac6U-Lr`Y;P#7V$ZDEqJRq zG^pe}6Z=8%Oww3+`{a=IQQPSl7q2OY6W?wzE>~ITz712DP=IJ!5QlK9Lqu}5`+aDU zThUTM-yTw%wYIg9K6&}yq!%}jQjPsR&Yro10a;8lrK7YoTS+h8yOlO>u#oQDQ@{|M zuzQa{KJ`mzolg*uoF1$#=;I1SH0QyGb_4;QhY;LvT^K59LDLX37O8o{jdG+MoN=#+ zJjJqaoD9*-??GX9B7htWa)h}BM+zt{-5v6`6X-sR$d9m&Et?&}dY!^GaRt297#7k! ze*V!^p`Ydq5SAkXWio6lheos7cLFb+*)m_q>l&um_uo7gN zgv3Z~9K#6_kN6a+TI&+86I2`5 z;8o@x{ax$8-HE`00Nb}JMKK@6_KdMj?)QkQz`Jaqca_atwwUXmd*?gSGr(dMb=5}n zex6#b7D!#f&bV~xBJqO#G*u^zNn2aiVT&|jPhTC{gn4-ZW9Pvfw0Fc)9K2^~+GZe_ z^Zoqa{`yn3Swcy1n;c{A)EcTI-iZLG z0|30s=O*vttk1pl$Xt44X$n!N0b{I~6%Dvw>c2AaY>g<1vkM@?Loo0_(u2Ps)_F2y z-bJidzH5a{?BmQ3D{rPNH(pNHZ(c*a;Ktz&^#HPY@=0up`MJgP=(!aV3RvRQZn=BG z9@hWC?opHhuid0Mv#O<6;79!)Gtdj~0L7pZ&@iejd__ zG#aJgheiTP-leY5stY9ZJw8iCifs>o1AWEywx7cw^ORInL+>2zn^!eP%3c__KLJcG z3;>~Ht-Nq}9T2#FmtA#;Ki5o)5q5Mx3oTiMFWfqw*oQ7P(3NG7-reIa+!W){>uWn{ z|1L!ZNVBhf$6KiUSfI_UxV}g9$CRAoEz_^X>{)clP^w-hV`ad33JXdA4i%en_`PlR z>H3`)Z>N`DUc~|?34soufBeyqa6N7a_X)yjK(M#Tb-($m-b7(OQ7Cf4&6e9i>~QZ5 z#!E#guHY?@zBD(T8dP!|&rqmYZVei1lV{+HQtkxZ>V8vj zGi?{^B>X|JzNdj0_S%9Iv3xsL3mK7uRQ!KK`R$kGU7B^@bp!H1}jcSWd&96X3yu&HWX7rI)5 zncom63q@Af&v=7+XmH5G2DcSAfmAN=`mE^;lbL?bC@Q;#d*UKQVd!Fv7erX6OZg2P zw?(At!LD|+YGOiv(PpU%q%U-`Wk4XnTCh=k)G7l#f@3!+uLT~djv-hCJ5{XNsWRoI zd{&>kRC8<`k%_T3Hq2%&NF!pRa2evhNK^>~)!4qlFl-ycufa-(N(bYIaqS&ZetYW< z8>|sVJR(m-qO6%LL^o}<@i9+b54JtYh_Zw*yJ7JG1%x`)GtC!N(0%fz6ay6YN zTeiA(2hn(v#%5fqQ)9=Ux%92yI+d=k-%I2F@8{E*#ijJ*qi0!BNFA9{0=ZN%EvRdR zv~xj$YN|p+tpQ;jm4Gw#L983fz|NIc$7mzSNFqB#bi8NG#Yb=e&R`f1YU`#6Yp0p$ zgbp)~R}=)wGLapZa-#$yvj(B?J0J96`OgnfSI~!F6dk4zQT9}03=?x6u_TqjnI($A z0axiycZlw22^+AmLejdbDRhuYa96tT0`zTkNfA!0W9jw*zEY-+MLGoXn^@(|;~i3W zCB$R4de7xFia&|T?3IJgq5E4z&w3_nA(9sJX!Ci3$k+7zN?N*zm5#0O$>04UI29o_t!|f=zIg5PY4K!^nHQso zAm7kx?dLUl0+%pyd z?4ua}R0j)f)r;;_mk*Kr;X7K6b~PB=)A-w65S$$Yze|OFitWK$aBzg|0;60{BW~HJ zJ_>KkHwVEFgiN9{zq{hyHA<$$3=m)!@f#q3YSo46X5+i+`g=sTChBupstrTP6@)bc z8)X2|1_*gw4h)h!Vi$@)+!DBFHpaMXTD=fUWVJMu=ubm2vz+A+=fn`P1EvUixK&e> z^)R2&@p76ui`6~FjsirpF5lQmFW*InLx3fWy~)Zv+csh0Kk^9siY!viIUbAeXf3it za+ZGlY-Iu|!VWz|xf-ly>>pv*;AYKGTv%ZqL#i_lLzq2P2V*bd3R#w1VEcyZYE1GaN1vZ@? zxD8IYid#~ElU=oFrmj?`=-z4v-qn?CX9CxjQ?*NE3juDdS*alX4QTLmrZGN;8H>?% zZ4hB~h(JPXvUH@=VWAnmuKQ!Q?yjcuV}*3?*=N|v4t>uYEn;W!HN^yMq%w{OhG3ol z2?3BE`Q$FOR+X~cj6Q{5SQx$#t;CPh;ngZy8&R{Oe=~J&hl5;2}Zbvo2P+tVcJrU;9h?45S9K7 zl8<-4W^q#Pj5G09q|te_#pMVZF0(5>g9JcnPZ2qC^@G2016&3-J-`A)z%@2%`r?>u zQWf1aiD=(HbVF_u;t3LpIHsXy{3;MZacVfLTmh9HnURuJ9Vb?jN3n~OERb7*e$&_NBDeKNku==cXR8B>F8 zodTc24MOaS7+|Bcd({zf3ZW4wM^bsNT1}i7f%WgL6x+9Soh3JgcafM6A zIe}{15~G$p=7)ux(Vkq8aS7ka%#;ZJkCC75_KArz#=cfJ_q*WR<(#2n_@m{0Od2v4 zlR;1#h)ReGTuG2LO)Z^`0>jScYDktI{r3tK=P`bRD#W=UTw~e{heJ4-a&+rO*HZO~ zW<+s&{0QRW-LYrJuuylAx^ouz&edxI8=NcpTTc$|_9vsZ`4pMaKoE_0W=DoZk!};G zBO3hZcmKH}Na+Gt=MBiamWw$ZU|uxGMES*P1$^`jzDphdkg zLsdO=I1gMIz7hrCz_DcvIQJR>bJ@L=%u4o383{Jz6EOBZD?$5awu&rp$8yfI8+@Nq zp+4N>BJEKKWseFJm&(LmV)*0g8{`773>hwIvF`#%cTY|eH4a@w+27!Bk$MnnP=sUA zofWZzD z#OQ;p)!TyI%~Rwy7uQ+dDj>^*GJ7D;9S^XX!g$lR7^kY_{>C`r)&qQLLcva!Ig8*P z9L7i5qfIRIgI(5EVO(Jq(!QueQZgU=3?Kt3?^ldx?Lc_k>%W0p^f0pHo?M@8K=>oo zXmJi23N8-NbBeCA^M3ZA11{wj?y)m}_x0K%;L7g`m3b`5Y!?6kp&sL0ww8&3Gt-Ql z0V-naKJL%I{H@=`YNkFJQC&9B08eM-sF)sDp%(9H<+|mt!F?C6MbV!e%h(lNE>|_5 ztk|}Fw=^wI>rt_3@{I&1kp1-iNh5LGMo}Y{b--Ypij&= zF-dm<(2a3TQv(km)?Tq`jQe%P>P9^WkYu1n1Z(wMIN_dPx`cAR>DoZ9;1s`LGefAe zQuJmv#3|K+2MB?4aglHSCF(k^v#wf(K^N3Tc{Iy((vtqyi00>9ogIpOxChA0n=Q7H7e2mp_CD%*R zArJk|m?aPwySG|wtBAqmBp7A@U5XL(JqW_sxEr)oYN!TON)fSKV@pO;m_a}-L_DzT zdNbmF1nb|&5OfHZl!;dpc}a&zvJ=*78IA=)yqJSxRoLNaD0@TVAcklK$>Tdj?2v=8 zLW%JMX9O?=9C}#Y%{3u#T$)Yb+By?XJ833+sz?5e!kf z!`%^4sRQ!5E+aW1@N03MoYrdDKgJ%EZ3e1~NPF=nRg4_)VPnuoSD|sScc}i%8 z0Y+|!C=}a2bcj$9`D%jzMXE?Ll4d5zX$d6RCf+1itx?!e1lyy4lbl@|;gQT*}H=>XLF>JE9}!#(P#Ee*E(q4Ansh+ zIAB*@jkh2~bhZ{W?vrIsAqvEquoubn8VoAN7@x@VFm~>5+6EoQC!>i)59h7g<4n0o zx(U9}LCKIB7sMZxy0>_Cyfw}ERV550ir2u5yLgxt=&jg7!n;S zum=dzK(RmQ+y0${<5I817zHNn%F!Yeu*Lb{048Dqy~|E_SynnuD$~dtSI0T8FM-S& z|8j&pU3`|Kt$nIV+)vZuKUXjq?9U^K`UGDLWx92;7PAS3Hh%IR?Q4R_}Td^a`_Xk%PnB|79@<*D479WWEud5d$&h$h1sv<3&`0YoElwU>}J>{6IUOHiBb4uOd2g{7#|GJPng3N%HW_qWKp$SrPvP(z%% zQqWSJ1D29*H(aRA!Z4bu!5XIW?rmo*WB_PzI37R4wQ15G>go)OC?al@sH? ze=@)r;dMfBB^>U0CbxVzBuwf~^#0%)B#G6)&c-UP4?24o6|s8b<@5)iq68W1eT>C* z=Px`)@f}hH*Kqpm3cfKSALhuG*}7~rBN+4Td98ZjqRwRCw9RiBmK(SVj>6ZBOuDglH8T zG|0Gs7Eb{efd?<5K`x7`i)qC44(YW!w{Cz~_mec7$wM~WnU0DK^=k<#AFi|Vkl)m$ zM-l=N_T*af=+V`%xYt7Kzy&;CdjMkF7?8;zw9Q(nT!0v9@AXyF<>-W1t*$ z_S44U2{p~EUZ4}BUp2BxR(ixbq5zP6XY+8~tut^rrxHWp#etp*Yg7}M`D$gm%v15L z&W#dSxs2a51`8lvX;Z1rlj~N(>_q{9feWiA52zQ*GnQ$}awkAK4LmC9c+h3QCNHuXrFwXv4du!Z#lD{+U7~cXfhUDh%#2$_l~arN4B;{zR(HO| zM5>veXBS*Z1B2rM!s#Hiv|`tWL^Rh0;%uEmfOu&?HT(S z?&Q0ErevA<@VslC3Zxhs1j2_vwAb^S(#T6Rg7l}okTbk=^FSW;%y|MGeYRK{8Uo>r zeHgtRTRq{*x#Gggkq#9iO|CZ%Z!kuJ*MM^uAIEMVa)5~R$O_#(>1a<8$Y*Zh2rT*G z!7*T_Y#vU+c|>LuqT(_ofJa<-`Z+t}R5Ij?JVD_#gO|hceD?AiojXuP4X1HcJVZGtWwYeuY1KZ?%+hMnt?MC)e;fB7IOmR?G;|G8aRa;TFnu zamY%8gVFMpE?RomJXMa1_@+6MUFJ=Wz&DY}8v_Y`@Y>fL*|j2HU_N|kkVP9#BiD2+Pf`QK@3sKb1&V#aU(tb%+sll`0k!yA(JAdzN1ICJv=Ce*9ik#l17x>Afsdo~Ew?_3jVhrws!nTf=h z2^^p|B|JVvj6DZ&xl@1--|7;E+~YY<4PI>m7w%qX2C75RdTC)IJ6W1O>o%9xC z)8&+7!&n68da|xnYi-120$Q~OJ9A2_Rda0eNIP_UnfJf^4P`L zb;n{f`|}B*##kp<&Uy9f6;}IC^OO~~P zHY8u;aRMMVPvE9V9aj&I?UCPg9?cQz#*VksXn!$PSI)6bF=&%hb=Rt zi46L3R5l=Eh-pSHH*)6H2NMW4YA`W=9fXY~7=MGnTlm?zmH=|$(_A_j<0 zUGX^$h60D-l*?cE94^zFBXeYRrWWz|*i3rn={K-i{~EprVNUYd#*jB|v*9=TFCt;N ztlrC|u9@CN{s6cDo?{RIa9VH;b9F-zFQ?C8%+dt5G4!R!?{aP3(sjs=;+#0U802@pB-~{XIl&#FYIB zjAkS#cZ%>h>7R@s;!}K!-z7*cdvIh#3VncE{9t!u%(zycQ;{BeC+=|c(v)bi7rIsS zLD^m-;8dXM6c2B4vg!zr;Dq>;wZNJ9<{t?oh>D2Mxr-Ol&b_tRu*HXSxErfa>l^}5 zZUJ#;Z8bgd*rU{6A@&GMs!xlP)I^= zEj|te%sGebj2Mc@m0o?l497t4zs=ouG8ZZ3M!XJ)J z#&JwBN=7q)+2Ea14-TZK(w8;@XK`MF$Pf-eql5GL{b&khPMgu5C8eh*%BcS#1lo{@ z^oU@ALvciYj~^V}>kTF@dGLn<1ZL$lsEI;%KJvsxN_0${@jwo?Q`l-z?GJJ-C0z$; zi?g$ECZhuA>Q@u+bJQ7|%{km>^KEvpF&^z+T(0JuU6@6eGbRkaKAnZ@24`6L;4lXO zQTYV-2yl_@*pXmvO(^%Oe_af|xVXrI^2bwemuk^9)*lf|t`Z}v6L9a7fN)3I3KFQq z3dUV3Ig9L0TO?-Q$P*PqR|7RCoH3A8c6tn8nQ_@+f6U`4J&3*=#xsfuE#L5NBubT%(jhJBD4Pmy69W`=Z+ zwAkHr#pHg8^d#05wPTEv>`)Wuwv8p<$4vI|Kt6@MJ5QU-Bk6<$!vT9hyKqg}Y^|HT z@bHUa{h{NO`xsz`OvgGnmyt;ZHO@i}5qOguoe+4CNWIYwR!Pf#inL~7%jeYx;Nv10 zIpbglA`F81`7OW_K=H!t5P9CK$ceLjQFKcT@jV-5OlqKGJoR9xa8-!{yT=i$sWF{8 zBqDljaZtgsbwB2PYL(4A?Gn)6rtEYSLNv-GHy@Bq8pgevnV6xT8TW^Dom(bI06rPq zC#tm|3Lh}-=5B7x(!)qn|3{5fsFEzYr8S|8Wrd_O9VAzRr;r#u*rLt0g_i8(YFslR zY%EM6y{?A{$cN?%JW^)z~p2U(Ue(ux$@G1Kr;fQi=iDO3V@;bDl7hYn#WGkEw{ zn8%uIzIbWeBlLg)qLXXABRdRNhJO!^v{fje*rFdP>ue-z+m-`Kp3~ikaqwCG zeD(2A2VC@r=J4uE?ZVqn2Q{b$oJah+;r7~Ho?}4Z!My96_bLQ>`QpfW`0Kj!l5Zy%1I#|rD97P8e_M0AMHHMr%0kNHhNLiaKr(Zb# zSbFjHR@$bzlCl=s%~XZJeFbV6hz2Sn`}Xi(0p|4q{J1Z`2XPL{Y#+Yb&+$7F2^QX> zPOPvs5Md7yL)_zB<$kdeqJTc+ybyJ9MNHeSGs>dVOh5~ZjG7*viPr_y@ur^a>b-@4T4%7Luxh8Optgr&tMadV^}!Rst!a73|w~ zcE%6%#`yu22L*DCMB%N#$6vF{`3}p3K_G!B)U#dS`siMw$n<@{W7A_BB%VvuIicKz z?RBksIB{1L1jNihHufe|pFIF0n}Z@aEL22vMCP1_1@>$L=WYd5F>oHZ zp<;%RK(0s5f#@ODHjlG5N_bUst#sksOgg!;p6(xUt!;1wya1Fw`yb}s0dlh|1)=ah z1tsv!zGc70XNePp>c)y#y#Qx`z<`5u{jC6bbmUFC3)+=~07lqpB&Nljv~9#i`tijP z*yJKhKJH_NQd;iU#`9<(z#uqvLZ6;1VBsr#mJgi6}Qy znV#ptPyp3!ySsHPNZL3qQD#bAw7aT%o$+C%lT{?)Qo+@3<10M|CqjV+FdB&V4*Ix& z#j91Wm<}Xk@kUX;UWJAcV--{h!)Y@z5*+F_MqE^=Ok*mZ`ifJ}TA>5_u~_)Tg#J-9v2s()j>lILIfnfvh7 zfYQJq(AhVTGQ$czFAF0Nz3GN3J|?G4aa$9ed2E%Vh7zK@&GroQi*o=3{RXr(ytE9I zs#aEZ@c3NB)@HGFhni(M+Vr6Pnj;SBOPkr&z5EW5TNIb0s>C8d^|>NDkL%+?0MmT# zja?|w4%{t<5!qhnkv}K-A2wkg^5fSnVVbM6S8z9<^WYYa&q=K)P^o_ATK+6$hQM zQW4#X@g|Z+X4LO|XP8+*flpSequiR0h?fwpAWgJYLLElCoaV5dhsAUd z>i~BA?pPGU8N5%C;EizrFXzfJQ>tDqe%rIp9{k<^`C}W%?fF-zD2qtL>|7>wiCWJo zoEdo_nXjjv@+pqsmYDwO56bK~7!k+7!uGnQ`MFpFe7wz8_HeJ(Z63 zHL~NLRFghWi5e-zuf!&InoW@;^0*|fNGu`VTNLGq*tkx=(<`u=yDTY;2XxT4K@69) zMp7THRWwI72}HZEhEH1a0U&N7s$On`z%nYs?Hep@?Xm-a_eNF-4r_quDs%NQuo`M7 z1ZZj?ydVLd!ovrTsIM1ihSSySY%S$J8WJJ@JO-Q^UrxUd&I{;_2u|Nm!K&o+H8}hz z$R%c^%KEo`+p`B^4P&Ex8ETss@bbE%PfpD+D4i%097^zKeCLAr=9j@Q**QD$Oor5$ zK$XZo(&jTQbTOT#sht6R1PSsY7&GM2`=vJYepvV-F*e@5+ z=>#_Vh-(R;i-fR{4x==dbV|Y||3zVZMjBQ7^#C|MAvLr)fT1damny{_?&pYfZ4U1+ zC+2Qm*lNmXgI2gcGg7nr_(9;td4n3xDZbmIpa0O|IDExZZHmP!{u~G{4wWx=nn~0DEwgJ$%EUp}U@;(p0X9JLC05|{q-s1^nbLp|g`Iv~?BKZhc zOJx+7J|jYLspM;em%jlo&p5>3}Vf3~kn_9H|jNsZ#h?vBDGeFa%=VN1GF3HV~)Y zcKM9UQY0qVI9ubbEzs`~y;6)|wAq(|l@7MWIAx)4dE+H2ODQCzN@a^0u0!JPZL(3q z+AI^(i_hxJs0Njo5vDO`nI-!aQ0B{P4s8om+GT$T1hZ%4{IrYj=t!@ zg%UtU1le8c$@!Vd^yo6NW`6O3P#Qua*onwVj66hc#ZpNOpJM=F{#E@~M4#;+xp_9v z2gd3hxXs{_<8K18yJi{evFO8`tg8^~eg?mqY1zyC=jNy<++hn(U`A0DmCqZlVcdtHO0GVj1%LkX4h;_Tve}^k?S-X0&*NB~w3M8^(4_zq zoN&kqideU#_ep8>Q)?MuBTfx9>ewGb)xYuoeKP&Q)tA|xe>N>s!FZPJla(Jn)q50? zS%v$37`1U~bD}N8GK3$sTTwde(3Bh^8A@-0^bNo0UeX(Ef6yvSQ9}2(Hp2oRCMn`GmfeI#&h$AD#sfU65dA1ia937l*!PnMn{2YF8XKnV zkLkJ6EU;X}Xf9I-HQsdTIU6-SjnYc>|k`^T+|BZw17$(jf}#BD>AyCLfsHEGjl z7E*U*F>OO6n_KJwxb^CFLj7q7g&WsCRczg z=LL-T#Nhl0CC?IP9#P~9Y}(C2Y?B{FBl1=%v7 zdQJrsDu7!r0MMr{U1W>I@c?`oLae#&NdH?=tk`C}Q66+E1SMi7X-B+4LiC~C;A4ce zu1$c9^VG63Fml_6u^f-IhY1wn?xF1y-Q4q1)p4|d-NSV3Ua`1b<>DlK${7-&mztuV!{bC4q!cN6y7IJ7Cu5&^n$pg?bNw@+)O<`EM zL%NTWGf*Hm3Ao^N-i`le%QfIgAe1M#&@B>7;CzuNkDGw=j8b$nG9m5_u+wh_069$Y zt~!w2d~?fv6Atm2-`udXivyWi$(-eTrVRK@o2RG@Ny6=M*o&6Fvk4BTooCO=9@2=it-8eGG1xED}E-^5}YN z-t4{v*Sgc6H!EGjPC;cz4d0W%-;85SFqRA9hnn@UW^MEf}6YYY)mLVvoMw_!z}ao{7+ z6?wW6EhskD=+aK65|j=aTT-L@N0WL3ahB4^^|8*D$$O0~BXSMoTgT-#M;baMYob_b z;1UzL%*VM~VHv>T8j%rPf(W;5+lt){xJC=OfWhSc9MQIF04jclwaM>(_q);($d9iCvb9uFsl#w z=yFb9{scGam{k%IgWO-#>Q`ydm2=hSr;*Hn1S5+1DynU1apBj+-B2c6wYK`pJiU1SQOe0qH*^X64&qSZ%2`~vQYq_@r z?igwyJ+`C(<04V_({khKx%rPer@`@R1W#T3wY{C+J>n6q_3{`Lata`(4J9IS7d@P+%;%eg>@j1wXbGjLFx(E{yihFOjFM}#^59j10xzPUPRykdP89=s42qMHb zNDTvs-`yO>NAp=x`RCvHb?NEHA4M`SPRB}{u|`-zlOX6+jy9te2#=Ek_s`@6wPlJ~ z`c|j=C>||#pB3!dSBc3bFdBqi)LxznO(Sku_!bF)Dqx3=pwS3$K#&rBJl04B0C(ib zo(aQaj4Qq$@jT{VW2g^~S0VVj-m%j7hyU#V`c-x`|0{J?)6*lf(0XOP5Xf9%g~7rM zqDtx#Q4ThA44oo=4F*V6ZgMTs!i4~a*&zmKQc=T1GlBsL^r7pZROmvnE>o$oxMzlh zg!@ezT@ztZZ2>ar9B~D}loXb%@)@Y%qxvjgk?NQc{}7`=6vr8A0pN%DgaZN@j8_9n zJ&hki2id!s7$4I7#-}f(_k7DYGZrM7_X=44Nzdv_{ag1R(O6W9NQ3TG?IE7MUfnNZ zV!WrHC6c&?KKC=$0pHaEQNkX!X6b!C$;->0iV1mT|oRkwI0Kg!0dtH#W%p-W} zEa-AWl+0B^VsTxGIIRz?(s%9vXg31|A{k;4W@S@@gg9M2?^t}afW#(pL~Ia>-@s>Z zzEsCN90$V*owmgGM?d_1?`MBX3KDd;_$?6Z1TuyUaJk^yz)q2IY5hKM`y^MpXD+rI zM8muN#iB8-ZwV9*RhqPkO8NZX9#W%22~nBq%t)FrGzY4#Mhi1e5C**|?jz?-C*I#w zU!%uo=H^}{o*iUHaxvWO&(x*mk8l6h=5{sLn|$UxJDKyGp(dfRO(Ho~N(=($RpY1( z&_~_KX?A3%Cen?p46_=LQ!zn*Q}=3k1Q6(o`GW|kke2||kmwQZX~P9>ZZ_o;QV8R1 z)g3s=1{`euUV*e8yK+Pv}4Q)15eSzwI*F$CliQv1_F>ndEl1H+_U}6@Yu)WM6xA zLB$NA>Q;Y)yt^P(A_(IPsx|oDV@+%woWdeWq17#=fGWD^w1xN_L}4A zr!Rbn9b}H&p>2XK7p5jz1_D>*Ta>vxz|IeAe16Q-=B` zw!WWX`KbL{Xs7-XxKeZY(&#Lugndg$K}`0>?}JykGPEbxy6KC)aUM?h9VJM=au81; zBaZzeKm5Jv{P`u?lM4m1)-7D_9DLD_7PG{ZonlN5fNQxp#wlSi^&kLMmxh$%G9zS+ zIS|M9z%ac>s8fQIptw&lugl}M5SiqW8B|S3KF0%rxRTPggzG*lLD(t&msXy7YMT?U zIbIjRUNt?v_;YmDI$$dy^+Q<4SasRTc813+9Jo5y$rT9DYYEEfA@&%MKz6_}P)Er3 zfRkY5yAF+k_7Lv?&50P(m9q*MB6C!JoIA4|?eJr8WdM_V)q9Hg7JaG$Bs%-@yg=3( z6##bVcRxy6iZ#a|#Jn%`1pxcrzxKZLjoX^Meoh zo*}`p2`6DA@iSvOb>3X%IQWoNeISNGR7Am$BtF187zy#MD;4!=$SWVPt;^(LTMvkt zxf%fRImzhu*5u6i&&5Tr^XH2qcx7dJjZM8ia+e26D282^V?MSdNApk1(2YCYz|&Bp zi?&@fhJ-?tV7vfS9!Jc10K({`TuIz;oyJmdTev5T3VkIflsF$cnTm|U5b;<79&ckS zLyOc+x4EWBaU4j4`_->FYE>BF9)<`Osy-7{8?V zKKC8zz2EsA;vv3Ua${=G-RXP|l86+*5?~;T?**)9&>8cJDh}tw8C^3UaAKb!_2^Gx zQd$9+fE)YI1<}=rj193jNuEt+jEZSVM*xRQ-3d1m6mqQq1jZf4@1`$u_#q46@7!6J z*gkUc;+xj!`gM;lieRsvIJffC=+w2%t$U#t7}#2sHx@ zcnWFYO2*g|nhQ0$96N6zt_>Y}guZ21S+q`RsHJf3P-J9sTL({EPg_X7NRSe0*wZzf!LK z=r+|J4Z>;8NWextmG5*c;?$WwZBrc^&bw9uEh~b34?Ps$7^P6*C7#TaMtoSq#q<8; z^?a7o!7=M{r*T;>0USj=NIB&~xxyn03rc9L|Lhn<0(<9#A zC&f57IhMZtFTRT{e{ZIjUwk30UcXLuW;>p?X1Y#^pt=w_4K`?#DE04sYO32ll?Z}} zAh}b08xQ5urf?$6S2gLp9H~gsbI^iT5-9zAQ0Llew&2daJtoGQQzCy>xyR;+aWI&Z;S^)Ok%53_H|MdIPbMN_&(z)en#M^#aUt3F$ zo?A*^^Tvzm?)A&*+KVry&prPF=hyKo2_-VFu$+-T>SGN&w_j9DRDDL1u~7yiQbkx8 zP!O1XT8!tp7~lWj+}X$0Sylo3*;d-yt?l}?mad)K(AMA>$`FC^AzLPqu|*-mqUaD5 zB`P4`AH)FJKZyQ;21)z?7Zan1#zeuOiBSWLNj40N`zWK`VB2lGZtZQ?+jiUSy3XJ4 zTuLBBw!uK&?(TlQ_kEw|oacO>=Nzylmy6d>=3#m-g(8NCGk)zgM%+<}yp=PUuwWAt zxmhSuz(fPDutaKVQN|DBuW&u?OD zD!V1>s#89ZL>MBNgp zQYDW`sjK+s;B;uX=-etR3(y0othIG*0j?Lj9a#_t^+$;wnJ{RK+0LnUOD&2$%yK?+ zaSf6rFm`CHzrMP5<*y!ljFtG-#|a_$!3Q54z3t9Bp34s&_yVIYF|kbZNOj%vy8^mE z_Yniv0^8*$Yw{6tiT8XO@+wRY&tbmtnrF367eXM4*Z#%{ha-hmuI6i&!wZ|YhJ1Z( zN}O9`I8Fsl4heGQwm?(i|<}t9Cw&Ni;Hguuxf5xnk+^ z745IV;VoXA5Q6>v!$14ko||v}=1wZGUd^Ip+<1?WDF)`p*k7bllX=xK?|@wWfmL36 z7?@VumKvCQ5%HYhc|mcL-!l=-tC%fAMRTkIO+ljS9E)d!;-|5{7vS5p>WsFw)Iy2HQWmB4Hf#y2 zLX++8N_+SAgb308b70T6?FMF>a`SrWAr z;Crd17+>aOi4;iL%WxFOOZ$sE0Fn>`FaR{{X*mVg=Tz>4JS-A+u*cctVlTb)TmmJq zT7V`CRhH|0lbYNusEARCvaW?#(dn;(Sd=akWIpB*5qm<R`bS{1QS*a=1Ol0cRO|p%1XU~tNv@0R7pOUc2aaF4#!cNKBSo8nbc98u z;-^ESvZCUiOO|}@|P+%eCuPufDM{m)n0{IdzpQi6YrVxf~!dydp)y zu2g)~E`tTB5ksMpZqdAfN@ejpOrm2-fv{pw9$z%8SymYfMnv+$KV{OktuN7MkN~;b zG=J{C5Vfu+&r{2cf}K3O{iTsjZp$vc5ClUlRIfFtpzVGLWERtlsKQSF;arXe)@Ze3 zM9Pq=oXdGE1OXn73%E(|KC2Jxjqw@8*B+IFRl!C_*pc9fGK_JG>c8_B4r>2g#)Yd= z>X_~Md%(hPjC#7eB0xCb#vFu^9LY=+HF)!(_w30srXxRHarL!#G0l@YP8z{p{nx+# z)sxp<_a$_!qf3~;6iX^Z@iBl9cB+_RNXj7JE1ir&DHHw1gZYMREuN#@sWwVHRF)=C zk&|kS;kM(o8^AM!FAtFuy#1w4u2lq@W|Bw{aUu7;H~-AtGE=0jbzWKmi=IGcj)P>K z7@B!jXSes!0ZK*;Qa)mwL^ji9Oj$C&Ny^h=Ft!~FjyYzebj&A9HMs>v=gAPBJ~==& zCYPSBk^FGj%cc!EUpYWg1KY2*s$w}oJT_}F8QuDk8lZ+GPS`&WR7606^UQxF9;`cH%f<%vj4Cyv)B z&B-tk*{NoRNLSw30)CXDq9RtGtGn}bS!#B<{gOqV>g#Gr_|B!>-9?SM=mw3;b3K$1 z1|iP5X(0HVa~7t{F8mmsxXF0}iC(k79w*zh3s83xsLA>W(}uB`u4IZ#1SYV1jgpmt z7#mcIWVz5FGSqs}+N@?rx;0hy9VR1XBA6OuR>8va#9TsY*7We4QCRRy zl%))=MP+g+CSVzz!(CwZ7M@W_mIR3p_88Wrk*gfSL2^X)!(rR{?Z|Ga{va}Pa9>}V z-`1KMTbeP&W$m2Af{)m>^JW}UwTsxCELn4uKH?k~I|GgC_5+wg+#**~TXWT?SA2F| z-0W@sC-J=FW6PG88wUn@e#}3sYJ^15C(ynYT3kL^0 zh%*mBR%v}{LvauM;GT5$Su_Ko>7+dakFpSGe3D8kYXEd1<$Ctejg;`9?2`o~Th=S5 zygX$Aw-ZN9n{4*%B`oX9fZF-Nj zt;Z=XA$KdF=w)BYrXy&`RoK;2;SNTWxJon_@!GKW-#69Gy7hu(%VbmU=y*pIJbCAZ z3(s&MtDb-UKflT6^FKkWZmtK(cI?#UsQp*WfUqgF>i-BSp`)P8deHXJO_WgDm->6V zQeRhZv`3dZ^2j$EIv?dxMYGCJT>8maJR<}(4v}tp_L+0jjn{uJ-FN>(=`hNcdO$I0 zuBgQ}%%oE7Y#L312ptSMP28Gl-it+Ea>zlWQK1Ne;IL(7&n$q`cyCIs@_PC)3YuZ( zS5?VsK^WS%CQPxWCe?tLOCS4-Oo44~ZbTa&j=mIgTjx`4hh%vav9e0~Q*bT9bIggp zOK=_5d{C~QvjY@$g8;f`R@Z#viWQ%EViLCR^!bz^cybWuo%hiva=F}7J73OzkBs}9 zhVw(E)wOl3)T&^=2T3i-k5VFuRcvDmm5kf~nrUxO%5`O_54}6R^2)B1?b;j4j1K-9 z9P!P~&1u0o=cb0{mXOmr0miUnt$VcySL2e)7N@`beI1B`a*@?~k_XwR}|{mSSgX={5YT6K47YokIfthS+<636wkB2yFw!+dkm=%W;E+h!w&P^8H3 z9xE#^d!(^t?sqRZj&FGq)+hRWN)hZ$k;6K_zm?5q@83T-bZ4%w?`yff{u$xr0yw2; z!ZwvE0F++*zPoqrOu2o%sbgDvYTv${ggq7jh%mr!h%#fEE^*<;xwBzncyj=xo-SMP zm=$Tl_?4f&EUn+LiOtjY>qQ|W+&DpTv(qt=esquOd`)<{y1ROa^5oOj zZQE1R=?y8zHc>l&<9$MQm}G!o8&NaNB7@_MlC1vl?CRfqd<)xLRCs$!ey?3Q^#nGP$p$Sr#LA{%YPb9zHH`O9x6MQISCdW?Lsa_Ph7Oo%*_I_dcC!^mWDdexyK6D?K()IdkSib#v!Dv~1b3 z9JhVfj&}{glOt|vsd55qIy;Zu-?w+;6&)R0R`u+7c_plBMpt%s^ky)(x)Q*IEgV)6 zDi!vydwfeZvCw?CZ2WgRzz+Kw0F{A?YnoaJu46Z&q(EY6>C(mN`TuOgZUv$IPLrvI z-FIWOq#Z*OHu$c)FH9-UnXqI92nlt% ziK^=MH1_v1a9LVgb9U1hEe86quLn`ENU32jQC&mRXnjM&pDSim{qC&B#=o{MU;d^9 zxk;Fv%I9|-!IOh+ZKVWzN`Lb4!`p8!Z{ND*%AuiwRntnRUS3r?qe@p~20PL!vnJ)0 zk{b;)0pyfu(ou;yLydgoS6LeFKbXd0p>yWUgQBhJJeEGPpp8h;httLv+S!I`|3mgT zA?J+~OMT(vWzi_VL1)NQy=cX~N<}9NABVgx8bRJ3sjK~sD2VtpV~fpiBHIPQ_Y>Bi zhJsC@Ib48kXo{vZDNVEemR&T)g<&HzcKdzjyn1&k+3jiQMs{ zA34!K_*k=M&C~?Y7;kr0O>A{Ay;>}bL&nFZXW7Ags zVJJq8*iGA~rR7&FP21Xc&^Qa(iOh5hDk$SZP#sV13>fEn7CiU5k$K675uk8@oD&Y1 zc*z?ixSk~&P8$GG^VXGFK=vvsw1;g~YvMz!nu&=l1zFZpao|}L#P!Rsxn?tqU~;{9 zhxhz&F~9GQpMQVN2M!({Uqp&&E2cvmlCzD3@iv0)r|T9pH)|MktDur5quM zC@CpVkN)=Y^pABLqIc2V-?=Td&2K={9RjnkRoK75f#UX-$*CLYCopsnMQZJa8SvggZ#D>0tSEX39!l_|(dkd){xr{J&7}@qqC4yVeM(Hv#MM zwQDQ$6B9HUzHXP zAEF>U8*1VFA`aq42d5h0lqq9SF?DPw#&8vm5t{TFD_}~0rsTAKim>$Yz8{SCQ_Q=c pOYSXetm(X%>VU_a!~5m?{{mFpwV_+2s)7Ij002ovPDHLkV1j|-pfLad literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Profile_big_08.png b/TWTW/TWTW/Resources/sharemap/Profile_big_08.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7f0991da4ba3519bd3197bbb21b073f33e69ca GIT binary patch literal 28602 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 IM6N<$f}Hy>+W-In literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Profile_default_08.png b/TWTW/TWTW/Resources/sharemap/Profile_default_08.png new file mode 100644 index 0000000000000000000000000000000000000000..1a78c924b9f68d75756f930171703a40301355b7 GIT binary patch literal 15943 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 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Profile_default_09.png b/TWTW/TWTW/Resources/sharemap/Profile_default_09.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5a531445da12876eab4dfb3302043bb56a5033 GIT binary patch literal 17532 zcmV(;K-<5GP)Pyg07*naRCoc^y?Lx9*L~mlt6O#J?#sJxf3Le=FJw2HZBkZ9DVD9piX3S?5rh$p z2%hm^Ft&lQl*vB{i~tFQK**i|iGd_Q7$hJj6CiM$WG3+d<1CIN*^+FFlw^@2scy2@ z*ZubQ?!MNR&-dKdTtaHIe_V&+mMH>nVEn-)QT9^cyQ<8$1@r$>rFh zwbX1SPP3IHOIFe(S+-oRk|kLo%cWtKWd-Avd0yVKG%_zY^D>nlzp+>>-SYm$wb_5|u6qA9Zg}+ZFK>>AlMjuP@dsxXJ&~r_ zW0_gYOt;VY>sgNff?S}#=6k+*dZio#LH@B{XPTw@%SZqyczb-y+`h#4FXP2;VlUwb z9P#;q&-tDuIWKpo==rY{v+&CmulB{|^_Azm|LekpGyc%FKNN7Y&t<{g-~5d~K8lAw z6=%tZK;aR=7v}Po_d^SfcYrMLJ@5qRyctNQP;*c_L^A=;=Juzj;6)b4k=y6z3+4xT zegnYli=!Dp$Husr9~LYLe48TNvupz_1Px3e41mRp3=WiL3CSaX33ShqG zgtY_}N!0r^p70u53{dfG409mo`MeFsZQJYJwNBIlN?3#A^`K(sT94Y&$|II9R@|+8 z1Uh3}W;4#3#5RtmHl0l^1MI+p=j&eOm)DxLXT2{z**K@l z<*P`0*{0JWl9{tgrEcSK$L<||)Aq-AtXyf?xs`WWqq=012sXE#HCHRPR$j7jRJUAG z<3$4^=8yz`=JTCFj8YpUQyVg9!)&Cc4ru=~t;*^zRlfAtj%)t!^Uog$+*d#R?>{t{ zj{X|*_@j-WX05P(%9nF4lypiGg{{MsMheIAcxb)BiH$~GOOla|lb&^wW9y{@LpB|6 zrbu5zr)TMePWO<<%ocM?wwNwLBfeFOb#O}Uh5m0_GVR&b$`iJA_J^%?>9ToCbt^39 zt+IeTN-}Tt&Gr{8$U?vb+$ls9d*<`<0N7CxZz_!7HxfX#TM6_R+tSfg(9*rw8^U@ zi|#ips5Y%MNi2LYGk=T(Yt&D1bzgkI&T(D3fr_-l=)?x;$cjPX*{!XO&wM{7-S-9V z%OCvz{}K+N z*2(s53Vv-UL~VIfuUt3d#<(pYUGfyv5vtov)m=^9$$URV;~N+m;J0yL$d{+gMnzTsX1f zW z+y8aDpWCrfK7?zOO|3EMaXUfC@CgV4y7YU!2`q^$2Bwh6U;AK8PoBZ6dn9N z;J-17ZmFMOUz(cVv&W zYWCD47oZ8>?%lg@ch0t!nwGDZte9W1;@&yScj}NTpvnt;*dM3RG~a+! zeUc0zz3#i~vDzEi{pqd-;tQ9~p8M!`;$WfmZMW+m`L`dKO(*~8OmPih@r2wR=cfx$ z1oL#C8laZZ7#b>`?ezBSC4l|<;cwZu(%aVM{0`vdko+Yyb|uds1yf*a8Wa^w?E9_wK&! z+`Vtp6KJJ3vdKbhx$eNC<-8SE0CrM<5=3wFE(puHoX%(AysK|~cEk>Cl_dXgfc36?C9FIyKQ zikrd1L1?97i`RmcDwtGZ$p(04o&IebMF%KA_;@k0MbMo@!HJ#`16An4=zM-ZqN!ok&UwY(E zf8}r9e)ct8oUHJosA`zp`HSaUI#*P23$`A8a?$(yY?*8ucWe0W1;=$G+5i z*=~CsOeh`6SuMj;Vp^AQSN&?yvH(*nfotK%7?4sp*DF-5P$*h}l%`SWVhJ-;Sjsir z9sI}&C9`t1ViUM>IN-N99#a9!_oKnFUGFFM!qGSE)z`jZPhEN1&R@P_wS|W5zjDJ$ zXBMn7=ALoSEM&IOhHQpn6L1RfXya|(SAF2SQ)+sDco2=i=Nh(s4GZQtX+M+w$(OD{ z4{vic-cfRIedO0a01y5>6qqL$RyU)6yt})(8%b(khnbHN65H+{+N--S*f-kG+uiiY zX?1De7;{JNZ5R@$A)qpiaWey^Sfv11#2#u*t1WI=l|YQwJ+WxeMtNXC*bt?K0S3Pg z0I@gi*l0LF5&70^E?Er)rNJ3ay9~j|bvmVu^4uh;@nB@7YSoq=-Lk0Nv;N_}RYTuu z)iR!24GO}NNEP^*W5=75(s|EhlJQ-CT(?jAt9^QboMI;3c+eP6CY8T)`~Uv8?0w6o z)84iXr-Q%W3LBn6fEp!tQ_ga(tnS2)G+~Mkn{)QJk+! zCbRA#aGHM(L;ZDD18vX_%}l+sIh^Nz+}U!VT7?F&kMXCoPke1-e%2d*-v;i@5C4Zh z!Qm(C(1GJpE~6X2vC$xhHq#wmjF6Dgux|%P_wA*luiB02b!&Uac9QGb5nLO=O%-Fh z2PHsFY&7m#e>kzu@xVHJxV*N1~ z0bna|X~SmYz@{ZkGr|Cn0`SY!l6y-xPo0%X$~S-&&n=W&R_0v+^$2I7)LOMO8wd?R zoe-~xW+NB}Z;$&X#Ebc3)*V}^-f**Grbrz2YUXS{P!ch6?>S&X@Dy0uqD?bbo1}OC z85|_>Ixe8WsR4htqu!^p|K)|h=KZrb!j*3U_wG;phxd0U{U2*_vIEl12La2qbUiL8 zyH*#K8yZDS(f+PoKl!@7GWMA;2cjK<09_J z>)m&KcT}Mx^Al}B;3oa*LA(8P?Ec%l-1Zi5hqKYomVL!xNmU6%z1SqXuYcBV_*ULZ zyWg=}?d$f^=oOoW$}}vZfG~Te2l!7Nnond4DI5`2>?xSYlvaZiuS>@&O!W$v^-(-% zefkjuCpH`40m--0b6rPMqB??PlW~ z_b%y0#`!EOM&?|_D-wek{xm1O9o+2ycs~E)%lALIBn}ar4= z+&g*IUKqS+;}UX^l&n3$#!L>8Kx|dclNmK*fC%>SnGVqrnN=Z9L4aaP835U_VWnpE z)w*Rk5L0wcsR$6*rWHK3hF7x9g>~E9*tC_kO+2hJ*I*`-uF>%ryLd`t10=Frui5}B zV!|v)m;oWeS;mGgHWpm_^Ci+k1lkqDh;y_EMeFdSt*6~}eRW?PureccOycFva3?;* zA_p!4SUc-s+4iQ#Pfvd8xr@br^`2YW`?};lc(wge&ReL6=iKG=ch0X5g;>DIRUMAT zw%fjIuK?_{Oq77U>d|-`bEyLdVFfto+SVtyLeQU>fUcBxlFSFT5}his$1uO((t6X1 zm`q;Ww%Y23m9YYPN4Oowk!`}MtLHYYwQ<4ffQyyv6se+U$rO;VZ<~-BO9E>UP+wSFw1C0u;~wXWc`Fu)XXK$F9}4nG9-ji|90#HHX0!z`?RC>%oWZfV z)k1$x_dleLGFg($2>6c&pW-TigV!72_LJGCN^oNi?e0d#fuK|7o48L(EF!paG~Bb- zy5F)k_UCLG*~w%d(+f#tYK)Q5{q)c#3MWGLKFY0-3!y0*1h>keC;)7cK`1Ff$+46< zrYP0I(weQUUbH&XefL`rY~+t^ZDrZ2i!>a*Op#i@fF*!U?Zpf#R)vBu8RlRC#noI~ zuqH8t>1af}fqURa=Sn38n7fkwD3{q+BL-cZJ26>)3}Dh`m}i=5Y!W0U7?{ps7c~gb zIlyjC^BW-~bWhLYqo|=O-I9(!!NIqJJ4>RENE^G0xVuPi>IPgxmH};0cJ*jMr3!O?bsgi%3}re+RhF&5)SDgun;WS2lr%1)IRDGt46l zF$(~`Q7hW|+6MVCtcX1T>Fhd>O%6!A-L}?f9ft$Y%JrV#frwrjL`D(GEMdkHHvZoI+iWMpN)3z{gkrA4RVmF_k_o6=KN>xi{qMJnO53|h(D~@^Uf|5lqOU1E|FL2PBJ~vVk5OO_*x`ZQIex`< zhWGKBlrhlMZ(|WK9WnS%klP^=?jZ?zq;iTv>H=nsxB$^q%Ohn0BkTi+6kSYQcN*Wd zWN@1p>n_efVs#{|zOZ4frL$Hkpqw}_$QPOBI4k`=HZFm6fvJ=_M!cqYMi9v3^LWBw zACNiN-Lv7*q2u`&5J&BO&ciurw9H?kT%y8EC^BP87_D{BL zf3RnV!~%K%*(EDGrY1mAn*wM#S7LBeB$przHZbF3O{8|wTfp~+oruqt6w3wN0NM!A z=4C`+0S{}VRkgL&iq#aHX{^}FdC#VY$3(rl#2IGTvkhVjb&E$N9OXI_gUAS=Ae?Tt z%_b8&-rlzMgS$4xeV!n}Ua>*oyk{PkLa_xM@bYUoM+F9Eh`>~tJxFhEBnJe8mutEH z1KS)p_m_PL45-cF6@Sn%hcrjrDIz-$nuD^~KTHQd#!0{F6xt}Bygh0)ERa@T4gEKpM(;NoxgUw!Fyz z!Flj%#x$J3i4~Mdqkx?Y2e<(jRWxk6wE@Z`46 zP*x=(XzN>+?e9D3Q?$%0pm=1nLQ}Ke34KQDurkEp100G$8`?lHQh2@u1>_f&seQoP z8+I*^o6IN^3kD4dQVlSb)o8UXe|$t}8845)*CyN~y8>J8u44uE3S%7==JR)PK09CM zV!TYe(m_0aTxYneVF_G@C9z+TQep+tn9KxD>KHLy+Z*j*0qoffX@g+tB(@?QjY(09 z29$%!Aqhp4NOeLCl^}Lj3UM9=mSGl+Gi**cuUfz~s#NUqwKG4+}wy6kmI^3d^?#ELmQ6p!01%9 zVforJ#UaENj`uM4FbO582!Q~Uv}Jg0xd!hkI%9R${9fI>AregAHMRBUA+Qc@{pNJP z@N}Q~;LhQ@XhY{IsgQcZt?Y9zg~9M+&#zzaJ*fG(NRve7KBGYkW4(}|Xp{gjmO+VB zH1j?}?WRQ}D=iZ&S+K&S%I^k9Zeqo3KqX6rGHF|kSu#UHY>YDDhF-Ghys?!l=j`kw z8#cm@Ewu`E=F)kqF03N4*cRA|9{a!cL|q z7N1}Tiy9KzD&Z1-c9_L+|3QhXi_3_1^H;t}nKndJpx+q+t zbX{nLw8&^Dc0{1%1iMwW0vT}vzcRy3B{eP61}z;HmaH@uzb3Z6vSC-Bc-oehTSUCb z_!6LgfPLxG=2#PjM$^_dTX5#YN^s@Mr8Cw#dkF`Egdxf3)hQ`|_EUn+Vfp3Py9YZ?vXfgMLjC=Ny#N|+P?3JJw7!!9MDk|WxL zaUYQ~St*z8iEB^T^@bGFk(^XIMs9Zz8d=-A2%jEvTdqYMqS7B)xJa6ud&(}&Xn(O>v)a-U zxjSag2t|c5_6f`=?wrEIySoS0+(CM=b1U$)sv|SZH0c&N%93T`8t0Cz@EX!P3LTEB z#&Pin2b=H}$a7#FRp>j2%2L1!2OEN&(2lq|O4Cb09M3jV%q?v`QlbnjWuHv3)Ot*- z0fA{?#`zeyxI{%ohv?sPh-2$O- zI61O2YpZtoz3;`vMPi@;)IRnrg-Q1w*h@EW+e>2 zRgq{wWsq>~pilxxQ;P1|9jIfMOOX*~_C?CQVGC=zsvt#rYTO^&-u*pWSU*D@88Zb1 zo-&0!j~GJ%1>9gb&vqU6<{v;|F6fK!Y8r?Y0Fk7SD^GR63NQyYw{#vGCvmPkHTejU zm#hSFmM+U!%ZXsbDejL#8)#%C$m7PyImL2{YLN$MQ*4CYnE_0O<_-DnOda8sL#nHJ za#@%^ueLTZ)c46(6>L4YK=7o@lwPy5nAARDNe=U zWP@wEjt(#-xA(2SOpJo;hssYgmna1k!k(1qeJ!ZMB0r67u@%N`}0Onk>xa(P7$%85moU0%V5i^&W`*u123CMdZP zibErwQ6(6wQcz|Y?_Ctxq&u|DM#G*yKCs_DuqoP$ zSDC5&Hb285h&U!VCB6J}pXEaUw)@T@;pMC=jysCskbXrXVF?uxFDvVyyw!|prm+#Q zGg35?Ooa(mku6?MF~j6(O}Sa7QXuFfrg6D48Df-MhlqdwWU3^K4d?`Jon1crZYwV3 z$%pw?uP$?ASq`*K1B7I$l|HTWkobj-1%S!hB1y>6jCk;i+va0O`%BAKTH1n2HeB#K zC7?6KBU2XS5YzGYZUysiTg7h`a4J&b8lp^xNbq=hgfb?z zPPAT<&JU1MQv5ZfcO81@5;yMCFO81Cbeljv6;t}C&$OH){FV5+L%8^0M4iPlW_-Gw zccaHiI^Xpde_nYjJRIN!P?fzgc{6y5ID)EV5`xhRsL%LWC?a22A=_Yfg!xRNk**YDq6%3~oPBG^95NkB5@pnMg~51c0JW#{mM0-P#8|y$-m*WxrTp z>dh9#=vDEhWL8F)@WkZ`y+pyIHM?Wpr}*t`0@%W`OXAyF6w(1E0f86b;AjmQ49reXoBj3?5A z{flA3aR!78gog{PPFAo~E-x?I53ndPbF^_X?O&Ov}OXeA}(AD!u$-+@X_7$BudL=BPx0CgL?=AZel&yr|x zbD$$IoK_A16AeJ;v>$R8bP0B!a!eY59Mf51C4e)yEkrp`ZNM~F9t^Gmoe4qidj}M0 z9IX-=%G>W|&)cPD3+#~a$-sPE*;==C#wd>$dBt* zI)VBQaPya_Ttk?!>X|n55l}qn0rSDqCCs$-ws~W;|Cr)f8YJ$WM?ytQLjvcM_`ph7 z2Ya`6?M3X`4HVVzx6D@0{87xR%iQ&JpqQe@29h;B2W3;?tw{!O6@(6Q(ou?tL3|9}%vh7MS@S&~Q#gpUjM2q$d0q; z^TNEc4;)Yg%*AnmPd@XM@}wy)X0E}Fkq9Xu)y#${33+VT2u`{q-4Jkwq}3;wZ5n_s zbkRmzPjB6`_tf5F3&c${6rv~%APnF}P@zqEhpxer3W3ORXXcPnlEb3aHj)}Q>$rf+ zL@+veeit&^Tqy{lL|DR^Uq}p+DvCh~5QKNqiPH5+iuyfj&L#nI2x7T0DJ>G38GRzw zCZy;;1F8aOW<}BdzTt&h)-)Oh4A%RiugpP(XM?!|r zRVdQg96?et6V@kQJHeGp$yFsx8|D~O9M^MD8jVfn+9o-cqanfY z$UHOrv|Gpc9XM%*>U+T8gd}=GD!DxA4Y|aCTpi|cJcf9e9IK#P;9aJW8{`aSsF<_D zr^zb8)E?#;MJwI}=SAEqdQgMed^B%izLox3sZ0QDIIAqf@0^OvNMap${kDcTa+ z{B%wc>=ZDDbs*9;xyP!Qh%4Oh9MQKSPQ{U0Dgofit|N0A za2U7_xE`oC=md|5YKC6}r)zPCh%gcuxQxoGQfSCU(A0ER71uE*s(}KyM9fx~p5St- z%xF#x%J9z9HBjHD?BXnU#SC^zMD6LN)4Ww=2`gOXF3V`{6Wm;qNnGy0;Vovgs%QeA)P{Dd{$#IPI8+tv$s?9h02Y`PKRY zsU9p8q7rF;VD zLrPPr=*q0$`^DU%o zf6Npm+}9^?Guu>&Cjn`Ilf-Iyl%|(D;YgSL3?YZKABkmv0@CPZuJ2(=_1Y)4fB!Zf z8-v{;1WL?z@d9yOdKlrYb&%Md1D3LgAGuN<+Hko*=9>7Ko6rqtOZGcLAf=Z_QP$fD z?E~NjCZP0+21HmONNS(VM^EV@!kN)(&%!>^n@T$iS>Cwr8ylYi*4>Sj_2gRxF0+RV zvOM4A&y)|6+dBa)P465ukst}g`I(*UkFb#OoTPwKO;cu1LP)a7^eu9Y6L_pn)#2qu zvJF&w_d6$q0gvIfWoOMeJCJs$;t&|IFR^2_&;uAWB?Y|pN$PT#Mayg~;m31c7j}$7nq8X<)$TDeC zD%?N9X3%tKbf~K)d^-R#f2T)_{eS zl@4a)(kjGQSp!BCt=~DYY3mH$55Q5At7$Hii!pV8Gl^;FeAG3q#En{;nY&r3hr(Bh_Gh|-X`@V#p%`rGu71&xiri#Kt{n~^(0GBLzmfcghZheBn++-4rY2I zX&1=c3c>Ld$ti0Wn09WTR3E!aJQK(4t`SfFMgie6>tg zRa`WIgH)~=v+}Uh8`}cef&?i#*u7=zsz<=JB&GtLa8;&T4*nK%x;AqEjP#5g77rk@ zV+!|r1cGE=GpMpoGEAvKd0r-^q3CqFw!OP=?UTM_0A)-LkUq-sL|lpL5&Tz$4HcQ1 zo{}x$fKbwPVi{0G1BYYO2Ha&R4YLlBodbr1JDX0#BJWbwn>BKWD;=x{QuHydxh{r~ zxOdkJeWgF1H^TkR9g7znZU8)@q`nQ$9%H-8_LJK?W;C7qE1Mh<7f1K7b+y`C1#v`1 zSo1*civ8?i!2nZ?=@k~KKqR@SEWa@?+G!1jI48Xd}7mk z9h;oM*K{;R0)sK!PAJn@l>;W`Z4k|3a7O@r@BXgs?g!Bha?$$BUZkT_UAY zqcFq6J#KeiwB7qn+uS-&_88Mooj^fqY7yqZn8$Kyl5b;W`Z6I$Z->VQaIFhW!EyP5 zwTmM=;I*@T-)`R~<=^RGwa{^9l!9qm#G*_^4t`XSq(FfnSw89y;a-G95i&>eNUd}A z1u&r0sblN4u^N^zr?KIEW(I-^n34bpNIXLSuv&SijJ1YWx=8JW=z(Oe^V(cD2$M1p zEYvv)Mp6Ihg!+WC->_kc)CokML;Z&+1E0@Y&sAeOH{dQ0Ej^;6he!KJIq4US^$63* zODJeVLl;q2A-@^*4)K)XPePPK+)IztK$XZ?Yq4faXX|$G;OoqU#5T@fA}%LOK$!`8 zDf5O-D~&(y5&-XytV*b{;NwDbXgE5wgX6Z{KRB=lhex(UFkTK%4n<7wna;%PXlFzGGWQcgZ*$*a2yl&JmUa8QkhJQ7NhvWs|m}RolPwvYo(%s>}f%qrjbtjqu3~eyj$OvWn=01HfJkW~!8|A8AgGsG zH`^#L)RN86G#Ts5 zt1sH|(Hq^|FQc^b>=RE|b#sm44H`+R zC4~Qi>XhmtA_iRB73#s09+?5#tXS*uP22j=d#ty8&u)C-^Y+T`e8Ktv9#UJ-M460m zB&xW>t4LT0XW$A6$^vGQ0z<9yXHYT#eEYXq0Nu4muRU$+XV>ugQM(L+w0TCrD2DYe!VqOaWF|6U7%221F@zErBg!o@vRJ z2e(V1agviVnWa+p6`YD<7n@#X|0q&U;{Y?sohkshmLwPVS!&Z$$t?nzEFV)$LS_7n zY>4bZOpQX2yW#)2_x!oux4h%O(0Jj|#?pN%M+$L5k<46_OF>+_<%EUwrL`9RgYb36(909SI*}E5o01 zaWjfRW<8cm5r@u*Ke))4EFBzx#N;b21+_+h9C?o@Hd&^ z0HRmA>-4abT@8rqyV}U6)RTNyRbP6;DyuoA>_^G!lV^W1xW<#>{_das(w*XF{ZfvF zBOX%Vrplahpf0>5T)jL%2GE0M18s0KL`(XmNpqN9|&D4-gx$*AC7 zF6Y-V6NwA3PjL*_32~~XC7=oII$qZyif!iNyhyLChWWI0r_1q>+w5Wxn0qqKf83IrhdkqeU=1#C?)En=xAPLul|dROOgmhrHYXWzK_l5Jvr)R6iiO0P>EPTLvQpeYSM!ioT223#vIiGDBuswbvp zMn0D!ZY84TJQ-qVqx5YfT_yIhbjr6}Oby3kabSU$OV_Zwh%H+tOVPuji0g8r0a7Ly z-0Nbv?k?<7Y(YVNuH&)xE-g_=-P*UwzU=(MD{8L;x0DvYJeagUF3@rey$Z}VVggto zYUxv61tI|L%)Zkp<)#arC7+4O!*ArX!>!_Ge}!@-N|B`0GMP$`T!Zl8(Cfd4L?bOs zSEbkY_qqhQq41z-c(wGB;4(KI5>Mzr6I0s6a~Uc9C#ykgRLzJX=|*3b?^+M1x;0hr zsCZ?-sHwb2MaUsaF2kTN6TMq2vCInFSqV-_V#ah=uJ9pX>L^!nG*F{m9o+6&3tOMn zoq=YvXi(-NzXNJ_e+`gkKngW^P|d7HJp>>x$6H^19o&4S`o%cc!QEtSm#PhQA#SWG zr&PP_Jw?e>YL9%<3GRUeYliU8y}P`aq*426yt{^)!KLKmXXLojD^FPNsAmh^8=RA; z11In--=DZ*rQu_C|7*`N9jWQX>4@aGkY+-+V*oM3>9SZgpl4?cxS%gOZgh zRTV@E%=^p+6`uHbZ4;h5HX}~rl{N6f2w?e;VU;*9#=*)@-Nw=_j!P-eD2a+NK|S1I zF`%%Ov*0n{dSe@WZc0!3g z7r3ysY@1iESik;=RWCkb2LL=gp(-6Gg(^Td{Zqj908|5)#}TMDc#s9DoGFSfbIObv zhgL5Gf(i)rAdG;QPq+d(-&+42&WDUL`|9M5XYh39lFcgYX`EQ^>5;a6wy7M7C( z6_IgLLbI_ArF=M(N-S6!qO>9ikK~-JU`C$NK}Rx zu634Dm9Sg&q>-sc8>tRu%L12NTo=!PYn4^jdfyZPx4k>o_9@nr@)fPHIZ0HTBqeX! zB#8~e0a>3sB1&15rvei_3eicPI)~QR>P=CD;?OE688KV@a`08}a~~$dcq+O2P^wga zbv)_3Pa`jLfLVmb;2)GwfPa0(IhD)eU!*z$DO)F+`t^KcudK8ARCVo_Om-%a#ta@g{b}@xUJ9mjY5G!U;w5TXWi>Y?Fs8A;W z3D=1BPU)zs7?oz{*}2%pr1vq$kO~*O6-y4NExvc=*uqtU`V(wp3byq`JU8_??o2AR z`IK8JRHYc2>5SD7RZ++YQm9BCebJyeI~l1Jrz8Fd712X%`$lEqS5M)X(}KR#>&;&o zj@o~HNMyfG)L)?Fxmc0uufk>h=cG^yOJssx(Om@SLy$Sc3G#d&yXm+9P-TtUte5y( zmW8)<7H^Oz)ZPD<1u~;Jr>F!bQsm)AcL}~!@zBcLETZPCOVmv)H^uhVU`P?=MHd+D z0#}tmRcvH=fS3^|QrvayX#!$U3HLpD@Lfb7$#I4_lFx;pDmanC1{Sf; zwsFrVJHxg(NY0vA!h5C4rx`8f9g1p zo09ek$dDA9TKmvokmNzJs!=y*b&q%cg3VSJY`nrU(z7Moxf0m+wagATnf_3nG8m!^ z38;9DhqPd}pb%LX5>erqV2Wl8LaHRD#8;AgN)i1rR!dNPe)UiN%&k*Y-jH1FsFW(d z%oC5ER&9W6SRmno+pkxz5nK_D5++1a5NEzy{TZvD5hIpjSLhYC7@#~wq|N2&H ztvx&3Ir-dpa#Sr97wHJp{!mM*gBnu(gIlyYn-&sR;RZuMkM+`dyz6(I>y(=$8L8E^ z+(Hec*O^cpr%=)g#8H*;_8Z)fpQ$LXsxT$b!kwYD6`oYqR&~MB&dQ27FHfEX_tPM0 zu$@5QYUi4ZRtD@v;uz(NSIyhrCY(rOkrhZKED)b3NO{8(+DCAofWD_GPj{70DHKt zEG+*LGmUj6Jk5hmGydT=p9u4B0$36&=PSj!(92c9V9FJ$1XQXhD1y#m9ZjzA9r-jL zI+^?G43I>Cp-oiBOOQQ9+YtwGZLPC?VBzg6%b)7@KnAM>*$Ka z8uE${$jZQm#*`x1&O3vp#A{v;eFKCUZuc?jym z_qWi(!=265i=W-U_wpy(?Spfx%j<3$D?{K)J9QF33Ug++;~b^g8F&;5`^3kZ_M$_y zICwhiL!KO%k>`RYbXNpWn;vuRPS6*onXN*lT_XH_! z;yDvYGf}Ywf;POTtU{V7hyz{4(1q-3Sxm434^JX9m!$XBFK&KT&Hpbqb@^@Ehd=BM z7V68N9zxWrOAxOpoz5G4r=n;0hL?K)FeaPU|57MM&Wc9q#njP)Y1Joy1>O~naW8I% z&?uH0(LfX|)CSpruaqF|CP)PMD6c%`4r_ZTGHF?BfsiF$Splw88Vc=YEglxYnfR<|E(WjhLpo2l?l=Ao<2;25oh zl8{=Q0T4N^${~p~D$-1IP`KPz-;ZiRSu>Eib~GRNFL_AA<*H@O1>p`u{~JDDKw( ziiRk*PH1b9Wl-hj1~)_jK?OzP5GxlSx2;P*j8npsrn^YoX>^UrrBDI=0%SLxq=;oa z0w>!PUuE-}T66sM-3$ESyQ-P{_=XGGqO0fZ+f+gZtf>;j36sd4L!Z8VXq6$I&lS?miM)V@? z7C$>Fma;>_ZLwfWPhYjoYmc!)vpCPeVG^mrt;du4M*}oDt;ocX1^zp6F2&ZqieMfMwUGrvV&OP=?o-lX4f3)p*&6k7gF=x*)k|n51guuS z@c#GO5B>N@Y>_p^HA0tlqHD4!5|*(hXmLTI2eZj*OQ8l&p5+oH`rIcuI^yXfREN7& z?KDtDeJDFgt6O2obV+ElQ@8>dL2y(-TlLww?leRTX~eVL(Fud*U02y#@byQmrMa5c${uqrIM88-$! zrjxQRYPb@h5*+?I%juYU3`FSqnU&>_J^qVtJXY|{c)j_vAo-rQ7k;a=u)Tfv|D`z|C#_E>tOBzpyRDDoK^sYgeq7)@jC~{{t zxT^~UQ4g<}Ed~=!DF~y zeZeLqHH$oXufWr#mGun(QBMz*lcPqfR!#eq8Ik9u?>eSTva&MLp9<(7@c3GanZI!U z%$ZMa{i*K`tlIuvCD(P3KTm$3*?#Gz?4#Q+zw!@`jt+iqz=L-dTg$kFH0a?FA)Zc} z0Z9Aiu?1{iH|vmyGottlq>iSNV{yj`*Dr~ z78!=y@N0~nsi!Vg&*MCty+GZBiZhTjt)$$!NhbO(_vJzGA!Zv(lJp!iJvmANSOlm0 z04o5GXTv>ZB>*OFu$F_7U}V4PzY_oe1S&~HK~%LW#~AD$MJRGu%3=8I2Y>kNXTBR1 zJj6@y-!r&6SscvU&wu{^-~N}~lcQ%IOh@NhJj$<%Hg(V1b!g0i^(D=mEWq5<=Zj1? z0js(Da6pusQY_RdKn`jEl+~CI0oM{ma9w$Kx}Xw;>sR^zoOmCz8x&r@^1|~xd8ui^ z8qZZ!yJ7dJIfI*CMM8A_N@(lp@)eM~HwT@ViU=RA!*(kn2vz{JNP(POq$&ZWAz zG5_nDFbMCh)R#W}p}+BwZ)+8(OYgKjl(~00_8s@V^q;cocKiBYnN3HZW)2mI2NMsV zlagcrQ4mGCOq=QfoRn%GI|ZyLg#I~YGDAYNDdSK;sp)63f3>;sVuYk9iKmmZA&9bj zXa(vVVoLc>sLefyNwHvR*~SLfM8EUXJXJY94@^##IX>iZa+LIU2dpQiq&32nk{PFX zMPtH~pvHPSh;I{O68${(E731jkxk2`#xteG`e#4&FaFPY`q{PUd;jzM2KV7DzV^k# zjg#Y(KTDAP7vS1zl_^{0F((ybv3e+_giuj@Wg?tS%N?b31e(B7ZI!&N0&xh%emOF~ z^yx`5&s_bLfNc|0KOmbx?o1&^Ehq3W#bPA14>)aTYQReqGQ@QBs2a-j!exzkxX=_D z$uubYhdi^4)t(1KyRx%MHoD^e7cm3Mx`^HkDt`D6H~i+`sa*e`-{#WJ8~45a{R4yh z@HSF-$NiI^n~VoP&67u-7La9(e%Xg5`S(PtoD_ncY+c=0t}e5Y$Eh#~DttR_jofUv z>0E&;)31%a%G2%wo^htCMlI&^u;a84hIx<8O${zQJcO`^JduA2RYj^E!jaK+Ck&j6 zz4Dug8i^?mNAXK{toiG^JSKp0e?RwpHJAV8W_{_|=8GSHOLXgDAHU!C9~iiAzVQps zbuJEi$DiW)WS^ML;-`QI>zmvcTvo)uFA-qT!{G}U<%KdlN03C;hI>fxDX>y>8U$>1 z%P8yppB>|vGvB~Ci&o}^h*~M~D#Lw=b z6>yR_*b5Pyg07*naRCoc^oq3SuS9Rad+xLF``t>?JJ^P~3GGG~D5c^`}*u;UdO9f?DTn6k& zU@CD6vK3CL%Erb{%KTx62qzX5yC6hhT)`~D1Y?6FEHskPGMc@or>AFn@7MkI{pIsL zzwXhV&adZnzwLK__kQm=-?Q9ve-pC*N5{nRw~x0Xy&JN7Zafkj9iL2Ovg7$= zYfVP$Xud!jvV(58BYaLzW#Gx3Q678yU)4yV0+xP}Y_A=;;~iGqbHE~Iy<{pq z7l}kp#iEIa6GNE?_wAd0^qx2DZ~lFb|L+Cd*WdH?Xs0p%qYLNH{#2(@dR@1%b*Qs; z#X9Q?*6+5=nq>zg6iF~_1gh7wekfwm;Oh7WE?(4yGLuUCapa+27Yd0-6vEPoo?U!uwzyS+$jbtop&34VgoEHyA z+tFzBu~;JY`DkkR{`=l_+bj+IogROu;J)oQ|M=yrYa2h?YS!Oz<@Cw1#=>dqE}yqv z126$G97cu^uYvXauO!bxfC8}oJ^)yH*y4v@YneUAto-Dk+Mv_4`2Jfh%31X%zl6kA z{QJ+OId;-Pj6^Z34+KVk=t-hi-%EykqB0azz>(VTXz!lTNo zek&V~-Fw?q_CxQx^9>OE_kUd9tMB>jd+tA(y|O;{o4sD>?szI2y1Lo2YO8CDryjS< zU%b}_wRM0+-3MJB!C=GD7+R{=sH`6h9JTesCqbNf-QfVKdwS@F9@ig%&VfO=`QWX;l=J@v`| zWSyn63``x};ni($kX*Z7YNgITn&9%9jOX#_H85Yii<0h;&gWxcA_Z~Mbx_5@YA@pb zP`lx1+#h{3K^{tYWRFd}{0`f5+p8^;%~+8~O!7dRjxi0lptIYzp0s_ft2UH~+;?T_ z?RVe#eYkX*=I{A(Avm064IIF4wsBHMJEqCh749l3i35;&go;SmHBdM${M}};v-ujHCs6GXI4A^D7Z0j zT$^hWrLHl?9n%v4%x_`i;9q|&y(!Q+2Yw8NW6TXw10P1?QHv)NmQE!tkxE%C7PAOy zt%(fU)I|iq&awU6#aY1WwJ1o?GU3|>vg7VpllQt7sjk@C*FI?{KKpxi<;oJ=thV(C z@pNEOnux{YmK&MCFo%woORHbG`;$){rwwh;r&nnJ^W~Xbkd>>Y(S?6SpRyv zYZsq=+Gf9eA1+swi(=Um*+86?EPK+f1Q(i*M zQUICBWi8I%crs-9dHD^5hBa*NbSI@?A{7nauTnLqghs}VIhkHK3OO~6rkI-&0( zEeZ{dbPZ`U zBsv!9TP~Ney_4fMf^?=({S1Q-#UeJlx@mDZ@$lpr!1VYTSgX^sGI@qL=Vua0Yr%i* zZVykTZLRJAH?U=;O2g`e$W^GS17-Dl9jF)}b!C_IsD+bxxU*&nK`L+wb8NjCr{b(BVPpA8o-ix0a&S~hqaxCb;Z4s;_NVejat81akZB# z7E7gVG?%nvyGLyrX;p+2N78$^J#9%xf76cb*<+a`U?53d2HXb3bRt0r4D&E~A=*Hr ztkdnnn4}%r9V-`F)})OJ;9g$avemUsfZWMJh{}*+01wAA^a*26yP-%RjWU!vWW*SZ z8GicmQxDn7!NazDY}g_a9GBd{$mzQYyoff!)2dYNeeeAzZ~EAsH@zUxcu`vT;2%CH zI{2NT;si7!wF(5h)#=#9%ggr61OLk!b58=gxRoJqTXtR44}Be}86aVic-qeoCvvzt zQJX;3b4=JvrYCG9o5N6{-dOMmKcxo7B_6XI_wO}K7L!TF07;Ld`boe|Bee+}ezIGZ z#OY5$3mK>-%4-cIPCrM6RanGC<9N=I=B*u|g$~v`jzE`hio_yew4{(9!9n#kq9L;9qchk8% zlthOF6pd=2txn%Aoq5{I7f$ddo#CRg>N@KE7+`vz@;$0QUob_|Q+#gX0N0uTFU1MfVOHV#zVdy~87K#7>DkDM=t%k*$veuGl2BFRi|2WB(OpLgluN5*`+dZ7M%Scun z4n03Aj8Vi+H} zOA)+~4jdh)tzw~I;dId_R^UXi^w&HF`OHYQBs!FojbH#GSBbm8hek^0p0v%as*giB z2&^b$ifoTd0LKZd@q-fWjrCvN0d?o^3&3r)YX3gzz;0hl-{gX|X2%xh=B$D>X~QZcD}36G(JJeZym0<@HVR` z@NfODzv}xw4_rKiS2M$}N)L?$AR&RG17(Y97_uwpPg-~DD$Vl#Hh8*@A~v1S$6(2@ zc_6^+1OUii%>v54$w@oDZ`zhi8@8}kvi%d|wy;q~rQ{JXdGPbz-Mg$=Z_pM_I~*(5 zD+d)Mvw2>_tz5?+054UJx*G=H!pm8F;9=-NoV--pvS9$1goWxW7{DP5K`%N4k9=G` zbC*qmAmc{+0#3By4{2blZY^>qO>)tFCcVdJ`svfZz<_&e^lz9m2ibag{at>M?O)FW z7jpi2@m&Po5-&N=a4p5#Z6cf6;(|p0T3$mJ7tDhPcrhZ1&<_%z?3buPesMCHwjm^I z7^#z2a2SAZ##nvp^jREnC9FHv1l%*17HnpU=%?Mnh3ZU zA==ku#sJY(oa-uw9EJbV@VAmJ4J1FCNg)G0JPf3>yo&z~%^}%JD21YYCgDSJ)o*=I zUXNTe2i-x`$BcRHD&9{IEF?S#8s89Tl3L#K=Q6Mgbb8I&JNW3@aShy$pBThYowo}R zai};`KXO-M08_`sX>YBHj!=;(t`L{up$qgCEIoe}M*DsB46o595CLb^Y_eS=Y>q3L+Q=J)-dlbby-#U^%$207oh*9VSS?QrK-b z9EM+~ZEoR;t*x!w7?!@iu>lCs4bq`&bs8;#0YXy#Hk)mL>sqUciv(>daOiY(ZGnIY zph+FH;2D5T0_st?JArg-Vp6zol6-RCTp9x=>gqL_7^K(*L(4n>+iSTr3N2Bg=Sb*t zXLZ4@oIU0AC4W~^Dqa_;JK)LIL~$v_)~#yw&H&NpK9@s$XI$YV4Qeu!4FWH4xIgv4pkyQET@jR__e# z;?f#!Tf$y>{3eS<2~6m`Lgo~}rs$7{xuP`s+rzKz4*(efGy)MBI!#azOaPt^H*Vn2 z*tEHC{i$7?zryEa(*P$Td&7@3RA9NBbG<0q+G#X?GH3wLV&_S}+kKM~Bbp8JGCngA zPVON|^=20-=~`!N*;9?;9;Xf(4531Cq&1GkRPIyUcl@SfcIz!S+Y}s|A1T;SE{}2I zvt+=>(g;z`kvIM`+p1Ivf6)kjdPtB|osq+DJ)}gEg8I_^E+D86oW^HJEpAj7X%$_y zHr8#1rSzK#K)UdDd9!2_OjNQ`vDn&%rAEuPxUxZLT(M5QjFd-+-jGxYhkhg*k`?~w zA>bT%J?BZ|;^Q{=okwk&aD6y~JJ%OVoW}&nWmG$gQRBFd^=9dZ@A>-0U--&{ zZVcb^o_8U&StO(fD5x?LQ%3r`Ej$AaNb0WvAc2F_h&2F9QZeXbRD6Vd%EWrmBr2pY zm~*E@xk04;{Bs%HbOki3$G9<1f>uZHyDtgQ1v#WG zl42PZ9~kdzk~IK*CrUqcwm9BT;j5DHs5qU!GQKgiCk{2}c^sZk;(Enn_{-zNHpxuv zJN8oBeQe$i&P-Sode~T7vH43EZT9S0yLkSLEnU87n`lD~z?DBx|5_^-?eghoY#Lip z9D=6QPw$)bN$dB!;*9{@cBlF3xDq2$N&lLtfx-$saO&pHoN|Z!oj?CU zd&L`m%sPXpt!-BA+`bwnF;MQrvL?d*>B}+X6MtZ2O z$pT9S)j2_~a9OY21yZMwY}xskIxpHl`Xwz0HrEY20Of8ykIOjt8rR~QJlBuf6X41_ zWbsJk9b8)3vdQ9*jm;dgy@!w4>wom0SQF`8x_ZUVpF3;MKJ}QLKlQX-nVV&t4J%!_ zWV4r-EU|w#G>1W?O#!SSab*{@Fm|Ea?%b{}yX5veogdcnvt~n<68+RfU~!|iOvpPN z?b_Y{<^#6p@XdC1ZiNz~bt{)^Sn-CZ{=|pMP-V4hfN_hHJWpb!B~8BiN^=^V+84x< zWL-eiqp;eg6=Nv%ea>h|#eqdYN!A@Lorb5No?~|eva)899OrSprr$ldO?E+%qcpF} zIp~4a_-sQOK)wxV)bc4O+$KGnIt4sFCH@s<3BCrzpmk|aaath-g>bd?( zvSf^0?%X}%T!5FGBj6#9!|Ld22+rC0?AU8)sY`cGF!eWCJ)%5-jsOnTAIvBIv3HvK5(b{)`*9*POAwS{y@DWQQ7;X5^Lr4<_*pE?%pcPdAP zr7k4vt3zW|rQqIT%4TvYd-Bv}TUuJN3MwIod~%q?3zE?XG=;h~2HqsG6Q$$n9DXUy zC>nz+q_A`rKberUyj8QBs#$1TUurjNTnCqnj`oS5GOTz=Big83AC*(Cq6_#gW%${H z))uOc;UZzwmxNN)(_k<)`l6ts$)io%ErHCn6=O)M1$qw&cGURQ$4d$5i52WE%B0jE zK*)~}_~f*_PVm6k+Vtfrwq&E)uqHxu^Zp5Y$L%-U180|Po!qmkh=SE&Q5yzU(u*Jn zPbU6Il=R*a5x$}?Ml5U*anur(zhOLUYa2CNTwQ}>RRCu;0kG0dshE7wHXK_g5YXyx z63$AH1)kPI(8|fjvy@__R$#`g<>XZLvZ9m315(yzlkJHkopVLF(u6vyGwei zsJUi%gal0rk0YBxouOJ;@El7u$~#0tT>=O~MB{uow2pHxY3hq#alDmwq?pm8rx@+V zFpOatI3@y!xsGxeNK;tXl)tP9i%^rnYk=a^7C}La<(od=k!DD(JG@qoS^lp0Tq1?g z!m$ikp>VeeI8;?CRAwUDXh)^qB#EE2oN^rGpyf*DK(GbMXBRhYawKQ_ig`P@UbE91 zO}8(7iL4H2f;n<<8UJ_`<24pWwRuPL>fh0qM^cJ*Sd$`Y(ZDN^@0cQI&|*DHYRm~p zS%-?1Egx*0%vS<8C&Ppc=yWy#KmgrBs@f4I1X|FATSQa}R^k9E@FL2jNxCH>8axw$ zWyQb&8{(-Hqa?xUgYXhk4csrTEo#xKZUhPlMbHw@T`(PdKfz@52%qIe2xzUtMetyH zZh0hSfDFKtI9i0%rpCwDJkegOw`>Rv)atMNp@U>5NyLc%#ACj6h~&vqcaTi2 zVM*dr02_;nQTx1Yh7&sbZR$#2IGRm>ZqX#X6W_sjyUDOEC&5m5qvSyGs#xvqy+4wd^Ai zl3H2M9+RTBq#FXaFJ7flxo48#CY&Jtjw-~(kBTuN3MAvIO(5GO&frsbcY1s;LToQ^ z{W|mkGRNXidHZeZcx7ZI>2W*&&pk6S^5f-Q#PMl0k%}s{R;I;At@TNug|%o$ISvVj zJemY!+lg3vd_hrb1D-GDsK7~vZ3O}IpqHyFW)#MnP>keQ6eoTx=CjDV9Lzb5k%Xd# zr`NzK7r4CEYD8B9Qx5=E15@=&hNQF%M3@eVkNc$Vlu+q3DqMgGf%laAmBH)q*OM=( zV`IH#39@DK1VXIIb(swL%~3+0WD*}z0SOPe%8K^n^vB|`CpqJ~+^=RJWo@K3lVu?? zLnf__YuCpxBiWcJM#4+=iLZvxsy414QwnYLxh?=`z$`t9lS8^L5-ocZ_~Nv|_~Ou; z@)a_8n>A?y)W+Cl7jisQ4&}4r$mxo*U$~0hc2VnX+2BKcAZPIHmIoF_M@33y=Z)>HvO54Gx3-_S0vTOZI=*sMf5 zW5C}eyGC0IbNMQO^CrAJ&|lC{D6Qoixjw*#p(Kwgi>!n=^%BVpfe@wrA-n?F83{md z5O@n}P_CM&N04fzSQ_MhuiE4q>ZfduWGG5dAzxjJt!S}dmHFI}PVKAE`N0ubtR4K^ zOG#tU`Uwg2&Q}Da!Z}H(ihu=@GESN~HSGEWzyd-uok#Vg4!Ve{T>3~4IZdCT4m{g# zunPz7(-i4jJ$O{tP`0esCH=>Bw3^`SVTyKSERitbwNsCadj{{?=SE8b1x)>HWZqxKt)DTNg{?G zj9mldh4L*911}wu9dx}-O_iSTchE=q!#F2Gic9PqdbSe=>#r0{Gsr0XTT%^0Q|h!V zsv8557Jh1{iEG9{Wt?gl52g8PcpIvUaYr5%7r%CyhzI~BX*N&T-9zf632nfO!)5Ab zL_R5C$cgLgqP*^lLKJ+!wW6wlcpgqy5?p;`8x}?nW2Kb_=t(Y@=QkLW91>AfI1J#@ z7@jNa#+c9swB>7M8Yg@#$=46(NGe4eo|nJ47f%!p@z{WKKD!c#iXhFOkmMdj082TNNodvn}E5owTT~$QDam!EN}}t zkUFc|ny3VxMF#FuFx|hDMY1CkNpvN${40+|FQi@cnQ_CoR! z=tql*ZM#pLBxSe;u%ZBs6mJ5`k^7jS526jZXgzrg1Ur^em<}f}bR2M`IsjJa27!kU z*6BfCk$zbac{|XHsJ5OW_TrzpD!B}fV zu1Ta!=>soF6uMlG^CY=^pI-s*2B7lNQI?v;;8g+6HS{Gvl!K78$6)#{`mex3fTL{g zA1d^8S4h4mlAa*=h~ktF$Tl?^d~wgDjns$QFssBFVF_v>^gI;9 z;ezQyyeo;>M$aXg=i1?tAea!Ux&U8sl(lZA5K^8(3c2@X7dTHDd%0vXxmf{5I4miZ zgr|s!(_!igGI3NI!^L+saVo?c9p6RhEI)S;tQybUWW&=3ZTEE1M)J@FYOVnzpd@!# zvL_vw#07kYKJ{?LLhUU&M%Mt6>Bj$*=RsdOY%dVF(2nZMR1PWw*QQTZcvf1cB^#|2 z%Wdq63OFywH-iGgBq^0lNw~zd34m3kD!Fbd*P)6@s3zKl@A+;=i1HZ}$J0=#&5M8< zc+-L8w^Db?t*Tr;u(E-g$iXJy1RRB?O3OhFNMfB(S(7J;)UtY?K`1Griz_pgg7125 z{74xe3Yz7KD5}e_c$p>T7alZ8VGb-eeZYqI9JW2A_@*Xu^m||x_FgCe(BRbZTsCPp z9NOi1fQ!@|*xG4)<+>N1P>ttfU`kkq$|A+V@=F5WxyO=vCkoffU&i^>1h{)ipReUs zI9v8Wo<{(zgi2mQpt_P;NpF|@ifZTDqz8H}3QiED2xC*?R2+@B)h0j*Y2n^y$;n02 z#p~s2%MJ|@g&-+P$W-AZiM|I9exX3M6{d=hurD6HDd`;VAk6@*^9Fpb3K@4>kd(fb zT9Ir?ql)EHS@Ng}{7HP#WPaF&_Z?%^c!ZVK9M-#UmzT<1TkeyJQ;-@!Qq+`0qi#63 ziJV$n#(dJ#c_nz0i-IBgITET->2wo)p4!QJoiz=7tQbAy5z< zate$?Rz@GmQ&39NT|Fj7G*@QA%VhqPwUf8vtRQWXcf$BMvn^K+xnovnWrwIGB1;u& zw*YsDczTGXkBSH%afK0F)#;;7aP{!$i9rqIr_y1i^OA6E7$6l|>$y~LkU(mX3UylU zn^ZDIf+zxLO5kMK?^`GqsW>OC$#+hkyJGWKNtY15h9yn3k*9X7NKxM~eJVf?d-sgn zNtVk8m1Rp36~^d8o4&aVL@N=rBZ^hgHO0Tm87RA<2^i2f)uhSU^Flo+CCu2>F9&y9 zdIcPg4(+I9ibVo|->htTMo^nkLTI6krtpi<&!7T{9a!N|r0uAKy=F;=+_E~xql~I& z(z3F{wnRlt2;&ukuT=FHq60w`B$e@#ym0}oOjVrO)#eNtsbE(QmKm@kbi_RcOsPU_ zUnW9|6YN;ejP15vV_7siYLB11Y|lJ-#(5Nv%_XDD2sf8EY~^aw_U)f$X@8f^Ope;( z@+RwAyDijw#+P1VcsO0O0`xr0mHVeKSL*8AN_$Zjt(f1N{sKNN+(0UG-V6RWjp!wIf_t9_@*qW;4*0t^*$jp?$1hj%Nj_|=;#Ri zo1ipm%r-VBt+%yc(dxPz${5n&W2VRG~BV02p)szy(QVS>s zAi@sr7Uz!+XYAmfU4;0!8eBlupHn=9m0Hjqpu(LbzE#4RK-E-MFE>lojdFVud?}9$ zmBPx)trAuEaz1>VoIGg5lsfI78baOL_Q+qJvg+~*{lo1^=9m~Q`=bdAIEy+;&Up>m%+v^*^Cqk_vL9EEeHzMw(Z>X9aN=jxFK8m;OmK>RY8zAz11rNTgDktD z^*YafxmSX{V0lZ1OF%aGoA(58`lJ=)7-nVzBa~Ln`4fOh58-e2I~%pSAl`{%FceToY9*0!!IBCJ_?{ap zI^pR=W=>S0g*`pIosk)DQ~vBSODA))^LXb-AAFc%MIwp+n9D_6@i@NE@3V)z!HAvP2jKx4)nzT97y7AuUf;=M^I5Dy>xgZWM|d zVVy7`BZwBap+6a`VlKv#dz@P0b-OTknfG*_=t6EOu>d(_h2z@BsujLee;~;Xt;zWY z$KY`t$cpu~@-SDzKSTn?3qy8v-)_`NRfo(n1Fb2?$soi}UOpr#gC|w-r>aSDvewDC zw+yGSJ|@yCY^uoCCkA?cc99z3byTd)d92AHp|Z|$zf^)6V?t=&H6zY@ zX%qd7Q!)dv}he5 zXo0oJI+|X~OD`o%qgKYBSi3O-`W>@7IX-l$=+hi23v=l3o3{h1|?2 z91pK(CIji^dfOoH$glXcLatzT6O{&)neie3?_#e3lEZ8(nOG-Mkyj9w--!AoNUnI{ zvQ!U{RiLI#CE`#SCeeX*Aw~hBh@(F|l(4I-lo8Eep}L$@A%-ReFDg3JPI9edF-E}Q zp}s2WqYXuXS{s|6oA-7laTDAHWH7lO^(Ea1_v*U}Kzi;L;&;msqrMU-EwK7?zyU|b z(IP{aVnXA%o-9ssUW#k)9#i-ou}4oX*xdXApsrh^y1|kW8U~y&BLK zlx-y(3necINIAkfn8)n{R9zl<54Bi^9xiSXokIsRQ$;&Qy;KfWY+;Zpw5mY}0dbj# zJtlxjf@o#IjU+A05PFUl366~JxQzkh>w5W>#wjmHA+DlG zxE_qgz5Nw9q0Tx(Yf{{j^C{~eoakbpCIqnLgwRx%F@k9G;*Tkr` ziGsG^C&ej!3YSArftG%B;|TeHVUjWOi?zIhUu~h0UHG*V?Cn(*dW^#2HCw+j&xGJZ zNK`C;wrso_moAZk6Mq3?M2WLkM<;m=JC*G)c&<32gy>8o>6B<>1)vnFl}=cRv4+1dHd~(Az?l zY!m9TFQ2f9Q8wFQ=vGRbw!%#zYN%CffEyF1LOje~H6*p|p|1=W*)V3dkC94cM>&_y zQ7O2vQn3rC&sn0mi5b8^u>hi)R#(=qDw^N>-mA=UvK~g_O;|(TIhLkJy+L`g$=$$u(+P`-H zx93pngF(XFvGiXq(ZbsC4nUScSgtEd>)Jm2J{3^xO>(0(3Pv`lBio>~RQniOJ?#sN z@HwlubXb$AoiinJ2&|HjohJMoRL+Z*5ZHmVgXk^C=ZOKb&b z6J~pa$eu%h8V!`P|}vy>h|OlXKeZ8Q&hCD zZ7MzjCE(I95eNa6cMw=!s31wZszqy}&Z=aT?->F3be`|>JyBMY)!)-69=3_yd+e5% z--b`F+r;d%Sv0GbA0wdxm0;0zUkDZXrAZdSZ|r1G;R>b*l(IHPLSNcMx9!9er|t2p zEK#ulTDpA6;#8L(J9yB>C&qk-k_xJ&&Z-lZ0qd~hA>Ue5lgbUBVh9RU`Nb{x>dno! z%42XBNg^wP5R!1|w&(@|yiFbA*R5XI^7VB@vSOt;+eA@m)#c`qR#LZqntVig>dxIr zqqg^-n_afcXJ>8g{3+{}vARfqEJ;oZDbQe5Pte2*=%ItpK6{a}1WHqJeHvuIw1nes z6`ZLMS9KM7t?ZUK{ySg)B3?$?4%~Eu%|H<&BzHEse?pZuR8$fnxbdCxSbt^Nvbb~# zq2+Fg6ql%|`T7H2vIoEN1uOc4!!(IkMX~(I}Ghm0+;xKm!V-B(1&}3twqf zCSNE#%;*DfQ<=CE82bQ*7g*#>)mcUjr8+*6?^wWy}8 zj!U9QM-iJZ1NlTLR7Ua`;1+df8w*4@Yl|c~6y@}7YqN|C#th_f<+Otbo>qpbO=m0X zRjX^if`COMa3un_4zHz36^!Uf3z_m;HR$>}yXwF3Wwsiu*#28y;`xU>l20a^UgOX6 zo3EiDL}b!baWJ4SF0R|Nr%&5skNl<0KlLd5eZX$Hg}n0a-Bv)VlelN<(*S-`0$#v& z@rYFE*w;C&oVG6pNGzxljNpk3s6!uB|}}^n#^$-FhpE%cWFiWBrPq z{`0Fg`@|zQe&o1K?A`CFOi`CYR?(XHTpLVQSC?(>nJ4V>g=bmjDB8grZn3xA@nbeU z0~Zqp@8lag+t>B237p%8`0E0cG1aO~E3pu}g|<=U)6R?zJsM!-P?`P4=N^3+K6)kI z11KtT(Ffa51}_{|Q3Z11VC(NpsA@+eZ*ic>pkAD`II1yt84ghjhQw-Oq8$GQGGk8r5{w?xJGDeFY zyvO?ptB1`!=_vo=nkm(y5lO{ais^GspCz0&lC9ca)y~p_U$;-V%Hpc03MILk5NVQB z+;39EUnQL!AUM8R-NHpA7>QA^hkx4U&LyGtrtLj+(2n2wa@&9SDA_g@ZNujh9xfvR z(DFJSvV-a#0sU)1RjS9R;1O+c+u3yzN9$}luVD-1n{)4oYxlgl25vH&zQ0!9{Ee1Y zMk%TE1L+A2nq>I8W1A!Nr@_)ml>)kCl*F-;F+^lTE;n#6sLA~bu|B2>7)?VTAQa8X z!fVM#$&n~hNmNcQ0vRPB5l}%jBY0E$&{Q57fN?w+bP(y0cA{&5P9J3~mH5`GhkRaz zJsxB*iD4u+J;Gf{b|10PT^Of>+`bFx*0T8MsPfe0K{!{})Q?v=&}T_(TT~#4g$7jl zC=W>6zbZt2C6?4z(8Nt9zmA3^xwT9mH!+n;-@k*@HE`ein!U5X{@HJzXw|DPOJR8f zLI_Y4uzIG$od^BZ3;2unY!lus0*-$VsZo?OMqv+RG!FKIu*cM z$^cfF5Zyzkv{~a0PIyR!)-?fJS)CwOjz1?{bH~<@5*~>eJ#d&36jss zDrpZcDB%F`xww_Vq~O^+_eW^4owRjj#WGt=4z&)dcj(|zcv*fFe>Vm%V|=|z9OJ0{ z5xp=j6-z~l@xylT_$_wez#asE{BJt&UZjW#t#d;;N%F$Fb$~B^$_ywgz&!O(U2A2cF%MzUtR~k~ z#;>dg;Fj1hQ({x&782Zoev;f4CXSoeV0#ob%hjRL{Cxpt!SCmR``*_KmwxN>Pu^Rv zmOsG0H1C+`%%K&Koa4`RE-xerdPA<)TAw8I0G0(T=S=k&sZq)f$JKc?BtSedO)4@( zJ#82DmqjL{)yCpRdsK##tCQ-tStmoo@itIX)Ut<98mD$8hOrYD#Q-@mI>9Yl@og*I z+T}-HYX@F(8>p3WMu%BA1hC!L&z*D&{nGo zlUZ`msQb>VUz;~)7+vSZ&V&rD2-c1jA16xe| zCN5VMu44tq&z32xmaDy&eoSqJwX zeG01|Tw5tn-+Ro2RTU7$lK1}ZJ8!)zIIcfl0IohfaAf*Jr=L0h_DX4O&+r(PhJHAd z{!ATm=><2vE5P++eUPziW3~ul=!1-| zxLKpFmsX*!&iv$_!yn>}7aT7N?wvP{S3mldGj~-s*1n`&+(}$BA*d#UW>INgUpsiN zmu!MUdbtN!XcG__xVj+=r`bSSRHUcn6?qCRY7&-bFW@U~Sc3YnsaL+q@-w?}@)NeY zK{Yy#xjP$bg*LQ_yUWr`8oxSDF1N3Wa=24Df+UX)%h}@kIzH&tH8vxXkJU_8RcbH4 zmh~?^AOqSXnFn_&Bb>ogP#C)iJ!uiZ3-zFgI?p?3%|LX-kK8>~uxmJa-60;(W}4K{ z@LexIbO)8)V$(@@c$bat+3mMlQR;4LV%RP%ZQ13EAjH`XCPIlD z#qw#Yf3mE%rH~>e)QLC{C_DoeF&h}37}bm#P?%8hAiEr8yh<2KEu;!G-SK2`o&Q#0 zd(@h=VW{Q8Ge@v$gb+^xyc|3OjTSkYwM_mzM5)9>bz zFM7PF25Uy;3sx-z zsCuY^TZ!;Y@c`0Gs zP2I;#RM6!nMj;9T;i4dzz%B?;U!E7JycD$BNZuex#P|MU=)keNgHgZu@9zq(Rw+LA z&CR#3FP`~UX>IXnkvl*8eZxfPTngK{-KyNL0AR`L8qgMdRV&~bNYygM-AWr!n#8RI zSd?rmu%rX9IcjwW7+!6Gk~bZVAkhpw%YtAb8@BTcivX%TE3?Sa?n4(ytnOAiAQ=(U z;8A(ShBSwNinah)pPLHFf6Z`%AyqT35dW+4MpU5OMVdfD>veIYvI$q$;8p(D0Jt3h z1tPzEIi7YsYIDuxxdXeRHqWGrd*1$;zv1TaH22*P`M!nenL9$=!I|}ys~!pMoFunK z1p2_skf8YF*`Ha<<>r5DMjH z#lvjJ=f*?Ik8%Y8IlxU)Hcaa7f+dZB2X+5+@t{DF`s;3~%C;#r>6JGCtOZz=?B}W4 z8N!1Q1zm3R?L0wBBZbszc2GgJ;rvQ>)F*!kWHuVsH*gPo{WHnJnE!L4Egd6K$3cR0}eT4%dbg|N7RD#tU9Pq)pA7#`$_M_#GfQ*Pm-faRU@_sk&0Dv08PO z`YT6}f}54B(T14CD_870msjipZsSTUZB_01!GCqbyFC&;r)jh^IJonNC*d{zRB`&1 zU;3ptU3zZBfBm!X30$2n3BKWm+up+6NAKHW1~*rig3Qy4w5>)v#J$TljHI&x1lLBJ z^yFjK@o&X{a`fvYnKckij_%|vsn!H+;s!~AlI#v|D$zq*P3S?(Ks`WI6^s@Zb|g$x zBx*^qUN#_2xwg1Kf}y}NCm;Q$t@7Vg_3>9lWSSQpuKwHL z>b0g&^$zt7HpvjGLx=YbAG+x+-;2cRd>!AFbAzuu_gfsyt9SqBubla8b!+|J^`(V9 zS)!&Sxlko~u0Qmu#O|1Ur)qJQ#(Uh^Nlv;_c9Kd}4Q>#tr^!(5+zLzJDk)T3%b1!pqdy>qFGWD=u}DbKvcg^6ZAmFk?QPgvx?ojq zQKedm#d9ZYWtL1F0g3L=%pK*NKfCzDiaOOp{pfI7jk&W_7nexUq2AIYV&;r8vOZJzw_YyZ&gbh|C$@;{0njd*|^e&gw3iY(*j@ zFuW=?6^Lcjeu(umZCchXPKv{_@U-U3DZ%=bP?jG7o&sV0s;WrU1V|IY6lQ2IFHN&a zg;1L|I)t?==UJjZ^-bI4zasIf>Qw*$0$@o*K~zwMIKn3t@WsMlA02%_y8HTn*kY_W z$gdNm`VJQ+hfV2Ig>ae8euF+Voc?$wGxXb^e)r$*f0g=y!KHV8yq{bIPd@OmZ(jN^ z_rQ5qvtE5iYkm1;B2ev$)Xwg1tVH&n|E7TIM>+IWd`nd@W?2AS#i`eQ8x*hWM-(95 z)xw|3lM+O1%mG*jDZ(5(e+nZ(I~$8@ws`ts?$G=#3}*$k2UtJ^MgY_jxK^N9q2Rq1 zz;$aS8?e-_fQJ9)0Z>^{CPyT)db(aQ5uWx%JhnBE`M8FE4N0 zh*a*S49d$5&RtpxqCI?L?X>aTj-0Pr07e&+{O%_PBQLBJ- zx1bOCyPQs2s60HYo5@Epe7?xouCtEWxF}4^RF0dmcJ+^uV|8`Tz0%pu7&- z7kzs2p;%H;uRJ?RahF zYJBeLZ^h~x3*1Hw(GF?jL5vw-r5u|FC$A48(N&DqS}dJeOC+Kz;a=!Ms98JP&5zA~ h<};ts_x?eT{|lxx9_09B1sMPU002ovPDHLkV1gsn?Ii#J literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Sharemap_marker_bad_badge_big.png b/TWTW/TWTW/Resources/sharemap/Sharemap_marker_bad_badge_big.png new file mode 100644 index 0000000000000000000000000000000000000000..2b129c85af44d3ba5580ea2e25fcae82f91f43d3 GIT binary patch literal 1393 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 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Sharemap_marker_me_badge_big.png b/TWTW/TWTW/Resources/sharemap/Sharemap_marker_me_badge_big.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b82979c05b84b37b8f432e860d5fcdbb2c17a7 GIT binary patch literal 2357 zcmV-53Ci|~P)Px-?@2^KRCodHTx)C;RTMsVcDvg*g+igBC1^pc5+aQ;28s`S;SULqAQ}=48VyDR z8c;}lWMWJd1ih^)K%sgeWv!GniAYW)5+kIPB|=aMT;Tc( zLWm1oI>YAcZ8k&YYay3{_1oVrsIEs!!YlkdU6`(;dw*1*ng zeM}p@Q`beLU#-RX@_-Ui^IBVVAQ*g_f7L}KsVc_(`d=l8dxzNU_xUy*eW|>u{|%Zg z34ziuez9F(9df|NiR;Q=p6cQUVhsLW1PS z5s!CuvtDr|!Q}~0_lt-d_15C^k+9BgFXM;Y8|!X923=R>qiNUpXlivH)r|B~)i4k7 z7!cEVtf1y|VLE!ci}p2zXzxEkYHSWtFdjKVba7J~N;QxEr(V$!v(Y3f7%#1{YmCHWe+E8l>Wf!lWTdz=dr+P`3!hrT_HVHUqoa1S5JqvaBq2M&qdnO z*h!a}Ah+?%v&lbl%<>~kMZkTox8szEz+e~*2DWqety3H2o700+3+RQrOQ@n)Q%|L> z+}aVLH^09?pYOZGPoar%iHxJ!QLo(-<6$fMP>htbXB5{{8+ zA?4TOAzHcP935&6Ios#ig&)!Tj_Z|wIZwnsN{Wao{lqOIBEMncN2txrs?Dbj^UJ8v zmsB(AR|mA*8I-haTRV>f?YJV9neznmsvRxn1@Ycl>dgR(#b? zm}zX|$HedRPwQ>Wh)aYyJDk|74vZjS%i?mHT9ujczy_9}(8%$}Lm#y{$iM*VA6Ypq z-fR+gh&QK5=j?!RC7AEZue1G8GHapJ14-AalzzVeyM~}cNk|N;))&dF< zGyPqAUVn|p<&^7P`2;MWetNDVrM1KUmJs33ZF8m+ zP-(t>EBEQR#{<)E=cZ(j*CtxX^YX(fnl|)T0 zGO>3PfkdksM%QyvC0+T1s1sMd1WZU6*~WQQ13On3J%Xo{1@=iUAhVRK=Ei1WH;FJ) z?gn<`7?EDfRRcC)w5)r(fi!HsaOFhn1QMW4A@}-S(d~fIQ@ z0i(u-tZCSR!sbgh8;Drf5DnUf@ggi$B7hNCqdRJHBF`GaPRL>#j@MZ^Z@>twQ4=FH zPFC323+zP>6;rW-1C80SiLf?ghXNTYR&bErBV&wTWORv#*3FA1it>z*Fvf)`R$7VM&+*&vr^W%bzFDhY35}Eesw6;QW&MVtVo362lkx zHP8l(z#27qhKUe|nG9oh8}lke8r5a$)DpeCucf75w5Rmdrn9D#>6*%cF&aa_HE|fT z#zECfC{;3T=ppGeH%4%vLBglrbYFANoTGaFN|e(*MnICJ8aU9PV^k~mvNR`ChCD&- zm^`{?QhM_t&}FFx4!jU^R=xZ$j}vB20>UlqB=;pJfy_5ze;8s^jf;7lBSc(Z#2SiX z&SV$+H7ex@w!BCq!~|nX&CjtsE{z-RAvL9lL2aN7*nm;7!{EROs37L#OpUSlf_e?Y zt+`WD-}cAiC)EXz;!uxbItEK%Qx$r^jvE_4AOCt=RWG1k%T;q@v#=XPK-SBBx!D2_ z317NLZtGrG@)MYV%{IntVCM>h2vgfEHd_}!$A}HsTr*&DYBa@WOV@1>0l?5UV;jr@ z4;>@6$#TVj1(+-YR$#V{Z6b_4Kp{V|PGCD8I>uZvU{NIo&~aP)p1^1mfdi>|-{6IY z9a=)ni7oZPZomL6wlPMC+3jO4V7hl$^(!aVaK>i2RSBWU*H4ybL`#Vzt@Oll5A@%3(V~?n)gQ68;&cR~vwWkVKY>M|9Lrfw77E*r>aT`_OP_$;l>Qwb9 zRvCg*_^KMP0Fzp$mg5oug({@}YQ%{J%fb)avbtxWC%9F&zyK`qRJS0c$E=~UgmOGl zIs~XIW@eWteN96LZP?|EeYhv|UzBcB>Z#PGZ_m`^#+#AJp6Hj*urpnU~YAJE~-)^a3ms1EoqzFTip}9m(XZegRe`1Y&km z$1NVQB+Tl0cX^;*i6%}PV8yJ8%iZ@%_Bdf2k!(Y_&U^=K2)`unCTqz5+XOcu*70EY bM;iYFFaAe4gJ44@00000NkvXXu0mjfWQAg3 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Sharemap_marker_me_badge_normal.png b/TWTW/TWTW/Resources/sharemap/Sharemap_marker_me_badge_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..f945d5c8b355238e8667246bb997e77ab6f373de GIT binary patch literal 2200 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 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/sharemap_marker_crown_badge_normal.png b/TWTW/TWTW/Resources/sharemap/sharemap_marker_crown_badge_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..44448d56a2ee1fa33ccc7574a9fc0bea8eaceabd GIT binary patch literal 1877 zcmV-b2demqP)Px+4@pEpRA>d&nrUoQRTRh1JZ9-kf$0=lT88ep5ktVnEf^a>WUE+HG@2+MTw+Lw zA}E-Ed?=6z6$C}-*TRBrk&Th zozlWdruV-4?mhQ+-n+}W=hZ@EAOiyfPJf_rb#J8SafjW0htuhtnU>~oq&d99Phw^86>At(~qQZi_coh`9+#PLi>)cUX zoWD~Hud72U3{#Ml0ijT6R#&k5Ty9SGbfXSHpFDL&f;YFc8gGr5pOKv<4S9HR*$`tI zn_Aj3+*9VeT&_zaDH_p$*4EZCo89rP@u|18w$b5_kJ0JxeM*HZaBgg3T6W>rY8a30a zd{6X2kFH!wPd`~nHk(zp7kv!W2Lc;Qii+M&q%ffYfG;jA+{+Dv!OOH`_kKG6_di^8 zUD7$X-%49Iy-aTRR9%0K&$l6w5yKjQVdHkYPxF(n_4%pl&Arsp+O8|To|){dX|(P2 z4OCQ^FT25;2nK@-hZ{~q48Vl#jrP^>m97)ph>ov%gbA zW0U+LpNfD5Oe|mpGp^+-1dp(!Fn<>c;2x~oxFzKs7P`h#uwx(Gvr~6FF8chNXBQRh zmTzE^W?93X!M73C@#T;dvSOubvxN1* z21W>&!EVJdkXyi?A4%TWUQJk4Mw*zO47YU5pzqY_AE@ivhBTc1WObtL+279TyEE7| zoMBmMeV~D}3Dc(L7W(w~SA^6|RxW!;dX?}j%a<=Pt15LRqZ3MSU}6Egh66Yk;3PE` z0@rxO(#5(eO6Tca`26*HKA8*{S-@@;es^SYdb;%P5c*Iv zAhvTO748)0}a?%t}zdu z$Z$LpOH!NIn&rl}=fJ!4-I*V`?hTPHDtmx7zVxDG5v=`!b-FOBQvxFsXl(j`NfBtZ zS_k8kTsDy@96>O#fECQRmIfeGQdF=W(J$l?C64!9P(D$Dpf5+R!3b7n(G3t5h468K zZy-vHKad$u-^L3+a@eJham61T~&Id8XrCcTaGY5 z|9Ydp0a%0^_%gyn2_bGoiN%CrgU2mJpXi&z>|g?$5gsrx2A}}ZUwj!sNE_F1c@ZVX z(-<#7U&hEZSilq?nFh}g15k)KJid$|4}lSQmE$od&`swtMrG5y5EKsWVAJ~rZ}{>;ioV2L&R(2a;00%P!r%szC(2ZB>( z9OK*vRvOh0-P|_mR2XtY{i{LJ;PDmV0Nx1y>|weJ#X~2$7RF52zuWu={T#(wQ9rO1 P00000NkvXXu0mjf~rqJ z-FJ<#R>_!iezU5+s)rh5MX4&wpdk|>zkBx%O-@!y{coxK&x;8E_Zwe9LHf5KbOY(S zX*gQAd4gS_@5CXFW>5+_d$1)`9SVkcJC8tx-o1mRvewjf(^XOwFn6?P1^;H7KQBnL0;$|yM^JnEAUg*;8wZe$otK4!U4WZcfSrTlzaOf<(Oe)F0_sxI z{~haZOPI>a&CN-Gjm^{3lhu=x)zQV0jf0<`pN$>J1_ZMFMXpo8 z|A*S!{}0;LO&$8be*d4suA1IXP&Rd_tE0P%`QL@Jp#CS6lYpcP6zt~cqUq>p_wQL$ zwQ_WGbhUDHqL9?!X62yJv37tsdb<7#ucRa(=iurFb})y^NeNT^RbaKYh6r%;NOE%X zfY^EX#DN?fATDuUX?_qlh>sn_Cn+TW{wMLF4u7-VhTTHW)rbb}mvZ*q2iR2)S0F#-f`48pX> z*wdsLdL&|l)b^K^?U)bw8a@@^&?l`INkx77xhz*i^W!ctiCX#_Ehwp6Ufn`3$)L59 z%?ANKB%}9sQz7RPTOp{4R{i!h5^`l|#<9Qo+`08Evd^p&?)h+hxfS*JNcgyzd(%R? zeD{2KUfOkje<#`Wc;{Pi{z-+d$0bj#q&bFe4adQY+vTFMUF0+e{=BuE#S@i zihgt}!>9Arr&!&8_0S-DdrJ#T3aclV+sP5Ws=4`7sdDLaup-^o8wzHbC)V)OzC`|& zT+_fiS72)5M3xDp(b-pz<4g2_f&sSyeuPM~5 zT&Qbmij9kl8;ZiI)y(xi5KO6VsYsFEPtexJ?;Z$9Yx!_R4}ak?-6Smh#{^<3LTCK4 zovc#k{|hHq)!nTrhV?N_ky`>|anbK#HmytZ@xrs)WCi(*H!bxbAmR@HMPjBW5u8`Lf%jcPpCHa#AzuP|~8YI7yMN z#^FPCy?Y1kZc!dLukZb@{;l0^t?t)r6OFgcOMhv`;NN$F`^X;#T&;0kz2Sl>aZ}Lt zQlMovz@rsWMt4H3YM6rxe1|qNn`V;3+V#*$Q;>=b3YQHxRXyKmF}58(wI¬alD) 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 D(zy)X literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/svc_off.png b/TWTW/TWTW/Resources/svc_off.png new file mode 100644 index 0000000000000000000000000000000000000000..ced4b5d61128d60d02feeaad998d8a967c8d9479 GIT binary patch literal 10942 zcmZ{KWl$VV+wMXLEE1d`!QFy;7T3kyg1fuBySps%AOQjd3l`jU7q{R}aF$@fKHi__ z$ElIKrl;dl_DpFmr>+D5_|XFZArSz;zqg{0BLKjY0{}QS0RV(@002T4$S*a}+Y4kf1z9P; z>;I18u8Q=x5)==xk~GQ&Iy%}%PNXfhc>sW^04yc0>GONP(>KL(#c=aM@Nn(stX)Uj z@@zrN&~V+bi&_s?4ly=#m=e{#zMmc`D;HIqh}D1644ZK{tS=!o26cM65rrx`_lm;_ zbqqm~l8VUjbMw4goz{Zkdb7vpT)oWI)y=NEHFwyP>&3*leg`e5>4ZD8a_8ju-A31) zf6ybnPp0SPmZ@?fh-$)kpEv(=-KOn?lkfU3L7&UZduIs9cPEPCV;y|oJfzdG<92QL zvCqFO!x?Za5%XvD{wes+gy5leXkqiMg1$Ay7w_{^cQMT6a1^Xn=Z|ely&pe%ktOZk z4@itgzp?<17qZ-8L4iCZ&vWR6u!3Tw6qfn+b|<6=BoO6t$6c>~;O6TB+8q5Y|0MC88-(S7|BtU|$Sc&S*+ z``&y+e&o-;dtSFL7|S=_UnWrmcD&AA1lINV-?2g5U)ziBUeoC!wlZ~KS4XAE$0|W^ zjbBK&uOQFkJyC=-`@U6quKeP&^^Vs=&{QxxWza)*u;4%I*8$P1JScMShfsIeHe^7* ziMK7NdeDn}Sl$q~pEy^M&I}$puL$bMt=On zQ@?3t@3XUSyd7WualG-98CyAM)`rKkqw6XWPH)&=S0aEF)8e@L;!-;EgxC9ua`7;> zl^t|N*vSdx*Iy(_U}|aJy+Ed-9TtH6!Il;bz1YUClW$N*O9*fFluQFMry7Usuy$Y2 zjEASG8+bkbkQ#L9A^ZB(-L^V z9PPtIiHpSg)_eNths0wxK#83P)2pV5SVXMQciY(Nh=}%FKb2D@s4`n4{o}%Y2R?03 zW@l#$20bAa9&WZbG~6Vu+Ni#I2|2>L-Li(t z>4eVMo?ie|tf3dqriSq;Xz5=ZHs~;T#_wUDw@}ryV)U6;r)Gd1gYR4i3DxojqvtQGeFfFEyN1#GtwCMX(HN= z1+hp4ieHYBU%Wq;uO0ZlWTS+?%o2gL)V~7ft*l$SjF~(~lAo7@KXpEziBgX^w0aiw zxD*l^gT~sg4_B6#i#I8zPj0Ffn0bypPqiEzarz}sa7>F)sp~S#&xcp_%8)GNvb=PS zo>;Qjg2=&Q&E21-?r`wk=6{h=p?&ns-}z4<2Q-Bmo3@V*gTS0^X?k?M!Y%83Oe%_5gtMW@PVic`%W z*SJeAi%#Hh7a|D^Z4LvqwtdzPYyQYY2P26JCl94icjmbQQK&rZ`(wa_GE^hP<+w<% zmWp0MMLwtLtVW$a>(2=ds`BgaH05h9<>Sypbb&L7%fVYAZQ3!P%v03s>p7ASeFaWZ z)JrmG6}ZbZBelDtT>NOtHth2Yr{T~$%kTd z>K&xh5!37V6za^5Ch9E;#UFy{t-LtX7lVJ7-VBNqd!>rG(z)|u&!}eAIxXTPnV+kU0qm4hWL10-;t3QH2@OOF zsh^2_&5?!y8!owPlo4X`4Ynp5^2&y$&e8a&3&#bgD|egMYq6rcZX@+0EKGxKoc;W5 z-=w7luer%t?DM>Olum~n@{1TSB(1C}uF7PcxHB@oVw|&_=Fv<3gvEr#i2u+tFgTe1 z(=`8`pi$F2fd(uKB(0652g)@d`f?mu6@$a&@wL`$;W`hzu^lB zEB*B2szHzgC(6WMzDqG0cO@lufw`kU};B86g!Zw&M+%PE7VgZbTuN|b2eynSRQ zq*<1|YF-jG^#=7gkP3J%LcdwOV|D2Ioz*vb9HQgq5Du3k(BSVJyK?1beJbF)gwLEV zn7%iCPG&q-bJfqu_9^bL|C;GBXt0NrnBTXawB!XuP&Di2^rRme`4mpD9NNxXW2+n1 zQI4M|sD!9?dbow-vDe}vQPpZIcWGN^(0X(j{)B;LBtcW=cjxcFG34iei#+t*8|EaU zl~Tjob~`pLiX71D>>Ws!{GLfv&TOFv+n<<#bll^2Wkv*U3@9oq?$o?@EwHC&vRw07 z&$x@g-fO3iGt1BcYB{Yg5td)9SUcHavHweFWiz&z`Z3@$K49Z6=|zAB!K?A+f)zPy zRNWKp9(nm={0ppUh)^3GmdWpP8Qs%NcXZd#{Tc&wB=yarJjGre&CMlB)xlV>A|O^& zi>YQK{8)6j-!ujP8_OW*{z6Be_a(Pr-LSBz%8;~-XSoj2ws=~WbSlzsZ6~+{6#GN;G^+BDc1!2 zI6FG}B*}jRIEjAoplpjO`l&}B=5j6mdAl(ApHYN5AzgrlBh23zGBi7O1uH9pJ7QeN zpLZUa5;hWV|RrThlNQ6?*Yz1XD4sN z0)4Y+we!vyx9w#9odobFtWw)vj!8k#o7V+KVA2l%37Q(X7A|Am$X?B8&lQg7<59?F zbMblYV%!ghw*BEkCbpr^7m3ey`mL+(6r_fs{)9ih8XN zXSZ}lLhcFHDglYR?4r=w@@t~>Cifr|S*%x%VbM5@WYwY^v(KoyDO3U?+J%aY=)rxW%@XL2alt6{0qc~GYeujQ?-|1hfkL-b|3%7I! zR=4W+Q2ur-bnU|kaj{bE{k<*Ur&Cl1x2(lIQ?JR5#EUx9!I0Ro^e_-n!P^uOATe{qA)FH$${~%AV#HEm%7ClN<3!>VUYOR>Da|QSsLRI=)w{oN9I^!^ zqAS#K@OM<0=(u+gB4ofZFF!zkP4z#CNR*BtQ~hRK{LMgokhNVY+2o4ML{sR$4K574 zvNzBbdI$7^UhMmm2cgSi3XlGX9B{~A3B@K?DI%dNH>;hKITZA7Z9c+qlc_2@&Lr$X z^=hTt-9qa*^i85b;y|*e`XN=xRk;5sGE7t$^v^b_NB}lDiE$@-2}sAoBhnC93Kx$a zTLje(v$55&rF|3bFGl-X^Liqu%t&cr)i~~g@BZ>6WG^XcJ-rP-;<}%;2Q`Wg zPNo8L&nZjQYOl9amt6mj+6%Vb8MQ#qO7v|3$fq$A*&Ur8jRQL-X@2Ht@ukA@%ZoK> zC!|CuADmc6oIeRLLUvi_G{XT@bc=#znv5#qOp2u(X1>0;BRziwWX}crpYJx4)6!;K zfrT3v-a}dyocn zV6xRLYJjh}Qky|7NRju)5DzjAL@*P`XVQ z05)yxiqGPDWEp4 zJ}jrl2cdBSh#*fJQAiuN!{WB%jM&x?<^sdHM;Nn-aZeI=?j0VM8T&3Mj_qRdim=G9 zE$DtQdC;z;IEnY3iM{79*zY8H?)zWCVAoVH|4f;3m`mAJAXv9*_N3-|&s}Bu+^g@y zA1roGet&k28Bhg#K%_atYXT$0qO@t;!~Ki*>91&cUaP4eUt)K1JlYgzRfsXE#t>&~ zLjOv9S4y^{qgBGQIM-VwNFgF!j+K76;D$qaQIFe zA0H2TJauO*Pf^E}p}MilOuR+*b&^Yq*mmh%zw1nueEeWvT_pR9d(D3YLD_h=)8m-y zjv`m`AklxzV@K|M^(qc-?s!gVu2KDP-j4Bn_Ul+nU3|LUhO{%*yuAEWX z5cv46jnUe+J={8aJ|BUFg$4#OvM%lE>;B?ZZ+%yQA>$ZUJp6lD;offWS$0Fwsg+v| zYI8pVPIGo~Rl|R2bov#)0>e19+g z_q)IvQ5!Xn3p6-`;u6%zT5eQVnjxD-tEl|5?e)d~3Y6T2n@&#*PU9xUxRgZs1`7@R z{H=oazifAti~P!YJ01q_9qEeuV?08i?V)%c{Vdic-IJLbULuTD(9N24l}_Ns)w_$n zJ1PwPxpaTQo=RQA2Nfw(iULD3j@jaGzyaW&eMWHVO23JtX&O`2w51hW63d>iavsKI zV4dQvT-hN_Ts>y~;?pM55R;ZFr1_(YuZ2JvuHw|>mIIFA2g&F;cd2RX74wy(Ym>+2 zYiylM02w$7`yPS%YLqtzL^p-3yE>3g(?5+Zoy3TdVp>2wmDCb={!`X!!YrGM*uzjL^l10PSaF34s5GSlR!MisDnuMyLv z@KkZQ7(GKq8)-m_){gL z&Gf{Hm5awn;xUV*)gc{ZB^~A3&6Y?W8T*V>mzp82TM&A(7EWI2Qa(yeVMKO@I7v+b z1gQ`!&ok-@82Ro4VNYMI#*~Ze0|CT+QrY=Xsm?dTA4_ELzvsGvJme7-5f$vi)0M!O zT-)U)hF&ZXZ4?hLQYdo?k3dZWBVDe8*2)n*Mmj?1_b}`T(+~=L!6+VZ!&1aUc}C6} z2PsD7B8jH`hs7miAZb{CE6g!<{NF+Iu~m|8NO+==eDJdMkMnIs3e(4V77`T<)OX^i zk3fR(xUpHP!;i`CPkS1myZ-dfr*YJO&unjhXZ~2ilU>mi7Oxwn4*3RRsa!`z1L+?! zf@3ppeQ%TKZ8gomt0mz@@r%+@crl%gtGPKUujbMB$NnYPea{<<9Y;OcME9KYiCTqo=F+!Zl#(Br ziEaw?OsWF9@=PM{%74Suj}svg8%WA%mt~Yt_228{uC<4!j*!F=2ZbG}F$#;4;{Fl2Ov0Ud_ zyQgobf2p)`TX4t`VMIfW10ofPl-Z5VoSc#(&%C!{v9s;55$#(U8Fi!zrMD2`#>R3M zl#5L5a%~p`Jw}WmO{eP}+46KUTfi_AZUyU_a(=mK7(+d7`3LSfZaGqz4F{7<9GAg}0u|NI~* z^5>|FUx5V=?HH0!GKW=`{PEDPK z00>kU=a%Q?Pq2^Sf4knd@yW z{01|byF*wAyE%PYH8IO$N=XLJiDMOnSUo!+qW-Z?{z#_TmEQ&0?ts_a=$iIWE*8!D zk8D&5i*mApdf!JC2^0vZSbW3>C)YsD!v(sB0$k0B+U}u;#!vW!S<0>^o8gva4|#Gw z58rl`!T>lTi#<&X6pD)+-}WR3t66Y`i`0BrS#DD-ohj3=;vmAP*ZsFHlIWLSinXS~ z4L|Z;trU>)RcbV#$@q=YyFt>TW2&V$-e#3CM{KyWd`(DXl^xq3^M)1<4lYcrtkC|* zO8=bEqZ~QT-~r3w$~6IY^C;~Y>m-Un5%qFRqm5K7)e{)VWG+#LtH~}0Pk08ppowl_ z*|=Z4>4w%60*9kN%jfVSwnK6kIRhSEDc5<}0T zuw68F%b%n8a5WGk5clVfXECSxc)wdvn@qs^-3e)b2v?j^oc+Ee<}1y^ zO_8;)E~sY*)(GVzsHvsaBoK`mN0Se4mfo1VGyk8@;#sJX>;hFR>&YE-8p(WDR0wB}Dnj$=cQy1-9DP5-I7hDxy&64eYP1pQ(hk%99pX_RbaCKY|OM~dmT zl38fDXXc9Usj3+Xa3Vy2(H8_aQj78do9s&HvP~-{R(?sn$vFkN<+vlKzg;8BC#LE> z9;h|aQB+fht%zX+n%0Q}8uixR?{|wyP|8Z9FZ=am9=zx)l5zchTw*%7UWS#J*qHf! zAI;Pqa1o%s>?+Zuo`~6H?xrYC++Hwz(m`-?5YT4feVV4)2PlR?xjn4F+_GuR9!Brg z#QlbbGBfa{rv(v-FypBSr*sm8q>;PTV`Ete4q7ivyu3aY9?m$`QB|qct@VxXixAqK z@EjA^xh7#t8_J0zBr&E@_U$v78tnFlmRkIhsQ6-LZXN;0cQs&&!* zMZ8@3OZ&!=l*IJ8xO~mLY0cbELxYh2r&Oe9Ka0dgW@11I$s9{q4??(FY!lQ;j3A6Y0RSYuIJJGPp)pK^Et#U?O;p}TQ#Z{GWA>s^Np z4~C2}YOS+2-W$JI@`Ru2Ef-C$zvP0XYp?KFJ8He$pgs8%?7m?xNhJNES{P^~_YW3S(TClnleRO1G?oiRnRb%GVlgXylYqb4J zVrTd*9#5HRmVdJ8F2kLZcUssA6x7!xzQkTcBXy&|whUm2c2>j1#2OjVZ@NNa)fo8a zqN0)#u8tXVW{h%&0#THdTJMj7Yt8Q(7}17Vgx-{bqlLm>av{H^yZA&P`RvhRzT~Od zTp7eww=?a-SWngKwX>cR9?Dicg*x*m<$7_8dA(R;lhvAPt}O5F@^HxLD6>Bz@!LNfE*r(OmFqXB}*?qnsK3_7qtSljH;*BaIPa+M)1`z z(>ZeI$9$gPc8UOecJt9HYtdI6PaPL2h}fVRDOBYf?;9mvj$cT~A-q7D@KH`Ch2gON zfs0FZi?-D*w0F1(_txVQo zPG^i6lDHI+G?L|4)wBen#HjoapVSNnG`KAufVCQkqWx=#{8dOYx<;KjSAz;^YY_rG z)n}L})-+c1BoUd+neqw7iAeJIk&{uTe|aS*-ySYWS&#A8R%Kbz$0Og#tG3E}z5x{aR-mN$wG=+qArc z1x_mQx6hNC{1dh!;cV75yZ*$xPoPAjj#krTpnHb%FYF9YT-@{rWysgi|1y}LzS^hE zK7Ksj{jseDo&h&?{#5K(r&oBZo_s-nCYMl}Y6|oSGR5W+sz z?*9}$f4Dtg=@We|zf-OAnQY++ejZ}D-wnR*NQe@)Yi6c+9=+J{f|@uR?HQ>TNX1a| z^i%635DC;sJ`~a{mJI?ilW18k$ZLlzs>c48~36^otFpp ztBT-%e^%`h*coq~M*-UMI7sB^Uk=_BR{%Z#+sw{`(tr8rg^i38jYUC~#PW0Xr1SOp z!rIjphmH;_cxmA2U)?ME#^XlO_R)<0LvGQ7Z4Gb0)9z~$yXcER&+8+_HkRnEtH{e$ zaQvaKqKeAZHdb&<=^g1o`Ot@q$(VtVb5-sIhm@~2-XD@*@<)7@I)XwXBL#ndk{(gQ ze;;tmZG6yN*Pb8zq)|tsf_uLCJka^z-%S`Vm2z!&1ZHx!zwG@GesZ1{JWMjnh1%8f zYj}8A2qs8RPp_-HJa&4@3bi7$=PkM)G)D@ZnwtVa4|^_s`S|$Se6A2hUv`6wf?qFQ zbJq6WM2(T)r{Jr_*3Qh4mjQ-{>1dHj6p>4Wpu0Pf{*A!Lhi2nPiih!CWAlf8L74%n zPvIFajEA#+*)x=V*Z4iptFH+?cRwgtzb_(`qbUW!hnf_X_e&H{r*11yWc@y5DWbAcv9Xx@5=o<+k+0W}m2Zp6Eq9KS2k)+b1g1H8T?tes6 z?C}R*8^aIyyK-B*ZytR&A2&w+{^eP1fu?_Bni36$jKwl7E-kem7Iyglok@mIOJb>2 zE$SM7-S6=|xxDl#XUr(oc zMvY&FdJeivA0N7spHPC}46jrwLA$nPe|5jE7O$So*zwx(ebTurcBHS6irsD1qo~Lz z(Y7zvq$+*mu}Kr<=8)2@BW1Cp7|YwPFHO6j_Sr87@r>V89G|$>o@cUvqXCMYR9W(E zhPSHk2N^`b_%fZ33>(mbXsm|%da*ou(oS@KF<57^epIvRD^%Nrm{IrfD{z zD8akN*E{jnf&n({!7stVv4&p`a|>&>BFa|m>g&x5t(qd$gNTV|bbeu@r**`^ohaHq zAIQxlVpJ`72%QL6S81|THd<`1RPXn8Y}|PJK3$DGY+MAgWXeZMMq|P?L~qCwW+q`U zx6MG=8DH4#+4WxgcAoY{)>y>56_7}>_ZNM7a7RsehQ(`_u$X?GFiKsmSoSSbW91? zTn;4vGZm6;9(BrFOH=prW^8`uZg#@E`&}uLkfr5D&{4;QzBKI5UxR3%7-RLx?AbYa zfX!r%Vd_k=dxZ67%sNPyRH>e+>7iokE_TuyGYmr9(3Yd-Jg=%wS@s5o>VN%;f`hzR z9ZGRW1Q=AAmuGv_29Mt`u`|#Gz85PS;@&&19p{c8s#eu3lTck7$!IS}D^8S3D;Ytg zgVdf6(BXNY2g{^=8+7f|Yq{|K+JQMyLS8jG!>F>2B2uAJbP)J@AE?6}%JTE^yr3yy zFZe<5sh8Tq7mJT!EUy2Q3)@RtUU1CC#>P8}(RlXa=Ey_nbh#mX+a<;`slA=pLdmq2 zF}}a9zN&k6+on~dek5x}9M-M~#JTYk&Z~{J{~5>Pw<=6=IQfBwMu)r+LmHuUCdIBf z?(o5;fI!Ci4^vwj8E8tjLQfEP!1}IG_-U--r7T2j9Lg0%yI?Wknb3}bR(9x&DOm^GAS}m60d+?sOF}f4 z&(O=i3mR4i#PQeD!zKws*J#u661|YbL_XWJ;s6Ta@goOa116TrE75N5`W>v$Q$20B(_k-I;06@~~&e-cm~ z6kSylB1W4R*;)3XK?mGLoNt13ig%!kPCB+WYjw{Sy}?Z-w8H6~11rINP( zH&p~L-Lsd)PZ=^;E-li37tbccUX2rp(Ci1qgs(ZsNVPDlGi`AfJtQ#c-Odv+Fxn9y zNss6fa5U>bE4>*Vnt~slUsE<6`0C_660AQZ;&H%2IkUDosHWn-%anIg6H~`gG42kh zhLIV}{9xMSg?VuXM!8;URB_eos(#I~x)&ESh^<;W8C+mC#YXsEN$51FsIm~d!+hfx zPx;-fHhN$LXX}#5PB$RoT0BBdji+rHIs-7DmSUoQ16KxHIzju-s9TGR+OL#K=^A2$ zLPN=n`LTb!FZTuOSp?+^EJk{X8x~ za|`9Z+gQDcxiva1jWT7>RaeI2J3JHM;alisJ$4_;ss$XO8{bQaAUi7(@1l@KkBx+_U&nRNyV81| zWT`vkM!56pF3k?zbGQCm&BX3vcK*8E2ET^3NQSEBbN1S2XGouKH;j-sQ9NzcF#y(` z9##1H7JC2&$cv#kDcLu=yAJZ4oHs{|>E_FG<4h$XWyZcv z%cQ5g?+{bV`7yDZfX*oH*RqQ^98#}qK#L#QS5adQ=*=d-mE{R3%nJBl>NqtA(A9rc zFp=}4xp>UgRyc&)8g|+9+()tZdNo(HI5($Jq8^(p`ugM^jKun`TC4&I=5WSD8V`P7 zX;kNbU>$r*vECf`_>|$E&4IeNN>__~_JU{@To%{cS8VGjrnARe-b;U{F%rVu@zAO4`{<5Cc_9 zrt@jS7dhqOP^;3s?z~lefWhqPtvje(zh*s+mU#Q<1l(h&6>xcHKKCcgUHKBc>{wcpOt+gIP-g;x5|d zrfs8h&G<-20+SOG#>7&srq|bZ8P3Qis!l^U+_~Lzy0^at4|j7rh;=k_x>g9+*vg+? z?c_kM0Ef;OEo`lP|NjZ5VZ>Q)3B>>Vf`+q|hqtMlB|zN5+02p>>}YCj ascva%;p;kP`9D)B04%L6^+UoW?Ee7CR!IQ> literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/tile.png b/TWTW/TWTW/Resources/tile.png new file mode 100644 index 0000000000000000000000000000000000000000..78527be7b5ad0604f2a1fa56b33849c3af53c574 GIT binary patch literal 4780 zcmbVQc{G&!{~yYdu_dxIMv-kcGmJ5eeGA!_Y=fCJ7{<)R*hPsF3E7GW*-KPJB3rVR zNTHHR3fI2etY39+_xJnbp6~CR-*e9Myg$q9_1-_{JkOJ8WogXACB_8+0C-GI3~ctL z<w7`xi3z!8(pLmvJ z5=JH3hFRKqhxvJH5WqNX5SD@2S3oAxJwXhze*g``&;tL`i`gIlT!w-{zaVr!E%0AX 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 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/track_location_btn.png b/TWTW/TWTW/Resources/track_location_btn.png new file mode 100644 index 0000000000000000000000000000000000000000..49a84c2fda4bc29c11377bbb3c2c47d073113e7c GIT binary patch literal 5059 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 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/track_location_btn_compass_on.png b/TWTW/TWTW/Resources/track_location_btn_compass_on.png new file mode 100644 index 0000000000000000000000000000000000000000..1b5115c9e627440a7b77d9aaff11ed342b445224 GIT binary patch literal 6165 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 IBkqR%51orJx&QzG literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/track_location_btn_pressed.png b/TWTW/TWTW/Resources/track_location_btn_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..8808a90fdb6bb28e46db311ecfbcdedda92766a0 GIT binary patch literal 6046 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 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_airport_1_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_airport_1_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..6b5a98f1fdd6f17f500d828596aceefc6112ee32 GIT binary patch literal 3588 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 JN+XXa{|9``eJB6` literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_airport_2_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_airport_2_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..b01a01660c7e13944901adf70e89ca436a96e592 GIT binary patch literal 1429 zcmZuxdo&XY9Nvauxa9qq40-ohX5O(D#v0~vtK|_F)t!h&-mk7iS51jb-es{oJMGT9 zXeO7-jY(4|adABs*(OHU?z!jObI-Yd{C?l}$M5{U?|grJId~6@97GcW0089NT%El4 zFjO>B;JqC+Q{cM?K$15G4QLpGE&>1&o^DRZedB>ErNft%Fv@+?4J(<#i&DCkmG0p$ z(CM2hIrp%0=xRPbak>5*>LUQ-5p_)oV-4E{MnW@`AZmH(FbN>>iRth6@ZKfVoF!q@ zavjI0Da~f3!7&VQ27Iqfp093~r+=vtiVs6U`1gN+R zAln(fOZCmfH<0fR&acDUo5W>Kw&v6>ZpeQV8#FPUe^98IjVy*HTARPM<8x3)mbG>? zy|*#lPoHEcYfDngJbSqL@+n5XT!|zXvgP2;(yZ8Kl7kF_#L4Mj-0-rJ@5k1bC3JF( z|LkL!_-jbL1j}4qJ=OvQ7rLOVRjFU+SX(t>yov@my@z=h)Ey4)a<9~Q8@S6?jzY36 zmtQu+>nZR5z32+l=I|ERKhEOs4~1uy6XM+y%u53kgfr!l&&O%%Mgh9jtWuK~vQV z>X~-lJX=VX6VuaVx1ni4@i+iC-njT&fa9bW@eM?L_?gSh8h>=S#AWR`3(M$qXtqjW z>1!EI*>X+^O_5MeXcczjB2jh!^Z1i9x8A5I76h-9V3wRGhhGgj$y&z6q3x+$dy_i5 zrk0YQ{8J}A%L=1Y5SM?jZ40hAkV%ehwZOvk>4ppb8U^$v_GCq)xy#s5gS?Y8Llv(; z#gu!f+nCT2n#F-F`_5hW1qE8u~!nIg?xRR;Bl4yW7jzZC(lr()C^mLPbo7Fa))+6aYi z<%;!mTNG%DXJg~UW>sN8oR5Yc%C}7m#sEkM75}OLtQwgFw3=ijE1?>P6hzq_UWl;R{2cc`JU212bmwXIC0?=VEZuvvNlI_RsS6(z!DJQrsgzltjtgY}XA{kFCduEah9YhH-zl40dGP2PJCk1E0jFvDG&8Hq$;| zo&4R=#}S-wZPQvU^o_BE%@!`>=c%;GhKX$NRN?*;?C-Y%1fCNrAh<($!0Ti4Sv)+s zJ)z=GP`MS2HfmuQ(pG|Z>S7dlt{Pl5ei eXBC~$c*(U-N1hf-y<_e5EWpj#!>IusbnP$vnw{YQ literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_airport_3_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_airport_3_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..74bdb1cbacc5a496e158aeca30d5c8c52f3929a0 GIT binary patch literal 1024 zcmV+b1poVqP)Px&x=BPqRCodHnmuR~K@`W|?p|`{iyW7j_!0byf?8-1EX2ZIOD#kY5gS2BVQpz` z5fE&|La@?Odke9UD{PFQ(L|!;^T;LfV%FTQ_bx_vCpWv3oq4+nzJVh~^R;#`F^mXp$4}fWH zy$As^FbL(uVE@Pc#m=r9x9@;shh4pR@-QN-^{I>3ZiQ@Wo)3>7+=p-F<)zWF>0^{| z?2u=J9o#7hWpANl6O^QG5H9MWF6t-MQCSy0jVdb?ZH5l_&!0ZDyV#mD&)!}0;NAFa zx%6eaM=_i&o0*S#BZT@rg#rr7H*`(hvo>OF@;BFH%=pmN;k$6|!X>cnc*U`Ttz{|iy zQm7MbL4OltWup(0RCWyB8^ol7391}#++$R1P1qQv91LjaNS}XZa8F|>-{L@bdmeI5 z^7F7(^Po~)h1FlRhUVL`DJXrOA&WnGq(KUsk1q#@bfKUYLPZ^+h5QI}T3sqIp?7(m zof6EhiB8B*&{p@D3e1phV2bO>{7``@C?=+BM&^eKjBdi2uQ&Q0qngdqiVOIAKRGX5 za&n*ty4qSBKdBMn1QnQtdd$*oj!^o#+hJd^Q<@q+o@Xl6I56mkq)}Z;rMPIDJYhmh z;^zMt$NCA0ZlOa3CjQ@ZTL?13l*|tmm}e2mn4BW>Lj}fU@|kEc7zuU;v)#bp<2b6t z%}1>@F-P?t6B!%6xZyiWTtmC8T4rFfOj-pt-(w_{7z~4v5ReS>j@fQtzL%FnA;tAW z#wm1o$4DSE7zQIDAQ|Qz!(b!?B*VO8QU*g-Iu-ID^Fy^`$V#UI7&1RpV8}|R0vIws zRA8hvB_T20E}0)HFuDn6zCJTBVihv3pEfBfFl41u0T7uVDllZFQvnQ_A1W|prBeY6 znI9@JWTjI944EG)Fhcx0ubT=OQ^hk=Ix44$5RBz|{`%+P_)7OAYsfj#Phe|=X=&T6fH8E#qn zA93SOsnns2&sO}Ya`npMPj^BkmLxX%(MEV3D0H6hEwqg|wtXDHH&BSST-+&h3oFBu u3(Kz}T=NtYU;<2l2`~XBzy$tV0>1&O3FWkuQ_qM10000Px$@JU2LRA>e5SieidKoq`cDy>wo3Wc@~PU7a^>g?YjI5~-%gOfw84o(hk;^ZXw zH#oaGxQUa4X`x_SXfdI!#=Bxl67SJVa?eP4S$g^MetqA2cO+$uE>eILAO%PPQXswp zMts+Rr@6UWJkDh^`#fMd@C3MV8LQjQ;QH~kdCpCSfSEF^g$O56EiTTVmI`^ccT^iC zzr8$@7O{I+9pN_@HP&eNShMqS!pX>ur4i(y79v~g6>F_jD9@QQ@+<(_AAYfyM!Wv- zY*hdgWjI=9Agmats3b%v;iEc=K2lkNxJv0 z&78q!z$}}YWy=e>0H*6k`)GNE2@;jim|2>~$;%~vr)IQ>h`+7>VU4y&#KsQq34vi< zXhg71CrAj|Bakv_;iw()zlQkN7-Uh2U=$3+BqES9Y2nn7w3LVPQb!JWOr6VqL-@0}`a-qUU_(pb=IB4le zqt)HvvF{9KtVnWzkRb8n3);{FQh*d71xNu>;4c*T2Enaltidw#9{>OV07*qoM6N<$ Ef+8mU`v3p{ literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_blue_10_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_blue_10_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..8664ebcb10e4507b26f70eeac871ec6ef9d9c281 GIT binary patch literal 446 zcmV;v0YUzWP)Px$cu7P-R9FdPU>F6XAut*OqaiS|Lx7Q7?+Z$~TJs6&tYBnhmceJn|NnoVe0qN+ z;{CJTNAan{CC7qGf{-}Kae`vjG7V+cV5J>X?x1L?$Wa0F8@i5wJg@@jKv@(8L~_Uu zK?R+X{}S^4L|OCV;YNlBS9-{@i|i1Dx$O8B8yFKSZRv9at2nWOOvEZ2D0PG0f#gQ< ze^`i;5QQK;B&S1iLy%;P$Z;Gf5XcQdkX|t06E=h~vC^O3p2sRqtRT4|NUZr3tD`ss zVJ`Uk=?=r6U!TBS7B)TxZax*56h$=E90+n8zlagoF(2QYqsURnnnz9)gQ67{av(Of z0M(+HT4@g5V}m}5spdfB@(!7e9wMajspddZEhbj|r~`=&DO~EP7J|riGBO*N#l(tJ z?7-i@KH{_spBzq2XcAPx&-bqA3RCodHo6k=ZK@`W|w#5q6LJENjK@yQ@JoqETgC~w$Ot^SZFPd;Mnix<1 z5gv>okr)#aFY3h$i5HF>j0ZzZJoqC76C@C5_zgvVv|VRfN@o{lXW5yzh2+hp^YeY* z`}ECr(rE#x5CI}U1c(3;AOb|-WD>AY-L7wGO}F$8M`QIj!M0M`T9&<(&t<>NWyS^| zo0-?P=V1U341?0%c59-cx#!H&M}1&LY8-A1zn^xr4{HqE>u_}2g$Tn8$44ulw|7a0VqLbI9zUz+vWCy+VQgvEo0idA1t<=znfy)$d4aKn!~me z%>MbXG&AwG=|~HYFc~dl_%j6q3XiR5*Tgf+160go%-GPg$6e6h*9wtH@B}RsY#14x zhv%;*jrrwe2rpv3-vdcoba)rI}ZD1lO zZbvMl-qhq$@O>&8-K&R^G5p!!4(bqJJiE%z7|%%t2aRTo_^!2Ifc>}k#hVNay^BL6 zdMdE%h5Qa|WiyWTqMl>GKm#jdZi~L1uJ6!-!fkP=+>Wa_bX;RvO)M}EMXz)+MPbLG zBhJ;WV}a?>b=E zyzVT-Yr{M3iq2qxSz#j5H0Mwfjh7+WbWQZdQRg4e8!JClV7LxS!P-jW-rlm4u;NTp z8s9$($;>HqWXsh3SYTeOrH#x$)4>As(MZ^8BWOBUVALTU^BDw2@&*x@;|0b7{&DP8 zO5;YqV)2qYFot!GIUpo<#B0;VGYV9`nGlEf>Q?c9cgR2}UDW|omu5kyLkTdb2t8vY z#c3C}Sj$2@HXe5Ri0J#t;|@0ZBJyOvqr+u1;NX zpy^;`4BFMH3k;eL78tavQx_OC9V{@?J0(|Ox=l14EHJtOSABiez$BZlJAzlW9g{<7 zV1YrqI(0EY)4>9Rc6I6kgQkN82JPz91qMwA3k=%TsS6C64i*@f|0k~*3K-SpnqO?D z?D)~c17q1cg+l4~;ak~h<;|nYSq_EU;iYJo*;lR68OOVD%jbS=Z_Zq)O>{zTcYW{X zQODKFT4oo3*{}4NuSLz9ELpUp@t+pt@5gGARy39X%hFFyo+&(QmNTF2mF4eub~b0H zu>428HBU6(=xs<|9Ay8zy2Sq275w+|<>>kLVVSbJ_WQ}k!q>5KH@y-8B0vO)01+Sp eM1TlX2>b`C*6P`@I<12M0000V2$#0aSW+o zd^^`VC&XQ(?fl)?^*NDd3DQlK&7A=)I_ifCC$eb>Fmb6^dATrhT)d>%Rk9^eWNAmx zvhFE|Iu~(B&JsD|(W%4K@%?vV@|)P(ub=0=Q`~pW?%loP=jK|bf0&t8p8n4A`TY0y zcj{+;XYvqca&q9{U{q9KX=xA;0CO5ceGeoWRWHx}ywKS9thC;eIdA;JgS#DLTaz;X zT|D&WcK)%rKOgr-Z%^4!=Bvrpmhy{-SZPrLT^Z?5d#3Ayi@N|tSPTd}Th>Cwy? z^JSa={NNB-HlJsIRmES91E&pRzaIJ&B>kx5y;WuM+h2|UzMZT6@bvlX1>ZNDc`VgR z7424)*g3cTVZGYnXTjxr_UHR1yxae;j(=yld1BI+w(L{>%y~+arcPRA&CJZaWA>q` zjcFEsT;JZUG-Xa*;ApYz(xIZ{+AED!0n@#7r$z)hf0)s@TeGF{?X|l$53*L|-DpqN z()G%NDY((&wINGK?!dowr&pOhc=S`wqVC7!S)13qdOPV)&++B)b@j~Q`)Vho+-fV{ z7^S%EtV31>TYKqFld!gs`1%=5E}_@+>(=mm6y9;`*AaoVK55$(?_a!>DAE7jSH&Z? z*PJJQ`}dMHF$;H@7uD7NN%%8^bEaFk$4<$*$)9(7eZQ^ua^HqsiMu9WNxmZRXBlhf z@yq88EF3@f_Eaw4tGKaQ@o^___`NV+o!l)hv&-je<=!o}x^;|gdsW$Y_KL#)?m}j6 z;T?|4u1zzl3gBNnB{Qq}*|oJ3ywVSw`R44|VZy)p^7({9$G3S!K}`{B1umy4xR}Vl zF3OzJmb0=gp(u6A^>xA9-Qp{I)_tGS7IV>bWy_~YFBY3Tad3K2vQ+V+d#1;By-A!; zRY5GLJ9g_#k~oa*BV*fJHb%~vU$S0u-l5mW?b~yA8SN`P&iQ>ynY2mj^)+7#>yoD` zX0RRl`=$Hz#F*uIjB0iRt<4dwgnR;Wm@iJR4b8b@>^(w9adbFmz!K znL1@k+mnzM=?;)}CpIvy&{FmI5-3&V**dK;La261+n-E^RbHGR)`|naGLnx9q+N?j z?U;Ou;T~7#<$~&-%}Z}CzM|UoedC9^Fh%*lVH~p{_8j~jwC#>c&KK?kpbIW~-V#x7 zGbr}v5p(F@L?bBk9Xbop>&Gnb#E=s@NH?6-?>~+w*a9u+*o}nw@USAXk6d8o1|U z_e5Y|F0r>$UM#5cOM^Gl9H_$(Tey^fsYR_@5g4LOXP%tkg1F}RA<-cJqC0hI zembXDnsd*~iVb}`w|3vHM_@;JW}eVy`^-PdVNw633E7S&5o3}21 zcsP6Nx-P@B@*eeHUM{)x{!aSEva0@bhxh-UH|t0E=PAvXA8#%U4F3@J%PljUV@g|E z5&ze->l)Aef33-DDlp5#!)l^VuUh8J-Lri2EnZv9Op8&SV*f#3@2q3uE6y`d-udo3 zA8TteUHa?)yUvS?dnMdI_4E|wzK#A?wkG%X|GB?YTAJU*KVGjdZ~S|o#jAHl?P{N{ rpMN^lR*#k}GN3_#%N>gTe~DWM4fy{4`d literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_blue_1_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_blue_1_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..ee5211abccb87da7f0b2b6a63168074fab6e00e2 GIT binary patch literal 3642 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 D8|9F+ literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_blue_20_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_blue_20_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..ee5211abccb87da7f0b2b6a63168074fab6e00e2 GIT binary patch literal 3642 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 D8|9F+ literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_blue_2_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_blue_2_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a03530fc7bb3071443ac8350bd66902c48b864 GIT binary patch literal 1440 zcmeAS@N?(olHy`uVBq!ia0vp^DImV2$#0aSW+o zd^^`VC&XQ(?fl)?^*NDd3DQlK&7A=)I_ifCC$eb>Fmb6^dATrhT)d>%Rk9^eWNAmx zvhFE|Iu~(B&JsD|(W%4K@%?vV@|)P(ub=0=Q`~pW?%loP=jK|bf0&t8p8n4A`TY0y zcj{+;XYvqca&q9{U{q9KX=xA;0CO5ceGeoWRWHx}ywKS9thC;eIdA;JgS#DLTaz;X zT|D&WcK)%rKOgr-Z%^4!=Bvrpmhy{-SZPrLT^Z?5d#3Ayi@N|tSPTd}Th>Cwy? z^JSa={NNB-HlJsIRmES91E&pRzaIJ&B>kx5y;WuM+h2|UzMZT6@bvlX1>ZNDc`VgR z7424)*g3cTVZGYnXTjxr_UHR1yxae;j(=yld1BI+w(L{>%y~+arcPRA&CJZaWA>q` zjcFEsT;JZUG-Xa*;ApYz(xIZ{+AED!0n@#7r$z)hf0)s@TeGF{?X|l$53*L|-DpqN z()G%NDY((&wINGK?!dowr&pOhc=S`wqVC7!S)13qdOPV)&++B)b@j~Q`)Vho+-fV{ z7^S%EtV31>TYKqFld!gs`1%=5E}_@+>(=mm6y9;`*AaoVK55$(?_a!>DAE7jSH&Z? z*PJJQ`}dMHF$;H@7uD7NN%%8^bEaFk$4<$*$)9(7eZQ^ua^HqsiMu9WNxmZRXBlhf z@yq88EF3@f_Eaw4tGKaQ@o^___`NV+o!l)hv&-je<=!o}x^;|gdsW$Y_KL#)?m}j6 z;T?|4u1zzl3gBNnB{Qq}*|oJ3ywVSw`R44|VZy)p^7({9$G3S!K}`{B1umy4xR}Vl zF3OzJmb0=gp(u6A^>xA9-Qp{I)_tGS7IV>bWy_~YFBY3Tad3K2vQ+V+d#1;By-A!; zRY5GLJ9g_#k~oa*BV*fJHb%~vU$S0u-l5mW?b~yA8SN`P&iQ>ynY2mj^)+7#>yoD` zX0RRl`=$Hz#F*uIjB0iRt<4dwgnR;Wm@iJR4b8b@>^(w9adbFmz!K znL1@k+mnzM=?;)}CpIvy&{FmI5-3&V**dK;La261+n-E^RbHGR)`|naGLnx9q+N?j z?U;Ou;T~7#<$~&-%}Z}CzM|UoedC9^Fh%*lVH~p{_8j~jwC#>c&KK?kpbIW~-V#x7 zGbr}v5p(F@L?bBk9Xbop>&Gnb#E=s@NH?6-?>~+w*a9u+*o}nw@USAXk6d8o1|U z_e5Y|F0r>$UM#5cOM^Gl9H_$(Tey^fsYR_@5g4LOXP%tkg1F}RA<-cJqC0hI zembXDnsd*~iVb}`w|3vHM_@;JW}eVy`^-PdVNw633E7S&5o3}21 zcsP6Nx-P@B@*eeHUM{)x{!aSEva0@bhxh-UH|t0E=PAvXA8#%U4F3@J%PljUV@g|E z5&ze->l)Aef33-DDlp5#!)l^VuUh8J-Lri2EnZv9Op8&SV*f#3@2q3uE6y`d-udo3 zA8TteUHa?)yUvS?dnMdI_4E|wzK#A?wkG%X|GB?YTAJU*KVGjdZ~S|o#jAHl?P{N{ rpMN^lR*#k}GN3_#%N>gTe~DWM4fy{4`d literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_blue_3_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_blue_3_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..f984812a26a7af0c5b56d8a297ddbe4155121ba4 GIT binary patch literal 1060 zcmV+<1l#+GP)Px&-bqA3RCodHo6k=ZK@`W|w#5q6LJENjK@yQ@JoqETgC~w$Ot^SZFPd;Mnix<1 z5gv>okr)#aFY3h$i5HF>j0ZzZJoqC76C@C5_zgvVv|VRfN@o{lXW5yzh2+hp^YeY* z`}ECr(rE#x5CI}U1c(3;AOb|-WD>AY-L7wGO}F$8M`QIj!M0M`T9&<(&t<>NWyS^| zo0-?P=V1U341?0%c59-cx#!H&M}1&LY8-A1zn^xr4{HqE>u_}2g$Tn8$44ulw|7a0VqLbI9zUz+vWCy+VQgvEo0idA1t<=znfy)$d4aKn!~me z%>MbXG&AwG=|~HYFc~dl_%j6q3XiR5*Tgf+160go%-GPg$6e6h*9wtH@B}RsY#14x zhv%;*jrrwe2rpv3-vdcoba)rI}ZD1lO zZbvMl-qhq$@O>&8-K&R^G5p!!4(bqJJiE%z7|%%t2aRTo_^!2Ifc>}k#hVNay^BL6 zdMdE%h5Qa|WiyWTqMl>GKm#jdZi~L1uJ6!-!fkP=+>Wa_bX;RvO)M}EMXz)+MPbLG zBhJ;WV}a?>b=E zyzVT-Yr{M3iq2qxSz#j5H0Mwfjh7+WbWQZdQRg4e8!JClV7LxS!P-jW-rlm4u;NTp z8s9$($;>HqWXsh3SYTeOrH#x$)4>As(MZ^8BWOBUVALTU^BDw2@&*x@;|0b7{&DP8 zO5;YqV)2qYFot!GIUpo<#B0;VGYV9`nGlEf>Q?c9cgR2}UDW|omu5kyLkTdb2t8vY z#c3C}Sj$2@HXe5Ri0J#t;|@0ZBJyOvqr+u1;NX zpy^;`4BFMH3k;eL78tavQx_OC9V{@?J0(|Ox=l14EHJtOSABiez$BZlJAzlW9g{<7 zV1YrqI(0EY)4>9Rc6I6kgQkN82JPz91qMwA3k=%TsS6C64i*@f|0k~*3K-SpnqO?D z?D)~c17q1cg+l4~;ak~h<;|nYSq_EU;iYJo*;lR68OOVD%jbS=Z_Zq)O>{zTcYW{X zQODKFT4oo3*{}4NuSLz9ELpUp@t+pt@5gGARy39X%hFFyo+&(QmNTF2mF4eub~b0H zu>428HBU6(=xs<|9Ay8zy2Sq275w+|<>>kLVVSbJ_WQ}k!q>5KH@y-8B0vO)01+Sp eM1TlX2>b`C*6P`@I<12M0000Px$cu7P-R9FdPU>F6XAut*OqaiS|Lx7Q7?+Z$~TJs6&tYBnhmceJn|NnoVe0qN+ z;{CJTNAan{CC7qGf{-}Kae`vjG7V+cV5J>X?x1L?$Wa0F8@i5wJg@@jKv@(8L~_Uu zK?R+X{}S^4L|OCV;YNlBS9-{@i|i1Dx$O8B8yFKSZRv9at2nWOOvEZ2D0PG0f#gQ< ze^`i;5QQK;B&S1iLy%;P$Z;Gf5XcQdkX|t06E=h~vC^O3p2sRqtRT4|NUZr3tD`ss zVJ`Uk=?=r6U!TBS7B)TxZax*56h$=E90+n8zlagoF(2QYqsURnnnz9)gQ67{av(Of z0M(+HT4@g5V}m}5spdfB@(!7e9wMajspddZEhbj|r~`=&DO~EP7J|riGBO*N#l(tJ z?7-i@KH{_spBzq2XcAt*3W7VR*aEHwk!z1P|T;{-^Q+|Akb;R9(iHn)U@@E!wKKy*Un`gd#%zE~! zWt^*%gjiNS5@db*Xt|P6UXYGXj7kJ=Pn-RHiF-CTzrHzmH7;|KNmAgM7T2B<#e^cI ztHKK22dX-JyI5k5IyuZsdHFaxr{hxc%iaLxOT0d z|IXmg&##=WlHAhr%;xjCx+Jz*g!o4pv^Uxu)K6l0-1M?P|J=e4D^E(Ad1hZxzTzWx z#h^Q_l4Z)qi=SCMdcqpgR!f}}>_tYaKS#w;^^xzAs^qP(TRK+o9S zwn;mM&8x=5jZN!G;Z18PQ+x`6bmi6R2rk9K_RU?(fc!8q+@7KF9 zoQ*qp;)G7~QNB4&3jPjXAB7le8Ny=~7{6aQ7#UJ@GdI1BeRLm~78pET{an^LB{Ts5 DSCi*J literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_blue_8_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_blue_8_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..974a4564570fbc67f3001e86d437c7cd53eecb1f GIT binary patch literal 569 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^Tt*3W7VR*aEHwk!z1P|T;{-^Q+|Akb;R9(iHn)U@@E!wKKy*Un`gd#%zE~! zWt^*%gjiNS5@db*Xt|P6UXYGXj7kJ=Pn-RHiF-CTzrHzmH7;|KNmAgM7T2B<#e^cI ztHKK22dX-JyI5k5IyuZsdHFaxr{hxc%iaLxOT0d z|IXmg&##=WlHAhr%;xjCx+Jz*g!o4pv^Uxu)K6l0-1M?P|J=e4D^E(Ad1hZxzTzWx z#h^Q_l4Z)qi=SCMdcqpgR!f}}>_tYaKS#w;^^xzAs^qP(TRK+o9S zwn;mM&8x=5jZN!G;Z18PQ+x`6bmi6R2rk9K_RU?(fc!8q+@7KF9 zoQ*qp;)G7~QNB4&3jPjXAB7le8Ny=~7{6aQ7#UJ@GdI1BeRLm~78pET{an^LB{Ts5 DSCi*J literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_green_10_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_green_10_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea5e7a019b737c92a59cb0ddadfc458224c8f3b GIT binary patch literal 434 zcmV;j0ZsmiP)Px$Y)M2xR9FdPU>F6XAut*OqaiS|Lx7Q7?{jK1So6p;tYBnfkiloh|9=cmzC2`z z_U*+Zbd~6cEWF z+ks*}4F3g8h_mIx83u+|TNuc)i-kBVaI3mm{~xy`P)5CxEO)`pWP-B>DPzz(klZMS z$14d@2+~7xe3Ki3BwIv|<3Op7+zE z7Yq!4ze9M;oD2-?5-=IcXsS67 z4!15;8M4bkP;c$`2mC!ckX1l63?Q|r))LPn+kv32B+we7yPd>4X;kHC2#kinXb6mk c0CETb04RAyhBwp7vH$=807*qoM6N<$g7*Hh0RR91 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_green_1_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_green_1_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..feb115c580460e86df7cdc5c47ee3228b77c311e GIT binary patch literal 3525 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 F1OT|Jf;9jD literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_green_3_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_green_3_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe7b7733cde809c42ad2cc3f928050ac4ce822c GIT binary patch literal 988 zcmV<210(#2P)Px&mPtfGRCodHn=xnHgz4z_goh7pa zXi)-6KnW-TC7=Y9z|ka7qPl$or%%n`WoZ~!jGbx#Ta9QN3u_;77r*f%fSyx=2gX2| zxQwr(=W+7U?KzYxNgtlq=aMJ7)E?B5eWDid^wk_Tzhh(d11>V*l)Ly7uB;?=S*c37%~%U*&{#OJ3w<4Xl-^hf4(zQb{#bTSs8O9 z4#^jaXbDu&u}Z>@)#g=Yfl17%KA94au8U5>PQ0)0F$>JBuVWd<)9kRojAsnYw;Rn4 z3yg2Tg^%}`C-VE=TsJd}`K>RyHO9?NGGy{Wenk`(7!x*}AqkX`Dd5bsJ7k%jw^mZY zh#g8{-AX-jp%X`!872{6TKjJ2R67aLJ}N9Q^L_Z>)0Jk21?G)Uw0(@F*g7)SDhy1KL8o01Y1e0rgOY+# zFb)Ea)0#1d4a}dVq(^D>WN&^=GseMK!6+C90mo_07zN`X;5e-rGhi^ZrBf>onjKcg z(3VauFf=n3#F6gGSR@84{*0- z>gjkTpahhF5>Nt4KneVh1pWaH*0Nmk?uF<80000< KMNUMnLSTY{<-lJ6 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_green_7_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_green_7_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8b3d4c58ded7ef058e92922a61a80e05a55be8 GIT binary patch literal 539 zcmV+$0_6RPP)Px$)k#D_RA>e5S4~dBKotIp7y>SIW1?uHuH1PC*Sd4#3GfaQC1~^xdIC4@bnPA7 zxl$5EqZ>@Lq(P`1vCul5&>7y?guHH;`R4t7-+R*(fFD+X6<`He0an0V0ms}m=9!<{ z#Qt;%dya#0>_oBgeKb2R&RRD(4NSfiW~pHkA_0lRnMKr#E5OOl`A_nLt4d-K$J_n$ z>SYD(2JrceT0rI~(O3f{Au_*(r`ZjZa|MmefoabJ-fz)-yT+29r)-^*A$>%QlP(F7 zMfjv0#Zgt|M;Yjz-_`t7F6(uYVHo5h>Bt~jhKq?IGVW+eb7VL&VI1Rm8<$9!I4s0; zxWYK5{uq~tl(@7iL5YC-kO&)td`Ct}=e+>kcHC;J2ox6L7}bt^w8Fv!iPBoQ>;Jm< z@jc~kVn&OJP>uyfENgc}Tha7(a(_R+6GyxL~InS zipfM&%4CIeN3v30m6toBQYI_hYDc1fd!uU`WUUghQLri|IgzfbN;SmO*bJ@Ht;oNA zz1MV!sjWyl;`i{_Y3Y|He1xyQr|dz}k&gy;gU}aF4$E>1H6lp-`l^ligcV=~SOHdm d75E1Qz5$?IPONSG5nliR002ovPDHLkV1lY(^mqUO literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_red_10_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_red_10_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..f44b90948dd391466bc2392c0b318320b211b98e GIT binary patch literal 441 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 Hd*1&S1@vHv literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_red_2_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_red_2_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd88abf273947c01956ac3437be73a7ef0d1d4e GIT binary patch literal 1357 zcmV-T1+w~yP)Px)2T4RhRCodHoy||wKp4iKT|k8_L{T9|jT)jxJ(&}I!gDNEaV-@$h-ZKs`?XP)1@ z+je%h1vIGx>VP_+4yXg_fI6TKr~~SNI-m~x*AAqF^gh*6gRV_!T&e{2%mdZ7bQuGt zW`TDz~d2T}`cIa-T{jTLBassc7v02|Ww4Edb{e$D|yGr;H^2A@sf z^aSwDo`T|*xPhcj)neelIyCQJ2kdM+fyU-mq|=50)t8sAlerth1E^%lMd2D zx}vldr7SBDI%m+w6q!Nk%ZulrXz(Y>qkU1*O6n#Zq=$4xX)8+Ee^x}PV)bP^GnhP? zLAA|uMwnVUr##MLsymCCuw#?h&l(|gH6;lK8BBU?Ugi0rvI6mo(QUw7_RC3a*KgzC z+4D%H?TwT9Tn?}9-9_J(3nGlL*Yg#0*ES52MDVFyDM=I%n~_lnfUDg?4c@vaAfBlI zd8t5z(YJb1-`!N-Z7wN0@*a$i}smdPo0>XwFkpPW1TiMT8)q*7y-SbD;|y% z)^3>YI5k@ZLL+TC@pSnaX3lcuSF_K%>Iu~l?`+>D$o zSiG?sA+b5OhAXmqQV;X7#te@Jqo~T_*qkvZh%e?V!%3dg*Ah!aMTl(}<(Xg5HsdC zS1u$+#?7LYv*xb4+>uVlQ#n_XQ$SoXHHuCJ62-j)$|{fqOpQ_{ClK?kgXqMfj}yqC zXdD2GK29K4g#%&H#|flgI1m)+V9jyR;f;`rF;blOKDk literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_red_3_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_red_3_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..a358b00d3f96df538ea543b056c8afd995b3450f GIT binary patch literal 1011 zcmVPx&tw}^dRCodHn?Gn2K@`TnJM$0Eh+H6AsUVRcXrl-g!A?-HQxGgHM6j~3(K4kr z7FGeVw9-ycu#*&mXcf@lA24nQ!kR??GT^XXblve*11` zFK-V}Qvymr2`B+2pahh__9ReXhCL4KJzB!Up(0Kdnkf7FY8FtbHSlU~4Of?dMPI$7 z`7|&B<>V+n9v;T%#aq)DusprFH=PvMdf$ng@iFx#@c8aDKK#P!>s3rJ;S@VYmvMk( zia?nd!WJkQCD(OCPjp2;t4^AE)^$uXCEb{_qgXjpLV1LMzS;m@tfBIJ6=Uh5>3$R; z?2RDgp2C14>Y^Lso|S}aAgMD{-_)HM9JzcAg<|&W&}=mD?$HCx-o73xtVEscktWK< zJAI*unm`quyet*FEH`t4cE-=mU<~=6O*brlaQjP|6ZWo&8cW<28Y4DGm+#K}q_S@v*QXTl&N}8wN zfoDJ9p%{&J>oF^1E<|1VLJ=*2Dms?M{8)WnO%|Bgp6Zh+(bculiTR0+^*v^RIqn-+ z%K0=uEHHagF3fir%?}HV?}B?if9vfmhmcmx?o#;!%&xheO_hML9YDD!5t{!9xI^>m z`DSK2(_Ek&H2*%B7+##IIS6@U>pP-r!`}8216^ITI-0bFjoBAubB&&PQ|sf*h1-~@y7&HlOJA*$@{s!i<0@GBi7P2B|Dzc z%3fv-^UHM{+c&uJ(y~+@Lz&Tq=!ep4r$Z}(4mR-K{D$#LsfdF7zNi?W5G|P^Su30)*=hV{!ne_mAMdNy|wy%Di>wZ8gc1uT|Wbuj8e+nhGcZC7=Y9 hfD%vwO5i^v@E7;Nwl~LxO056@002ovPDHLkV1i|V)%E}Y literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_red_7_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_red_7_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..47901e6d8c055c4b11d739ae8a6f1f0a540425d6 GIT binary patch literal 536 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 bwmpG=Rw(&-Pap}w00000NkvXXu0mjfD-Lw5 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/vehicles/mapbusico_yellow_3_lv.png b/TWTW/TWTW/Resources/vehicles/mapbusico_yellow_3_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..85c5af7b6534407374729b365a61e3c48ac1a100 GIT binary patch literal 1016 zcmVPx&vPnciRCodHn$JsAQ546&Guo6{&7l>761&-uLb-n+wn zfEFd71eAahPy$Lo3G7S)8K&Fq?dTou#ob&h&Sp#KN~%@NAirL~(^m_)zOsUar1rwr z)4&LnGlwyItQ-4B$Hvi`^}F$SYTVyZrFDMPKc`RxrY6SmehELHeZe3TPQcwN-o@;a zOc5x3-Pi^trpdA$u_t!Leq1|I*3mL%07g0)(FUp4Q<^QYa!N zP{mGKB^5A9GQ|tRl^w55Tixlc)Hl#o+7ildR^>Ku5tP{R7O&p?T;A!6B$bSjXG1V3 zZ-7zi|DG{X=DL{Ul(N^M3xglEJEOjOVFOrP0oHz3);*j79?gR0 zKPzLdc*9N#MQjOFu@fjhoxoV4CJT)3oth+5ywO#$ce;;>8qN1rV0jIA{?WeT^iiO*4d~cwpTitsfmt?AThm;i95JK) zAx{W-J%2Vuk-dyT$@DS+^(g7SME9 zVD80>v+h+i9Tu3nBW$(>3dV9p6iicrF~5oBbsSd8j8@xu9hJfibyIJ{b=AzFS%hgdZ3dTaf(ybZOY+ybt`aP=E_Rr?GG-E7`6^w$h z5U_M>#wZvI0ZX@LOv+$rN2h@}XgaKnp&gwDz|eG9U_uT?0-+^q(sWp0%&Ac-g{H#- zlL{54NW;MN_xQuA)%MTkw^(3kN2dWKG#wTg+RNt4KneU;1pWZI0lS*8g*-R_0000Px$*-1n}RA>cbU>F6XAut*OqaiRF0;3^7eh4soLS3d)#9>K6!Q3OK>tHAv?ScS2rV3p%S@_!1igEU&0=EIVAF?BjOwl5m%zUIKme-5 z2yjsA$%pTxJ0GM6q?dG^m^!EuBlq7jL;#Im0UTwM!L$Om2*?vqy|@*P%8Z7Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02XvbSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8JLvUk0005(NklO`;L!azJAB55F7sR@$Tp> zU;$zgB_)+^PfzcAckbN%iA^&I@7}%lvx$lMZ3P9TQlK7wAZ7*`zzD<~LPA1XDk|!` z^YaUze!~*AZ{NQE8yOk>P+3`REe8jOEKm;{R4*8SOyZT5RR~j2(Kx?y<;wSBEG1$w2&-ro7n<;z#U!wlH5WA`ULJ)>*D z7|Q~x698h6w=n?BE1JMS+Feyu`}{pHRvtfo`a3u{?18GP+8Ta-aHyj=9UVZuBI~E2 zp?z`Frp+H`&z|!}U0w5(xVX4EP!7ZC=m6{$ZffNTS40?{~ZW?%pS!2-g3 T!1C*400000NkvXXu0mjfWWpDe literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/white_black_round10.png b/TWTW/TWTW/Resources/white_black_round10.png new file mode 100644 index 0000000000000000000000000000000000000000..566b197d99324a446daa90fcfb07fe187ce04cb6 GIT binary patch literal 1405 zcmbVMZBP_t9AA=no4_I6txC+z=K{Imm%U%Q) zcr&uq;KE%Y2Gk1WO)~H{Rrmr;^#O`UEM;(Ml-3N0K;_`5*br3cs2Q2HOKa=+F^0gi z5VhWn%sJ(ExnV|<0c=2VT>v){uu+c^dYsZzMKFmII7W~dZqgArZ7|U|0nZOaQ z+QT~LwX~fXsa4ewjbV{U1dSAv|wu1X54W<>LJE(9^;axEARD)WibQiesj5JsRlCW`U6X3>i30sp$OC|dC~h5+UP ziWHUuT0N=@5@aoROAEz;nm6=jS*=!6;8A!XH zASlvqvpI01o-!~L>!1=g7ULQX4uUil8w?cVAPBqON)Zlgv7KVA2Am;DGQo8Q6_pDH zKtfm0bmzJHCAl;s15TA>pCmOTI>22ksghDFg*k{QeM{o0^}zG0D+$ zNYmME;QTSXYx0(Dd-QNe^Fa4l{~OKAu$vPzYhUxXyT7NeJ?Zq9ecU07uVm#IzuC>~ z-7CnCrA{UNWr@9eAg3_(2HpfRI@9yqFR$28@^o5j+dHx1lX-(fS(Q1(4_G{g zHEn12KAM76@E?lC4@SSM%6;x|f9oatI-ap?Dm?gY`|zaCW+JCQJO7^Z)JPpj5x*F# z>$@=4==h}M*72&-Y43yS^6qV&p1pl|@|AG=m0ztVe4h6FukTc@n)v0R`+XOVV#C2$ t;Phk0QKt7sx-xV-yJ%<}ja9ZJK`ZZ$pRCh8xF`NYblNM}F53&O{{Xb2^9TR{ literal 0 HcmV?d00001 From 63d193932ddedc5cf082712b9012244116ca25a1 Mon Sep 17 00:00:00 2001 From: dami Date: Sat, 23 Dec 2023 17:23:38 +0900 Subject: [PATCH 20/24] =?UTF-8?q?feat:=20=EB=A7=88=EC=BB=A4=20=EC=82=BD?= =?UTF-8?q?=EC=9E=85=20=EB=B0=8F=20=EC=B6=9C=EB=B0=9C=EC=A7=80=20searchPla?= =?UTF-8?q?ce=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 4 + TWTW/TWTW/Map/Protocol/CarRouteProtocol.swift | 1 - .../DefaultsFindRoadCoordinator.swift | 12 +- .../FindRoad/FindRoadViewController.swift | 140 ++++++++++-------- .../FindRoad/FindRoadViewModel.swift | 16 +- TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift | 4 +- .../FromAlert/DatePickerViewController.swift | 4 +- .../DefaultPlansFromAlertCoordinator.swift | 2 +- .../DefaultSearchPlacesMapCoordinator.swift | 14 +- .../TWTW/SearchPlaces/Model/StartCaller.swift | 13 ++ .../ViewModel/SearchPlacesMapViewModel.swift | 61 ++++---- 11 files changed, 171 insertions(+), 100 deletions(-) create mode 100644 TWTW/TWTW/SearchPlaces/Model/StartCaller.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index 6b423639..2d7416b0 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 370108712B34415500F08128 /* DefaultsRoadViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370108702B34415500F08128 /* DefaultsRoadViewCoordinator.swift */; }; 370108732B34419B00F08128 /* RoadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370108722B34419B00F08128 /* RoadViewModel.swift */; }; 370AB45A2ADD12E000951562 /* DefaultMainMapCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370AB4592ADD12E000951562 /* DefaultMainMapCoordinator.swift */; }; + 3717385B2B36C9FA00A70135 /* StartCaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3717385A2B36C9FA00A70135 /* StartCaller.swift */; }; 371C1D2D2ADBAFA900B30DC5 /* DefaultNotificationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D2C2ADBAFA900B30DC5 /* DefaultNotificationCoordinator.swift */; }; 371C1D2F2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */; }; 371C1D312ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D302ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift */; }; @@ -320,6 +321,7 @@ 370108702B34415500F08128 /* DefaultsRoadViewCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsRoadViewCoordinator.swift; sourceTree = ""; }; 370108722B34419B00F08128 /* RoadViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoadViewModel.swift; sourceTree = ""; }; 370AB4592ADD12E000951562 /* DefaultMainMapCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultMainMapCoordinator.swift; sourceTree = ""; }; + 3717385A2B36C9FA00A70135 /* StartCaller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartCaller.swift; sourceTree = ""; }; 371C1D2C2ADBAFA900B30DC5 /* DefaultNotificationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultNotificationCoordinator.swift; sourceTree = ""; }; 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultFriendsListCoordinator.swift; sourceTree = ""; }; 371C1D302ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPreviousAppointmentsCoordinator.swift; sourceTree = ""; }; @@ -1702,6 +1704,7 @@ 37CE1EAE2AE75813009CDA21 /* SearchPlace.swift */, 3760CC8E2AE2CB7800CFC2D5 /* SurroundSearchPlaces.swift */, 37E8B8412B31E31A008D0F3D /* SearchPlacesConstraints.swift */, + 3717385A2B36C9FA00A70135 /* StartCaller.swift */, ); path = Model; sourceTree = ""; @@ -2175,6 +2178,7 @@ 3B4A660C2B161D8200DF9C84 /* CreateGroupViewModel.swift in Sources */, 375E8B022A95FCB000F8DE42 /* NearbyPlacesCollectionViewCell.swift in Sources */, 3799E5092A99D72D00E06218 /* NotificationViewController.swift in Sources */, + 3717385B2B36C9FA00A70135 /* StartCaller.swift in Sources */, 377CB0612AD8699C003453D6 /* MainMapCoordinator.swift in Sources */, 372109FC2B0CE7DD00B0946C /* MockSearchPlacesMapService.swift in Sources */, 37D5D78A2B19CF2800302EAD /* ParticipantsTableViewCell.swift in Sources */, diff --git a/TWTW/TWTW/Map/Protocol/CarRouteProtocol.swift b/TWTW/TWTW/Map/Protocol/CarRouteProtocol.swift index e6dee6ab..7c35a8a0 100644 --- a/TWTW/TWTW/Map/Protocol/CarRouteProtocol.swift +++ b/TWTW/TWTW/Map/Protocol/CarRouteProtocol.swift @@ -6,4 +6,3 @@ // import Foundation - diff --git a/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift b/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift index eccd39e5..2002ebd9 100644 --- a/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift +++ b/TWTW/TWTW/Participants/FindRoad/DefaultsFindRoadCoordinator.swift @@ -12,7 +12,7 @@ final class DefaultsFindRoadCoordinator: FindRoadCoordinator { var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController private var findRoadViewModel: FindRoadViewModel? - + // MARK: - Init init(navigationController: UINavigationController) { self.navigationController = navigationController @@ -23,6 +23,12 @@ final class DefaultsFindRoadCoordinator: FindRoadCoordinator { let findRoadViewModel = FindRoadViewModel(coordinator: self) let findRoadViewController = FindRoadViewController(viewModel: findRoadViewModel) navigationController.pushViewController(findRoadViewController, animated: true) - - } + + } + /// searchPlace로 이동 - 출발지 + func moveToStartSearchPlace() { + let searchPlaceMapCoordinator = DefaultSearchPlacesMapCoordinator(navigationController: navigationController) + searchPlaceMapCoordinator.moveToStartSearchPlace() + childCoordinators.append(searchPlaceMapCoordinator) + } } diff --git a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift index 45bbbbc2..64f7536e 100644 --- a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift +++ b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift @@ -21,6 +21,12 @@ final class FindRoadViewController: KakaoMapViewController { view.backgroundColor = .white return view }() + /// 내 위치 + private lazy var myLocationView: UIView = { + let view = UIView() + view.backgroundColor = .lightGray + return view + }() private lazy var myLocationLabel: UILabel = { let label = UILabel() @@ -28,6 +34,12 @@ final class FindRoadViewController: KakaoMapViewController { return label }() + /// 목적지 위치 + private lazy var destinationView: UIView = { + let view = UIView() + view.backgroundColor = .lightGray + return view + }() private lazy var destinationLabel: UILabel = { let label = UILabel() label.text = "목적지: 인천광역시 남동구 논현동 633-8" @@ -68,7 +80,7 @@ final class FindRoadViewController: KakaoMapViewController { super.viewDidLoad() setupUI() setupLocationManager() - + bind() carRouteButton.rx.tap .subscribe(onNext: { [weak self] _ in print("차 길 보기") @@ -84,6 +96,19 @@ final class FindRoadViewController: KakaoMapViewController { .disposed(by: disposeBag) } + /// binding + private func bind() { + myLocationLabel.isUserInteractionEnabled = true + + let myLocationLabelTap = myLocationLabel.rx.tapGesture() + .when(.recognized) + .map { _ in } + .asObservable() + + let input = FindRoadViewModel.Input(myLocationTap: myLocationLabelTap) + + viewModel.bind(input: input) + } override func addViews() { let defaultPosition: MapPoint = MapPoint(longitude: 126.733529, latitude: 37.3401906) @@ -96,6 +121,7 @@ final class FindRoadViewController: KakaoMapViewController { createLabelLayer() createPoiStyle() createPois() + showBasicGUIs() } @@ -126,13 +152,13 @@ final class FindRoadViewController: KakaoMapViewController { carRouteButton.snp.makeConstraints { make in make.top.equalTo(destinationLabel.snp.bottom).offset(20) make.leading.equalTo(infoView.snp.leading).offset(10) - make.height.equalTo(50) + make.height.equalTo(30) } walkRouteButton.snp.makeConstraints { make in make.top.equalTo(destinationLabel.snp.bottom).offset(20) make.trailing.equalTo(infoView.snp.trailing).offset(-10) - make.height.equalTo(50) + make.height.equalTo(30) make.leading.equalTo(carRouteButton.snp.trailing).offset(10) make.width.equalTo(carRouteButton.snp.width) } @@ -161,74 +187,70 @@ extension FindRoadViewController { let view = mapController?.getView("mapview") as? KakaoMap let manager = view?.getLabelManager() - let badge1 = PoiBadge(badgeID: "badge1", image: UIImage(named: "noti.png"), offset: CGPoint(x: 0.9, y: 0.1), zOrder: 0) - let iconStyle1 = PoiIconStyle(symbol: UIImage(named: "pin_green.png"), anchorPoint: CGPoint(x: 0.0, y: 0.5), badges: [badge1]) - let text1 = PoiTextLineStyle(textStyle: TextStyle(fontSize: 30, fontColor: UIColor.white, strokeThickness: 2, strokeColor: UIColor.green)) - let textStyle1 = PoiTextStyle(textLineStyles: [text1]) - textStyle1.textLayouts = [PoiTextLayout.center] - let poiStyle1 = PoiStyle(styleID: "customStyle1", styles: [ - PerLevelPoiStyle(iconStyle: iconStyle1, textStyle: textStyle1, level: 0) + let startPinIcon = PoiIconStyle(symbol: UIImage(named: "pin_green.png"), anchorPoint: CGPoint(x: 0.5, y: 0.5)) + let startText = PoiTextLineStyle(textStyle: TextStyle(fontSize: 25, fontColor: UIColor.white, strokeThickness: 0)) + let startTextStyle = PoiTextStyle(textLineStyles: [startText]) + startTextStyle.textLayouts = [PoiTextLayout.center] + let startPoiStyle = PoiStyle(styleID: "customStyle1", styles: [ + PerLevelPoiStyle(iconStyle: startPinIcon, textStyle: startTextStyle, level: 0) ]) - let badge2 = PoiBadge(badgeID: "badge2", image: UIImage(named: "noti2.png"), offset: CGPoint(x: 0.9, y: 0.1), zOrder: 0) - let iconStyle2 = PoiIconStyle(symbol: UIImage(named: "pin_red.png"), anchorPoint: CGPoint(x: 0.0, y: 0.5), badges: [badge2]) - let text2 = PoiTextLineStyle(textStyle: TextStyle(fontSize: 30, fontColor: UIColor.white, strokeThickness: 2, strokeColor: UIColor.red)) - let textStyle2 = PoiTextStyle(textLineStyles: [text2]) - textStyle2.textLayouts = [PoiTextLayout.center] - let poiStyle2 = PoiStyle(styleID: "customStyle2", styles: [ - PerLevelPoiStyle(iconStyle: iconStyle2, textStyle: textStyle2, level: 0) + + let endPinIcon = PoiIconStyle(symbol: UIImage(named: "pin_red.png"), anchorPoint: CGPoint(x: 0.5, y: 0.5)) + + let endText = PoiTextLineStyle(textStyle: TextStyle(fontSize: 25, fontColor: UIColor.white, strokeThickness: 0)) + let endTextStyle = PoiTextStyle(textLineStyles: [endText]) + endTextStyle.textLayouts = [PoiTextLayout.center] + let endPoiStyle = PoiStyle(styleID: "customStyle2", styles: [ + PerLevelPoiStyle(iconStyle: endPinIcon, textStyle: endTextStyle, level: 0) ]) - manager?.addPoiStyle(poiStyle1) - manager?.addPoiStyle(poiStyle2) + manager?.addPoiStyle(startPoiStyle) + manager?.addPoiStyle(endPoiStyle) } func createPois() { let view = mapController?.getView("mapview") as? KakaoMap let manager = view?.getLabelManager() - let layer = manager?.getLabelLayer(layerID: "PoiLayer") + let trackingManager = view?.getTrackingManager() + + /// 출발 + let positionLayer = manager?.getLabelLayer(layerID: "PoiLayer") let poiOption = PoiOptions(styleID: "customStyle1", poiID: "poi1") - poiOption.rank = 0 + poiOption.rank = 1 + poiOption.transformType = .decal poiOption.addText(PoiText(text: "출발", styleIndex: 0)) - let poi1 = layer?.addPoi(option: poiOption, at: MapPoint(longitude: 126.7335, latitude: 37.3402)) - poi1?.show() + /// 도착 + let endPositionLayer = manager?.getLabelLayer(layerID: "PoiLayer") + let endPoiOption = PoiOptions(styleID: "customStyle2", poiID: "poi2") + endPoiOption.rank = 1 + endPoiOption.transformType = .decal + endPoiOption.addText(PoiText(text: "도착", styleIndex: 0)) + + if let startPoi = positionLayer?.addPoi(option: poiOption, at: MapPoint(longitude: 126.73570807, latitude: 37.3977149815)) { + startPoi.show() + trackingManager?.startTrackingPoi(startPoi) + } + if let endPoi = endPositionLayer?.addPoi(option: endPoiOption, at: MapPoint(longitude: 126.79570807, latitude: 37.3977149815)) { + endPoi.show() + trackingManager?.startTrackingPoi(endPoi) + } } + } -// MARK: 마커 + extension FindRoadViewController { -// func createLabelLayer() { -// let view = mapController?.getView("mapview") as? KakaoMap -// let manager = view?.getLabelManager() -// let layerOption = LabelLayerOptions(layerID: "PoiLayer", competitionType: .none, competitionUnit: .symbolFirst, orderType: .rank, zOrder: 10001) -// let _ = manager?.addLabelLayer(option: layerOption) -// } - // func createPoiStyle() { - // let view = mapController?.getView("mapview") as? KakaoMap - // let manager = view?.getLabelManager() - // let iconStyle = PoiIconStyle(symbol: UIImage(named: "pin_green.png"), anchorPoint: CGPoint(x: 0.0, y: 0.5)) - // let perLevelStyle = PerLevelPoiStyle(iconStyle: iconStyle, level: 0) - // let poiStyle = PoiStyle(styleID: "customStyle1", styles: [perLevelStyle]) - // manager?.addPoiStyle(poiStyle) - // } - // - // func createPois() { - // let view = mapController?.getView("mapview") as? KakaoMap - // let manager = view?.getLabelManager() - // let layer = manager?.getLabelLayer(layerID: "PoiLayer") - // let poiOption = PoiOptions(styleID: "customStyle1") - // poiOption.rank = 0 - // - // let poi1 = layer?.addPoi(option:poiOption, at: MapPoint(longitude: 126.733529, latitude: 37.3401906)) - // // PoiBadge를 생성하여 POI에 추가한다. - // let badge = PoiBadge(badgeID: "noti", image: UIImage(named: "noti.png"), offset: CGPoint(x: 0.1, y: 0.1), zOrder: 1) - // poi1?.addBadge(badge) - // poi1?.show() - // poi1?.showBadge(badgeID: "noti") - // } - // - // + func showBasicGUIs() { + let view = mapController?.getView("mapview") as? KakaoMap + guard let view = view else { return } + view.setCompassPosition(origin: GuiAlignment(vAlign: .bottom, hAlign: .left), position: CGPoint(x: 10.0, y: 10.0)) + view.showCompass() + + view.setScaleBarPosition(origin: GuiAlignment(vAlign: .bottom, hAlign: .right), position: CGPoint(x: 10.0, y: 10.0)) + view.showScaleBar() + view.setScaleBarFadeInOutOption(FadeInOutOptions(fadeInTime: 2, fadeOutTime: 2, retentionTime: 3)) } } extension FindRoadViewController { @@ -254,7 +276,7 @@ extension FindRoadViewController { print("현재 위치 정보가 없습니다.") return } - let destination = CLLocationCoordinate2D(latitude: 39.403419311975, longitude: 125.72003443712) + let destination = CLLocationCoordinate2D(latitude: 37.3977149815, longitude: 126.79570807) let startMapPoint = MapPoint(longitude: currentLocation.longitude, latitude: currentLocation.latitude) let endMapPoint = MapPoint(longitude: destination.longitude, latitude: destination.latitude) let segment = RouteSegment(points: [startMapPoint, endMapPoint], styleIndex: 0) @@ -284,7 +306,7 @@ extension FindRoadViewController { print("현재 위치 정보가 없습니다.") return } - let destination = CLLocationCoordinate2D(latitude: 38.403419311975, longitude: 126.72003443712) + let destination = CLLocationCoordinate2D(latitude: 37.3977149815, longitude: 126.79570807) let startMapPoint = MapPoint(longitude: currentLocation.longitude, latitude: currentLocation.latitude) let endMapPoint = MapPoint(longitude: destination.longitude, latitude: destination.latitude) let segment = RouteSegment(points: [startMapPoint, endMapPoint], styleIndex: 0) @@ -312,7 +334,6 @@ extension FindRoadViewController { } // MARK: - Route Functions - /// 길찾기 표시 private func createRouteStyleSet() { guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } @@ -357,7 +378,6 @@ extension FindRoadViewController: CLLocationManagerDelegate { } myLocationLabel.text = "내 위치: \(newCoordinate.latitude), \(newCoordinate.longitude)" - moveCameraToCoordinate(newCoordinate) } @@ -377,7 +397,7 @@ extension FindRoadViewController: CLLocationManagerDelegate { guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } mapView.animateCamera(cameraUpdate: CameraUpdate.make(target: MapPoint(longitude: coordinate.longitude, latitude: coordinate.latitude), - zoomLevel: 15, + zoomLevel: 10, rotation: 1.7, tilt: 0.0, mapView: mapView), options: .init()) diff --git a/TWTW/TWTW/Participants/FindRoad/FindRoadViewModel.swift b/TWTW/TWTW/Participants/FindRoad/FindRoadViewModel.swift index af72fe3e..9bcaebf1 100644 --- a/TWTW/TWTW/Participants/FindRoad/FindRoadViewModel.swift +++ b/TWTW/TWTW/Participants/FindRoad/FindRoadViewModel.swift @@ -6,6 +6,7 @@ // import Foundation +import RxCocoa import RxSwift import UIKit @@ -13,12 +14,23 @@ final class FindRoadViewModel { private let disposeBag = DisposeBag() weak var coordinator: DefaultsFindRoadCoordinator? + struct Input { + let myLocationTap: Observable + } + // MARK: - Init init(coordinator: DefaultsFindRoadCoordinator) { self.coordinator = coordinator } - func moveToGetLocationViewController() { - print("get") + /// bind + func bind(input: Input) { + input.myLocationTap + .subscribe(onNext: {[weak self] in + guard let self = self else { return } + coordinator?.moveToStartSearchPlace() + }) + .disposed(by: disposeBag) + } } diff --git a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift index 18181407..bb089c0a 100644 --- a/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift +++ b/TWTW/TWTW/Plan/DefaultsPlansCoordinator.swift @@ -30,9 +30,7 @@ final class DefaultPlansCoordinator: PlanCoordinator { ) let plansViewController = PlansViewController(viewModel: plansViewModel) - navigationController.pushViewController(plansViewController, animated: false) - - + navigationController.pushViewController(plansViewController, animated: true) } func startFromAlert() { diff --git a/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift b/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift index ddba320c..b8d53c4f 100644 --- a/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift +++ b/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift @@ -6,10 +6,10 @@ // import UIKit -import RxCocoa import RxSwift +import RxCocoa -class DatePickerViewController: UIViewController { +final class DatePickerViewController: UIViewController { private let datePicker = UIDatePicker() let selectedDate = PublishSubject() private let disposeBag = DisposeBag() diff --git a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift index 9e76d474..c8761cd6 100644 --- a/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift +++ b/TWTW/TWTW/Plan/FromAlert/DefaultPlansFromAlertCoordinator.swift @@ -38,7 +38,7 @@ final class DefaultPlansFromAlertCoordinator: PlanFromAlertCoordinator { /// 친구추가 화면으로 이동 func addParticipants() { let friendsListCoordinator = DefaultFriendsListCoordinator(navigationController: navigationController) - friendsListCoordinator.delegate = self + friendsListCoordinator.delegate = self childCoordinators.append(friendsListCoordinator) friendsListCoordinator.startFromPartiSetLocation() } diff --git a/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift b/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift index 922ce9a4..40482389 100644 --- a/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift +++ b/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift @@ -36,7 +36,19 @@ final class DefaultSearchPlacesMapCoordinator: SearchPlacesMapCoordinatorProtoco navigationController.pushViewController(searchPlacesMapViewController, animated: true) } } - + /// 출발지 지정으로 들어가기 + func moveToStartSearchPlace() { + searchPlacesMapViewModel = SearchPlacesMapViewModel(coordinator: self, + searchPlacesServices: SearchPlacesMapService(), + surroundSearchServices: SurroundSearchService(), + caller: .forStartCaller) + searchPlacesMapViewController = SearchPlacesMapViewController() + searchPlacesMapViewController?.viewModel = searchPlacesMapViewModel + + if let searchPlacesMapViewController = searchPlacesMapViewController { + navigationController.pushViewController(searchPlacesMapViewController, animated: true) + } + } /// 서치 완료후 : cLLocation전달 & pop VC func finishSearchPlaces() { NotificationCenter.default.post(name: .didFinishSearchPlaces, object: nil) diff --git a/TWTW/TWTW/SearchPlaces/Model/StartCaller.swift b/TWTW/TWTW/SearchPlaces/Model/StartCaller.swift new file mode 100644 index 00000000..a0910fc0 --- /dev/null +++ b/TWTW/TWTW/SearchPlaces/Model/StartCaller.swift @@ -0,0 +1,13 @@ +// +// StartCaller.swift +// TWTW +// +// Created by 박다미 on 2023/12/23. +// + +import Foundation + +enum StartCaller { + case forStartCaller + case defaults +} diff --git a/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift b/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift index 6924f9f9..f4d32cbb 100644 --- a/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift +++ b/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift @@ -19,7 +19,7 @@ final class SearchPlacesMapViewModel { private let searchPlacesServices: SearchPlaceProtocol? private let surroundSearchServices: SurroundSearchProtocol? private var state = SearchPlacesMapState() - + private let caller: StartCaller struct Input { /// searchbar 글자변경 감지 let searchText: Observable @@ -42,10 +42,12 @@ final class SearchPlacesMapViewModel { // MARK: - init init(coordinator: SearchPlacesMapCoordinatorProtocol?, searchPlacesServices: SearchPlaceProtocol?, - surroundSearchServices: SurroundSearchProtocol?) { + surroundSearchServices: SurroundSearchProtocol?, + caller: StartCaller = .defaults) { self.coordinator = coordinator self.searchPlacesServices = searchPlacesServices self.surroundSearchServices = surroundSearchServices + self.caller = caller } /// bind @@ -82,31 +84,36 @@ final class SearchPlacesMapViewModel { input.selectedPlace .bind(onNext: { [weak self] selectedPlace in guard let self = self else { return } - // 장소 이름 저장 - if let placeName = selectedPlace.placeName { - _ = KeychainWrapper.saveItem(value: placeName, forKey: SearchPlaceKeyChain.placeName.rawValue) - } - - // 장소 URL 저장 - if let placeURL = selectedPlace.placeURL { - _ = KeychainWrapper.saveItem(value: placeURL, forKey: SearchPlaceKeyChain.placeURL.rawValue) - } - - // 도로명 주소 저장 - if let roadAddressName = selectedPlace.roadAddressName { - _ = KeychainWrapper.saveItem(value: roadAddressName, forKey: SearchPlaceKeyChain.roadAddressName.rawValue) - } - - // 경도 저장 - if let longitude = selectedPlace.longitude { - _ = KeychainWrapper.saveItem(value: "\(longitude)", forKey: SearchPlaceKeyChain.longitude.rawValue) - } - - // 위도 저장 - if let latitude = selectedPlace.latitude { - _ = KeychainWrapper.saveItem(value: "\(latitude)", forKey: SearchPlaceKeyChain.latitude.rawValue) - } - self.coordinator?.finishSearchPlaces() + switch self.caller { + case .forStartCaller: + print("내위치 선택") + case .defaults: + // 장소 이름 저장 + if let placeName = selectedPlace.placeName { + _ = KeychainWrapper.saveItem(value: placeName, forKey: SearchPlaceKeyChain.placeName.rawValue) + } + + // 장소 URL 저장 + if let placeURL = selectedPlace.placeURL { + _ = KeychainWrapper.saveItem(value: placeURL, forKey: SearchPlaceKeyChain.placeURL.rawValue) + } + + // 도로명 주소 저장 + if let roadAddressName = selectedPlace.roadAddressName { + _ = KeychainWrapper.saveItem(value: roadAddressName, forKey: SearchPlaceKeyChain.roadAddressName.rawValue) + } + + // 경도 저장 + if let longitude = selectedPlace.longitude { + _ = KeychainWrapper.saveItem(value: "\(longitude)", forKey: SearchPlaceKeyChain.longitude.rawValue) + } + + // 위도 저장 + if let latitude = selectedPlace.latitude { + _ = KeychainWrapper.saveItem(value: "\(latitude)", forKey: SearchPlaceKeyChain.latitude.rawValue) + } + self.coordinator?.finishSearchPlaces() + } }) .disposed(by: disposeBag) From aec5655e4ddb65629a009c95ba0974c3e4723202 Mon Sep 17 00:00:00 2001 From: dami Date: Sun, 24 Dec 2023 03:17:18 +0900 Subject: [PATCH 21/24] =?UTF-8?q?feat:=20Plan,Group=20friends=20Service,?= =?UTF-8?q?=20PlanAlert,Tabbar=20vm=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW.xcodeproj/project.pbxproj | 28 ++++++ TWTW/TWTW/Constants/API/EndPoint.swift | 13 ++- TWTW/TWTW/Group/Model/Group.swift | 6 ++ .../Participants/Model/Participants.swift | 17 ++++ .../Participants/ParticipantsService.swift | 79 ++++++++++++++++ .../Protocol/ParticipantsProtocol.swift | 28 ++++++ .../FromAlert/DatePickerViewController.swift | 4 +- TWTW/TWTW/Plan/Model/Plan.swift | 13 ++- TWTW/TWTW/Plan/PlanProtocol.swift | 15 +++ TWTW/TWTW/Plan/Service/PlanService.swift | 39 ++++++++ .../TWTW/Plan/Service/RevicePlanService.swift | 8 ++ TWTW/TWTW/Plan/View/PlansViewController.swift | 91 ++++++++----------- TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift | 9 +- 13 files changed, 291 insertions(+), 59 deletions(-) create mode 100644 TWTW/TWTW/Participants/ParticipantsService.swift create mode 100644 TWTW/TWTW/Participants/Protocol/ParticipantsProtocol.swift create mode 100644 TWTW/TWTW/Plan/PlanProtocol.swift create mode 100644 TWTW/TWTW/Plan/Service/PlanService.swift create mode 100644 TWTW/TWTW/Plan/Service/RevicePlanService.swift diff --git a/TWTW/TWTW.xcodeproj/project.pbxproj b/TWTW/TWTW.xcodeproj/project.pbxproj index 2d7416b0..4618a141 100644 --- a/TWTW/TWTW.xcodeproj/project.pbxproj +++ b/TWTW/TWTW.xcodeproj/project.pbxproj @@ -17,6 +17,11 @@ 371C1D2F2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */; }; 371C1D312ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D302ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift */; }; 371C1D332ADBB00300B30DC5 /* DefaultCallCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371C1D322ADBB00300B30DC5 /* DefaultCallCoordinator.swift */; }; + 371DDD722B372003007BAECC /* ParticipantsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371DDD712B372002007BAECC /* ParticipantsService.swift */; }; + 371DDD742B374284007BAECC /* ParticipantsProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371DDD732B374284007BAECC /* ParticipantsProtocol.swift */; }; + 371DDD772B37574D007BAECC /* PlanService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371DDD762B37574D007BAECC /* PlanService.swift */; }; + 371DDD792B3757E6007BAECC /* RevicePlanService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371DDD782B3757E6007BAECC /* RevicePlanService.swift */; }; + 371DDD7B2B375808007BAECC /* PlanProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371DDD7A2B375808007BAECC /* PlanProtocol.swift */; }; 371ECB892B2EF20D005174FF /* FriendListCaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB882B2EF20D005174FF /* FriendListCaller.swift */; }; 371ECB8B2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371ECB8A2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift */; }; 372109F82B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372109F72B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift */; }; @@ -326,6 +331,11 @@ 371C1D2E2ADBAFCC00B30DC5 /* DefaultFriendsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultFriendsListCoordinator.swift; sourceTree = ""; }; 371C1D302ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPreviousAppointmentsCoordinator.swift; sourceTree = ""; }; 371C1D322ADBB00300B30DC5 /* DefaultCallCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultCallCoordinator.swift; sourceTree = ""; }; + 371DDD712B372002007BAECC /* ParticipantsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsService.swift; sourceTree = ""; }; + 371DDD732B374284007BAECC /* ParticipantsProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantsProtocol.swift; sourceTree = ""; }; + 371DDD762B37574D007BAECC /* PlanService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanService.swift; sourceTree = ""; }; + 371DDD782B3757E6007BAECC /* RevicePlanService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RevicePlanService.swift; sourceTree = ""; }; + 371DDD7A2B375808007BAECC /* PlanProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanProtocol.swift; sourceTree = ""; }; 371ECB882B2EF20D005174FF /* FriendListCaller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendListCaller.swift; sourceTree = ""; }; 371ECB8A2B2EFE09005174FF /* FriendsListCoordinatorDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendsListCoordinatorDelegate.swift; sourceTree = ""; }; 372109F72B0CE74B00B0946C /* SearchPlaceMapViewModelUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPlaceMapViewModelUnitTests.swift; sourceTree = ""; }; @@ -653,6 +663,15 @@ path = RoadView; sourceTree = ""; }; + 371DDD752B37572D007BAECC /* Service */ = { + isa = PBXGroup; + children = ( + 371DDD782B3757E6007BAECC /* RevicePlanService.swift */, + 371DDD762B37574D007BAECC /* PlanService.swift */, + ); + path = Service; + sourceTree = ""; + }; 372109F52B0CE70700B0946C /* SearchPlaces */ = { isa = PBXGroup; children = ( @@ -823,6 +842,7 @@ 3788AEB12B18DC59007FC2F6 /* Plan */ = { isa = PBXGroup; children = ( + 371DDD752B37572D007BAECC /* Service */, 37D71E3F2B2F43C00004188A /* FromAlert */, 37D71E3E2B2F43B50004188A /* FromTabBar */, 3788AEB22B18DC66007FC2F6 /* Protocol */, @@ -831,6 +851,7 @@ 3788AEB52B18DC7F007FC2F6 /* ViewModel */, 3788AEBD2B18DF7F007FC2F6 /* DefaultsPlansCoordinator.swift */, 37D71E3A2B2F42130004188A /* PlanCaller.swift */, + 371DDD7A2B375808007BAECC /* PlanProtocol.swift */, ); path = Plan; sourceTree = ""; @@ -1353,6 +1374,7 @@ 37E0D8B52B180A8D002E0CF5 /* Protocol */, 37E0D8B22B180A35002E0CF5 /* View */, 37D5D7882B19CEB200302EAD /* Model */, + 371DDD712B372002007BAECC /* ParticipantsService.swift */, ); path = Participants; sourceTree = ""; @@ -1370,6 +1392,7 @@ isa = PBXGroup; children = ( 37E0D8AE2B1809EE002E0CF5 /* ParticipantsCoordinator.swift */, + 371DDD732B374284007BAECC /* ParticipantsProtocol.swift */, ); path = Protocol; sourceTree = ""; @@ -2168,6 +2191,7 @@ 374DB4612B24752800AF648C /* DefaultTabBarCoordinator.swift in Sources */, 371C1D332ADBB00300B30DC5 /* DefaultCallCoordinator.swift in Sources */, 3B6CF3DB2ADAD14A00325D05 /* MockSignInCoordinator.swift in Sources */, + 371DDD742B374284007BAECC /* ParticipantsProtocol.swift in Sources */, 37D71E602B30600F0004188A /* DefaultsFindRoadCoordinator.swift in Sources */, 3BAA4A222ADCD0C8009D14E7 /* MockSignUpService.swift in Sources */, 37D3AFE32B0F3E67006FB449 /* MockSearchPlacesMapCoordinator.swift in Sources */, @@ -2184,8 +2208,10 @@ 37D5D78A2B19CF2800302EAD /* ParticipantsTableViewCell.swift in Sources */, 37D5D7912B19ECF300302EAD /* Plan.swift in Sources */, 3B1850AE2AB5C781001945EE /* EndPoint.swift in Sources */, + 371DDD792B3757E6007BAECC /* RevicePlanService.swift in Sources */, 3759165E2A80AEE000C21E1F /* KeychainWrapper.swift in Sources */, 3B4A66042B160C7900DF9C84 /* Group.swift in Sources */, + 371DDD722B372003007BAECC /* ParticipantsService.swift in Sources */, 3B1850B02AB5C939001945EE /* Domain.swift in Sources */, 37D71E432B2F687B0004188A /* DefaultPlansFromAlertCoordinator.swift in Sources */, 3BAA4A192ADC1DEA009D14E7 /* SignUpProtocol.swift in Sources */, @@ -2236,9 +2262,11 @@ 374DB4662B247CB700AF648C /* MyPageCoordinator.swift in Sources */, 37E8B83E2B31AFA0008D0F3D /* CarRoute.swift in Sources */, 37BB03012B231188006B2BEB /* ChangeLocationModel.swift in Sources */, + 371DDD772B37574D007BAECC /* PlanService.swift in Sources */, 3B79E21C2B1A4C4E000790A2 /* FriendSearchDelegate.swift in Sources */, 37D71E5C2B305FF90004188A /* FindRoadViewModel.swift in Sources */, 3B0D6AA92ABBD1A900B08CAB /* LoginConstants.swift in Sources */, + 371DDD7B2B375808007BAECC /* PlanProtocol.swift in Sources */, 374DB4682B247CC800AF648C /* MyPageViewController.swift in Sources */, 37D5D7872B19CEA100302EAD /* Participants.swift in Sources */, 371C1D312ADBAFF300B30DC5 /* DefaultPreviousAppointmentsCoordinator.swift in Sources */, diff --git a/TWTW/TWTW/Constants/API/EndPoint.swift b/TWTW/TWTW/Constants/API/EndPoint.swift index 26607221..0dba6877 100644 --- a/TWTW/TWTW/Constants/API/EndPoint.swift +++ b/TWTW/TWTW/Constants/API/EndPoint.swift @@ -25,9 +25,10 @@ enum RoutePath: String { } enum GroupPath: String { - case group = "/group" + case group = "/group" // 그룹생성 case invite = "/group/invite" case join = "/group/join" + case lookUpGroup = "/group/GROUPID" // 그룹 단건조회 } enum FriendPath: String { @@ -35,3 +36,13 @@ enum FriendPath: String { case search = "/friends/search?nickname=NAME" case request = "/friends/request" } + +enum ParticipantsPath: String { + case all = "/plans/PLANID" // 그룹 모든 친구, 그룹 + plan + case not = "/plans/"// 그룹 + !plan 조회 + case request = "/plans/yet" // 그룹 + !plan 요청 +} + +enum PlanPath: String { + case all = "/plans/PLANID" // Plan 단건 조회 +} diff --git a/TWTW/TWTW/Group/Model/Group.swift b/TWTW/TWTW/Group/Model/Group.swift index 4370d109..37cba33b 100644 --- a/TWTW/TWTW/Group/Model/Group.swift +++ b/TWTW/TWTW/Group/Model/Group.swift @@ -14,3 +14,9 @@ struct Group: Codable { let name: String? let groupImage: String? } + +/// 그룹단건조회 +struct GroupLookUpRequest: Codable { + let groupId: String? +} + diff --git a/TWTW/TWTW/Participants/Model/Participants.swift b/TWTW/TWTW/Participants/Model/Participants.swift index 48be372d..5dca7fb9 100644 --- a/TWTW/TWTW/Participants/Model/Participants.swift +++ b/TWTW/TWTW/Participants/Model/Participants.swift @@ -13,3 +13,20 @@ struct Participant { let callImage: UIImage? let locationImage: UIImage? } +struct PlanResponse: Codable { + let planId: String + let placeId: String + let planMakerId: String + let planDay: String + let placeDetails: PlaceDetails + let groupInfo: GroupforPlanInfo + let members: [Friend] +} + +struct GroupforPlanInfo: Codable { + let groupId: String + let leaderId: String + let name: String + let groupImage: String + let groupMembers: [Friend] +} diff --git a/TWTW/TWTW/Participants/ParticipantsService.swift b/TWTW/TWTW/Participants/ParticipantsService.swift new file mode 100644 index 00000000..b21151bd --- /dev/null +++ b/TWTW/TWTW/Participants/ParticipantsService.swift @@ -0,0 +1,79 @@ +// +// ParticipantsService.swift +// TWTW +// +// Created by 박다미 on 2023/12/23. +// + +import Alamofire +import RxSwift + +final class ParticipantsService: ParticipantsProtocol { + + /// 그룹사람 + /// - 처음 지도화면들어갔을땐 plan에대한 정보가 없다 + /// - Group을 통해 Group참여자들 모두 조회 + /// - 이후에 plan을 통해 이 화면으로 돌아온 경우 참여자만 보여줄지 상의 필요 + + /// - Returns: Group내 모든 친구 조회 + func getGroupFriends(request: String) -> Observable<[Friend]> { + let groupID = "처음에 group셀로 들어올때 groupID KeyChain에 저장" + let url = Domain.RESTAPI + GroupPath.lookUpGroup.rawValue + .replacingOccurrences(of: "GROUPID", with: "groupID") + let header = Header.header.getHeader() + + return Observable.create { observer in + AF.request(url, + method: .get, + headers: header) + .responseDecodable(of: GroupLookUpInfo.self) { response in + switch response.result { + case .success(let data): + observer.onNext(data.groupMembers) + case .failure(let error): + observer.onError(error) + } + } + return Disposables.create() + } + } + /// plan 내 사람 + /// - Parameter word: planID + /// - Returns: plan내 Friends + func getParticipants(request: String) -> RxSwift.Observable<[Friend]> { + let planID = "plan 셀로 들어올때 ID KeyChain에 저장" + + let header = Header.header.getHeader() + + return Observable.create { observer in + let url = Domain.RESTAPI + ParticipantsPath.all.rawValue + .replacingOccurrences(of: "PLANID", with: planID) + AF.request(url, + method: .get, + headers: header) + .responseDecodable(of: Plan.self) { response in + switch response.result { + case .success(let data): + observer.onNext(data.members) + case .failure(let error): + observer.onError(error) + } + } + return Disposables.create() + } + } + + // MARK: - 아직 서버 미구현 부분 + /// Description: group이지만 참여하지 않은 친구 조회 + /// - Parameter word: <#word description#> + /// - Returns: <#description#> +// func getNotYetParticipants(request word: String) -> RxSwift.Observable<[Friend]> { +// +// } +// +// /// Description: group이지만 참여하지 않은 친구 초대요청 +// /// - Parameter memberId: <#memberId description#> +// /// - Returns: <#description#> +// func requestNotYetParticipants(request memberId: String) -> RxSwift.Observable { +// } +} diff --git a/TWTW/TWTW/Participants/Protocol/ParticipantsProtocol.swift b/TWTW/TWTW/Participants/Protocol/ParticipantsProtocol.swift new file mode 100644 index 00000000..aa8c35f1 --- /dev/null +++ b/TWTW/TWTW/Participants/Protocol/ParticipantsProtocol.swift @@ -0,0 +1,28 @@ +// +// ParticipantsProtocol.swift +// TWTW +// +// Created by 박다미 on 2023/12/24. +// + +import Foundation +import RxSwift + +protocol ParticipantsProtocol { + +/// - Group 친구 +/// 그룹 전체 참여자 목록 받아옴 + func getGroupFriends(request: String) -> Observable<[Friend]> + +/// - Plan 참여자 친구 +/// 그룹 내 특정 plan 참여자 목록 + func getParticipants(request: String) -> Observable<[Friend]> + +/// - 참여자가 아닌 친구 +/// 목록 보여주기 +//func getNotYetParticipants(request: String) -> Observable<[Friend]> +// +///// 그룹 내 특정 plan 참여 요청 +///// - Parameter memberId +//func requestNotYetParticipants(request: String) -> Observable +} diff --git a/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift b/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift index b8d53c4f..07f3a0ed 100644 --- a/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift +++ b/TWTW/TWTW/Plan/FromAlert/DatePickerViewController.swift @@ -5,9 +5,9 @@ // Created by 박다미 on 2023/12/20. // -import UIKit -import RxSwift import RxCocoa +import RxSwift +import UIKit final class DatePickerViewController: UIViewController { private let datePicker = UIDatePicker() diff --git a/TWTW/TWTW/Plan/Model/Plan.swift b/TWTW/TWTW/Plan/Model/Plan.swift index 4be81714..615d8ba8 100644 --- a/TWTW/TWTW/Plan/Model/Plan.swift +++ b/TWTW/TWTW/Plan/Model/Plan.swift @@ -26,12 +26,21 @@ struct Member: Codable { let id: String let nickname: String } - +/// 계획 단건 조회 struct Plan: Codable { let planId: String let placeId: String let planMakerId: String let placeDetails: PlaceDetails let groupInfo: GroupInfo - let members: [Member] + let members: [Friend] +} + +/// 그룹 단건 조회 +struct GroupLookUpInfo: Codable { + let groupId: String + let leaderId: String + let name: String + let groupImage: String + let groupMembers: [Friend] } diff --git a/TWTW/TWTW/Plan/PlanProtocol.swift b/TWTW/TWTW/Plan/PlanProtocol.swift new file mode 100644 index 00000000..9de0ba82 --- /dev/null +++ b/TWTW/TWTW/Plan/PlanProtocol.swift @@ -0,0 +1,15 @@ +// +// PlanProtocol.swift +// TWTW +// +// Created by 박다미 on 2023/12/24. +// + +import Foundation +import RxSwift +protocol PlanProtocol { + /// 계획 불러오는 페이지 + /// - Parameter request: 서버에 보내는 planID + /// - Returns: Plan단건조회 + func getPlanService(request: String) -> Observable +} diff --git a/TWTW/TWTW/Plan/Service/PlanService.swift b/TWTW/TWTW/Plan/Service/PlanService.swift new file mode 100644 index 00000000..01b2c153 --- /dev/null +++ b/TWTW/TWTW/Plan/Service/PlanService.swift @@ -0,0 +1,39 @@ +// +// PlanService.swift +// TWTW +// +// Created by 박다미 on 2023/12/24. +// + +import Alamofire +import CoreLocation +import Foundation +import RxSwift +import UIKit + +/// Plan페이지 정보: +/// - 약속명, 목적지, 날짜시간, 참여인원 불러오기 +final class PlanService: PlanProtocol { + func getPlanService(request: String) -> RxSwift.Observable { + let planID = "plan 셀로 들어올때 ID KeyChain에 저장" + + let header = Header.header.getHeader() + + return Observable.create { observer in + let url = Domain.RESTAPI + PlanPath.all.rawValue + .replacingOccurrences(of: "PLANID", with: planID) + AF.request(url, + method: .get, + headers: header) + .responseDecodable(of: Plan.self) { response in + switch response.result { + case .success(let data): + observer.onNext(data) + case .failure(let error): + observer.onError(error) + } + } + return Disposables.create() + } + } +} diff --git a/TWTW/TWTW/Plan/Service/RevicePlanService.swift b/TWTW/TWTW/Plan/Service/RevicePlanService.swift new file mode 100644 index 00000000..c655935e --- /dev/null +++ b/TWTW/TWTW/Plan/Service/RevicePlanService.swift @@ -0,0 +1,8 @@ +// +// RevicePlanService.swift +// TWTW +// +// Created by 박다미 on 2023/12/24. +// + +import Foundation diff --git a/TWTW/TWTW/Plan/View/PlansViewController.swift b/TWTW/TWTW/Plan/View/PlansViewController.swift index 07b8718e..3e3f1857 100644 --- a/TWTW/TWTW/Plan/View/PlansViewController.swift +++ b/TWTW/TWTW/Plan/View/PlansViewController.swift @@ -11,7 +11,8 @@ import UIKit /// PlanViewController - 일정 final class PlansViewController: UIViewController { - + private var currentViewType: PlanCaller = .fromTabBar + /// 친구 검색 버튼 private lazy var rightItemButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: nil) @@ -34,12 +35,12 @@ final class PlansViewController: UIViewController { name: "친구와 나들이1", groupImage: "aaaaa" ), members: [ - Member( - id: "37f64bef-b266-4787-8b53-599b2e0cea3c", + Friend( + memberId: "37f64bef-b266-4787-8b53-599b2e0cea3c", nickname: "친구1" ), - Member( - id: "2f6f96bf-4e17-41d7-8e17-15e17d41d7b0", + Friend( + memberId: "2f6f96bf-4e17-41d7-8e17-15e17d41d7b0", nickname: "친구2" ) ] @@ -61,12 +62,12 @@ final class PlansViewController: UIViewController { name: "친구와 나들이2", groupImage: "aaaaa" ), members: [ - Member( - id: "37f64bef-b266-4787-8b53-599b2e0cea3c", + Friend( + memberId: "37f64bef-b266-4787-8b53-599b2e0cea3c", nickname: "친구1" ), - Member( - id: "2f6f96bf-4e17-41d7-8e17-15e17d41d7b0", + Friend( + memberId: "2f6f96bf-4e17-41d7-8e17-15e17d41d7b0", nickname: "친구2" ) ] @@ -88,39 +89,12 @@ final class PlansViewController: UIViewController { name: "그룹이름임", groupImage: "aaaaa" ), members: [ - Member( - id: "47f64bef-b266-4787-8b53-599b2e0cea3c", + Friend( + memberId: "47f64bef-b266-4787-8b53-599b2e0cea3c", nickname: "친구11" ), - Member( - id: "3f6f96bf-4e17-41d7-8e17-15e17d41d7b0", - nickname: "친구12" - ) - ] - ), - Plan( - planId: "4b8e94bc-310a-4ee9-b5cc-624d3c794dd4", - placeId: "31e3045e-f75b-42a5-a5f5-2d63db7e2df8", - planMakerId: "165c66a2-7d21-47f0-bbfd-4751242d0a78", - placeDetails: PlaceDetails( - placeName: "인천 투썸2", - placeUrl: "https://example.com/place/2", - roadAddressName: "여의도로 1234", - longitude: 40.5259, - latitude: 125.0242 - ), - groupInfo: GroupInfo( - groupId: "ba977768-a940-4f89-ba24-aa1bf2f71355", - leaderId: "9df2b9ac-b424-44ca-9f30-25b245dc75f1", - name: "그룹이름임", groupImage: "aaaaa" - ), - members: [ - Member( - id: "47f64bef-b266-4787-8b53-599b2e0cea3c", - nickname: "친구11" - ), - Member( - id: "3f6f96bf-4e17-41d7-8e17-15e17d41d7b0", + Friend( + memberId: "3f6f96bf-4e17-41d7-8e17-15e17d41d7b0", nickname: "친구12" ) ] @@ -142,7 +116,6 @@ final class PlansViewController: UIViewController { init(viewModel: PlansViewModel) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) - setupCallerBinding() } @available(*, unavailable) @@ -163,18 +136,29 @@ final class PlansViewController: UIViewController { // MARK: Function /// setupTableView - table addSubView, register - private func setupCallerBinding() { - viewModel.callerObservable - .bind { [weak self] caller in - guard let self = self else { return } - if caller == .fromTabBar { - self.navigationItem.rightBarButtonItem = nil - } else if caller == .fromAlert { - self.navigationItem.rightBarButtonItem = self.rightItemButton - } - } - .disposed(by: disposeBag) +// private func setupCallerBinding() { +// viewModel.callerObservable +// .bind { [weak self] caller in +// guard let self = self else { return } +// if caller == .fromTabBar { +// self.navigationItem.rightBarButtonItem = nil +// } else if caller == .fromAlert { +// self.navigationItem.rightBarButtonItem = self.rightItemButton +// } +// } +// .disposed(by: disposeBag) +// } + private func updateViewState(from newViewState: PlanCaller) { + currentViewType = newViewState + switch currentViewType { + case .fromTabBar: + self.navigationItem.rightBarButtonItem = nil + + case .fromAlert: + self.navigationItem.rightBarButtonItem = self.rightItemButton + } } + private func setupTableView() { view.addSubview(planTableView) planTableView.register(PlanTableViewCell.self, forCellReuseIdentifier: CellIdentifier.planTableViewCell.rawValue) @@ -197,7 +181,7 @@ final class PlansViewController: UIViewController { addPlans: rightItemButton.rx.tap.asObservable() ) let output = viewModel.bind(input: input) - // bindTableView() + updateViewState(from: output.callerState) } /// bindTableView - touchEvent with rx @@ -213,5 +197,6 @@ final class PlansViewController: UIViewController { cell.configure(plan: plan) } } + } diff --git a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift index 0974be9f..de638e92 100644 --- a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift +++ b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift @@ -23,6 +23,9 @@ final class PlansViewModel { let selectedPlansList: Observable let addPlans: Observable } + struct Output { + let callerState: PlanCaller + } // MARK: - Init init(coordinator: DefaultPlansCoordinator, caller: PlanCaller = .fromTabBar) { @@ -30,7 +33,7 @@ final class PlansViewModel { self.caller = caller } - func bind(input: Input) { + func bind(input: Input) -> Output { input.selectedPlansList .bind { [weak self] _ in guard let self = self else { return } @@ -48,5 +51,9 @@ final class PlansViewModel { guard let self = self else { return } coordinator.moveToAddPlans() }.disposed(by: disposeBag) + + let output = Output(callerState: caller) + + return output } } From 938ad8e2d42ac35dcbee80294f8cb7dee90b1e20 Mon Sep 17 00:00:00 2001 From: dami Date: Sun, 24 Dec 2023 23:35:25 +0900 Subject: [PATCH 22/24] =?UTF-8?q?feat:=20kakao=20map=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=20tracking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW/Constants/API/EndPoint.swift | 1 + TWTW/TWTW/Constants/EncodedQuery.swift | 6 +- TWTW/TWTW/Constants/Map.swift | 3 + .../FindRoad/FindRoadViewController.swift | 340 ++++++++++++++---- TWTW/TWTW/Plan/Model/Plan.swift | 20 +- TWTW/TWTW/Plan/PlanProtocol.swift | 2 + TWTW/TWTW/Plan/Service/PlanService.swift | 26 +- TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift | 1 + .../TWTW/SearchPlaces/Model/SearchPlace.swift | 6 +- .../Service/SearchPlacesMapService.swift | 8 +- 10 files changed, 339 insertions(+), 74 deletions(-) diff --git a/TWTW/TWTW/Constants/API/EndPoint.swift b/TWTW/TWTW/Constants/API/EndPoint.swift index 0dba6877..9e25b170 100644 --- a/TWTW/TWTW/Constants/API/EndPoint.swift +++ b/TWTW/TWTW/Constants/API/EndPoint.swift @@ -45,4 +45,5 @@ enum ParticipantsPath: String { enum PlanPath: String { case all = "/plans/PLANID" // Plan 단건 조회 + case save = "/plans" //plan 저장 } diff --git a/TWTW/TWTW/Constants/EncodedQuery.swift b/TWTW/TWTW/Constants/EncodedQuery.swift index 453b11bb..2b5994c3 100644 --- a/TWTW/TWTW/Constants/EncodedQuery.swift +++ b/TWTW/TWTW/Constants/EncodedQuery.swift @@ -8,12 +8,12 @@ import Foundation enum EncodedQueryConfig { - case encodedQuery(searchText: String?) + case encodedQuery(encodeRequest: String?) func getEncodedQuery() -> String { switch self { - case .encodedQuery(let searchText): - return searchText?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" + case .encodedQuery(let encodeRequest): + return encodeRequest?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" } } } diff --git a/TWTW/TWTW/Constants/Map.swift b/TWTW/TWTW/Constants/Map.swift index 00b28bd4..7e5de14c 100644 --- a/TWTW/TWTW/Constants/Map.swift +++ b/TWTW/TWTW/Constants/Map.swift @@ -7,7 +7,10 @@ import Foundation import KakaoMapsSDK +import CoreLocation struct Map { static let DEFAULTPOSITION = MapPoint(longitude: 127.029148, latitude: 37.576568) // 초기 지도의 기본 위치 : 서울 + static let DEFAULTCLLOCATION = CLLocationCoordinate2D(latitude: 37.576568, longitude: 127.029148)// 초기 지도의 기본 위치 : 서울 + } diff --git a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift index 64f7536e..e8401ba4 100644 --- a/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift +++ b/TWTW/TWTW/Participants/FindRoad/FindRoadViewController.swift @@ -10,12 +10,30 @@ import KakaoMapsSDK import RxSwift import UIKit +enum Mode: Int { + case hidden = 0, + show, + tracking +} final class FindRoadViewController: KakaoMapViewController { - private var destinationCoordinate = CLLocationCoordinate2D(latitude: 37.403419311975, longitude: 126.72003443712) - private var locationManager = CLLocationManager() + var timer: Timer? + var currentPositionPoi: Poi? + var currentDirectionArrowPoi: Poi? + var currentDirectionPoi: Poi? + var currentHeading: Double + var currentPosition: GeoCoordinate + var mode: Mode + var moveOnce: Bool + var locationManager: CLLocationManager + var locationServiceAuthorized: CLAuthorizationStatus + + + private let startCoordinate = CLLocationCoordinate2D(latitude: 37.3977149815, longitude: 126.73570807) + private let destinationCoordinate = CLLocationCoordinate2D(latitude: 37.3977149815, longitude: 126.79570807) private var currentLocation: CLLocationCoordinate2D? + private lazy var infoView: UIView = { let view = UIView() view.backgroundColor = .white @@ -59,14 +77,24 @@ final class FindRoadViewController: KakaoMapViewController { button.backgroundColor = .green return button }() - + private let viewModel: FindRoadViewModel private let disposeBag = DisposeBag() // MARK: - Init init(viewModel: FindRoadViewModel) { self.viewModel = viewModel + locationServiceAuthorized = CLAuthorizationStatus.notDetermined + locationManager = CLLocationManager() + locationManager.distanceFilter = kCLDistanceFilterNone + locationManager.headingFilter = kCLHeadingFilterNone + locationManager.desiredAccuracy = kCLLocationAccuracyBest + currentHeading = 0 + currentPosition = GeoCoordinate() + mode = .hidden + moveOnce = false super.init() + locationManager.delegate = self } @available(*, unavailable) @@ -94,37 +122,42 @@ final class FindRoadViewController: KakaoMapViewController { self?.drawWalkRoute() }) .disposed(by: disposeBag) - + } /// binding private func bind() { myLocationLabel.isUserInteractionEnabled = true - + let myLocationLabelTap = myLocationLabel.rx.tapGesture() .when(.recognized) .map { _ in } .asObservable() - + let input = FindRoadViewModel.Input(myLocationTap: myLocationLabelTap) - + viewModel.bind(input: input) } override func addViews() { - let defaultPosition: MapPoint = MapPoint(longitude: 126.733529, latitude: 37.3401906) - let mapviewInfo: MapviewInfo = MapviewInfo(viewName: "mapview", viewInfoName: "map", defaultPosition: defaultPosition) + let mapviewInfo: MapviewInfo = MapviewInfo(viewName: "mapview", viewInfoName: "map", defaultPosition: Map.DEFAULTPOSITION) if mapController?.addView(mapviewInfo) == Result.OK { print("OK") - + createLabelLayer() + createPoiStyle() + createPois() + showBasicGUIs() + + createSpriteGUI() + // createLabelLayer() + // createPoiStyle() + // createPois() + createWaveShape() + } - createLabelLayer() - createPoiStyle() - createPois() - showBasicGUIs() } - + // MARK: - Setup UI private func setupUI() { @@ -169,18 +202,24 @@ final class FindRoadViewController: KakaoMapViewController { locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestWhenInUseAuthorization() locationManager.startUpdatingLocation() + locationManager.startUpdatingHeading() + } } - -// 마커 // 37.3401906, 126.733529 extension FindRoadViewController { - + func createLabelLayer() { let view = mapController?.getView("mapview") as? KakaoMap let manager = view?.getLabelManager() let layerOption = LabelLayerOptions(layerID: "PoiLayer", competitionType: .none, competitionUnit: .symbolFirst, orderType: .rank, zOrder: 10001) let _ = manager?.addLabelLayer(option: layerOption) + // + let positionLayerOption = LabelLayerOptions(layerID: "myPositionPoiLayer", competitionType: .none, competitionUnit: .symbolFirst, orderType: .rank, zOrder: 0) + let _ = manager?.addLabelLayer(option: positionLayerOption) + let directionLayerOption = LabelLayerOptions(layerID: "myDirectionPoiLayer", competitionType: .none, competitionUnit: .symbolFirst, orderType: .rank, zOrder: 10) + let _ = manager?.addLabelLayer(option: directionLayerOption) + } func createPoiStyle() { @@ -207,12 +246,28 @@ extension FindRoadViewController { manager?.addPoiStyle(startPoiStyle) manager?.addPoiStyle(endPoiStyle) + + // + let myLocationMarker = PoiIconStyle(symbol: UIImage(named: "map_ico_marker.png")) + let myLocationPerLevelStyle1 = PerLevelPoiStyle(iconStyle: myLocationMarker, level: 0) + let myLocationPoiStyle1 = PoiStyle(styleID: "myPositionPoiStyle", styles: [myLocationPerLevelStyle1]) + manager?.addPoiStyle(myLocationPoiStyle1) + + let direction = PoiIconStyle(symbol: UIImage(named: "map_ico_marker_direction.png"), anchorPoint: CGPoint(x: 0.5, y: 0.995)) + let myLocationPerLevelStyle2 = PerLevelPoiStyle(iconStyle: direction, level: 0) + let myLocationPoiStyle2 = PoiStyle(styleID: "myDirectionArrowPoiStyle", styles: [myLocationPerLevelStyle2]) + manager?.addPoiStyle(myLocationPoiStyle2) + + let area = PoiIconStyle(symbol: UIImage(named: "map_ico_direction_area.png"), anchorPoint: CGPoint(x: 0.5, y: 0.995)) + let myLocationPerLevelStyle3 = PerLevelPoiStyle(iconStyle: area, level: 0) + let myLocationPoiStyle3 = PoiStyle(styleID: "myDirectionPoiStyle", styles: [myLocationPerLevelStyle3]) + manager?.addPoiStyle(myLocationPoiStyle3) } func createPois() { let view = mapController?.getView("mapview") as? KakaoMap let manager = view?.getLabelManager() - let trackingManager = view?.getTrackingManager() + let trackingManager = view?.getTrackingManager() /// 출발 let positionLayer = manager?.getLabelLayer(layerID: "PoiLayer") @@ -230,14 +285,102 @@ extension FindRoadViewController { if let startPoi = positionLayer?.addPoi(option: poiOption, at: MapPoint(longitude: 126.73570807, latitude: 37.3977149815)) { startPoi.show() - trackingManager?.startTrackingPoi(startPoi) + trackingManager?.startTrackingPoi(startPoi) } if let endPoi = endPositionLayer?.addPoi(option: endPoiOption, at: MapPoint(longitude: 126.79570807, latitude: 37.3977149815)) { endPoi.show() - trackingManager?.startTrackingPoi(endPoi) + trackingManager?.startTrackingPoi(endPoi) } + + // + let myPositionLayer = manager?.getLabelLayer(layerID: "myPositionPoiLayer") + let myDirectionLayer = manager?.getLabelLayer(layerID: "myDirectionPoiLayer") + + // 현위치마커의 몸통에 해당하는 POI + let myLocationPoiOption = PoiOptions(styleID: "myPositionPoiStyle", poiID: "myPositionPOI") + myLocationPoiOption.rank = 1 + myLocationPoiOption.transformType = .decal // 화면이 기울여졌을 때, 지도를 따라 기울어져서 그려지도록 한다. + let myLocationPosition: MapPoint = MapPoint(longitude: 127.108678, latitude: 37.402001) + + currentPositionPoi = myPositionLayer?.addPoi(option: myLocationPoiOption, at: myLocationPosition) + + // 현위치마커의 방향표시 화살표에 해당하는 POI + let myLocationPoiOption2 = PoiOptions(styleID: "myDirectionArrowPoiStyle", poiID: "myDirectionArrowPOI") + myLocationPoiOption2.rank = 3 + myLocationPoiOption2.transformType = .absoluteRotationDecal + + currentDirectionArrowPoi = myPositionLayer?.addPoi(option: myLocationPoiOption2, at: myLocationPosition) + + // 현위치마커의 부채꼴모양 방향표시에 해당하는 POI + let myLocationPoiOption3 = PoiOptions(styleID: "myDirectionPoiStyle", poiID: "myDirectionPOI") + myLocationPoiOption3.rank = 2 + myLocationPoiOption3.transformType = .decal + + currentDirectionPoi = myDirectionLayer?.addPoi(option: myLocationPoiOption3, at: myLocationPosition) + + currentPositionPoi?.shareTransformWithPoi(currentDirectionArrowPoi!) //몸통이 방향표시와 위치 및 방향을 공유하도록 지정한다. 몸통 POI의 위치가 변경되면 방향표시 POI의 위치도 변경된다. 반대는 변경안됨. + currentDirectionArrowPoi?.shareTransformWithPoi(currentDirectionPoi!) //방향표시가 부채꼴모양과 위치 및 방향을 공유하도록 지정한다. + } + // 현위치 마커에 원형 물결효과를 주기 위해 원형 Polygon을 추가한다. + func createWaveShape() { + let view = mapController?.getView("mapview") as? KakaoMap + let manager = view?.getShapeManager() + let layer = manager?.addShapeLayer(layerID: "shapeLayer", zOrder: 10001, passType: .route) + + let shapeStyle = PolygonStyle(styles: [ + PerLevelPolygonStyle(color: UIColor(red: 0.3, green: 0.7, blue: 0.9, alpha: 1.0), level: 0) + ]) + let shapeStyleSet = PolygonStyleSet(styleSetID: "shapeLevelStyle") + shapeStyleSet.addStyle(shapeStyle) + manager?.addPolygonStyleSet(shapeStyleSet) + + let options = PolygonShapeOptions(shapeID: "waveShape", styleID: "shapeLevelStyle", zOrder: 1) + let points = Primitives.getCirclePoints(radius: 10.0, numPoints: 90, cw: true) + let polygon = Polygon(exteriorRing: points, hole: nil, styleIndex: 0) + + options.polygons.append(polygon) + options.basePosition = MapPoint(longitude: 0, latitude: 0) + + let shape = layer?.addPolygonShape(options) + currentDirectionPoi?.shareTransformWithShape(shape!) // 현위치마커 몸통이 Polygon이 위치 및 방향을 공유하도록 지정한다. } + func createAndStartWaveAnimation() { + let mapView: KakaoMap? = mapController?.getView("mapview") as? KakaoMap + let manager = mapView?.getShapeManager() + let layer = manager?.getShapeLayer(layerID: "shapeLayer") + let shape = layer?.getPolygonShape(shapeID: "waveShape") + let waveEffect = WaveAnimationEffect(datas: [ + WaveAnimationData(startAlpha: 0.8, endAlpha: 0.0, startRadius: 10.0, endRadius: 100.0, level: 0) + ]) + waveEffect.hideAtStop = true + waveEffect.interpolation = AnimationInterpolation(duration: 1000, method: .cubicOut) + waveEffect.playCount = 5 + + let animator = manager?.addShapeAnimator(animatorID: "circleWave", effect: waveEffect) + animator?.addPolygonShape(shape!) + animator?.start() + } + // 현위치마커 버튼 GUI + func createSpriteGUI() { + let mapView = mapController?.getView("mapview") as? KakaoMap + let spriteLayer = mapView?.getGuiManager().spriteGuiLayer + let spriteGui = SpriteGui("ButtonGui") + + spriteGui.arrangement = .horizontal + spriteGui.bgColor = UIColor.clear + spriteGui.splitLineColor = UIColor.white + spriteGui.origin = GuiAlignment(vAlign: .bottom, hAlign: .right) + + let button = GuiButton("CPB") + button.image = UIImage(named: "track_location_btn.png") + + spriteGui.addChild(button) + + spriteLayer?.addSpriteGui(spriteGui) + spriteGui.delegate = self + spriteGui.show() + } } extension FindRoadViewController { @@ -247,7 +390,7 @@ extension FindRoadViewController { guard let view = view else { return } view.setCompassPosition(origin: GuiAlignment(vAlign: .bottom, hAlign: .left), position: CGPoint(x: 10.0, y: 10.0)) view.showCompass() - + view.setScaleBarPosition(origin: GuiAlignment(vAlign: .bottom, hAlign: .right), position: CGPoint(x: 10.0, y: 10.0)) view.showScaleBar() view.setScaleBarFadeInOutOption(FadeInOutOptions(fadeInTime: 2, fadeOutTime: 2, retentionTime: 3)) } @@ -269,18 +412,18 @@ extension FindRoadViewController { let manager = mapView.getRouteManager() let layer = manager.addRouteLayer(layerID: "CarRouteLayer", zOrder: 0) - + createRouteStyleSet() - + guard let currentLocation = currentLocation else { print("현재 위치 정보가 없습니다.") return } - let destination = CLLocationCoordinate2D(latitude: 37.3977149815, longitude: 126.79570807) - let startMapPoint = MapPoint(longitude: currentLocation.longitude, latitude: currentLocation.latitude) - let endMapPoint = MapPoint(longitude: destination.longitude, latitude: destination.latitude) + + let startMapPoint = MapPoint(longitude: startCoordinate.longitude, latitude: startCoordinate.latitude) + let endMapPoint = MapPoint(longitude: destinationCoordinate.longitude, latitude: destinationCoordinate.latitude) let segment = RouteSegment(points: [startMapPoint, endMapPoint], styleIndex: 0) - + let options = RouteOptions(routeID: "CarRoute", styleID: "routeStyleSet1", zOrder: 0) options.segments = [segment] let route = layer?.addRoute(option: options) @@ -306,9 +449,8 @@ extension FindRoadViewController { print("현재 위치 정보가 없습니다.") return } - let destination = CLLocationCoordinate2D(latitude: 37.3977149815, longitude: 126.79570807) let startMapPoint = MapPoint(longitude: currentLocation.longitude, latitude: currentLocation.latitude) - let endMapPoint = MapPoint(longitude: destination.longitude, latitude: destination.latitude) + let endMapPoint = MapPoint(longitude: destinationCoordinate.longitude, latitude: destinationCoordinate.latitude) let segment = RouteSegment(points: [startMapPoint, endMapPoint], styleIndex: 0) // 4 Route 추가 @@ -318,20 +460,6 @@ extension FindRoadViewController { route?.show() } - /// 선택한 좌표로 카메라 옮기기 - private func moveCameraToCoordinate(_ coordinate: CLLocationCoordinate2D, _ output: MainMapViewModel.Output) { - guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } - mapView.animateCamera(cameraUpdate: CameraUpdate.make(target: MapPoint(longitude: coordinate.longitude, - latitude: coordinate.latitude), - zoomLevel: 15, - rotation: 1.7, - tilt: 0.0, - mapView: mapView), - options: CameraAnimationOptions(autoElevation: true, - consecutive: true, - durationInMillis: 2000), - callback: { }) - } // MARK: - Route Functions /// 길찾기 표시 @@ -368,38 +496,126 @@ extension FindRoadViewController { } // MARK: - CLLocationManagerDelegate extension FindRoadViewController: CLLocationManagerDelegate { + // func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + // guard let location = locations.last else { return } + // let newCoordinate = location.coordinate + // + // if currentLocation == nil { + // currentLocation = newCoordinate + // moveCameraToCoordinate(newCoordinate) + // } + // } + + + func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + locationServiceAuthorized = status + if locationServiceAuthorized == .authorizedWhenInUse && (mode == .show || mode == .tracking) { + locationManager.startUpdatingLocation() + locationManager.startUpdatingHeading() + } + } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + currentPosition.longitude = locations[0].coordinate.longitude + currentPosition.latitude = locations[0].coordinate.latitude guard let location = locations.last else { return } let newCoordinate = location.coordinate - if currentLocation == nil { currentLocation = newCoordinate + moveCameraToCoordinate(newCoordinate) } + // let mapView: KakaoMap? = mapController?.getView("mapview") as? KakaoMap + // let manager = mapView?.getMapMovablePoiManager() + // let poi = manager?.getMovablePoi("me") + // poi?.updatePosition(_currentPosition) + // manager?.animateMovablePois(pois: [poi!], duration: 1000) - myLocationLabel.text = "내 위치: \(newCoordinate.latitude), \(newCoordinate.longitude)" - moveCameraToCoordinate(newCoordinate) + // NSLog("CurrentLocation: %f, %f", locations[0].coordinate.longitude, locations[0].coordinate.latitude) } - - func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { - switch status { - case .authorizedWhenInUse, .authorizedAlways: - locationManager.startUpdatingLocation() - default: - // 위치 서비스 권한 처리 - break - } + func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) { + currentHeading = newHeading.trueHeading * Double.pi / 180.0 } +} +// MARK: - 지도 관련 함수 +extension FindRoadViewController { - + /// 선택한 좌표로 카메라 옮기기 private func moveCameraToCoordinate(_ coordinate: CLLocationCoordinate2D) { guard let mapView = mapController?.getView("mapview") as? KakaoMap else { return } mapView.animateCamera(cameraUpdate: CameraUpdate.make(target: MapPoint(longitude: coordinate.longitude, - latitude: coordinate.latitude), - zoomLevel: 10, - rotation: 1.7, - tilt: 0.0, - mapView: mapView), options: .init()) + latitude: coordinate.latitude), mapView: mapView), options: CameraAnimationOptions(autoElevation: false, consecutive: true, durationInMillis: 1000)) + + } +} +extension FindRoadViewController: GuiEventDelegate { + func guiDidTapped(_ gui: KakaoMapsSDK.GuiBase, componentName: String) { + // let mapView = mapController?.getView("mapview") as! KakaoMap + let button = gui.getChild(componentName) as? GuiButton + switch mode { + case .hidden: + mode = .show // 현위치마커 표시 + button?.image = UIImage(named: "track_location_btn_pressed.png") + timer = Timer.init(timeInterval: 0.3, target: self, selector: #selector(self.updateCurrentPositionPOI), userInfo: nil, repeats: true) + RunLoop.current.add(timer!, forMode: RunLoop.Mode.common) + startUpdateLocation() + currentPositionPoi?.show() + currentDirectionArrowPoi?.show() + createAndStartWaveAnimation() + moveOnce = true + break; + case .show: + mode = .tracking // 현위치마커 추적모드 + button?.image = UIImage(named: "track_location_btn_compass_on.png") + let mapView = mapController?.getView("mapview") as? KakaoMap + let trackingManager = mapView?.getTrackingManager() + trackingManager?.startTrackingPoi(currentDirectionArrowPoi!) + trackingManager?.isTrackingRoll = true + currentDirectionArrowPoi?.hide() + currentDirectionPoi?.show() + break; + case .tracking: + mode = .hidden //현위치마커 숨김 + button?.image = UIImage(named: "track_location_btn.png") + timer?.invalidate() + timer = nil + stopUpdateLocation() + currentPositionPoi?.hide() + currentDirectionPoi?.hide() + let mapView = mapController?.getView("mapview") as? KakaoMap + let trackingManager = mapView?.getTrackingManager() + trackingManager?.stopTracking() + } + gui.updateGui() + } + @objc func updateCurrentPositionPOI() { + currentPositionPoi?.moveAt(MapPoint(longitude: currentPosition.longitude, latitude: currentPosition.latitude), duration: 150) + currentDirectionArrowPoi?.rotateAt(currentHeading, duration: 150) + + if moveOnce { + let mapView: KakaoMap = ((mapController?.getView("mapview") as? KakaoMap)!) + mapView.moveCamera(CameraUpdate.make(target: MapPoint(longitude: currentPosition.longitude, latitude: currentPosition.latitude), mapView: mapView)) + moveOnce = false + } + // let mapView: KakaoMap? = mapController?.getView("mapview") as? KakaoMap + // let manager = mapView?.getShapeManager() + // let layer = manager?.getShapeLayer("shapeLayer") + // let shape = layer?.getShape("waveShape") + } + + func startUpdateLocation() { + if locationServiceAuthorized != .authorizedWhenInUse { + locationManager.requestWhenInUseAuthorization() + } + else { + locationManager.startUpdatingLocation() + locationManager.startUpdatingHeading() + } + } + + func stopUpdateLocation() { + locationManager.stopUpdatingHeading() + locationManager.stopUpdatingLocation() } } + diff --git a/TWTW/TWTW/Plan/Model/Plan.swift b/TWTW/TWTW/Plan/Model/Plan.swift index 615d8ba8..4b90d4e2 100644 --- a/TWTW/TWTW/Plan/Model/Plan.swift +++ b/TWTW/TWTW/Plan/Model/Plan.swift @@ -8,9 +8,9 @@ import UIKit struct PlaceDetails: Codable { - let placeName: String + var placeName: String let placeUrl: String - let roadAddressName: String + var roadAddressName: String let longitude: Double let latitude: Double } @@ -44,3 +44,19 @@ struct GroupLookUpInfo: Codable { let groupImage: String let groupMembers: [Friend] } + +/// 그룹 저장 +struct PlanSaveRequest: Codable { + let groupId: String + let planDay: String + var placeDetails: PlaceDetails + + mutating func encodePlaceDetails() { + placeDetails.placeName = EncodedQueryConfig.encodedQuery(encodeRequest: placeDetails.placeName).getEncodedQuery() + placeDetails.roadAddressName = EncodedQueryConfig.encodedQuery(encodeRequest: placeDetails.roadAddressName).getEncodedQuery() + } +} +struct PlanSaveResponse: Codable { + let planId: String + let groupId: String +} diff --git a/TWTW/TWTW/Plan/PlanProtocol.swift b/TWTW/TWTW/Plan/PlanProtocol.swift index 9de0ba82..9284aecf 100644 --- a/TWTW/TWTW/Plan/PlanProtocol.swift +++ b/TWTW/TWTW/Plan/PlanProtocol.swift @@ -12,4 +12,6 @@ protocol PlanProtocol { /// - Parameter request: 서버에 보내는 planID /// - Returns: Plan단건조회 func getPlanService(request: String) -> Observable + /// 계획 저장 + func savePlanService(request: PlanSaveRequest) -> Observable } diff --git a/TWTW/TWTW/Plan/Service/PlanService.swift b/TWTW/TWTW/Plan/Service/PlanService.swift index 01b2c153..85947654 100644 --- a/TWTW/TWTW/Plan/Service/PlanService.swift +++ b/TWTW/TWTW/Plan/Service/PlanService.swift @@ -14,9 +14,9 @@ import UIKit /// Plan페이지 정보: /// - 약속명, 목적지, 날짜시간, 참여인원 불러오기 final class PlanService: PlanProtocol { + func getPlanService(request: String) -> RxSwift.Observable { let planID = "plan 셀로 들어올때 ID KeyChain에 저장" - let header = Header.header.getHeader() return Observable.create { observer in @@ -36,4 +36,28 @@ final class PlanService: PlanProtocol { return Disposables.create() } } + + /// 계획 저장 savePlanService + func savePlanService(request: PlanSaveRequest) -> RxSwift.Observable { + + let header = Header.header.getHeader() + + return Observable.create { observer in + var encodedRequest = request + encodedRequest.encodePlaceDetails() + + let url = Domain.RESTAPI + PlanPath.save.rawValue + AF.request(url, method: .post, parameters: encodedRequest, encoder: JSONParameterEncoder.default, headers: header) + .validate(statusCode: 200..<201) + .responseDecodable(of: PlanSaveResponse.self) { response in + switch response.result { + case .success(let data): + observer.onNext(data) + case .failure(let error): + observer.onError(error) + } + } + return Disposables.create() + } + } } diff --git a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift index de638e92..84bba4a4 100644 --- a/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift +++ b/TWTW/TWTW/Plan/ViewModel/PlansViewModel.swift @@ -56,4 +56,5 @@ final class PlansViewModel { return output } + } diff --git a/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift b/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift index e4add632..8140efd8 100644 --- a/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift +++ b/TWTW/TWTW/SearchPlaces/Model/SearchPlace.swift @@ -17,10 +17,12 @@ struct SearchPlacesMapState { /// 보내는 장소명 text struct PlacesRequest: Codable { - let searchText: String? + var searchText: String? let pageNum: Int + mutating func encodeSearchPlaceDetails() { + searchText = EncodedQueryConfig.encodedQuery(encodeRequest: searchText).getEncodedQuery() + } } - /// 검색 결과 리스트 struct PlaceResponse: Codable { let results: [SearchPlace] diff --git a/TWTW/TWTW/SearchPlaces/Service/SearchPlacesMapService.swift b/TWTW/TWTW/SearchPlaces/Service/SearchPlacesMapService.swift index 92f18f68..ac2e1465 100644 --- a/TWTW/TWTW/SearchPlaces/Service/SearchPlacesMapService.swift +++ b/TWTW/TWTW/SearchPlaces/Service/SearchPlacesMapService.swift @@ -17,8 +17,9 @@ final class SearchPlacesMapService: SearchPlaceProtocol { /// Service연결 - searchPlaceService func searchPlaceService(request: PlacesRequest) -> Observable { return Observable.create { observer in - - let encodedQuery = EncodedQueryConfig.encodedQuery(searchText: request.searchText).getEncodedQuery() + var encodedRequest = request + encodedRequest.encodeSearchPlaceDetails() + let headers = Header.header.getHeader() let longitude = KeychainWrapper.loadItem(forKey: "longitude") ?? "" let latitude = KeychainWrapper.loadItem(forKey: "latitude") ?? "" @@ -27,8 +28,7 @@ final class SearchPlacesMapService: SearchPlaceProtocol { .replacingOccurrences(of: "LONGITUDE", with: longitude) .replacingOccurrences(of: "LATITUDE", with: latitude) .replacingOccurrences(of: "pageNum", with: "\(request.pageNum)") - .replacingOccurrences(of: "encodedQuery", with: encodedQuery) - // print(url) + .replacingOccurrences(of: "encodedQuery", with: encodedRequest.searchText ?? "") AF.request(url, method: .get, parameters: request, headers: headers) .validate(statusCode: 200..<201) From 6f16a24c5f904841fdf8c6a059758b5e515955ea Mon Sep 17 00:00:00 2001 From: HJ <81843677+HJ39@users.noreply.github.com> Date: Wed, 27 Dec 2023 00:44:40 +0900 Subject: [PATCH 23/24] =?UTF-8?q?feat:=20=EA=B7=B8=EB=A3=B9=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=EC=9E=90=20=EC=B6=94=EA=B0=80=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=B0=8F=20=EB=AA=A8=EB=8D=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TWTW/TWTW/Friends/Model/Friend.swift | 8 +++ .../ViewModel/FriendsListViewModel.swift | 24 +++---- .../MakeNewFriendsListViewModel.swift | 24 +++---- .../DefaultParticipantsCoordinator.swift | 18 ++++++ .../Participants/Model/Participants.swift | 6 -- .../Protocol/ParticipantsCoordinator.swift | 8 ++- .../View/ParticipantsTableViewCell.swift | 33 +++++----- .../View/ParticipantsViewController.swift | 63 +++++++++---------- .../ViewModel/ParticipantsViewModel.swift | 44 +++++++++++-- TWTW/TWTW/Plan/View/PlansViewController.swift | 18 ++++-- .../ViewModel/FriendSearchViewModel.swift | 24 +++---- 11 files changed, 168 insertions(+), 102 deletions(-) diff --git a/TWTW/TWTW/Friends/Model/Friend.swift b/TWTW/TWTW/Friends/Model/Friend.swift index 1dcf0cf0..d269cf4c 100644 --- a/TWTW/TWTW/Friends/Model/Friend.swift +++ b/TWTW/TWTW/Friends/Model/Friend.swift @@ -6,8 +6,16 @@ // import Foundation +import UIKit struct Friend: Codable, Equatable { let memberId: String? let nickname: String? + let participantsImage: String? + + enum CodingKeys: String, CodingKey { + case memberId + case nickname + case participantsImage = "profileImage" + } } diff --git a/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift b/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift index 0afd6bed..21bea3e2 100644 --- a/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift +++ b/TWTW/TWTW/FriendsList/ViewModel/FriendsListViewModel.swift @@ -93,18 +93,18 @@ final class FriendsListViewModel { /// 전체 친구 목록 로딩 /// - Parameter output: output private func getAllFriends(output: Output) { - let list = [Friend(memberId: "aasd1", nickname: "1"), - Friend(memberId: "aasd2", nickname: "2"), - Friend(memberId: "aasd3", nickname: "3"), - Friend(memberId: "aasd4", nickname: "4"), - Friend(memberId: "aasd5", nickname: "5"), - Friend(memberId: "aasd6", nickname: "6"), - Friend(memberId: "aasd7", nickname: "7"), - Friend(memberId: "aasd8", nickname: "8"), - Friend(memberId: "aasd9", nickname: "9"), - Friend(memberId: "aasd10", nickname: "10"), - Friend(memberId: "aasd11", nickname: "11"), - Friend(memberId: "aasd12", nickname: "12")] + let list = [Friend(memberId: "aasd1", nickname: "1", participantsImage: ""), + Friend(memberId: "aasd2", nickname: "2", participantsImage: ""), + Friend(memberId: "aasd3", nickname: "3", participantsImage: ""), + Friend(memberId: "aasd4", nickname: "4", participantsImage: ""), + Friend(memberId: "aasd5", nickname: "5", participantsImage: ""), + Friend(memberId: "aasd6", nickname: "6", participantsImage: ""), + Friend(memberId: "aasd7", nickname: "7", participantsImage: ""), + Friend(memberId: "aasd8", nickname: "8", participantsImage: ""), + Friend(memberId: "aasd9", nickname: "9", participantsImage: ""), + Friend(memberId: "aasd10", nickname: "10", participantsImage: ""), + Friend(memberId: "aasd11", nickname: "11", participantsImage: ""), + Friend(memberId: "aasd12", nickname: "12", participantsImage: "")] output.friendListRelay.accept(list) diff --git a/TWTW/TWTW/MakeNewFriends/ViewModel/MakeNewFriendsListViewModel.swift b/TWTW/TWTW/MakeNewFriends/ViewModel/MakeNewFriendsListViewModel.swift index b42cec0a..6449006e 100644 --- a/TWTW/TWTW/MakeNewFriends/ViewModel/MakeNewFriendsListViewModel.swift +++ b/TWTW/TWTW/MakeNewFriends/ViewModel/MakeNewFriendsListViewModel.swift @@ -105,18 +105,18 @@ final class MakeNewFriendsListViewModel { // return friendService.searchingFriends(word: searchText) // .catchAndReturn([]) - let list = [Friend(memberId: "aasd1", nickname: "1"), - Friend(memberId: "aasd2", nickname: "2"), - Friend(memberId: "aasd3", nickname: "3"), - Friend(memberId: "aasd4", nickname: "4"), - Friend(memberId: "aasd5", nickname: "5"), - Friend(memberId: "aasd6", nickname: "6"), - Friend(memberId: "aasd7", nickname: "7"), - Friend(memberId: "aasd8", nickname: "8"), - Friend(memberId: "aasd9", nickname: "9"), - Friend(memberId: "aasd10", nickname: "10"), - Friend(memberId: "aasd11", nickname: "11"), - Friend(memberId: "aasd12", nickname: "12") + let list = [Friend(memberId: "aasd1", nickname: "1", participantsImage: ""), + Friend(memberId: "aasd2", nickname: "2", participantsImage: ""), + Friend(memberId: "aasd3", nickname: "3", participantsImage: ""), + Friend(memberId: "aasd4", nickname: "4", participantsImage: ""), + Friend(memberId: "aasd5", nickname: "5", participantsImage: ""), + Friend(memberId: "aasd6", nickname: "6", participantsImage: ""), + Friend(memberId: "aasd7", nickname: "7", participantsImage: ""), + Friend(memberId: "aasd8", nickname: "8", participantsImage: ""), + Friend(memberId: "aasd9", nickname: "9", participantsImage: ""), + Friend(memberId: "aasd10", nickname: "10", participantsImage: ""), + Friend(memberId: "aasd11", nickname: "11", participantsImage: ""), + Friend(memberId: "aasd12", nickname: "12", participantsImage: "") ] return Observable.just(list.filter {$0.nickname?.contains(searchText) ?? false }) } diff --git a/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift index e771e860..c4bd3149 100644 --- a/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift +++ b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift @@ -11,6 +11,7 @@ import UIKit final class DefaultsParticipantsCoordinator: ParticipantsCoordinator { var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController + var output: ParticipantsViewModel.Output? // MARK: - Init init(navigationController: UINavigationController) { @@ -29,4 +30,21 @@ final class DefaultsParticipantsCoordinator: ParticipantsCoordinator { changeLocationCoordinator.start() childCoordinators.append(changeLocationCoordinator) } + + /// Add New Friends In Group + func moveAddNewFriends(output: ParticipantsViewModel.Output) { + let defaultFriendSearchCoordinator = DefaultFriendSearchCoordinator(navigationController: navigationController) + defaultFriendSearchCoordinator.start() + defaultFriendSearchCoordinator.delegate = self + self.output = output + childCoordinators.append(defaultFriendSearchCoordinator) + } +} + +extension DefaultsParticipantsCoordinator: FriendSearchDelegate { + func sendData(selectedList: [Friend]) { + output?.participantsRelay.accept(selectedList) + navigationController.popViewController(animated: true) + } + } diff --git a/TWTW/TWTW/Participants/Model/Participants.swift b/TWTW/TWTW/Participants/Model/Participants.swift index 5dca7fb9..08523b6d 100644 --- a/TWTW/TWTW/Participants/Model/Participants.swift +++ b/TWTW/TWTW/Participants/Model/Participants.swift @@ -7,12 +7,6 @@ import UIKit -struct Participant { - let participantsimage: UIImage? - let name: String - let callImage: UIImage? - let locationImage: UIImage? -} struct PlanResponse: Codable { let planId: String let placeId: String diff --git a/TWTW/TWTW/Participants/Protocol/ParticipantsCoordinator.swift b/TWTW/TWTW/Participants/Protocol/ParticipantsCoordinator.swift index 56e39b0e..32134c03 100644 --- a/TWTW/TWTW/Participants/Protocol/ParticipantsCoordinator.swift +++ b/TWTW/TWTW/Participants/Protocol/ParticipantsCoordinator.swift @@ -7,4 +7,10 @@ import Foundation -protocol ParticipantsCoordinator: Coordinator {} +protocol ParticipantsCoordinator: Coordinator { + /// 선택한 사람 장소 바꾸기 + func moveToChangeLocation() + + /// Add New Friends In Group + func moveAddNewFriends(output: ParticipantsViewModel.Output) +} diff --git a/TWTW/TWTW/Participants/View/ParticipantsTableViewCell.swift b/TWTW/TWTW/Participants/View/ParticipantsTableViewCell.swift index 7dd87313..4384edc5 100644 --- a/TWTW/TWTW/Participants/View/ParticipantsTableViewCell.swift +++ b/TWTW/TWTW/Participants/View/ParticipantsTableViewCell.swift @@ -12,7 +12,13 @@ import UIKit final class ParticipantsTableViewCell: UITableViewCell { lazy var disposeBag = DisposeBag() let participantImageView = UIImageView() - let nameLabel = UILabel() + + private lazy var nameLabel: UILabel = { + let label = UILabel() + label.textColor = .black + label.backgroundColor = .clear + return label + }() private lazy var buttonStackView: UIStackView = { let stackView = UIStackView() @@ -21,13 +27,17 @@ final class ParticipantsTableViewCell: UITableViewCell { stackView.spacing = 10 return stackView }() + private lazy var callButton: UIButton = { let btn = UIButton() + btn.setImage(UIImage(systemName: "phone"), for: .normal) btn.tintColor = .black return btn }() + private lazy var locationButton: UIButton = { let btn = UIButton() + btn.setImage(UIImage(systemName: "map"), for: .normal) btn.tintColor = .black return btn }() @@ -73,8 +83,8 @@ final class ParticipantsTableViewCell: UITableViewCell { make.leading.equalToSuperview().inset(10) make.top.bottom.equalToSuperview().inset(10) make.width.equalTo(participantImageView.snp.height) - } + nameLabel.snp.makeConstraints { make in make.leading.equalTo(participantImageView.snp.trailing).offset(10) make.centerY.equalToSuperview() @@ -85,22 +95,11 @@ final class ParticipantsTableViewCell: UITableViewCell { make.top.bottom.equalToSuperview().inset(10) make.width.equalTo(buttonStackView.snp.height).multipliedBy(2) } - callButton.snp.makeConstraints { make in - make.top.bottom.equalToSuperview() - make.width.equalTo(callButton.snp.height) - } - - locationButton.snp.makeConstraints { make in - make.top.bottom.equalToSuperview() - make.width.equalTo(callButton.snp.height) - } } /// configure - func configure(participant: Participant) { - self.participantImageView.image = participant.participantsimage - self.nameLabel.text = participant.name - self.callButton.setImage(participant.callImage, for: .normal) - self.locationButton.setImage(participant.locationImage, for: .normal) - } + func configure(participant: Friend) { +// participantImageView.image = participant.participantsimage + nameLabel.text = participant.nickname + } } diff --git a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift index 566df507..5eaad3f3 100644 --- a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift +++ b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift @@ -11,27 +11,16 @@ import UIKit final class ParticipantsViewController: UIViewController { - // 더미 데이터 생성 - let participants: [Participant] = - [ - Participant(participantsimage: UIImage(systemName: "person"), - name: "박다미", - callImage: UIImage(systemName: "phone"), locationImage: UIImage(systemName: "map")), - Participant(participantsimage: UIImage(systemName: "person"), - name: "박다미", callImage: UIImage(systemName: "phone"), - locationImage: UIImage(systemName: "map")), - Participant(participantsimage: UIImage(systemName: "person"), - name: "박다미", callImage: UIImage(systemName: "phone"), - locationImage: UIImage(systemName: "map")), - Participant(participantsimage: UIImage(systemName: "person"), - name: "박다미", callImage: UIImage(systemName: "phone"), - locationImage: UIImage(systemName: "map")) - ] - private let disposeBag = DisposeBag() - private var viewModel: ParticipantsViewModel + /// plus + private lazy var plusRightButton: UIButton = { + let btn = UIButton() + btn.setImage(UIImage(systemName: "plus")?.withTintColor(.black, renderingMode: .alwaysOriginal), for: .normal) + return btn + }() private lazy var partiTableView: UITableView = { let tableView = UITableView() + tableView.backgroundColor = .clear return tableView }() @@ -46,13 +35,30 @@ final class ParticipantsViewController: UIViewController { fatalError("init(coder:) has not been implemented") } + private let disposeBag = DisposeBag() + private var viewModel: ParticipantsViewModel + // MARK: View Did Load override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .orange - view.layer.cornerRadius = 20 + view.backgroundColor = .white + + navigationItem.title = "친구목록" + navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black] + navigationItem.rightBarButtonItem = UIBarButtonItem(customView: plusRightButton) + setupTableView() - bindTableView() + bind() + } + + /// binding + private func bind() { + let input = ParticipantsViewModel.Input(changeLocationButtonTapped: partiTableView.rx.itemSelected, + plusButtonEvents: plusRightButton.rx.tap) + + let output = viewModel.bind(input: input) + + bindTableView(output: output) } private func setupTableView() { @@ -63,14 +69,14 @@ final class ParticipantsViewController: UIViewController { } } - private func bindTableView() { + private func bindTableView(output: ParticipantsViewModel.Output) { // 데이터 바인딩 - Observable.just(participants) + output.participantsRelay .bind(to: partiTableView.rx.items( cellIdentifier: CellIdentifier.participantsTableViewCell.rawValue, - cellType: ParticipantsTableViewCell.self)) { (row, participant, cell) in + cellType: ParticipantsTableViewCell.self)) { (_, participant, cell) in cell.configure(participant: participant) - + cell.backgroundColor = .clear /// 전화 버튼 탭 이벤트 구독 cell.callBtnTapObservable .subscribe(onNext: { @@ -87,12 +93,5 @@ final class ParticipantsViewController: UIViewController { } .disposed(by: disposeBag) - /// 셀 선택 이벤트 처리 - let changeLocationTapped = partiTableView.rx.itemSelected - .map { _ in () } - .asObservable() - - let input = ParticipantsViewModel.Input(changeLocationButtonTapped: changeLocationTapped) - viewModel.bind(input: input) } } diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift index f11b1323..a1983d49 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift @@ -7,7 +7,9 @@ import Foundation import RxCocoa +import RxRelay import RxSwift +import UIKit final class ParticipantsViewModel { private let disposeBag = DisposeBag() @@ -15,7 +17,12 @@ final class ParticipantsViewModel { /// Input struct Input { - let changeLocationButtonTapped: Observable + let changeLocationButtonTapped: ControlEvent? + let plusButtonEvents: ControlEvent? + } + + struct Output { + var participantsRelay: BehaviorRelay<[Friend]> = BehaviorRelay(value: []) } // MARK: - Init @@ -24,15 +31,44 @@ final class ParticipantsViewModel { } /// bind - func bind(input: Input) { - input.changeLocationButtonTapped - .subscribe(onNext: {[weak self] in + func bind(input: Input) -> Output { + let output = Output() + input.changeLocationButtonTapped? + .subscribe(onNext: { [weak self] _ in self?.changeLocationButtonTapped() }) .disposed(by: disposeBag) + + input.plusButtonEvents? + .bind { [weak self] in + guard let self = self else {return} + moveAddFriends(output: output) + } + .disposed(by: disposeBag) + + dummyData(output: output) + return output } + /// 화면이동 private func changeLocationButtonTapped() { coordinator?.moveToChangeLocation() } + + /// move Add Friends + private func moveAddFriends(output: Output) { + coordinator?.moveAddNewFriends(output: output) + } + + /// Create Dummy + private func dummyData(output: Output) { + let list = [ Friend(memberId: "1", nickname: "aa", participantsImage: ""), + Friend(memberId: "1", nickname: "aa", participantsImage: ""), + Friend(memberId: "1", nickname: "aa", participantsImage: ""), + Friend(memberId: "1", nickname: "aa", participantsImage: ""), + Friend(memberId: "1", nickname: "aa", participantsImage: ""), + Friend(memberId: "1", nickname: "aa", participantsImage: "")] + + output.participantsRelay.accept(list) + } } diff --git a/TWTW/TWTW/Plan/View/PlansViewController.swift b/TWTW/TWTW/Plan/View/PlansViewController.swift index 3e3f1857..005942a5 100644 --- a/TWTW/TWTW/Plan/View/PlansViewController.swift +++ b/TWTW/TWTW/Plan/View/PlansViewController.swift @@ -37,11 +37,13 @@ final class PlansViewController: UIViewController { members: [ Friend( memberId: "37f64bef-b266-4787-8b53-599b2e0cea3c", - nickname: "친구1" + nickname: "친구1", + participantsImage: "" ), Friend( memberId: "2f6f96bf-4e17-41d7-8e17-15e17d41d7b0", - nickname: "친구2" + nickname: "친구2", + participantsImage: "" ) ] ), @@ -64,11 +66,13 @@ final class PlansViewController: UIViewController { members: [ Friend( memberId: "37f64bef-b266-4787-8b53-599b2e0cea3c", - nickname: "친구1" + nickname: "친구1", + participantsImage: "" ), Friend( memberId: "2f6f96bf-4e17-41d7-8e17-15e17d41d7b0", - nickname: "친구2" + nickname: "친구2", + participantsImage: "" ) ] ), @@ -91,11 +95,13 @@ final class PlansViewController: UIViewController { members: [ Friend( memberId: "47f64bef-b266-4787-8b53-599b2e0cea3c", - nickname: "친구11" + nickname: "친구11", + participantsImage: "" ), Friend( memberId: "3f6f96bf-4e17-41d7-8e17-15e17d41d7b0", - nickname: "친구12" + nickname: "친구12", + participantsImage: "" ) ] ) diff --git a/TWTW/TWTW/SearchFriends/ViewModel/FriendSearchViewModel.swift b/TWTW/TWTW/SearchFriends/ViewModel/FriendSearchViewModel.swift index 152ad332..648a89fc 100644 --- a/TWTW/TWTW/SearchFriends/ViewModel/FriendSearchViewModel.swift +++ b/TWTW/TWTW/SearchFriends/ViewModel/FriendSearchViewModel.swift @@ -87,18 +87,18 @@ final class FriendSearchViewModel { /// 전체 친구 목록 로딩 /// - Parameter output: output private func getAllFriends(output: Output) { - let list = [Friend(memberId: "aasd1", nickname: "1"), - Friend(memberId: "aasd2", nickname: "2"), - Friend(memberId: "aasd3", nickname: "3"), - Friend(memberId: "aasd4", nickname: "4"), - Friend(memberId: "aasd5", nickname: "5"), - Friend(memberId: "aasd6", nickname: "6"), - Friend(memberId: "aasd7", nickname: "7"), - Friend(memberId: "aasd8", nickname: "8"), - Friend(memberId: "aasd9", nickname: "9"), - Friend(memberId: "aasd10", nickname: "10"), - Friend(memberId: "aasd11", nickname: "11"), - Friend(memberId: "aasd12", nickname: "12")] + let list = [Friend(memberId: "aasd1", nickname: "1", participantsImage: ""), + Friend(memberId: "aasd2", nickname: "2", participantsImage: ""), + Friend(memberId: "aasd3", nickname: "3", participantsImage: ""), + Friend(memberId: "aasd4", nickname: "4", participantsImage: ""), + Friend(memberId: "aasd5", nickname: "5", participantsImage: ""), + Friend(memberId: "aasd6", nickname: "6", participantsImage: ""), + Friend(memberId: "aasd7", nickname: "7", participantsImage: ""), + Friend(memberId: "aasd8", nickname: "8", participantsImage: ""), + Friend(memberId: "aasd9", nickname: "9", participantsImage: ""), + Friend(memberId: "aasd10", nickname: "10", participantsImage: ""), + Friend(memberId: "aasd11", nickname: "11", participantsImage: ""), + Friend(memberId: "aasd12", nickname: "12", participantsImage: "")] output.friendListRelay.accept(list) } From a47ccaac7fb3ee553f2a11cf3003fac74c2f1b94 Mon Sep 17 00:00:00 2001 From: HJ <81843677+HJ39@users.noreply.github.com> Date: Wed, 27 Dec 2023 03:01:46 +0900 Subject: [PATCH 24/24] =?UTF-8?q?feat:=20=EB=82=B4=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=ED=99=94=EB=A9=B4=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EB=B0=8F=20MainMap=20NotificationCenter=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODO 내위치 변경 API 연결 --- TWTW/TWTW/Map/DefaultMainMapCoordinator.swift | 7 +++ .../MainMapViewController.swift | 39 ++++++++-------- .../TWTW/Map/ViewModel/MainMapViewModel.swift | 2 + .../DefaultParticipantsCoordinator.swift | 14 ++++-- .../View/ParticipantsViewController.swift | 1 + .../ViewModel/ParticipantsViewModel.swift | 16 +++++++ .../DefaultSearchPlacesMapCoordinator.swift | 45 ++++++++++--------- .../TWTW/SearchPlaces/Model/StartCaller.swift | 1 + .../SearchPlacesMapCoordDelegate.swift | 2 +- .../ViewModel/SearchPlacesMapViewModel.swift | 11 +++++ 10 files changed, 96 insertions(+), 42 deletions(-) diff --git a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift index 416ced93..54cc5a01 100644 --- a/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift +++ b/TWTW/TWTW/Map/DefaultMainMapCoordinator.swift @@ -39,6 +39,7 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { _ = KeychainWrapper.saveItem(value: "\(output.myLocatiaonRelay.value.latitude)", forKey: "latitude") _ = KeychainWrapper.saveItem(value: "\(output.myLocatiaonRelay.value.longitude)", forKey: "longitude") searchPlacesMapCoordinator.start() + searchPlacesMapCoordinator.delegate = self childCoordinators.append(searchPlacesMapCoordinator) } /// 친구 목록 화면으로 이동 @@ -76,3 +77,9 @@ final class DefaultMainMapCoordinator: MainMapCoordinator { } } + +extension DefaultMainMapCoordinator: SearchPlacesMapCoordDelegate { + func didSelectPlace(searchPlace: SearchPlace?) { + mainMapViewModelOutput?.finishSearchCoordinator.onNext(true) + } +} diff --git a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift index 7414025a..af4868c1 100644 --- a/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift +++ b/TWTW/TWTW/Map/View/ViewController/MainMapViewController.swift @@ -88,7 +88,6 @@ final class MainMapViewController: KakaoMapViewController { super.viewDidLoad() bind() setupUI() - setNotificationFromSearchPlace() } /// 지도 그리기 @@ -106,24 +105,27 @@ final class MainMapViewController: KakaoMapViewController { } // MARK: - Set Up - private func setNotificationFromSearchPlace() { - NotificationCenter.default.addObserver(forName: .didFinishSearchPlaces, object: nil, queue: nil) { [weak self] _ in - guard let self = self else { return } - updateViewStateAndMoveCamera() - - - } - } - private func updateViewStateAndMoveCamera() { - // 키체인에서 위치 정보 - if let latitude = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.latitude.rawValue), - let longitude = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.longitude.rawValue) { - let coordinate = CLLocationCoordinate2D(latitude: Double(latitude) ?? 0, longitude: Double(longitude) ?? 0) - moveCameraToCoordinate(coordinate) - updateViewState(from: .searchMap) - addSearchPlaceBottomSheet() + private func setNotificationFromSearchPlace(output: MainMapViewModel.Output) { + output.finishSearchCoordinator + .bind { [weak self] check in + if check { + self?.updateViewStateAndMoveCamera() + } } - + .disposed(by: disposeBag) + + } + + private func updateViewStateAndMoveCamera() { + // 키체인에서 위치 정보 + if let latitude = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.latitude.rawValue), + let longitude = KeychainWrapper.loadItem(forKey: SearchPlaceKeyChain.longitude.rawValue) { + let coordinate = CLLocationCoordinate2D(latitude: Double(latitude) ?? 0, longitude: Double(longitude) ?? 0) + moveCameraToCoordinate(coordinate) + updateViewState(from: .searchMap) + addSearchPlaceBottomSheet() + } + } deinit { @@ -209,6 +211,7 @@ final class MainMapViewController: KakaoMapViewController { surroundSelectedTouchEvnets: nearbyPlacesCollectionView.rx.itemSelected.asObservable()) let output = viewModel.bind(input: input) self.output = output + setNotificationFromSearchPlace(output: output) } private func updateViewState(from newViewState: ViewState) { diff --git a/TWTW/TWTW/Map/ViewModel/MainMapViewModel.swift b/TWTW/TWTW/Map/ViewModel/MainMapViewModel.swift index 5dbe678b..088d4798 100644 --- a/TWTW/TWTW/Map/ViewModel/MainMapViewModel.swift +++ b/TWTW/TWTW/Map/ViewModel/MainMapViewModel.swift @@ -62,6 +62,8 @@ final class MainMapViewModel { var destinationPathRelay: BehaviorRelay<[[Double]]> = BehaviorRelay(value: [[]]) var moveSearchCoordinator: PublishSubject = PublishSubject() + + var finishSearchCoordinator: BehaviorSubject = BehaviorSubject(value: false) } // MARK: - init diff --git a/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift index c4bd3149..24bda3d2 100644 --- a/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift +++ b/TWTW/TWTW/Participants/DefaultParticipantsCoordinator.swift @@ -26,9 +26,10 @@ final class DefaultsParticipantsCoordinator: ParticipantsCoordinator { /// 선택한 사람 장소 바꾸기 func moveToChangeLocation() { - let changeLocationCoordinator = DefaultChangeLocationCoordinator(navigationController: navigationController) - changeLocationCoordinator.start() - childCoordinators.append(changeLocationCoordinator) + let defaultSearchPlacesMapCoordinator = DefaultSearchPlacesMapCoordinator(navigationController: navigationController) + defaultSearchPlacesMapCoordinator.moveByGroupMemberList() + defaultSearchPlacesMapCoordinator.delegate = self + childCoordinators.append(defaultSearchPlacesMapCoordinator) } /// Add New Friends In Group @@ -48,3 +49,10 @@ extension DefaultsParticipantsCoordinator: FriendSearchDelegate { } } + +extension DefaultsParticipantsCoordinator: SearchPlacesMapCoordDelegate { + func didSelectPlace(searchPlace: SearchPlace?) { + guard let searchPlace = searchPlace else { return } + output?.myLocationRelay.accept(searchPlace) + } +} diff --git a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift index 5eaad3f3..a0d67657 100644 --- a/TWTW/TWTW/Participants/View/ParticipantsViewController.swift +++ b/TWTW/TWTW/Participants/View/ParticipantsViewController.swift @@ -77,6 +77,7 @@ final class ParticipantsViewController: UIViewController { cellType: ParticipantsTableViewCell.self)) { (_, participant, cell) in cell.configure(participant: participant) cell.backgroundColor = .clear + cell.selectionStyle = .none /// 전화 버튼 탭 이벤트 구독 cell.callBtnTapObservable .subscribe(onNext: { diff --git a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift index a1983d49..cde47b8e 100644 --- a/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift +++ b/TWTW/TWTW/Participants/ViewModel/ParticipantsViewModel.swift @@ -23,6 +23,7 @@ final class ParticipantsViewModel { struct Output { var participantsRelay: BehaviorRelay<[Friend]> = BehaviorRelay(value: []) + var myLocationRelay: BehaviorRelay = BehaviorRelay(value: nil) } // MARK: - Init @@ -46,6 +47,8 @@ final class ParticipantsViewModel { } .disposed(by: disposeBag) + + changeMyLocation(output: output) dummyData(output: output) return output } @@ -71,4 +74,17 @@ final class ParticipantsViewModel { output.participantsRelay.accept(list) } + + // MARK: - API CONNECT + + /// 내위치 변경하기 + private func changeMyLocation(output: Output) { + output.myLocationRelay + .bind { [weak self] searchPlace in + guard let self = self, let searchPlace = searchPlace else { return } + /// TODO + /// 내위치 변경 API 연결 + } + .disposed(by: disposeBag) + } } diff --git a/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift b/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift index 40482389..e5a054a7 100644 --- a/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift +++ b/TWTW/TWTW/SearchPlaces/DefaultSearchPlacesMapCoordinator.swift @@ -12,46 +12,51 @@ import UIKit /// SearchPlacesMap 관리하는 Coordinator final class DefaultSearchPlacesMapCoordinator: SearchPlacesMapCoordinatorProtocol { - private let disposeBag = DisposeBag() var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController - // weak var delegate: SearchPlacesMapCoordDelegate? - - private var searchPlacesMapViewController: SearchPlacesMapViewController? - private var searchPlacesMapViewModel: SearchPlacesMapViewModel? + weak var delegate: SearchPlacesMapCoordDelegate? init(navigationController: UINavigationController) { self.navigationController = navigationController - } func start() { - searchPlacesMapViewModel = SearchPlacesMapViewModel(coordinator: self, + let searchPlacesMapViewModel = SearchPlacesMapViewModel(coordinator: self, searchPlacesServices: SearchPlacesMapService(), surroundSearchServices: SurroundSearchService()) - searchPlacesMapViewController = SearchPlacesMapViewController() - searchPlacesMapViewController?.viewModel = searchPlacesMapViewModel + let searchPlacesMapViewController = SearchPlacesMapViewController() + searchPlacesMapViewController.viewModel = searchPlacesMapViewModel - if let searchPlacesMapViewController = searchPlacesMapViewController { - navigationController.pushViewController(searchPlacesMapViewController, animated: true) - } + navigationController.pushViewController(searchPlacesMapViewController, animated: true) } + /// 출발지 지정으로 들어가기 func moveToStartSearchPlace() { - searchPlacesMapViewModel = SearchPlacesMapViewModel(coordinator: self, + let searchPlacesMapViewModel = SearchPlacesMapViewModel(coordinator: self, searchPlacesServices: SearchPlacesMapService(), surroundSearchServices: SurroundSearchService(), caller: .forStartCaller) - searchPlacesMapViewController = SearchPlacesMapViewController() - searchPlacesMapViewController?.viewModel = searchPlacesMapViewModel + let searchPlacesMapViewController = SearchPlacesMapViewController() + searchPlacesMapViewController.viewModel = searchPlacesMapViewModel - if let searchPlacesMapViewController = searchPlacesMapViewController { - navigationController.pushViewController(searchPlacesMapViewController, animated: true) - } + navigationController.pushViewController(searchPlacesMapViewController, animated: true) } + + /// 그룹 멤버 위치 변경 + func moveByGroupMemberList() { + let searchPlacesMapViewModel = SearchPlacesMapViewModel(coordinator: self, + searchPlacesServices: SearchPlacesMapService(), + surroundSearchServices: SurroundSearchService(), + caller: .groupMemberList) + let searchPlacesMapViewController = SearchPlacesMapViewController() + searchPlacesMapViewController.viewModel = searchPlacesMapViewModel + + navigationController.pushViewController(searchPlacesMapViewController, animated: true) + } + /// 서치 완료후 : cLLocation전달 & pop VC - func finishSearchPlaces() { - NotificationCenter.default.post(name: .didFinishSearchPlaces, object: nil) + func finishSearchPlaces(searchPlace: SearchPlace?) { + delegate?.didSelectPlace(searchPlace: searchPlace) navigationController.popViewController(animated: true) } } diff --git a/TWTW/TWTW/SearchPlaces/Model/StartCaller.swift b/TWTW/TWTW/SearchPlaces/Model/StartCaller.swift index a0910fc0..f4805b13 100644 --- a/TWTW/TWTW/SearchPlaces/Model/StartCaller.swift +++ b/TWTW/TWTW/SearchPlaces/Model/StartCaller.swift @@ -9,5 +9,6 @@ import Foundation enum StartCaller { case forStartCaller + case groupMemberList case defaults } diff --git a/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift b/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift index a145e540..14533125 100644 --- a/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift +++ b/TWTW/TWTW/SearchPlaces/Protocol/Delegate/SearchPlacesMapCoordDelegate.swift @@ -10,5 +10,5 @@ import Foundation /// SearchPlaces 위치전달로 맵 카메라 이동 protocol SearchPlacesMapCoordDelegate: AnyObject { - func didSelectPlace(searchPlace: SearchPlace) + func didSelectPlace(searchPlace: SearchPlace?) } diff --git a/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift b/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift index f4d32cbb..1c3c7e6e 100644 --- a/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift +++ b/TWTW/TWTW/SearchPlaces/ViewModel/SearchPlacesMapViewModel.swift @@ -108,6 +108,17 @@ final class SearchPlacesMapViewModel { _ = KeychainWrapper.saveItem(value: "\(longitude)", forKey: SearchPlaceKeyChain.longitude.rawValue) } + // 위도 저장 + if let latitude = selectedPlace.latitude { + _ = KeychainWrapper.saveItem(value: "\(latitude)", forKey: SearchPlaceKeyChain.latitude.rawValue) + } + self.coordinator?.finishSearchPlaces() + case .groupMemberList: + // 경도 저장 + if let longitude = selectedPlace.longitude { + _ = KeychainWrapper.saveItem(value: "\(longitude)", forKey: SearchPlaceKeyChain.longitude.rawValue) + } + // 위도 저장 if let latitude = selectedPlace.latitude { _ = KeychainWrapper.saveItem(value: "\(latitude)", forKey: SearchPlaceKeyChain.latitude.rawValue)

w$B zb*l_HRumrr=nUssta?^9Uf>Vi2kr)QAX+4aR@MI2^>p>AN7FHqPJ>fMtZ3j-9-Q9k zyTQSTwu>c=75gFj=pgUMp$njHrB|Wjq6Ga^+!f ~t2>cyZ?@(ISA`hx!%21`CLr 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 RgiQbd002ovPDHLkV1m{}dE@{9 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Profile_big_09.png b/TWTW/TWTW/Resources/sharemap/Profile_big_09.png new file mode 100644 index 0000000000000000000000000000000000000000..4c746d6d99ed2b498cbe013ff93d560a463d5dd3 GIT binary patch literal 31511 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 IM6N<$f;gJ+HUIzs literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Profile_default_02.png b/TWTW/TWTW/Resources/sharemap/Profile_default_02.png new file mode 100644 index 0000000000000000000000000000000000000000..40b319243dea36528498ea0ff5f98a172a7c8f50 GIT binary patch literal 16384 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%0DqiIrmj)6DRN+8I%1b|h=WhXbKd15n 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�R`{<)$BD}tygU8 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 literal 0 HcmV?d00001 diff --git a/TWTW/TWTW/Resources/sharemap/Profile_default_06.png b/TWTW/TWTW/Resources/sharemap/Profile_default_06.png new file mode 100644 index 0000000000000000000000000000000000000000..813fb7ae7e0d430044a00330038a75c407fc7ae7 GIT binary patch literal 15033 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