├── 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 |
4 |
--------------------------------------------------------------------------------
/FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/dropButtonGrey.imageset/dropButtonGrey.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
5 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/icon_plus.imageset/_Icon_Plus.svg:
--------------------------------------------------------------------------------
1 |
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 |
6 |
--------------------------------------------------------------------------------
/FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkButton.imageset/checkButton.svg:
--------------------------------------------------------------------------------
1 |
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 |
5 |
--------------------------------------------------------------------------------
/FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/checkBoxFill.imageset/checkBoxFill.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
11 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/LoginVC/KakaoIcon.imageset/kakaoIcon.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Eco.imageset/Eco.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/FindTown/FindTownUI/Sources/FindTownUI/Resource/Assets.xcassets/Image/star.imageset/star.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/TownIntro/Warning.imageset/Warning.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
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 |
11 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/InfraCategory/pharmacyIcon.imageset/pharmacyIcon.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
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 |
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 |
4 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/myPageIcon.imageset/myPageIcon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/Frame 2608708.imageset/Frame 2608708.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/favorite_selected.imageset/favorite_selected.svg:
--------------------------------------------------------------------------------
1 |
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 |
5 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/reset.imageset/reset.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/favoriteIcon.imageset/favoriteIcon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/HomeVC/favorite.imageset/favorite.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/FavoriteVC/emptyIcon.imageset/emptyIcon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/TabBarVC/mapIcon.imageset/mapIcon.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/FindTown/FindTown/Resource/Assets.xcassets/Image/MapVC/themaCategory/thema.notebook.imageset/thema.notebook.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------