├── FindTown ├── FindTownUI │ ├── README.md │ ├── Sources │ │ └── FindTownUI │ │ │ ├── Resource │ │ │ ├── Assets.xcassets │ │ │ │ ├── Contents.json │ │ │ │ ├── Image │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── dropButtonBlack.imageset │ │ │ │ │ │ ├── dropButtonBlack.svg │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── dropButtonGrey.imageset │ │ │ │ │ │ ├── dropButtonGrey.svg │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── checkBox.imageset │ │ │ │ │ │ ├── checkBox.svg │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── Back.imageset │ │ │ │ │ │ ├── Back.svg │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── Close.imageset │ │ │ │ │ │ ├── Close.svg │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── checkButton.imageset │ │ │ │ │ │ ├── checkButton.svg │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── checkButtonFill.imageset │ │ │ │ │ │ ├── checkButtonFill.svg │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── checkBoxFill.imageset │ │ │ │ │ │ ├── checkBoxFill.svg │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── radioButton.imageset │ │ │ │ │ │ ├── radioButton.svg │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── star.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── star.svg │ │ │ │ │ ├── starFill.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── starFill.svg │ │ │ │ │ ├── checkmark.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── checkmark.svg │ │ │ │ │ └── radioButtonFill.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── radioButtonFill.svg │ │ │ │ ├── Error.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Blue.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Green.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Orange.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Pink.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Success.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Back1.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Back2.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Back3.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Black.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Dim20.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Dim50.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Dim70.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey1.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey2.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey3.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey4.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey5.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey6.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey7.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Primary30.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Primary40.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── White.colorset │ │ │ │ │ └── Contents.json │ │ │ │ └── Primary.colorset │ │ │ │ │ └── Contents.json │ │ │ └── Fonts │ │ │ │ ├── Pretendard-Light.otf │ │ │ │ ├── Pretendard-Medium.otf │ │ │ │ ├── Pretendard-Regular.otf │ │ │ │ └── Pretendard-SemiBold.otf │ │ │ ├── Extensions │ │ │ ├── Bundle+Extension.swift │ │ │ └── UIColor+Extension.swift │ │ │ ├── DropDown │ │ │ └── DropDownTableView.swift │ │ │ └── Button │ │ │ ├── StarButton.swift │ │ │ ├── CheckButton.swift │ │ │ └── RadioButton.swift │ ├── .gitignore │ ├── .swiftpm │ │ └── xcode │ │ │ └── package.xcworkspace │ │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── Tests │ │ └── FindTownUITests │ │ └── FindTownUITests.swift ├── FindTownCore │ ├── README.md │ ├── .gitignore │ ├── Sources │ │ └── FindTownCore │ │ │ ├── Coordinator │ │ │ ├── Coordinator.swift │ │ │ └── PresentationStyle.swift │ │ │ ├── Extensions │ │ │ ├── UIColor+Extension.swift │ │ │ ├── OSLog+extension.swift │ │ │ ├── String+Extension.swift │ │ │ └── UIViewController+Extension.swift │ │ │ └── Base │ │ │ └── BaseViewModel.swift │ ├── .swiftpm │ │ └── xcode │ │ │ └── package.xcworkspace │ │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── Tests │ │ └── FindTownCoreTests │ │ └── FindTownCoreTests.swift ├── FindTownNetwork │ ├── README.md │ ├── .gitignore │ ├── Sources │ │ └── FindTownNetwork │ │ │ ├── Response │ │ │ ├── Response.swift │ │ │ └── BaseResponse.swift │ │ │ ├── Common │ │ │ ├── TaskType.swift │ │ │ ├── URLSessionProtocol.swift │ │ │ └── AnyEncodable.swift │ │ │ ├── Http │ │ │ ├── HTTPHeaders.swift │ │ │ ├── HttpMethod.swift │ │ │ └── HTTPHeaderField.swift │ │ │ ├── Request │ │ │ └── Request.swift │ │ │ └── Extensions │ │ │ ├── Data+Extension.swift │ │ │ ├── URL+Extension.swift │ │ │ ├── URLComponents+Extension.swift │ │ │ └── URLRequest+Extension.swift │ ├── Tests │ │ └── FindTownNetworkTests │ │ │ └── TestDoubles │ │ │ ├── MockResponse.swift │ │ │ ├── MockSession.swift │ │ │ ├── MockRequest.swift │ │ │ └── MockData.swift │ └── .swiftpm │ │ └── xcode │ │ └── package.xcworkspace │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── FindTown │ ├── Resource │ │ └── Assets.xcassets │ │ │ ├── Contents.json │ │ │ ├── Image │ │ │ ├── Contents.json │ │ │ ├── HomeVC │ │ │ │ ├── Contents.json │ │ │ │ ├── CountyIcon │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── guro.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── mapo.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── dongjak.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── gangnam.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── gangseo.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── gwanak.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── jongno.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── songpa.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── geumcheon.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── gwangjin.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── seodaemun.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── seongbuk.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── dongdaemun.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── yeongdeungpo.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── arrowDown.imageset │ │ │ │ │ ├── arrow_down.svg │ │ │ │ │ └── Contents.json │ │ │ │ ├── arrowDown_selected.imageset │ │ │ │ │ ├── arrowDown_selected.svg │ │ │ │ │ └── Contents.json │ │ │ │ ├── ei_close.imageset │ │ │ │ │ ├── ei_close.svg │ │ │ │ │ └── Contents.json │ │ │ │ ├── reset.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── reset.svg │ │ │ │ ├── shop.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── filter.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── health.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── nature.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── search.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── search.svg │ │ │ │ ├── favorite.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── favorite.svg │ │ │ │ ├── hospital.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── question.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── serviceMap.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── townList.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── information.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── networkError.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── favorite_selected.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── favorite_selected.svg │ │ │ │ ├── townList_searched.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── exclamation.imageset │ │ │ │ │ └── Contents.json │ │ │ ├── LoginVC │ │ │ │ ├── Contents.json │ │ │ │ ├── close.imageset │ │ │ │ │ ├── close.svg │ │ │ │ │ └── Contents.json │ │ │ │ ├── AppleIcon.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── KakaoIcon.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── kakaoIcon.svg │ │ │ ├── MapVC │ │ │ │ ├── Contents.json │ │ │ │ ├── marker │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── marker.cafe.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.cctv.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.park.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── maker.police.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.daiso.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.select.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.hospital.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.nonSelect.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.pharmacy.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.pilates.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.convenience.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.safetyBell.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.superMarket.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.fitnessCenter.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.groceryStore.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── marker.largeHospital.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── marker.sportsCenter.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── FoodIcon │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── cafeIcon.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── fastFoodIcon.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── chineseFoodIcon.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── koreanFoodIcon.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── simpleFoodIcon.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── westernFoodIcon.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── worldFoodIcon.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── worldFoodIcon.svg │ │ │ │ │ └── japaneseFoodIcon.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── InfraCategory │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── bellIcon.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── martIcon.imageset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── walkIcon.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── walkIcon.svg │ │ │ │ │ ├── healthIcon.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── healthIcon.svg │ │ │ │ │ ├── storeIcon.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── storeIcon.svg │ │ │ │ │ ├── hospitalIcon.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── hospitalIcon.svg │ │ │ │ │ ├── infra.cafe.icon.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── cafeIcon.svg │ │ │ │ │ └── pharmacyIcon.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── pharmacyIcon.svg │ │ │ │ ├── themaCategory │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── thema.notebook.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── thema.notebook.svg │ │ │ │ │ └── thema.restaurant.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── thema.restaurant.svg │ │ │ │ ├── copy.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── navi.back.imageset │ │ │ │ │ ├── back.svg │ │ │ │ │ └── Contents.json │ │ │ │ ├── chip.chat.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── favorite.select.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── favorite.svg │ │ │ │ ├── favorite.nonselect.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── favorite.nonselect.svg │ │ │ │ ├── icon_complete.imageset │ │ │ │ │ ├── icon_complete.svg │ │ │ │ │ └── Contents.json │ │ │ │ ├── icon_plus.imageset │ │ │ │ │ ├── _Icon_Plus.svg │ │ │ │ │ └── Contents.json │ │ │ │ ├── Icon_Navi_Back.imageset │ │ │ │ │ ├── Icon_Navi_Back.svg │ │ │ │ │ └── Contents.json │ │ │ │ ├── dropDown.imageset │ │ │ │ │ ├── dropDown.svg │ │ │ │ │ └── Contents.json │ │ │ │ ├── ic_post.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Icon_Delete.imageset │ │ │ │ │ ├── Icon_Delete.svg │ │ │ │ │ └── Contents.json │ │ │ │ ├── Frame 2608708.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Frame 2608708.svg │ │ │ │ ├── Icon_search.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── _Icon_Search_24.svg │ │ │ │ ├── octicon_question-24.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── empty_data.imageset │ │ │ │ │ └── Contents.json │ │ │ ├── MyPageVC │ │ │ │ ├── Contents.json │ │ │ │ ├── contact.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── suggestion.imageset │ │ │ │ │ └── Contents.json │ │ │ ├── SignupVC │ │ │ │ ├── Contents.json │ │ │ │ └── MapPinIcon.imageset │ │ │ │ │ └── Contents.json │ │ │ ├── TabBarVC │ │ │ │ ├── Contents.json │ │ │ │ ├── homeIcon.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── mapIcon.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── mapIcon.svg │ │ │ │ ├── myPageIcon.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── myPageIcon.svg │ │ │ │ └── favoriteIcon.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── favoriteIcon.svg │ │ │ ├── logo │ │ │ │ ├── Contents.json │ │ │ │ ├── logo.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── symbol.red.imageset │ │ │ │ │ └── Contents.json │ │ │ │ ├── symbol.white.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── homeLogo.imageset │ │ │ │ │ └── Contents.json │ │ │ ├── FavoriteVC │ │ │ │ ├── Contents.json │ │ │ │ ├── emptyIcon.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── emptyIcon.svg │ │ │ │ └── anonymousIcon.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── anonymousIcon.svg │ │ │ └── TownIntro │ │ │ │ ├── Contents.json │ │ │ │ ├── Eco.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── Eco.svg │ │ │ │ ├── Policy.imageset │ │ │ │ └── Contents.json │ │ │ │ ├── Policy-2.imageset │ │ │ │ └── Contents.json │ │ │ │ ├── Warning.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── Warning.svg │ │ │ │ ├── map_icon.imageset │ │ │ │ └── Contents.json │ │ │ │ ├── Home work.imageset │ │ │ │ └── Contents.json │ │ │ │ ├── Local taxi.imageset │ │ │ │ └── Contents.json │ │ │ │ ├── Emoji emotions.imageset │ │ │ │ └── Contents.json │ │ │ │ └── Icon_Information.imageset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ ├── App_Icon_20x20@1x.png │ │ │ ├── App_Icon_20x20@2x.png │ │ │ ├── App_Icon_20x20@3x.png │ │ │ ├── App_Icon_29x29@1x.png │ │ │ ├── App_Icon_29x29@2x.png │ │ │ ├── App_Icon_29x29@3x.png │ │ │ ├── App_Icon_40x40@1x.png │ │ │ ├── App_Icon_40x40@2x.png │ │ │ ├── App_Icon_40x40@3x.png │ │ │ ├── App_Icon_60x60@2x.png │ │ │ ├── App_Icon_60x60@3x.png │ │ │ ├── App_Icon_76x76@1x.png │ │ │ ├── App_Icon_76x76@2x.png │ │ │ ├── App_Icon_1024x1024.png │ │ │ ├── App_Icon_20x20@2x 1.png │ │ │ ├── App_Icon_29x29@2x 1.png │ │ │ ├── App_Icon_40x40@2x 1.png │ │ │ └── App_Icon_83.5x83.5@2x.png │ │ │ └── AccentColor.colorset │ │ │ └── Contents.json │ ├── Data │ │ ├── DataMapping │ │ │ ├── Reponse │ │ │ │ ├── MemberInfomationDTO.swift │ │ │ │ ├── LogoutResponseDTO.swift │ │ │ │ ├── TokenPayloadDTO.swift │ │ │ │ ├── FavoriteResponseDTO.swift │ │ │ │ ├── MemberResignDTO.swift │ │ │ │ ├── NickCheckResponseDTO.swift │ │ │ │ ├── ChangeNicknameResponseDTO.swift │ │ │ │ ├── LoginConfirmReponseDTO.swift │ │ │ │ ├── ReissueResponseDTO.swift │ │ │ │ └── LoginResponseDTO.swift │ │ │ ├── Request │ │ │ │ ├── TownSearchDTO.swift │ │ │ │ ├── MemberIdDTO.swift │ │ │ │ ├── TownFilterDTO.swift │ │ │ │ └── MemberSignupDTO.swift │ │ │ └── Common │ │ │ │ └── BaseRequest.swift │ │ ├── Storage │ │ │ ├── UserDefaults │ │ │ │ └── UserDefaultsSetting.swift │ │ │ └── KeyChain │ │ │ │ ├── KeyChainError.swift │ │ │ │ └── KeyChainAccount.swift │ │ └── Requests │ │ │ ├── Member │ │ │ ├── FavoriteListRequest.swift │ │ │ ├── ResignRequest.swift │ │ │ ├── LogoutRequest.swift │ │ │ ├── FavoriteRequest.swift │ │ │ ├── LoginConfirmRequest.swift │ │ │ ├── MemberInfomationRequest.swift │ │ │ ├── MemberInformationRequest.swift │ │ │ ├── NickNameCheckRequest.swift │ │ │ ├── SignupRequest.swift │ │ │ └── ChangeNicknameRequest.swift │ │ │ ├── Map │ │ │ ├── ThemaStoreRequest.swift │ │ │ └── TownLocationRequest.swift │ │ │ ├── Auth │ │ │ ├── ReissueRequest.swift │ │ │ └── AuthLoginRequest.swift │ │ │ └── Town │ │ │ ├── TownFilterRequest.swift │ │ │ ├── TownSearchRequest.swift │ │ │ └── TownIntroduceRequest.swift │ ├── FindTown.xcdatamodeld │ │ ├── .xccurrentversion │ │ └── FindTown.xcdatamodel │ │ │ └── contents │ ├── Domain │ │ ├── Enumerations │ │ │ ├── MapCategory.swift │ │ │ ├── CityType.swift │ │ │ ├── MapTransition.swift │ │ │ └── ProviderType.swift │ │ ├── Entities │ │ │ ├── Search.swift │ │ │ ├── SearchType.swift │ │ │ ├── TokenData.swift │ │ │ ├── SigninUserModel.swift │ │ │ ├── ReviewModel.swift │ │ │ ├── VillageLocationInformation.swift │ │ │ ├── InfraStore.swift │ │ │ ├── TownTableModel.swift │ │ │ ├── ThemaStore.swift │ │ │ ├── TownIntroduce.swift │ │ │ ├── VillageYearMonth.swift │ │ │ ├── City.swift │ │ │ └── FilterModel.swift │ │ ├── Protocol │ │ │ └── Category.swift │ │ ├── Interface │ │ │ └── Repository │ │ │ │ ├── KakaoAuthRepository.swift │ │ │ │ ├── AppleAuthRespository.swift │ │ │ │ ├── AuthRepository.swift │ │ │ │ ├── MapRepository.swift │ │ │ │ ├── TokenRepository.swift │ │ │ │ ├── TownRepository.swift │ │ │ │ └── MemberRepository.swift │ │ └── Constant │ │ │ └── MapConstant.swift │ ├── FindTown.entitlements │ ├── Presentation │ │ ├── AuthScene │ │ │ └── Flows │ │ │ │ ├── LoginViewModelDelegate.swift │ │ │ │ └── SignupViewModelDelegate.swift │ │ ├── HomeScene │ │ │ └── Home │ │ │ │ ├── Sheets │ │ │ │ └── FilterBottomSheetType.swift │ │ │ │ └── SubViews │ │ │ │ ├── FilterCollectionViewFlowLayout.swift │ │ │ │ └── TownTableView.swift │ │ ├── TownIntroScene │ │ │ └── TownIntroduce │ │ │ │ └── SubViews │ │ │ │ ├── HotPlaceCollectionView │ │ │ │ └── HotPlaceCollectionViewLayout.swift │ │ │ │ └── TownMoodCollectionView │ │ │ │ └── TownMoodCollectionViewLayout.swift │ │ ├── SearchScene │ │ │ └── Search │ │ │ │ └── SubViews │ │ │ │ └── SearchedDongCollectionView │ │ │ │ └── SearchedDongCollectionViewFlowLayout.swift │ │ ├── MapScene │ │ │ └── Map │ │ │ │ └── SubViews │ │ │ │ ├── StoreCollectionViewFlowLayout.swift │ │ │ │ └── CategoryCollectionViewFlowLayout.swift │ │ └── MyPageScene │ │ │ └── MyPage │ │ │ └── MyTownReview │ │ │ └── SubViews │ │ │ └── ReviewTableView.swift │ ├── Application │ │ └── DIContainer │ │ │ └── AppDIContainer.swift │ └── Info.plist ├── FindTown.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcuserdata │ │ │ ├── ihoyeong.xcuserdatad │ │ │ │ └── UserInterfaceState.xcuserstate │ │ │ └── sunghun.xcuserdatad │ │ │ │ └── UserInterfaceState.xcuserstate │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── sunghun.xcuserdatad │ │ └── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist └── FindTownUITests │ └── FindTownUITestsLaunchTests.swift ├── .github ├── pull_request_template.md └── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug-report.md └── .gitignore /FindTown/FindTownUI/README.md: -------------------------------------------------------------------------------- 1 | # FindTownUI 2 | 3 | A description of this package. 4 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/README.md: -------------------------------------------------------------------------------- 1 | # FindTownCore 2 | 3 | A description of this package. 4 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/README.md: -------------------------------------------------------------------------------- 1 | # FindTownNetwork 2 | 3 | A description of this package. 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/LoginVC/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MyPageVC/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/SignupVC/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/logo/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/FavoriteVC/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Motivation 2 | - issue number : 3 | 4 | ## Changes 5 | - 6 | 7 | ## Screen Shots 8 | - 9 | 10 | ## To Reviewers 11 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/FoodIcon/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/themaCategory/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Reponse/MemberInfomationDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MemberInfomationDTO.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/17. 6 | // 7 | 8 | import Foundation 9 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Fonts/Pretendard-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTownUI/Sources/FindTownUI/Resource/Fonts/Pretendard-Light.otf -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Fonts/Pretendard-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTownUI/Sources/FindTownUI/Resource/Fonts/Pretendard-Medium.otf -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Fonts/Pretendard-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTownUI/Sources/FindTownUI/Resource/Fonts/Pretendard-Regular.otf -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Fonts/Pretendard-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTownUI/Sources/FindTownUI/Resource/Fonts/Pretendard-SemiBold.otf -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_20x20@1x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_20x20@2x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_20x20@3x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_29x29@1x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_29x29@2x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_29x29@3x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_40x40@1x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_40x40@2x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_40x40@3x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_60x60@2x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_60x60@3x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_76x76@1x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_76x76@2x.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_1024x1024.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_20x20@2x 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_20x20@2x 1.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_29x29@2x 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_29x29@2x 1.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_40x40@2x 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_40x40@2x 1.png -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown/Resource/Assets.xcassets/AppIcon.appiconset/App_Icon_83.5x83.5@2x.png -------------------------------------------------------------------------------- /FindTown/FindTown.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/config/registries.json 8 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 9 | .netrc 10 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/config/registries.json 8 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 9 | .netrc 10 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/config/registries.json 8 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 9 | .netrc 10 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Response/Response.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol Response: Decodable { } 11 | -------------------------------------------------------------------------------- /FindTown/FindTown/FindTown.xcdatamodeld/.xccurrentversion: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: 기능 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Description 11 | 12 | ## Todo 13 | - [ ] 14 | 15 | ## Etc 16 | -------------------------------------------------------------------------------- /FindTown/FindTown.xcodeproj/xcuserdata/sunghun.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Enumerations/MapCategory.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MapData.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/01/05. 6 | // 7 | 8 | import UIKit 9 | 10 | enum MapCategory { 11 | case infra 12 | case theme 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Enumerations/CityType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CityType.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/10. 6 | // 7 | 8 | import Foundation 9 | 10 | enum CityType { 11 | case county 12 | case village 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/dropButtonBlack.imageset/dropButtonBlack.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/dropButtonGrey.imageset/dropButtonGrey.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown.xcodeproj/project.xcworkspace/xcuserdata/ihoyeong.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown.xcodeproj/project.xcworkspace/xcuserdata/ihoyeong.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /FindTown/FindTown.xcodeproj/project.xcworkspace/xcuserdata/sunghun.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FindTown/FindTown-iOS/HEAD/FindTown/FindTown.xcodeproj/project.xcworkspace/xcuserdata/sunghun.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Enumerations/MapTransition.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MapTransition.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/14. 6 | // 7 | 8 | import Foundation 9 | 10 | enum MapTransition { 11 | case tapBar 12 | case push 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/Sources/FindTownCore/Coordinator/Coordinator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2022/12/25. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol Coordinator: AnyObject { 11 | func start() 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Request/TownSearchDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TownSearchDTO.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/18. 6 | // 7 | 8 | import Foundation 9 | 10 | struct TownSearchDTO: Encodable { 11 | let sggNm: String 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/Search.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Search.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/11/04. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Search: Equatable, Codable { 11 | let data: String 12 | let time: Date 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/SearchType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchType.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/11/08. 6 | // 7 | 8 | import Foundation 9 | 10 | enum SearchType: String { 11 | case adm // 동 검색 12 | case sgg // 구 검색 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Request/MemberIdDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MemberInformation.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/25. 6 | // 7 | 8 | import Foundation 9 | 10 | struct MemberIdDTO: Encodable { 11 | let memberId: String 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Extensions/Bundle+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 김성훈 on 2023/01/26. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Bundle { 11 | public static var FindTownUI: Bundle = .module 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkBox.imageset/checkBox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug Report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: "\U0001F41E 버그" 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Description 11 | 12 | ## Scenario 13 | 14 | ## Todo 15 | - [ ] 16 | 17 | ## Etc 18 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/TokenData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TokenData.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct TokenData { 11 | let accessToken: String 12 | let refreshToken: String 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/SigninUserModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SigninUserModel.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/28. 6 | // 7 | 8 | import Foundation 9 | 10 | struct SigninUserModel { 11 | let userId: String 12 | let email: String? 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/copy.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "copy.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/logo/logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "logo.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/navi.back.imageset/back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Key ### 2 | 3 | APIKeyInfo.plist 4 | 5 | ### Xcode Patch ### 6 | *.xcodeproj/* 7 | !*.xcodeproj/project.pbxproj 8 | !*.xcodeproj/xcshareddata/ 9 | !*.xcworkspace/contents.xcworkspacedata 10 | /*.gcno 11 | **/xcshareddata/WorkspaceSettings.xcsettings 12 | 13 | 14 | *.xcuserstate -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/arrowDown.imageset/arrow_down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/chip.chat.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "chip.chat.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/logo/symbol.red.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "symbol_red.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/favorite.select.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "favorite.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/logo/symbol.white.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "symbol_white.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/Back.imageset/Back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/ReviewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // reviewModel.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/08. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ReviewModel { 11 | let village: String 12 | let period: String 13 | let introduce: String 14 | } 15 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/FoodIcon/cafeIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cafeIcon.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.cafe.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.cafe.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.cctv.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.cctv.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.park.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.park.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Reponse/LogoutResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogoutResponseDTO.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/05. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct LogoutResponseDTO: Response { 12 | let logout: Bool 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Request/TownFilterDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TownFilterDTO.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/12. 6 | // 7 | 8 | import Foundation 9 | 10 | struct TownFilterDTO: Encodable { 11 | let filterStatus: String 12 | let subwayList: [String] 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/arrowDown_selected.imageset/arrowDown_selected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/FoodIcon/fastFoodIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "fastFoodIcon.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/maker.police.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "maker.police.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.daiso.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.daiso.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.select.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.select.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Tests/FindTownNetworkTests/TestDoubles/MockResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | @testable import FindTownNetwork 9 | import Foundation 10 | 11 | struct MockResponse: Response { 12 | var test: String 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/LoginVC/close.imageset/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/FoodIcon/chineseFoodIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "chinaFoodIcon.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/FoodIcon/koreanFoodIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "koreanFoodIcon.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/FoodIcon/simpleFoodIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "simpleFoodIcon.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/FoodIcon/westernFoodIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "westernFoodIcon.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/FoodIcon/worldFoodIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "worldFoodIcon.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/favorite.nonselect.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "favorite.nonselect.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.hospital.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.hospital.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.nonSelect.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.nonSelect.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.pharmacy.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.pharmacy.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.pilates.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.pilates.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Protocol/Category.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MCategory.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/14. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol Category { 11 | var description: String { get } 12 | var image: UIImage? { get } 13 | var code: String { get } 14 | } 15 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/FoodIcon/japaneseFoodIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "japanessFoodIcon.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.convenience.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.convenience.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.safetyBell.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.safetyBell.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.superMarket.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.superMarket.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/themaCategory/thema.notebook.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "thema.notebook.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.fitnessCenter.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.fitnessCenter.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.groceryStore.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.groceryStore.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.largeHospital.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.large.hospital.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/marker/marker.sportsCenter.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "marker.sportsCenter.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/themaCategory/thema.restaurant.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "thema.restaurant.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/Close.imageset/Close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Reponse/TokenPayloadDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TokenPayloadDTO.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/05. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct TokenPayloadDTO: Response { 12 | let sub: String 13 | let exp: TimeInterval 14 | } 15 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Common/TaskType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum TaskType { 11 | case requestPlain 12 | case requestData(Data) 13 | case requestJSONEncodable(encodable: Encodable) 14 | } 15 | -------------------------------------------------------------------------------- /FindTown/FindTown.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/VillageLocationInformation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VillageLocationInformation.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/13. 6 | // 7 | 8 | import Foundation 9 | 10 | struct VillageLocationInformation { 11 | let cityCode: Int 12 | let wishStatus: Bool 13 | let coordinate: [[Double]] 14 | } 15 | -------------------------------------------------------------------------------- /FindTown/FindTown/FindTown.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.applesignin 6 | 7 | Default 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/AuthScene/Flows/LoginViewModelDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginCoordinatorDelegate.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/01/06. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol LoginViewModelDelegate { 11 | func goToNickname(userData: SigninUserModel, providerType: ProviderType) 12 | func goToTabBar() 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/LoginVC/close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "close.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/icon_complete.imageset/icon_complete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/icon_plus.imageset/_Icon_Plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Http/HTTPHeaders.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public struct HTTPHeaders { 11 | internal let headers: [HTTPHeader] 12 | 13 | public init(_ headers: [HTTPHeader]) { 14 | self.headers = headers 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/InfraStore.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InfraStore.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct InfraStore: Equatable { 11 | let name: String 12 | let address: String 13 | let latitude: Double 14 | let longitude: Double 15 | let subCategory: InfraSubCategory 16 | } 17 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Interface/Repository/KakaoAuthRepository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KakaoAuthRepository.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/28. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol KakaoAuthRepository { 11 | func isKakaoTalkLoginAvailable() async throws -> String 12 | func getUserInformation() async throws -> SigninUserModel 13 | } 14 | -------------------------------------------------------------------------------- /FindTown/FindTown/FindTown.xcdatamodeld/FindTown.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/Icon_Navi_Back.imageset/Icon_Navi_Back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkButton.imageset/checkButton.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Common/BaseRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | public protocol BaseRequest: Request { } 12 | 13 | public extension BaseRequest { 14 | var baseURL: String { 15 | return Bundle.main.FIND_TOWN_SERVER_URL 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkButtonFill.imageset/checkButtonFill.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkBoxFill.imageset/checkBoxFill.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Reponse/FavoriteResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FavoriteResponseDTO.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/02/20. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct FavoriteResponseDTO: Response { 12 | let wishTown: String 13 | 14 | var toStatus: Bool { 15 | wishTown == "찜 등록" ? true : false 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/dropDown.imageset/dropDown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Common/URLSessionProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol URLSessionProtocol { 11 | func data(for request: URLRequest, delegate: URLSessionTaskDelegate?) async throws -> (Data, URLResponse) 12 | } 13 | 14 | extension URLSession: URLSessionProtocol { } 15 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Reponse/MemberResignDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MemberResignDTO.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/16. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct MemberResignDTO: Response { 12 | let resignMember: Bool 13 | 14 | enum CodingKeys: String, CodingKey { 15 | case resignMember = "resign_member" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Interface/Repository/AppleAuthRespository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppleAuthRespository.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/28. 6 | // 7 | 8 | import Foundation 9 | import AuthenticationServices 10 | 11 | protocol AppleAuthRespository { 12 | var authorizationController: ASAuthorizationController { get set } 13 | func loginWithApple() async throws -> SigninUserModel 14 | } 15 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/radioButton.imageset/radioButton.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Reponse/NickCheckResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NickCheckResponse.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/26. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct NickCheckResponseDTO: Response { 12 | let existConfirm: Bool 13 | 14 | enum CodingKeys: String, CodingKey { 15 | case existConfirm = "exist_confirm" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/TownTableModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TownTableModel.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/15. 6 | // 7 | 8 | import UIKit 9 | 10 | struct TownTableModel { 11 | let objectId: Int 12 | let county: String 13 | let countyIcon: UIImage 14 | var wishTown: Bool 15 | let safetyRate: Double 16 | let moods: [TownMood] 17 | let townFullTitle: String 18 | } 19 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/ei_close.imageset/ei_close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Reponse/ChangeNicknameResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChangeNicknameResponseDTO.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/18. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct ChangeNicknameResponseDTO: Response { 12 | let editSuccess: Bool 13 | 14 | enum CodingKeys: String, CodingKey { 15 | case editSuccess = "edit_nickname" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/ThemaStore.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StoreType.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/13. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ThemaStore: Equatable { 11 | let name: String 12 | let address: String 13 | let latitude: Double 14 | let longitude: Double 15 | let subCategory: StoreDetailType 16 | let foodCategory: String? 17 | let category: ThemaCategory 18 | } 19 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Tests/FindTownUITests/FindTownUITests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import FindTownUI 3 | 4 | final class FindTownUITests: XCTestCase { 5 | func testExample() throws { 6 | // This is an example of a functional test case. 7 | // Use XCTAssert and related functions to verify your tests produce the correct 8 | // results. 9 | XCTAssertEqual(FindTownUI().text, "Hello, World!") 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/TownIntroduce.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TTownIntroduce.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/02/19. 6 | // 7 | 8 | import Foundation 9 | 10 | struct TownIntroduce { 11 | let townTitle: String 12 | let wishTown: Bool 13 | let townExplanation: String 14 | let townMood: [TownMood] 15 | let traffic: [Traffic] 16 | let hotPlace: [String] 17 | let townRank: [(TownRank,Any)] 18 | } 19 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Enumerations/ProviderType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProviderType.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/26. 6 | // 7 | 8 | import Foundation 9 | 10 | enum ProviderType { 11 | case kakao, apple 12 | 13 | var description: String { 14 | switch self { 15 | case .kakao: 16 | return "KAKAO" 17 | case .apple: 18 | return "APPLE" 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/FoodIcon/worldFoodIcon.imageset/worldFoodIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/Tests/FindTownCoreTests/FindTownCoreTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import FindTownCore 3 | 4 | final class FindTownCoreTests: XCTestCase { 5 | func testExample() throws { 6 | // This is an example of a functional test case. 7 | // Use XCTAssert and related functions to verify your tests produce the correct 8 | // results. 9 | XCTAssertEqual(FindTownCore().text, "Hello, World!") 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Response/BaseResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public struct BaseResponse: Response { 11 | public let header: Header 12 | public let body: ResponseType 13 | } 14 | 15 | public struct Header: Response { 16 | public let code: Int 17 | public let message: String 18 | } 19 | 20 | 21 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Interface/Repository/AuthRepository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AuthRepository.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/28. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol AuthRepository { 11 | func login(memberId: String) async throws -> LoginResponseDTO 12 | func reissue(refreshToken: String) async throws -> ReissueResponseDTO 13 | func loginConfirm(accessToken: String) async throws -> LoginConfirmReponseDTO 14 | } 15 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/reset.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "reset.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/shop.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "shop.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Eco.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Eco.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/filter.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "filter.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/health.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "health.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/nature.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "nature.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "search.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/dropDown.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "dropDown.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/ic_post.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_post.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/navi.back.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "back.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MyPageVC/contact.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "chat.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Policy.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Policy.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/VillageYearMonth.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SignupUserModel.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/01/18. 6 | // 7 | 8 | import Foundation 9 | 10 | struct VillageYearMonth { 11 | let village: String 12 | let year: Int 13 | let month: Int 14 | 15 | init(village: String = "", year: Int = 0, month: Int = 0) { 16 | self.village = village 17 | self.year = year 18 | self.month = month 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/guro.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "guro.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/mapo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "mapo.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/arrowDown.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "arrow_down.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/ei_close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ei_close.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/favorite.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "favorite.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/hospital.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "hospital.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/question.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "question.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/serviceMap.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "serviceMap.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/townList.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "townList.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/LoginVC/AppleIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "AppleIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/LoginVC/KakaoIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "kakaoIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/Icon_Delete.imageset/Icon_Delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/icon_plus.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "_Icon_Plus.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MyPageVC/suggestion.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "pencil.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/homeIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "homeIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/mapIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "mapIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Policy-2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Policy-2.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Warning.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Warning.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/map_icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "map_icon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/logo/homeLogo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "logo_small.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/FavoriteVC/emptyIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "emptyIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/dongjak.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "dongjak.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/gangnam.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gangnam.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/gangseo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gangseo.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/gwanak.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gwanak.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/jongno.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "jongno.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/songpa.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "songpa.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/information.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "information.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/networkError.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "networkError.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/Frame 2608708.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Frame 2608708.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/Icon_Delete.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Icon_Delete.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/Icon_search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "_Icon_Search_24.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/icon_complete.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon_complete.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/SignupVC/MapPinIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "MapPinIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/myPageIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "myPageIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Home work.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Home work.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Local taxi.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Local taxi.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/Back.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Back.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/Close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Close.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/star.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "star.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/FavoriteVC/anonymousIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "anonymousIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/geumcheon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "geumcheon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/gwangjin.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gwangjin.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/seodaemun.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "seodaemun.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/seongbuk.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "seongbuk.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/Icon_Navi_Back.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Icon_Navi_Back.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/bellIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "bellIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/martIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "martIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/walkIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "walkIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/favoriteIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "favoriteIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkBox.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "checkBox.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/starFill.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "starFill.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/dongdaemun.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "dongdaemun.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/CountyIcon/yeongdeungpo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "yeongdeungpo.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/favorite_selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "favorite_selected.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/townList_searched.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "townList_searched.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/healthIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "healthIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/storeIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "storeIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Emoji emotions.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Emoji emotions.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Icon_Information.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Icon_Information.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Common/AnyEncodable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct AnyEncodable: Encodable { 11 | 12 | private let encodable: Encodable 13 | 14 | public init(_ encodable: Encodable) { 15 | self.encodable = encodable 16 | } 17 | 18 | func encode(to encoder: Encoder) throws { 19 | try encodable.encode(to: encoder) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkmark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "checkmark.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/City.swift: -------------------------------------------------------------------------------- 1 | // 2 | // City.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/10. 6 | // 7 | 8 | import Foundation 9 | 10 | struct City: Equatable { 11 | let county: County 12 | let village: Village 13 | 14 | var description: String { 15 | return "서울시 \(self.county.rawValue) \(self.village.rawValue)" 16 | } 17 | 18 | var countyDescription: String { 19 | return "서울시 \(self.county.rawValue)" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/arrowDown_selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "arrowDown_selected.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/hospitalIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "hospitalIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/infra.cafe.icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cafeIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/pharmacyIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "pharmacyIcon.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/octicon_question-24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "octicon_question-24.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkBoxFill.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "checkBoxFill.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "checkButton.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/radioButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "radioButton.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkButtonFill.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "checkButtonFill.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/dropButtonBlack.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "dropButtonBlack.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/dropButtonGrey.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "dropButtonGrey.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/radioButtonFill.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "radioButtonFill.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/empty_data.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ant-design_exclamation-circle-outlined.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Request/Request.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol Request { 11 | associatedtype ResponseType: Response 12 | 13 | var baseURL: String { get } 14 | var path: String { get } 15 | var method: HttpMethod { get } 16 | var headers: HTTPHeaders { get } 17 | var task: TaskType { get } 18 | var parameters: [URLQueryItem]? { get } 19 | } 20 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Extensions/UIColor+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 장선영 on 2022/12/16. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | extension UIColor { 12 | // Asset에 등록된 Color 불러오는 메서드 13 | static func findTownColor(named: String) -> UIColor { 14 | guard let color = UIColor(named: named, in: .module, compatibleWith: nil) else { 15 | return .clear 16 | } 17 | return color 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/exclamation.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ant-design_exclamation-circle-outlined-2.svg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/Sources/FindTownCore/Extensions/UIColor+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 장선영 on 2023/01/02. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | public extension UIColor { 12 | 13 | convenience init(red: Int, green: Int, blue: Int) { 14 | self.init(red: CGFloat(red) / 255.0, 15 | green: CGFloat(green) / 255.0, 16 | blue: CGFloat(blue) / 255.0, 17 | alpha: 1.0) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/themaCategory/thema.restaurant.imageset/thema.restaurant.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Extensions/Data+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Data { 11 | func decode(_ type: T.Type) throws -> T where T : Decodable { 12 | let jsonDecoder = JSONDecoder() 13 | do { 14 | let data = try jsonDecoder.decode(type, from: self) 15 | return data 16 | } catch { 17 | throw FTNetworkError.decode 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Extensions/URL+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | extension URL { 11 | init(target: T) { 12 | let targetPath = target.path 13 | guard let url = URL(string: target.baseURL) else { fatalError() } 14 | if targetPath.isEmpty { 15 | self = url 16 | } else { 17 | self = url.appendingPathComponent(targetPath) 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Interface/Repository/MapRepository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MapRepository.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/28. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol MapRepository { 11 | func getVillageLocationData(cityCode: Int?, _ accessToken: String?) async throws -> TownMapLocationDTO 12 | func getInfraStores(cityCode: String, categoryId: String) async throws -> MapThemaStoreResponseDTO 13 | func getThemaStores(cityCode: String, categoryId: String) async throws -> MapThemaStoreResponseDTO 14 | } 15 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/DropDown/DropDownTableView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/02/07. 6 | // 7 | 8 | import UIKit 9 | 10 | final class DropDownTableView: UITableView { 11 | override var contentSize:CGSize { 12 | didSet { 13 | invalidateIntrinsicContentSize() 14 | } 15 | } 16 | 17 | override var intrinsicContentSize: CGSize { 18 | layoutIfNeeded() 19 | return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/HomeScene/Home/Sheets/FilterBottomSheetType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FilterBottomSheetType.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/08. 6 | // 7 | 8 | import UIKit 9 | 10 | enum FilterSheetType { 11 | case Filter 12 | case Infra 13 | case Traffic 14 | 15 | var height: Double { 16 | switch self { 17 | case .Filter: 18 | return 0.87 19 | case .Infra: 20 | return 0.37 21 | case .Traffic: 22 | return 0.60 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Tests/FindTownNetworkTests/TestDoubles/MockSession.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | @testable import FindTownNetwork 9 | import Foundation 10 | 11 | class MockSession: Sessionable { 12 | 13 | var makeRequestFail = false 14 | 15 | func request(request: URLRequest) async throws -> Data { 16 | 17 | if makeRequestFail { 18 | throw MockError.response 19 | } else { 20 | return MockData.rawData 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/radioButtonFill.imageset/radioButtonFill.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/Sources/FindTownCore/Extensions/OSLog+extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File 2.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/27. 6 | // 7 | 8 | import Foundation 9 | import OSLog 10 | 11 | extension OSLog { 12 | static let bundleId = "kr.FindTown.com" 13 | static let network = OSLog(subsystem: bundleId, category: "Network") 14 | static let debug = OSLog(subsystem: bundleId, category: "Debug") 15 | static let info = OSLog(subsystem: bundleId, category: "Info") 16 | static let error = OSLog(subsystem: bundleId, category: "Error") 17 | } 18 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Interface/Repository/TokenRepository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TokenRepository.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/28. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol TokenRepository { 11 | func createTokens(tokenData: TokenData) async throws 12 | func updateAccessToken(aceessToken: String, accesstokenExpiredTime: TimeInterval) async throws 13 | func readAccessToken() async throws -> (String, TimeInterval) 14 | func readRefreshToken() async throws -> (String, TimeInterval) 15 | func deleteTokens() async throws 16 | } 17 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Storage/UserDefaults/UserDefaultsSetting.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GlobalSettings.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/02/17. 6 | // 7 | 8 | import Foundation 9 | 10 | enum UserDefaultsSetting { 11 | 12 | @UserDefaultsWrapper(key: "isAnonymous", defaultValue: true) 13 | static var isAnonymous 14 | 15 | @UserDefaultsWrapper(key: "SearchFirstEnter", defaultValue: false) 16 | static var isSearchFirstEnter 17 | 18 | @UserDefaultsWrapper(key: "searchedDongList", defaultValue: [Search]()) 19 | static var searchedDongList 20 | } 21 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Storage/KeyChain/KeyChainError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeyChainError.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/01/12. 6 | // 7 | 8 | import Foundation 9 | 10 | enum KeyChainError: LocalizedError { 11 | case unhandledError(status: OSStatus) 12 | case itemNotFound 13 | 14 | var errorDescription: String? { 15 | switch self { 16 | case .unhandledError(let status): 17 | return "KeyChain unhandle Error: \(status)" 18 | case .itemNotFound: 19 | return "KeyChain item Not Found" 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Constant/MapConstant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MapConstant.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/13. 6 | // 7 | 8 | import Foundation 9 | import NMapsMap 10 | 11 | enum MapConstant { 12 | static let koreaBoundaryCoordinates = [[124.517393, 39.327518], 13 | [128.985682, 39.588436], 14 | [131.426344, 35.251701], 15 | [124.799008, 33.218602], 16 | [124.517393, 39.327518]] 17 | 18 | } 19 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/Sources/FindTownCore/Base/BaseViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 김성훈 on 2022/12/18. 6 | // 7 | 8 | import Foundation 9 | import RxSwift 10 | 11 | protocol ViewModelType { 12 | associatedtype Input 13 | associatedtype Output 14 | 15 | func bind() 16 | } 17 | 18 | open class BaseViewModel: ViewModelType { 19 | 20 | public let disposeBag = DisposeBag() 21 | 22 | struct Input { } 23 | struct Output { } 24 | 25 | public init() { 26 | self.bind() 27 | } 28 | 29 | func bind() { } 30 | } 31 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Interface/Repository/TownRepository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TownRepository.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/28. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol TownRepository { 11 | func getTownInformation(filterStatus: String, subwayList: [String], accessToken: String) async throws -> TownFilterResponseDTO 12 | func getSearchTownInformation(searchType: SearchType, data: String, accessToken: String) async throws -> TownSearchResponseDTO 13 | func getTownIntroduce(cityCode: Int, accessToken: String) async throws -> TownIntroduceResponseDTO 14 | } 15 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/storeIcon.imageset/storeIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/LoginVC/KakaoIcon.imageset/kakaoIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/HomeScene/Home/SubViews/FilterCollectionViewFlowLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FilterCollectionFlowLayout.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/01/17. 6 | // 7 | 8 | import UIKit 9 | 10 | final class FilterCollectionViewFlowLayout: UICollectionViewFlowLayout { 11 | 12 | required init?(coder: NSCoder) { 13 | super.init(coder: coder) 14 | } 15 | 16 | override init() { 17 | super.init() 18 | 19 | setupView() 20 | } 21 | 22 | private func setupView() { 23 | scrollDirection = .horizontal 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/search.imageset/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Eco.imageset/Eco.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/star.imageset/star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Warning.imageset/Warning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/Sources/FindTownCore/Extensions/String+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 김성훈 on 2023/01/05. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | /// 닉네임에 알파벳, 한글, 특수문자 ( ! . @ #) 말고 다른거 들어가있나 체크 13 | public func isValidNickname() -> Bool { 14 | let allowedCharacters = "^[a-zA-Z0-9!@.#|\u{1100}-\u{11FF}\u{3130}-\u{318F}\u{A960}-\u{A97F}\u{AC00}-\u{D7AF}]*$" 15 | let nicknameTest = NSPredicate(format: "SELF MATCHES %@", allowedCharacters) 16 | 17 | return nicknameTest.evaluate(with: self) && self != "" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/starFill.imageset/starFill.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Reponse/LoginConfirmReponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginConfirmReponseDTO.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/05. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct LoginConfirmReponseDTO: Response { 12 | let loginConfirm: MemberAuthroize 13 | 14 | enum CodingKeys: String, CodingKey { 15 | case loginConfirm = "login_confirm" 16 | } 17 | } 18 | 19 | struct MemberAuthroize: Response { 20 | let authorities: [AuthoritiesDTO] 21 | let memberId: String 22 | } 23 | 24 | struct AuthoritiesDTO: Response { 25 | let authority: String 26 | } 27 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/hospitalIcon.imageset/hospitalIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Member/FavoriteListRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FavoriteListRequest.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/02/19. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct FavoriteListRequest: BaseRequest { 12 | 13 | init(HTTPHeaders: HTTPHeaders) { 14 | self.headers = HTTPHeaders 15 | } 16 | 17 | typealias ResponseType = FavoriteListResponseDTO 18 | 19 | var path = "/app/members/wishtown" 20 | var method: HttpMethod = .get 21 | var headers: HTTPHeaders 22 | var task: TaskType = .requestPlain 23 | var parameters: [URLQueryItem]? = nil 24 | } 25 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/walkIcon.imageset/walkIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/pharmacyIcon.imageset/pharmacyIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Map/ThemaStoreRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ThemaStoreRequest.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/17. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct ThemaStoreRequest: BaseRequest { 12 | 13 | init(path: String) { 14 | self.path = path 15 | } 16 | 17 | typealias ResponseType = MapThemaStoreResponseDTO 18 | var path: String 19 | var method: FindTownNetwork.HttpMethod = .get 20 | var headers: FindTownNetwork.HTTPHeaders = HTTPHeaders([.accept("*/*")]) 21 | var task: FindTownNetwork.TaskType = .requestPlain 22 | var parameters: [URLQueryItem]? = nil 23 | } 24 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Member/ResignRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ResignRequest.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/16. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct ResignRequest: BaseRequest { 12 | 13 | init(HTTPHeaders: HTTPHeaders) { 14 | self.headers = HTTPHeaders 15 | } 16 | 17 | typealias ResponseType = MemberResignDTO 18 | var path: String = "/app/members/resign" 19 | var method: FindTownNetwork.HttpMethod = .delete 20 | var headers: FindTownNetwork.HTTPHeaders 21 | var task: FindTownNetwork.TaskType = .requestPlain 22 | var parameters: [URLQueryItem]? = nil 23 | } 24 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Extensions/URLComponents+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/25. 6 | // 7 | 8 | import Foundation 9 | 10 | extension URLComponents { 11 | init(target: T) { 12 | let targetPath = target.path 13 | if targetPath.isEmpty { 14 | guard let components = URLComponents(string: target.baseURL) else { fatalError() } 15 | self = components 16 | } else { 17 | guard let components = URLComponents(string: target.baseURL + target.path) else { fatalError() } 18 | self = components 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Http/HttpMethod.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum HttpMethod { 11 | case get 12 | case post 13 | case put 14 | case patch 15 | case delete 16 | 17 | var value: String { 18 | switch self { 19 | case .get: 20 | return "GET" 21 | case .post: 22 | return "POST" 23 | case .put: 24 | return "PUT" 25 | case .patch: 26 | return "PATCH" 27 | case .delete: 28 | return "DELETE" 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Auth/ReissueRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ReissueRequest.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/03. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct ReissueRequest: BaseRequest { 12 | 13 | init(HTTPHeaders: HTTPHeaders) { 14 | self.headers = HTTPHeaders 15 | } 16 | 17 | typealias ResponseType = ReissueResponseDTO 18 | var path: String = "/auth/reissue/token" 19 | var method: FindTownNetwork.HttpMethod = .post 20 | var headers: FindTownNetwork.HTTPHeaders 21 | var task: FindTownNetwork.TaskType = .requestPlain 22 | var parameters: [URLQueryItem]? = nil 23 | } 24 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Member/LogoutRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogoutRequest.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/05. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct LogoutRequest: BaseRequest { 12 | 13 | init(HTTPHeaders: HTTPHeaders) { 14 | self.headers = HTTPHeaders 15 | } 16 | 17 | typealias ResponseType = LogoutResponseDTO 18 | var path: String = "/app/members/logout" 19 | var method: FindTownNetwork.HttpMethod = .get 20 | var headers: FindTownNetwork.HTTPHeaders 21 | var task: FindTownNetwork.TaskType = .requestPlain 22 | var parameters: [URLQueryItem]? = nil 23 | } 24 | 25 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Tests/FindTownNetworkTests/TestDoubles/MockRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | @testable import FindTownNetwork 9 | import Foundation 10 | 11 | struct MockRequest: Request { 12 | typealias ResponseType = MockResponse 13 | 14 | var baseURL: URL { 15 | guard let apiURL = URL(string: "http://18.182.80.111:8080") else { fatalError("URL is invalid") } 16 | return apiURL 17 | } 18 | var path: String = "/health" 19 | var method: HttpMethod = .get 20 | var headers: HTTPHeaders = HTTPHeaders([.accept("*/*")]) 21 | var task: TaskType = .requestPlain 22 | } 23 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Request/MemberSignupDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserRegisterDTO.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/27. 6 | // 7 | 8 | import Foundation 9 | 10 | struct MemberSignupDTO: Encodable { 11 | var memberId: String 12 | var email: String? 13 | var providerType: String 14 | var nickname: String 15 | var objectId: Int? 16 | var resident: ResidentDTO 17 | var useAgreeYn: Bool 18 | var privacyAgreeYn: Bool 19 | } 20 | 21 | struct ResidentDTO: Encodable { 22 | var residentReview: String 23 | var residentYear: Int 24 | var residentMonth: Int 25 | var residentAddress: String 26 | var moods: [String] 27 | } 28 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Member/FavoriteRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FavoriteRequest.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/02/20. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct FavoriteRequest: BaseRequest { 12 | 13 | init(HTTPHeaders: HTTPHeaders, parameters: [URLQueryItem]) { 14 | self.headers = HTTPHeaders 15 | self.parameters = parameters 16 | } 17 | 18 | typealias ResponseType = FavoriteResponseDTO 19 | 20 | var path = "/app/members/wishtown" 21 | var method: HttpMethod = .post 22 | var headers: HTTPHeaders 23 | var task: TaskType = .requestPlain 24 | var parameters: [URLQueryItem]? 25 | } 26 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Member/LoginConfirmRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginConfirmRequest.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/05. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct LoginConfirmRequest: BaseRequest { 12 | 13 | init(HTTPHeaders: HTTPHeaders) { 14 | self.headers = HTTPHeaders 15 | } 16 | 17 | typealias ResponseType = LoginConfirmReponseDTO 18 | var path: String = "/auth/login/confirm" 19 | var method: FindTownNetwork.HttpMethod = .post 20 | var headers: FindTownNetwork.HTTPHeaders 21 | var task: FindTownNetwork.TaskType = .requestPlain 22 | var parameters: [URLQueryItem]? = nil 23 | } 24 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/healthIcon.imageset/healthIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Entities/FilterModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FilterModel.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/08. 6 | // 7 | 8 | import Foundation 9 | 10 | struct FilterModel { 11 | var infra: String = "" 12 | var traffic: [String] = [] 13 | var trafficIndexPath: [IndexPath] = [] 14 | 15 | var toFilterStatus: String { 16 | switch infra { 17 | case "편의시설": 18 | return "convenience" 19 | case "의료": 20 | return "medical" 21 | case "운동": 22 | return "exercise" 23 | case "자연": 24 | return "greenery" 25 | default: 26 | return "" 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/AuthScene/Flows/SignupViewModelDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AuthCoordinatorDelegate.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/01/05. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SignupViewModelDelegate { 11 | func goToLocationAndYears(_ signupUserModel: SignupUserModel) 12 | func goToTownMood(_ signupUserModel: SignupUserModel) 13 | func goToTownMoodSelect(_ signupUserModel: SignupUserModel) 14 | func goToFavorite(_ signupUserModel: SignupUserModel) 15 | func goToAgreePolicy(_ signupUserModel: SignupUserModel) 16 | func goToTabBar() 17 | func dismiss() 18 | func dismissAndGoToTapBar() 19 | func dismissAndShowError() 20 | } 21 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Http/HTTPHeaderField.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum HTTPHeaderField { 11 | case contentType 12 | case accept 13 | case authorization 14 | case custom(String) 15 | 16 | var description: String { 17 | switch self { 18 | case .contentType: 19 | return "Content-Type" 20 | case .accept: 21 | return "Accept" 22 | case .authorization: 23 | return "Authorization" 24 | case .custom(let headerString): 25 | return headerString 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Member/MemberInfomationRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserInfomationRequest.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/02. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct MemberInformationRequest: BaseRequest { 12 | 13 | init(HTTPHeaders: HTTPHeaders) { 14 | self.headers = HTTPHeaders 15 | } 16 | 17 | typealias ResponseType = MemberInformationResponseDTO 18 | var path: String = "/app/members/info" 19 | var method: FindTownNetwork.HttpMethod = .get 20 | var headers: FindTownNetwork.HTTPHeaders 21 | var task: FindTownNetwork.TaskType = .requestPlain 22 | var parameters: [URLQueryItem]? = nil 23 | } 24 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Member/MemberInformationRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserInfomationRequest.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/02. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct MemberInformationRequest: BaseRequest { 12 | 13 | init(HTTPHeaders: HTTPHeaders) { 14 | self.headers = HTTPHeaders 15 | } 16 | 17 | typealias ResponseType = MemberInformationResponseDTO 18 | var path: String = "/app/members/info" 19 | var method: FindTownNetwork.HttpMethod = .get 20 | var headers: FindTownNetwork.HTTPHeaders 21 | var task: FindTownNetwork.TaskType = .requestPlain 22 | var parameters: [URLQueryItem]? = nil 23 | } 24 | -------------------------------------------------------------------------------- /FindTown/FindTown/Application/DIContainer/AppDIContainer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDIContainer.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/27. 6 | // 7 | 8 | import UIKit 9 | 10 | final class AppDIContainer { 11 | 12 | let authUseCase: AuthUseCase 13 | let memberUseCase: MemberUseCase 14 | let townUseCase: TownUseCase 15 | let mapUseCase: MapUseCase 16 | 17 | init(networkDIContainer: NetwokDIContainer) { 18 | self.authUseCase = networkDIContainer.authUseCase() 19 | self.memberUseCase = networkDIContainer.memberUseCase() 20 | self.townUseCase = networkDIContainer.townUseCase() 21 | self.mapUseCase = networkDIContainer.mapUseCase() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/infra.cafe.icon.imageset/cafeIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Tests/FindTownNetworkTests/TestDoubles/MockData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | enum MockData { 11 | static var rawData = 12 | """ 13 | { 14 | "header": { 15 | "code": 0, 16 | "message": "string" 17 | }, 18 | "body": { 19 | "test": "test" 20 | } 21 | } 22 | """.data(using: .utf8)! 23 | 24 | static var bodyData = 25 | """ 26 | { 27 | "test": "test" 28 | } 29 | """.data(using: .utf8)! 30 | } 31 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Member/NickNameCheckRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NickNameCheckRequest.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/26. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct NickNameCheckRequest: BaseRequest { 12 | 13 | init(parameters: [URLQueryItem]) { 14 | self.parameters = parameters 15 | } 16 | 17 | typealias ResponseType = NickCheckResponseDTO 18 | var path: String = "/app/members/check/nickname" 19 | var method: FindTownNetwork.HttpMethod = .get 20 | var headers: FindTownNetwork.HTTPHeaders = HTTPHeaders([.accept("*/*")]) 21 | var task: FindTownNetwork.TaskType = .requestPlain 22 | var parameters: [URLQueryItem]? 23 | } 24 | -------------------------------------------------------------------------------- /FindTown/FindTown/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIApplicationSceneManifest 6 | 7 | UIApplicationSupportsMultipleScenes 8 | 9 | UISceneConfigurations 10 | 11 | UIWindowSceneSessionRoleApplication 12 | 13 | 14 | UISceneConfigurationName 15 | Default Configuration 16 | UISceneDelegateClassName 17 | $(PRODUCT_MODULE_NAME).SceneDelegate 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /FindTown/FindTownNetwork/Sources/FindTownNetwork/Extensions/URLRequest+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2023/01/22. 6 | // 7 | 8 | import Foundation 9 | import FindTownCore 10 | 11 | extension URLRequest { 12 | mutating func encoded(encodable: Encodable, 13 | encoder: JSONEncoder = JSONEncoder() 14 | ) throws -> URLRequest { 15 | do { 16 | let encodable = AnyEncodable(encodable) 17 | let body = try encoder.encode(encodable) 18 | Log.info(String(data: body, encoding: .utf8)) 19 | httpBody = body 20 | return self 21 | } catch { 22 | throw FTNetworkError.encode 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Map/TownLocationRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TownLocationRequest.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/13. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct TownLocationRequest: BaseRequest { 12 | 13 | init(HTTPHeaders: HTTPHeaders, parameters: [URLQueryItem]?) { 14 | self.headers = HTTPHeaders 15 | self.parameters = parameters 16 | } 17 | 18 | typealias ResponseType = TownMapLocationDTO 19 | var path: String = "/app/townMap/location" 20 | var method: FindTownNetwork.HttpMethod = .get 21 | var headers: FindTownNetwork.HTTPHeaders 22 | var task: FindTownNetwork.TaskType = .requestPlain 23 | var parameters: [URLQueryItem]? 24 | } 25 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/Sources/FindTownCore/Extensions/UIViewController+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 장선영 on 2022/12/28. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | extension UIViewController { 12 | 13 | /// 화면 탭시 키보드 숨기기 14 | public func hideKeyboard() { 15 | let tapGesture = UITapGestureRecognizer(target: self, 16 | action: #selector(UIViewController.dismissKeyboard)) 17 | tapGesture.cancelsTouchesInView = false 18 | view.addGestureRecognizer(tapGesture) 19 | } 20 | } 21 | 22 | private extension UIViewController { 23 | 24 | @objc func dismissKeyboard() { 25 | view.endEditing(true) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Town/TownFilterRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FilterRequest.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/12. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct TownFilterRequest: BaseRequest { 12 | 13 | init( 14 | task: FindTownNetwork.TaskType, 15 | HTTPHeaders: HTTPHeaders 16 | ) { 17 | self.task = task 18 | self.headers = HTTPHeaders 19 | } 20 | 21 | typealias ResponseType = TownFilterResponseDTO 22 | var path: String = "/app/town/filter" 23 | var method: FindTownNetwork.HttpMethod = .post 24 | var headers: FindTownNetwork.HTTPHeaders 25 | var task: FindTownNetwork.TaskType 26 | var parameters: [URLQueryItem]? = nil 27 | } 28 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Town/TownSearchRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TownSearchRequest.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/18. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct TownSearchRequest: BaseRequest { 12 | 13 | init(path: String, parameters: [URLQueryItem], headers: HTTPHeaders) { 14 | self.path = path 15 | self.parameters = parameters 16 | self.headers = headers 17 | } 18 | 19 | typealias ResponseType = TownSearchResponseDTO 20 | var path: String 21 | var method: FindTownNetwork.HttpMethod = .get 22 | var headers: FindTownNetwork.HTTPHeaders 23 | var task: FindTownNetwork.TaskType = .requestPlain 24 | var parameters: [URLQueryItem]? 25 | } 26 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Town/TownIntroduceRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TownIntroRequest.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/02/17. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct TownIntroduceRequest: BaseRequest { 12 | 13 | init(HTTPHeaders: HTTPHeaders, parameters: [URLQueryItem]) { 14 | self.headers = HTTPHeaders 15 | self.parameters = parameters 16 | } 17 | 18 | typealias ResponseType = TownIntroduceResponseDTO 19 | 20 | var path: String = "/app/town/introduce" 21 | var method: FindTownNetwork.HttpMethod = .get 22 | var headers: FindTownNetwork.HTTPHeaders 23 | var task: FindTownNetwork.TaskType = .requestPlain 24 | var parameters: [URLQueryItem]? 25 | } 26 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Reponse/ReissueResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ReissueResponseDTO.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/05. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct ReissueResponseDTO: Response { 12 | let accessTokenData: AccessTokenDTO 13 | let expiredTokenClaims: String? 14 | 15 | enum CodingKeys: String, CodingKey { 16 | case accessTokenData = "access_token" 17 | case expiredTokenClaims 18 | } 19 | } 20 | 21 | struct AccessTokenDTO: Response { 22 | let token: String 23 | let id: String 24 | let tokenClaims: TokenClaimsDTO 25 | } 26 | 27 | struct TokenClaimsDTO: Response { 28 | let sub: String 29 | let role: String 30 | let exp: TimeInterval 31 | } 32 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Auth/AuthLoginRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AuthLoginRequest.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/25. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct AuthLoginReqeust: BaseRequest { 12 | 13 | init(task: FindTownNetwork.TaskType) { 14 | self.task = task 15 | } 16 | 17 | typealias ResponseType = LoginResponseDTO 18 | var path: String = "/auth/login" 19 | var method: FindTownNetwork.HttpMethod = .post 20 | var headers: FindTownNetwork.HTTPHeaders = HTTPHeaders([.accept("*/*"), 21 | .contentType("application/json")]) 22 | var task: FindTownNetwork.TaskType 23 | var parameters: [URLQueryItem]? = nil 24 | } 25 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Member/SignupRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RegisterRequest.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/27. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct SignupRequest: BaseRequest { 12 | 13 | init(task: FindTownNetwork.TaskType) { 14 | self.task = task 15 | } 16 | 17 | typealias ResponseType = TokenInformationDTO 18 | var path: String = "/app/members/signup" 19 | var method: FindTownNetwork.HttpMethod = .post 20 | var headers: FindTownNetwork.HTTPHeaders = HTTPHeaders([.accept("*/*"), 21 | .contentType("application/json")]) 22 | var task: FindTownNetwork.TaskType 23 | var parameters: [URLQueryItem]? = nil 24 | } 25 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkmark.imageset/checkmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/TownIntroScene/TownIntroduce/SubViews/HotPlaceCollectionView/HotPlaceCollectionViewLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HotPlaceCollectionViewLayout.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/01/29. 6 | // 7 | 8 | import UIKit 9 | 10 | final class HotPlaceCollectionViewLayout: UICollectionViewFlowLayout { 11 | 12 | private let itemSpacing = 6.0 13 | 14 | override init() { 15 | super.init() 16 | setupView() 17 | } 18 | 19 | required init?(coder: NSCoder) { 20 | super.init(coder: coder) 21 | } 22 | 23 | private func setupView() { 24 | scrollDirection = .horizontal 25 | minimumInteritemSpacing = itemSpacing 26 | estimatedItemSize = CGSize(width: 100.0, height: 28.0) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/TownIntroScene/TownIntroduce/SubViews/TownMoodCollectionView/TownMoodCollectionViewLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TownMoodCollectionViewLayout.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/01/29. 6 | // 7 | 8 | import UIKit 9 | 10 | final class TownMoodCollectionViewLayout: UICollectionViewFlowLayout { 11 | 12 | private let itemSpacing = 8.0 13 | 14 | override init() { 15 | super.init() 16 | setupView() 17 | } 18 | 19 | required init?(coder: NSCoder) { 20 | super.init(coder: coder) 21 | } 22 | 23 | private func setupView() { 24 | scrollDirection = .horizontal 25 | minimumInteritemSpacing = itemSpacing 26 | estimatedItemSize = CGSize(width: 120.0, height: 32.0) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/SearchScene/Search/SubViews/SearchedDongCollectionView/SearchedDongCollectionViewFlowLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchedDongCollectionViewFlowLayout.swift 3 | // FindTown 4 | // 5 | // Created by 장선영 on 2023/11/04. 6 | // 7 | 8 | import UIKit 9 | 10 | final class SearchedDongCollectionViewFlowLayout: UICollectionViewFlowLayout { 11 | 12 | private let itemSpacing = 10.0 13 | 14 | override init() { 15 | super.init() 16 | setupView() 17 | } 18 | 19 | required init?(coder: NSCoder) { 20 | super.init(coder: coder) 21 | } 22 | 23 | private func setupView() { 24 | scrollDirection = .horizontal 25 | minimumInteritemSpacing = itemSpacing 26 | estimatedItemSize = CGSize(width: 77, height: 36) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Requests/Member/ChangeNicknameRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChangeNicknameRequest.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/18. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct ChangeNicknameRequest: BaseRequest { 12 | 13 | init( 14 | parameters: [URLQueryItem], 15 | HTTPHeaders: HTTPHeaders 16 | ) { 17 | self.parameters = parameters 18 | self.headers = HTTPHeaders 19 | } 20 | 21 | typealias ResponseType = ChangeNicknameResponseDTO 22 | var path: String = "/app/members/edit/nickname" 23 | var method: FindTownNetwork.HttpMethod = .put 24 | var headers: FindTownNetwork.HTTPHeaders 25 | var task: FindTownNetwork.TaskType = .requestPlain 26 | var parameters: [URLQueryItem]? 27 | } 28 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/Icon_search.imageset/_Icon_Search_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/myPageIcon.imageset/myPageIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/Frame 2608708.imageset/Frame 2608708.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTownCore/Sources/FindTownCore/Coordinator/PresentationStyle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 이호영 on 2022/12/25. 6 | // 7 | 8 | import UIKit 9 | 10 | public enum PresentationStyle { 11 | case push(navigationController: UINavigationController) 12 | case present(navigationController: UINavigationController, 13 | modalPresentationStyle: UIModalPresentationStyle = .automatic) 14 | case presentFlow(navigationController: UINavigationController, 15 | modalPresentationStyle: UIModalPresentationStyle = .automatic) 16 | case setViewController(navigationController: UINavigationController, 17 | modalTransitionStyle: UIModalTransitionStyle = .crossDissolve, 18 | modalPresentationStyle: UIModalPresentationStyle = .automatic) 19 | case none 20 | } 21 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Button/StarButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 김성훈 on 2022/12/15. 6 | // 7 | 8 | import UIKit 9 | 10 | public final class StarButton: UIButton { 11 | 12 | override init(frame: CGRect) { 13 | super.init(frame: frame) 14 | translatesAutoresizingMaskIntoConstraints = false 15 | 16 | configureUI() 17 | } 18 | 19 | required init?(coder: NSCoder) { 20 | fatalError("init(coder:) has not been implemented") 21 | } 22 | 23 | private func configureUI() { 24 | let image = UIImage(named: "star", in: .module, compatibleWith: nil) 25 | let selectedImage = UIImage(named: "starFill", in: .module, compatibleWith: nil) 26 | 27 | setImage(image, for: .normal) 28 | setImage(selectedImage, for: .selected) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/favorite.select.imageset/favorite.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/favorite_selected.imageset/favorite_selected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Domain/Interface/Repository/MemberRepository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MemberRepository.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/28. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol MemberRepository { 11 | func checkNickNameDuplicate(_ nickName: String) async throws -> Bool 12 | func changeNickname(nickName: String, accessToken: String) async throws -> Bool 13 | func signup(memberSignupDTO: MemberSignupDTO) async throws -> TokenInformationDTO 14 | func getMemberInformation(_ accessToken: String) async throws -> MemberInformationDTO 15 | func logout(accessToken: String) async throws -> LogoutResponseDTO 16 | func resign(accessToken: String) async throws -> MemberResignDTO 17 | func getFavoriteList(accessToken: String) async throws -> FavoriteListResponseDTO 18 | func favorite(accessToken: String, cityCode: Int) async throws -> FavoriteResponseDTO 19 | } 20 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/MapScene/Map/SubViews/StoreCollectionViewFlowLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StoreCollectionViewFlowLayout.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/10. 6 | // 7 | 8 | import UIKit 9 | 10 | final class StoreCollectionViewFlowLayout: UICollectionViewFlowLayout { 11 | 12 | required init?(coder: NSCoder) { 13 | super.init(coder: coder) 14 | } 15 | 16 | override init() { 17 | super.init() 18 | 19 | setupView() 20 | } 21 | 22 | private func setupView() { 23 | scrollDirection = .horizontal 24 | minimumLineSpacing = 0 25 | sectionInset = UIEdgeInsets(top: 0.0, 26 | left: 0.0, 27 | bottom: 0.0, 28 | right: 16.0) 29 | itemSize = CGSize(width: 306, height: 165) 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/Storage/KeyChain/KeyChainAccount.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeyChainAccount.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/01/12. 6 | // 7 | 8 | import Foundation 9 | 10 | enum KeyChainAccount { 11 | case accessToken 12 | case accesstokenExpiredTime 13 | case refreshToken 14 | case refreshTokenExpiredTime 15 | 16 | // 더 필요한 Account 추가 17 | 18 | var description: String { 19 | return String(describing: self) 20 | } 21 | 22 | var keyChainClass: CFString { 23 | switch self { 24 | case .accessToken: 25 | return kSecClassGenericPassword 26 | case .accesstokenExpiredTime: 27 | return kSecClassGenericPassword 28 | case .refreshToken: 29 | return kSecClassGenericPassword 30 | case .refreshTokenExpiredTime: 31 | return kSecClassGenericPassword 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/HomeScene/Home/SubViews/TownTableView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TownTableView.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/01/13. 6 | // 7 | 8 | import UIKit 9 | 10 | import FindTownUI 11 | 12 | final class TownTableView: UITableView { 13 | 14 | override init(frame: CGRect, style: UITableView.Style) { 15 | super.init(frame: frame, style: style) 16 | 17 | setupView() 18 | } 19 | 20 | required init?(coder: NSCoder) { 21 | fatalError("init(coder:) has not been implemented") 22 | } 23 | 24 | private func setupView() { 25 | translatesAutoresizingMaskIntoConstraints = false 26 | backgroundColor = FindTownColor.back2.color 27 | separatorStyle = .none 28 | register(TownTableViewCell.self, forCellReuseIdentifier: TownTableViewCell.reuseIdentifier) 29 | self.rowHeight = 174 + 16 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Error.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0", 9 | "green" : "0", 10 | "red" : "226" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/MapScene/Map/SubViews/CategoryCollectionViewFlowLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CategoryCollectionViewFlowLayout.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/01/10. 6 | // 7 | 8 | import UIKit 9 | 10 | final class CategoryCollectionViewFlowLayout: UICollectionViewFlowLayout { 11 | 12 | required init?(coder: NSCoder) { 13 | super.init(coder: coder) 14 | } 15 | 16 | override init() { 17 | super.init() 18 | 19 | setupView() 20 | } 21 | 22 | private func setupView() { 23 | scrollDirection = .horizontal 24 | minimumLineSpacing = 10 25 | sectionInset = UIEdgeInsets(top: 0.0, 26 | left: 17.0, 27 | bottom: 0.0, 28 | right: 82.0) 29 | estimatedItemSize = UICollectionViewFlowLayout.automaticSize 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /FindTown/FindTown/Presentation/MyPageScene/MyPage/MyTownReview/SubViews/ReviewTableView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ReviewTableView.swift 3 | // FindTown 4 | // 5 | // Created by 김성훈 on 2023/02/01. 6 | // 7 | 8 | import UIKit 9 | 10 | import FindTownUI 11 | 12 | final class ReviewTableView: UITableView { 13 | 14 | override init(frame: CGRect, style: UITableView.Style) { 15 | super.init(frame: frame, style: style) 16 | 17 | setupView() 18 | } 19 | 20 | required init?(coder: NSCoder) { 21 | fatalError("init(coder:) has not been implemented") 22 | } 23 | 24 | private func setupView() { 25 | translatesAutoresizingMaskIntoConstraints = false 26 | separatorStyle = .none 27 | register(ReviewTableViewCell.self, forCellReuseIdentifier: ReviewTableViewCell.reuseIdentifier) 28 | contentInset = UIEdgeInsets(top: 24, left: 0, bottom: 0, right: 0) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Blue.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "252", 9 | "green" : "141", 10 | "red" : "97" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "255", 27 | "green" : "255", 28 | "red" : "255" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Green.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "178", 9 | "green" : "214", 10 | "red" : "65" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Orange.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "181", 9 | "green" : "216", 10 | "red" : "254" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "255", 27 | "green" : "255", 28 | "red" : "255" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Pink.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "219", 9 | "green" : "218", 10 | "red" : "254" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "255", 27 | "green" : "255", 28 | "red" : "255" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Success.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "143", 9 | "green" : "178", 10 | "red" : "54" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Back1.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.980", 9 | "green" : "0.980", 10 | "red" : "0.980" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Back2.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.969", 9 | "green" : "0.969", 10 | "red" : "0.969" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Back3.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.941", 9 | "green" : "0.941", 10 | "red" : "0.941" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Black.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.102", 9 | "green" : "0.102", 10 | "red" : "0.102" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Dim20.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "0.200", 8 | "blue" : "0.102", 9 | "green" : "0.102", 10 | "red" : "0.102" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Dim50.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "0.500", 8 | "blue" : "0.102", 9 | "green" : "0.102", 10 | "red" : "0.102" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Dim70.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "0.700", 8 | "blue" : "0.102", 9 | "green" : "0.102", 10 | "red" : "0.102" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Grey1.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.980", 9 | "green" : "0.980", 10 | "red" : "0.980" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Grey2.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.969", 9 | "green" : "0.969", 10 | "red" : "0.969" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Grey3.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.933", 9 | "green" : "0.933", 10 | "red" : "0.933" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Grey4.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.871", 9 | "green" : "0.871", 10 | "red" : "0.871" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Grey5.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.745", 9 | "green" : "0.745", 10 | "red" : "0.745" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Grey6.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.502", 9 | "green" : "0.502", 10 | "red" : "0.502" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Grey7.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.267", 9 | "green" : "0.267", 10 | "red" : "0.267" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Primary30.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "208", 9 | "green" : "208", 10 | "red" : "254" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "255", 27 | "green" : "255", 28 | "red" : "255" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Primary40.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "191", 9 | "green" : "192", 10 | "red" : "253" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "255", 27 | "green" : "255", 28 | "red" : "255" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/White.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "1.000", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Primary.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.380", 9 | "green" : "0.380", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/FavoriteVC/anonymousIcon.imageset/anonymousIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/reset.imageset/reset.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/favoriteIcon.imageset/favoriteIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/favorite.imageset/favorite.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/FavoriteVC/emptyIcon.imageset/emptyIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/mapIcon.imageset/mapIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/themaCategory/thema.notebook.imageset/thema.notebook.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Button/CheckButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 김성훈 on 2022/12/15. 6 | // 7 | 8 | import UIKit 9 | 10 | public final class CheckButton: UIButton { 11 | 12 | override init(frame: CGRect) { 13 | super.init(frame: frame) 14 | 15 | translatesAutoresizingMaskIntoConstraints = false 16 | 17 | changesSelectionAsPrimaryAction = true 18 | 19 | configureUI() 20 | } 21 | 22 | required init?(coder: NSCoder) { 23 | fatalError("init(coder:) has not been implemented") 24 | } 25 | 26 | private func configureUI() { 27 | let image = UIImage(named: "checkButton", in: .module, compatibleWith: nil) 28 | let selectedImage = UIImage(named: "checkButtonFill", in: .module, compatibleWith: nil) 29 | 30 | setImage(image, for: .normal) 31 | setImage(selectedImage, for: .selected) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /FindTown/FindTownUI/Sources/FindTownUI/Button/RadioButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by 김성훈 on 2022/12/15. 6 | // 7 | 8 | import UIKit 9 | 10 | public final class RadioButton: UIButton { 11 | 12 | override init(frame: CGRect) { 13 | super.init(frame: frame) 14 | 15 | translatesAutoresizingMaskIntoConstraints = false 16 | 17 | changesSelectionAsPrimaryAction = true 18 | 19 | configureUI() 20 | } 21 | 22 | required init?(coder: NSCoder) { 23 | fatalError("init(coder:) has not been implemented") 24 | } 25 | 26 | private func configureUI() { 27 | let image = UIImage(named: "radioButton", in: .module, compatibleWith: nil) 28 | let selectedImage = UIImage(named: "radioButtonFill", in: .module, compatibleWith: nil) 29 | 30 | setImage(image, for: .normal) 31 | setImage(selectedImage, for: .selected) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /FindTown/FindTownUITests/FindTownUITestsLaunchTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FindTownUITestsLaunchTests.swift 3 | // FindTownUITests 4 | // 5 | // Created by 이호영 on 2022/12/03. 6 | // 7 | 8 | import XCTest 9 | 10 | class FindTownUITestsLaunchTests: XCTestCase { 11 | 12 | override class var runsForEachTargetApplicationUIConfiguration: Bool { 13 | true 14 | } 15 | 16 | override func setUpWithError() throws { 17 | continueAfterFailure = false 18 | } 19 | 20 | func testLaunch() throws { 21 | let app = XCUIApplication() 22 | app.launch() 23 | 24 | // Insert steps here to perform after app launch but before taking a screenshot, 25 | // such as logging into a test account or navigating somewhere in the app 26 | 27 | let attachment = XCTAttachment(screenshot: app.screenshot()) 28 | attachment.name = "Launch Screen" 29 | attachment.lifetime = .keepAlways 30 | add(attachment) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /FindTown/FindTown/Data/DataMapping/Reponse/LoginResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginResponseDTO.swift 3 | // FindTown 4 | // 5 | // Created by 이호영 on 2023/02/22. 6 | // 7 | 8 | import Foundation 9 | import FindTownNetwork 10 | 11 | struct LoginResponseDTO: Response { 12 | let loginStatus: Bool 13 | let accessToken: String 14 | let refreshToken: String 15 | let accessTokenExpiredTime: Double 16 | let refreshTokenExpiredTime: Double 17 | let cookieMaxAgeForAccess: Double 18 | let cookieMaxAge: Double 19 | 20 | enum CodingKeys: String, CodingKey { 21 | case loginStatus = "login_status" 22 | case accessToken = "access_token" 23 | case refreshToken = "refresh_token" 24 | case accessTokenExpiredTime = "access_token_expiry" 25 | case refreshTokenExpiredTime = "refresh_token_expiry" 26 | case cookieMaxAgeForAccess = "cookie_max_age_for_access" 27 | case cookieMaxAge = "cookie_max_age" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/favorite.nonselect.imageset/favorite.nonselect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | --------------------------------------------------------------------------------