From c8c19f2030d246e63e427132696cf6eb4f80a6c6 Mon Sep 17 00:00:00 2001 From: Roy Date: Fri, 27 Mar 2026 05:05:58 +0900 Subject: [PATCH 01/35] =?UTF-8?q?feat:=20=ED=83=90=EC=83=89=20=EC=A7=80?= =?UTF-8?q?=EB=8F=84=EC=97=90=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC?= =?UTF-8?q?=EB=B3=84=20=ED=95=80=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카테고리별 핀 표시 (카페, 음식, 게임, 쇼핑 등) - 스팟 마커 처리 기능이 강화된 NaverMapComponent - 지도상에서 상호작용 가능한 위치 정보 제공 --- .../Sources/Station/StationService.swift | 2 +- .../Entity/Sources/OAuth/UserSession.swift | 5 +- .../LocationPermissionOverlay.swift | 3 +- .../Components/NaverMapComponent.swift | 99 +++++++++++++++-- .../Explore/Reducer/ExploreReducer.swift | 102 +++++++++++++++++- .../Sources/Explore/View/ExploreView.swift | 11 ++ .../Sources/Main/Reducer/HomeFeature.swift | 4 + .../map/cafePin.imageset/Contents.json | 12 +++ .../map/cafePin.imageset/cafePin.svg | 12 +++ .../map/etcPin.imageset/Contents.json | 12 +++ .../map/etcPin.imageset/etcPin.svg | 11 ++ .../map/foodPin.imageset/Contents.json | 12 +++ .../map/foodPin.imageset/foodPin.svg | 17 +++ .../map/gamePin.imageset/Contents.json | 12 +++ .../map/gamePin.imageset/gamePin.svg | 11 ++ .../map/shoppingPin.imageset/Contents.json | 12 +++ .../map/shoppingPin.imageset/shoppingPin.svg | 11 ++ .../Sources/Image/ImageAsset.swift | 5 + 18 files changed, 338 insertions(+), 15 deletions(-) create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/cafePin.imageset/Contents.json create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/cafePin.imageset/cafePin.svg create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/etcPin.imageset/Contents.json create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/etcPin.imageset/etcPin.svg create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/foodPin.imageset/Contents.json create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/foodPin.imageset/foodPin.svg create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/gamePin.imageset/Contents.json create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/gamePin.imageset/gamePin.svg create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/shoppingPin.imageset/Contents.json create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/shoppingPin.imageset/shoppingPin.svg diff --git a/Projects/Data/Service/Sources/Station/StationService.swift b/Projects/Data/Service/Sources/Station/StationService.swift index 2ff5bb2..da094df 100644 --- a/Projects/Data/Service/Sources/Station/StationService.swift +++ b/Projects/Data/Service/Sources/Station/StationService.swift @@ -66,7 +66,7 @@ extension StationService: BaseTargetType { public var headers: [String : String]? { switch self { case .allStation: - return APIHeader.notAccessTokenHeader + return APIHeader.baseHeader case .addFavoriteStation, .deleteFavoriteStation: return APIHeader.baseHeader } diff --git a/Projects/Domain/Entity/Sources/OAuth/UserSession.swift b/Projects/Domain/Entity/Sources/OAuth/UserSession.swift index 7bf4351..508c692 100644 --- a/Projects/Domain/Entity/Sources/OAuth/UserSession.swift +++ b/Projects/Domain/Entity/Sources/OAuth/UserSession.swift @@ -15,6 +15,7 @@ public struct UserSession: Equatable, Hashable { public var mapType: ExternalMapType public var travelID: String public var travelStationName: String + public var remainingMinutes: Int public init( name: String = "", @@ -23,7 +24,8 @@ public struct UserSession: Equatable, Hashable { authCode: String = "", mapType: ExternalMapType = .appleMap, travelID: String = "", - travelStationName: String = "" + travelStationName: String = "", + remainingMinutes: Int = 0 ) { self.name = name self.email = email @@ -32,6 +34,7 @@ public struct UserSession: Equatable, Hashable { self.mapType = mapType self.travelID = travelID self.travelStationName = travelStationName + self.remainingMinutes = remainingMinutes } } diff --git a/Projects/Presentation/Home/Sources/Components/LocationPermissionOverlay.swift b/Projects/Presentation/Home/Sources/Components/LocationPermissionOverlay.swift index 2ee38aa..c0caca9 100644 --- a/Projects/Presentation/Home/Sources/Components/LocationPermissionOverlay.swift +++ b/Projects/Presentation/Home/Sources/Components/LocationPermissionOverlay.swift @@ -78,7 +78,6 @@ extension LocationPermissionOverlay { LocationPermissionOverlay.openSettings() }, onRetryButtonTapped: { - print("Retry tapped") } ) -} \ No newline at end of file +} diff --git a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift index 16b5f87..17802a6 100644 --- a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift +++ b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift @@ -10,7 +10,9 @@ import SwiftUI import UIKit import CoreLocation import NMapsMap +import DesignSystem import Entity +import LogMacro // 네이버 맵을 SwiftUI에서 사용하기 위한 컴포넌트 public struct NaverMapComponent: UIViewRepresentable { @@ -18,11 +20,14 @@ public struct NaverMapComponent: UIViewRepresentable { let currentLocation: CLLocation? let routeInfo: RouteInfo? let destination: Destination? + let spots: [ExploreMapSpot] let returnToLocation: Bool // 현재 위치로 돌아가기 트리거 // 마커와 경로를 저장할 변수들 private static var currentMarker: NMFMarker? private static var destinationMarker: NMFMarker? + private static var spotMarkers: [String: NMFMarker] = [:] + private static var selectedSpotID: String? private static var routePath: NMFPath? public init( @@ -30,12 +35,14 @@ public struct NaverMapComponent: UIViewRepresentable { currentLocation: CLLocation?, routeInfo: RouteInfo? = nil, destination: Destination? = nil, + spots: [ExploreMapSpot] = [], returnToLocation: Bool = false ) { self.locationPermissionStatus = locationPermissionStatus self.currentLocation = currentLocation self.routeInfo = routeInfo self.destination = destination + self.spots = spots self.returnToLocation = returnToLocation } @@ -74,6 +81,8 @@ public struct NaverMapComponent: UIViewRepresentable { // 기존 마커들과 경로 제거 Self.currentMarker?.mapView = nil Self.destinationMarker?.mapView = nil + Self.spotMarkers.values.forEach { $0.mapView = nil } + Self.spotMarkers.removeAll() Self.routePath?.mapView = nil // 위치 권한이 허용되었고 현재 위치가 있을 때 - 항상 현재 위치 마커 표시 @@ -101,9 +110,9 @@ public struct NaverMapComponent: UIViewRepresentable { currentMarker.mapView = uiView Self.currentMarker = currentMarker - print("🔴 [NaverMap] 출발점 빨간색 마커 추가 (텍스트 없이)") + #logDebug(" [NaverMapComponent] 출발점 마커 추가") } else { - print("🎯 [NaverMap] 네이버 기본 위치 오버레이만 사용") + #logDebug(" [NaverMapComponent] 기본 위치 오버레이 사용") } } @@ -120,22 +129,61 @@ public struct NaverMapComponent: UIViewRepresentable { destinationMarker.mapView = uiView Self.destinationMarker = destinationMarker - print("🗺️ [NaverMap] 목적지 3D 마커 추가 (32x32): \(destination.name)") + #logDebug(" [NaverMapComponent] 목적지 마커 추가: \(destination.name)") + } + + if !spots.contains(where: { $0.id == Self.selectedSpotID }) { + Self.selectedSpotID = nil + } + + for spot in spots { + let marker = NMFMarker() + marker.position = NMGLatLng( + lat: spot.coordinate.latitude, + lng: spot.coordinate.longitude + ) + marker.iconImage = NMFOverlayImage(image: markerImage(for: spot.category)) + marker.anchor = CGPoint(x: 0.5, y: 1.0) + marker.captionText = spot.name + marker.captionColor = .black + marker.captionHaloColor = .white + Self.applySpotMarkerStyle( + marker, + isSelected: spot.id == Self.selectedSpotID + ) + marker.touchHandler = { _ in + Self.selectedSpotID = spot.id + Self.updateSpotMarkerSelection() + let cameraPosition = NMFCameraPosition( + NMGLatLng( + lat: spot.coordinate.latitude, + lng: spot.coordinate.longitude + ), + zoom: 17 + ) + let cameraUpdate = NMFCameraUpdate(position: cameraPosition) + cameraUpdate.animation = .easeIn + cameraUpdate.animationDuration = 0.3 + uiView.moveCamera(cameraUpdate) + return true + } + marker.mapView = uiView + Self.spotMarkers[spot.id] = marker } // 도보 경로 그리기 if let routeInfo = routeInfo, !routeInfo.paths.isEmpty { - print("🗺️ [NaverMap] 경로 정보: \(routeInfo.paths.count)개 좌표, 거리: \(routeInfo.distance)m") + #logDebug(" [NaverMapComponent] 경로 정보: 좌표 \(routeInfo.paths.count)개, 거리 \(routeInfo.distance)m") // 경로 좌표들을 NMGLatLng 배열로 변환 let pathCoords = routeInfo.paths.map { coordinate in - print("📍 좌표: \(coordinate.latitude), \(coordinate.longitude)") + #logDebug(" [NaverMapComponent] 경로 좌표: \(coordinate.latitude), \(coordinate.longitude)") return NMGLatLng(lat: coordinate.latitude, lng: coordinate.longitude) } // 좌표가 부족한 경우 체크 guard pathCoords.count >= 2 else { - print("🚨 [NaverMap] 경로 좌표가 부족합니다: \(pathCoords.count)개") + #logDebug(" [NaverMapComponent] 경로 좌표 부족: \(pathCoords.count)개") return } @@ -155,12 +203,47 @@ public struct NaverMapComponent: UIViewRepresentable { // 🎯 경로 전체가 보이도록 카메라 조정 (중앙으로) adjustCameraToFitRoute(mapView: uiView, routeCoords: pathCoords, currentLocation: currentLocation) - print("🔵 [NaverMap] 경로 표시 및 카메라 조정 완료") + #logDebug(" [NaverMapComponent] 경로 표시 및 카메라 조정 완료") } } // MARK: - Helper Functions + private func markerImage(for category: ExploreCategory) -> UIImage { + let asset: ImageAsset + switch category { + case .all: + asset = .etcPin + case .cafe: + asset = .cafePin + case .restaurant: + asset = .foodPin + case .activity: + asset = .gamePin + case .etc: + asset = .etcPin + @unknown default: + asset = .etcPin + } + + return UIImage(asset) ?? UIImage() + } + + private static func applySpotMarkerStyle( + _ marker: NMFMarker, + isSelected: Bool + ) { + marker.width = isSelected ? 36 : 20 + marker.height = isSelected ? 43 : 24 + marker.zIndex = isSelected ? 100 : 10 + } + + private static func updateSpotMarkerSelection() { + for (spotID, marker) in spotMarkers { + applySpotMarkerStyle(marker, isSelected: spotID == selectedSpotID) + } + } + // 3D 효과가 있는 핀 마커 이미지 생성 private func create3DMarkerImage(color: UIColor, size: CGSize) -> UIImage { let renderer = UIGraphicsImageRenderer(size: size) @@ -252,7 +335,7 @@ public struct NaverMapComponent: UIViewRepresentable { cameraUpdate.animationDuration = 1.0 mapView.moveCamera(cameraUpdate) - print("📹 [NaverMap] 경로 전체가 보이도록 카메라 조정 완료") + #logDebug(" [NaverMapComponent] 경로 전체가 보이도록 카메라 조정 완료") } private func createCircleMarkerImage(color: UIColor, size: CGSize) -> UIImage { diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index 1ceafef..5b68b45 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -12,6 +12,7 @@ import ComposableArchitecture import CoreLocation import UseCase import Entity +import LogMacro @Reducer public struct ExploreReducer: Sendable { @@ -24,6 +25,7 @@ public struct ExploreReducer: Sendable { public var isLocationPermissionDenied: Bool = false public var locationError: String? public var searchText: String = "" + public var spots: [ExploreMapSpot] = [] @Presents public var alert: AlertState? @Shared(.inMemory("UserSession")) var userSession: UserSession = .empty @@ -140,6 +142,9 @@ extension ExploreReducer { ) -> Effect { switch action { case .onAppear: + if state.spots.isEmpty { + state.spots = ExploreMapSpot.mockSpots + } return .run { send in let locationManager = await LocationPermissionManager.shared let currentStatus = await locationManager.authorizationStatus @@ -238,7 +243,7 @@ extension ExploreReducer { return .none case .locationUpdateFailed(let error): - print("위치 업데이트 실패: \(error)") + #logDebug(" [ExploreReducer] 위치 업데이트 실패: \(error)") return .none // 길찾기 관련 액션 @@ -254,10 +259,10 @@ extension ExploreReducer { case .success(let routeInfo): state.routeInfo = routeInfo state.routeError = nil - print("✅ 경로 검색 완료: \(routeInfo.distance)m, \(routeInfo.duration)분") + #logDebug(" [ExploreReducer] 경로 검색 완료: \(routeInfo.distance)m, \(routeInfo.duration)분") case .failure(let error): state.routeError = error.localizedDescription - print("🚨 경로 검색 실패: \(error.localizedDescription)") + #logDebug(" [ExploreReducer] 경로 검색 실패: \(error.localizedDescription)") } return .none @@ -396,6 +401,7 @@ extension ExploreReducer.State: Hashable { hasher.combine(currentLocation?.coordinate.longitude) hasher.combine(isLocationPermissionDenied) hasher.combine(locationError) + hasher.combine(spots) hasher.combine(isLoadingRoute) hasher.combine(routeError) hasher.combine(shouldReturnToCurrentLocation) @@ -403,3 +409,93 @@ extension ExploreReducer.State: Hashable { // Note: alert, selectedDestination, routeInfo are not hashed as they contain complex types } } + +public struct ExploreMapSpot: Identifiable { + public let id: String + public let name: String + public let category: ExploreCategory + public let coordinate: CLLocationCoordinate2D + + public init( + id: String, + name: String, + category: ExploreCategory, + coordinate: CLLocationCoordinate2D + ) { + self.id = id + self.name = name + self.category = category + self.coordinate = coordinate + } + + public static let mockSpots: [ExploreMapSpot] = [ + .init( + id: "cityhall-cafe-1", + name: "시청 브루잉", + category: .cafe, + coordinate: CLLocationCoordinate2D(latitude: 37.5669, longitude: 126.9789) + ), + .init( + id: "cityhall-cafe-2", + name: "덕수궁 카페", + category: .cafe, + coordinate: CLLocationCoordinate2D(latitude: 37.5658, longitude: 126.9758) + ), + .init( + id: "cityhall-food-1", + name: "시청역 한식당", + category: .restaurant, + coordinate: CLLocationCoordinate2D(latitude: 37.5652, longitude: 126.9797) + ), + .init( + id: "cityhall-food-2", + name: "정동길 다이닝", + category: .restaurant, + coordinate: CLLocationCoordinate2D(latitude: 37.5674, longitude: 126.9739) + ), + .init( + id: "cityhall-activity-1", + name: "덕수궁 산책", + category: .activity, + coordinate: CLLocationCoordinate2D(latitude: 37.5659, longitude: 126.9751) + ), + .init( + id: "cityhall-activity-2", + name: "서울광장 이벤트", + category: .activity, + coordinate: CLLocationCoordinate2D(latitude: 37.5663, longitude: 126.9779) + ), + .init( + id: "cityhall-etc-1", + name: "시청 소품샵", + category: .etc, + coordinate: CLLocationCoordinate2D(latitude: 37.5677, longitude: 126.9808) + ), + .init( + id: "cityhall-etc-2", + name: "서울 굿즈 스토어", + category: .etc, + coordinate: CLLocationCoordinate2D(latitude: 37.5648, longitude: 126.9770) + ) + ] +} + +extension ExploreMapSpot: Equatable { + public static func == (lhs: ExploreMapSpot, rhs: ExploreMapSpot) -> Bool { + lhs.id == rhs.id + && lhs.name == rhs.name + && lhs.category == rhs.category + && lhs.coordinate.latitude == rhs.coordinate.latitude + && lhs.coordinate.longitude == rhs.coordinate.longitude + } +} + +extension ExploreMapSpot: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(id) + hasher.combine(name) + hasher.combine(category) + hasher.combine(coordinate.latitude) + hasher.combine(coordinate.longitude) + } +} diff --git a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift index 8d37d3d..9fdb9ea 100644 --- a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift +++ b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift @@ -53,11 +53,22 @@ private extension ExploreView { currentLocation: store.currentLocation, routeInfo: store.routeInfo, destination: store.selectedDestination, + spots: filteredSpots, returnToLocation: store.shouldReturnToCurrentLocation ) .ignoresSafeArea(.all) } + var filteredSpots: [ExploreMapSpot] { + let query = store.searchText.trimmingCharacters(in: .whitespacesAndNewlines) + + return store.spots.filter { spot in + let matchesCategory = store.selectedCategory == .all || spot.category == store.selectedCategory + let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) + return matchesCategory && matchesQuery + } + } + @ViewBuilder func headerSection() -> some View { VStack(spacing: 0) { diff --git a/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift b/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift index 49d0b7b..76015a7 100644 --- a/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift +++ b/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift @@ -258,6 +258,9 @@ extension HomeFeature { state.departureTime = date state.departureTimePickerVisible = false state.isDepartureTimeSet = true + state.$userSession.withLock { + $0.remainingMinutes = state.remainingTotalMinutes + } guard state.shouldShowDepartureWarningToast else { return .none } @@ -385,6 +388,7 @@ extension HomeFeature { state.$userSession.withLock { $0.travelID = "" $0.travelStationName = "" + $0.remainingMinutes = 0 } return .none } diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/cafePin.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/cafePin.imageset/Contents.json new file mode 100644 index 0000000..143de72 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/cafePin.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "cafePin.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/cafePin.imageset/cafePin.svg b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/cafePin.imageset/cafePin.svg new file mode 100644 index 0000000..d4ddbf8 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/cafePin.imageset/cafePin.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/etcPin.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/etcPin.imageset/Contents.json new file mode 100644 index 0000000..f0b4461 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/etcPin.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "etcPin.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/etcPin.imageset/etcPin.svg b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/etcPin.imageset/etcPin.svg new file mode 100644 index 0000000..9dfb3a7 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/etcPin.imageset/etcPin.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/foodPin.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/foodPin.imageset/Contents.json new file mode 100644 index 0000000..59cabd9 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/foodPin.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "foodPin.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/foodPin.imageset/foodPin.svg b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/foodPin.imageset/foodPin.svg new file mode 100644 index 0000000..119c69d --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/foodPin.imageset/foodPin.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/gamePin.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/gamePin.imageset/Contents.json new file mode 100644 index 0000000..5e3ea88 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/gamePin.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "gamePin.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/gamePin.imageset/gamePin.svg b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/gamePin.imageset/gamePin.svg new file mode 100644 index 0000000..5cf9070 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/gamePin.imageset/gamePin.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/shoppingPin.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/shoppingPin.imageset/Contents.json new file mode 100644 index 0000000..24f6980 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/shoppingPin.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "shoppingPin.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/shoppingPin.imageset/shoppingPin.svg b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/shoppingPin.imageset/shoppingPin.svg new file mode 100644 index 0000000..23ccaa6 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/shoppingPin.imageset/shoppingPin.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift b/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift index 8fb0cf2..915af7e 100644 --- a/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift +++ b/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift @@ -39,6 +39,11 @@ public enum ImageAsset: String { case naverMap case googleMap case appleMap + case shoppingPin + case cafePin + case etcPin + case foodPin + case gamePin case onBoardingLogo1 case onBoardingLogo2 From da48bfac0655e55f67769d2a32fa2e394b86e94d Mon Sep 17 00:00:00 2001 From: Roy Date: Fri, 27 Mar 2026 06:30:06 +0900 Subject: [PATCH 02/35] =?UTF-8?q?feat:=20=ED=83=90=EC=83=89=20=EC=A7=80?= =?UTF-8?q?=EB=8F=84=20=EC=8A=A4=ED=8C=9F=20=EC=83=81=EC=84=B8=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=B9=B4=EB=93=9C=20=EB=B0=8F=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=20UI=20=EC=B6=94=EA=B0=80=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Explore/ExploreMapSpot.swift | 177 +++++++++++++ .../Entity/Sources/OAuth/UserSession.swift | 5 +- .../Components/NaverMapComponent.swift | 81 +++++- .../Components/ExploreCategoryChipView.swift | 68 +++++ .../ExploreFloatingControlsView.swift | 77 ++++++ .../ExploreSelectedSpotCardView.swift | 119 +++++++++ .../Explore/Reducer/ExploreReducer.swift | 153 +++++------- .../Sources/Explore/View/ExploreView.swift | 235 ++++++++++++------ 8 files changed, 738 insertions(+), 177 deletions(-) create mode 100644 Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift create mode 100644 Projects/Presentation/Home/Sources/Explore/Components/ExploreCategoryChipView.swift create mode 100644 Projects/Presentation/Home/Sources/Explore/Components/ExploreFloatingControlsView.swift create mode 100644 Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift diff --git a/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift b/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift new file mode 100644 index 0000000..3f6ae6c --- /dev/null +++ b/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift @@ -0,0 +1,177 @@ +// +// ExploreMapSpot.swift +// Entity +// +// Created by wonji suh on 2026-03-27. +// + +import Foundation +import CoreLocation + +public struct ExploreMapSpot: Identifiable { + public let id: String + public let name: String + public let category: ExploreCategory + public let coordinate: CLLocationCoordinate2D + public let badgeText: String + public let subtitle: String + public let statusText: String + public let closingText: String + public let distanceText: String + public let walkTimeText: String + + public init( + id: String, + name: String, + category: ExploreCategory, + coordinate: CLLocationCoordinate2D, + badgeText: String, + subtitle: String, + statusText: String, + closingText: String, + distanceText: String, + walkTimeText: String + ) { + self.id = id + self.name = name + self.category = category + self.coordinate = coordinate + self.badgeText = badgeText + self.subtitle = subtitle + self.statusText = statusText + self.closingText = closingText + self.distanceText = distanceText + self.walkTimeText = walkTimeText + } + + public static let mockSpots: [ExploreMapSpot] = [ + .init( + id: "cityhall-cafe-1", + name: "시청 브루잉", + category: .cafe, + coordinate: CLLocationCoordinate2D(latitude: 37.5669, longitude: 126.9789), + badgeText: "24분 체류 가능", + subtitle: "카페", + statusText: "영업 중", + closingText: "21:00에 영업종료", + distanceText: "180m", + walkTimeText: "시청역에서 약 3분" + ), + .init( + id: "cityhall-cafe-2", + name: "덕수궁 카페", + category: .cafe, + coordinate: CLLocationCoordinate2D(latitude: 37.5658, longitude: 126.9758), + badgeText: "19분 체류 가능", + subtitle: "카페", + statusText: "영업 중", + closingText: "20:30에 영업종료", + distanceText: "230m", + walkTimeText: "시청역에서 약 4분" + ), + .init( + id: "cityhall-food-1", + name: "시청역 한식당", + category: .restaurant, + coordinate: CLLocationCoordinate2D(latitude: 37.5652, longitude: 126.9797), + badgeText: "32분 체류 가능", + subtitle: "음식점", + statusText: "영업 중", + closingText: "22:00에 영업종료", + distanceText: "140m", + walkTimeText: "시청역에서 약 2분" + ), + .init( + id: "cityhall-food-2", + name: "정동길 다이닝", + category: .restaurant, + coordinate: CLLocationCoordinate2D(latitude: 37.5674, longitude: 126.9739), + badgeText: "28분 체류 가능", + subtitle: "음식점", + statusText: "영업 중", + closingText: "21:30에 영업종료", + distanceText: "310m", + walkTimeText: "시청역에서 약 5분" + ), + .init( + id: "cityhall-activity-1", + name: "덕수궁 산책", + category: .activity, + coordinate: CLLocationCoordinate2D(latitude: 37.5659, longitude: 126.9751), + badgeText: "41분 체류 가능", + subtitle: "액티비티", + statusText: "운영 중", + closingText: "19:00에 입장마감", + distanceText: "260m", + walkTimeText: "시청역에서 약 4분" + ), + .init( + id: "cityhall-activity-2", + name: "서울광장 이벤트", + category: .activity, + coordinate: CLLocationCoordinate2D(latitude: 37.5663, longitude: 126.9779), + badgeText: "17분 체류 가능", + subtitle: "액티비티", + statusText: "진행 중", + closingText: "18:00에 종료", + distanceText: "90m", + walkTimeText: "시청역에서 약 1분" + ), + .init( + id: "cityhall-etc-1", + name: "시청 소품샵", + category: .etc, + coordinate: CLLocationCoordinate2D(latitude: 37.5677, longitude: 126.9808), + badgeText: "26분 체류 가능", + subtitle: "기타", + statusText: "영업 중", + closingText: "20:00에 영업종료", + distanceText: "280m", + walkTimeText: "시청역에서 약 4분" + ), + .init( + id: "cityhall-etc-2", + name: "서울 굿즈 스토어", + category: .etc, + coordinate: CLLocationCoordinate2D(latitude: 37.5648, longitude: 126.9770), + badgeText: "22분 체류 가능", + subtitle: "기타", + statusText: "영업 중", + closingText: "19:30에 영업종료", + distanceText: "210m", + walkTimeText: "시청역에서 약 3분" + ) + ] +} + +extension ExploreMapSpot: Equatable { + public static func == (lhs: ExploreMapSpot, rhs: ExploreMapSpot) -> Bool { + lhs.id == rhs.id + && lhs.name == rhs.name + && lhs.category == rhs.category + && lhs.coordinate.latitude == rhs.coordinate.latitude + && lhs.coordinate.longitude == rhs.coordinate.longitude + && lhs.badgeText == rhs.badgeText + && lhs.subtitle == rhs.subtitle + && lhs.statusText == rhs.statusText + && lhs.closingText == rhs.closingText + && lhs.distanceText == rhs.distanceText + && lhs.walkTimeText == rhs.walkTimeText + } +} + +extension ExploreMapSpot: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(id) + hasher.combine(name) + hasher.combine(category) + hasher.combine(coordinate.latitude) + hasher.combine(coordinate.longitude) + hasher.combine(badgeText) + hasher.combine(subtitle) + hasher.combine(statusText) + hasher.combine(closingText) + hasher.combine(distanceText) + hasher.combine(walkTimeText) + } +} diff --git a/Projects/Domain/Entity/Sources/OAuth/UserSession.swift b/Projects/Domain/Entity/Sources/OAuth/UserSession.swift index 508c692..d0eb574 100644 --- a/Projects/Domain/Entity/Sources/OAuth/UserSession.swift +++ b/Projects/Domain/Entity/Sources/OAuth/UserSession.swift @@ -16,6 +16,7 @@ public struct UserSession: Equatable, Hashable { public var travelID: String public var travelStationName: String public var remainingMinutes: Int + public var selectedExploreSpotID: String public init( name: String = "", @@ -25,7 +26,8 @@ public struct UserSession: Equatable, Hashable { mapType: ExternalMapType = .appleMap, travelID: String = "", travelStationName: String = "", - remainingMinutes: Int = 0 + remainingMinutes: Int = 0, + selectedExploreSpotID: String = "" ) { self.name = name self.email = email @@ -35,6 +37,7 @@ public struct UserSession: Equatable, Hashable { self.travelID = travelID self.travelStationName = travelStationName self.remainingMinutes = remainingMinutes + self.selectedExploreSpotID = selectedExploreSpotID } } diff --git a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift index 17802a6..08594a2 100644 --- a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift +++ b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift @@ -21,13 +21,17 @@ public struct NaverMapComponent: UIViewRepresentable { let routeInfo: RouteInfo? let destination: Destination? let spots: [ExploreMapSpot] + let selectedSpotID: String? let returnToLocation: Bool // 현재 위치로 돌아가기 트리거 + let onSpotTapped: ((String) -> Void)? + let onMapTapped: (() -> Void)? // 마커와 경로를 저장할 변수들 private static var currentMarker: NMFMarker? private static var destinationMarker: NMFMarker? private static var spotMarkers: [String: NMFMarker] = [:] private static var selectedSpotID: String? + private static var lastSyncedSpotID: String? private static var routePath: NMFPath? public init( @@ -36,18 +40,29 @@ public struct NaverMapComponent: UIViewRepresentable { routeInfo: RouteInfo? = nil, destination: Destination? = nil, spots: [ExploreMapSpot] = [], - returnToLocation: Bool = false + selectedSpotID: String? = nil, + returnToLocation: Bool = false, + onSpotTapped: ((String) -> Void)? = nil, + onMapTapped: (() -> Void)? = nil ) { self.locationPermissionStatus = locationPermissionStatus self.currentLocation = currentLocation self.routeInfo = routeInfo self.destination = destination self.spots = spots + self.selectedSpotID = selectedSpotID self.returnToLocation = returnToLocation + self.onSpotTapped = onSpotTapped + self.onMapTapped = onMapTapped + } + + public func makeCoordinator() -> Coordinator { + Coordinator(parent: self) } public func makeUIView(context: Context) -> NMFMapView { let mapView = NMFMapView() + context.coordinator.parent = self // 지도 기본 설정 mapView.positionMode = .normal @@ -62,6 +77,7 @@ public struct NaverMapComponent: UIViewRepresentable { // 🎯 네이버 지도 위치 오버레이 설정 (항상 기본 오버레이 사용) mapView.locationOverlay.hidden = false + mapView.touchDelegate = context.coordinator // 현재 위치가 있으면 그 위치로, 없으면 서울로 초기 설정 let initialLatitude = currentLocation?.coordinate.latitude ?? 37.5666805 @@ -78,6 +94,7 @@ public struct NaverMapComponent: UIViewRepresentable { } public func updateUIView(_ uiView: NMFMapView, context: Context) { + context.coordinator.parent = self // 기존 마커들과 경로 제거 Self.currentMarker?.mapView = nil Self.destinationMarker?.mapView = nil @@ -91,13 +108,14 @@ public struct NaverMapComponent: UIViewRepresentable { // 현재 위치로 돌아가기 버튼이 눌렸을 때만 카메라 이동 if returnToLocation { - let cameraPosition = NMFCameraPosition( - NMGLatLng(lat: location.coordinate.latitude, lng: location.coordinate.longitude), + moveCamera( + on: uiView, + to: NMGLatLng( + lat: location.coordinate.latitude, + lng: location.coordinate.longitude + ), zoom: 16 ) - let cameraUpdate = NMFCameraUpdate(position: cameraPosition) - cameraUpdate.animationDuration = 0.8 - uiView.moveCamera(cameraUpdate) } // 경로가 있을 때는 출발점에 빨간색 마커도 추가로 표시 @@ -132,6 +150,10 @@ public struct NaverMapComponent: UIViewRepresentable { #logDebug(" [NaverMapComponent] 목적지 마커 추가: \(destination.name)") } + let previousSpotID = Self.lastSyncedSpotID + Self.selectedSpotID = selectedSpotID + Self.lastSyncedSpotID = selectedSpotID + if !spots.contains(where: { $0.id == Self.selectedSpotID }) { Self.selectedSpotID = nil } @@ -154,23 +176,34 @@ public struct NaverMapComponent: UIViewRepresentable { marker.touchHandler = { _ in Self.selectedSpotID = spot.id Self.updateSpotMarkerSelection() - let cameraPosition = NMFCameraPosition( - NMGLatLng( + onSpotTapped?(spot.id) + moveCamera( + on: uiView, + to: NMGLatLng( lat: spot.coordinate.latitude, lng: spot.coordinate.longitude ), zoom: 17 ) - let cameraUpdate = NMFCameraUpdate(position: cameraPosition) - cameraUpdate.animation = .easeIn - cameraUpdate.animationDuration = 0.3 - uiView.moveCamera(cameraUpdate) return true } marker.mapView = uiView Self.spotMarkers[spot.id] = marker } + if let selectedSpotID = Self.selectedSpotID, + selectedSpotID != previousSpotID, + let selectedSpot = spots.first(where: { $0.id == selectedSpotID }) { + moveCamera( + on: uiView, + to: NMGLatLng( + lat: selectedSpot.coordinate.latitude, + lng: selectedSpot.coordinate.longitude + ), + zoom: 17 + ) + } + // 도보 경로 그리기 if let routeInfo = routeInfo, !routeInfo.paths.isEmpty { #logDebug(" [NaverMapComponent] 경로 정보: 좌표 \(routeInfo.paths.count)개, 거리 \(routeInfo.distance)m") @@ -207,6 +240,18 @@ public struct NaverMapComponent: UIViewRepresentable { } } + public final class Coordinator: NSObject, NMFMapViewTouchDelegate { + var parent: NaverMapComponent + + init(parent: NaverMapComponent) { + self.parent = parent + } + + public func mapView(_ mapView: NMFMapView, didTapMap latlng: NMGLatLng, point: CGPoint) { + parent.onMapTapped?() + } + } + // MARK: - Helper Functions private func markerImage(for category: ExploreCategory) -> UIImage { @@ -244,6 +289,18 @@ public struct NaverMapComponent: UIViewRepresentable { } } + private func moveCamera( + on mapView: NMFMapView, + to target: NMGLatLng, + zoom: Double + ) { + let cameraPosition = NMFCameraPosition(target, zoom: zoom) + let cameraUpdate = NMFCameraUpdate(position: cameraPosition) + cameraUpdate.animation = .easeOut + cameraUpdate.animationDuration = 0.45 + mapView.moveCamera(cameraUpdate) + } + // 3D 효과가 있는 핀 마커 이미지 생성 private func create3DMarkerImage(color: UIColor, size: CGSize) -> UIImage { let renderer = UIGraphicsImageRenderer(size: size) diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreCategoryChipView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreCategoryChipView.swift new file mode 100644 index 0000000..d18e113 --- /dev/null +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreCategoryChipView.swift @@ -0,0 +1,68 @@ +// +// ExploreCategoryChipView.swift +// Home +// + +import SwiftUI + +import DesignSystem +import Entity + +struct ExploreCategoryChipView: View { + let category: ExploreCategory + let isSelected: Bool + let action: () -> Void + + var body: some View { + Button(action: action) { + HStack(spacing: 4) { + categoryIcon + + Text(category.title) + .pretendardCustomFont(textStyle: .body2Medium) + .foregroundStyle(isSelected ? .staticBlack : .gray700) + } + .padding(.vertical, 10) + .padding(.horizontal, 16) + .background(isSelected ? .orange200 : .staticWhite) + .overlay { + Capsule() + .stroke(isSelected ? .orange800 : .gray300, lineWidth: 1) + } + .clipShape(Capsule()) + .shadow(color: .black.opacity(isSelected ? 0.04 : 0.08), radius: 8, y: 2) + } + .buttonStyle(.plain) + } + + @ViewBuilder + private var categoryIcon: some View { + switch category { + case .all: + Image(asset: isSelected ? .tapAll : .all) + .resizable() + .scaledToFit() + .frame(width: 16, height: 16) + case .cafe: + Image(asset: isSelected ? .tapCaffe : .cafe) + .resizable() + .scaledToFit() + .frame(width: 16, height: 16) + case .restaurant: + Image(asset: isSelected ? .tapFood : .food) + .resizable() + .scaledToFit() + .frame(width: 16, height: 16) + case .activity: + Image(asset: isSelected ? .tapGame : .game) + .resizable() + .scaledToFit() + .frame(width: 16, height: 16) + case .etc: + Image(asset: isSelected ? .tapEtc : .etc) + .resizable() + .scaledToFit() + .frame(width: 16, height: 16) + } + } +} diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreFloatingControlsView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreFloatingControlsView.swift new file mode 100644 index 0000000..e1c376a --- /dev/null +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreFloatingControlsView.swift @@ -0,0 +1,77 @@ +// +// ExploreFloatingControlsView.swift +// Home +// + +import SwiftUI + +import DesignSystem + +struct ExploreFloatingControlsView: View { + private let listButtonWidth: CGFloat = 100 + private let currentLocationButtonWidth: CGFloat = 48 + private let buttonsSpacing: CGFloat = 80 + + let showsListButton: Bool + let controlsBottomPadding: CGFloat + let onListTap: () -> Void + let onCurrentLocationTap: () -> Void + + var body: some View { + Group { + if showsListButton { + ZStack { + listButton + .frame(maxWidth: .infinity, alignment: .center) + + currentLocationButton + .offset(x: currentLocationOffset) + } + .frame(maxWidth: .infinity) + } else { + HStack { + Spacer() + currentLocationButton + } + } + } + .padding(.horizontal, 16) + .padding(.bottom, controlsBottomPadding) + } + + private var currentLocationOffset: CGFloat { + (listButtonWidth / 2) + buttonsSpacing + (currentLocationButtonWidth / 2) + } + + private var listButton: some View { + Button(action: onListTap) { + HStack(spacing: 6) { + Image(systemName: "list.bullet") + .font(.system(size: 14, weight: .semibold)) + Text("목록보기") + .pretendardCustomFont(textStyle: .body2Medium) + } + .foregroundStyle(.gray700) + .padding(.horizontal, 12) + .padding(.vertical, 6) + .frame(width: listButtonWidth, height: 38) + .background(.staticWhite) + .clipShape(Capsule()) + .shadow(color: .black.opacity(0.12), radius: 8, y: 2) + } + .buttonStyle(.plain) + } + + private var currentLocationButton: some View { + Button(action: onCurrentLocationTap) { + Image(asset: .location) + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + .frame(width: currentLocationButtonWidth, height: currentLocationButtonWidth) + .background(.staticWhite, in: Circle()) + .shadow(color: .black.opacity(0.12), radius: 8, y: 2) + } + .buttonStyle(.plain) + } +} diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift new file mode 100644 index 0000000..6a67705 --- /dev/null +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift @@ -0,0 +1,119 @@ +// +// ExploreSelectedSpotCardView.swift +// Home +// + +import SwiftUI + +import DesignSystem +import Entity + +struct ExploreSelectedSpotCardView: View { + let currentSpot: ExploreMapSpot + let adjacentSpot: ExploreMapSpot? + let currentOffset: CGFloat + let adjacentOffset: CGFloat? + let cardOpacity: Double + let onRouteTap: () -> Void + let onDragChanged: (DragGesture.Value) -> Void + let onDragEnded: (DragGesture.Value) -> Void + + var body: some View { + ZStack { + if let adjacentSpot, let adjacentOffset { + cardContent(for: adjacentSpot) + .offset(x: adjacentOffset) + .allowsHitTesting(false) + } + + cardContent(for: currentSpot) + .offset(x: currentOffset) + .opacity(cardOpacity) + } + .gesture( + DragGesture(minimumDistance: 20) + .onChanged(onDragChanged) + .onEnded(onDragEnded) + ) + } + + private func cardContent(for spot: ExploreMapSpot) -> some View { + VStack(alignment: .leading, spacing: 0) { + HStack(alignment: .top, spacing: 12) { + VStack(alignment: .leading, spacing: 0) { + Text(spot.badgeText) + .pretendardCustomFont(textStyle: .caption) + .foregroundStyle(.orange800) + .padding(.horizontal, 8) + .padding(.vertical, 3) + .background(.orange200) + .clipShape(Capsule()) + .padding(.bottom, 8) + + HStack(alignment: .lastTextBaseline, spacing: 4) { + Text(spot.name) + .pretendardCustomFont(textStyle: .bodyBold) + .foregroundStyle(.gray900) + .lineLimit(1) + + Text(spot.subtitle) + .pretendardCustomFont(textStyle: .caption) + .foregroundStyle(.gray500) + .lineLimit(1) + } + .padding(.bottom, 10) + + HStack(spacing: 8) { + Text(spot.statusText) + .pretendardCustomFont(textStyle: .body2Medium) + .foregroundStyle(.gray700) + + Text(spot.closingText) + .pretendardCustomFont(textStyle: .body2Regular) + .foregroundStyle(.gray500) + .lineLimit(1) + } + .padding(.bottom, 10) + + HStack(spacing: 8) { + Text(spot.distanceText) + .pretendardCustomFont(textStyle: .bodyMedium) + .foregroundStyle(.gray900) + + Text(spot.walkTimeText) + .pretendardCustomFont(textStyle: .bodyRegular) + .foregroundStyle(.gray600) + .lineLimit(1) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + + RoundedRectangle(cornerRadius: 18) + .fill(.gray200) + .frame(width: 88, height: 88) + } + .padding(.horizontal, 16) + .padding(.top, 16) + .padding(.bottom, 20) + + Button(action: onRouteTap) { + Text("경로 확인하기") + .pretendardCustomFont(textStyle: .bodyBold) + .foregroundStyle(.staticWhite) + .frame(maxWidth: .infinity) + .frame(height: 55) + .background(.navy900) + .clipShape(RoundedRectangle(cornerRadius: 25)) + } + .buttonStyle(.plain) + .padding(.horizontal, 16) + .padding(.bottom, 12) + } + .background(.staticWhite) + .clipShape(RoundedRectangle(cornerRadius: 24)) + .shadow(color: .black.opacity(0.12), radius: 14, y: 4) + .transaction { transaction in + transaction.animation = nil + } + } +} diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index 5b68b45..23945ee 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -38,6 +38,7 @@ public struct ExploreReducer: Sendable { // 지도 카메라 제어 public var shouldReturnToCurrentLocation: Bool = false public var selectedCategory: ExploreCategory = .all + public var isSpotCardVisible: Bool = false public init() {} } @@ -71,6 +72,8 @@ public struct ExploreReducer: Sendable { case openSettings case searchTextChanged(String) case categoryTapped(ExploreCategory) + case spotTapped(String) + case spotCardChanged(String?) // 길찾기 관련 액션 case searchRouteToGangnam case clearRoute @@ -136,6 +139,38 @@ public struct ExploreReducer: Sendable { } extension ExploreReducer { + private func filteredSpots(state: State) -> [ExploreMapSpot] { + let query = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) + + return state.spots.filter { spot in + let matchesCategory = state.selectedCategory == .all || spot.category == state.selectedCategory + let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) + return matchesCategory && matchesQuery + } + } + + private func syncSelectedSpot(state: inout State) { + let currentFilteredSpots = filteredSpots(state: state) + + guard !currentFilteredSpots.isEmpty else { + state.$userSession.withLock { + $0.selectedExploreSpotID = "" + } + return + } + + guard let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty else { + return + } + + guard currentFilteredSpots.contains(where: { $0.id == selectedSpotID }) else { + state.$userSession.withLock { + $0.selectedExploreSpotID = "" + } + return + } + } + private func handleViewAction( state: inout State, action: View @@ -145,6 +180,8 @@ extension ExploreReducer { if state.spots.isEmpty { state.spots = ExploreMapSpot.mockSpots } + state.isSpotCardVisible = false + syncSelectedSpot(state: &state) return .run { send in let locationManager = await LocationPermissionManager.shared let currentStatus = await locationManager.authorizationStatus @@ -177,10 +214,36 @@ extension ExploreReducer { case .searchTextChanged(let text): state.searchText = text + syncSelectedSpot(state: &state) + if state.userSession.selectedExploreSpotID.isEmpty { + state.isSpotCardVisible = false + } return .none case .categoryTapped(let category): state.selectedCategory = category + syncSelectedSpot(state: &state) + if state.userSession.selectedExploreSpotID.isEmpty { + state.isSpotCardVisible = false + } + return .none + + case .spotTapped(let spotID): + state.$userSession.withLock { + $0.selectedExploreSpotID = spotID + } + state.isSpotCardVisible = true + return .none + + case .spotCardChanged(let spotID): + if let spotID { + state.$userSession.withLock { + $0.selectedExploreSpotID = spotID + } + state.isSpotCardVisible = true + } else { + state.isSpotCardVisible = false + } return .none // 길찾기 관련 액션 @@ -410,92 +473,8 @@ extension ExploreReducer.State: Hashable { } } -public struct ExploreMapSpot: Identifiable { - public let id: String - public let name: String - public let category: ExploreCategory - public let coordinate: CLLocationCoordinate2D - - public init( - id: String, - name: String, - category: ExploreCategory, - coordinate: CLLocationCoordinate2D - ) { - self.id = id - self.name = name - self.category = category - self.coordinate = coordinate - } - - public static let mockSpots: [ExploreMapSpot] = [ - .init( - id: "cityhall-cafe-1", - name: "시청 브루잉", - category: .cafe, - coordinate: CLLocationCoordinate2D(latitude: 37.5669, longitude: 126.9789) - ), - .init( - id: "cityhall-cafe-2", - name: "덕수궁 카페", - category: .cafe, - coordinate: CLLocationCoordinate2D(latitude: 37.5658, longitude: 126.9758) - ), - .init( - id: "cityhall-food-1", - name: "시청역 한식당", - category: .restaurant, - coordinate: CLLocationCoordinate2D(latitude: 37.5652, longitude: 126.9797) - ), - .init( - id: "cityhall-food-2", - name: "정동길 다이닝", - category: .restaurant, - coordinate: CLLocationCoordinate2D(latitude: 37.5674, longitude: 126.9739) - ), - .init( - id: "cityhall-activity-1", - name: "덕수궁 산책", - category: .activity, - coordinate: CLLocationCoordinate2D(latitude: 37.5659, longitude: 126.9751) - ), - .init( - id: "cityhall-activity-2", - name: "서울광장 이벤트", - category: .activity, - coordinate: CLLocationCoordinate2D(latitude: 37.5663, longitude: 126.9779) - ), - .init( - id: "cityhall-etc-1", - name: "시청 소품샵", - category: .etc, - coordinate: CLLocationCoordinate2D(latitude: 37.5677, longitude: 126.9808) - ), - .init( - id: "cityhall-etc-2", - name: "서울 굿즈 스토어", - category: .etc, - coordinate: CLLocationCoordinate2D(latitude: 37.5648, longitude: 126.9770) - ) - ] -} - -extension ExploreMapSpot: Equatable { - public static func == (lhs: ExploreMapSpot, rhs: ExploreMapSpot) -> Bool { - lhs.id == rhs.id - && lhs.name == rhs.name - && lhs.category == rhs.category - && lhs.coordinate.latitude == rhs.coordinate.latitude - && lhs.coordinate.longitude == rhs.coordinate.longitude - } -} - -extension ExploreMapSpot: Hashable { - public func hash(into hasher: inout Hasher) { - hasher.combine(id) - hasher.combine(name) - hasher.combine(category) - hasher.combine(coordinate.latitude) - hasher.combine(coordinate.longitude) +private extension String { + var nilIfEmpty: String? { + isEmpty ? nil : self } } diff --git a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift index 9fdb9ea..503863c 100644 --- a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift +++ b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift @@ -9,6 +9,7 @@ import SwiftUI import ComposableArchitecture import CoreLocation +import UIKit import DesignSystem import Entity @@ -16,6 +17,19 @@ import Entity public struct ExploreView: View { @Bindable var store: StoreOf @Environment(\.dismiss) private var dismiss + @State private var cardDragOffset: CGFloat = 0 + @State private var cardBaseOffset: CGFloat = 0 + @State private var isCardTransitioning = false + + private var cardTravelDistance: CGFloat { + UIScreen.main.bounds.width - 8 + } + + private var cardSwipeThreshold: CGFloat { + (UIScreen.main.bounds.width - 32) / 2 + } + + private let cardHeight: CGFloat = 182 public init(store: StoreOf) { self.store = store @@ -32,7 +46,7 @@ public struct ExploreView: View { Spacer() - currentLocationButton() + bottomSection() } } .onAppear { @@ -54,7 +68,16 @@ private extension ExploreView { routeInfo: store.routeInfo, destination: store.selectedDestination, spots: filteredSpots, - returnToLocation: store.shouldReturnToCurrentLocation + selectedSpotID: store.userSession.selectedExploreSpotID.isEmpty + ? nil + : store.userSession.selectedExploreSpotID, + returnToLocation: store.shouldReturnToCurrentLocation, + onSpotTapped: { spotID in + store.send(.view(.spotTapped(spotID))) + }, + onMapTapped: { + store.send(.view(.spotCardChanged(nil))) + } ) .ignoresSafeArea(.all) } @@ -69,6 +92,19 @@ private extension ExploreView { } } + var selectedSpot: ExploreMapSpot? { + guard store.isSpotCardVisible else { return nil } + + let selectedSpotID = store.userSession.selectedExploreSpotID + + if !selectedSpotID.isEmpty, + let selectedSpot = filteredSpots.first(where: { $0.id == selectedSpotID }) { + return selectedSpot + } + + return nil + } + @ViewBuilder func headerSection() -> some View { VStack(spacing: 0) { @@ -108,7 +144,7 @@ private extension ExploreView { ZStack(alignment: .leading) { if store.searchText.isEmpty { Text("\(store.userSession.travelStationName)역") - .pretendardFont(family: .Regular, size: 18) + .pretendardCustomFont(textStyle: .titleRegular) .foregroundStyle(.gray600) } @@ -119,7 +155,7 @@ private extension ExploreView { set: { store.send(.view(.searchTextChanged($0))) } ) ) - .pretendardFont(family: .Regular, size: 18) + .pretendardCustomFont(textStyle: .titleRegular) .foregroundStyle(.staticBlack) .textInputAutocapitalization(.never) .autocorrectionDisabled() @@ -157,52 +193,134 @@ private extension ExploreView { @ViewBuilder func categoryChip(_ category: ExploreCategory) -> some View { - let isSelected = store.selectedCategory == category + ExploreCategoryChipView( + category: category, + isSelected: store.selectedCategory == category, + action: { + store.send(.view(.categoryTapped(category))) + } + ) + } - Button { - store.send(.view(.categoryTapped(category))) - } label: { - HStack(spacing: 4) { - categoryIcon(for: category, isSelected: isSelected) + @ViewBuilder + func bottomSection() -> some View { + let hasSelectedSpotCard = selectedSpot != nil - Text(category.title) - .pretendardFont(family: .Medium, size: 14) - .foregroundStyle(isSelected ? .staticBlack : .gray700) - } - .padding(.vertical, 10) - .padding(.horizontal, 16) - .background(isSelected ? .orange200 : .staticWhite) - .overlay { - Capsule() - .stroke(isSelected ? .orange800 : .gray300, lineWidth: 1) + ZStack(alignment: .bottom) { + if let selectedSpot { + ExploreSelectedSpotCardView( + currentSpot: selectedSpot, + adjacentSpot: adjacentSpot, + currentOffset: cardBaseOffset + cardDragOffset, + adjacentOffset: adjacentCardOffset, + cardOpacity: cardOpacity, + onRouteTap: {}, + onDragChanged: handleCardDragChanged, + onDragEnded: handleCardDragEnded + ) + .padding(.horizontal, 16) + .frame(height: cardHeight) } - .clipShape(Capsule()) - .shadow(color: .black.opacity(isSelected ? 0.04 : 0.08), radius: 8, y: 2) + + ExploreFloatingControlsView( + showsListButton: hasSelectedSpotCard, + controlsBottomPadding: hasSelectedSpotCard ? cardHeight + 20 : 0, + onListTap: {}, + onCurrentLocationTap: { + store.send(.view(.returnToCurrentLocation)) + } + ) } - .buttonStyle(.plain) + .padding(.bottom, 36) } - @ViewBuilder - func currentLocationButton() -> some View { - HStack { - Spacer() - - Button { - store.send(.view(.returnToCurrentLocation)) - } label: { - Image(asset: .location) - .resizable() - .scaledToFit() - .frame(width: 24, height: 24) - .frame(width: 48, height: 48) - .background(.staticWhite, in: Circle()) - .shadow(color: .black.opacity(0.12), radius: 8, y: 2) + func moveSelectedSpot(next: Bool) { + guard !filteredSpots.isEmpty else { return } + guard !isCardTransitioning else { return } + + let currentIndex = filteredSpots.firstIndex(where: { $0.id == store.userSession.selectedExploreSpotID }) ?? 0 + let newIndex: Int + let entryOffset: CGFloat = next ? -cardTravelDistance : cardTravelDistance + + if next { + newIndex = (currentIndex + 1) % filteredSpots.count + } else { + newIndex = (currentIndex - 1 + filteredSpots.count) % filteredSpots.count + } + + isCardTransitioning = true + + withAnimation(.interactiveSpring(response: 0.28, dampingFraction: 0.9)) { + cardDragOffset = next ? cardTravelDistance : -cardTravelDistance + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + _ = store.send(.view(.spotCardChanged(filteredSpots[newIndex].id))) + cardBaseOffset = entryOffset + cardDragOffset = 0 + + withAnimation(.interactiveSpring(response: 0.36, dampingFraction: 0.88)) { + cardBaseOffset = 0 + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.24) { + isCardTransitioning = false } - .padding(.trailing, 16) - .padding(.bottom, 36) } } + func handleCardDragChanged(_ value: DragGesture.Value) { + guard !isCardTransitioning else { return } + let limitedOffset = max(min(value.translation.width, cardTravelDistance), -cardTravelDistance) + cardDragOffset = limitedOffset + } + + func handleCardDragEnded(_ value: DragGesture.Value) { + guard !isCardTransitioning else { return } + + if value.translation.width > cardSwipeThreshold { + moveSelectedSpot(next: true) + return + } + + if value.translation.width < -cardSwipeThreshold { + moveSelectedSpot(next: false) + return + } + + withAnimation(.interactiveSpring(response: 0.3, dampingFraction: 0.88)) { + cardDragOffset = 0 + } + } + + var adjacentSpot: ExploreMapSpot? { + guard let currentIndex = filteredSpots.firstIndex(where: { $0.id == store.userSession.selectedExploreSpotID }) else { + return nil + } + guard abs(cardDragOffset) > 0 else { + return nil + } + + let adjacentIndex: Int + if cardDragOffset >= 0 { + adjacentIndex = (currentIndex + 1) % filteredSpots.count + } else { + adjacentIndex = (currentIndex - 1 + filteredSpots.count) % filteredSpots.count + } + return filteredSpots[adjacentIndex] + } + + var adjacentCardOffset: CGFloat? { + guard adjacentSpot != nil else { return nil } + let baseOffset = cardDragOffset >= 0 ? -cardTravelDistance : cardTravelDistance + return baseOffset + cardDragOffset + } + + var cardOpacity: Double { + let progress = min(abs(cardBaseOffset + cardDragOffset) / cardTravelDistance, 1) + return 1 - (progress * 0.02) + } + func scrollToCategory( _ category: ExploreCategory, with proxy: ScrollViewProxy, @@ -235,41 +353,4 @@ private extension ExploreView { } } - @ViewBuilder - func categoryIcon( - for category: ExploreCategory, - isSelected: Bool - ) -> some View { - switch category { - case .all: - Image(asset: isSelected ? .tapAll : .all) - .resizable() - .scaledToFit() - .frame(width: 16, height: 16) - case .cafe: - Image(asset: isSelected ? .tapCaffe : .cafe) - .resizable() - .scaledToFit() - .frame(width: 16, height: 16) - case .restaurant: - Image(asset: isSelected ? .tapFood : .food) - .resizable() - .scaledToFit() - .frame(width: 16, height: 16) - case .activity: - Image(asset: isSelected ? .tapGame : .game) - .resizable() - .scaledToFit() - .frame(width: 16, height: 16) - .foregroundStyle(isSelected ? .orange800 : .gray700) - - case .etc: - Image(asset: isSelected ? .tapEtc : .etc) - .resizable() - .scaledToFit() - .frame(width: 16, height: 16) - .foregroundStyle(isSelected ? .orange800 : .gray700) - - } - } } From 10c9ef3287a911a5581109bc968906beb54b8b8d Mon Sep 17 00:00:00 2001 From: Roy Date: Fri, 27 Mar 2026 17:20:19 +0900 Subject: [PATCH 03/35] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EC=84=A4=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=B0=8F=20API=20=EC=97=B0=EB=8F=99=20=EA=B5=AC=ED=98=84=20=20?= =?UTF-8?q?#14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../API/Sources/API/Profile/ProfileAPI.swift | 8 +++- .../API/Sources/API/Station/StationAPI.swift | 6 +-- .../Profile/DTO/ProfileNotificationDTO.swift | 41 +++++++++++++++++ .../Mapper/ProfileNotificationDTO+.swift | 39 ++++++++++++++++ .../Sources/Station/DTO/StationDTOModel.swift | 24 +++++++++- .../Station/Mapper/StationDTOModel+.swift | 5 ++- .../Auth/Repository/AuthRepositoryImpl.swift | 5 ++- .../Profile/ProfileRepositoryImpl.swift | 17 +++++++ .../Sources/SignUp/SignUpRepositoryImpl.swift | 5 ++- .../Station/StationRepositoryImpl.swift | 29 ++++++++++-- .../Sources/Profile/ProfileRequest.swift | 45 +++++++++++++++++++ .../Sources/Profile/ProfileService.swift | 18 +++++++- .../Sources/Station/StationService.swift | 6 +-- 13 files changed, 231 insertions(+), 17 deletions(-) create mode 100644 Projects/Data/Model/Sources/Profile/DTO/ProfileNotificationDTO.swift create mode 100644 Projects/Data/Model/Sources/Profile/Mapper/ProfileNotificationDTO+.swift diff --git a/Projects/Data/API/Sources/API/Profile/ProfileAPI.swift b/Projects/Data/API/Sources/API/Profile/ProfileAPI.swift index c3b05f3..ab59f8b 100644 --- a/Projects/Data/API/Sources/API/Profile/ProfileAPI.swift +++ b/Projects/Data/API/Sources/API/Profile/ProfileAPI.swift @@ -10,14 +10,20 @@ import Foundation public enum ProfileAPI: String, CaseIterable { case user case editUser + case fetchNotification + case editNotification public var description : String { switch self { case .user: return "" - case .editUser: return "" + case .fetchNotification: + return "/notification-settings" + + case .editNotification: + return "/notification-settings" } } } diff --git a/Projects/Data/API/Sources/API/Station/StationAPI.swift b/Projects/Data/API/Sources/API/Station/StationAPI.swift index b59a212..c427bf1 100644 --- a/Projects/Data/API/Sources/API/Station/StationAPI.swift +++ b/Projects/Data/API/Sources/API/Station/StationAPI.swift @@ -10,7 +10,7 @@ import Foundation public enum StationAPI { case allStation case addFavoriteStation - case deleteFavoriteStation(deleteStationId: Int) + case deleteFavoriteStation(favoriteID: Int) public var description: String { switch self { @@ -18,8 +18,8 @@ public enum StationAPI { return "" case .addFavoriteStation: return "/favorites" - case .deleteFavoriteStation(let deleteStationId): - return "/favorites/\(deleteStationId)" + case .deleteFavoriteStation(let favoriteID): + return "/favorites/\(favoriteID)" } } } diff --git a/Projects/Data/Model/Sources/Profile/DTO/ProfileNotificationDTO.swift b/Projects/Data/Model/Sources/Profile/DTO/ProfileNotificationDTO.swift new file mode 100644 index 0000000..902d1b1 --- /dev/null +++ b/Projects/Data/Model/Sources/Profile/DTO/ProfileNotificationDTO.swift @@ -0,0 +1,41 @@ +// +// ProfileNotificationDTO.swift +// Model +// +// Created by Wonji Suh on 3/27/26. +// + +import Foundation + +public typealias ProfileNotificationDTO = BaseResponseDTO + +// MARK: - DataClass +public struct ProfileNotificationResponseDTO: Decodable, Equatable { + public let settings: [ProfileNotificationSettingDTO] + public let updatedAt: String + + public init( + settings: [ProfileNotificationSettingDTO], + updatedAt: String + ) { + self.settings = settings + self.updatedAt = updatedAt + } +} + +// MARK: - Setting +public struct ProfileNotificationSettingDTO: Decodable, Equatable { + public let type: String + public let isEnabled: Bool + public let isEditable: Bool + + public init( + type: String, + isEnabled: Bool, + isEditable: Bool + ) { + self.type = type + self.isEnabled = isEnabled + self.isEditable = isEditable + } +} diff --git a/Projects/Data/Model/Sources/Profile/Mapper/ProfileNotificationDTO+.swift b/Projects/Data/Model/Sources/Profile/Mapper/ProfileNotificationDTO+.swift new file mode 100644 index 0000000..c695d3e --- /dev/null +++ b/Projects/Data/Model/Sources/Profile/Mapper/ProfileNotificationDTO+.swift @@ -0,0 +1,39 @@ +// +// ProfileNotificationDTO+.swift +// Model +// +// Created by Wonji Suh on 3/27/26. +// + +import Entity + +public extension ProfileNotificationDTO { + func toDomain() -> NotificationEntity { + data.toDomain() + } +} + +public extension ProfileNotificationResponseDTO { + func toDomain() -> NotificationEntity { + NotificationEntity( + settings: settings.compactMap { setting in + setting.toDomain() + }, + updatedAt: updatedAt + ) + } +} + +public extension ProfileNotificationSettingDTO { + func toDomain() -> NotificationSettingEntity? { + guard let option = NotificationOption(apiType: type) else { + return nil + } + + return NotificationSettingEntity( + option: option, + isEnabled: isEnabled, + isEditable: isEditable + ) + } +} diff --git a/Projects/Data/Model/Sources/Station/DTO/StationDTOModel.swift b/Projects/Data/Model/Sources/Station/DTO/StationDTOModel.swift index 355a65a..5f19cdb 100644 --- a/Projects/Data/Model/Sources/Station/DTO/StationDTOModel.swift +++ b/Projects/Data/Model/Sources/Station/DTO/StationDTOModel.swift @@ -39,24 +39,46 @@ public struct StationListResponseDTO: Decodable, Equatable { } public struct StationSummaryResponseDTO: Decodable, Equatable { + public let favoriteID: Int? public let stationID: Int public let name: String public let lines: [String] + public let lat: Double? + public let lng: Double? enum CodingKeys: String, CodingKey { + case favoriteID = "favoriteId" case stationID = "stationId" case name case lines + case lat + case lng } public init( + favoriteID: Int? = nil, stationID: Int, name: String, - lines: [String] + lines: [String], + lat: Double? = nil, + lng: Double? = nil ) { + self.favoriteID = favoriteID self.stationID = stationID self.name = name self.lines = lines + self.lat = lat + self.lng = lng + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.favoriteID = try container.decodeIfPresent(Int.self, forKey: .favoriteID) + self.stationID = try container.decode(Int.self, forKey: .stationID) + self.name = try container.decode(String.self, forKey: .name) + self.lines = try container.decode([String].self, forKey: .lines) + self.lat = try container.decodeIfPresent(Double.self, forKey: .lat) + self.lng = try container.decodeIfPresent(Double.self, forKey: .lng) } } diff --git a/Projects/Data/Model/Sources/Station/Mapper/StationDTOModel+.swift b/Projects/Data/Model/Sources/Station/Mapper/StationDTOModel+.swift index ac8adc6..0ab34d0 100644 --- a/Projects/Data/Model/Sources/Station/Mapper/StationDTOModel+.swift +++ b/Projects/Data/Model/Sources/Station/Mapper/StationDTOModel+.swift @@ -20,9 +20,12 @@ public extension StationListResponseDTO { public extension StationSummaryResponseDTO { func toDomain() -> StationSummaryEntity { StationSummaryEntity( + favoriteID: favoriteID, stationID: stationID, name: name, - lines: lines + lines: lines, + lat: lat, + lng: lng ) } } diff --git a/Projects/Data/Repository/Sources/OAuth/Auth/Repository/AuthRepositoryImpl.swift b/Projects/Data/Repository/Sources/OAuth/Auth/Repository/AuthRepositoryImpl.swift index dac6680..00ad950 100644 --- a/Projects/Data/Repository/Sources/OAuth/Auth/Repository/AuthRepositoryImpl.swift +++ b/Projects/Data/Repository/Sources/OAuth/Auth/Repository/AuthRepositoryImpl.swift @@ -10,6 +10,7 @@ import Model import Entity import Service +import Foundations import WeaveDI import Dependencies import Moya @@ -38,7 +39,9 @@ final public class AuthRepositoryImpl: AuthInterface, @unchecked Sendable { ) async throws -> LoginEntity { let reqeust = OAuthLoginRequest(provider: socialProvider.rawValue, idToken: token) let dto: LoginDTOModel = try await provider.request(.login(body: reqeust)) - return dto.data.toDomain() + let entity = dto.data.toDomain() + APIHeader.updateAccessToken(entity.token.accessToken) + return entity } diff --git a/Projects/Data/Repository/Sources/Profile/ProfileRepositoryImpl.swift b/Projects/Data/Repository/Sources/Profile/ProfileRepositoryImpl.swift index 179f0b7..8f740eb 100644 --- a/Projects/Data/Repository/Sources/Profile/ProfileRepositoryImpl.swift +++ b/Projects/Data/Repository/Sources/Profile/ProfileRepositoryImpl.swift @@ -82,6 +82,23 @@ public class ProfileRepositoryImpl: ProfileInterface, @unchecked Sendable { let dto: LoginDTOModel = try await provider.request(.editProfile(body: body)) return dto.data.toDomain() } + + public func fetchNotificationSettings() async throws -> NotificationEntity { + let dto: ProfileNotificationDTO = try await provider.request(.fetchNotification) + return dto.data.toDomain() + } + + public func editNotificationSettings( + notificationSettings: [NotificationOption] + ) async throws -> NotificationEntity { + let options: [NotificationOption] = [.fiveMinutesBefore, .tenMinutesBefore, .fifteenMinutesBefore] + let body = EditNotificationRequest( + options: options, + enabledOptions: Set(notificationSettings) + ) + let dto: ProfileNotificationDTO = try await provider.request(.editNotification(body: body)) + return dto.data.toDomain() + } } private struct ProfileErrorResponseDTO: Decodable { diff --git a/Projects/Data/Repository/Sources/SignUp/SignUpRepositoryImpl.swift b/Projects/Data/Repository/Sources/SignUp/SignUpRepositoryImpl.swift index 33a71ee..9584fa2 100644 --- a/Projects/Data/Repository/Sources/SignUp/SignUpRepositoryImpl.swift +++ b/Projects/Data/Repository/Sources/SignUp/SignUpRepositoryImpl.swift @@ -10,6 +10,7 @@ import DomainInterface import Model import Entity import Service +import Foundations @preconcurrency import AsyncMoya @@ -33,6 +34,8 @@ final public class SignUpRepositoryImpl: SignUpInterface { mapApi: input.mapType.type ) let dto: LoginDTOModel = try await provider.request(.signUp(body: body)) - return dto.data.toDomain() + let entity = dto.data.toDomain() + APIHeader.updateAccessToken(entity.token.accessToken) + return entity } } diff --git a/Projects/Data/Repository/Sources/Station/StationRepositoryImpl.swift b/Projects/Data/Repository/Sources/Station/StationRepositoryImpl.swift index 238f850..2fe8b45 100644 --- a/Projects/Data/Repository/Sources/Station/StationRepositoryImpl.swift +++ b/Projects/Data/Repository/Sources/Station/StationRepositoryImpl.swift @@ -12,6 +12,7 @@ import Entity import Service import AsyncMoya +import Foundation public final class StationRepositoryImpl: StationInterface, @unchecked Sendable { private let authorizedProvider: MoyaProvider @@ -46,16 +47,36 @@ public final class StationRepositoryImpl: StationInterface, @unchecked Sendable stationID: Int ) async throws -> FavoriteStationMutationEntity { let body: AddFavoriteStationRequest = .init(stationID: stationID) - let dto: FavoriteStationMutationDTOModel = try await authorizedProvider.request(.addFavoriteStation(body: body)) + let response = try await authorizedProvider.requestResponse(.addFavoriteStation(body: body)) + let dto = try JSONDecoder().decode(FavoriteStationMutationDTOModel.self, from: response.data) + + guard 200..<300 ~= response.statusCode else { + throw NSError( + domain: "StationFavoriteError", + code: dto.code, + userInfo: [NSLocalizedDescriptionKey: dto.message] + ) + } + return dto.toDomain() } public func deleteFavoriteStation( - stationID: Int + favoriteID: Int ) async throws -> FavoriteStationMutationEntity { - let dto: FavoriteStationMutationDTOModel = try await authorizedProvider.request( - .deleteFavoriteStation(deleteStationId: stationID) + let response = try await authorizedProvider.requestResponse( + .deleteFavoriteStation(favoriteID: favoriteID) ) + let dto = try JSONDecoder().decode(FavoriteStationMutationDTOModel.self, from: response.data) + + guard 200..<300 ~= response.statusCode else { + throw NSError( + domain: "StationFavoriteError", + code: dto.code, + userInfo: [NSLocalizedDescriptionKey: dto.message] + ) + } + return dto.toDomain() } } diff --git a/Projects/Data/Service/Sources/Profile/ProfileRequest.swift b/Projects/Data/Service/Sources/Profile/ProfileRequest.swift index 1758a4e..6216851 100644 --- a/Projects/Data/Service/Sources/Profile/ProfileRequest.swift +++ b/Projects/Data/Service/Sources/Profile/ProfileRequest.swift @@ -5,6 +5,8 @@ // Created by Wonji Suh on 3/26/26. // +import Entity + public struct ProfileRequest: Encodable { public let mapApi: String @@ -14,3 +16,46 @@ public struct ProfileRequest: Encodable { self.mapApi = mapApi } } + +public struct EditNotificationRequest: Encodable, Equatable { + public let notificationSettings: [NotificationSettingRequest] + + public init( + notificationSettings: [NotificationSettingRequest] + ) { + self.notificationSettings = notificationSettings + } + + public init( + options: [NotificationOption], + enabledOptions: Set + ) { + self.notificationSettings = options.map { + NotificationSettingRequest( + option: $0, + isEnabled: enabledOptions.contains($0) + ) + } + } +} + +public struct NotificationSettingRequest: Encodable, Equatable { + public let type: String + public let isEnabled: Bool + + public init( + type: String, + isEnabled: Bool + ) { + self.type = type + self.isEnabled = isEnabled + } + + public init( + option: NotificationOption, + isEnabled: Bool + ) { + self.type = option.apiType + self.isEnabled = isEnabled + } +} diff --git a/Projects/Data/Service/Sources/Profile/ProfileService.swift b/Projects/Data/Service/Sources/Profile/ProfileService.swift index bfde890..f1fee0b 100644 --- a/Projects/Data/Service/Sources/Profile/ProfileService.swift +++ b/Projects/Data/Service/Sources/Profile/ProfileService.swift @@ -17,6 +17,8 @@ import AsyncMoya public enum ProfileService { case fetchProfile case editProfile(body: ProfileRequest) + case fetchNotification + case editNotification(body: EditNotificationRequest) } @@ -34,6 +36,12 @@ extension ProfileService: BaseTargetType { case .editProfile: return ProfileAPI.editUser.description + + case .fetchNotification: + return ProfileAPI.fetchNotification.description + + case .editNotification: + return ProfileAPI.editNotification.description } } @@ -43,21 +51,27 @@ extension ProfileService: BaseTargetType { public var method: Moya.Method { switch self { - case .fetchProfile: + case .fetchProfile, .fetchNotification: return .get case .editProfile: return .post + + case .editNotification: + return .put } } public var parameters: [String : Any]? { switch self { - case .fetchProfile: + case .fetchProfile, .fetchNotification: return nil case .editProfile(let body): return body.toDictionary + + case .editNotification(let body): + return body.toDictionary } } diff --git a/Projects/Data/Service/Sources/Station/StationService.swift b/Projects/Data/Service/Sources/Station/StationService.swift index da094df..1608e2b 100644 --- a/Projects/Data/Service/Sources/Station/StationService.swift +++ b/Projects/Data/Service/Sources/Station/StationService.swift @@ -15,7 +15,7 @@ import AsyncMoya public enum StationService { case allStation(body: StationRequest) case addFavoriteStation(body: AddFavoriteStationRequest) - case deleteFavoriteStation(deleteStationId: Int) + case deleteFavoriteStation(favoriteID: Int) } @@ -32,8 +32,8 @@ extension StationService: BaseTargetType { return StationAPI.allStation.description case .addFavoriteStation: return StationAPI.addFavoriteStation.description - case .deleteFavoriteStation(let deleteStationId): - return StationAPI.deleteFavoriteStation(deleteStationId: deleteStationId).description + case .deleteFavoriteStation(let favoriteID): + return StationAPI.deleteFavoriteStation(favoriteID: favoriteID).description } } From 5fab765639dd00772ac6a88c8d9c24c16d03c1ca Mon Sep 17 00:00:00 2001 From: Roy Date: Fri, 27 Mar 2026 17:21:27 +0900 Subject: [PATCH 04/35] =?UTF-8?q?feat:=20=EC=95=8C=EB=A6=BC=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A6=90=EA=B2=A8=EC=B0=BE=EA=B8=B0=20=EC=97=AD=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EA=B0=9C=EC=84=A0=20#14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - NotificationEntity 및 알림 설정 API 인터페이스 추가 - 역 정보에 좌표 데이터 및 favoriteID 필드 추가 - UserSession에 여행 역 좌표 정보 추가 --- .../DefaultProfileRepositoryImpl.swift | 26 +++++++++++++ .../Sources/Profile/ProfileInterface.swift | 4 ++ .../DefaultStationRepositoryImpl.swift | 6 +-- .../Sources/Station/StationInterface.swift | 2 +- .../Entity/Sources/OAuth/UserSession.swift | 6 +++ .../Sources/Profile/NotificationEntity.swift | 39 +++++++++++++++++++ .../Sources/Profile/NotificationOption.swift | 32 +++++++++++++++ .../FavoriteStationMutationEntity.swift | 14 +++++++ .../Sources/Station/StationListEntity.swift | 11 +++++- .../Sources/Profile/ProfileUseCaseImpl.swift | 11 +++++- .../Sources/Station/StationUseCaseImpl.swift | 4 +- 11 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 Projects/Domain/Entity/Sources/Profile/NotificationEntity.swift diff --git a/Projects/Domain/DomainInterface/Sources/Profile/DefaultProfileRepositoryImpl.swift b/Projects/Domain/DomainInterface/Sources/Profile/DefaultProfileRepositoryImpl.swift index ad79a8e..5271fae 100644 --- a/Projects/Domain/DomainInterface/Sources/Profile/DefaultProfileRepositoryImpl.swift +++ b/Projects/Domain/DomainInterface/Sources/Profile/DefaultProfileRepositoryImpl.swift @@ -39,4 +39,30 @@ final public class DefaultProfileRepositoryImpl: ProfileInterface { mapURLScheme: nil ) } + + public func fetchNotificationSettings() async throws -> NotificationEntity { + NotificationEntity( + settings: [ + .init(option: .departureTime, isEnabled: true, isEditable: false), + .init(option: .fiveMinutesBefore, isEnabled: false, isEditable: true), + .init(option: .tenMinutesBefore, isEnabled: false, isEditable: true), + .init(option: .fifteenMinutesBefore, isEnabled: false, isEditable: true) + ], + updatedAt: "2024-01-15T10:30:00" + ) + } + + public func editNotificationSettings( + notificationSettings: [NotificationOption] + ) async throws -> NotificationEntity { + NotificationEntity( + settings: [ + .init(option: .departureTime, isEnabled: true, isEditable: false), + .init(option: .fiveMinutesBefore, isEnabled: notificationSettings.contains(.fiveMinutesBefore), isEditable: true), + .init(option: .tenMinutesBefore, isEnabled: notificationSettings.contains(.tenMinutesBefore), isEditable: true), + .init(option: .fifteenMinutesBefore, isEnabled: notificationSettings.contains(.fifteenMinutesBefore), isEditable: true) + ], + updatedAt: "2024-01-15T10:30:00" + ) + } } diff --git a/Projects/Domain/DomainInterface/Sources/Profile/ProfileInterface.swift b/Projects/Domain/DomainInterface/Sources/Profile/ProfileInterface.swift index 277c622..db1f2a6 100644 --- a/Projects/Domain/DomainInterface/Sources/Profile/ProfileInterface.swift +++ b/Projects/Domain/DomainInterface/Sources/Profile/ProfileInterface.swift @@ -14,6 +14,10 @@ public protocol ProfileInterface: Sendable { func editUser( mapType: ExternalMapType ) async throws -> LoginEntity + func fetchNotificationSettings() async throws -> NotificationEntity + func editNotificationSettings( + notificationSettings: [NotificationOption] + ) async throws -> NotificationEntity } diff --git a/Projects/Domain/DomainInterface/Sources/Station/DefaultStationRepositoryImpl.swift b/Projects/Domain/DomainInterface/Sources/Station/DefaultStationRepositoryImpl.swift index da52692..0442f7b 100644 --- a/Projects/Domain/DomainInterface/Sources/Station/DefaultStationRepositoryImpl.swift +++ b/Projects/Domain/DomainInterface/Sources/Station/DefaultStationRepositoryImpl.swift @@ -18,8 +18,8 @@ final public class DefaultStationRepositoryImpl: StationInterface { size: Int ) async throws -> StationListEntity { let favoriteStations: [StationSummaryEntity] = [ - .init(stationID: 1, name: "서울", lines: ["경부선"]), - .init(stationID: 4, name: "동대구", lines: ["경부선"]) + .init(favoriteID: 101, stationID: 1, name: "서울", lines: ["경부선"]), + .init(favoriteID: 102, stationID: 4, name: "동대구", lines: ["경부선"]) ] let nearbyStations: [StationSummaryEntity] = [ @@ -59,7 +59,7 @@ final public class DefaultStationRepositoryImpl: StationInterface { } public func deleteFavoriteStation( - stationID: Int + favoriteID: Int ) async throws -> FavoriteStationMutationEntity { FavoriteStationMutationEntity( code: 200, diff --git a/Projects/Domain/DomainInterface/Sources/Station/StationInterface.swift b/Projects/Domain/DomainInterface/Sources/Station/StationInterface.swift index 0fb1e57..82e5cfb 100644 --- a/Projects/Domain/DomainInterface/Sources/Station/StationInterface.swift +++ b/Projects/Domain/DomainInterface/Sources/Station/StationInterface.swift @@ -22,7 +22,7 @@ public protocol StationInterface: Sendable { ) async throws -> FavoriteStationMutationEntity func deleteFavoriteStation( - stationID: Int + favoriteID: Int ) async throws -> FavoriteStationMutationEntity } diff --git a/Projects/Domain/Entity/Sources/OAuth/UserSession.swift b/Projects/Domain/Entity/Sources/OAuth/UserSession.swift index d0eb574..c0173d2 100644 --- a/Projects/Domain/Entity/Sources/OAuth/UserSession.swift +++ b/Projects/Domain/Entity/Sources/OAuth/UserSession.swift @@ -15,6 +15,8 @@ public struct UserSession: Equatable, Hashable { public var mapType: ExternalMapType public var travelID: String public var travelStationName: String + public var travelStationLat: Double? + public var travelStationLng: Double? public var remainingMinutes: Int public var selectedExploreSpotID: String @@ -26,6 +28,8 @@ public struct UserSession: Equatable, Hashable { mapType: ExternalMapType = .appleMap, travelID: String = "", travelStationName: String = "", + travelStationLat: Double? = nil, + travelStationLng: Double? = nil, remainingMinutes: Int = 0, selectedExploreSpotID: String = "" ) { @@ -36,6 +40,8 @@ public struct UserSession: Equatable, Hashable { self.mapType = mapType self.travelID = travelID self.travelStationName = travelStationName + self.travelStationLat = travelStationLat + self.travelStationLng = travelStationLng self.remainingMinutes = remainingMinutes self.selectedExploreSpotID = selectedExploreSpotID } diff --git a/Projects/Domain/Entity/Sources/Profile/NotificationEntity.swift b/Projects/Domain/Entity/Sources/Profile/NotificationEntity.swift new file mode 100644 index 0000000..ed58f89 --- /dev/null +++ b/Projects/Domain/Entity/Sources/Profile/NotificationEntity.swift @@ -0,0 +1,39 @@ +// +// NotificationEntity.swift +// Entity +// +// Created by Wonji Suh on 3/27/26. +// + +import Foundation + +public struct NotificationEntity: Equatable, Hashable { + public let settings: [NotificationSettingEntity] + public let updatedAt: String + + public init( + settings: [NotificationSettingEntity], + updatedAt: String + ) { + self.settings = settings + self.updatedAt = updatedAt + } +} + +public struct NotificationSettingEntity: Equatable, Hashable, Identifiable { + public let option: NotificationOption + public let isEnabled: Bool + public let isEditable: Bool + + public var id: NotificationOption { option } + + public init( + option: NotificationOption, + isEnabled: Bool, + isEditable: Bool + ) { + self.option = option + self.isEnabled = isEnabled + self.isEditable = isEditable + } +} diff --git a/Projects/Domain/Entity/Sources/Profile/NotificationOption.swift b/Projects/Domain/Entity/Sources/Profile/NotificationOption.swift index 3c2bd7e..bf4ec88 100644 --- a/Projects/Domain/Entity/Sources/Profile/NotificationOption.swift +++ b/Projects/Domain/Entity/Sources/Profile/NotificationOption.swift @@ -30,4 +30,36 @@ public enum NotificationOption: String, CaseIterable, Equatable, Hashable, Ident return "출발 15분 전" } } + + public var apiType: String { + switch self { + case .none: + return "NONE" + case .departureTime: + return "DEPARTURE_TIME" + case .fiveMinutesBefore: + return "DEPARTURE_5_MIN_BEFORE" + case .tenMinutesBefore: + return "DEPARTURE_10_MIN_BEFORE" + case .fifteenMinutesBefore: + return "DEPARTURE_15_MIN_BEFORE" + } + } + + public init?(apiType: String) { + switch apiType.uppercased() { + case "DEPARTURE_TIME": + self = .departureTime + case "DEPARTURE_5_MIN_BEFORE": + self = .fiveMinutesBefore + case "DEPARTURE_10_MIN_BEFORE": + self = .tenMinutesBefore + case "DEPARTURE_15_MIN_BEFORE": + self = .fifteenMinutesBefore + case "NONE": + self = .none + default: + return nil + } + } } diff --git a/Projects/Domain/Entity/Sources/Station/FavoriteStationMutationEntity.swift b/Projects/Domain/Entity/Sources/Station/FavoriteStationMutationEntity.swift index f74d826..9589979 100644 --- a/Projects/Domain/Entity/Sources/Station/FavoriteStationMutationEntity.swift +++ b/Projects/Domain/Entity/Sources/Station/FavoriteStationMutationEntity.swift @@ -19,3 +19,17 @@ public struct FavoriteStationMutationEntity: Equatable, Hashable { self.message = message } } + +public struct StationFavoriteError: Error, Equatable, LocalizedError { + public let code: Int + public let message: String + + public init(code: Int, message: String) { + self.code = code + self.message = message + } + + public var errorDescription: String? { + message + } +} diff --git a/Projects/Domain/Entity/Sources/Station/StationListEntity.swift b/Projects/Domain/Entity/Sources/Station/StationListEntity.swift index d551a4f..686ec44 100644 --- a/Projects/Domain/Entity/Sources/Station/StationListEntity.swift +++ b/Projects/Domain/Entity/Sources/Station/StationListEntity.swift @@ -24,20 +24,29 @@ public struct StationListEntity: Equatable, Hashable { } public struct StationSummaryEntity: Equatable, Hashable, Identifiable { + public let favoriteID: Int? public let stationID: Int public let name: String public let lines: [String] + public let lat: Double? + public let lng: Double? public var id: Int { stationID } public init( + favoriteID: Int? = nil, stationID: Int, name: String, - lines: [String] + lines: [String], + lat: Double? = nil, + lng: Double? = nil ) { + self.favoriteID = favoriteID self.stationID = stationID self.name = name self.lines = lines + self.lat = lat + self.lng = lng } } diff --git a/Projects/Domain/UseCase/Sources/Profile/ProfileUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Profile/ProfileUseCaseImpl.swift index 0217d44..9ab2089 100644 --- a/Projects/Domain/UseCase/Sources/Profile/ProfileUseCaseImpl.swift +++ b/Projects/Domain/UseCase/Sources/Profile/ProfileUseCaseImpl.swift @@ -48,6 +48,16 @@ public struct ProfileUseCaseImpl: ProfileInterface { throw error } } + + public func fetchNotificationSettings() async throws -> NotificationEntity { + try await repository.fetchNotificationSettings() + } + + public func editNotificationSettings( + notificationSettings: [NotificationOption] + ) async throws -> NotificationEntity { + try await repository.editNotificationSettings(notificationSettings: notificationSettings) + } } @@ -63,4 +73,3 @@ public extension DependencyValues { set { self[ProfileUseCaseImpl.self] = newValue } } } - diff --git a/Projects/Domain/UseCase/Sources/Station/StationUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Station/StationUseCaseImpl.swift index 69661e6..1625f2a 100644 --- a/Projects/Domain/UseCase/Sources/Station/StationUseCaseImpl.swift +++ b/Projects/Domain/UseCase/Sources/Station/StationUseCaseImpl.swift @@ -36,9 +36,9 @@ public struct StationUseCaseImpl: StationInterface { } public func deleteFavoriteStation( - stationID: Int + favoriteID: Int ) async throws -> FavoriteStationMutationEntity { - try await repository.deleteFavoriteStation(stationID: stationID) + try await repository.deleteFavoriteStation(favoriteID: favoriteID) } } From 486ee144d1612d4329c6631dd5d1ce56c8b22da4 Mon Sep 17 00:00:00 2001 From: Roy Date: Fri, 27 Mar 2026 17:46:28 +0900 Subject: [PATCH 05/35] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=20=EB=AA=A8=EB=93=88=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0?= =?UTF-8?q?=20=EB=B0=8F=20=EC=95=8C=EB=A6=BC=20=EC=84=A4=EC=A0=95=20UI=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20#14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Di/KeychainTokenProvider.swift | 40 +++++++++ .../Sources/Main/Reducer/HomeFeature.swift | 4 + .../TrainStation/Model/StationRowModel.swift | 6 ++ .../Reducer/TrainStationFeature.swift | 77 ++++++++++++++--- .../Sources/Reducer/OnBoardingFeature.swift | 1 - .../Components/ProfileSkeletonView.swift | 0 .../TravelHistoryCardSkeletonView.swift | 0 .../Components/TravelHistoryCardView.swift | 0 .../NotificationSettingSkeletonView.swift | 84 ++++++++++++++++++ .../Reducer/NotificationSettingFeature.swift | 86 +++++++++++++++++-- .../View/NotificationSettingView.swift | 78 +++++++++-------- .../Components/SettingMenuRowView.swift | 0 .../Sources/Setting/View/SettingView.swift | 13 ++- .../Sources/Reducer/SplashReducer.swift | 1 - .../Sources/Image/ImageAsset.swift | 1 + 15 files changed, 333 insertions(+), 58 deletions(-) rename Projects/Presentation/Profile/Sources/{ => Main}/Components/ProfileSkeletonView.swift (100%) rename Projects/Presentation/Profile/Sources/{ => Main}/Components/TravelHistoryCardSkeletonView.swift (100%) rename Projects/Presentation/Profile/Sources/{ => Main}/Components/TravelHistoryCardView.swift (100%) create mode 100644 Projects/Presentation/Profile/Sources/NotificationSetting/Components/NotificationSettingSkeletonView.swift rename Projects/Presentation/Profile/Sources/{ => Setting}/Components/SettingMenuRowView.swift (100%) diff --git a/Projects/App/Sources/Di/KeychainTokenProvider.swift b/Projects/App/Sources/Di/KeychainTokenProvider.swift index 75ef6bf..5089d1c 100644 --- a/Projects/App/Sources/Di/KeychainTokenProvider.swift +++ b/Projects/App/Sources/Di/KeychainTokenProvider.swift @@ -6,11 +6,16 @@ // import Foundation +import Security import DomainInterface import Foundations final class KeychainTokenProvider: TokenProviding, @unchecked Sendable { + private enum Constants { + static let cachedAccessTokenKey = "cached_access_token" + } + private let keychainManager: KeychainManagingInterface init(keychainManager: KeychainManagingInterface) { @@ -23,10 +28,25 @@ final class KeychainTokenProvider: TokenProviding, @unchecked Sendable { return cached } + if let persistedToken = UserDefaults.standard.string(forKey: Constants.cachedAccessTokenKey), + !persistedToken.isEmpty { + TokenCache.shared.token = persistedToken + return persistedToken + } + + if let keychainToken = readAccessTokenFromKeychain(), !keychainToken.isEmpty { + TokenCache.shared.token = keychainToken + UserDefaults.standard.set(keychainToken, forKey: Constants.cachedAccessTokenKey) + return keychainToken + } + // 캐시가 없으면 비동기적으로 로드 Task { let token = await keychainManager.accessToken() TokenCache.shared.token = token + if let token, !token.isEmpty { + UserDefaults.standard.set(token, forKey: Constants.cachedAccessTokenKey) + } } // 현재는 캐시된 값 또는 nil 반환 @@ -36,6 +56,7 @@ final class KeychainTokenProvider: TokenProviding, @unchecked Sendable { func saveAccessToken(_ token: String) { // 캐시 업데이트 TokenCache.shared.token = token + UserDefaults.standard.set(token, forKey: Constants.cachedAccessTokenKey) // 백그라운드에서 비동기적으로 저장 Task { @@ -45,9 +66,28 @@ final class KeychainTokenProvider: TokenProviding, @unchecked Sendable { print("Failed to save access token: \(error)") // 저장 실패 시 캐시도 초기화 TokenCache.shared.token = nil + UserDefaults.standard.removeObject(forKey: Constants.cachedAccessTokenKey) } } } + + private func readAccessTokenFromKeychain() -> String? { + let service = Bundle.main.bundleIdentifier ?? "com.nomadspot.app" + let query: [CFString: Any] = [ + kSecClass: kSecClassGenericPassword, + kSecAttrService: service, + kSecAttrAccount: "ACCESS_TOKEN", + kSecReturnData: true, + kSecMatchLimit: kSecMatchLimitOne + ] + + var result: AnyObject? + let status = SecItemCopyMatching(query as CFDictionary, &result) + guard status == errSecSuccess, let data = result as? Data else { + return nil + } + return String(data: data, encoding: .utf8) + } } // Thread-safe 토큰 캐시 diff --git a/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift b/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift index 76015a7..e54fc10 100644 --- a/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift +++ b/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift @@ -202,6 +202,8 @@ extension HomeFeature { state.$userSession.withLock { $0.travelID = String(row.stationID) $0.travelStationName = row.stationName + $0.travelStationLat = row.lat + $0.travelStationLng = row.lng } return .merge( .cancel(id: TrainStationFeature.CancelID.checkAccessToken), @@ -388,6 +390,8 @@ extension HomeFeature { state.$userSession.withLock { $0.travelID = "" $0.travelStationName = "" + $0.travelStationLat = nil + $0.travelStationLng = nil $0.remainingMinutes = 0 } return .none diff --git a/Projects/Presentation/Home/Sources/TrainStation/Model/StationRowModel.swift b/Projects/Presentation/Home/Sources/TrainStation/Model/StationRowModel.swift index 5ad93aa..c36b751 100644 --- a/Projects/Presentation/Home/Sources/TrainStation/Model/StationRowModel.swift +++ b/Projects/Presentation/Home/Sources/TrainStation/Model/StationRowModel.swift @@ -15,6 +15,8 @@ public struct StationRowModel: Identifiable, Equatable, Hashable { public let stationID: Int public let stationName: String public let badges: [String] + public let lat: Double? + public let lng: Double? public let distanceText: String? public let isFavorite: Bool @@ -25,6 +27,8 @@ public struct StationRowModel: Identifiable, Equatable, Hashable { stationID: Int, stationName: String, badges: [String], + lat: Double? = nil, + lng: Double? = nil, distanceText: String?, isFavorite: Bool ) { @@ -34,6 +38,8 @@ public struct StationRowModel: Identifiable, Equatable, Hashable { self.stationID = stationID self.stationName = stationName self.badges = badges + self.lat = lat + self.lng = lng self.distanceText = distanceText self.isFavorite = isFavorite } diff --git a/Projects/Presentation/Home/Sources/TrainStation/Reducer/TrainStationFeature.swift b/Projects/Presentation/Home/Sources/TrainStation/Reducer/TrainStationFeature.swift index 7d2c49d..635b8d4 100644 --- a/Projects/Presentation/Home/Sources/TrainStation/Reducer/TrainStationFeature.swift +++ b/Projects/Presentation/Home/Sources/TrainStation/Reducer/TrainStationFeature.swift @@ -74,7 +74,7 @@ public struct TrainStationFeature { case checkAccessToken case fetchStations case addFavoriteStation(Int) - case deleteFavoriteStation(Int) + case deleteFavoriteStation(favoriteID: Int, stationID: Int) } //MARK: - 앱내에서 사용하는 액션 @@ -84,7 +84,7 @@ public struct TrainStationFeature { case fetchStationsFailed(String) case addFavoriteStationResponse case addFavoriteStationFailed(String) - case deleteFavoriteStationResponse + case deleteFavoriteStationResponse(Int) case deleteFavoriteStationFailed(String) } @@ -138,7 +138,8 @@ extension TrainStationFeature { case .favoriteButtonTapped(let row): guard state.shouldShowFavoriteSection else { return .none } if row.isFavorite { - return .send(.async(.deleteFavoriteStation(row.stationID))) + guard let favoriteID = row.favoriteID else { return .none } + return .send(.async(.deleteFavoriteStation(favoriteID: favoriteID, stationID: row.stationID))) } else { return .send(.async(.addFavoriteStation(row.stationID))) } @@ -183,16 +184,26 @@ extension TrainStationFeature { _ = try await stationUseCase.addFavoriteStation(stationID: stationID) await send(.inner(.addFavoriteStationResponse)) } catch { + let nsError = error as NSError + if nsError.domain == "StationFavoriteError", nsError.code == 409 { + await send(.inner(.addFavoriteStationResponse)) + return + } await send(.inner(.addFavoriteStationFailed(error.localizedDescription))) } } .cancellable(id: CancelID.favoriteMutation, cancelInFlight: true) - case .deleteFavoriteStation(let stationID): + case .deleteFavoriteStation(let favoriteID, let stationID): return .run { [stationUseCase] send in do { - _ = try await stationUseCase.deleteFavoriteStation(stationID: stationID) - await send(.inner(.deleteFavoriteStationResponse)) + _ = try await stationUseCase.deleteFavoriteStation(favoriteID: favoriteID) + await send(.inner(.deleteFavoriteStationResponse(stationID))) } catch { + let nsError = error as NSError + if nsError.domain == "StationFavoriteError", nsError.code == 404 { + await send(.inner(.deleteFavoriteStationResponse(stationID))) + return + } await send(.inner(.deleteFavoriteStationFailed(error.localizedDescription))) } } @@ -234,8 +245,39 @@ extension TrainStationFeature { case .addFavoriteStationFailed(let message): state.errorMessage = message return .none - case .deleteFavoriteStationResponse: - return .send(.async(.fetchStations)) + case .deleteFavoriteStationResponse(let stationID): + state.favoriteRows.removeAll { $0.stationID == stationID } + state.nearbyRows = state.nearbyRows.map { row in + guard row.stationID == stationID else { return row } + return StationRowModel( + id: row.id, + favoriteID: nil, + station: row.station, + stationID: row.stationID, + stationName: row.stationName, + badges: row.badges, + lat: row.lat, + lng: row.lng, + distanceText: row.distanceText, + isFavorite: false + ) + } + state.majorRows = state.majorRows.map { row in + guard row.stationID == stationID else { return row } + return StationRowModel( + id: row.id, + favoriteID: nil, + station: row.station, + stationID: row.stationID, + stationName: row.stationName, + badges: row.badges, + lat: row.lat, + lng: row.lng, + distanceText: row.distanceText, + isFavorite: false + ) + } + return .none case .deleteFavoriteStationFailed(let message): state.errorMessage = message return .none @@ -260,11 +302,13 @@ private extension TrainStationFeature { let normalizedName = normalizedStationName(station.name) return StationRowModel( id: "favorite-\(station.stationID)", - favoriteID: station.stationID, + favoriteID: station.favoriteID ?? station.stationID, station: Station(displayName: normalizedName), stationID: station.stationID, stationName: normalizedName, badges: station.lines, + lat: station.lat, + lng: station.lng, distanceText: nil, isFavorite: true ) @@ -281,6 +325,8 @@ private extension TrainStationFeature { stationID: station.stationID, stationName: normalizedName, badges: station.lines, + lat: station.lat, + lng: station.lng, distanceText: "2.3km", isFavorite: false ) @@ -299,6 +345,8 @@ private extension TrainStationFeature { stationID: station.stationID, stationName: normalizedName, badges: station.lines, + lat: station.lat, + lng: station.lng, distanceText: nil, isFavorite: false ) @@ -306,9 +354,10 @@ private extension TrainStationFeature { } func applyFavoriteState(state: inout State) { - let favoriteNameMap = Dictionary( - uniqueKeysWithValues: state.favoriteRows.map { - (normalizedStationName($0.stationName), $0.stationID) + let favoriteNameMap: [String: Int] = Dictionary( + uniqueKeysWithValues: state.favoriteRows.compactMap { row -> (String, Int)? in + let identifier = row.favoriteID ?? row.stationID + return (normalizedStationName(row.stationName), identifier) } ) @@ -321,6 +370,8 @@ private extension TrainStationFeature { stationID: row.stationID, stationName: row.stationName, badges: row.badges, + lat: row.lat, + lng: row.lng, distanceText: row.distanceText, isFavorite: favoriteID != nil ) @@ -335,6 +386,8 @@ private extension TrainStationFeature { stationID: row.stationID, stationName: row.stationName, badges: row.badges, + lat: row.lat, + lng: row.lng, distanceText: row.distanceText, isFavorite: favoriteID != nil ) diff --git a/Projects/Presentation/OnBoarding/Sources/Reducer/OnBoardingFeature.swift b/Projects/Presentation/OnBoarding/Sources/Reducer/OnBoardingFeature.swift index 390d48e..2ddad38 100644 --- a/Projects/Presentation/OnBoarding/Sources/Reducer/OnBoardingFeature.swift +++ b/Projects/Presentation/OnBoarding/Sources/Reducer/OnBoardingFeature.swift @@ -217,4 +217,3 @@ extension OnBoardingFeature.State { hasher.combine(selectedMap) } } - diff --git a/Projects/Presentation/Profile/Sources/Components/ProfileSkeletonView.swift b/Projects/Presentation/Profile/Sources/Main/Components/ProfileSkeletonView.swift similarity index 100% rename from Projects/Presentation/Profile/Sources/Components/ProfileSkeletonView.swift rename to Projects/Presentation/Profile/Sources/Main/Components/ProfileSkeletonView.swift diff --git a/Projects/Presentation/Profile/Sources/Components/TravelHistoryCardSkeletonView.swift b/Projects/Presentation/Profile/Sources/Main/Components/TravelHistoryCardSkeletonView.swift similarity index 100% rename from Projects/Presentation/Profile/Sources/Components/TravelHistoryCardSkeletonView.swift rename to Projects/Presentation/Profile/Sources/Main/Components/TravelHistoryCardSkeletonView.swift diff --git a/Projects/Presentation/Profile/Sources/Components/TravelHistoryCardView.swift b/Projects/Presentation/Profile/Sources/Main/Components/TravelHistoryCardView.swift similarity index 100% rename from Projects/Presentation/Profile/Sources/Components/TravelHistoryCardView.swift rename to Projects/Presentation/Profile/Sources/Main/Components/TravelHistoryCardView.swift diff --git a/Projects/Presentation/Profile/Sources/NotificationSetting/Components/NotificationSettingSkeletonView.swift b/Projects/Presentation/Profile/Sources/NotificationSetting/Components/NotificationSettingSkeletonView.swift new file mode 100644 index 0000000..9b52582 --- /dev/null +++ b/Projects/Presentation/Profile/Sources/NotificationSetting/Components/NotificationSettingSkeletonView.swift @@ -0,0 +1,84 @@ +// +// NotificationSettingSkeletonView.swift +// Profile +// + +import SwiftUI + +import DesignSystem +import Entity + +public struct NotificationSettingSkeletonView: View { + public init() {} + + public var body: some View { + LazyVStack(spacing: 0) { + ForEach(0.. some View { + modifier(NotificationSettingSkeletonShimmerModifier()) + } +} + +private struct NotificationSettingSkeletonShimmerModifier: ViewModifier { + @State private var isAnimating = false + + func body(content: Content) -> some View { + content + .overlay { + LinearGradient( + colors: [ + .white.opacity(0), + .white.opacity(0.45), + .white.opacity(0) + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + .rotationEffect(.degrees(20)) + .offset(x: isAnimating ? 180 : -180) + .mask(content) + } + .onAppear { + withAnimation(.easeInOut(duration: 1.1).repeatForever(autoreverses: false)) { + isAnimating = true + } + } + } +} diff --git a/Projects/Presentation/Profile/Sources/NotificationSetting/Reducer/NotificationSettingFeature.swift b/Projects/Presentation/Profile/Sources/NotificationSetting/Reducer/NotificationSettingFeature.swift index 157acba..7ecad31 100644 --- a/Projects/Presentation/Profile/Sources/NotificationSetting/Reducer/NotificationSettingFeature.swift +++ b/Projects/Presentation/Profile/Sources/NotificationSetting/Reducer/NotificationSettingFeature.swift @@ -11,6 +11,7 @@ import ComposableArchitecture import Utill import Entity +import UseCase @Reducer public struct NotificationSettingFeature { @@ -19,7 +20,8 @@ public struct NotificationSettingFeature { @ObservableState public struct State: Equatable { - var selectedOptions: [NotificationOption] = [.fiveMinutesBefore, .tenMinutesBefore] + var selectedOptions: [NotificationOption] = [] + var isLoading: Bool = false public init() {} } @@ -36,6 +38,7 @@ public struct NotificationSettingFeature { //MARK: - ViewAction @CasePathable public enum View { + case onAppear case notificationOptionTapped(NotificationOption) } @@ -43,11 +46,14 @@ public struct NotificationSettingFeature { //MARK: - AsyncAction 비동기 처리 액션 public enum AsyncAction: Equatable { - + case fetchNotificationSettings + case editNotificationSettings([NotificationOption]) } //MARK: - 앱내에서 사용하는 액션 public enum InnerAction: Equatable { + case fetchNotificationSettingsResponse(Result) + case editNotificationSettingsResponse(Result) } //MARK: - DelegateAction @@ -56,6 +62,12 @@ public struct NotificationSettingFeature { } + nonisolated enum CancelID: Hashable { + case fetchCancel + case editCancel + } + + @Dependency(\.profileUseCase) var profileUseCase public var body: some Reducer { BindingReducer() @@ -86,9 +98,17 @@ extension NotificationSettingFeature { action: View ) -> Effect { switch action { + case .onAppear: + state.isLoading = true + return .send(.async(.fetchNotificationSettings)) + case .notificationOptionTapped(let option): if option == .none { state.selectedOptions = [.none] + return .send(.async(.editNotificationSettings([]))) + } + + guard option != .departureTime else { return .none } @@ -96,15 +116,18 @@ extension NotificationSettingFeature { if state.selectedOptions.contains(option) { state.selectedOptions.removeAll { $0 == option } - return .none + if selectedEditableOptions(state: state).isEmpty { + state.selectedOptions = [.none] + } + return .send(.async(.editNotificationSettings(selectedEditableOptions(state: state)))) } - guard state.selectedOptions.count < 2 else { + guard selectedEditableOptions(state: state).count < 3 else { return .none } state.selectedOptions.append(option) - return .none + return .send(.async(.editNotificationSettings(selectedEditableOptions(state: state)))) } } @@ -113,7 +136,27 @@ extension NotificationSettingFeature { action: AsyncAction ) -> Effect { switch action { - + case .fetchNotificationSettings: + return .run { send in + let result = await Result { + try await profileUseCase.fetchNotificationSettings() + } + .mapError(ProfileError.from) + await send(.inner(.fetchNotificationSettingsResponse(result))) + } + .cancellable(id: CancelID.fetchCancel) + + case .editNotificationSettings(let notificationSettings): + return .run { send in + let result = await Result { + try await profileUseCase.editNotificationSettings( + notificationSettings: notificationSettings + ) + } + .mapError(ProfileError.from) + await send(.inner(.editNotificationSettingsResponse(result))) + } + .cancellable(id: CancelID.editCancel, cancelInFlight: true) } } @@ -132,14 +175,45 @@ extension NotificationSettingFeature { action: InnerAction ) -> Effect { switch action { + case .fetchNotificationSettingsResponse(let result), + .editNotificationSettingsResponse(let result): + state.isLoading = false + switch result { + case .success(let entity): + state.selectedOptions = makeSelectedOptions(entity: entity) + return .none + case .failure: + return .none + } + } + } +} +private extension NotificationSettingFeature { + func selectedEditableOptions(state: State) -> [NotificationOption] { + state.selectedOptions.filter { + $0 != .none && $0 != .departureTime } } + + func makeSelectedOptions(entity: NotificationEntity) -> [NotificationOption] { + let options: [NotificationOption] = entity.settings + .filter(\.isEnabled) + .map(\.option) + .filter { $0 != .departureTime } + + if options.isEmpty { + return [.none] + } + + return options + } } extension NotificationSettingFeature.State: Hashable { public func hash(into hasher: inout Hasher) { hasher.combine(selectedOptions) + hasher.combine(isLoading) } } diff --git a/Projects/Presentation/Profile/Sources/NotificationSetting/View/NotificationSettingView.swift b/Projects/Presentation/Profile/Sources/NotificationSetting/View/NotificationSettingView.swift index 4dccf39..253fa1a 100644 --- a/Projects/Presentation/Profile/Sources/NotificationSetting/View/NotificationSettingView.swift +++ b/Projects/Presentation/Profile/Sources/NotificationSetting/View/NotificationSettingView.swift @@ -44,6 +44,9 @@ public struct NotificationSettingView: View { } .padding(.horizontal, 16) } + .onAppear { + store.send(.view(.onAppear)) + } } } @@ -55,47 +58,52 @@ extension NotificationSettingView { Spacer() .frame(height: 48) - VStack(spacing: 0) { - ForEach(NotificationOption.allCases) { option in - Button { - store.send(.view(.notificationOptionTapped(option))) - } label: { - HStack(spacing: 12) { - Text(option.title) - .pretendardCustomFont(textStyle: .bodyMedium) - .foregroundStyle(.gray900) - - Spacer() - - if store.selectedOptions.contains(option) { - Image(systemName: "checkmark") - .font(.system(size: 18, weight: .medium)) - .foregroundStyle(.gray550) + if store.isLoading { + NotificationSettingSkeletonView() + } else { + LazyVStack(spacing: 0) { + ForEach(NotificationOption.allCases) { option in + Button { + store.send(.view(.notificationOptionTapped(option))) + } label: { + HStack(spacing: 12) { + Text(option.title) + .pretendardCustomFont(textStyle: .bodyMedium) + .foregroundStyle(.gray900) + + Spacer() + + if store.selectedOptions.contains(option) { + Image(asset: .rowCheck) + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + } } + .frame(height: 58) + .padding(.horizontal, 20) + .contentShape(Rectangle()) } - .frame(height: 58) - .padding(.horizontal, 20) - .contentShape(Rectangle()) - } - .buttonStyle(.plain) + .buttonStyle(.plain) - if option != .fifteenMinutesBefore { - Rectangle() - .fill(.enableColor) - .frame(height: 1) - .padding(.horizontal, 14) + if option != .fifteenMinutesBefore { + Rectangle() + .fill(.enableColor) + .frame(height: 1) + .padding(.horizontal, 14) + } } } + .background( + RoundedRectangle(cornerRadius: 24) + .fill(.gray200) + ) + .overlay { + RoundedRectangle(cornerRadius: 24) + .stroke(.enableColor, lineWidth: 1) + } + .clipShape(RoundedRectangle(cornerRadius: 24)) } - .background( - RoundedRectangle(cornerRadius: 24) - .fill(.gray200) - ) - .overlay { - RoundedRectangle(cornerRadius: 24) - .stroke(.enableColor, lineWidth: 1) - } - .clipShape(RoundedRectangle(cornerRadius: 24)) } } } diff --git a/Projects/Presentation/Profile/Sources/Components/SettingMenuRowView.swift b/Projects/Presentation/Profile/Sources/Setting/Components/SettingMenuRowView.swift similarity index 100% rename from Projects/Presentation/Profile/Sources/Components/SettingMenuRowView.swift rename to Projects/Presentation/Profile/Sources/Setting/Components/SettingMenuRowView.swift diff --git a/Projects/Presentation/Profile/Sources/Setting/View/SettingView.swift b/Projects/Presentation/Profile/Sources/Setting/View/SettingView.swift index c6e4a94..b720e7e 100644 --- a/Projects/Presentation/Profile/Sources/Setting/View/SettingView.swift +++ b/Projects/Presentation/Profile/Sources/Setting/View/SettingView.swift @@ -82,9 +82,16 @@ extension SettingView { store.send(.view(.mapTypeSelected(mapType))) } label: { if store.userSession.mapType == mapType { - Label(mapType.description, systemImage: "checkmark") - .pretendardCustomFont(textStyle: .bodyMedium) - .foregroundStyle(.gray800) + HStack(spacing: 8) { + Image(asset: .rowCheck) + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + + Text(mapType.description) + .pretendardCustomFont(textStyle: .bodyMedium) + .foregroundStyle(.gray800) + } } else { Text(mapType.description) .pretendardCustomFont(textStyle: .bodyMedium) diff --git a/Projects/Presentation/Splash/Sources/Reducer/SplashReducer.swift b/Projects/Presentation/Splash/Sources/Reducer/SplashReducer.swift index 39a4ab8..de0ba68 100644 --- a/Projects/Presentation/Splash/Sources/Reducer/SplashReducer.swift +++ b/Projects/Presentation/Splash/Sources/Reducer/SplashReducer.swift @@ -149,4 +149,3 @@ extension SplashReducer { } } } - diff --git a/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift b/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift index 915af7e..cebac5a 100644 --- a/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift +++ b/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift @@ -32,6 +32,7 @@ public enum ImageAsset: String { case tapEtc case tapFood case location + case rowCheck From c30b4f7181f31fe6b72d54e27bb4a8c37ab57995 Mon Sep 17 00:00:00 2001 From: Roy Date: Fri, 27 Mar 2026 20:41:40 +0900 Subject: [PATCH 06/35] =?UTF-8?q?feat:=20Place=20API=20=EB=B0=8F=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=A0=88=EC=9D=B4=EC=96=B4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Place 관련 API, 모델, 리포지토리, 서비스 구현 - PlaceAPI, PlaceDTOModel 및 매퍼 추가 - PlaceRepository 및 PlaceService 구현 - Station API 및 서비스 수정 --- .../Data/API/Sources/API/Place/PlaceAPI.swift | 19 +++++++ .../API/Sources/API/Station/StationAPI.swift | 12 ++-- .../Sources/Place/DTO/PlaceDTOModel.swift | 24 ++++++++ .../Sources/Place/Mapper/PlaceDTOModel+.swift | 40 ++++++++++++++ .../Sources/Place/PlaceRepositoryImpl.swift | 42 ++++++++++++++ .../Service/Sources/Place/PlaceRequest.swift | 34 ++++++++++++ .../Service/Sources/Place/PlaceService.swift | 55 +++++++++++++++++++ .../Sources/Station/StationService.swift | 8 +-- 8 files changed, 224 insertions(+), 10 deletions(-) create mode 100644 Projects/Data/API/Sources/API/Place/PlaceAPI.swift create mode 100644 Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift create mode 100644 Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift create mode 100644 Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift create mode 100644 Projects/Data/Service/Sources/Place/PlaceRequest.swift create mode 100644 Projects/Data/Service/Sources/Place/PlaceService.swift diff --git a/Projects/Data/API/Sources/API/Place/PlaceAPI.swift b/Projects/Data/API/Sources/API/Place/PlaceAPI.swift new file mode 100644 index 0000000..06b5c25 --- /dev/null +++ b/Projects/Data/API/Sources/API/Place/PlaceAPI.swift @@ -0,0 +1,19 @@ +// +// PlaceAPI.swift +// API +// +// Created by Wonji Suh on 3/27/26. +// + +import Foundation + +public enum PlaceAPI: String, CaseIterable { + case fetchPlace + + public var description: String { + switch self { + case .fetchPlace: + return "" + } + } +} diff --git a/Projects/Data/API/Sources/API/Station/StationAPI.swift b/Projects/Data/API/Sources/API/Station/StationAPI.swift index c427bf1..1b4c2a1 100644 --- a/Projects/Data/API/Sources/API/Station/StationAPI.swift +++ b/Projects/Data/API/Sources/API/Station/StationAPI.swift @@ -9,17 +9,17 @@ import Foundation public enum StationAPI { case allStation - case addFavoriteStation - case deleteFavoriteStation(favoriteID: Int) + case addFavoriteStation(stationID: Int) + case deleteFavoriteStation(stationID: Int) public var description: String { switch self { case .allStation: return "" - case .addFavoriteStation: - return "/favorites" - case .deleteFavoriteStation(let favoriteID): - return "/favorites/\(favoriteID)" + case .addFavoriteStation(let stationID): + return "/favorites/\(stationID)" + case .deleteFavoriteStation(let stationID): + return "/favorites/\(stationID)" } } } diff --git a/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift b/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift new file mode 100644 index 0000000..5bc6e3c --- /dev/null +++ b/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift @@ -0,0 +1,24 @@ +// +// PlaceDTOModel.swift +// Model +// +// Created by Wonji Suh on 3/27/26. +// + +import Foundation + + +public typealias PlaceDTOModel = BaseResponseDTO<[PlaceResponseDTOModel]> + +// MARK: - Datum +public struct PlaceResponseDTOModel: Decodable, Equatable { + let googlePlaceID, category: String + let lat, lon: Double + let stayableMinutes: Int + let name, address: String + + enum CodingKeys: String, CodingKey { + case googlePlaceID = "googlePlaceId" + case category, lat, lon, stayableMinutes, name, address + } +} diff --git a/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift b/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift new file mode 100644 index 0000000..c655ac2 --- /dev/null +++ b/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift @@ -0,0 +1,40 @@ +// +// PlaceDTOModel+.swift +// Model +// +// Created by Wonji Suh on 3/27/26. +// + + +import Foundation + +import Entity + +public extension PlaceResponseDTOModel { + func toDomain() -> PlaceEntity { + PlaceEntity( + stationId: googlePlaceID, + name: name, + address: address, + category: mapCategory(category), + lat: lon, + lon: lat, + stayableMinutes: stayableMinutes + ) + } + + private func mapCategory(_ value: String) -> ExploreCategory { + switch value.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() { + case "카페", "cafe": + return .cafe + case "음식점", "restaurant": + return .restaurant + case "액티비티", "activity": + return .activity + case "쇼핑", "shopping", "etc", "기타": + return .etc + default: + return .etc + } + } +} diff --git a/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift b/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift new file mode 100644 index 0000000..546f307 --- /dev/null +++ b/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift @@ -0,0 +1,42 @@ +// +// PlaceRepositoryImpl.swift +// Repository +// +// Created by Wonji Suh on 3/27/26. +// + +import DomainInterface +import Model +import Entity + +import Service +import Dependencies +import LogMacro + +import AsyncMoya + +public final class PlaceRepositoryImpl: PlaceInterface, @unchecked Sendable { + private let provider: MoyaProvider + + public init( + provider: MoyaProvider = MoyaProvider.authorized, + ) { + self.provider = provider + } + + // MARK: - 장소 관련 api + public func fetchPlaces( + _ input: PlaceInput + ) async throws -> [PlaceEntity] { + let body: PlaceRequest = .init( + userLat: input.userLat, + userLon: input.userLon, + mapLat: input.mapLat, + mapLon: input.mapLon, + stationId: input.stationId, + remainingMinutes: input.remainingMinutes + ) + let dto: PlaceDTOModel = try await provider.request(.fetchPlaces(body: body)) + return dto.data.map { $0.toDomain() } + } +} diff --git a/Projects/Data/Service/Sources/Place/PlaceRequest.swift b/Projects/Data/Service/Sources/Place/PlaceRequest.swift new file mode 100644 index 0000000..27439a4 --- /dev/null +++ b/Projects/Data/Service/Sources/Place/PlaceRequest.swift @@ -0,0 +1,34 @@ +// +// PlaceRequest.swift +// Service +// +// Created by Wonji Suh on 3/27/26. +// + + +import Foundation + +public struct PlaceRequest: Encodable { + public let userLat: Double + public let userLon: Double + public let mapLat: Double + public let mapLon: Double + public let stationId: Int + public let remainingMinutes: Int + + public init( + userLat: Double, + userLon: Double, + mapLat: Double, + mapLon: Double, + stationId: Int, + remainingMinutes: Int + ) { + self.userLat = userLat + self.userLon = userLon + self.mapLat = mapLat + self.mapLon = mapLon + self.stationId = stationId + self.remainingMinutes = remainingMinutes + } +} diff --git a/Projects/Data/Service/Sources/Place/PlaceService.swift b/Projects/Data/Service/Sources/Place/PlaceService.swift new file mode 100644 index 0000000..b838bfc --- /dev/null +++ b/Projects/Data/Service/Sources/Place/PlaceService.swift @@ -0,0 +1,55 @@ +// +// PlaceService.swift +// Service +// +// Created by Wonji Suh on 3/27/26. +// + +import Foundation + +import API +import Foundations + +import AsyncMoya + +public enum PlaceService { + case fetchPlaces(body: PlaceRequest) +} + + +extension PlaceService: BaseTargetType { + public typealias Domain = TimeSpotDomain + + public var domain: TimeSpotDomain { + return .place + } + + public var urlPath: String { + switch self { + case .fetchPlaces: + return PlaceAPI.fetchPlace.description + } + } + + public var error: [Int : NetworkError]? { + return nil + } + + public var method: Moya.Method { + switch self { + case .fetchPlaces: + return .get + } + } + + public var parameters: [String : Any]? { + switch self { + case .fetchPlaces(let body): + return body.toDictionary + } + } + + public var headers: [String : String]? { + return APIHeader.baseHeader + } +} diff --git a/Projects/Data/Service/Sources/Station/StationService.swift b/Projects/Data/Service/Sources/Station/StationService.swift index 1608e2b..37e7889 100644 --- a/Projects/Data/Service/Sources/Station/StationService.swift +++ b/Projects/Data/Service/Sources/Station/StationService.swift @@ -30,10 +30,10 @@ extension StationService: BaseTargetType { switch self { case .allStation: return StationAPI.allStation.description - case .addFavoriteStation: - return StationAPI.addFavoriteStation.description - case .deleteFavoriteStation(let favoriteID): - return StationAPI.deleteFavoriteStation(favoriteID: favoriteID).description + case .addFavoriteStation(let body): + return StationAPI.addFavoriteStation(stationID: body.stationID).description + case .deleteFavoriteStation(let stationID): + return StationAPI.deleteFavoriteStation(stationID: stationID).description } } From 44407f5206a79f9e74ccb3cc91fd0947bdfd59a5 Mon Sep 17 00:00:00 2001 From: Roy Date: Fri, 27 Mar 2026 20:42:32 +0900 Subject: [PATCH 07/35] =?UTF-8?q?feat:=20Place=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EB=A1=9C=EA=B3=A0?= =?UTF-8?q?=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Place 엔티티, 리포지토리, 유스케이스 추가 - DI 등록 및 탐색 기능 연동 - 앱 로고 리소스 교체 및 디자인 시스템 정리 --- .../Place/DefaultPlaceRepositoryImpl.swift | 21 ++++ .../Sources/Place/PlaceInterface.swift | 37 +++++++ .../Sources/Explore/ExploreMapSpot.swift | 99 ------------------- .../Entity/Sources/Place/PlaceEntity.swift | 35 +++++++ .../Entity/Sources/Place/PlaceInput.swift | 33 +++++++ .../Sources/Place/PlaceUseCaseImpl.swift | 55 +++++++++++ 6 files changed, 181 insertions(+), 99 deletions(-) create mode 100644 Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift create mode 100644 Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift create mode 100644 Projects/Domain/Entity/Sources/Place/PlaceEntity.swift create mode 100644 Projects/Domain/Entity/Sources/Place/PlaceInput.swift create mode 100644 Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift diff --git a/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift b/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift new file mode 100644 index 0000000..c653738 --- /dev/null +++ b/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift @@ -0,0 +1,21 @@ +// +// DefaultPlaceRepositoryImpl.swift +// DomainInterface +// +// Created by Wonji Suh on 3/27/26. +// + +import Foundation +import Entity + +public final class DefaultPlaceRepositoryImpl: PlaceInterface { + public init() {} + + public func fetchPlaces(_ input: PlaceInput) async throws -> [PlaceEntity] { + throw NSError( + domain: "PlaceRepository", + code: -1, + userInfo: [NSLocalizedDescriptionKey: "PlaceRepository is not configured."] + ) + } +} diff --git a/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift b/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift new file mode 100644 index 0000000..71993dd --- /dev/null +++ b/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift @@ -0,0 +1,37 @@ +// +// PlaceInterface.swift +// DomainInterface +// +// Created by Wonji Suh on 3/27/26. +// + +import Entity + +import WeaveDI +import ComposableArchitecture + +public protocol PlaceInterface: Sendable { + func fetchPlaces(_ input: PlaceInput) async throws -> [PlaceEntity] +} + + +/// Profile Repository의 DependencyKey 구조체 +public struct PlaceRepositoryDependency: DependencyKey { + public static var liveValue: PlaceInterface { + UnifiedDI.resolve(PlaceInterface.self) ?? DefaultPlaceRepositoryImpl() + } + + public static var testValue: PlaceInterface { + UnifiedDI.resolve(PlaceInterface.self) ?? DefaultPlaceRepositoryImpl() + } + + public static var previewValue: PlaceInterface = liveValue +} + +/// DependencyValues extension으로 간편한 접근 제공 +public extension DependencyValues { + var placeRepository: PlaceInterface { + get { self[PlaceRepositoryDependency.self] } + set { self[PlaceRepositoryDependency.self] = newValue } + } +} diff --git a/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift b/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift index 3f6ae6c..54410a8 100644 --- a/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift +++ b/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift @@ -43,105 +43,6 @@ public struct ExploreMapSpot: Identifiable { self.distanceText = distanceText self.walkTimeText = walkTimeText } - - public static let mockSpots: [ExploreMapSpot] = [ - .init( - id: "cityhall-cafe-1", - name: "시청 브루잉", - category: .cafe, - coordinate: CLLocationCoordinate2D(latitude: 37.5669, longitude: 126.9789), - badgeText: "24분 체류 가능", - subtitle: "카페", - statusText: "영업 중", - closingText: "21:00에 영업종료", - distanceText: "180m", - walkTimeText: "시청역에서 약 3분" - ), - .init( - id: "cityhall-cafe-2", - name: "덕수궁 카페", - category: .cafe, - coordinate: CLLocationCoordinate2D(latitude: 37.5658, longitude: 126.9758), - badgeText: "19분 체류 가능", - subtitle: "카페", - statusText: "영업 중", - closingText: "20:30에 영업종료", - distanceText: "230m", - walkTimeText: "시청역에서 약 4분" - ), - .init( - id: "cityhall-food-1", - name: "시청역 한식당", - category: .restaurant, - coordinate: CLLocationCoordinate2D(latitude: 37.5652, longitude: 126.9797), - badgeText: "32분 체류 가능", - subtitle: "음식점", - statusText: "영업 중", - closingText: "22:00에 영업종료", - distanceText: "140m", - walkTimeText: "시청역에서 약 2분" - ), - .init( - id: "cityhall-food-2", - name: "정동길 다이닝", - category: .restaurant, - coordinate: CLLocationCoordinate2D(latitude: 37.5674, longitude: 126.9739), - badgeText: "28분 체류 가능", - subtitle: "음식점", - statusText: "영업 중", - closingText: "21:30에 영업종료", - distanceText: "310m", - walkTimeText: "시청역에서 약 5분" - ), - .init( - id: "cityhall-activity-1", - name: "덕수궁 산책", - category: .activity, - coordinate: CLLocationCoordinate2D(latitude: 37.5659, longitude: 126.9751), - badgeText: "41분 체류 가능", - subtitle: "액티비티", - statusText: "운영 중", - closingText: "19:00에 입장마감", - distanceText: "260m", - walkTimeText: "시청역에서 약 4분" - ), - .init( - id: "cityhall-activity-2", - name: "서울광장 이벤트", - category: .activity, - coordinate: CLLocationCoordinate2D(latitude: 37.5663, longitude: 126.9779), - badgeText: "17분 체류 가능", - subtitle: "액티비티", - statusText: "진행 중", - closingText: "18:00에 종료", - distanceText: "90m", - walkTimeText: "시청역에서 약 1분" - ), - .init( - id: "cityhall-etc-1", - name: "시청 소품샵", - category: .etc, - coordinate: CLLocationCoordinate2D(latitude: 37.5677, longitude: 126.9808), - badgeText: "26분 체류 가능", - subtitle: "기타", - statusText: "영업 중", - closingText: "20:00에 영업종료", - distanceText: "280m", - walkTimeText: "시청역에서 약 4분" - ), - .init( - id: "cityhall-etc-2", - name: "서울 굿즈 스토어", - category: .etc, - coordinate: CLLocationCoordinate2D(latitude: 37.5648, longitude: 126.9770), - badgeText: "22분 체류 가능", - subtitle: "기타", - statusText: "영업 중", - closingText: "19:30에 영업종료", - distanceText: "210m", - walkTimeText: "시청역에서 약 3분" - ) - ] } extension ExploreMapSpot: Equatable { diff --git a/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift b/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift new file mode 100644 index 0000000..c721c70 --- /dev/null +++ b/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift @@ -0,0 +1,35 @@ +// +// PlaceEntity.swift +// Entity +// +// Created by Wonji Suh on 3/27/26. +// + +import Foundation + +public struct PlaceEntity: Equatable { + public let stationId: String + public let name: String + public let address: String + public let category: ExploreCategory + public let lat, lon: Double + public let stayableMinutes: Int + + public init( + stationId: String, + name: String, + address: String, + category: ExploreCategory, + lat: Double, + lon: Double, + stayableMinutes: Int + ) { + self.stationId = stationId + self.name = name + self.address = address + self.category = category + self.lat = lat + self.lon = lon + self.stayableMinutes = stayableMinutes + } +} diff --git a/Projects/Domain/Entity/Sources/Place/PlaceInput.swift b/Projects/Domain/Entity/Sources/Place/PlaceInput.swift new file mode 100644 index 0000000..38dd754 --- /dev/null +++ b/Projects/Domain/Entity/Sources/Place/PlaceInput.swift @@ -0,0 +1,33 @@ +// +// PlaceInput.swift +// Service +// +// Created by Wonji Suh on 3/27/26. +// + +import Foundation + +public struct PlaceInput { + public let userLat: Double + public let userLon: Double + public let mapLat: Double + public let mapLon: Double + public let stationId: Int + public let remainingMinutes: Int + + public init( + userLat: Double, + userLon: Double, + mapLat: Double, + mapLon: Double, + stationId: Int, + remainingMinutes: Int + ) { + self.userLat = userLat + self.userLon = userLon + self.mapLat = mapLat + self.mapLon = mapLon + self.stationId = stationId + self.remainingMinutes = remainingMinutes + } +} diff --git a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift new file mode 100644 index 0000000..051739f --- /dev/null +++ b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift @@ -0,0 +1,55 @@ +// +// PlaceUseCaseImpl.swift +// UseCase +// +// Created by Wonji Suh on 3/27/26. +// + +import DomainInterface +import Entity + +import ComposableArchitecture + +public protocol PlaceUseCaseInterface: Sendable { + func fetchPlaces( + userSession: UserSession, + userLat: Double, + userLon: Double + ) async throws -> [PlaceEntity] +} + +public struct PlaceUseCaseImpl: PlaceUseCaseInterface { + @Dependency(\.placeRepository) var repository + + public init() {} + + public func fetchPlaces( + userSession: UserSession, + userLat: Double, + userLon: Double + ) async throws -> [PlaceEntity] { + let input = PlaceInput( + userLat: userLat, + userLon: userLon, + mapLat: userSession.travelStationLat ?? 0, + mapLon: userSession.travelStationLng ?? 0, + stationId: Int(userSession.travelID) ?? 0, + remainingMinutes: 250 + ) + + return try await repository.fetchPlaces(input) + } +} + +extension PlaceUseCaseImpl: DependencyKey { + public static var liveValue: PlaceUseCaseInterface = PlaceUseCaseImpl() + public static var testValue: PlaceUseCaseInterface = PlaceUseCaseImpl() + public static var previewValue: PlaceUseCaseInterface = PlaceUseCaseImpl() +} + +public extension DependencyValues { + var placeUseCase: PlaceUseCaseInterface { + get { self[PlaceUseCaseImpl.self] } + set { self[PlaceUseCaseImpl.self] = newValue } + } +} From 691eb369376ce333b0ec3f9437ef7f48566fe3f9 Mon Sep 17 00:00:00 2001 From: Roy Date: Fri, 27 Mar 2026 20:45:02 +0900 Subject: [PATCH 08/35] =?UTF-8?q?feat:=20=ED=83=90=EC=83=89=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20UI=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=EC=9E=A5?= =?UTF-8?q?=EC=86=8C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=97=B0=EB=8F=99=20?= =?UTF-8?q?#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Place 도메인 DI 등록 추가 - 로고 리소스 SVG 포맷 최적화 - 탐색 지도 목적지 카메라 동작 개선 - 선택된 스팟 카드 스타일 개선 - 로그인 화면 레이아웃 간소화 --- Projects/App/Sources/Di/DiRegister.swift | 2 + .../Auth/Sources/View/LoginView.swift | 10 - .../Components/NaverMapComponent.swift | 105 ++++++++-- .../ExploreSelectedSpotCardView.swift | 18 +- .../Explore/Reducer/ExploreReducer.swift | 193 +++++++++++++++++- .../Manager/LocationPermissionManager.swift | 37 +++- .../Splash/Sources/View/SplashView.swift | 112 +++++++--- .../logo/appLogo.imageset/Contents.json | 12 ++ .../logo/appLogo.imageset/appLogo.svg | 12 ++ .../logo/loginlogo.imageset/Contents.json | 2 +- .../logo/loginlogo.imageset/loginImage.png | Bin 10904 -> 0 bytes .../logo/loginlogo.imageset/logo.svg | 26 +++ .../Sources/Color/ShapeStyle+.swift | 3 + .../Sources/Image/ImageAsset.swift | 1 + 14 files changed, 453 insertions(+), 80 deletions(-) create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/appLogo.imageset/Contents.json create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/appLogo.imageset/appLogo.svg delete mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/loginlogo.imageset/loginImage.png create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/loginlogo.imageset/logo.svg diff --git a/Projects/App/Sources/Di/DiRegister.swift b/Projects/App/Sources/Di/DiRegister.swift index fd55ac7..d4f45da 100644 --- a/Projects/App/Sources/Di/DiRegister.swift +++ b/Projects/App/Sources/Di/DiRegister.swift @@ -48,6 +48,8 @@ public final class AppDIManager { .register(HistoryInterface.self) { HistoryRepositoryImpl() } // MARK: - 역 .register(StationInterface.self) { StationRepositoryImpl() } + // MARK: - 장소 + .register(PlaceInterface.self) { PlaceRepositoryImpl() } diff --git a/Projects/Presentation/Auth/Sources/View/LoginView.swift b/Projects/Presentation/Auth/Sources/View/LoginView.swift index 840fd66..9f12138 100644 --- a/Projects/Presentation/Auth/Sources/View/LoginView.swift +++ b/Projects/Presentation/Auth/Sources/View/LoginView.swift @@ -51,20 +51,12 @@ extension LoginView { private func loginLogo() -> some View { VStack{ Spacer() - .frame(height: 180) Image(asset: .logo) .resizable() .scaledToFit() .frame(width: 212, height: 38) - Spacer() - .frame(height: 30) - - Image(asset: .loginlogo) - .resizable() - .scaledToFit() - .frame(height: 200) @@ -77,8 +69,6 @@ extension LoginView { VStack(alignment: .center, spacing: 8) { ForEach(SocialType.allCases) { type in SocialLoginButton(store: store, type: type) { - // 애플 로그인은 SignInWithAppleButton 자체 처리 사용 - // 구글 로그인만 여기서 처리 store.send(.view(.signInWithSocial(social: type))) } } diff --git a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift index 08594a2..377420e 100644 --- a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift +++ b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift @@ -32,6 +32,7 @@ public struct NaverMapComponent: UIViewRepresentable { private static var spotMarkers: [String: NMFMarker] = [:] private static var selectedSpotID: String? private static var lastSyncedSpotID: String? + private static var lastDestinationKey: String? private static var routePath: NMFPath? public init( @@ -79,9 +80,13 @@ public struct NaverMapComponent: UIViewRepresentable { mapView.locationOverlay.hidden = false mapView.touchDelegate = context.coordinator - // 현재 위치가 있으면 그 위치로, 없으면 서울로 초기 설정 - let initialLatitude = currentLocation?.coordinate.latitude ?? 37.5666805 - let initialLongitude = currentLocation?.coordinate.longitude ?? 126.9784147 + // 현재 위치가 있으면 그 위치로, 없으면 선택한 역 위치, 그것도 없으면 서울 + let initialLatitude = currentLocation?.coordinate.latitude + ?? destination?.coordinate.latitude + ?? 37.5666805 + let initialLongitude = currentLocation?.coordinate.longitude + ?? destination?.coordinate.longitude + ?? 126.9784147 let cameraPosition = NMFCameraPosition( NMGLatLng(lat: initialLatitude, lng: initialLongitude), @@ -95,6 +100,7 @@ public struct NaverMapComponent: UIViewRepresentable { public func updateUIView(_ uiView: NMFMapView, context: Context) { context.coordinator.parent = self + let shouldPrioritizeCurrentLocation = returnToLocation && currentLocation != nil // 기존 마커들과 경로 제거 Self.currentMarker?.mapView = nil Self.destinationMarker?.mapView = nil @@ -136,6 +142,7 @@ public struct NaverMapComponent: UIViewRepresentable { // 목적지 마커 추가 (네이버 3D 기본 마커 - 초록색) if let destination = destination { + let destinationKey = "\(destination.coordinate.latitude),\(destination.coordinate.longitude),\(destination.name)" let destinationMarker = NMFMarker() destinationMarker.position = NMGLatLng( lat: destination.coordinate.latitude, @@ -148,6 +155,20 @@ public struct NaverMapComponent: UIViewRepresentable { Self.destinationMarker = destinationMarker #logDebug(" [NaverMapComponent] 목적지 마커 추가: \(destination.name)") + + if !shouldPrioritizeCurrentLocation && Self.lastDestinationKey != destinationKey { + Self.lastDestinationKey = destinationKey + moveCamera( + on: uiView, + to: NMGLatLng( + lat: destination.coordinate.latitude, + lng: destination.coordinate.longitude + ), + zoom: 15 + ) + } + } else { + Self.lastDestinationKey = nil } let previousSpotID = Self.lastSyncedSpotID @@ -166,9 +187,6 @@ public struct NaverMapComponent: UIViewRepresentable { ) marker.iconImage = NMFOverlayImage(image: markerImage(for: spot.category)) marker.anchor = CGPoint(x: 0.5, y: 1.0) - marker.captionText = spot.name - marker.captionColor = .black - marker.captionHaloColor = .white Self.applySpotMarkerStyle( marker, isSelected: spot.id == Self.selectedSpotID @@ -191,16 +209,24 @@ public struct NaverMapComponent: UIViewRepresentable { Self.spotMarkers[spot.id] = marker } - if let selectedSpotID = Self.selectedSpotID, - selectedSpotID != previousSpotID, + if !shouldPrioritizeCurrentLocation, + let selectedSpotID = Self.selectedSpotID, let selectedSpot = spots.first(where: { $0.id == selectedSpotID }) { - moveCamera( - on: uiView, - to: NMGLatLng( - lat: selectedSpot.coordinate.latitude, - lng: selectedSpot.coordinate.longitude - ), - zoom: 17 + if selectedSpotID != previousSpotID { + moveCamera( + on: uiView, + to: NMGLatLng( + lat: selectedSpot.coordinate.latitude, + lng: selectedSpot.coordinate.longitude + ), + zoom: 17 + ) + } + } else if !shouldPrioritizeCurrentLocation, routeInfo == nil, !spots.isEmpty { + adjustCameraToFitSpots( + mapView: uiView, + spots: spots, + destination: destination ) } @@ -395,6 +421,55 @@ public struct NaverMapComponent: UIViewRepresentable { #logDebug(" [NaverMapComponent] 경로 전체가 보이도록 카메라 조정 완료") } + private func adjustCameraToFitSpots( + mapView: NMFMapView, + spots: [ExploreMapSpot], + destination: Destination? + ) { + var allCoords = spots.map { + NMGLatLng(lat: $0.coordinate.latitude, lng: $0.coordinate.longitude) + } + + if let destination { + allCoords.append( + NMGLatLng( + lat: destination.coordinate.latitude, + lng: destination.coordinate.longitude + ) + ) + } + + guard let first = allCoords.first else { return } + + var minLat = first.lat + var maxLat = first.lat + var minLng = first.lng + var maxLng = first.lng + + for coord in allCoords { + minLat = min(minLat, coord.lat) + maxLat = max(maxLat, coord.lat) + minLng = min(minLng, coord.lng) + maxLng = max(maxLng, coord.lng) + } + + let latPadding = max((maxLat - minLat) * 0.25, 0.0015) + let lngPadding = max((maxLng - minLng) * 0.25, 0.0015) + + let bounds = NMGLatLngBounds( + southWest: NMGLatLng(lat: minLat - latPadding, lng: minLng - lngPadding), + northEast: NMGLatLng(lat: maxLat + latPadding, lng: maxLng + lngPadding) + ) + + let cameraUpdate = NMFCameraUpdate( + fit: bounds, + paddingInsets: UIEdgeInsets(top: 180, left: 48, bottom: 220, right: 48) + ) + cameraUpdate.animation = .easeOut + cameraUpdate.animationDuration = 0.45 + mapView.moveCamera(cameraUpdate) + } + private func createCircleMarkerImage(color: UIColor, size: CGSize) -> UIImage { let renderer = UIGraphicsImageRenderer(size: size) return renderer.image { context in diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift index 6a67705..6e6e9c8 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift @@ -45,25 +45,25 @@ struct ExploreSelectedSpotCardView: View { .pretendardCustomFont(textStyle: .caption) .foregroundStyle(.orange800) .padding(.horizontal, 8) - .padding(.vertical, 3) + .padding(.vertical, 2) .background(.orange200) .clipShape(Capsule()) .padding(.bottom, 8) - HStack(alignment: .lastTextBaseline, spacing: 4) { + HStack(alignment: .lastTextBaseline, spacing: 6) { Text(spot.name) - .pretendardCustomFont(textStyle: .bodyBold) - .foregroundStyle(.gray900) + .pretendardFont(family: .SemiBold, size: 18) + .foregroundStyle(.staticBlack) .lineLimit(1) Text(spot.subtitle) .pretendardCustomFont(textStyle: .caption) - .foregroundStyle(.gray500) + .foregroundStyle(.gray650) .lineLimit(1) } .padding(.bottom, 10) - HStack(spacing: 8) { + HStack(spacing: 12) { Text(spot.statusText) .pretendardCustomFont(textStyle: .body2Medium) .foregroundStyle(.gray700) @@ -77,12 +77,12 @@ struct ExploreSelectedSpotCardView: View { HStack(spacing: 8) { Text(spot.distanceText) - .pretendardCustomFont(textStyle: .bodyMedium) - .foregroundStyle(.gray900) + .pretendardCustomFont(textStyle: .bodyBold) + .foregroundStyle(.gray650) Text(spot.walkTimeText) .pretendardCustomFont(textStyle: .bodyRegular) - .foregroundStyle(.gray600) + .foregroundStyle(.gray650) .lineLimit(1) } } diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index 23945ee..da10499 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -18,6 +18,12 @@ import LogMacro public struct ExploreReducer: Sendable { public init() {} + enum CancelID: Hashable { + case startLocationUpdates + case fetchPlaces + case searchRoute + } + @ObservableState public struct State: Equatable { public var locationPermissionStatus: CLAuthorizationStatus = .notDetermined @@ -26,6 +32,9 @@ public struct ExploreReducer: Sendable { public var locationError: String? public var searchText: String = "" public var spots: [ExploreMapSpot] = [] + public var isLoadingPlaces: Bool = false + public var hasRequestedPlaces: Bool = false + public var hasFetchedPlacesWithCurrentLocation: Bool = false @Presents public var alert: AlertState? @Shared(.inMemory("UserSession")) var userSession: UserSession = .empty @@ -84,6 +93,8 @@ public struct ExploreReducer: Sendable { case locationPermissionStatusChanged(CLAuthorizationStatus) case locationUpdated(CLLocation) case locationUpdateFailed(String) + case fetchPlacesResponse([PlaceEntity], usedCurrentLocation: Bool) + case fetchPlacesFailed(String, usedCurrentLocation: Bool) // 길찾기 관련 액션 case routeSearchStarted(Destination) case routeSearchResponse(Result) @@ -96,6 +107,8 @@ public struct ExploreReducer: Sendable { case requestFullAccuracy case startLocationUpdates case stopLocationUpdates + case requestCurrentLocation + case fetchPlaces // 길찾기 관련 액션 case searchRoute(from: CLLocationCoordinate2D, to: Destination) @@ -104,7 +117,9 @@ public struct ExploreReducer: Sendable { case (.requestLocationPermission, .requestLocationPermission), (.requestFullAccuracy, .requestFullAccuracy), (.startLocationUpdates, .startLocationUpdates), - (.stopLocationUpdates, .stopLocationUpdates): + (.stopLocationUpdates, .stopLocationUpdates), + (.requestCurrentLocation, .requestCurrentLocation), + (.fetchPlaces, .fetchPlaces): return true case (.searchRoute(let lhsFrom, let lhsTo), .searchRoute(let rhsFrom, let rhsTo)): return lhsFrom.latitude == rhsFrom.latitude && @@ -117,6 +132,7 @@ public struct ExploreReducer: Sendable { } @Dependency(\.getRouteUseCase) var getRouteUseCase + @Dependency(\.placeUseCase) var placeUseCase public var body: some ReducerOf { Reduce { state, action in @@ -142,11 +158,32 @@ extension ExploreReducer { private func filteredSpots(state: State) -> [ExploreMapSpot] { let query = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) - return state.spots.filter { spot in + let filtered = state.spots.filter { spot in let matchesCategory = state.selectedCategory == .all || spot.category == state.selectedCategory let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) return matchesCategory && matchesQuery } + + guard let currentLocation = state.currentLocation else { + return filtered + } + + return filtered.sorted { lhs, rhs in + let lhsDistance = currentLocation.distance( + from: CLLocation( + latitude: lhs.coordinate.latitude, + longitude: lhs.coordinate.longitude + ) + ) + let rhsDistance = currentLocation.distance( + from: CLLocation( + latitude: rhs.coordinate.latitude, + longitude: rhs.coordinate.longitude + ) + ) + + return lhsDistance < rhsDistance + } } private func syncSelectedSpot(state: inout State) { @@ -177,19 +214,41 @@ extension ExploreReducer { ) -> Effect { switch action { case .onAppear: - if state.spots.isEmpty { - state.spots = ExploreMapSpot.mockSpots - } state.isSpotCardVisible = false + state.isLoadingPlaces = false + state.hasRequestedPlaces = false + state.hasFetchedPlacesWithCurrentLocation = false + state.spots = [] + if let lat = state.userSession.travelStationLat, + let lng = state.userSession.travelStationLng { + state.selectedDestination = Destination( + name: state.userSession.travelStationName, + coordinate: CLLocationCoordinate2D(latitude: lat, longitude: lng) + ) + } syncSelectedSpot(state: &state) - return .run { send in + return .merge( + .run { send in let locationManager = await LocationPermissionManager.shared let currentStatus = await locationManager.authorizationStatus await send(.inner(.locationPermissionStatusChanged(currentStatus))) - } + }, + .send(.async(.fetchPlaces)) + ) case .onDisappear: - return .send(.async(.stopLocationUpdates)) + state.isLoadingPlaces = false + state.hasRequestedPlaces = false + state.hasFetchedPlacesWithCurrentLocation = false + state.spots = [] + state.isSpotCardVisible = false + state.selectedDestination = nil + return .merge( + .cancel(id: CancelID.startLocationUpdates), + .cancel(id: CancelID.fetchPlaces), + .cancel(id: CancelID.searchRoute), + .send(.async(.stopLocationUpdates)) + ) case .requestLocationPermission: return .none @@ -266,10 +325,11 @@ extension ExploreReducer { return .none case .returnToCurrentLocation: - // 현재 위치로 지도 중심 이동 + guard state.currentLocation != nil else { + return .send(.async(.requestCurrentLocation)) + } state.shouldReturnToCurrentLocation = true return .run { send in - // 0.1초 후에 플래그를 리셋 (지도 업데이트 후) try await Task.sleep(for: .milliseconds(100)) await send(.inner(.resetCameraFlag)) } @@ -303,10 +363,52 @@ extension ExploreReducer { case .locationUpdated(let location): state.currentLocation = location + if state.shouldReturnToCurrentLocation { + return .run { send in + try await Task.sleep(for: .milliseconds(100)) + await send(.inner(.resetCameraFlag)) + } + } + if !state.isLoadingPlaces + && ( + (state.spots.isEmpty && !state.hasRequestedPlaces) + || !state.hasFetchedPlacesWithCurrentLocation + ) { + return .send(.async(.fetchPlaces)) + } return .none case .locationUpdateFailed(let error): #logDebug(" [ExploreReducer] 위치 업데이트 실패: \(error)") + if state.spots.isEmpty && !state.isLoadingPlaces && !state.hasRequestedPlaces { + return .send(.async(.fetchPlaces)) + } + return .none + + case .fetchPlacesResponse(let entities, let usedCurrentLocation): + state.isLoadingPlaces = false + state.spots = entities.map(mapPlaceEntityToSpot) + state.hasFetchedPlacesWithCurrentLocation = usedCurrentLocation + syncSelectedSpot(state: &state) + if state.currentLocation != nil + && !usedCurrentLocation + && !state.hasFetchedPlacesWithCurrentLocation { + return .send(.async(.fetchPlaces)) + } + return .none + + case .fetchPlacesFailed(let message, let usedCurrentLocation): + state.isLoadingPlaces = false + state.hasRequestedPlaces = false + if usedCurrentLocation { + state.hasFetchedPlacesWithCurrentLocation = false + } + #logDebug(" [ExploreReducer] 장소 조회 실패: \(message)") + state.spots = [] + state.isSpotCardVisible = false + state.$userSession.withLock { + $0.selectedExploreSpotID = "" + } return .none // 길찾기 관련 액션 @@ -386,6 +488,7 @@ extension ExploreReducer { await send(.inner(.locationUpdateFailed(error.localizedDescription))) } } + .cancellable(id: CancelID.startLocationUpdates, cancelInFlight: true) case .stopLocationUpdates: return .run { send in @@ -395,6 +498,58 @@ extension ExploreReducer { } } + case .requestCurrentLocation: + state.shouldReturnToCurrentLocation = true + return .run { send in + let locationManager = await LocationPermissionManager.shared + + do { + if let location = try await locationManager.requestCurrentLocation() { + await send(.inner(.locationUpdated(location))) + } else { + await send(.inner(.locationUpdateFailed(LocationError.locationUnavailable.localizedDescription))) + } + } catch { + await send(.inner(.locationUpdateFailed(error.localizedDescription))) + } + } + + case .fetchPlaces: + guard Int(state.userSession.travelID) != nil, + state.userSession.travelStationLat != nil, + state.userSession.travelStationLng != nil, + !state.isLoadingPlaces, + !state.hasRequestedPlaces else { + return .none + } + + state.isLoadingPlaces = true + state.hasRequestedPlaces = true + let userSession = state.userSession + let fallbackLat = state.userSession.travelStationLat ?? 0 + let fallbackLng = state.userSession.travelStationLng ?? 0 + let usedCurrentLocation = state.currentLocation != nil + let userLat = state.currentLocation?.coordinate.latitude ?? fallbackLat + let userLon = state.currentLocation?.coordinate.longitude ?? fallbackLng + + return .run { send in + let result = await Result { + try await placeUseCase.fetchPlaces( + userSession: userSession, + userLat: userLat, + userLon: userLon + ) + } + + switch result { + case .success(let entities): + await send(.inner(.fetchPlacesResponse(entities, usedCurrentLocation: usedCurrentLocation))) + case .failure(let error): + await send(.inner(.fetchPlacesFailed(error.localizedDescription, usedCurrentLocation: usedCurrentLocation))) + } + } + .cancellable(id: CancelID.fetchPlaces, cancelInFlight: true) + // 길찾기 관련 액션 case .searchRoute(let from, let destination): return .run { send in @@ -412,6 +567,7 @@ extension ExploreReducer { await send(.inner(.routeSearchResponse(routeResult))) } + .cancellable(id: CancelID.searchRoute, cancelInFlight: true) } } @@ -456,6 +612,23 @@ extension ExploreReducer { } } +private extension ExploreReducer { + func mapPlaceEntityToSpot(_ entity: PlaceEntity) -> ExploreMapSpot { + ExploreMapSpot( + id: entity.stationId, + name: entity.name, + category: entity.category, + coordinate: CLLocationCoordinate2D(latitude: entity.lat, longitude: entity.lon), + badgeText: "\(entity.stayableMinutes)분 체류 가능", + subtitle: entity.category.title, + statusText: "", + closingText: entity.address, + distanceText: "", + walkTimeText: "" + ) + } +} + // MARK: - ExploreReducer.State + Hashable extension ExploreReducer.State: Hashable { public func hash(into hasher: inout Hasher) { diff --git a/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift b/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift index 8ec7a66..1482dfe 100644 --- a/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift +++ b/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift @@ -44,6 +44,7 @@ public final class LocationPermissionManager: NSObject, ObservableObject { private let locationManager = CLLocationManager() private var authorizationContinuation: CheckedContinuation? private var locationContinuation: CheckedContinuation? + private var locationTimeoutTask: Task? // 지속적인 위치 업데이트 콜백 (MainActor 격리) @MainActor @@ -121,8 +122,19 @@ public final class LocationPermissionManager: NSObject, ObservableObject { throw LocationError.permissionDenied } + if locationContinuation != nil { + resumeLocationContinuation(with: .failure(LocationError.locationUnavailable)) + } + return try await withCheckedThrowingContinuation { continuation in self.locationContinuation = continuation + self.locationTimeoutTask?.cancel() + self.locationTimeoutTask = Task { [weak self] in + guard let self else { return } + try? await Task.sleep(for: .seconds(5)) + guard !Task.isCancelled else { return } + self.resumeLocationContinuation(with: .failure(LocationError.timeout)) + } if #available(iOS 14.0, *) { locationManager.requestLocation() @@ -173,6 +185,21 @@ public final class LocationPermissionManager: NSObject, ObservableObject { return "알 수 없음" } } + + private func resumeLocationContinuation(with result: Result) { + locationTimeoutTask?.cancel() + locationTimeoutTask = nil + + guard let continuation = locationContinuation else { return } + locationContinuation = nil + + switch result { + case .success(let location): + continuation.resume(returning: location) + case .failure(let error): + continuation.resume(throwing: error) + } + } } // MARK: - CLLocationManagerDelegate @@ -189,10 +216,7 @@ extension LocationPermissionManager: CLLocationManagerDelegate { await self.onLocationUpdate?(location) // continuation이 있으면 결과 반환 (일회성 요청용) - if let continuation = self.locationContinuation { - self.locationContinuation = nil - continuation.resume(returning: location) - } + self.resumeLocationContinuation(with: .success(location)) } } @@ -204,10 +228,7 @@ extension LocationPermissionManager: CLLocationManagerDelegate { await self.onLocationError?(error) // continuation이 있으면 에러 반환 (일회성 요청용) - if let continuation = self.locationContinuation { - self.locationContinuation = nil - continuation.resume(throwing: error) - } + self.resumeLocationContinuation(with: .failure(error)) } } diff --git a/Projects/Presentation/Splash/Sources/View/SplashView.swift b/Projects/Presentation/Splash/Sources/View/SplashView.swift index 709bc20..42e6947 100644 --- a/Projects/Presentation/Splash/Sources/View/SplashView.swift +++ b/Projects/Presentation/Splash/Sources/View/SplashView.swift @@ -7,15 +7,26 @@ import SwiftUI +import DesignSystem import ComposableArchitecture public struct SplashView: View { @Bindable var store: StoreOf - @State private var scale: CGFloat = 1.0 - @State private var bgOpacity: Double = 1.0 - @State private var logoOpacity: Double = 1.0 - @State private var isFinished = false + @State private var symbolScale: CGFloat = 1.0 + @State private var symbolScaleX: CGFloat = 1.0 + @State private var symbolScaleY: CGFloat = 1.0 + @State private var symbolRotation: Double = 0 + @State private var symbolOffsetX: CGFloat = 0 + @State private var symbolOpacity: Double = 0.18 + @State private var wordmarkOpacity: Double = 0 + @State private var wordmarkOffsetX: CGFloat = 14 + + private enum Constants { + static let symbolLargeSize = CGSize(width: 84, height: 77) + static let symbolSmallSize = CGSize(width: 30, height: 28) + static let wordmarkSize = CGSize(width: 212, height: 38) + } public init(store: StoreOf) { self.store = store @@ -23,35 +34,82 @@ public struct SplashView: View { public var body: some View { ZStack { - // 배경 - Color.black - .opacity(bgOpacity) + Color.gray100 .ignoresSafeArea() - // 로고 - Text("Uber") - .font(.system(size: 48, weight: .black)) - .foregroundColor(.white) - .scaleEffect(scale) - .opacity(logoOpacity) + ZStack { + Image(asset: .appLogo) + .resizable() + .scaledToFit() + .frame( + width: Constants.symbolLargeSize.width, + height: Constants.symbolLargeSize.height + ) + .scaleEffect(x: symbolScale * symbolScaleX, y: symbolScale * symbolScaleY) + .rotationEffect(.degrees(symbolRotation)) + .offset(x: symbolOffsetX) + .opacity(symbolOpacity) + + Image(asset: .logo) + .resizable() + .scaledToFit() + .frame( + width: Constants.wordmarkSize.width, + height: Constants.wordmarkSize.height + ) + .opacity(wordmarkOpacity) + .offset(x: wordmarkOffsetX) + } } .onAppear { - // 토큰 확인 시작 store.send(.view(.onAppear)) + runAnimation() + } + } +} - // 1단계: 로고 확대 - withAnimation(.easeIn(duration: 0.6).delay(0.3)) { - scale = 30.0 - } - // 2단계: 페이드 아웃 - withAnimation(.easeIn(duration: 0.3).delay(0.7)) { - logoOpacity = 0 - bgOpacity = 0 - } - // 3단계: 완료 처리 - DispatchQueue.main.asyncAfter(deadline: .now() + 1.1) { - isFinished = true - } +private extension SplashView { + func runAnimation() { + symbolScale = 1.0 + symbolScaleX = 1.0 + symbolScaleY = 1.0 + symbolRotation = 0 + symbolOffsetX = 0 + symbolOpacity = 0.18 + wordmarkOpacity = 0 + wordmarkOffsetX = 14 + + withAnimation(.easeOut(duration: 0.3).delay(0.12)) { + symbolOpacity = 1 + } + + withAnimation(.easeInOut(duration: 0.18).delay(0.46)) { + symbolRotation = -18 + symbolScaleX = 1.16 + symbolScaleY = 0.84 + } + + withAnimation(.spring(response: 0.22, dampingFraction: 0.86).delay(0.66)) { + symbolRotation = 0 + symbolScaleX = 1.0 + symbolScaleY = 1.0 + } + + withAnimation(.easeInOut(duration: 0.26).delay(0.84)) { + symbolScale = Constants.symbolSmallSize.width / Constants.symbolLargeSize.width + } + + withAnimation(.easeInOut(duration: 0.26).delay(1.16)) { + symbolOffsetX = -54 + } + + withAnimation(.easeOut(duration: 0.12).delay(1.34)) { + symbolOpacity = 0 + } + + withAnimation(.easeOut(duration: 0.2).delay(1.42)) { + wordmarkOpacity = 1 + wordmarkOffsetX = 0 } } } diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/appLogo.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/appLogo.imageset/Contents.json new file mode 100644 index 0000000..d1d7df5 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/appLogo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "appLogo.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/appLogo.imageset/appLogo.svg b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/appLogo.imageset/appLogo.svg new file mode 100644 index 0000000..bf12dd8 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/appLogo.imageset/appLogo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/loginlogo.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/loginlogo.imageset/Contents.json index efe98e2..ad42a58 100644 --- a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/loginlogo.imageset/Contents.json +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/loginlogo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "loginImage.png", + "filename" : "logo.svg", "idiom" : "universal" } ], diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/loginlogo.imageset/loginImage.png b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/logo/loginlogo.imageset/loginImage.png deleted file mode 100644 index 3913596396c1a96ea06f0d69de251e547ad692a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10904 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 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift b/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift index 2c118ef..3d2399a 100644 --- a/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift +++ b/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift @@ -17,8 +17,11 @@ public extension ShapeStyle where Self == Color { static var gray500: Color { .init(hex: "BABABA") } static var gray550: Color { .init(hex: "B0B0B0") } static var gray600: Color { .init(hex: "A1A1A1") } + static var gray650: Color { .init(hex: "9F9F9F") } static var gray700: Color { .init(hex: "878787") } + static var gray750: Color { .init(hex: "595959") } static var gray800: Color { .init(hex: "545454") } + static var gray850: Color { .init(hex: "373737") } static var gray900: Color { .init(hex: "181818") } static var lightGray: Color { .init(hex: "CCCCCC") } static var mediumGray: Color { .init(hex: "6C6C6C")} diff --git a/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift b/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift index cebac5a..636511e 100644 --- a/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift +++ b/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift @@ -52,6 +52,7 @@ public enum ImageAsset: String { case homeLogo case logo case loginlogo + case appLogo case warning From 8084150e260b42a70b89412eab857a7972a8b0a0 Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 01:00:30 +0900 Subject: [PATCH 09/35] =?UTF-8?q?feat:=20=EC=9E=A5=EC=86=8C=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=EB=B0=8F=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EA=B5=AC=ED=98=84=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/API/Sources/API/Place/PlaceAPI.swift | 3 + .../Sources/Place/DTO/PlaceDTOModel.swift | 45 +++- .../Sources/Place/Mapper/PlaceDTOModel+.swift | 65 ++++- .../Sources/Place/PlaceRepositoryImpl.swift | 21 +- .../Service/Sources/Place/PlaceRequest.swift | 50 ++++ .../Service/Sources/Place/PlaceService.swift | 7 + .../Place/DefaultPlaceRepositoryImpl.swift | 8 + .../Sources/Place/PlaceInterface.swift | 1 + .../Sources/Explore/ExploreMapSpot.swift | 21 ++ .../Entity/Sources/Place/PlaceEntity.swift | 97 ++++++- .../Entity/Sources/Place/PlaceInput.swift | 37 +++ Projects/Domain/UseCase/Project.swift | 1 + .../Sources/Place/PlaceUseCaseImpl.swift | 252 ++++++++++++++++++ 13 files changed, 588 insertions(+), 20 deletions(-) diff --git a/Projects/Data/API/Sources/API/Place/PlaceAPI.swift b/Projects/Data/API/Sources/API/Place/PlaceAPI.swift index 06b5c25..3d2ef8d 100644 --- a/Projects/Data/API/Sources/API/Place/PlaceAPI.swift +++ b/Projects/Data/API/Sources/API/Place/PlaceAPI.swift @@ -9,11 +9,14 @@ import Foundation public enum PlaceAPI: String, CaseIterable { case fetchPlace + case searchPlace public var description: String { switch self { case .fetchPlace: return "" + case .searchPlace: + return "/search" } } } diff --git a/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift b/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift index 5bc6e3c..a2b842f 100644 --- a/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift +++ b/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift @@ -9,16 +9,49 @@ import Foundation public typealias PlaceDTOModel = BaseResponseDTO<[PlaceResponseDTOModel]> +public typealias PlaceSearchDTOModel = BaseResponseDTO // MARK: - Datum public struct PlaceResponseDTOModel: Decodable, Equatable { - let googlePlaceID, category: String - let lat, lon: Double - let stayableMinutes: Int - let name, address: String + public let placeID: Int + public let category: String + public let lat: Double + public let lon: Double + public let name: String? + public let address: String? + public let stayableMinutes: Int? + public let isOpen: Bool? + public let closingTime: String? enum CodingKeys: String, CodingKey { - case googlePlaceID = "googlePlaceId" - case category, lat, lon, stayableMinutes, name, address + case placeID = "placeId" + case category, lat, lon, name, address, stayableMinutes, isOpen, closingTime } } + +public struct PlaceSearchPageResponseDTO: Decodable, Equatable { + public let pageable: PlacePageableResponseDTO + public let last: Bool + public let numberOfElements: Int + public let first: Bool + public let size: Int + public let content: [PlaceResponseDTOModel] + public let number: Int + public let sort: PlaceSortResponseDTO + public let empty: Bool +} + +public struct PlacePageableResponseDTO: Decodable, Equatable { + public let unpaged: Bool + public let paged: Bool + public let pageNumber: Int + public let pageSize: Int + public let offset: Int + public let sort: PlaceSortResponseDTO +} + +public struct PlaceSortResponseDTO: Decodable, Equatable { + public let unsorted: Bool + public let sorted: Bool + public let empty: Bool +} diff --git a/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift b/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift index c655ac2..a080ad4 100644 --- a/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift +++ b/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift @@ -12,14 +12,30 @@ import Entity public extension PlaceResponseDTOModel { func toDomain() -> PlaceEntity { - PlaceEntity( - stationId: googlePlaceID, - name: name, - address: address, + return PlaceEntity( + placeId: placeID, + name: name ?? "", + category: mapCategory(category), + lat: lat, + lon: lon, + address: address ?? "", + stayableMinutes: stayableMinutes ?? 0, + isOpen: isOpen ?? false, + closingTime: closingTime + ) + } + + func toDomainForFetchPlaces() -> PlaceEntity { + return PlaceEntity( + placeId: placeID, + name: name ?? "", category: mapCategory(category), lat: lon, lon: lat, - stayableMinutes: stayableMinutes + address: address ?? "", + stayableMinutes: stayableMinutes ?? 0, + isOpen: isOpen ?? false, + closingTime: closingTime ) } @@ -38,3 +54,42 @@ public extension PlaceResponseDTOModel { } } } + +public extension PlaceSearchPageResponseDTO { + func toDomain() -> PlaceSearchPageEntity { + PlaceSearchPageEntity( + pageable: pageable.toDomain(), + isLastPage: last, + numberOfElements: numberOfElements, + isFirstPage: first, + size: size, + content: content.map { $0.toDomain() }, + page: number, + sort: sort.toDomain(), + isEmpty: empty + ) + } +} + +public extension PlacePageableResponseDTO { + func toDomain() -> PlacePageableEntity { + PlacePageableEntity( + isUnpaged: unpaged, + isPaged: paged, + pageNumber: pageNumber, + pageSize: pageSize, + offset: offset, + sort: sort.toDomain() + ) + } +} + +public extension PlaceSortResponseDTO { + func toDomain() -> PlaceSortEntity { + PlaceSortEntity( + isUnsorted: unsorted, + isSorted: sorted, + isEmpty: empty + ) + } +} diff --git a/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift b/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift index 546f307..0093015 100644 --- a/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift +++ b/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift @@ -37,6 +37,25 @@ public final class PlaceRepositoryImpl: PlaceInterface, @unchecked Sendable { remainingMinutes: input.remainingMinutes ) let dto: PlaceDTOModel = try await provider.request(.fetchPlaces(body: body)) - return dto.data.map { $0.toDomain() } + + return dto.data.map { $0.toDomainForFetchPlaces() } + } + + public func searchPlaces( + _ input: PlaceSearchInput + ) async throws -> PlaceSearchPageEntity { + let body: PlaceSearchRequest = .init( + userLat: input.userLat, + userLon: input.userLon, + stationId: input.stationId, + remainingMinutes: input.remainingMinutes, + keyword: input.keyword, + category: input.category, + markerLat: input.markerLat, + markerLon: input.markerLon, + pageable: .init(page: input.page, size: input.size) + ) + let dto: PlaceSearchDTOModel = try await provider.request(.searchPlaces(body: body)) + return dto.data.toDomain() } } diff --git a/Projects/Data/Service/Sources/Place/PlaceRequest.swift b/Projects/Data/Service/Sources/Place/PlaceRequest.swift index 27439a4..f956816 100644 --- a/Projects/Data/Service/Sources/Place/PlaceRequest.swift +++ b/Projects/Data/Service/Sources/Place/PlaceRequest.swift @@ -32,3 +32,53 @@ public struct PlaceRequest: Encodable { self.remainingMinutes = remainingMinutes } } + +public struct PlaceSearchRequest: Encodable { + public let userLat: Double + public let userLon: Double + public let stationId: Int + public let remainingMinutes: Int + public let keyword: String? + public let category: String? + public let sortBy: String + public let markerLat: Double? + public let markerLon: Double? + public let pageable: PageableRequest + + public init( + userLat: Double, + userLon: Double, + stationId: Int, + remainingMinutes: Int, + keyword: String? = nil, + category: String? = nil, + sortBy: String = "MARKER_NEAREST", + markerLat: Double? = nil, + markerLon: Double? = nil, + pageable: PageableRequest = .init() + ) { + self.userLat = userLat + self.userLon = userLon + self.stationId = stationId + self.remainingMinutes = remainingMinutes + self.keyword = keyword + self.category = category + self.sortBy = sortBy + self.markerLat = markerLat + self.markerLon = markerLon + self.pageable = pageable + } +} + +public struct PageableRequest: Encodable, Equatable { + public let page: Int + public let size: Int + + public init( + page: Int = 1, + size: Int = 10 + ) { + self.page = page + self.size = size + } +} diff --git a/Projects/Data/Service/Sources/Place/PlaceService.swift b/Projects/Data/Service/Sources/Place/PlaceService.swift index b838bfc..8233ec7 100644 --- a/Projects/Data/Service/Sources/Place/PlaceService.swift +++ b/Projects/Data/Service/Sources/Place/PlaceService.swift @@ -14,6 +14,7 @@ import AsyncMoya public enum PlaceService { case fetchPlaces(body: PlaceRequest) + case searchPlaces(body: PlaceSearchRequest) } @@ -28,6 +29,8 @@ extension PlaceService: BaseTargetType { switch self { case .fetchPlaces: return PlaceAPI.fetchPlace.description + case .searchPlaces: + return PlaceAPI.searchPlace.description } } @@ -39,6 +42,8 @@ extension PlaceService: BaseTargetType { switch self { case .fetchPlaces: return .get + case .searchPlaces: + return .get } } @@ -46,6 +51,8 @@ extension PlaceService: BaseTargetType { switch self { case .fetchPlaces(let body): return body.toDictionary + case .searchPlaces(let body): + return body.toDictionary } } diff --git a/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift b/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift index c653738..d25d21e 100644 --- a/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift +++ b/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift @@ -18,4 +18,12 @@ public final class DefaultPlaceRepositoryImpl: PlaceInterface { userInfo: [NSLocalizedDescriptionKey: "PlaceRepository is not configured."] ) } + + public func searchPlaces(_ input: PlaceSearchInput) async throws -> PlaceSearchPageEntity { + throw NSError( + domain: "PlaceRepository", + code: -1, + userInfo: [NSLocalizedDescriptionKey: "PlaceRepository is not configured."] + ) + } } diff --git a/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift b/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift index 71993dd..bcbd12d 100644 --- a/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift +++ b/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift @@ -12,6 +12,7 @@ import ComposableArchitecture public protocol PlaceInterface: Sendable { func fetchPlaces(_ input: PlaceInput) async throws -> [PlaceEntity] + func searchPlaces(_ input: PlaceSearchInput) async throws -> PlaceSearchPageEntity } diff --git a/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift b/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift index 54410a8..299cd02 100644 --- a/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift +++ b/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift @@ -13,6 +13,7 @@ public struct ExploreMapSpot: Identifiable { public let name: String public let category: ExploreCategory public let coordinate: CLLocationCoordinate2D + public let hasDetail: Bool public let badgeText: String public let subtitle: String public let statusText: String @@ -25,6 +26,7 @@ public struct ExploreMapSpot: Identifiable { name: String, category: ExploreCategory, coordinate: CLLocationCoordinate2D, + hasDetail: Bool = false, badgeText: String, subtitle: String, statusText: String, @@ -36,6 +38,7 @@ public struct ExploreMapSpot: Identifiable { self.name = name self.category = category self.coordinate = coordinate + self.hasDetail = hasDetail self.badgeText = badgeText self.subtitle = subtitle self.statusText = statusText @@ -52,6 +55,7 @@ extension ExploreMapSpot: Equatable { && lhs.category == rhs.category && lhs.coordinate.latitude == rhs.coordinate.latitude && lhs.coordinate.longitude == rhs.coordinate.longitude + && lhs.hasDetail == rhs.hasDetail && lhs.badgeText == rhs.badgeText && lhs.subtitle == rhs.subtitle && lhs.statusText == rhs.statusText @@ -68,6 +72,7 @@ extension ExploreMapSpot: Hashable { hasher.combine(category) hasher.combine(coordinate.latitude) hasher.combine(coordinate.longitude) + hasher.combine(hasDetail) hasher.combine(badgeText) hasher.combine(subtitle) hasher.combine(statusText) @@ -76,3 +81,19 @@ extension ExploreMapSpot: Hashable { hasher.combine(walkTimeText) } } + +public struct ExploreSpotPageEntity: Equatable { + public let spots: [ExploreMapSpot] + public let currentPage: Int + public let hasNextPage: Bool + + public init( + spots: [ExploreMapSpot], + currentPage: Int, + hasNextPage: Bool + ) { + self.spots = spots + self.currentPage = currentPage + self.hasNextPage = hasNextPage + } +} diff --git a/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift b/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift index c721c70..4121b2f 100644 --- a/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift +++ b/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift @@ -8,28 +8,109 @@ import Foundation public struct PlaceEntity: Equatable { - public let stationId: String + public let placeId: Int public let name: String + public let category: ExploreCategory public let address: String - public let category: ExploreCategory public let lat, lon: Double public let stayableMinutes: Int + public let isOpen: Bool + public let closingTime: String? public init( - stationId: String, - name: String, - address: String, + placeId: Int, + name: String = "", category: ExploreCategory, lat: Double, lon: Double, - stayableMinutes: Int + address: String = "", + stayableMinutes: Int = 0, + isOpen: Bool = false, + closingTime: String? = nil ) { - self.stationId = stationId + self.placeId = placeId self.name = name - self.address = address self.category = category self.lat = lat self.lon = lon + self.address = address self.stayableMinutes = stayableMinutes + self.isOpen = isOpen + self.closingTime = closingTime + } +} + +public struct PlaceSearchPageEntity: Equatable { + public let pageable: PlacePageableEntity + public let isLastPage: Bool + public let numberOfElements: Int + public let isFirstPage: Bool + public let size: Int + public let content: [PlaceEntity] + public let page: Int + public let sort: PlaceSortEntity + public let isEmpty: Bool + + public init( + pageable: PlacePageableEntity, + isLastPage: Bool, + numberOfElements: Int, + isFirstPage: Bool, + size: Int, + content: [PlaceEntity], + page: Int, + sort: PlaceSortEntity, + isEmpty: Bool + ) { + self.pageable = pageable + self.isLastPage = isLastPage + self.numberOfElements = numberOfElements + self.isFirstPage = isFirstPage + self.size = size + self.content = content + self.page = page + self.sort = sort + self.isEmpty = isEmpty + } +} + +public struct PlacePageableEntity: Equatable { + public let isUnpaged: Bool + public let isPaged: Bool + public let pageNumber: Int + public let pageSize: Int + public let offset: Int + public let sort: PlaceSortEntity + + public init( + isUnpaged: Bool, + isPaged: Bool, + pageNumber: Int, + pageSize: Int, + offset: Int, + sort: PlaceSortEntity + ) { + self.isUnpaged = isUnpaged + self.isPaged = isPaged + self.pageNumber = pageNumber + self.pageSize = pageSize + self.offset = offset + self.sort = sort + } +} + +public struct PlaceSortEntity: Equatable { + public let isUnsorted: Bool + public let isSorted: Bool + public let isEmpty: Bool + + public init( + isUnsorted: Bool, + isSorted: Bool, + isEmpty: Bool + ) { + self.isUnsorted = isUnsorted + self.isSorted = isSorted + self.isEmpty = isEmpty } } diff --git a/Projects/Domain/Entity/Sources/Place/PlaceInput.swift b/Projects/Domain/Entity/Sources/Place/PlaceInput.swift index 38dd754..620cf31 100644 --- a/Projects/Domain/Entity/Sources/Place/PlaceInput.swift +++ b/Projects/Domain/Entity/Sources/Place/PlaceInput.swift @@ -31,3 +31,40 @@ public struct PlaceInput { self.remainingMinutes = remainingMinutes } } + +public struct PlaceSearchInput: Equatable { + public let userLat: Double + public let userLon: Double + public let stationId: Int + public let remainingMinutes: Int + public let keyword: String? + public let category: String? + public let markerLat: Double? + public let markerLon: Double? + public let page: Int + public let size: Int + + public init( + userLat: Double, + userLon: Double, + stationId: Int, + remainingMinutes: Int, + keyword: String? = nil, + category: String? = nil, + markerLat: Double? = nil, + markerLon: Double? = nil, + page: Int = 1, + size: Int = 10 + ) { + self.userLat = userLat + self.userLon = userLon + self.stationId = stationId + self.remainingMinutes = remainingMinutes + self.keyword = keyword + self.category = category + self.markerLat = markerLat + self.markerLon = markerLon + self.page = page + self.size = size + } +} diff --git a/Projects/Domain/UseCase/Project.swift b/Projects/Domain/UseCase/Project.swift index 2e6cc37..c850a02 100644 --- a/Projects/Domain/UseCase/Project.swift +++ b/Projects/Domain/UseCase/Project.swift @@ -11,6 +11,7 @@ let project = Project.makeModule( settings: .settings(), dependencies: [ .Domain(implements: .DomainInterface), + .Shared(implements: .Utill), .SPM.composableArchitecture, .SPM.weaveDI ], diff --git a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift index 051739f..b215381 100644 --- a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift +++ b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift @@ -9,6 +9,8 @@ import DomainInterface import Entity import ComposableArchitecture +import CoreLocation +import Utill public protocol PlaceUseCaseInterface: Sendable { func fetchPlaces( @@ -16,6 +18,35 @@ public protocol PlaceUseCaseInterface: Sendable { userLat: Double, userLon: Double ) async throws -> [PlaceEntity] + + func fetchInitialExploreSpots( + userSession: UserSession, + userLat: Double, + userLon: Double + ) async throws -> ExploreSpotPageEntity + + func searchPlaces( + userSession: UserSession, + userLat: Double, + userLon: Double, + keyword: String?, + category: ExploreCategory?, + markerLat: Double?, + markerLon: Double?, + page: Int + ) async throws -> PlaceSearchPageEntity + + func searchExploreSpots( + baseSpots: [ExploreMapSpot], + userSession: UserSession, + userLat: Double, + userLon: Double, + keyword: String?, + category: ExploreCategory?, + markerLat: Double?, + markerLon: Double?, + page: Int + ) async throws -> ExploreSpotPageEntity } public struct PlaceUseCaseImpl: PlaceUseCaseInterface { @@ -39,6 +70,227 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { return try await repository.fetchPlaces(input) } + + public func fetchInitialExploreSpots( + userSession: UserSession, + userLat: Double, + userLon: Double + ) async throws -> ExploreSpotPageEntity { + let placeInput = PlaceInput( + userLat: userLat, + userLon: userLon, + mapLat: userSession.travelStationLat ?? 0, + mapLon: userSession.travelStationLng ?? 0, + stationId: Int(userSession.travelID) ?? 0, + remainingMinutes: 250 + ) + let searchInput = PlaceSearchInput( + userLat: userLat, + userLon: userLon, + stationId: Int(userSession.travelID) ?? 0, + remainingMinutes: 250, + keyword: nil, + category: nil, + markerLat: userSession.travelStationLat, + markerLon: userSession.travelStationLng, + page: 1, + size: 10 + ) + + async let markerEntities = repository.fetchPlaces(placeInput) + async let detailPage = repository.searchPlaces(searchInput) + + let fetchedMarkerEntities = try await markerEntities + let fetchedDetailPage = try await detailPage + + let mergedSpots = mergeSpots( + baseSpots: fetchedMarkerEntities.map { makeBaseSpot(from: $0) }, + detailPage: fetchedDetailPage, + stationName: userSession.travelStationName, + stationLat: userSession.travelStationLat, + stationLon: userSession.travelStationLng + ) + + return ExploreSpotPageEntity( + spots: mergedSpots, + currentPage: fetchedDetailPage.page + 1, + hasNextPage: !fetchedDetailPage.isLastPage + ) + } + + public func searchPlaces( + userSession: UserSession, + userLat: Double, + userLon: Double, + keyword: String?, + category: ExploreCategory?, + markerLat: Double?, + markerLon: Double?, + page: Int + ) async throws -> PlaceSearchPageEntity { + let input = PlaceSearchInput( + userLat: userLat, + userLon: userLon, + stationId: Int(userSession.travelID) ?? 0, + remainingMinutes: 250, + keyword: keyword, + category: mapCategory(category), + markerLat: markerLat, + markerLon: markerLon, + page: page, + size: 10 + ) + + return try await repository.searchPlaces(input) + } + + public func searchExploreSpots( + baseSpots: [ExploreMapSpot], + userSession: UserSession, + userLat: Double, + userLon: Double, + keyword: String?, + category: ExploreCategory?, + markerLat: Double?, + markerLon: Double?, + page: Int + ) async throws -> ExploreSpotPageEntity { + let searchInput = PlaceSearchInput( + userLat: userLat, + userLon: userLon, + stationId: Int(userSession.travelID) ?? 0, + remainingMinutes: 250, + keyword: keyword, + category: mapCategory(category), + markerLat: markerLat, + markerLon: markerLon, + page: page, + size: 10 + ) + + let pageEntity = try await repository.searchPlaces(searchInput) + let mergedSpots = mergeSpots( + baseSpots: baseSpots, + detailPage: pageEntity, + stationName: userSession.travelStationName, + stationLat: userSession.travelStationLat, + stationLon: userSession.travelStationLng + ) + + return ExploreSpotPageEntity( + spots: mergedSpots, + currentPage: pageEntity.page + 1, + hasNextPage: !pageEntity.isLastPage + ) + } + + private func mapCategory(_ category: ExploreCategory?) -> String? { + switch category { + case .none, .some(.all): + return nil + case .some(.cafe): + return "카페" + case .some(.restaurant): + return "음식점" + case .some(.activity): + return "액티비티" + case .some(.etc): + return "기타" + } + } + + private func makeBaseSpot(from entity: PlaceEntity) -> ExploreMapSpot { + ExploreMapSpot( + id: String(entity.placeId), + name: "", + category: entity.category, + coordinate: CLLocationCoordinate2D(latitude: entity.lat, longitude: entity.lon), + hasDetail: false, + badgeText: "", + subtitle: entity.category.title, + statusText: "", + closingText: "", + distanceText: "", + walkTimeText: "" + ) + } + + private func makeDetailSpot( + from entity: PlaceEntity, + coordinate: CLLocationCoordinate2D, + stationName: String, + stationLat: Double?, + stationLon: Double? + ) -> ExploreMapSpot { + let closingText: String + if let closingTime = entity.closingTime, !closingTime.isEmpty { + closingText = closingTime.formattedClosingTimeText() + } else { + closingText = entity.address + } + + let distanceText: String + let walkTimeText: String + + if let stationLat, let stationLon { + let stationLocation = CLLocation(latitude: stationLat, longitude: stationLon) + let placeLocation = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude) + let distanceInMeters = stationLocation.distance(from: placeLocation) + let roundedDistance = Int((distanceInMeters / 10).rounded() * 10) + let walkingMinutes = max(Int(ceil(distanceInMeters / 67)), 1) + + distanceText = "\(roundedDistance)m" + walkTimeText = "\(stationName)역에서 약 \(walkingMinutes)분" + } else { + distanceText = "" + walkTimeText = "" + } + + return ExploreMapSpot( + id: String(entity.placeId), + name: entity.name, + category: entity.category, + coordinate: coordinate, + hasDetail: true, + badgeText: entity.stayableMinutes > 0 ? "\(entity.stayableMinutes)분 체류 가능" : "", + subtitle: entity.category.title, + statusText: entity.isOpen ? "영업 중" : "영업 종료", + closingText: closingText, + distanceText: distanceText, + walkTimeText: walkTimeText + ) + } + + private func mergeSpots( + baseSpots: [ExploreMapSpot], + detailPage: PlaceSearchPageEntity, + stationName: String, + stationLat: Double?, + stationLon: Double? + ) -> [ExploreMapSpot] { + var mergedSpots = baseSpots + + for entity in detailPage.content { + let id = String(entity.placeId) + let coordinate = mergedSpots.first(where: { $0.id == id })?.coordinate + ?? CLLocationCoordinate2D(latitude: entity.lat, longitude: entity.lon) + let detailSpot = makeDetailSpot( + from: entity, + coordinate: coordinate, + stationName: stationName, + stationLat: stationLat, + stationLon: stationLon + ) + + if let index = mergedSpots.firstIndex(where: { $0.id == id }) { + mergedSpots[index] = detailSpot + } else { + mergedSpots.append(detailSpot) + } + } + + return mergedSpots + } } extension PlaceUseCaseImpl: DependencyKey { From 8ed994ab8e1ae6a172e786318e8b35355d8fb96f Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 01:01:32 +0900 Subject: [PATCH 10/35] =?UTF-8?q?feat:=20=ED=83=90=EC=83=89=20UI=20?= =?UTF-8?q?=EB=B0=8F=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExploreSelectedSpotCardView.swift | 64 ++-- .../Explore/Reducer/ExploreReducer.swift | 340 ++++++++++++++---- .../Sources/Explore/View/ExploreView.swift | 70 +++- .../Sources/Main/Reducer/HomeFeature.swift | 33 +- .../Home/Sources/Main/View/HomeView.swift | 2 +- .../Splash/Sources/View/SplashView.swift | 26 +- .../Shared/Utill/Sources/String/String+.swift | 8 + 7 files changed, 407 insertions(+), 136 deletions(-) diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift index 6e6e9c8..a7d6118 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift @@ -41,14 +41,16 @@ struct ExploreSelectedSpotCardView: View { VStack(alignment: .leading, spacing: 0) { HStack(alignment: .top, spacing: 12) { VStack(alignment: .leading, spacing: 0) { - Text(spot.badgeText) - .pretendardCustomFont(textStyle: .caption) - .foregroundStyle(.orange800) - .padding(.horizontal, 8) - .padding(.vertical, 2) - .background(.orange200) - .clipShape(Capsule()) - .padding(.bottom, 8) + if !spot.badgeText.isEmpty { + Text(spot.badgeText) + .pretendardCustomFont(textStyle: .caption) + .foregroundStyle(.orange800) + .padding(.horizontal, 8) + .padding(.vertical, 2) + .background(.orange200) + .clipShape(Capsule()) + .padding(.bottom, 8) + } HStack(alignment: .lastTextBaseline, spacing: 6) { Text(spot.name) @@ -63,27 +65,39 @@ struct ExploreSelectedSpotCardView: View { } .padding(.bottom, 10) - HStack(spacing: 12) { - Text(spot.statusText) - .pretendardCustomFont(textStyle: .body2Medium) - .foregroundStyle(.gray700) + if !spot.statusText.isEmpty || !spot.closingText.isEmpty { + HStack(spacing: 12) { + if !spot.statusText.isEmpty { + Text(spot.statusText) + .pretendardCustomFont(textStyle: .body2Medium) + .foregroundStyle(.gray700) + } - Text(spot.closingText) - .pretendardCustomFont(textStyle: .body2Regular) - .foregroundStyle(.gray500) - .lineLimit(1) + if !spot.closingText.isEmpty { + Text(spot.closingText) + .pretendardCustomFont(textStyle: .body2Regular) + .foregroundStyle(.gray500) + .lineLimit(1) + } + } + .padding(.bottom, 10) } - .padding(.bottom, 10) - HStack(spacing: 8) { - Text(spot.distanceText) - .pretendardCustomFont(textStyle: .bodyBold) - .foregroundStyle(.gray650) + if !spot.distanceText.isEmpty || !spot.walkTimeText.isEmpty { + HStack(spacing: 8) { + if !spot.distanceText.isEmpty { + Text(spot.distanceText) + .pretendardCustomFont(textStyle: .bodyBold) + .foregroundStyle(.gray650) + } - Text(spot.walkTimeText) - .pretendardCustomFont(textStyle: .bodyRegular) - .foregroundStyle(.gray650) - .lineLimit(1) + if !spot.walkTimeText.isEmpty { + Text(spot.walkTimeText) + .pretendardCustomFont(textStyle: .bodyRegular) + .foregroundStyle(.gray650) + .lineLimit(1) + } + } } } .frame(maxWidth: .infinity, alignment: .leading) diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index da10499..8d55ae9 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -21,6 +21,7 @@ public struct ExploreReducer: Sendable { enum CancelID: Hashable { case startLocationUpdates case fetchPlaces + case searchPlaces case searchRoute } @@ -35,6 +36,11 @@ public struct ExploreReducer: Sendable { public var isLoadingPlaces: Bool = false public var hasRequestedPlaces: Bool = false public var hasFetchedPlacesWithCurrentLocation: Bool = false + public var currentPage: Int = 1 + public var hasNextPage: Bool = true + public var pendingSelectFirstSpotFromNextPage: Bool = false + public var searchMarkerLat: Double? + public var searchMarkerLon: Double? @Presents public var alert: AlertState? @Shared(.inMemory("UserSession")) var userSession: UserSession = .empty @@ -83,6 +89,7 @@ public struct ExploreReducer: Sendable { case categoryTapped(ExploreCategory) case spotTapped(String) case spotCardChanged(String?) + case loadNextSpotPage // 길찾기 관련 액션 case searchRouteToGangnam case clearRoute @@ -93,8 +100,19 @@ public struct ExploreReducer: Sendable { case locationPermissionStatusChanged(CLAuthorizationStatus) case locationUpdated(CLLocation) case locationUpdateFailed(String) - case fetchPlacesResponse([PlaceEntity], usedCurrentLocation: Bool) + case fetchPlacesResponse(ExploreSpotPageEntity, usedCurrentLocation: Bool) case fetchPlacesFailed(String, usedCurrentLocation: Bool) + case searchPlacesResponse( + ExploreSpotPageEntity, + append: Bool, + requestedPage: Int, + requestedKeyword: String, + requestedCategory: ExploreCategory?, + requestedMarkerLat: Double?, + requestedMarkerLon: Double?, + usedCurrentLocation: Bool + ) + case searchPlacesFailed(String) // 길찾기 관련 액션 case routeSearchStarted(Destination) case routeSearchResponse(Result) @@ -109,26 +127,9 @@ public struct ExploreReducer: Sendable { case stopLocationUpdates case requestCurrentLocation case fetchPlaces + case searchPlaces(page: Int, append: Bool) // 길찾기 관련 액션 case searchRoute(from: CLLocationCoordinate2D, to: Destination) - - public static func == (lhs: AsyncAction, rhs: AsyncAction) -> Bool { - switch (lhs, rhs) { - case (.requestLocationPermission, .requestLocationPermission), - (.requestFullAccuracy, .requestFullAccuracy), - (.startLocationUpdates, .startLocationUpdates), - (.stopLocationUpdates, .stopLocationUpdates), - (.requestCurrentLocation, .requestCurrentLocation), - (.fetchPlaces, .fetchPlaces): - return true - case (.searchRoute(let lhsFrom, let lhsTo), .searchRoute(let rhsFrom, let rhsTo)): - return lhsFrom.latitude == rhsFrom.latitude && - lhsFrom.longitude == rhsFrom.longitude && - lhsTo == rhsTo - default: - return false - } - } } @Dependency(\.getRouteUseCase) var getRouteUseCase @@ -159,9 +160,10 @@ extension ExploreReducer { let query = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) let filtered = state.spots.filter { spot in + let hasDetail = spot.hasDetail let matchesCategory = state.selectedCategory == .all || spot.category == state.selectedCategory let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) - return matchesCategory && matchesQuery + return hasDetail && matchesCategory && matchesQuery } guard let currentLocation = state.currentLocation else { @@ -187,23 +189,15 @@ extension ExploreReducer { } private func syncSelectedSpot(state: inout State) { - let currentFilteredSpots = filteredSpots(state: state) - - guard !currentFilteredSpots.isEmpty else { - state.$userSession.withLock { - $0.selectedExploreSpotID = "" - } - return - } - guard let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty else { return } - guard currentFilteredSpots.contains(where: { $0.id == selectedSpotID }) else { + guard state.spots.contains(where: { $0.id == selectedSpotID }) else { state.$userSession.withLock { $0.selectedExploreSpotID = "" } + state.isSpotCardVisible = false return } } @@ -218,6 +212,11 @@ extension ExploreReducer { state.isLoadingPlaces = false state.hasRequestedPlaces = false state.hasFetchedPlacesWithCurrentLocation = false + state.currentPage = 1 + state.hasNextPage = true + state.pendingSelectFirstSpotFromNextPage = false + state.searchMarkerLat = nil + state.searchMarkerLon = nil state.spots = [] if let lat = state.userSession.travelStationLat, let lng = state.userSession.travelStationLng { @@ -240,12 +239,18 @@ extension ExploreReducer { state.isLoadingPlaces = false state.hasRequestedPlaces = false state.hasFetchedPlacesWithCurrentLocation = false + state.currentPage = 1 + state.hasNextPage = true + state.pendingSelectFirstSpotFromNextPage = false + state.searchMarkerLat = nil + state.searchMarkerLon = nil state.spots = [] state.isSpotCardVisible = false state.selectedDestination = nil return .merge( .cancel(id: CancelID.startLocationUpdates), .cancel(id: CancelID.fetchPlaces), + .cancel(id: CancelID.searchPlaces), .cancel(id: CancelID.searchRoute), .send(.async(.stopLocationUpdates)) ) @@ -273,26 +278,54 @@ extension ExploreReducer { case .searchTextChanged(let text): state.searchText = text - syncSelectedSpot(state: &state) - if state.userSession.selectedExploreSpotID.isEmpty { - state.isSpotCardVisible = false - } - return .none + state.isLoadingPlaces = false + state.hasRequestedPlaces = false + state.currentPage = 1 + state.hasNextPage = true + state.pendingSelectFirstSpotFromNextPage = false + state.searchMarkerLat = nil + state.searchMarkerLon = nil + return .merge( + .cancel(id: CancelID.searchPlaces), + .send(.async(.searchPlaces(page: 1, append: false))) + ) case .categoryTapped(let category): state.selectedCategory = category - syncSelectedSpot(state: &state) - if state.userSession.selectedExploreSpotID.isEmpty { - state.isSpotCardVisible = false - } - return .none + state.isLoadingPlaces = false + state.hasRequestedPlaces = false + state.currentPage = 1 + state.hasNextPage = true + state.pendingSelectFirstSpotFromNextPage = false + state.searchMarkerLat = nil + state.searchMarkerLon = nil + return .merge( + .cancel(id: CancelID.searchPlaces), + .send(.async(.searchPlaces(page: 1, append: false))) + ) case .spotTapped(let spotID): state.$userSession.withLock { $0.selectedExploreSpotID = spotID } - state.isSpotCardVisible = true - return .none + state.isSpotCardVisible = state.spots.contains(where: { $0.id == spotID && $0.hasDetail }) + guard !state.spots.contains(where: { $0.id == spotID && $0.hasDetail }), + let markerSpot = state.spots.first(where: { $0.id == spotID }) else { + return .none + } + + state.searchMarkerLat = markerSpot.coordinate.latitude + state.searchMarkerLon = markerSpot.coordinate.longitude + state.currentPage = 1 + state.hasNextPage = true + state.pendingSelectFirstSpotFromNextPage = false + state.isLoadingPlaces = false + state.hasRequestedPlaces = false + + return .merge( + .cancel(id: CancelID.searchPlaces), + .send(.async(.searchPlaces(page: 1, append: false))) + ) case .spotCardChanged(let spotID): if let spotID { @@ -305,6 +338,13 @@ extension ExploreReducer { } return .none + case .loadNextSpotPage: + guard state.hasNextPage, !state.isLoadingPlaces else { + return .none + } + state.pendingSelectFirstSpotFromNextPage = true + return .send(.async(.searchPlaces(page: state.currentPage, append: true))) + // 길찾기 관련 액션 case .searchRouteToGangnam: guard let currentLocation = state.currentLocation else { @@ -369,27 +409,29 @@ extension ExploreReducer { await send(.inner(.resetCameraFlag)) } } - if !state.isLoadingPlaces - && ( - (state.spots.isEmpty && !state.hasRequestedPlaces) - || !state.hasFetchedPlacesWithCurrentLocation - ) { - return .send(.async(.fetchPlaces)) + if !state.hasFetchedPlacesWithCurrentLocation, + !state.isLoadingPlaces { + state.currentPage = 1 + state.hasNextPage = true + state.pendingSelectFirstSpotFromNextPage = false + return .merge( + .cancel(id: CancelID.fetchPlaces), + .cancel(id: CancelID.searchPlaces), + .send(.async(.fetchPlaces)) + ) } return .none case .locationUpdateFailed(let error): #logDebug(" [ExploreReducer] 위치 업데이트 실패: \(error)") - if state.spots.isEmpty && !state.isLoadingPlaces && !state.hasRequestedPlaces { - return .send(.async(.fetchPlaces)) - } return .none case .fetchPlacesResponse(let entities, let usedCurrentLocation): state.isLoadingPlaces = false - state.spots = entities.map(mapPlaceEntityToSpot) + state.spots = entities.spots + state.currentPage = entities.currentPage + state.hasNextPage = entities.hasNextPage state.hasFetchedPlacesWithCurrentLocation = usedCurrentLocation - syncSelectedSpot(state: &state) if state.currentLocation != nil && !usedCurrentLocation && !state.hasFetchedPlacesWithCurrentLocation { @@ -411,6 +453,90 @@ extension ExploreReducer { } return .none + case .searchPlacesResponse( + let pageEntity, + let append, + let requestedPage, + let requestedKeyword, + let requestedCategory, + let requestedMarkerLat, + let requestedMarkerLon, + let usedCurrentLocation + ): + state.isLoadingPlaces = false + state.hasRequestedPlaces = false + let currentKeyword = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) + let currentCategory: ExploreCategory? = state.selectedCategory == .all ? nil : state.selectedCategory + let currentMarkerLat = state.searchMarkerLat + let currentMarkerLon = state.searchMarkerLon + + guard requestedPage == 1 || append else { + return .none + } + + guard requestedKeyword == currentKeyword, + requestedCategory == currentCategory, + requestedMarkerLat == currentMarkerLat, + requestedMarkerLon == currentMarkerLon else { + return .none + } + + state.hasFetchedPlacesWithCurrentLocation = usedCurrentLocation + state.currentPage = pageEntity.currentPage + state.hasNextPage = pageEntity.hasNextPage + let newSpots = pageEntity.spots + let firstNewSpotID = newSpots.first(where: \.hasDetail)?.id + let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty + + state.spots = newSpots + if let selectedSpotID, + newSpots.contains(where: { $0.id == selectedSpotID && $0.hasDetail }) { + state.isSpotCardVisible = true + } else if state.searchMarkerLat != nil { + state.isSpotCardVisible = false + } else { + state.isSpotCardVisible = false + state.$userSession.withLock { + $0.selectedExploreSpotID = "" + } + } + + if state.pendingSelectFirstSpotFromNextPage, let firstNewSpotID { + state.$userSession.withLock { + $0.selectedExploreSpotID = firstNewSpotID + } + state.isSpotCardVisible = true + } + + state.pendingSelectFirstSpotFromNextPage = false + syncSelectedSpot(state: &state) + + if let selectedSpotID, + state.searchMarkerLat != nil, + !state.spots.contains(where: { $0.id == selectedSpotID }), + state.hasNextPage { + return .send(.async(.searchPlaces(page: state.currentPage, append: true))) + } + + if let selectedSpotID, + state.searchMarkerLat != nil, + !state.spots.contains(where: { $0.id == selectedSpotID }), + !state.hasNextPage { + state.isSpotCardVisible = false + state.$userSession.withLock { + $0.selectedExploreSpotID = "" + } + } + + return .none + + case .searchPlacesFailed(let message): + state.isLoadingPlaces = false + state.hasRequestedPlaces = false + state.pendingSelectFirstSpotFromNextPage = false + #logDebug(" [ExploreReducer] 장소 검색 실패: \(message)") + return .none + // 길찾기 관련 액션 case .routeSearchStarted(let destination): state.selectedDestination = destination @@ -453,7 +579,7 @@ extension ExploreReducer { Task { try await Task.sleep(for: .seconds(1)) - await send(.async(.startLocationUpdates)) + send(.async(.startLocationUpdates)) } } } @@ -466,13 +592,13 @@ extension ExploreReducer { await MainActor.run { locationManager.onLocationUpdate = { location in Task { @MainActor in - await send(.inner(.locationUpdated(location))) + send(.inner(.locationUpdated(location))) } } locationManager.onLocationError = { error in Task { @MainActor in - await send(.inner(.locationUpdateFailed(error.localizedDescription))) + send(.inner(.locationUpdateFailed(error.localizedDescription))) } } } @@ -534,7 +660,7 @@ extension ExploreReducer { return .run { send in let result = await Result { - try await placeUseCase.fetchPlaces( + try await placeUseCase.fetchInitialExploreSpots( userSession: userSession, userLat: userLat, userLon: userLon @@ -550,6 +676,67 @@ extension ExploreReducer { } .cancellable(id: CancelID.fetchPlaces, cancelInFlight: true) + case .searchPlaces(let page, let append): + guard Int(state.userSession.travelID) != nil, + !state.isLoadingPlaces, + !state.hasRequestedPlaces else { + return .none + } + + state.isLoadingPlaces = true + state.hasRequestedPlaces = true + let userSession = state.userSession + let fallbackLat = state.userSession.travelStationLat ?? 0 + let fallbackLng = state.userSession.travelStationLng ?? 0 + let userLat = state.currentLocation?.coordinate.latitude ?? fallbackLat + let userLon = state.currentLocation?.coordinate.longitude ?? fallbackLng + let markerLat = state.searchMarkerLat ?? state.userSession.travelStationLat ?? fallbackLat + let markerLon = state.searchMarkerLon ?? state.userSession.travelStationLng ?? fallbackLng + let requestedMarkerLat = state.searchMarkerLat + let requestedMarkerLon = state.searchMarkerLon + let rawKeyword = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) + let keyword = rawKeyword.nilIfEmpty + let category: ExploreCategory? = state.selectedCategory == .all ? nil : state.selectedCategory + let usedCurrentLocation = state.currentLocation != nil + let baseSpots = state.spots + + return .run { send in + let result = await Result { + try await placeUseCase.searchExploreSpots( + baseSpots: baseSpots, + userSession: userSession, + userLat: userLat, + userLon: userLon, + keyword: keyword, + category: category, + markerLat: markerLat, + markerLon: markerLon, + page: page + ) + } + + switch result { + case .success(let entity): + await send( + .inner( + .searchPlacesResponse( + entity, + append: append, + requestedPage: page, + requestedKeyword: rawKeyword, + requestedCategory: category, + requestedMarkerLat: requestedMarkerLat, + requestedMarkerLon: requestedMarkerLon, + usedCurrentLocation: usedCurrentLocation + ) + ) + ) + case .failure(let error): + await send(.inner(.searchPlacesFailed(error.localizedDescription))) + } + } + .cancellable(id: CancelID.searchPlaces, cancelInFlight: true) + // 길찾기 관련 액션 case .searchRoute(let from, let destination): return .run { send in @@ -612,23 +799,6 @@ extension ExploreReducer { } } -private extension ExploreReducer { - func mapPlaceEntityToSpot(_ entity: PlaceEntity) -> ExploreMapSpot { - ExploreMapSpot( - id: entity.stationId, - name: entity.name, - category: entity.category, - coordinate: CLLocationCoordinate2D(latitude: entity.lat, longitude: entity.lon), - badgeText: "\(entity.stayableMinutes)분 체류 가능", - subtitle: entity.category.title, - statusText: "", - closingText: entity.address, - distanceText: "", - walkTimeText: "" - ) - } -} - // MARK: - ExploreReducer.State + Hashable extension ExploreReducer.State: Hashable { public func hash(into hasher: inout Hasher) { @@ -651,3 +821,25 @@ private extension String { isEmpty ? nil : self } } + +extension ExploreReducer.AsyncAction { + public static func == (lhs: Self, rhs: Self) -> Bool { + switch (lhs, rhs) { + case (.requestLocationPermission, .requestLocationPermission), + (.requestFullAccuracy, .requestFullAccuracy), + (.startLocationUpdates, .startLocationUpdates), + (.stopLocationUpdates, .stopLocationUpdates), + (.requestCurrentLocation, .requestCurrentLocation), + (.fetchPlaces, .fetchPlaces): + return true + case (.searchPlaces(let lhsPage, let lhsAppend), .searchPlaces(let rhsPage, let rhsAppend)): + return lhsPage == rhsPage && lhsAppend == rhsAppend + case (.searchRoute(let lhsFrom, let lhsTo), .searchRoute(let rhsFrom, let rhsTo)): + return lhsFrom.latitude == rhsFrom.latitude + && lhsFrom.longitude == rhsFrom.longitude + && lhsTo == rhsTo + default: + return false + } + } +} diff --git a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift index 503863c..7616137 100644 --- a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift +++ b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift @@ -67,7 +67,7 @@ private extension ExploreView { currentLocation: store.currentLocation, routeInfo: store.routeInfo, destination: store.selectedDestination, - spots: filteredSpots, + spots: store.spots, selectedSpotID: store.userSession.selectedExploreSpotID.isEmpty ? nil : store.userSession.selectedExploreSpotID, @@ -86,19 +86,46 @@ private extension ExploreView { let query = store.searchText.trimmingCharacters(in: .whitespacesAndNewlines) return store.spots.filter { spot in + let hasDetail = spot.hasDetail let matchesCategory = store.selectedCategory == .all || spot.category == store.selectedCategory let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) - return matchesCategory && matchesQuery + return hasDetail && matchesCategory && matchesQuery } } + func mergedSpot(for spotID: String) -> ExploreMapSpot? { + if let placeIDMatchedSpot = store.spots.first(where: { $0.id == spotID && $0.hasDetail }) { + return placeIDMatchedSpot + } + + return nil + } + + var cardSpots: [ExploreMapSpot] { + let selectedSpotID = store.userSession.selectedExploreSpotID + + guard !selectedSpotID.isEmpty else { + return filteredSpots + } + + if filteredSpots.contains(where: { $0.id == selectedSpotID }) { + return filteredSpots + } + + if let selectedSearchSpot = mergedSpot(for: selectedSpotID) { + return [selectedSearchSpot] + filteredSpots + } + + return filteredSpots + } + var selectedSpot: ExploreMapSpot? { guard store.isSpotCardVisible else { return nil } let selectedSpotID = store.userSession.selectedExploreSpotID if !selectedSpotID.isEmpty, - let selectedSpot = filteredSpots.first(where: { $0.id == selectedSpotID }) { + let selectedSpot = mergedSpot(for: selectedSpotID) { return selectedSpot } @@ -235,18 +262,14 @@ private extension ExploreView { } func moveSelectedSpot(next: Bool) { - guard !filteredSpots.isEmpty else { return } + guard !cardSpots.isEmpty else { return } guard !isCardTransitioning else { return } - let currentIndex = filteredSpots.firstIndex(where: { $0.id == store.userSession.selectedExploreSpotID }) ?? 0 - let newIndex: Int + let currentSelectedID = selectedSpot?.id ?? store.userSession.selectedExploreSpotID + let currentIndex = cardSpots.firstIndex(where: { $0.id == currentSelectedID }) ?? 0 let entryOffset: CGFloat = next ? -cardTravelDistance : cardTravelDistance - - if next { - newIndex = (currentIndex + 1) % filteredSpots.count - } else { - newIndex = (currentIndex - 1 + filteredSpots.count) % filteredSpots.count - } + let isAtEnd = next && currentIndex == cardSpots.count - 1 + let isAtStart = !next && currentIndex == 0 isCardTransitioning = true @@ -255,7 +278,19 @@ private extension ExploreView { } DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - _ = store.send(.view(.spotCardChanged(filteredSpots[newIndex].id))) + if isAtEnd { + if store.hasNextPage { + _ = store.send(.view(.loadNextSpotPage)) + } else { + _ = store.send(.view(.spotCardChanged(cardSpots[0].id))) + } + } else if isAtStart { + _ = store.send(.view(.spotCardChanged(cardSpots[cardSpots.count - 1].id))) + } else { + let newIndex = next ? currentIndex + 1 : currentIndex - 1 + _ = store.send(.view(.spotCardChanged(cardSpots[newIndex].id))) + } + cardBaseOffset = entryOffset cardDragOffset = 0 @@ -294,7 +329,8 @@ private extension ExploreView { } var adjacentSpot: ExploreMapSpot? { - guard let currentIndex = filteredSpots.firstIndex(where: { $0.id == store.userSession.selectedExploreSpotID }) else { + let currentSelectedID = selectedSpot?.id ?? store.userSession.selectedExploreSpotID + guard let currentIndex = cardSpots.firstIndex(where: { $0.id == currentSelectedID }) else { return nil } guard abs(cardDragOffset) > 0 else { @@ -303,11 +339,11 @@ private extension ExploreView { let adjacentIndex: Int if cardDragOffset >= 0 { - adjacentIndex = (currentIndex + 1) % filteredSpots.count + adjacentIndex = (currentIndex + 1) % cardSpots.count } else { - adjacentIndex = (currentIndex - 1 + filteredSpots.count) % filteredSpots.count + adjacentIndex = (currentIndex - 1 + cardSpots.count) % cardSpots.count } - return filteredSpots[adjacentIndex] + return cardSpots[adjacentIndex] } var adjacentCardOffset: CGFloat? { diff --git a/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift b/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift index e54fc10..05759b1 100644 --- a/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift +++ b/Projects/Presentation/Home/Sources/Main/Reducer/HomeFeature.swift @@ -257,7 +257,7 @@ extension HomeFeature { case .departureTimeChanged(let date): state.currentTime = now - state.departureTime = date + state.departureTime = date.normalizedDepartureTime(from: state.currentTime) state.departureTimePickerVisible = false state.isDepartureTimeSet = true state.$userSession.withLock { @@ -400,12 +400,16 @@ extension HomeFeature { } extension HomeFeature.State { + var maxDepartureTime: Date { + Calendar.current.date(byAdding: .day, value: 1, to: currentTime) ?? currentTime + } + var remainingTotalMinutes: Int { (remainingTime.hour ?? 0) * 60 + (remainingTime.minute ?? 0) } var isStationReady: Bool { - hasSelectedStation || selectedStation == .seoul + hasSelectedStation } var isExploreNearbyEnabled: Bool { @@ -441,6 +445,31 @@ extension HomeFeature.State { } } +private extension Date { + func normalizedDepartureTime(from currentTime: Date) -> Date { + let calendar = Calendar.current + let currentDateComponents = calendar.dateComponents([.year, .month, .day], from: currentTime) + let selectedTimeComponents = calendar.dateComponents([.hour, .minute], from: self) + + var normalizedComponents = DateComponents() + normalizedComponents.year = currentDateComponents.year + normalizedComponents.month = currentDateComponents.month + normalizedComponents.day = currentDateComponents.day + normalizedComponents.hour = selectedTimeComponents.hour + normalizedComponents.minute = selectedTimeComponents.minute + + guard let normalizedDate = calendar.date(from: normalizedComponents) else { + return self + } + + if normalizedDate < currentTime { + return calendar.date(byAdding: .day, value: 1, to: normalizedDate) ?? normalizedDate + } + + return normalizedDate + } +} + // MARK: - HomeReducer.State + Hashable extension HomeFeature.State: Hashable { public func hash(into hasher: inout Hasher) { diff --git a/Projects/Presentation/Home/Sources/Main/View/HomeView.swift b/Projects/Presentation/Home/Sources/Main/View/HomeView.swift index 704f350..b78c874 100644 --- a/Projects/Presentation/Home/Sources/Main/View/HomeView.swift +++ b/Projects/Presentation/Home/Sources/Main/View/HomeView.swift @@ -214,7 +214,7 @@ extension HomeView { DatePicker( HomeFeature.Strings.departureTimeSelection, selection: $store.departureTime, - in: store.currentTime..., + in: store.currentTime...store.maxDepartureTime, displayedComponents: [.hourAndMinute] ) .datePickerStyle(.wheel) diff --git a/Projects/Presentation/Splash/Sources/View/SplashView.swift b/Projects/Presentation/Splash/Sources/View/SplashView.swift index 42e6947..d1d3e77 100644 --- a/Projects/Presentation/Splash/Sources/View/SplashView.swift +++ b/Projects/Presentation/Splash/Sources/View/SplashView.swift @@ -18,7 +18,7 @@ public struct SplashView: View { @State private var symbolScaleY: CGFloat = 1.0 @State private var symbolRotation: Double = 0 @State private var symbolOffsetX: CGFloat = 0 - @State private var symbolOpacity: Double = 0.18 + @State private var symbolOpacity: Double = 1 @State private var wordmarkOpacity: Double = 0 @State private var wordmarkOffsetX: CGFloat = 14 @@ -75,39 +75,31 @@ private extension SplashView { symbolScaleY = 1.0 symbolRotation = 0 symbolOffsetX = 0 - symbolOpacity = 0.18 + symbolOpacity = 1 wordmarkOpacity = 0 wordmarkOffsetX = 14 - withAnimation(.easeOut(duration: 0.3).delay(0.12)) { - symbolOpacity = 1 + withAnimation(.easeInOut(duration: 0.32).delay(0.28)) { + symbolRotation = 24 } - withAnimation(.easeInOut(duration: 0.18).delay(0.46)) { - symbolRotation = -18 - symbolScaleX = 1.16 - symbolScaleY = 0.84 - } - - withAnimation(.spring(response: 0.22, dampingFraction: 0.86).delay(0.66)) { + withAnimation(.spring(response: 0.28, dampingFraction: 0.82).delay(0.82)) { symbolRotation = 0 - symbolScaleX = 1.0 - symbolScaleY = 1.0 } - withAnimation(.easeInOut(duration: 0.26).delay(0.84)) { + withAnimation(.easeInOut(duration: 0.26).delay(1.28)) { symbolScale = Constants.symbolSmallSize.width / Constants.symbolLargeSize.width } - withAnimation(.easeInOut(duration: 0.26).delay(1.16)) { + withAnimation(.easeInOut(duration: 0.26).delay(1.78)) { symbolOffsetX = -54 } - withAnimation(.easeOut(duration: 0.12).delay(1.34)) { + withAnimation(.easeOut(duration: 0.12).delay(1.96)) { symbolOpacity = 0 } - withAnimation(.easeOut(duration: 0.2).delay(1.42)) { + withAnimation(.easeOut(duration: 0.2).delay(2.04)) { wordmarkOpacity = 1 wordmarkOffsetX = 0 } diff --git a/Projects/Shared/Utill/Sources/String/String+.swift b/Projects/Shared/Utill/Sources/String/String+.swift index df54bc9..c03b336 100644 --- a/Projects/Shared/Utill/Sources/String/String+.swift +++ b/Projects/Shared/Utill/Sources/String/String+.swift @@ -138,4 +138,12 @@ public extension String { return iso.date(from: fixed) }() } + + func formattedClosingTimeText() -> String { + if let time = self.split(separator: " ").last { + let hhmm = String(time.prefix(5)) + return "\(hhmm)에 영업종료" + } + return self + } } From 2748a90971828f3182bb23f910d6c9a50378b11b Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 02:28:37 +0900 Subject: [PATCH 11/35] =?UTF-8?q?feat:=20=ED=83=90=EC=83=89=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B7=B0=20=EB=B0=8F=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=ED=91=9C=EC=8B=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extension+TargetDependencySPM.swift | 1 + .../Sources/Place/DTO/PlaceDTOModel.swift | 71 +++- .../Sources/Place/Mapper/PlaceDTOModel+.swift | 2 + .../Sources/Place/PlaceRepositoryImpl.swift | 1 + .../Sources/Explore/ExploreMapSpot.swift | 5 + .../Entity/Sources/Place/PlaceEntity.swift | 3 + .../Entity/Sources/Place/PlaceInput.swift | 3 + .../Sources/Place/PlaceUseCaseImpl.swift | 9 + Projects/Presentation/Home/Project.swift | 1 + .../Coordinator/Reducer/HomeCoordinator.swift | 10 + .../View/HomeCoordinatorView.swift | 8 + .../Components/ExploreSearchHeaderView.swift | 135 +++++++ .../ExploreSelectedSpotCardView.swift | 51 ++- .../Components/ExploreSpotListCardView.swift | 135 +++++++ .../Explore/Reducer/ExploreReducer.swift | 368 +++++++++++++++--- .../Sources/Explore/View/ExploreView.swift | 291 ++------------ .../Reducer/ExploreListFeature.swift | 264 +++++++++++++ .../ExploreList/View/ExploreListView.swift | 124 ++++++ Tuist/Package.swift | 1 + 19 files changed, 1154 insertions(+), 329 deletions(-) create mode 100644 Projects/Presentation/Home/Sources/Explore/Components/ExploreSearchHeaderView.swift create mode 100644 Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift create mode 100644 Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift create mode 100644 Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift diff --git a/Plugins/DependencyPackagePlugin/ProjectDescriptionHelpers/DependencyPackage/Extension+TargetDependencySPM.swift b/Plugins/DependencyPackagePlugin/ProjectDescriptionHelpers/DependencyPackage/Extension+TargetDependencySPM.swift index 8132d0b..8d324b9 100644 --- a/Plugins/DependencyPackagePlugin/ProjectDescriptionHelpers/DependencyPackage/Extension+TargetDependencySPM.swift +++ b/Plugins/DependencyPackagePlugin/ProjectDescriptionHelpers/DependencyPackage/Extension+TargetDependencySPM.swift @@ -10,6 +10,7 @@ import ProjectDescription public extension TargetDependency.SPM { static let asyncMoya = TargetDependency.external(name: "AsyncMoya", condition: .none) static let composableArchitecture = TargetDependency.external(name: "ComposableArchitecture", condition: .none) + static let kingfisher = TargetDependency.external(name: "Kingfisher", condition: .none) static let tcaCoordinator = TargetDependency.external(name: "TCACoordinators", condition: .none) static let weaveDI = TargetDependency.external(name: "WeaveDI", condition: .none) diff --git a/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift b/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift index a2b842f..ff7ddfa 100644 --- a/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift +++ b/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift @@ -19,13 +19,14 @@ public struct PlaceResponseDTOModel: Decodable, Equatable { public let lon: Double public let name: String? public let address: String? + public let imageURL: String? public let stayableMinutes: Int? public let isOpen: Bool? public let closingTime: String? enum CodingKeys: String, CodingKey { case placeID = "placeId" - case category, lat, lon, name, address, stayableMinutes, isOpen, closingTime + case category, lat, lon, name, address, imageURL = "imageUrl", stayableMinutes, isOpen, closingTime } } @@ -39,6 +40,23 @@ public struct PlaceSearchPageResponseDTO: Decodable, Equatable { public let number: Int public let sort: PlaceSortResponseDTO public let empty: Bool + + enum CodingKeys: String, CodingKey { + case pageable, last, numberOfElements, first, size, content, number, sort, empty + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.pageable = try container.decodeIfPresent(PlacePageableResponseDTO.self, forKey: .pageable) ?? .init() + self.last = try container.decodeIfPresent(Bool.self, forKey: .last) ?? false + self.numberOfElements = try container.decodeIfPresent(Int.self, forKey: .numberOfElements) ?? 0 + self.first = try container.decodeIfPresent(Bool.self, forKey: .first) ?? true + self.size = try container.decodeIfPresent(Int.self, forKey: .size) ?? 0 + self.content = try container.decodeIfPresent([PlaceResponseDTOModel].self, forKey: .content) ?? [] + self.number = try container.decodeIfPresent(Int.self, forKey: .number) ?? 0 + self.sort = try container.decodeIfPresent(PlaceSortResponseDTO.self, forKey: .sort) ?? .init() + self.empty = try container.decodeIfPresent(Bool.self, forKey: .empty) ?? self.content.isEmpty + } } public struct PlacePageableResponseDTO: Decodable, Equatable { @@ -48,10 +66,61 @@ public struct PlacePageableResponseDTO: Decodable, Equatable { public let pageSize: Int public let offset: Int public let sort: PlaceSortResponseDTO + + enum CodingKeys: String, CodingKey { + case unpaged, paged, pageNumber, pageSize, offset, sort + } + + public init( + unpaged: Bool = false, + paged: Bool = true, + pageNumber: Int = 0, + pageSize: Int = 10, + offset: Int = 0, + sort: PlaceSortResponseDTO = .init() + ) { + self.unpaged = unpaged + self.paged = paged + self.pageNumber = pageNumber + self.pageSize = pageSize + self.offset = offset + self.sort = sort + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.unpaged = try container.decodeIfPresent(Bool.self, forKey: .unpaged) ?? false + self.paged = try container.decodeIfPresent(Bool.self, forKey: .paged) ?? true + self.pageNumber = try container.decodeIfPresent(Int.self, forKey: .pageNumber) ?? 0 + self.pageSize = try container.decodeIfPresent(Int.self, forKey: .pageSize) ?? 10 + self.offset = try container.decodeIfPresent(Int.self, forKey: .offset) ?? 0 + self.sort = try container.decodeIfPresent(PlaceSortResponseDTO.self, forKey: .sort) ?? .init() + } } public struct PlaceSortResponseDTO: Decodable, Equatable { public let unsorted: Bool public let sorted: Bool public let empty: Bool + + public init( + unsorted: Bool = true, + sorted: Bool = false, + empty: Bool = true + ) { + self.unsorted = unsorted + self.sorted = sorted + self.empty = empty + } + + enum CodingKeys: String, CodingKey { + case unsorted, sorted, empty + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.unsorted = try container.decodeIfPresent(Bool.self, forKey: .unsorted) ?? true + self.sorted = try container.decodeIfPresent(Bool.self, forKey: .sorted) ?? false + self.empty = try container.decodeIfPresent(Bool.self, forKey: .empty) ?? true + } } diff --git a/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift b/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift index a080ad4..1b56b2a 100644 --- a/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift +++ b/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift @@ -19,6 +19,7 @@ public extension PlaceResponseDTOModel { lat: lat, lon: lon, address: address ?? "", + imageURL: imageURL, stayableMinutes: stayableMinutes ?? 0, isOpen: isOpen ?? false, closingTime: closingTime @@ -33,6 +34,7 @@ public extension PlaceResponseDTOModel { lat: lon, lon: lat, address: address ?? "", + imageURL: imageURL, stayableMinutes: stayableMinutes ?? 0, isOpen: isOpen ?? false, closingTime: closingTime diff --git a/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift b/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift index 0093015..46ba603 100644 --- a/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift +++ b/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift @@ -51,6 +51,7 @@ public final class PlaceRepositoryImpl: PlaceInterface, @unchecked Sendable { remainingMinutes: input.remainingMinutes, keyword: input.keyword, category: input.category, + sortBy: input.sortBy, markerLat: input.markerLat, markerLon: input.markerLon, pageable: .init(page: input.page, size: input.size) diff --git a/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift b/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift index 299cd02..2430cf9 100644 --- a/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift +++ b/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift @@ -14,6 +14,7 @@ public struct ExploreMapSpot: Identifiable { public let category: ExploreCategory public let coordinate: CLLocationCoordinate2D public let hasDetail: Bool + public let imageURL: String? public let badgeText: String public let subtitle: String public let statusText: String @@ -27,6 +28,7 @@ public struct ExploreMapSpot: Identifiable { category: ExploreCategory, coordinate: CLLocationCoordinate2D, hasDetail: Bool = false, + imageURL: String? = nil, badgeText: String, subtitle: String, statusText: String, @@ -39,6 +41,7 @@ public struct ExploreMapSpot: Identifiable { self.category = category self.coordinate = coordinate self.hasDetail = hasDetail + self.imageURL = imageURL self.badgeText = badgeText self.subtitle = subtitle self.statusText = statusText @@ -56,6 +59,7 @@ extension ExploreMapSpot: Equatable { && lhs.coordinate.latitude == rhs.coordinate.latitude && lhs.coordinate.longitude == rhs.coordinate.longitude && lhs.hasDetail == rhs.hasDetail + && lhs.imageURL == rhs.imageURL && lhs.badgeText == rhs.badgeText && lhs.subtitle == rhs.subtitle && lhs.statusText == rhs.statusText @@ -73,6 +77,7 @@ extension ExploreMapSpot: Hashable { hasher.combine(coordinate.latitude) hasher.combine(coordinate.longitude) hasher.combine(hasDetail) + hasher.combine(imageURL) hasher.combine(badgeText) hasher.combine(subtitle) hasher.combine(statusText) diff --git a/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift b/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift index 4121b2f..3e0f6ab 100644 --- a/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift +++ b/Projects/Domain/Entity/Sources/Place/PlaceEntity.swift @@ -13,6 +13,7 @@ public struct PlaceEntity: Equatable { public let category: ExploreCategory public let address: String public let lat, lon: Double + public let imageURL: String? public let stayableMinutes: Int public let isOpen: Bool public let closingTime: String? @@ -24,6 +25,7 @@ public struct PlaceEntity: Equatable { lat: Double, lon: Double, address: String = "", + imageURL: String? = nil, stayableMinutes: Int = 0, isOpen: Bool = false, closingTime: String? = nil @@ -34,6 +36,7 @@ public struct PlaceEntity: Equatable { self.lat = lat self.lon = lon self.address = address + self.imageURL = imageURL self.stayableMinutes = stayableMinutes self.isOpen = isOpen self.closingTime = closingTime diff --git a/Projects/Domain/Entity/Sources/Place/PlaceInput.swift b/Projects/Domain/Entity/Sources/Place/PlaceInput.swift index 620cf31..e618e2b 100644 --- a/Projects/Domain/Entity/Sources/Place/PlaceInput.swift +++ b/Projects/Domain/Entity/Sources/Place/PlaceInput.swift @@ -39,6 +39,7 @@ public struct PlaceSearchInput: Equatable { public let remainingMinutes: Int public let keyword: String? public let category: String? + public let sortBy: String public let markerLat: Double? public let markerLon: Double? public let page: Int @@ -51,6 +52,7 @@ public struct PlaceSearchInput: Equatable { remainingMinutes: Int, keyword: String? = nil, category: String? = nil, + sortBy: String = "MARKER_NEAREST", markerLat: Double? = nil, markerLon: Double? = nil, page: Int = 1, @@ -62,6 +64,7 @@ public struct PlaceSearchInput: Equatable { self.remainingMinutes = remainingMinutes self.keyword = keyword self.category = category + self.sortBy = sortBy self.markerLat = markerLat self.markerLon = markerLon self.page = page diff --git a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift index b215381..2519c43 100644 --- a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift +++ b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift @@ -31,6 +31,7 @@ public protocol PlaceUseCaseInterface: Sendable { userLon: Double, keyword: String?, category: ExploreCategory?, + sortBy: String, markerLat: Double?, markerLon: Double?, page: Int @@ -43,6 +44,7 @@ public protocol PlaceUseCaseInterface: Sendable { userLon: Double, keyword: String?, category: ExploreCategory?, + sortBy: String, markerLat: Double?, markerLon: Double?, page: Int @@ -91,6 +93,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { remainingMinutes: 250, keyword: nil, category: nil, + sortBy: "MARKER_NEAREST", markerLat: userSession.travelStationLat, markerLon: userSession.travelStationLng, page: 1, @@ -124,6 +127,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { userLon: Double, keyword: String?, category: ExploreCategory?, + sortBy: String = "MARKER_NEAREST", markerLat: Double?, markerLon: Double?, page: Int @@ -135,6 +139,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { remainingMinutes: 250, keyword: keyword, category: mapCategory(category), + sortBy: sortBy, markerLat: markerLat, markerLon: markerLon, page: page, @@ -151,6 +156,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { userLon: Double, keyword: String?, category: ExploreCategory?, + sortBy: String = "MARKER_NEAREST", markerLat: Double?, markerLon: Double?, page: Int @@ -162,6 +168,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { remainingMinutes: 250, keyword: keyword, category: mapCategory(category), + sortBy: sortBy, markerLat: markerLat, markerLon: markerLon, page: page, @@ -206,6 +213,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { category: entity.category, coordinate: CLLocationCoordinate2D(latitude: entity.lat, longitude: entity.lon), hasDetail: false, + imageURL: entity.imageURL, badgeText: "", subtitle: entity.category.title, statusText: "", @@ -252,6 +260,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { category: entity.category, coordinate: coordinate, hasDetail: true, + imageURL: entity.imageURL, badgeText: entity.stayableMinutes > 0 ? "\(entity.stayableMinutes)분 체류 가능" : "", subtitle: entity.category.title, statusText: entity.isOpen ? "영업 중" : "영업 종료", diff --git a/Projects/Presentation/Home/Project.swift b/Projects/Presentation/Home/Project.swift index cfb4df4..5935922 100644 --- a/Projects/Presentation/Home/Project.swift +++ b/Projects/Presentation/Home/Project.swift @@ -14,6 +14,7 @@ let project = Project.makeModule( .Domain(implements: .UseCase), .Shared(implements: .Shared), .SPM.composableArchitecture, + .SPM.kingfisher, .SPM.tcaCoordinator, .Presentation(implements: .Profile), .xcframework(path: "./Resources/framework/NMapsMap.xcframework"), diff --git a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift index 1e84c41..f7bd30b 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift @@ -49,6 +49,7 @@ public struct HomeCoordinator { case presentProfile case presentProfileWithAnimation case presentExplore + case presentExploreList } // MARK: - NavigationAction @@ -98,6 +99,10 @@ extension HomeCoordinator { case .routeAction(id: _, action: .home(.delegate(.presentAuth))): return .send(.navigation(.presentAuth)) + case let .routeAction(id: id, action: .explore(.delegate(.presentExploreList))): + return .send(.inner(.presentExploreList)) + + case .routeAction(id: _, action: .profile(.navigation(.presentRoot))): return .send(.view(.backAction)) @@ -161,6 +166,10 @@ extension HomeCoordinator { case .presentExplore: state.routes.push(.explore(.init())) return .none + + case .presentExploreList: + state.routes.push(.exploreList(.init())) + return .none } } @@ -171,6 +180,7 @@ extension HomeCoordinator { public enum HomeScreen { case home(HomeFeature) case explore(ExploreReducer) + case exploreList(ExploreListFeature) case profile(ProfileCoordinator) } } diff --git a/Projects/Presentation/Home/Sources/Coordinator/View/HomeCoordinatorView.swift b/Projects/Presentation/Home/Sources/Coordinator/View/HomeCoordinatorView.swift index ca20df5..d72cdcb 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/View/HomeCoordinatorView.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/View/HomeCoordinatorView.swift @@ -36,6 +36,14 @@ public struct HomeCoordinatorView: View { removal: .move(edge: .top).combined(with: .opacity) )) + case .exploreList(let exploreListStore): + ExploreListView(store: exploreListStore) + .navigationBarBackButtonHidden() + .transition(.asymmetric( + insertion: .move(edge: .trailing).combined(with: .opacity), + removal: .move(edge: .leading).combined(with: .opacity) + )) + case .profile(let profileStore): ProfileCoordinatorView(store: profileStore) .navigationBarBackButtonHidden() diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSearchHeaderView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSearchHeaderView.swift new file mode 100644 index 0000000..81c6504 --- /dev/null +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSearchHeaderView.swift @@ -0,0 +1,135 @@ +// +// ExploreSearchHeaderView.swift +// Home +// + +import SwiftUI + +import DesignSystem +import Entity + +struct ExploreSearchHeaderView: View { + let stationName: String + let searchText: String + let selectedCategory: ExploreCategory + let onBackTap: () -> Void + let onSearchTextChanged: (String) -> Void + let onCategoryTap: (ExploreCategory) -> Void + + var body: some View { + VStack(spacing: 0) { + HStack(spacing: 10) { + backButton() + searchBar() + } + + categoryScrollView() + .padding(.top, 10) + } + } + + @ViewBuilder + private func backButton() -> some View { + Button(action: onBackTap) { + Image(asset: .leftArrow) + .resizable() + .scaledToFit() + .frame(width: 48, height: 48) + .background(.staticWhite) + .clipShape(Circle()) + .shadow(color: .black.opacity(0.05), radius: 10, y: 2) + } + .buttonStyle(.plain) + } + + @ViewBuilder + private func searchBar() -> some View { + HStack(spacing: 8) { + Image(systemName: "magnifyingglass") + .font(.system(size: 16, weight: .medium)) + .foregroundStyle(.gray600) + + ZStack(alignment: .leading) { + if searchText.isEmpty { + Text("\(stationName)역") + .pretendardCustomFont(textStyle: .titleRegular) + .foregroundStyle(.gray600) + } + + TextField( + "", + text: Binding( + get: { searchText }, + set: onSearchTextChanged + ) + ) + .pretendardCustomFont(textStyle: .titleRegular) + .foregroundStyle(.staticBlack) + .textInputAutocapitalization(.never) + .autocorrectionDisabled() + } + } + .padding(.horizontal, 24) + .frame(height: 48) + .background(.staticWhite) + .clipShape(RoundedRectangle(cornerRadius: 18)) + .shadow(color: .black.opacity(0.04), radius: 8, y: 2) + } + + @ViewBuilder + private func categoryScrollView() -> some View { + ScrollViewReader { proxy in + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 8) { + ForEach(ExploreCategory.allCases, id: \.self) { category in + ExploreCategoryChipView( + category: category, + isSelected: selectedCategory == category, + action: { onCategoryTap(category) } + ) + .id(category) + } + } + .padding(.horizontal, 2) + } + .onAppear { + scrollToCategory(selectedCategory, with: proxy, animated: false) + } + .onChange(of: selectedCategory) { _, category in + DispatchQueue.main.async { + scrollToCategory(category, with: proxy) + } + } + } + } + + private func scrollToCategory( + _ category: ExploreCategory, + with proxy: ScrollViewProxy, + animated: Bool = true + ) { + let targetCategory: ExploreCategory + switch category { + case .all, .cafe: + targetCategory = .all + case .restaurant: + targetCategory = .cafe + case .activity: + targetCategory = .restaurant + case .etc: + targetCategory = .activity + } + + let action = { + proxy.scrollTo(targetCategory, anchor: .leading) + } + + if animated { + withAnimation(.easeInOut(duration: 0.2)) { + action() + } + } else { + action() + } + } +} diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift index a7d6118..1aee5e5 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift @@ -7,6 +7,7 @@ import SwiftUI import DesignSystem import Entity +import Kingfisher struct ExploreSelectedSpotCardView: View { let currentSpot: ExploreMapSpot @@ -88,7 +89,7 @@ struct ExploreSelectedSpotCardView: View { if !spot.distanceText.isEmpty { Text(spot.distanceText) .pretendardCustomFont(textStyle: .bodyBold) - .foregroundStyle(.gray650) + .foregroundStyle(.staticBlack) } if !spot.walkTimeText.isEmpty { @@ -102,9 +103,7 @@ struct ExploreSelectedSpotCardView: View { } .frame(maxWidth: .infinity, alignment: .leading) - RoundedRectangle(cornerRadius: 18) - .fill(.gray200) - .frame(width: 88, height: 88) + spotImage(for: spot) } .padding(.horizontal, 16) .padding(.top, 16) @@ -130,4 +129,48 @@ struct ExploreSelectedSpotCardView: View { transaction.animation = nil } } + + @ViewBuilder + private func spotImage(for spot: ExploreMapSpot) -> some View { + if let url = imageURL(for: spot) { + KFImage(url) + .placeholder { + imagePlaceholder() + } + .cancelOnDisappear(true) + .fade(duration: 0.2) + .resizable() + .scaledToFill() + .frame(width: 92, height: 112) + .clipShape(RoundedRectangle(cornerRadius: 16)) + } else { + imagePlaceholder() + } + } + + private func imageURL(for spot: ExploreMapSpot) -> URL? { + guard let imageURL = spot.imageURL?.trimmingCharacters(in: .whitespacesAndNewlines), + !imageURL.isEmpty else { + return nil + } + + if let url = URL(string: imageURL) { + return url + } + + let encoded = imageURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) + return encoded.flatMap(URL.init(string:)) + } + + private func imagePlaceholder() -> some View { + ZStack { + RoundedRectangle(cornerRadius: 16) + .fill(.gray200) + + Image(systemName: "photo") + .font(.system(size: 24, weight: .medium)) + .foregroundStyle(.gray500) + } + .frame(width: 92, height: 112) + } } diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift new file mode 100644 index 0000000..543e4f9 --- /dev/null +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift @@ -0,0 +1,135 @@ +// +// ExploreSpotListCardView.swift +// Home +// + +import SwiftUI + +import DesignSystem +import Entity +import Kingfisher + +struct ExploreSpotListCardView: View { + let spot: ExploreMapSpot + + var body: some View { + HStack(alignment: .top, spacing: 14) { + VStack(alignment: .leading, spacing: 0) { + if !spot.badgeText.isEmpty { + Text(spot.badgeText) + .pretendardCustomFont(textStyle: .caption) + .foregroundStyle(.orange800) + .padding(.horizontal, 8) + .padding(.vertical, 2) + .background(.orange200) + .clipShape(Capsule()) + .padding(.bottom, 12) + } + + HStack(alignment: .lastTextBaseline, spacing: 6) { + Text(spot.name) + .pretendardFont(family: .SemiBold, size: 17) + .foregroundStyle(.staticBlack) + .lineLimit(2) + .layoutPriority(1) + + Text(spot.subtitle) + .pretendardCustomFont(textStyle: .caption) + .foregroundStyle(.gray500) + .lineLimit(1) + .fixedSize() + } + .padding(.bottom, 8) + + HStack(spacing: 10) { + if !spot.statusText.isEmpty { + Text(spot.statusText) + .pretendardCustomFont(textStyle: .body2Medium) + .foregroundStyle(.gray700) + } + + if !spot.closingText.isEmpty { + Text(spot.closingText) + .pretendardCustomFont(textStyle: .body2Regular) + .foregroundStyle(.gray500) + .lineLimit(1) + .minimumScaleFactor(0.9) + } + } + .padding(.bottom, 10) + + HStack(spacing: 8) { + if !spot.distanceText.isEmpty { + Text(spot.distanceText) + .pretendardFont(family: .SemiBold, size: 15) + .foregroundStyle(.staticBlack) + } + + if !spot.walkTimeText.isEmpty { + Text(spot.walkTimeText) + .pretendardCustomFont(textStyle: .body2Regular) + .foregroundStyle(.gray650) + .lineLimit(1) + .minimumScaleFactor(0.9) + } + } + + } + .frame(maxWidth: .infinity, alignment: .leading) + + spotImage(for: spot) + } + .padding(.horizontal, 16) + .padding(.vertical, 16) + .background(.staticWhite) + .clipShape(RoundedRectangle(cornerRadius: 22)) + .overlay { + RoundedRectangle(cornerRadius: 22) + .stroke(.gray300.opacity(0.9), lineWidth: 1) + } + } + + @ViewBuilder + private func spotImage(for spot: ExploreMapSpot) -> some View { + if let url = imageURL(for: spot) { + KFImage(url) + .placeholder { + imagePlaceholder() + } + .cancelOnDisappear(true) + .fade(duration: 0.2) + .resizable() + .scaledToFill() + .frame(width: 92, height: 112) + .clipShape(RoundedRectangle(cornerRadius: 16)) + } else { + imagePlaceholder() + } + } + + private func imageURL(for spot: ExploreMapSpot) -> URL? { + guard let imageURL = spot.imageURL?.trimmingCharacters(in: .whitespacesAndNewlines), + !imageURL.isEmpty else { + return nil + } + + if let url = URL(string: imageURL) { + return url + } + + let encoded = imageURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) + return encoded.flatMap(URL.init(string:)) + } + + private func imagePlaceholder() -> some View { + ZStack { + RoundedRectangle(cornerRadius: 16) + .fill(.gray200) + + Image(systemName: "photo") + .font(.system(size: 22, weight: .medium)) + .foregroundStyle(.gray500) + } + .frame(width: 92, height: 112) + } +} diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index 8d55ae9..f669ed0 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -54,6 +54,9 @@ public struct ExploreReducer: Sendable { public var shouldReturnToCurrentLocation: Bool = false public var selectedCategory: ExploreCategory = .all public var isSpotCardVisible: Bool = false + public var cardDragOffset: CGFloat = 0 + public var cardBaseOffset: CGFloat = 0 + public var isCardTransitioning: Bool = false public init() {} } @@ -63,6 +66,7 @@ public struct ExploreReducer: Sendable { case inner(InnerAction) case async(AsyncAction) case scope(ScopeAction) + case delegate(DelegateAction) } @CasePathable @@ -89,6 +93,8 @@ public struct ExploreReducer: Sendable { case categoryTapped(ExploreCategory) case spotTapped(String) case spotCardChanged(String?) + case cardDragChanged(CGFloat) + case cardDragEnded(CGFloat) case loadNextSpotPage // 길찾기 관련 액션 case searchRouteToGangnam @@ -118,6 +124,8 @@ public struct ExploreReducer: Sendable { case routeSearchResponse(Result) // 지도 카메라 제어 case resetCameraFlag + case completeCardSwipe(next: Bool) + case finishCardTransition } public enum AsyncAction: Equatable { @@ -132,6 +140,11 @@ public struct ExploreReducer: Sendable { case searchRoute(from: CLLocationCoordinate2D, to: Destination) } + + public enum DelegateAction: Equatable { + case presentExploreList + } + @Dependency(\.getRouteUseCase) var getRouteUseCase @Dependency(\.placeUseCase) var placeUseCase @@ -149,6 +162,9 @@ public struct ExploreReducer: Sendable { case .scope(let scopeAction): return handleScopeAction(state: &state, action: scopeAction) + + case .delegate(let delegateAction): + return handleDelegateAction(state: &state, action: delegateAction) } } .ifLet(\.$alert, action: \.scope.alert) @@ -156,8 +172,50 @@ public struct ExploreReducer: Sendable { } extension ExploreReducer { + private var cardTravelDistance: CGFloat { + UIScreen.main.bounds.width - 8 + } + + private var cardSwipeThreshold: CGFloat { + (UIScreen.main.bounds.width - 32) / 2 + } + + private func resetPagination(state: inout State) { + state.currentPage = 1 + state.hasNextPage = true + state.pendingSelectFirstSpotFromNextPage = false + } + + private func resetSearchContext(state: inout State, clearMarker: Bool = true) { + state.isLoadingPlaces = false + state.hasRequestedPlaces = false + resetPagination(state: &state) + if clearMarker { + state.searchMarkerLat = nil + state.searchMarkerLon = nil + } + } + + private func clearSelectedSpot(state: inout State) { + state.isSpotCardVisible = false + state.$userSession.withLock { + $0.selectedExploreSpotID = "" + } + state.cardDragOffset = 0 + state.cardBaseOffset = 0 + state.isCardTransitioning = false + } + + private func currentKeyword(state: State) -> String { + state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) + } + + private func currentCategory(state: State) -> ExploreCategory? { + state.selectedCategory == .all ? nil : state.selectedCategory + } + private func filteredSpots(state: State) -> [ExploreMapSpot] { - let query = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) + let query = currentKeyword(state: state) let filtered = state.spots.filter { spot in let hasDetail = spot.hasDetail @@ -194,14 +252,62 @@ extension ExploreReducer { } guard state.spots.contains(where: { $0.id == selectedSpotID }) else { - state.$userSession.withLock { - $0.selectedExploreSpotID = "" - } - state.isSpotCardVisible = false + clearSelectedSpot(state: &state) return } } + private func filteredCardSpots(state: State) -> [ExploreMapSpot] { + let query = currentKeyword(state: state) + + let filtered = state.spots.filter { spot in + let hasDetail = spot.hasDetail + let matchesCategory = state.selectedCategory == .all || spot.category == state.selectedCategory + let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) + return hasDetail && matchesCategory && matchesQuery + } + + guard let currentLocation = state.currentLocation else { + return filtered + } + + return filtered.sorted { lhs, rhs in + let lhsDistance = currentLocation.distance( + from: CLLocation( + latitude: lhs.coordinate.latitude, + longitude: lhs.coordinate.longitude + ) + ) + let rhsDistance = currentLocation.distance( + from: CLLocation( + latitude: rhs.coordinate.latitude, + longitude: rhs.coordinate.longitude + ) + ) + + return lhsDistance < rhsDistance + } + } + + private func currentCardSpots(state: State) -> [ExploreMapSpot] { + let filteredSpots = filteredCardSpots(state: state) + let selectedSpotID = state.userSession.selectedExploreSpotID + + guard !selectedSpotID.isEmpty else { + return filteredSpots + } + + if filteredSpots.contains(where: { $0.id == selectedSpotID }) { + return filteredSpots + } + + if let selectedSearchSpot = state.spots.first(where: { $0.id == selectedSpotID && $0.hasDetail }) { + return [selectedSearchSpot] + filteredSpots + } + + return filteredSpots + } + private func handleViewAction( state: inout State, action: View @@ -209,14 +315,8 @@ extension ExploreReducer { switch action { case .onAppear: state.isSpotCardVisible = false - state.isLoadingPlaces = false - state.hasRequestedPlaces = false state.hasFetchedPlacesWithCurrentLocation = false - state.currentPage = 1 - state.hasNextPage = true - state.pendingSelectFirstSpotFromNextPage = false - state.searchMarkerLat = nil - state.searchMarkerLon = nil + resetSearchContext(state: &state) state.spots = [] if let lat = state.userSession.travelStationLat, let lng = state.userSession.travelStationLng { @@ -236,14 +336,8 @@ extension ExploreReducer { ) case .onDisappear: - state.isLoadingPlaces = false - state.hasRequestedPlaces = false state.hasFetchedPlacesWithCurrentLocation = false - state.currentPage = 1 - state.hasNextPage = true - state.pendingSelectFirstSpotFromNextPage = false - state.searchMarkerLat = nil - state.searchMarkerLon = nil + resetSearchContext(state: &state) state.spots = [] state.isSpotCardVisible = false state.selectedDestination = nil @@ -278,13 +372,7 @@ extension ExploreReducer { case .searchTextChanged(let text): state.searchText = text - state.isLoadingPlaces = false - state.hasRequestedPlaces = false - state.currentPage = 1 - state.hasNextPage = true - state.pendingSelectFirstSpotFromNextPage = false - state.searchMarkerLat = nil - state.searchMarkerLon = nil + resetSearchContext(state: &state) return .merge( .cancel(id: CancelID.searchPlaces), .send(.async(.searchPlaces(page: 1, append: false))) @@ -292,19 +380,21 @@ extension ExploreReducer { case .categoryTapped(let category): state.selectedCategory = category - state.isLoadingPlaces = false - state.hasRequestedPlaces = false - state.currentPage = 1 - state.hasNextPage = true - state.pendingSelectFirstSpotFromNextPage = false - state.searchMarkerLat = nil - state.searchMarkerLon = nil + resetSearchContext(state: &state) return .merge( .cancel(id: CancelID.searchPlaces), .send(.async(.searchPlaces(page: 1, append: false))) ) case .spotTapped(let spotID): + if state.userSession.selectedExploreSpotID == spotID, state.isSpotCardVisible { + clearSelectedSpot(state: &state) + state.searchMarkerLat = nil + state.searchMarkerLon = nil + state.pendingSelectFirstSpotFromNextPage = false + return .cancel(id: CancelID.searchPlaces) + } + state.$userSession.withLock { $0.selectedExploreSpotID = spotID } @@ -316,11 +406,7 @@ extension ExploreReducer { state.searchMarkerLat = markerSpot.coordinate.latitude state.searchMarkerLon = markerSpot.coordinate.longitude - state.currentPage = 1 - state.hasNextPage = true - state.pendingSelectFirstSpotFromNextPage = false - state.isLoadingPlaces = false - state.hasRequestedPlaces = false + resetSearchContext(state: &state, clearMarker: false) return .merge( .cancel(id: CancelID.searchPlaces), @@ -338,6 +424,30 @@ extension ExploreReducer { } return .none + case .cardDragChanged(let offset): + guard !state.isCardTransitioning else { + return .none + } + let limitedOffset = max(min(offset, cardTravelDistance), -cardTravelDistance) + state.cardDragOffset = limitedOffset + return .none + + case .cardDragEnded(let translationWidth): + guard !state.isCardTransitioning else { + return .none + } + + if translationWidth > cardSwipeThreshold { + return .send(.inner(.completeCardSwipe(next: true))) + } + + if translationWidth < -cardSwipeThreshold { + return .send(.inner(.completeCardSwipe(next: false))) + } + + state.cardDragOffset = 0 + return .none + case .loadNextSpotPage: guard state.hasNextPage, !state.isLoadingPlaces else { return .none @@ -411,9 +521,7 @@ extension ExploreReducer { } if !state.hasFetchedPlacesWithCurrentLocation, !state.isLoadingPlaces { - state.currentPage = 1 - state.hasNextPage = true - state.pendingSelectFirstSpotFromNextPage = false + resetSearchContext(state: &state, clearMarker: false) return .merge( .cancel(id: CancelID.fetchPlaces), .cancel(id: CancelID.searchPlaces), @@ -440,17 +548,13 @@ extension ExploreReducer { return .none case .fetchPlacesFailed(let message, let usedCurrentLocation): - state.isLoadingPlaces = false - state.hasRequestedPlaces = false + resetSearchContext(state: &state, clearMarker: false) if usedCurrentLocation { state.hasFetchedPlacesWithCurrentLocation = false } #logDebug(" [ExploreReducer] 장소 조회 실패: \(message)") state.spots = [] - state.isSpotCardVisible = false - state.$userSession.withLock { - $0.selectedExploreSpotID = "" - } + clearSelectedSpot(state: &state) return .none case .searchPlacesResponse( @@ -465,8 +569,8 @@ extension ExploreReducer { ): state.isLoadingPlaces = false state.hasRequestedPlaces = false - let currentKeyword = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) - let currentCategory: ExploreCategory? = state.selectedCategory == .all ? nil : state.selectedCategory + let currentKeyword = currentKeyword(state: state) + let currentCategory = currentCategory(state: state) let currentMarkerLat = state.searchMarkerLat let currentMarkerLon = state.searchMarkerLon @@ -495,10 +599,7 @@ extension ExploreReducer { } else if state.searchMarkerLat != nil { state.isSpotCardVisible = false } else { - state.isSpotCardVisible = false - state.$userSession.withLock { - $0.selectedExploreSpotID = "" - } + clearSelectedSpot(state: &state) } if state.pendingSelectFirstSpotFromNextPage, let firstNewSpotID { @@ -522,10 +623,7 @@ extension ExploreReducer { state.searchMarkerLat != nil, !state.spots.contains(where: { $0.id == selectedSpotID }), !state.hasNextPage { - state.isSpotCardVisible = false - state.$userSession.withLock { - $0.selectedExploreSpotID = "" - } + clearSelectedSpot(state: &state) } return .none @@ -560,6 +658,61 @@ extension ExploreReducer { case .resetCameraFlag: state.shouldReturnToCurrentLocation = false return .none + + case .completeCardSwipe(let next): + let cardSpots = state.cardSpots + guard !cardSpots.isEmpty else { + return .none + } + + let currentSelectedID = state.selectedSpot?.id ?? state.userSession.selectedExploreSpotID + let currentIndex = cardSpots.firstIndex(where: { $0.id == currentSelectedID }) ?? 0 + let entryOffset: CGFloat = next ? -cardTravelDistance : cardTravelDistance + let isAtEnd = next && currentIndex == cardSpots.count - 1 + let isAtStart = !next && currentIndex == 0 + + state.isCardTransitioning = true + state.cardDragOffset = next ? cardTravelDistance : -cardTravelDistance + + if isAtEnd { + if state.hasNextPage { + return .concatenate( + .send(.view(.loadNextSpotPage)), + .run { send in + try await Task.sleep(for: .milliseconds(200)) + await send(.inner(.finishCardTransition)) + } + ) + } + + state.$userSession.withLock { + $0.selectedExploreSpotID = cardSpots[0].id + } + } else if isAtStart { + state.$userSession.withLock { + $0.selectedExploreSpotID = cardSpots[cardSpots.count - 1].id + } + } else { + let newIndex = next ? currentIndex + 1 : currentIndex - 1 + state.$userSession.withLock { + $0.selectedExploreSpotID = cardSpots[newIndex].id + } + } + + state.isSpotCardVisible = true + state.cardBaseOffset = entryOffset + state.cardDragOffset = 0 + + return .run { send in + try await Task.sleep(for: .milliseconds(240)) + await send(.inner(.finishCardTransition)) + } + + case .finishCardTransition: + state.cardBaseOffset = 0 + state.cardDragOffset = 0 + state.isCardTransitioning = false + return .none } } @@ -709,6 +862,7 @@ extension ExploreReducer { userLon: userLon, keyword: keyword, category: category, + sortBy: "MARKER_NEAREST", markerLat: markerLat, markerLon: markerLon, page: page @@ -768,6 +922,16 @@ extension ExploreReducer { } } + private func handleDelegateAction( + state: inout State, + action: DelegateAction + ) -> Effect { + switch action { + case .presentExploreList: + return .none + } + } + private func handleAlertAction( state: inout State, action: PresentationAction @@ -799,6 +963,94 @@ extension ExploreReducer { } } +extension ExploreReducer.State { + var trimmedSearchText: String { + searchText.trimmingCharacters(in: .whitespacesAndNewlines) + } + + func matchesCurrentFilters(_ spot: ExploreMapSpot) -> Bool { + let matchesCategory = selectedCategory == .all || spot.category == selectedCategory + let matchesQuery = trimmedSearchText.isEmpty || spot.name.localizedCaseInsensitiveContains(trimmedSearchText) + return matchesCategory && matchesQuery + } + + var filteredMapSpots: [ExploreMapSpot] { + spots.filter { spot in + selectedCategory == .all || spot.category == selectedCategory + } + } + + var filteredSpots: [ExploreMapSpot] { + spots.filter { spot in + spot.hasDetail && matchesCurrentFilters(spot) + } + } + + func mergedSpot(for spotID: String) -> ExploreMapSpot? { + spots.first(where: { $0.id == spotID && $0.hasDetail }) + } + + var cardSpots: [ExploreMapSpot] { + let selectedSpotID = userSession.selectedExploreSpotID + + guard !selectedSpotID.isEmpty else { + return filteredSpots + } + + if filteredSpots.contains(where: { $0.id == selectedSpotID }) { + return filteredSpots + } + + if let selectedSearchSpot = mergedSpot(for: selectedSpotID) { + return [selectedSearchSpot] + filteredSpots + } + + return filteredSpots + } + + var selectedSpot: ExploreMapSpot? { + guard isSpotCardVisible else { return nil } + + let selectedSpotID = userSession.selectedExploreSpotID + + if !selectedSpotID.isEmpty, + let selectedSpot = mergedSpot(for: selectedSpotID) { + return selectedSpot + } + + return nil + } + + func adjacentSpot(cardTravelDistance: CGFloat) -> ExploreMapSpot? { + let currentSelectedID = selectedSpot?.id ?? userSession.selectedExploreSpotID + guard let currentIndex = cardSpots.firstIndex(where: { $0.id == currentSelectedID }) else { + return nil + } + guard abs(cardDragOffset) > 0 else { + return nil + } + + let adjacentIndex: Int + if cardDragOffset >= 0 { + adjacentIndex = (currentIndex + 1) % cardSpots.count + } else { + adjacentIndex = (currentIndex - 1 + cardSpots.count) % cardSpots.count + } + return cardSpots[adjacentIndex] + } + + func adjacentCardOffset(cardTravelDistance: CGFloat) -> CGFloat? { + guard adjacentSpot(cardTravelDistance: cardTravelDistance) != nil else { return nil } + let baseOffset = cardDragOffset >= 0 ? -cardTravelDistance : cardTravelDistance + return baseOffset + cardDragOffset + } + + func cardOpacity(cardTravelDistance: CGFloat) -> Double { + let progress = min(abs(cardBaseOffset + cardDragOffset) / cardTravelDistance, 1) + return 1 - (progress * 0.02) + } +} + // MARK: - ExploreReducer.State + Hashable extension ExploreReducer.State: Hashable { public func hash(into hasher: inout Hasher) { @@ -812,10 +1064,10 @@ extension ExploreReducer.State: Hashable { hasher.combine(routeError) hasher.combine(shouldReturnToCurrentLocation) hasher.combine(userSession) - // Note: alert, selectedDestination, routeInfo are not hashed as they contain complex types } } + private extension String { var nilIfEmpty: String? { isEmpty ? nil : self diff --git a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift index 7616137..525e721 100644 --- a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift +++ b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift @@ -17,9 +17,6 @@ import Entity public struct ExploreView: View { @Bindable var store: StoreOf @Environment(\.dismiss) private var dismiss - @State private var cardDragOffset: CGFloat = 0 - @State private var cardBaseOffset: CGFloat = 0 - @State private var isCardTransitioning = false private var cardTravelDistance: CGFloat { UIScreen.main.bounds.width - 8 @@ -67,7 +64,7 @@ private extension ExploreView { currentLocation: store.currentLocation, routeInfo: store.routeInfo, destination: store.selectedDestination, - spots: store.spots, + spots: filteredMapSpots, selectedSpotID: store.userSession.selectedExploreSpotID.isEmpty ? nil : store.userSession.selectedExploreSpotID, @@ -82,150 +79,15 @@ private extension ExploreView { .ignoresSafeArea(.all) } - var filteredSpots: [ExploreMapSpot] { - let query = store.searchText.trimmingCharacters(in: .whitespacesAndNewlines) - - return store.spots.filter { spot in - let hasDetail = spot.hasDetail - let matchesCategory = store.selectedCategory == .all || spot.category == store.selectedCategory - let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) - return hasDetail && matchesCategory && matchesQuery - } - } - - func mergedSpot(for spotID: String) -> ExploreMapSpot? { - if let placeIDMatchedSpot = store.spots.first(where: { $0.id == spotID && $0.hasDetail }) { - return placeIDMatchedSpot - } - - return nil - } - - var cardSpots: [ExploreMapSpot] { - let selectedSpotID = store.userSession.selectedExploreSpotID - - guard !selectedSpotID.isEmpty else { - return filteredSpots - } - - if filteredSpots.contains(where: { $0.id == selectedSpotID }) { - return filteredSpots - } - - if let selectedSearchSpot = mergedSpot(for: selectedSpotID) { - return [selectedSearchSpot] + filteredSpots - } - - return filteredSpots - } - - var selectedSpot: ExploreMapSpot? { - guard store.isSpotCardVisible else { return nil } - - let selectedSpotID = store.userSession.selectedExploreSpotID - - if !selectedSpotID.isEmpty, - let selectedSpot = mergedSpot(for: selectedSpotID) { - return selectedSpot - } - - return nil - } - @ViewBuilder func headerSection() -> some View { - VStack(spacing: 0) { - HStack(spacing: 12) { - backButton() - searchBar() - } - - categoryScrollView() - .padding(.top, 12) - } - } - - @ViewBuilder - func backButton() -> some View { - Button { - dismiss() - } label: { - Image(asset: .leftArrow) - .resizable() - .scaledToFit() - .frame(width: 56, height: 56) - .background(.staticWhite) - .clipShape(Circle()) - .shadow(color: .black.opacity(0.08), radius: 12, y: 2) - } - .buttonStyle(.plain) - } - - @ViewBuilder - func searchBar() -> some View { - HStack(spacing: 8) { - Image(systemName: "magnifyingglass") - .font(.system(size: 16, weight: .medium)) - .foregroundStyle(.gray600) - - ZStack(alignment: .leading) { - if store.searchText.isEmpty { - Text("\(store.userSession.travelStationName)역") - .pretendardCustomFont(textStyle: .titleRegular) - .foregroundStyle(.gray600) - } - - TextField( - "", - text: Binding( - get: { store.searchText }, - set: { store.send(.view(.searchTextChanged($0))) } - ) - ) - .pretendardCustomFont(textStyle: .titleRegular) - .foregroundStyle(.staticBlack) - .textInputAutocapitalization(.never) - .autocorrectionDisabled() - } - } - .padding(.horizontal, 24) - .frame(height: 56) - .background(.staticWhite) - .clipShape(RoundedRectangle(cornerRadius: 28)) - .shadow(color: .black.opacity(0.08), radius: 12, y: 2) - } - - @ViewBuilder - func categoryScrollView() -> some View { - ScrollViewReader { proxy in - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 8) { - ForEach(ExploreCategory.allCases, id: \.self) { category in - categoryChip(category) - .id(category) - } - } - .padding(.horizontal, 2) - } - .onAppear { - scrollToCategory(store.selectedCategory, with: proxy, animated: false) - } - .onChange(of: store.selectedCategory) { _, category in - DispatchQueue.main.async { - scrollToCategory(category, with: proxy) - } - } - } - } - - @ViewBuilder - func categoryChip(_ category: ExploreCategory) -> some View { - ExploreCategoryChipView( - category: category, - isSelected: store.selectedCategory == category, - action: { - store.send(.view(.categoryTapped(category))) - } + ExploreSearchHeaderView( + stationName: store.userSession.travelStationName, + searchText: store.searchText, + selectedCategory: store.selectedCategory, + onBackTap: { dismiss() }, + onSearchTextChanged: { store.send(.view(.searchTextChanged($0))) }, + onCategoryTap: { store.send(.view(.categoryTapped($0))) } ) } @@ -238,12 +100,16 @@ private extension ExploreView { ExploreSelectedSpotCardView( currentSpot: selectedSpot, adjacentSpot: adjacentSpot, - currentOffset: cardBaseOffset + cardDragOffset, + currentOffset: store.cardBaseOffset + store.cardDragOffset, adjacentOffset: adjacentCardOffset, cardOpacity: cardOpacity, onRouteTap: {}, - onDragChanged: handleCardDragChanged, - onDragEnded: handleCardDragEnded + onDragChanged: { value in + store.send(.view(.cardDragChanged(value.translation.width))) + }, + onDragEnded: { value in + store.send(.view(.cardDragEnded(value.translation.width))) + } ) .padding(.horizontal, 16) .frame(height: cardHeight) @@ -252,7 +118,9 @@ private extension ExploreView { ExploreFloatingControlsView( showsListButton: hasSelectedSpotCard, controlsBottomPadding: hasSelectedSpotCard ? cardHeight + 20 : 0, - onListTap: {}, + onListTap: { + store.send(.delegate(.presentExploreList)) + }, onCurrentLocationTap: { store.send(.view(.returnToCurrentLocation)) } @@ -261,132 +129,23 @@ private extension ExploreView { .padding(.bottom, 36) } - func moveSelectedSpot(next: Bool) { - guard !cardSpots.isEmpty else { return } - guard !isCardTransitioning else { return } - - let currentSelectedID = selectedSpot?.id ?? store.userSession.selectedExploreSpotID - let currentIndex = cardSpots.firstIndex(where: { $0.id == currentSelectedID }) ?? 0 - let entryOffset: CGFloat = next ? -cardTravelDistance : cardTravelDistance - let isAtEnd = next && currentIndex == cardSpots.count - 1 - let isAtStart = !next && currentIndex == 0 - - isCardTransitioning = true - - withAnimation(.interactiveSpring(response: 0.28, dampingFraction: 0.9)) { - cardDragOffset = next ? cardTravelDistance : -cardTravelDistance - } - - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - if isAtEnd { - if store.hasNextPage { - _ = store.send(.view(.loadNextSpotPage)) - } else { - _ = store.send(.view(.spotCardChanged(cardSpots[0].id))) - } - } else if isAtStart { - _ = store.send(.view(.spotCardChanged(cardSpots[cardSpots.count - 1].id))) - } else { - let newIndex = next ? currentIndex + 1 : currentIndex - 1 - _ = store.send(.view(.spotCardChanged(cardSpots[newIndex].id))) - } - - cardBaseOffset = entryOffset - cardDragOffset = 0 - - withAnimation(.interactiveSpring(response: 0.36, dampingFraction: 0.88)) { - cardBaseOffset = 0 - } - - DispatchQueue.main.asyncAfter(deadline: .now() + 0.24) { - isCardTransitioning = false - } - } + var filteredMapSpots: [ExploreMapSpot] { + store.state.filteredMapSpots } - func handleCardDragChanged(_ value: DragGesture.Value) { - guard !isCardTransitioning else { return } - let limitedOffset = max(min(value.translation.width, cardTravelDistance), -cardTravelDistance) - cardDragOffset = limitedOffset - } - - func handleCardDragEnded(_ value: DragGesture.Value) { - guard !isCardTransitioning else { return } - - if value.translation.width > cardSwipeThreshold { - moveSelectedSpot(next: true) - return - } - - if value.translation.width < -cardSwipeThreshold { - moveSelectedSpot(next: false) - return - } - - withAnimation(.interactiveSpring(response: 0.3, dampingFraction: 0.88)) { - cardDragOffset = 0 - } + var selectedSpot: ExploreMapSpot? { + store.state.selectedSpot } var adjacentSpot: ExploreMapSpot? { - let currentSelectedID = selectedSpot?.id ?? store.userSession.selectedExploreSpotID - guard let currentIndex = cardSpots.firstIndex(where: { $0.id == currentSelectedID }) else { - return nil - } - guard abs(cardDragOffset) > 0 else { - return nil - } - - let adjacentIndex: Int - if cardDragOffset >= 0 { - adjacentIndex = (currentIndex + 1) % cardSpots.count - } else { - adjacentIndex = (currentIndex - 1 + cardSpots.count) % cardSpots.count - } - return cardSpots[adjacentIndex] + store.state.adjacentSpot(cardTravelDistance: cardTravelDistance) } var adjacentCardOffset: CGFloat? { - guard adjacentSpot != nil else { return nil } - let baseOffset = cardDragOffset >= 0 ? -cardTravelDistance : cardTravelDistance - return baseOffset + cardDragOffset + store.state.adjacentCardOffset(cardTravelDistance: cardTravelDistance) } var cardOpacity: Double { - let progress = min(abs(cardBaseOffset + cardDragOffset) / cardTravelDistance, 1) - return 1 - (progress * 0.02) + store.state.cardOpacity(cardTravelDistance: cardTravelDistance) } - - func scrollToCategory( - _ category: ExploreCategory, - with proxy: ScrollViewProxy, - animated: Bool = true - ) { - let targetCategory: ExploreCategory - switch category { - case .all, .cafe: - targetCategory = .all - case .restaurant: - targetCategory = .cafe - case .activity: - targetCategory = .restaurant - case .etc: - targetCategory = .activity - @unknown default: - targetCategory = .all - } - - let action = { - proxy.scrollTo(targetCategory, anchor: .leading) - } - - if animated { - withAnimation(.easeInOut(duration: 0.2)) { - action() - } - } else { - action() - } - } - } diff --git a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift new file mode 100644 index 0000000..2794e2d --- /dev/null +++ b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift @@ -0,0 +1,264 @@ +// +// ExploreListFeature.swift +// Home +// +// Created by Wonji Suh on 3/28/26. +// + + +import Foundation +import CoreLocation +import ComposableArchitecture +import Entity +import UseCase + +public enum ExploreListSort: String, CaseIterable, Equatable { + case stationNearest = "STATION_NEAREST" + case userNearest = "USER_NEAREST" + + public var title: String { + switch self { + case .stationNearest: + return "역에서 가까운 순" + case .userNearest: + return "현재 위치로부터 가까운 순" + } + } +} + +@Reducer +public struct ExploreListFeature { + public init() {} + + enum CancelID: Hashable { + case searchPlaces + } + + @ObservableState + public struct State: Equatable { + public var searchText: String = "" + public var selectedCategory: ExploreCategory = .all + public var selectedSort: ExploreListSort = .stationNearest + public var spots: [ExploreMapSpot] = [] + public var currentPage: Int = 1 + public var hasNextPage: Bool = true + public var isLoading: Bool = false + public var currentLocation: CLLocationCoordinate2D? + @Shared(.inMemory("UserSession")) public var userSession: UserSession = .empty + + public init() {} + + public init(exploreState: ExploreReducer.State) { + self.searchText = exploreState.searchText + self.selectedCategory = exploreState.selectedCategory + self.currentLocation = exploreState.currentLocation?.coordinate + } + } + + public enum Action: ViewAction, BindableAction { + case binding(BindingAction) + case view(View) + case async(AsyncAction) + case inner(InnerAction) + case delegate(DelegateAction) + + } + + //MARK: - ViewAction + @CasePathable + public enum View { + case onAppear + case searchTextChanged(String) + case categoryTapped(ExploreCategory) + case sortTapped(ExploreListSort) + case loadNextPage + } + + + + //MARK: - AsyncAction 비동기 처리 액션 + public enum AsyncAction: Equatable { + case searchPlaces(page: Int, append: Bool) + } + + //MARK: - 앱내에서 사용하는 액션 + public enum InnerAction: Equatable { + case searchPlacesResponse(ExploreSpotPageEntity, append: Bool) + case searchPlacesFailed(String) + } + + //MARK: - NavigationAction + public enum NavigationAction: Equatable { + } + + public enum DelegateAction: Equatable { + } + + @Dependency(\.placeUseCase) var placeUseCase + + public var body: some Reducer { + BindingReducer() + Reduce { state, action in + switch action { + case .binding(_): + return .none + + case .view(let viewAction): + return handleViewAction(state: &state, action: viewAction) + + case .async(let asyncAction): + return handleAsyncAction(state: &state, action: asyncAction) + + case .inner(let innerAction): + return handleInnerAction(state: &state, action: innerAction) + + case .delegate(let delegateAction): + return handleDelegateAction(state: &state, action: delegateAction) + } + } + } +} + +extension ExploreListFeature { + private func handleViewAction( + state: inout State, + action: View + ) -> Effect { + switch action { + case .onAppear: + return .send(.async(.searchPlaces(page: 1, append: false))) + + case .searchTextChanged(let text): + state.searchText = text + state.currentPage = 1 + state.hasNextPage = true + return .merge( + .cancel(id: CancelID.searchPlaces), + .send(.async(.searchPlaces(page: 1, append: false))) + ) + + case .categoryTapped(let category): + state.selectedCategory = category + state.currentPage = 1 + state.hasNextPage = true + return .merge( + .cancel(id: CancelID.searchPlaces), + .send(.async(.searchPlaces(page: 1, append: false))) + ) + + case .sortTapped(let sort): + state.selectedSort = sort + state.currentPage = 1 + state.hasNextPage = true + return .merge( + .cancel(id: CancelID.searchPlaces), + .send(.async(.searchPlaces(page: 1, append: false))) + ) + + case .loadNextPage: + guard state.hasNextPage, !state.isLoading else { + return .none + } + return .send(.async(.searchPlaces(page: state.currentPage, append: true))) + } + } + + private func handleAsyncAction( + state: inout State, + action: AsyncAction + ) -> Effect { + switch action { + case let .searchPlaces(page, append): + guard !state.isLoading else { + return .none + } + + state.isLoading = true + let userSession = state.userSession + let fallbackLat = userSession.travelStationLat ?? 0 + let fallbackLon = userSession.travelStationLng ?? 0 + let userLat = state.currentLocation?.latitude ?? fallbackLat + let userLon = state.currentLocation?.longitude ?? fallbackLon + let trimmedKeyword = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) + let keyword = trimmedKeyword.isEmpty ? nil : trimmedKeyword + let category: ExploreCategory? = state.selectedCategory == .all ? nil : state.selectedCategory + let baseSpots = append ? state.spots : [] + let sortBy = state.selectedSort.rawValue + + return .run { send in + let result = await Result { + try await placeUseCase.searchExploreSpots( + baseSpots: baseSpots, + userSession: userSession, + userLat: userLat, + userLon: userLon, + keyword: keyword, + category: category, + sortBy: sortBy, + markerLat: userSession.travelStationLat, + markerLon: userSession.travelStationLng, + page: page + ) + } + + switch result { + case .success(let pageEntity): + await send(.inner(.searchPlacesResponse(pageEntity, append: append))) + case .failure(let error): + await send(.inner(.searchPlacesFailed(error.localizedDescription))) + } + } + .cancellable(id: CancelID.searchPlaces, cancelInFlight: true) + } + } + + private func handleDelegateAction( + state: inout State, + action: DelegateAction + ) -> Effect { + switch action { + @unknown default: + return .none + } + } + + private func handleInnerAction( + state: inout State, + action: InnerAction + ) -> Effect { + switch action { + case let .searchPlacesResponse(pageEntity, append): + state.isLoading = false + state.spots = append ? pageEntity.spots : pageEntity.spots.filter(\.hasDetail) + state.currentPage = pageEntity.currentPage + state.hasNextPage = pageEntity.hasNextPage + return .none + + case .searchPlacesFailed: + state.isLoading = false + return .none + } + } +} + +extension ExploreListFeature.State: Hashable { + public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.searchText == rhs.searchText + && lhs.selectedCategory == rhs.selectedCategory + && lhs.selectedSort == rhs.selectedSort + && lhs.spots == rhs.spots + && lhs.currentLocation?.latitude == rhs.currentLocation?.latitude + && lhs.currentLocation?.longitude == rhs.currentLocation?.longitude + && lhs.userSession == rhs.userSession + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(searchText) + hasher.combine(selectedCategory) + hasher.combine(selectedSort) + hasher.combine(spots) + hasher.combine(currentLocation?.latitude) + hasher.combine(currentLocation?.longitude) + hasher.combine(userSession) + } +} diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift new file mode 100644 index 0000000..4af7175 --- /dev/null +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift @@ -0,0 +1,124 @@ +// +// ExploreListView.swift +// Home +// +// Created by Wonji Suh on 3/28/26. +// + +import SwiftUI +import DesignSystem +import Entity + +import ComposableArchitecture + +public struct ExploreListView: View { + @Bindable var store: StoreOf + @Environment(\.dismiss) private var dismiss + + public init( + store: StoreOf + ) { + self.store = store + } + + public var body: some View { + ZStack { + Color.staticWhite + .edgesIgnoringSafeArea(.all) + + VStack(spacing: 0) { + ExploreSearchHeaderView( + stationName: store.userSession.travelStationName, + searchText: store.searchText, + selectedCategory: store.selectedCategory, + onBackTap: { dismiss() }, + onSearchTextChanged: { store.send(.view(.searchTextChanged($0))) }, + onCategoryTap: { store.send(.view(.categoryTapped($0))) } + ) + .padding(.top, 8) + .padding(.horizontal, 16) + + sortSection() + .padding(.top, 28) + .padding(.horizontal, 20) + + ScrollView(showsIndicators: false) { + LazyVStack(spacing: 12) { + ForEach(filteredSpots) { spot in + ExploreSpotListCardView(spot: spot) + .onAppear { + guard spot.id == filteredSpots.last?.id else { return } + store.send(.view(.loadNextPage)) + } + } + + if store.isLoading { + ProgressView() + .frame(maxWidth: .infinity) + .padding(.vertical, 16) + } + } + .padding(.horizontal, 16) + .padding(.top, 12) + .padding(.bottom, 28) + } + .background(.gray100) + } + } + .onAppear { + store.send(.view(.onAppear)) + } + } +} + +private extension ExploreListView { + var filteredSpots: [ExploreMapSpot] { + let query = store.searchText.trimmingCharacters(in: .whitespacesAndNewlines) + return store.spots.filter { spot in + let matchesCategory = store.selectedCategory == .all || spot.category == store.selectedCategory + let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) + return matchesCategory && matchesQuery + } + } + + @ViewBuilder + func sortSection() -> some View { + HStack { + Spacer() + + Menu { + ForEach(ExploreListSort.allCases, id: \.self) { sort in + Button { + store.send(.view(.sortTapped(sort))) + } label: { + HStack(spacing: 8) { + if store.selectedSort == sort { + Image(asset: .rowCheck) + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + } + + Text(sort.title) + .pretendardCustomFont(textStyle: .bodyMedium) + .foregroundStyle(.gray800) + } + .environment(\.layoutDirection, .leftToRight) + } + } + } label: { + HStack(spacing: 4) { + Text(store.selectedSort.title) + .pretendardCustomFont(textStyle: .bodyMedium) + .foregroundStyle(.gray700) + + Image(asset: .arrowtriangleDown) + .resizable() + .scaledToFit() + .frame(width: 12, height: 12) + } + .padding(.vertical, 4) + } + } + } +} diff --git a/Tuist/Package.swift b/Tuist/Package.swift index 50cdce0..d8cc6a5 100644 --- a/Tuist/Package.swift +++ b/Tuist/Package.swift @@ -36,5 +36,6 @@ let package = Package( .package(url: "https://github.com/Roy-wonji/AsyncMoya", from: "1.1.8"), .package(url: "https://github.com/openid/AppAuth-iOS.git", from: "2.0.0"), .package(url: "https://github.com/ReactiveCocoa/ReactiveSwift.git", from: "6.7.0"), + .package(url: "https://github.com/onevcat/Kingfisher.git", from: "8.2.0"), ] ) From bad788bdb2843a44b4e19d3bdfab12cb02692f91 Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 03:29:34 +0900 Subject: [PATCH 12/35] =?UTF-8?q?refactor:=20=ED=83=90=EC=83=89=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=95=200-base=20=EC=A0=84=ED=99=98=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A0=95=EB=A0=AC=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Place/DTO/PlaceDTOModel.swift | 20 +-- .../Sources/Place/Mapper/PlaceDTOModel+.swift | 16 ++- .../Service/Sources/Place/PlaceRequest.swift | 4 +- .../Entity/Sources/Place/PlaceInput.swift | 4 +- .../Sources/Place/PlaceUseCaseImpl.swift | 8 +- .../Components/NaverMapComponent.swift | 10 ++ .../Coordinator/Reducer/HomeCoordinator.swift | 17 ++- .../Explore/Reducer/ExploreReducer.swift | 120 ++++++++++++------ .../Reducer/ExploreListFeature.swift | 38 ++++-- .../ExploreList/View/ExploreListView.swift | 3 +- 10 files changed, 155 insertions(+), 85 deletions(-) diff --git a/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift b/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift index ff7ddfa..06b29e6 100644 --- a/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift +++ b/Projects/Data/Model/Sources/Place/DTO/PlaceDTOModel.swift @@ -31,31 +31,21 @@ public struct PlaceResponseDTOModel: Decodable, Equatable { } public struct PlaceSearchPageResponseDTO: Decodable, Equatable { - public let pageable: PlacePageableResponseDTO - public let last: Bool - public let numberOfElements: Int - public let first: Bool - public let size: Int public let content: [PlaceResponseDTOModel] public let number: Int - public let sort: PlaceSortResponseDTO - public let empty: Bool + public let size: Int + public let hasNext: Bool enum CodingKeys: String, CodingKey { - case pageable, last, numberOfElements, first, size, content, number, sort, empty + case content, number, size, hasNext } public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - self.pageable = try container.decodeIfPresent(PlacePageableResponseDTO.self, forKey: .pageable) ?? .init() - self.last = try container.decodeIfPresent(Bool.self, forKey: .last) ?? false - self.numberOfElements = try container.decodeIfPresent(Int.self, forKey: .numberOfElements) ?? 0 - self.first = try container.decodeIfPresent(Bool.self, forKey: .first) ?? true - self.size = try container.decodeIfPresent(Int.self, forKey: .size) ?? 0 self.content = try container.decodeIfPresent([PlaceResponseDTOModel].self, forKey: .content) ?? [] self.number = try container.decodeIfPresent(Int.self, forKey: .number) ?? 0 - self.sort = try container.decodeIfPresent(PlaceSortResponseDTO.self, forKey: .sort) ?? .init() - self.empty = try container.decodeIfPresent(Bool.self, forKey: .empty) ?? self.content.isEmpty + self.size = try container.decodeIfPresent(Int.self, forKey: .size) ?? 10 + self.hasNext = try container.decodeIfPresent(Bool.self, forKey: .hasNext) ?? false } } diff --git a/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift b/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift index 1b56b2a..e5ec11d 100644 --- a/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift +++ b/Projects/Data/Model/Sources/Place/Mapper/PlaceDTOModel+.swift @@ -60,15 +60,19 @@ public extension PlaceResponseDTOModel { public extension PlaceSearchPageResponseDTO { func toDomain() -> PlaceSearchPageEntity { PlaceSearchPageEntity( - pageable: pageable.toDomain(), - isLastPage: last, - numberOfElements: numberOfElements, - isFirstPage: first, + pageable: PlacePageableResponseDTO( + pageNumber: number, + pageSize: size, + offset: number * size + ).toDomain(), + isLastPage: !hasNext, + numberOfElements: content.count, + isFirstPage: number == 0, size: size, content: content.map { $0.toDomain() }, page: number, - sort: sort.toDomain(), - isEmpty: empty + sort: PlaceSortResponseDTO().toDomain(), + isEmpty: content.isEmpty ) } } diff --git a/Projects/Data/Service/Sources/Place/PlaceRequest.swift b/Projects/Data/Service/Sources/Place/PlaceRequest.swift index f956816..8756982 100644 --- a/Projects/Data/Service/Sources/Place/PlaceRequest.swift +++ b/Projects/Data/Service/Sources/Place/PlaceRequest.swift @@ -52,7 +52,7 @@ public struct PlaceSearchRequest: Encodable { remainingMinutes: Int, keyword: String? = nil, category: String? = nil, - sortBy: String = "MARKER_NEAREST", + sortBy: String = "STATION_NEAREST", markerLat: Double? = nil, markerLon: Double? = nil, pageable: PageableRequest = .init() @@ -75,7 +75,7 @@ public struct PageableRequest: Encodable, Equatable { public let size: Int public init( - page: Int = 1, + page: Int = 0, size: Int = 10 ) { self.page = page diff --git a/Projects/Domain/Entity/Sources/Place/PlaceInput.swift b/Projects/Domain/Entity/Sources/Place/PlaceInput.swift index e618e2b..b3233c4 100644 --- a/Projects/Domain/Entity/Sources/Place/PlaceInput.swift +++ b/Projects/Domain/Entity/Sources/Place/PlaceInput.swift @@ -52,10 +52,10 @@ public struct PlaceSearchInput: Equatable { remainingMinutes: Int, keyword: String? = nil, category: String? = nil, - sortBy: String = "MARKER_NEAREST", + sortBy: String = "STATION_NEAREST", markerLat: Double? = nil, markerLon: Double? = nil, - page: Int = 1, + page: Int = 0, size: Int = 10 ) { self.userLat = userLat diff --git a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift index 2519c43..7a7cb2e 100644 --- a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift +++ b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift @@ -93,10 +93,10 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { remainingMinutes: 250, keyword: nil, category: nil, - sortBy: "MARKER_NEAREST", + sortBy: "STATION_NEAREST", markerLat: userSession.travelStationLat, markerLon: userSession.travelStationLng, - page: 1, + page: 0, size: 10 ) @@ -127,7 +127,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { userLon: Double, keyword: String?, category: ExploreCategory?, - sortBy: String = "MARKER_NEAREST", + sortBy: String = "STATION_NEAREST", markerLat: Double?, markerLon: Double?, page: Int @@ -156,7 +156,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { userLon: Double, keyword: String?, category: ExploreCategory?, - sortBy: String = "MARKER_NEAREST", + sortBy: String = "STATION_NEAREST", markerLat: Double?, markerLon: Double?, page: Int diff --git a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift index 377420e..c5c0958 100644 --- a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift +++ b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift @@ -192,6 +192,7 @@ public struct NaverMapComponent: UIViewRepresentable { isSelected: spot.id == Self.selectedSpotID ) marker.touchHandler = { _ in + context.coordinator.markMarkerTap() Self.selectedSpotID = spot.id Self.updateSpotMarkerSelection() onSpotTapped?(spot.id) @@ -268,12 +269,21 @@ public struct NaverMapComponent: UIViewRepresentable { public final class Coordinator: NSObject, NMFMapViewTouchDelegate { var parent: NaverMapComponent + private var shouldIgnoreNextMapTap = false init(parent: NaverMapComponent) { self.parent = parent } + func markMarkerTap() { + shouldIgnoreNextMapTap = true + } + public func mapView(_ mapView: NMFMapView, didTapMap latlng: NMGLatLng, point: CGPoint) { + if shouldIgnoreNextMapTap { + shouldIgnoreNextMapTap = false + return + } parent.onMapTapped?() } } diff --git a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift index f7bd30b..849788a 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift @@ -49,7 +49,7 @@ public struct HomeCoordinator { case presentProfile case presentProfileWithAnimation case presentExplore - case presentExploreList + case presentExploreList(ExploreReducer.State) } // MARK: - NavigationAction @@ -100,7 +100,16 @@ extension HomeCoordinator { return .send(.navigation(.presentAuth)) case let .routeAction(id: id, action: .explore(.delegate(.presentExploreList))): - return .send(.inner(.presentExploreList)) + guard state.routes.indices.contains(id) else { + return .none + } + + switch state.routes[id] { + case let .push(.explore(exploreState)): + return .send(.inner(.presentExploreList(exploreState))) + default: + return .none + } case .routeAction(id: _, action: .profile(.navigation(.presentRoot))): @@ -167,8 +176,8 @@ extension HomeCoordinator { state.routes.push(.explore(.init())) return .none - case .presentExploreList: - state.routes.push(.exploreList(.init())) + case let .presentExploreList(exploreState): + state.routes.push(.exploreList(.init(exploreState: exploreState))) return .none } } diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index f669ed0..fe746bf 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -36,7 +36,7 @@ public struct ExploreReducer: Sendable { public var isLoadingPlaces: Bool = false public var hasRequestedPlaces: Bool = false public var hasFetchedPlacesWithCurrentLocation: Bool = false - public var currentPage: Int = 1 + public var currentPage: Int = 0 public var hasNextPage: Bool = true public var pendingSelectFirstSpotFromNextPage: Bool = false public var searchMarkerLat: Double? @@ -181,7 +181,7 @@ extension ExploreReducer { } private func resetPagination(state: inout State) { - state.currentPage = 1 + state.currentPage = 0 state.hasNextPage = true state.pendingSelectFirstSpotFromNextPage = false } @@ -214,6 +214,27 @@ extension ExploreReducer { state.selectedCategory == .all ? nil : state.selectedCategory } + private func isSameCoordinate(_ lhs: Double?, _ rhs: Double?, tolerance: Double = 0.000001) -> Bool { + switch (lhs, rhs) { + case (nil, nil): + return true + case let (lhs?, rhs?): + return abs(lhs - rhs) < tolerance + default: + return false + } + } + + private func isResolvingSelectedMarkerDetail(state: State) -> Bool { + guard state.searchMarkerLat != nil, + state.searchMarkerLon != nil, + let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty else { + return false + } + + return !state.spots.contains(where: { $0.id == selectedSpotID && $0.hasDetail }) + } + private func filteredSpots(state: State) -> [ExploreMapSpot] { let query = currentKeyword(state: state) @@ -314,10 +335,8 @@ extension ExploreReducer { ) -> Effect { switch action { case .onAppear: - state.isSpotCardVisible = false - state.hasFetchedPlacesWithCurrentLocation = false - resetSearchContext(state: &state) - state.spots = [] + let shouldBootstrap = state.spots.isEmpty && !state.hasRequestedPlaces + if let lat = state.userSession.travelStationLat, let lng = state.userSession.travelStationLng { state.selectedDestination = Destination( @@ -325,6 +344,20 @@ extension ExploreReducer { coordinate: CLLocationCoordinate2D(latitude: lat, longitude: lng) ) } + + guard shouldBootstrap else { + syncSelectedSpot(state: &state) + return .run { send in + let locationManager = await LocationPermissionManager.shared + let currentStatus = await locationManager.authorizationStatus + await send(.inner(.locationPermissionStatusChanged(currentStatus))) + } + } + + state.isSpotCardVisible = false + state.hasFetchedPlacesWithCurrentLocation = false + resetSearchContext(state: &state) + state.spots = [] syncSelectedSpot(state: &state) return .merge( .run { send in @@ -336,18 +369,7 @@ extension ExploreReducer { ) case .onDisappear: - state.hasFetchedPlacesWithCurrentLocation = false - resetSearchContext(state: &state) - state.spots = [] - state.isSpotCardVisible = false - state.selectedDestination = nil - return .merge( - .cancel(id: CancelID.startLocationUpdates), - .cancel(id: CancelID.fetchPlaces), - .cancel(id: CancelID.searchPlaces), - .cancel(id: CancelID.searchRoute), - .send(.async(.stopLocationUpdates)) - ) + return .none case .requestLocationPermission: return .none @@ -375,7 +397,7 @@ extension ExploreReducer { resetSearchContext(state: &state) return .merge( .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 1, append: false))) + .send(.async(.searchPlaces(page: 0, append: false))) ) case .categoryTapped(let category): @@ -383,7 +405,7 @@ extension ExploreReducer { resetSearchContext(state: &state) return .merge( .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 1, append: false))) + .send(.async(.searchPlaces(page: 0, append: false))) ) case .spotTapped(let spotID): @@ -410,7 +432,7 @@ extension ExploreReducer { return .merge( .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 1, append: false))) + .send(.async(.searchPlaces(page: 0, append: false))) ) case .spotCardChanged(let spotID): @@ -438,11 +460,11 @@ extension ExploreReducer { } if translationWidth > cardSwipeThreshold { - return .send(.inner(.completeCardSwipe(next: true))) + return .send(.inner(.completeCardSwipe(next: false))) } if translationWidth < -cardSwipeThreshold { - return .send(.inner(.completeCardSwipe(next: false))) + return .send(.inner(.completeCardSwipe(next: true))) } state.cardDragOffset = 0 @@ -574,15 +596,22 @@ extension ExploreReducer { let currentMarkerLat = state.searchMarkerLat let currentMarkerLon = state.searchMarkerLon - guard requestedPage == 1 || append else { + guard requestedPage == 0 || append else { return .none } - guard requestedKeyword == currentKeyword, - requestedCategory == currentCategory, - requestedMarkerLat == currentMarkerLat, - requestedMarkerLon == currentMarkerLon else { - return .none + if requestedMarkerLat != nil || requestedMarkerLon != nil { + guard isSameCoordinate(requestedMarkerLat, currentMarkerLat), + isSameCoordinate(requestedMarkerLon, currentMarkerLon) else { + return .none + } + } else { + guard requestedKeyword == currentKeyword, + requestedCategory == currentCategory, + requestedMarkerLat == currentMarkerLat, + requestedMarkerLon == currentMarkerLon else { + return .none + } } state.hasFetchedPlacesWithCurrentLocation = usedCurrentLocation @@ -614,14 +643,14 @@ extension ExploreReducer { if let selectedSpotID, state.searchMarkerLat != nil, - !state.spots.contains(where: { $0.id == selectedSpotID }), + !state.spots.contains(where: { $0.id == selectedSpotID && $0.hasDetail }), state.hasNextPage { return .send(.async(.searchPlaces(page: state.currentPage, append: true))) } if let selectedSpotID, state.searchMarkerLat != nil, - !state.spots.contains(where: { $0.id == selectedSpotID }), + !state.spots.contains(where: { $0.id == selectedSpotID && $0.hasDetail }), !state.hasNextPage { clearSelectedSpot(state: &state) } @@ -667,12 +696,12 @@ extension ExploreReducer { let currentSelectedID = state.selectedSpot?.id ?? state.userSession.selectedExploreSpotID let currentIndex = cardSpots.firstIndex(where: { $0.id == currentSelectedID }) ?? 0 - let entryOffset: CGFloat = next ? -cardTravelDistance : cardTravelDistance + let entryOffset: CGFloat = next ? cardTravelDistance : -cardTravelDistance let isAtEnd = next && currentIndex == cardSpots.count - 1 let isAtStart = !next && currentIndex == 0 state.isCardTransitioning = true - state.cardDragOffset = next ? cardTravelDistance : -cardTravelDistance + state.cardDragOffset = next ? -cardTravelDistance : cardTravelDistance if isAtEnd { if state.hasNextPage { @@ -848,8 +877,12 @@ extension ExploreReducer { let requestedMarkerLat = state.searchMarkerLat let requestedMarkerLon = state.searchMarkerLon let rawKeyword = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) - let keyword = rawKeyword.nilIfEmpty - let category: ExploreCategory? = state.selectedCategory == .all ? nil : state.selectedCategory + let isResolvingSelectedMarkerDetail = isResolvingSelectedMarkerDetail(state: state) + let keyword = isResolvingSelectedMarkerDetail ? nil : rawKeyword.nilIfEmpty + let category: ExploreCategory? = isResolvingSelectedMarkerDetail + ? nil + : (state.selectedCategory == .all ? nil : state.selectedCategory) + let sortBy = isResolvingSelectedMarkerDetail ? "MARKER_NEAREST" : "STATION_NEAREST" let usedCurrentLocation = state.currentLocation != nil let baseSpots = state.spots @@ -862,7 +895,7 @@ extension ExploreReducer { userLon: userLon, keyword: keyword, category: category, - sortBy: "MARKER_NEAREST", + sortBy: sortBy, markerLat: markerLat, markerLon: markerLon, page: page @@ -968,6 +1001,16 @@ extension ExploreReducer.State { searchText.trimmingCharacters(in: .whitespacesAndNewlines) } + func hasVisibleMarkerContent(_ spot: ExploreMapSpot) -> Bool { + spot.hasDetail + || !spot.name.isEmpty + || !spot.badgeText.isEmpty + || !spot.statusText.isEmpty + || !spot.closingText.isEmpty + || !spot.distanceText.isEmpty + || !spot.walkTimeText.isEmpty + } + func matchesCurrentFilters(_ spot: ExploreMapSpot) -> Bool { let matchesCategory = selectedCategory == .all || spot.category == selectedCategory let matchesQuery = trimmedSearchText.isEmpty || spot.name.localizedCaseInsensitiveContains(trimmedSearchText) @@ -976,7 +1019,8 @@ extension ExploreReducer.State { var filteredMapSpots: [ExploreMapSpot] { spots.filter { spot in - selectedCategory == .all || spot.category == selectedCategory + hasVisibleMarkerContent(spot) + && (selectedCategory == .all || spot.category == selectedCategory) } } @@ -1031,7 +1075,7 @@ extension ExploreReducer.State { } let adjacentIndex: Int - if cardDragOffset >= 0 { + if cardDragOffset < 0 { adjacentIndex = (currentIndex + 1) % cardSpots.count } else { adjacentIndex = (currentIndex - 1 + cardSpots.count) % cardSpots.count diff --git a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift index 2794e2d..d23747c 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift @@ -39,11 +39,14 @@ public struct ExploreListFeature { public var searchText: String = "" public var selectedCategory: ExploreCategory = .all public var selectedSort: ExploreListSort = .stationNearest + public var requestSortBy: String = "STATION_NEAREST" public var spots: [ExploreMapSpot] = [] - public var currentPage: Int = 1 + public var currentPage: Int = 0 public var hasNextPage: Bool = true public var isLoading: Bool = false public var currentLocation: CLLocationCoordinate2D? + public var markerLat: Double? + public var markerLon: Double? @Shared(.inMemory("UserSession")) public var userSession: UserSession = .empty public init() {} @@ -52,6 +55,12 @@ public struct ExploreListFeature { self.searchText = exploreState.searchText self.selectedCategory = exploreState.selectedCategory self.currentLocation = exploreState.currentLocation?.coordinate + self.requestSortBy = "STATION_NEAREST" + self.markerLat = exploreState.searchMarkerLat ?? exploreState.userSession.travelStationLat + self.markerLon = exploreState.searchMarkerLon ?? exploreState.userSession.travelStationLng + self.spots = exploreState.spots + self.currentPage = exploreState.currentPage + self.hasNextPage = exploreState.hasNextPage } } @@ -126,33 +135,34 @@ extension ExploreListFeature { ) -> Effect { switch action { case .onAppear: - return .send(.async(.searchPlaces(page: 1, append: false))) + return .send(.async(.searchPlaces(page: 0, append: false))) case .searchTextChanged(let text): state.searchText = text - state.currentPage = 1 + state.currentPage = 0 state.hasNextPage = true return .merge( .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 1, append: false))) + .send(.async(.searchPlaces(page: 0, append: false))) ) case .categoryTapped(let category): state.selectedCategory = category - state.currentPage = 1 + state.currentPage = 0 state.hasNextPage = true return .merge( .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 1, append: false))) + .send(.async(.searchPlaces(page: 0, append: false))) ) case .sortTapped(let sort): state.selectedSort = sort - state.currentPage = 1 + state.requestSortBy = sort.rawValue + state.currentPage = 0 state.hasNextPage = true return .merge( .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 1, append: false))) + .send(.async(.searchPlaces(page: 0, append: false))) ) case .loadNextPage: @@ -182,8 +192,10 @@ extension ExploreListFeature { let trimmedKeyword = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) let keyword = trimmedKeyword.isEmpty ? nil : trimmedKeyword let category: ExploreCategory? = state.selectedCategory == .all ? nil : state.selectedCategory - let baseSpots = append ? state.spots : [] - let sortBy = state.selectedSort.rawValue + let baseSpots = state.spots + let sortBy = state.requestSortBy + let markerLat = state.markerLat ?? userSession.travelStationLat + let markerLon = state.markerLon ?? userSession.travelStationLng return .run { send in let result = await Result { @@ -195,8 +207,8 @@ extension ExploreListFeature { keyword: keyword, category: category, sortBy: sortBy, - markerLat: userSession.travelStationLat, - markerLon: userSession.travelStationLng, + markerLat: markerLat, + markerLon: markerLon, page: page ) } @@ -229,7 +241,7 @@ extension ExploreListFeature { switch action { case let .searchPlacesResponse(pageEntity, append): state.isLoading = false - state.spots = append ? pageEntity.spots : pageEntity.spots.filter(\.hasDetail) + state.spots = pageEntity.spots state.currentPage = pageEntity.currentPage state.hasNextPage = pageEntity.hasNextPage return .none diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift index 4af7175..7488e1b 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift @@ -75,9 +75,10 @@ private extension ExploreListView { var filteredSpots: [ExploreMapSpot] { let query = store.searchText.trimmingCharacters(in: .whitespacesAndNewlines) return store.spots.filter { spot in + let hasDetail = spot.hasDetail let matchesCategory = store.selectedCategory == .all || spot.category == store.selectedCategory let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) - return matchesCategory && matchesQuery + return hasDetail && matchesCategory && matchesQuery } } From 72d12e849e295b5030a6b190e8e5e510bb0896a4 Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 03:52:37 +0900 Subject: [PATCH 13/35] =?UTF-8?q?feat:=20=ED=83=90=EC=83=89=20=EC=A7=80?= =?UTF-8?q?=EB=8F=84-=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99=20=EB=B0=8F=20=EC=9C=84=EC=B9=98=20=ED=8A=B8?= =?UTF-8?q?=EB=A6=AC=EA=B1=B0=20=EA=B0=9C=EC=84=A0=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/NaverMapComponent.swift | 23 ++++++++---- .../Coordinator/Reducer/HomeCoordinator.swift | 27 ++++++++++++++ .../Explore/Reducer/ExploreReducer.swift | 36 ++++++++++++------- .../Sources/Explore/View/ExploreView.swift | 2 +- .../Reducer/ExploreListFeature.swift | 3 +- .../ExploreList/View/ExploreListView.swift | 21 +++++++++++ 6 files changed, 92 insertions(+), 20 deletions(-) diff --git a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift index c5c0958..5957e28 100644 --- a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift +++ b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift @@ -22,7 +22,7 @@ public struct NaverMapComponent: UIViewRepresentable { let destination: Destination? let spots: [ExploreMapSpot] let selectedSpotID: String? - let returnToLocation: Bool // 현재 위치로 돌아가기 트리거 + let returnToLocationTrigger: Int let onSpotTapped: ((String) -> Void)? let onMapTapped: (() -> Void)? @@ -33,6 +33,7 @@ public struct NaverMapComponent: UIViewRepresentable { private static var selectedSpotID: String? private static var lastSyncedSpotID: String? private static var lastDestinationKey: String? + private static var lastReturnToLocationTrigger: Int? private static var routePath: NMFPath? public init( @@ -42,7 +43,7 @@ public struct NaverMapComponent: UIViewRepresentable { destination: Destination? = nil, spots: [ExploreMapSpot] = [], selectedSpotID: String? = nil, - returnToLocation: Bool = false, + returnToLocationTrigger: Int = 0, onSpotTapped: ((String) -> Void)? = nil, onMapTapped: (() -> Void)? = nil ) { @@ -52,7 +53,7 @@ public struct NaverMapComponent: UIViewRepresentable { self.destination = destination self.spots = spots self.selectedSpotID = selectedSpotID - self.returnToLocation = returnToLocation + self.returnToLocationTrigger = returnToLocationTrigger self.onSpotTapped = onSpotTapped self.onMapTapped = onMapTapped } @@ -100,7 +101,10 @@ public struct NaverMapComponent: UIViewRepresentable { public func updateUIView(_ uiView: NMFMapView, context: Context) { context.coordinator.parent = self - let shouldPrioritizeCurrentLocation = returnToLocation && currentLocation != nil + let shouldReturnToLocation = + currentLocation != nil + && Self.lastReturnToLocationTrigger != returnToLocationTrigger + let shouldPrioritizeCurrentLocation = shouldReturnToLocation // 기존 마커들과 경로 제거 Self.currentMarker?.mapView = nil Self.destinationMarker?.mapView = nil @@ -113,7 +117,8 @@ public struct NaverMapComponent: UIViewRepresentable { let location = currentLocation { // 현재 위치로 돌아가기 버튼이 눌렸을 때만 카메라 이동 - if returnToLocation { + if shouldReturnToLocation { + Self.lastReturnToLocationTrigger = returnToLocationTrigger moveCamera( on: uiView, to: NMGLatLng( @@ -213,7 +218,13 @@ public struct NaverMapComponent: UIViewRepresentable { if !shouldPrioritizeCurrentLocation, let selectedSpotID = Self.selectedSpotID, let selectedSpot = spots.first(where: { $0.id == selectedSpotID }) { - if selectedSpotID != previousSpotID { + let currentCameraTarget = uiView.cameraPosition.target + let shouldMoveToSelectedSpot = + selectedSpotID != previousSpotID + || abs(currentCameraTarget.lat - selectedSpot.coordinate.latitude) > 0.000001 + || abs(currentCameraTarget.lng - selectedSpot.coordinate.longitude) > 0.000001 + + if shouldMoveToSelectedSpot { moveCamera( on: uiView, to: NMGLatLng( diff --git a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift index 849788a..4186314 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift @@ -111,6 +111,33 @@ extension HomeCoordinator { return .none } + case let .routeAction(id: id, action: .exploreList(.delegate(.presentExploreMap))): + guard state.routes.indices.contains(id) else { + return .none + } + + let exploreIndex = id - 1 + guard exploreIndex >= 0, + state.routes.indices.contains(exploreIndex) else { + return .send(.view(.backAction)) + } + + switch state.routes[exploreIndex] { + case .push(.explore): + state.routes.goBack() + return .send( + .router( + .routeAction( + id: exploreIndex, + action: .explore(.view(.returnToCurrentLocation)) + ) + ) + ) + + default: + return .send(.view(.backAction)) + } + case .routeAction(id: _, action: .profile(.navigation(.presentRoot))): return .send(.view(.backAction)) diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index fe746bf..c49b067 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -52,6 +52,7 @@ public struct ExploreReducer: Sendable { // 지도 카메라 제어 public var shouldReturnToCurrentLocation: Bool = false + public var returnToCurrentLocationTrigger: Int = 0 public var selectedCategory: ExploreCategory = .all public var isSpotCardVisible: Bool = false public var cardDragOffset: CGFloat = 0 @@ -235,6 +236,10 @@ extension ExploreReducer { return !state.spots.contains(where: { $0.id == selectedSpotID && $0.hasDetail }) } + private func hasUnresolvedBaseSpots(_ spots: [ExploreMapSpot]) -> Bool { + spots.contains(where: { !$0.hasDetail }) + } + private func filteredSpots(state: State) -> [ExploreMapSpot] { let query = currentKeyword(state: state) @@ -498,13 +503,11 @@ extension ExploreReducer { case .returnToCurrentLocation: guard state.currentLocation != nil else { + state.shouldReturnToCurrentLocation = true return .send(.async(.requestCurrentLocation)) } - state.shouldReturnToCurrentLocation = true - return .run { send in - try await Task.sleep(for: .milliseconds(100)) - await send(.inner(.resetCameraFlag)) - } + state.returnToCurrentLocationTrigger += 1 + return .none } } @@ -536,10 +539,9 @@ extension ExploreReducer { case .locationUpdated(let location): state.currentLocation = location if state.shouldReturnToCurrentLocation { - return .run { send in - try await Task.sleep(for: .milliseconds(100)) - await send(.inner(.resetCameraFlag)) - } + state.shouldReturnToCurrentLocation = false + state.returnToCurrentLocationTrigger += 1 + return .none } if !state.hasFetchedPlacesWithCurrentLocation, !state.isLoadingPlaces { @@ -560,7 +562,7 @@ extension ExploreReducer { state.isLoadingPlaces = false state.spots = entities.spots state.currentPage = entities.currentPage - state.hasNextPage = entities.hasNextPage + state.hasNextPage = entities.hasNextPage || hasUnresolvedBaseSpots(entities.spots) state.hasFetchedPlacesWithCurrentLocation = usedCurrentLocation if state.currentLocation != nil && !usedCurrentLocation @@ -591,6 +593,7 @@ extension ExploreReducer { ): state.isLoadingPlaces = false state.hasRequestedPlaces = false + let previousDetailedCount = state.spots.filter(\.hasDetail).count let currentKeyword = currentKeyword(state: state) let currentCategory = currentCategory(state: state) let currentMarkerLat = state.searchMarkerLat @@ -616,8 +619,18 @@ extension ExploreReducer { state.hasFetchedPlacesWithCurrentLocation = usedCurrentLocation state.currentPage = pageEntity.currentPage - state.hasNextPage = pageEntity.hasNextPage let newSpots = pageEntity.spots + let newDetailedCount = newSpots.filter(\.hasDetail).count + let gainedMoreDetail = newDetailedCount > previousDetailedCount + let shouldKeepBootstrappingDetails = + requestedMarkerLat == nil + && requestedMarkerLon == nil + && requestedKeyword.isEmpty + && requestedCategory == nil + && hasUnresolvedBaseSpots(newSpots) + && (requestedPage == 0 || gainedMoreDetail) + + state.hasNextPage = pageEntity.hasNextPage || shouldKeepBootstrappingDetails let firstNewSpotID = newSpots.first(where: \.hasDetail)?.id let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty @@ -807,7 +820,6 @@ extension ExploreReducer { } case .requestCurrentLocation: - state.shouldReturnToCurrentLocation = true return .run { send in let locationManager = await LocationPermissionManager.shared diff --git a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift index 525e721..55da182 100644 --- a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift +++ b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift @@ -68,7 +68,7 @@ private extension ExploreView { selectedSpotID: store.userSession.selectedExploreSpotID.isEmpty ? nil : store.userSession.selectedExploreSpotID, - returnToLocation: store.shouldReturnToCurrentLocation, + returnToLocationTrigger: store.returnToCurrentLocationTrigger, onSpotTapped: { spotID in store.send(.view(.spotTapped(spotID))) }, diff --git a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift index d23747c..170400b 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift @@ -101,6 +101,7 @@ public struct ExploreListFeature { } public enum DelegateAction: Equatable { + case presentExploreMap } @Dependency(\.placeUseCase) var placeUseCase @@ -229,7 +230,7 @@ extension ExploreListFeature { action: DelegateAction ) -> Effect { switch action { - @unknown default: + case .presentExploreMap: return .none } } diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift index 7488e1b..3b72cfd 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift @@ -68,6 +68,9 @@ public struct ExploreListView: View { .onAppear { store.send(.view(.onAppear)) } + .safeAreaInset(edge: .bottom) { + mapButtonSection() + } } } @@ -122,4 +125,22 @@ private extension ExploreListView { } } } + + @ViewBuilder + func mapButtonSection() -> some View { + Button { + store.send(.delegate(.presentExploreMap)) + } label: { + Text("지도보기") + .pretendardCustomFont(textStyle: .body2Bold) + .foregroundStyle(.staticWhite) + .frame(width: 100, height: 36) + .background(.navy900) + .clipShape(RoundedRectangle(cornerRadius: 16)) + .shadow(color: .black.opacity(0.08), radius: 16, y: 8) + } + .frame(maxWidth: .infinity, alignment: .center) + .padding(.bottom, 42) + .background(Color.clear) + } } From d8638fe40c7065e58ab4ae33963b3d7c1e626bc9 Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 04:24:35 +0900 Subject: [PATCH 14/35] =?UTF-8?q?feat:=20=ED=83=90=EC=83=89=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=84=B1=EB=8A=A5=20=EC=B5=9C=EC=A0=81=ED=99=94=20?= =?UTF-8?q?=EB=B0=8F=20=EC=83=81=ED=83=9C=20=EA=B4=80=EB=A6=AC=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 장소 병합 로직을 O(n²)에서 O(n)으로 최적화 - 지도 마커 터치 핸들러 추가로 선택 상태 초기화 - 카드 전환 및 페이지 로딩 상태 관리 개선 - 위치 캐싱으로 불필요한 위치 요청 방지 --- .../Sources/Place/PlaceUseCaseImpl.swift | 17 ++++++---- .../Components/NaverMapComponent.swift | 12 +++++++ .../Explore/Reducer/ExploreReducer.swift | 34 +++++++++++++++---- .../Manager/LocationPermissionManager.swift | 9 +++++ 4 files changed, 58 insertions(+), 14 deletions(-) diff --git a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift index 7a7cb2e..941e835 100644 --- a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift +++ b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift @@ -277,11 +277,13 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { stationLat: Double?, stationLon: Double? ) -> [ExploreMapSpot] { - var mergedSpots = baseSpots + let baseSpotsByID = Dictionary(uniqueKeysWithValues: baseSpots.map { ($0.id, $0) }) + var mergedSpots: [ExploreMapSpot] = [] + var resolvedIDs = Set() for entity in detailPage.content { let id = String(entity.placeId) - let coordinate = mergedSpots.first(where: { $0.id == id })?.coordinate + let coordinate = baseSpotsByID[id]?.coordinate ?? CLLocationCoordinate2D(latitude: entity.lat, longitude: entity.lon) let detailSpot = makeDetailSpot( from: entity, @@ -291,11 +293,12 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { stationLon: stationLon ) - if let index = mergedSpots.firstIndex(where: { $0.id == id }) { - mergedSpots[index] = detailSpot - } else { - mergedSpots.append(detailSpot) - } + mergedSpots.append(detailSpot) + resolvedIDs.insert(id) + } + + for baseSpot in baseSpots where !resolvedIDs.contains(baseSpot.id) { + mergedSpots.append(baseSpot) } return mergedSpots diff --git a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift index 5957e28..bcfc18e 100644 --- a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift +++ b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift @@ -136,6 +136,12 @@ public struct NaverMapComponent: UIViewRepresentable { // 네이버 기본 마커 (빨간색) currentMarker.iconTintColor = UIColor.red + currentMarker.touchHandler = { _ in + Self.selectedSpotID = nil + Self.updateSpotMarkerSelection() + onMapTapped?() + return true + } currentMarker.mapView = uiView Self.currentMarker = currentMarker @@ -156,6 +162,12 @@ public struct NaverMapComponent: UIViewRepresentable { // 네이버 기본 마커 (초록색) destinationMarker.iconTintColor = UIColor.systemGreen + destinationMarker.touchHandler = { _ in + Self.selectedSpotID = nil + Self.updateSpotMarkerSelection() + onMapTapped?() + return true + } destinationMarker.mapView = uiView Self.destinationMarker = destinationMarker diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index c49b067..92a5899 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -426,6 +426,7 @@ extension ExploreReducer { $0.selectedExploreSpotID = spotID } state.isSpotCardVisible = state.spots.contains(where: { $0.id == spotID && $0.hasDetail }) + #logDebug(" [ExploreReducer] spotTapped id=\(spotID), hasDetail=\(state.isSpotCardVisible)") guard !state.spots.contains(where: { $0.id == spotID && $0.hasDetail }), let markerSpot = state.spots.first(where: { $0.id == spotID }) else { return .none @@ -502,6 +503,9 @@ extension ExploreReducer { return .none case .returnToCurrentLocation: + #logDebug( + " [ExploreReducer] returnToCurrentLocation current=\(String(describing: state.currentLocation?.coordinate))" + ) guard state.currentLocation != nil else { state.shouldReturnToCurrentLocation = true return .send(.async(.requestCurrentLocation)) @@ -560,6 +564,7 @@ extension ExploreReducer { case .fetchPlacesResponse(let entities, let usedCurrentLocation): state.isLoadingPlaces = false + state.hasRequestedPlaces = false state.spots = entities.spots state.currentPage = entities.currentPage state.hasNextPage = entities.hasNextPage || hasUnresolvedBaseSpots(entities.spots) @@ -572,6 +577,7 @@ extension ExploreReducer { return .none case .fetchPlacesFailed(let message, let usedCurrentLocation): + state.hasRequestedPlaces = false resetSearchContext(state: &state, clearMarker: false) if usedCurrentLocation { state.hasFetchedPlacesWithCurrentLocation = false @@ -649,8 +655,15 @@ extension ExploreReducer { $0.selectedExploreSpotID = firstNewSpotID } state.isSpotCardVisible = true + state.pendingSelectFirstSpotFromNextPage = false + state.cardBaseOffset = 0 + state.cardDragOffset = 0 + state.isCardTransitioning = false + syncSelectedSpot(state: &state) + return .none } + let wasPendingNextPage = state.pendingSelectFirstSpotFromNextPage state.pendingSelectFirstSpotFromNextPage = false syncSelectedSpot(state: &state) @@ -668,13 +681,21 @@ extension ExploreReducer { clearSelectedSpot(state: &state) } + if wasPendingNextPage { + return .send(.inner(.finishCardTransition)) + } + return .none case .searchPlacesFailed(let message): state.isLoadingPlaces = false state.hasRequestedPlaces = false + let wasPendingNextPage = state.pendingSelectFirstSpotFromNextPage state.pendingSelectFirstSpotFromNextPage = false #logDebug(" [ExploreReducer] 장소 검색 실패: \(message)") + if wasPendingNextPage { + return .send(.inner(.finishCardTransition)) + } return .none // 길찾기 관련 액션 @@ -704,6 +725,7 @@ extension ExploreReducer { case .completeCardSwipe(let next): let cardSpots = state.cardSpots guard !cardSpots.isEmpty else { + #logDebug(" [ExploreReducer] completeCardSwipe ignored: cardSpots empty") return .none } @@ -718,13 +740,11 @@ extension ExploreReducer { if isAtEnd { if state.hasNextPage { - return .concatenate( - .send(.view(.loadNextSpotPage)), - .run { send in - try await Task.sleep(for: .milliseconds(200)) - await send(.inner(.finishCardTransition)) - } - ) + state.isSpotCardVisible = true + state.cardDragOffset = 0 + state.cardBaseOffset = 0 + state.isCardTransitioning = true + return .send(.view(.loadNextSpotPage)) } state.$userSession.withLock { diff --git a/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift b/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift index 1482dfe..2e1ac1e 100644 --- a/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift +++ b/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift @@ -122,6 +122,15 @@ public final class LocationPermissionManager: NSObject, ObservableObject { throw LocationError.permissionDenied } + if let currentLocation { + return currentLocation + } + + if let cachedLocation = locationManager.location { + self.currentLocation = cachedLocation + return cachedLocation + } + if locationContinuation != nil { resumeLocationContinuation(with: .failure(LocationError.locationUnavailable)) } From ffb95bea40514afd74dab324fea710d95525abfc Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 07:08:50 +0900 Subject: [PATCH 15/35] =?UTF-8?q?feat:=20=ED=83=90=EC=83=89=20API=20?= =?UTF-8?q?=EB=8B=A8=EC=88=9C=ED=99=94=20=EB=B0=8F=20UI=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Place/PlaceUseCaseImpl.swift | 73 +++--- .../Coordinator/Reducer/HomeCoordinator.swift | 4 +- .../Components/ExploreSpotListCardView.swift | 15 +- .../Explore/Reducer/ExploreReducer.swift | 6 +- .../Reducer/ExploreListFeature.swift | 30 +-- .../ExploreList/View/ExploreListView.swift | 225 ++++++++++++++---- 6 files changed, 249 insertions(+), 104 deletions(-) diff --git a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift index 941e835..98bbc85 100644 --- a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift +++ b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift @@ -78,14 +78,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { userLat: Double, userLon: Double ) async throws -> ExploreSpotPageEntity { - let placeInput = PlaceInput( - userLat: userLat, - userLon: userLon, - mapLat: userSession.travelStationLat ?? 0, - mapLon: userSession.travelStationLng ?? 0, - stationId: Int(userSession.travelID) ?? 0, - remainingMinutes: 250 - ) + // 🚀 단순화: searchPlaces API 하나만 사용 let searchInput = PlaceSearchInput( userLat: userLat, userLon: userLon, @@ -97,27 +90,30 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { markerLat: userSession.travelStationLat, markerLon: userSession.travelStationLng, page: 0, - size: 10 + size: 30 // 더 많은 데이터 로딩 ) - async let markerEntities = repository.fetchPlaces(placeInput) - async let detailPage = repository.searchPlaces(searchInput) + let pageEntity = try await repository.searchPlaces(searchInput) - let fetchedMarkerEntities = try await markerEntities - let fetchedDetailPage = try await detailPage + print("🚀 [초기로딩] searchPlaces 응답: \(pageEntity.content.count)개") - let mergedSpots = mergeSpots( - baseSpots: fetchedMarkerEntities.map { makeBaseSpot(from: $0) }, - detailPage: fetchedDetailPage, - stationName: userSession.travelStationName, - stationLat: userSession.travelStationLat, - stationLon: userSession.travelStationLng - ) + // 직접 마커 생성 (병합 없이) + let spots = pageEntity.content.map { entity in + makeDetailSpot( + from: entity, + coordinate: CLLocationCoordinate2D(latitude: entity.lat, longitude: entity.lon), + stationName: userSession.travelStationName, + stationLat: userSession.travelStationLat, + stationLon: userSession.travelStationLng + ) + } + + print("🚀 [초기로딩] 최종 spots: \(spots.count)개") return ExploreSpotPageEntity( - spots: mergedSpots, - currentPage: fetchedDetailPage.page + 1, - hasNextPage: !fetchedDetailPage.isLastPage + spots: spots, + currentPage: pageEntity.page + 1, + hasNextPage: !pageEntity.isLastPage ) } @@ -161,6 +157,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { markerLon: Double?, page: Int ) async throws -> ExploreSpotPageEntity { + // 🔍 단순화: searchPlaces API 하나만 사용 let searchInput = PlaceSearchInput( userLat: userLat, userLon: userLon, @@ -172,20 +169,32 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { markerLat: markerLat, markerLon: markerLon, page: page, - size: 10 + size: 30 // 더 많은 데이터 로딩 ) + print("🔍 [API요청] searchExploreSpots - page: \(page), size: 30") + let pageEntity = try await repository.searchPlaces(searchInput) - let mergedSpots = mergeSpots( - baseSpots: baseSpots, - detailPage: pageEntity, - stationName: userSession.travelStationName, - stationLat: userSession.travelStationLat, - stationLon: userSession.travelStationLng - ) + + print("🔍 [API응답] searchExploreSpots - 응답 size: \(pageEntity.content.count), hasNext: \(!pageEntity.isLastPage)") + + print("🔍 [필터링] searchPlaces 응답: \(pageEntity.content.count)개") + + // 직접 마커 생성 (병합 없이) + let spots = pageEntity.content.map { entity in + makeDetailSpot( + from: entity, + coordinate: CLLocationCoordinate2D(latitude: entity.lat, longitude: entity.lon), + stationName: userSession.travelStationName, + stationLat: userSession.travelStationLat, + stationLon: userSession.travelStationLng + ) + } + + print("🔍 [필터링] 최종 spots: \(spots.count)개") return ExploreSpotPageEntity( - spots: mergedSpots, + spots: spots, currentPage: pageEntity.page + 1, hasNextPage: !pageEntity.isLastPage ) diff --git a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift index 4186314..f090320 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift @@ -111,7 +111,7 @@ extension HomeCoordinator { return .none } - case let .routeAction(id: id, action: .exploreList(.delegate(.presentExploreMap))): + case let .routeAction(id: id, action: .exploreList(.delegate(.presentExploreMapAtCurrentLocation))): guard state.routes.indices.contains(id) else { return .none } @@ -204,7 +204,7 @@ extension HomeCoordinator { return .none case let .presentExploreList(exploreState): - state.routes.push(.exploreList(.init(exploreState: exploreState))) + state.routes.push(.exploreList(.init())) return .none } } diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift index 543e4f9..5e07fd2 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift @@ -26,18 +26,17 @@ struct ExploreSpotListCardView: View { .padding(.bottom, 12) } - HStack(alignment: .lastTextBaseline, spacing: 6) { + VStack(alignment: .leading, spacing: 4) { Text(spot.name) .pretendardFont(family: .SemiBold, size: 17) .foregroundStyle(.staticBlack) .lineLimit(2) - .layoutPriority(1) + .frame(maxWidth: .infinity, alignment: .leading) Text(spot.subtitle) .pretendardCustomFont(textStyle: .caption) .foregroundStyle(.gray500) .lineLimit(1) - .fixedSize() } .padding(.bottom, 8) @@ -46,6 +45,7 @@ struct ExploreSpotListCardView: View { Text(spot.statusText) .pretendardCustomFont(textStyle: .body2Medium) .foregroundStyle(.gray700) + .fixedSize() } if !spot.closingText.isEmpty { @@ -53,7 +53,9 @@ struct ExploreSpotListCardView: View { .pretendardCustomFont(textStyle: .body2Regular) .foregroundStyle(.gray500) .lineLimit(1) - .minimumScaleFactor(0.9) + .minimumScaleFactor(0.8) + .frame(maxWidth: .infinity, alignment: .leading) + .truncationMode(.tail) } } .padding(.bottom, 10) @@ -63,6 +65,7 @@ struct ExploreSpotListCardView: View { Text(spot.distanceText) .pretendardFont(family: .SemiBold, size: 15) .foregroundStyle(.staticBlack) + .fixedSize() } if !spot.walkTimeText.isEmpty { @@ -70,7 +73,9 @@ struct ExploreSpotListCardView: View { .pretendardCustomFont(textStyle: .body2Regular) .foregroundStyle(.gray650) .lineLimit(1) - .minimumScaleFactor(0.9) + .minimumScaleFactor(0.8) + .frame(maxWidth: .infinity, alignment: .leading) + .truncationMode(.tail) } } diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index 92a5899..7b65ecd 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -402,7 +402,7 @@ extension ExploreReducer { resetSearchContext(state: &state) return .merge( .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 0, append: false))) + .send(.async(.fetchPlaces)) ) case .categoryTapped(let category): @@ -410,7 +410,7 @@ extension ExploreReducer { resetSearchContext(state: &state) return .merge( .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 0, append: false))) + .send(.async(.fetchPlaces)) ) case .spotTapped(let spotID): @@ -438,7 +438,7 @@ extension ExploreReducer { return .merge( .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 0, append: false))) + .send(.async(.fetchPlaces)) ) case .spotCardChanged(let spotID): diff --git a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift index 170400b..cbb1e47 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift @@ -50,18 +50,6 @@ public struct ExploreListFeature { @Shared(.inMemory("UserSession")) public var userSession: UserSession = .empty public init() {} - - public init(exploreState: ExploreReducer.State) { - self.searchText = exploreState.searchText - self.selectedCategory = exploreState.selectedCategory - self.currentLocation = exploreState.currentLocation?.coordinate - self.requestSortBy = "STATION_NEAREST" - self.markerLat = exploreState.searchMarkerLat ?? exploreState.userSession.travelStationLat - self.markerLon = exploreState.searchMarkerLon ?? exploreState.userSession.travelStationLng - self.spots = exploreState.spots - self.currentPage = exploreState.currentPage - self.hasNextPage = exploreState.hasNextPage - } } public enum Action: ViewAction, BindableAction { @@ -101,7 +89,7 @@ public struct ExploreListFeature { } public enum DelegateAction: Equatable { - case presentExploreMap + case presentExploreMapAtCurrentLocation } @Dependency(\.placeUseCase) var placeUseCase @@ -230,7 +218,7 @@ extension ExploreListFeature { action: DelegateAction ) -> Effect { switch action { - case .presentExploreMap: + case .presentExploreMapAtCurrentLocation: return .none } } @@ -242,7 +230,19 @@ extension ExploreListFeature { switch action { case let .searchPlacesResponse(pageEntity, append): state.isLoading = false - state.spots = pageEntity.spots + + if append { + // 무한 스크롤: 기존 데이터에 새 데이터 추가 (중복 제거) + let existingSpotIDs = Set(state.spots.map { $0.id }) + let uniqueNewSpots = pageEntity.spots.filter { !existingSpotIDs.contains($0.id) } + state.spots.append(contentsOf: uniqueNewSpots) + print("🔄 [무한스크롤] 기존: \(state.spots.count - uniqueNewSpots.count)개 + 신규: \(uniqueNewSpots.count)개 = 총: \(state.spots.count)개") + } else { + // 첫 로딩/새로운 검색: 데이터 교체 + state.spots = pageEntity.spots + print("🆕 [새로고침] 총: \(state.spots.count)개 로딩") + } + state.currentPage = pageEntity.currentPage state.hasNextPage = pageEntity.hasNextPage return .none diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift index 3b72cfd..79f9a8e 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift @@ -23,54 +23,64 @@ public struct ExploreListView: View { public var body: some View { ZStack { - Color.staticWhite - .edgesIgnoringSafeArea(.all) - VStack(spacing: 0) { - ExploreSearchHeaderView( - stationName: store.userSession.travelStationName, - searchText: store.searchText, - selectedCategory: store.selectedCategory, - onBackTap: { dismiss() }, - onSearchTextChanged: { store.send(.view(.searchTextChanged($0))) }, - onCategoryTap: { store.send(.view(.categoryTapped($0))) } - ) - .padding(.top, 8) - .padding(.horizontal, 16) + if store.isLoading && store.spots.isEmpty { + // 스켈레톤 UI + skeletonView() + } else { + ExploreSearchHeaderView( + stationName: store.userSession.travelStationName, + searchText: store.searchText, + selectedCategory: store.selectedCategory, + onBackTap: { dismiss() }, + onSearchTextChanged: { store.send(.view(.searchTextChanged($0))) }, + onCategoryTap: { store.send(.view(.categoryTapped($0))) } + ) + .padding(.top, 8) + .padding(.horizontal, 16) + .background(.staticWhite) - sortSection() - .padding(.top, 28) - .padding(.horizontal, 20) - - ScrollView(showsIndicators: false) { - LazyVStack(spacing: 12) { - ForEach(filteredSpots) { spot in - ExploreSpotListCardView(spot: spot) - .onAppear { - guard spot.id == filteredSpots.last?.id else { return } - store.send(.view(.loadNextPage)) + sortSection() + .padding(.top, 28) + .padding(.horizontal, 16) + .background(.staticWhite) + + ScrollView(showsIndicators: false) { + LazyVStack(spacing: 12) { + ForEach(filteredSpots) { spot in + ExploreSpotListCardView(spot: spot) + .onAppear { + guard spot.id == filteredSpots.last?.id else { return } + store.send(.view(.loadNextPage)) + } + } + + if store.isLoading { + ProgressView() + .frame(maxWidth: .infinity) + .padding(.vertical, 16) } - } - if store.isLoading { - ProgressView() - .frame(maxWidth: .infinity) - .padding(.vertical, 16) + // 플로팅 버튼 공간 + Spacer(minLength: 80) } + .padding(.horizontal, 16) + .padding(.top, 12) } - .padding(.horizontal, 16) - .padding(.top, 12) - .padding(.bottom, 28) + .background(.gray100) } - .background(.gray100) + } + + // 플로팅 지도보기 버튼 + VStack { + Spacer() + floatingMapButton() } } + .background(.staticWhite) .onAppear { store.send(.view(.onAppear)) } - .safeAreaInset(edge: .bottom) { - mapButtonSection() - } } } @@ -87,8 +97,8 @@ private extension ExploreListView { @ViewBuilder func sortSection() -> some View { - HStack { - Spacer() + HStack(spacing: 0) { + Spacer(minLength: 16) Menu { ForEach(ExploreListSort.allCases, id: \.self) { sort in @@ -115,6 +125,10 @@ private extension ExploreListView { Text(store.selectedSort.title) .pretendardCustomFont(textStyle: .bodyMedium) .foregroundStyle(.gray700) + .lineLimit(1) + .minimumScaleFactor(0.6) + .truncationMode(.tail) + .frame(maxWidth: 200, alignment: .trailing) Image(asset: .arrowtriangleDown) .resizable() @@ -122,25 +136,142 @@ private extension ExploreListView { .frame(width: 12, height: 12) } .padding(.vertical, 4) + .padding(.horizontal, 8) } } } @ViewBuilder - func mapButtonSection() -> some View { + func floatingMapButton() -> some View { Button { - store.send(.delegate(.presentExploreMap)) + store.send(.delegate(.presentExploreMapAtCurrentLocation)) } label: { Text("지도보기") .pretendardCustomFont(textStyle: .body2Bold) .foregroundStyle(.staticWhite) - .frame(width: 100, height: 36) - .background(.navy900) - .clipShape(RoundedRectangle(cornerRadius: 16)) - .shadow(color: .black.opacity(0.08), radius: 16, y: 8) + .frame(width: 120, height: 44) + .background(.orange700) + .clipShape(RoundedRectangle(cornerRadius: 22)) + .shadow(color: .black.opacity(0.15), radius: 12, x: 0, y: 4) + .shadow(color: .black.opacity(0.1), radius: 24, x: 0, y: 8) + } + .padding(.bottom, 40) + } + + @ViewBuilder + func skeletonView() -> some View { + VStack(spacing: 0) { + // 검색 헤더 스켈레톤 + VStack(spacing: 20) { + HStack(spacing: 16) { + // 뒤로가기 버튼 + RoundedRectangle(cornerRadius: 8) + .fill(.gray200) + .frame(width: 40, height: 40) + + // 검색바 + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + .frame(height: 44) + } + + // 카테고리 필터 스켈레톤 - 2줄로 배치 + VStack(spacing: 12) { + HStack(spacing: 8) { + ForEach(0..<4, id: \.self) { index in + Capsule() + .fill(.gray200) + .frame(width: CGFloat([80, 60, 70, 90][index]), height: 36) + } + Spacer() + } + + HStack { + Capsule() + .fill(.gray200) + .frame(width: 100, height: 36) + Spacer() + } + } + } + .padding(.horizontal, 16) + .padding(.top, 8) + + // 정렬 옵션 스켈레톤 + HStack { + Spacer() + RoundedRectangle(cornerRadius: 6) + .fill(.gray200) + .frame(width: 100, height: 24) + } + .padding(.top, 24) + .padding(.horizontal, 20) + + // 리스트 스켈레톤 + ScrollView(showsIndicators: false) { + LazyVStack(spacing: 16) { + ForEach(0..<5, id: \.self) { _ in + skeletonListItem() + } + } + .padding(.horizontal, 16) + .padding(.top, 16) + } + .background(.gray100) } - .frame(maxWidth: .infinity, alignment: .center) - .padding(.bottom, 42) - .background(Color.clear) + } + + @ViewBuilder + func skeletonListItem() -> some View { + RoundedRectangle(cornerRadius: 12) + .fill(.staticWhite) + .frame(height: 140) + .overlay { + HStack(spacing: 16) { + VStack(alignment: .leading, spacing: 12) { + // 상단 배지 + RoundedRectangle(cornerRadius: 10) + .fill(.gray200) + .frame(width: 60, height: 20) + + // 제목 + RoundedRectangle(cornerRadius: 6) + .fill(.gray200) + .frame(height: 18) + .frame(maxWidth: .infinity, alignment: .leading) + + // 부제목 라인들 + VStack(alignment: .leading, spacing: 6) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 140, height: 14) + + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 100, height: 14) + } + + Spacer() + + // 하단 정보 + HStack(spacing: 12) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 50, height: 12) + + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 80, height: 12) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + + // 이미지 영역 + RoundedRectangle(cornerRadius: 12) + .fill(.gray200) + .frame(width: 100, height: 100) + } + .padding(16) + } } } From e756e3978dcd20b5182016456ebc48be3de1cb6f Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 15:40:22 +0900 Subject: [PATCH 16/35] =?UTF-8?q?feat:=20=ED=98=84=EC=9E=AC=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=B5=EA=B7=80=20=EA=B8=B0=EB=8A=A5=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20=EB=B0=8F=20=EC=A4=91=EB=B3=B5=20auto-fit=20?= =?UTF-8?q?=EB=B0=A9=EC=A7=80=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/NaverMapComponent.swift | 49 +++++++++++++++++-- .../Explore/Reducer/ExploreReducer.swift | 17 +++++-- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift index bcfc18e..9271984 100644 --- a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift +++ b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift @@ -34,6 +34,7 @@ public struct NaverMapComponent: UIViewRepresentable { private static var lastSyncedSpotID: String? private static var lastDestinationKey: String? private static var lastReturnToLocationTrigger: Int? + private static var lastAutoFitKey: String? private static var routePath: NMFPath? public init( @@ -99,12 +100,29 @@ public struct NaverMapComponent: UIViewRepresentable { return mapView } + public static func dismantleUIView(_ uiView: NMFMapView, coordinator: Coordinator) { + currentMarker?.mapView = nil + destinationMarker?.mapView = nil + routePath?.mapView = nil + spotMarkers.values.forEach { $0.mapView = nil } + spotMarkers.removeAll() + currentMarker = nil + destinationMarker = nil + selectedSpotID = nil + lastSyncedSpotID = nil + lastDestinationKey = nil + lastReturnToLocationTrigger = nil + lastAutoFitKey = nil + routePath = nil + } + public func updateUIView(_ uiView: NMFMapView, context: Context) { context.coordinator.parent = self let shouldReturnToLocation = currentLocation != nil && Self.lastReturnToLocationTrigger != returnToLocationTrigger let shouldPrioritizeCurrentLocation = shouldReturnToLocation + let autoFitKey = makeAutoFitKey(destination: destination, spots: spots) // 기존 마커들과 경로 제거 Self.currentMarker?.mapView = nil Self.destinationMarker?.mapView = nil @@ -119,12 +137,15 @@ public struct NaverMapComponent: UIViewRepresentable { // 현재 위치로 돌아가기 버튼이 눌렸을 때만 카메라 이동 if shouldReturnToLocation { Self.lastReturnToLocationTrigger = returnToLocationTrigger + Self.lastAutoFitKey = autoFitKey + + let target = NMGLatLng( + lat: location.coordinate.latitude, + lng: location.coordinate.longitude + ) moveCamera( on: uiView, - to: NMGLatLng( - lat: location.coordinate.latitude, - lng: location.coordinate.longitude - ), + to: target, zoom: 16 ) } @@ -246,7 +267,11 @@ public struct NaverMapComponent: UIViewRepresentable { zoom: 17 ) } - } else if !shouldPrioritizeCurrentLocation, routeInfo == nil, !spots.isEmpty { + } else if !shouldPrioritizeCurrentLocation, + routeInfo == nil, + !spots.isEmpty, + Self.lastAutoFitKey != autoFitKey { + Self.lastAutoFitKey = autoFitKey adjustCameraToFitSpots( mapView: uiView, spots: spots, @@ -360,6 +385,20 @@ public struct NaverMapComponent: UIViewRepresentable { mapView.moveCamera(cameraUpdate) } + private func makeAutoFitKey( + destination: Destination?, + spots: [ExploreMapSpot] + ) -> String { + let destinationKey = destination.map { + "\($0.name)-\($0.coordinate.latitude)-\($0.coordinate.longitude)" + } ?? "nil" + let spotKey = spots + .map { "\($0.id)-\($0.coordinate.latitude)-\($0.coordinate.longitude)" } + .sorted() + .joined(separator: "|") + return "\(destinationKey)::\(spotKey)" + } + // 3D 효과가 있는 핀 마커 이미지 생성 private func create3DMarkerImage(color: UIColor, size: CGSize) -> UIImage { let renderer = UIGraphicsImageRenderer(size: size) diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index 7b65ecd..25ac57f 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -503,13 +503,24 @@ extension ExploreReducer { return .none case .returnToCurrentLocation: - #logDebug( - " [ExploreReducer] returnToCurrentLocation current=\(String(describing: state.currentLocation?.coordinate))" - ) + // ⭐️ 핵심: 선택된 스팟 클리어 (NaverMapComponent에서 스팟으로 다시 이동하는 것 방지) + state.$userSession.withLock { + $0.selectedExploreSpotID = "" + } + + // 경로만 제거하고 역 목적지 마커는 유지 + state.routeInfo = nil + + // 카드가 올라와있으면 먼저 내리기 + if state.isSpotCardVisible { + clearSelectedSpot(state: &state) + } + guard state.currentLocation != nil else { state.shouldReturnToCurrentLocation = true return .send(.async(.requestCurrentLocation)) } + state.returnToCurrentLocationTrigger += 1 return .none } From 5a7b8f09210598000cb05a4f781b66bf2dd8791c Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 16:10:44 +0900 Subject: [PATCH 17/35] =?UTF-8?q?feat:=20=ED=83=90=EC=83=89=20UI=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=EC=83=89=EC=83=81=20=EC=B2=B4?= =?UTF-8?q?=EA=B3=84=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExploreFloatingControlsView.swift | 2 +- .../ExploreSelectedSpotCardView.swift | 12 +++---- .../Components/ExploreSpotListCardView.swift | 35 ++++++++++++------- .../Explore/Reducer/ExploreReducer.swift | 6 +++- .../ExploreList/View/ExploreListView.swift | 24 ++++++++----- .../Sources/Color/ShapeStyle+.swift | 1 + .../Sources/Image/ImageAsset.swift | 1 + 7 files changed, 52 insertions(+), 29 deletions(-) diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreFloatingControlsView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreFloatingControlsView.swift index e1c376a..c183cb2 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreFloatingControlsView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreFloatingControlsView.swift @@ -51,7 +51,7 @@ struct ExploreFloatingControlsView: View { Text("목록보기") .pretendardCustomFont(textStyle: .body2Medium) } - .foregroundStyle(.gray700) + .foregroundStyle(.gray830) .padding(.horizontal, 12) .padding(.vertical, 6) .frame(width: listButtonWidth, height: 38) diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift index 1aee5e5..2dc9b38 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift @@ -50,7 +50,7 @@ struct ExploreSelectedSpotCardView: View { .padding(.vertical, 2) .background(.orange200) .clipShape(Capsule()) - .padding(.bottom, 8) + .padding(.bottom, 12) } HStack(alignment: .lastTextBaseline, spacing: 6) { @@ -64,20 +64,20 @@ struct ExploreSelectedSpotCardView: View { .foregroundStyle(.gray650) .lineLimit(1) } - .padding(.bottom, 10) + .padding(.bottom, 4) if !spot.statusText.isEmpty || !spot.closingText.isEmpty { HStack(spacing: 12) { if !spot.statusText.isEmpty { Text(spot.statusText) .pretendardCustomFont(textStyle: .body2Medium) - .foregroundStyle(.gray700) + .foregroundStyle(.gray850) } if !spot.closingText.isEmpty { Text(spot.closingText) .pretendardCustomFont(textStyle: .body2Regular) - .foregroundStyle(.gray500) + .foregroundStyle(.gray750) .lineLimit(1) } } @@ -89,13 +89,13 @@ struct ExploreSelectedSpotCardView: View { if !spot.distanceText.isEmpty { Text(spot.distanceText) .pretendardCustomFont(textStyle: .bodyBold) - .foregroundStyle(.staticBlack) + .foregroundStyle(.gray830) } if !spot.walkTimeText.isEmpty { Text(spot.walkTimeText) .pretendardCustomFont(textStyle: .bodyRegular) - .foregroundStyle(.gray650) + .foregroundStyle(.gray830) .lineLimit(1) } } diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift index 5e07fd2..f0e81f4 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift @@ -26,17 +26,10 @@ struct ExploreSpotListCardView: View { .padding(.bottom, 12) } - VStack(alignment: .leading, spacing: 4) { - Text(spot.name) - .pretendardFont(family: .SemiBold, size: 17) - .foregroundStyle(.staticBlack) + VStack(alignment: .leading, spacing: 6) { + titleText .lineLimit(2) .frame(maxWidth: .infinity, alignment: .leading) - - Text(spot.subtitle) - .pretendardCustomFont(textStyle: .caption) - .foregroundStyle(.gray500) - .lineLimit(1) } .padding(.bottom, 8) @@ -51,7 +44,7 @@ struct ExploreSpotListCardView: View { if !spot.closingText.isEmpty { Text(spot.closingText) .pretendardCustomFont(textStyle: .body2Regular) - .foregroundStyle(.gray500) + .foregroundStyle(.gray750) .lineLimit(1) .minimumScaleFactor(0.8) .frame(maxWidth: .infinity, alignment: .leading) @@ -63,7 +56,7 @@ struct ExploreSpotListCardView: View { HStack(spacing: 8) { if !spot.distanceText.isEmpty { Text(spot.distanceText) - .pretendardFont(family: .SemiBold, size: 15) + .pretendardFont(family: .SemiBold, size: 16) .foregroundStyle(.staticBlack) .fixedSize() } @@ -71,7 +64,7 @@ struct ExploreSpotListCardView: View { if !spot.walkTimeText.isEmpty { Text(spot.walkTimeText) .pretendardCustomFont(textStyle: .body2Regular) - .foregroundStyle(.gray650) + .foregroundStyle(.gray830) .lineLimit(1) .minimumScaleFactor(0.8) .frame(maxWidth: .infinity, alignment: .leading) @@ -90,8 +83,24 @@ struct ExploreSpotListCardView: View { .clipShape(RoundedRectangle(cornerRadius: 22)) .overlay { RoundedRectangle(cornerRadius: 22) - .stroke(.gray300.opacity(0.9), lineWidth: 1) + .stroke(.enableColor, lineWidth: 1) + } + } + + private var titleText: Text { + let nameText = Text(spot.name) + .font(.pretendardFontFamily(family: .SemiBold, size: 18)) + .foregroundColor(.staticBlack) + + guard !spot.subtitle.isEmpty else { + return nameText } + + let subtitleText = Text(" \(spot.subtitle)") + .font(.pretendardFontFamily(family: .Medium, size: 14)) + .foregroundColor(.gray700) + + return nameText + subtitleText } @ViewBuilder diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index 25ac57f..5dd54ef 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -448,7 +448,11 @@ extension ExploreReducer { } state.isSpotCardVisible = true } else { - state.isSpotCardVisible = false + clearSelectedSpot(state: &state) + state.searchMarkerLat = nil + state.searchMarkerLon = nil + state.pendingSelectFirstSpotFromNextPage = false + return .cancel(id: CancelID.searchPlaces) } return .none diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift index 79f9a8e..6477af5 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift @@ -146,14 +146,22 @@ private extension ExploreListView { Button { store.send(.delegate(.presentExploreMapAtCurrentLocation)) } label: { - Text("지도보기") - .pretendardCustomFont(textStyle: .body2Bold) - .foregroundStyle(.staticWhite) - .frame(width: 120, height: 44) - .background(.orange700) - .clipShape(RoundedRectangle(cornerRadius: 22)) - .shadow(color: .black.opacity(0.15), radius: 12, x: 0, y: 4) - .shadow(color: .black.opacity(0.1), radius: 24, x: 0, y: 8) + HStack(alignment: .center, spacing: 4) { + Image(asset: .locationBadge) + .resizable() + .scaledToFit() + .frame(width: 16, height: 16) + + Text("지도보기") + .pretendardCustomFont(textStyle: .body2Bold) + .foregroundStyle(.staticWhite) + } + .padding(.horizontal, 15) + .padding(.vertical, 10) + .background(.orange800) + .clipShape(RoundedRectangle(cornerRadius: 22)) + .shadow(color: .black.opacity(0.15), radius: 12, x: 0, y: 4) + .shadow(color: .black.opacity(0.1), radius: 24, x: 0, y: 8) } .padding(.bottom, 40) } diff --git a/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift b/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift index 3d2399a..061ffa3 100644 --- a/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift +++ b/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift @@ -21,6 +21,7 @@ public extension ShapeStyle where Self == Color { static var gray700: Color { .init(hex: "878787") } static var gray750: Color { .init(hex: "595959") } static var gray800: Color { .init(hex: "545454") } + static var gray830: Color { .init(hex: "3D3D3D") } static var gray850: Color { .init(hex: "373737") } static var gray900: Color { .init(hex: "181818") } static var lightGray: Color { .init(hex: "CCCCCC") } diff --git a/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift b/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift index 636511e..0e29510 100644 --- a/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift +++ b/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift @@ -53,6 +53,7 @@ public enum ImageAsset: String { case logo case loginlogo case appLogo + case locationBadge case warning From 3703e685be3a6c5efd3f21b7698c08ba819951a7 Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 16:40:22 +0900 Subject: [PATCH 18/35] =?UTF-8?q?feat:=20=EC=8A=A4=EC=BC=88=EB=A0=88?= =?UTF-8?q?=ED=86=A4=20UI=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=ED=99=94?= =?UTF-8?q?=20=EB=B0=8F=20=EC=A0=9C=EB=AA=A9=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EA=B0=9C=EC=84=A0=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/ExploreSpotListCardView.swift | 47 +++++-- .../View/ExploreListSkeletonView.swift | 116 ++++++++++++++++ .../ExploreList/View/ExploreListView.swift | 124 +----------------- 3 files changed, 154 insertions(+), 133 deletions(-) create mode 100644 Projects/Presentation/Home/Sources/ExploreList/View/ExploreListSkeletonView.swift diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift index f0e81f4..f8fad49 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift @@ -27,9 +27,9 @@ struct ExploreSpotListCardView: View { } VStack(alignment: .leading, spacing: 6) { - titleText - .lineLimit(2) + titleRow .frame(maxWidth: .infinity, alignment: .leading) + .frame(minHeight: titleMinHeight, alignment: .topLeading) } .padding(.bottom, 8) @@ -87,20 +87,43 @@ struct ExploreSpotListCardView: View { } } - private var titleText: Text { - let nameText = Text(spot.name) - .font(.pretendardFontFamily(family: .SemiBold, size: 18)) - .foregroundColor(.staticBlack) + @ViewBuilder + private var titleRow: some View { + HStack(alignment: .top, spacing: 6) { + Text(formattedDisplayName) + .font(.pretendardFontFamily(family: .SemiBold, size: 18)) + .foregroundStyle(.staticBlack) + .lineLimit(titleLineLimit) + .layoutPriority(1) + + if !spot.subtitle.isEmpty { + Text(spot.subtitle) + .font(.pretendardFontFamily(family: .Medium, size: 14)) + .foregroundStyle(.gray700) + .lineLimit(1) + .fixedSize() + .padding(.top, 2) + } - guard !spot.subtitle.isEmpty else { - return nameText + Spacer(minLength: 0) } + } + + private var titleLineLimit: Int { + spot.name.count > 7 ? 2 : 1 + } + + private var titleMinHeight: CGFloat { + spot.name.count > 7 ? 48 : 24 + } - let subtitleText = Text(" \(spot.subtitle)") - .font(.pretendardFontFamily(family: .Medium, size: 14)) - .foregroundColor(.gray700) + private var formattedDisplayName: String { + guard spot.name.count > 7 else { + return spot.name + } - return nameText + subtitleText + let splitIndex = spot.name.index(spot.name.startIndex, offsetBy: 7) + return "\(spot.name[.. some View { - VStack(spacing: 0) { - // 검색 헤더 스켈레톤 - VStack(spacing: 20) { - HStack(spacing: 16) { - // 뒤로가기 버튼 - RoundedRectangle(cornerRadius: 8) - .fill(.gray200) - .frame(width: 40, height: 40) - - // 검색바 - RoundedRectangle(cornerRadius: 20) - .fill(.gray200) - .frame(height: 44) - } - - // 카테고리 필터 스켈레톤 - 2줄로 배치 - VStack(spacing: 12) { - HStack(spacing: 8) { - ForEach(0..<4, id: \.self) { index in - Capsule() - .fill(.gray200) - .frame(width: CGFloat([80, 60, 70, 90][index]), height: 36) - } - Spacer() - } - - HStack { - Capsule() - .fill(.gray200) - .frame(width: 100, height: 36) - Spacer() - } - } - } - .padding(.horizontal, 16) - .padding(.top, 8) - - // 정렬 옵션 스켈레톤 - HStack { - Spacer() - RoundedRectangle(cornerRadius: 6) - .fill(.gray200) - .frame(width: 100, height: 24) - } - .padding(.top, 24) - .padding(.horizontal, 20) - - // 리스트 스켈레톤 - ScrollView(showsIndicators: false) { - LazyVStack(spacing: 16) { - ForEach(0..<5, id: \.self) { _ in - skeletonListItem() - } - } - .padding(.horizontal, 16) - .padding(.top, 16) - } - .background(.gray100) - } - } - - @ViewBuilder - func skeletonListItem() -> some View { - RoundedRectangle(cornerRadius: 12) - .fill(.staticWhite) - .frame(height: 140) - .overlay { - HStack(spacing: 16) { - VStack(alignment: .leading, spacing: 12) { - // 상단 배지 - RoundedRectangle(cornerRadius: 10) - .fill(.gray200) - .frame(width: 60, height: 20) - - // 제목 - RoundedRectangle(cornerRadius: 6) - .fill(.gray200) - .frame(height: 18) - .frame(maxWidth: .infinity, alignment: .leading) - - // 부제목 라인들 - VStack(alignment: .leading, spacing: 6) { - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 140, height: 14) - - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 100, height: 14) - } - - Spacer() - - // 하단 정보 - HStack(spacing: 12) { - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 50, height: 12) - - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 80, height: 12) - } - } - .frame(maxWidth: .infinity, alignment: .leading) - - // 이미지 영역 - RoundedRectangle(cornerRadius: 12) - .fill(.gray200) - .frame(width: 100, height: 100) - } - .padding(16) - } - } } From b311bdc53f70846169428a89bf7b8ef334c77d40 Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 17:19:48 +0900 Subject: [PATCH 19/35] =?UTF-8?q?feat:=20ExploreDetail=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=84=A4=EB=B9=84?= =?UTF-8?q?=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=97=B0=EA=B2=B0=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 새로운 ExploreDetailFeature와 ExploreDetailView 추가 - ExploreSelectedSpotCardView에 탭 제스처 구현 - HomeCoordinator에 ExploreDetail 라우팅 로직 추가 - ExploreListSkeletonView UI 개선 - String nilIfEmpty 확장 유틸리티로 이동 --- .../Coordinator/Reducer/HomeCoordinator.swift | 23 +++- .../View/HomeCoordinatorView.swift | 8 ++ .../ExploreSelectedSpotCardView.swift | 3 + .../Explore/Reducer/ExploreReducer.swift | 14 +-- .../Sources/Explore/View/ExploreView.swift | 3 + .../Reducer/ExploreDetailFeature.swift | 117 ++++++++++++++++++ .../View/ExploreDetailView.swift | 67 ++++++++++ .../View/ExploreListSkeletonView.swift | 87 +++++++------ .../Shared/Utill/Sources/String/String+.swift | 4 + 9 files changed, 277 insertions(+), 49 deletions(-) create mode 100644 Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift create mode 100644 Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift diff --git a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift index f090320..a8454f4 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift @@ -8,6 +8,8 @@ import ComposableArchitecture import TCACoordinators import Profile +import CoreLocation +import Entity @Reducer public struct HomeCoordinator { @@ -50,6 +52,7 @@ public struct HomeCoordinator { case presentProfileWithAnimation case presentExplore case presentExploreList(ExploreReducer.State) + case presentExploreDetail } // MARK: - NavigationAction @@ -111,6 +114,9 @@ extension HomeCoordinator { return .none } + case .routeAction(id: _, action: .explore(.delegate(.presentExplorerDetail))): + return .send(.inner(.presentExploreDetail)) + case let .routeAction(id: id, action: .exploreList(.delegate(.presentExploreMapAtCurrentLocation))): guard state.routes.indices.contains(id) else { return .none @@ -200,11 +206,23 @@ extension HomeCoordinator { return .none case .presentExplore: - state.routes.push(.explore(.init())) + var exploreState = ExploreReducer.State() + if let lat = exploreState.userSession.travelStationLat, + let lng = exploreState.userSession.travelStationLng { + exploreState.selectedDestination = Destination( + name: exploreState.userSession.travelStationName, + coordinate: CLLocationCoordinate2D(latitude: lat, longitude: lng) + ) + } + state.routes.push(.explore(exploreState)) return .none case let .presentExploreList(exploreState): - state.routes.push(.exploreList(.init())) + state.routes.push(.exploreList(.init())) + return .none + + case .presentExploreDetail: + state.routes.push(.exploreDetail(.init())) return .none } } @@ -217,6 +235,7 @@ extension HomeCoordinator { case home(HomeFeature) case explore(ExploreReducer) case exploreList(ExploreListFeature) + case exploreDetail(ExploreDetailFeature) case profile(ProfileCoordinator) } } diff --git a/Projects/Presentation/Home/Sources/Coordinator/View/HomeCoordinatorView.swift b/Projects/Presentation/Home/Sources/Coordinator/View/HomeCoordinatorView.swift index d72cdcb..b96e251 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/View/HomeCoordinatorView.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/View/HomeCoordinatorView.swift @@ -44,6 +44,14 @@ public struct HomeCoordinatorView: View { removal: .move(edge: .leading).combined(with: .opacity) )) + case .exploreDetail(let exploreDetailStore): + ExploreDetailView(store: exploreDetailStore) + .navigationBarBackButtonHidden() + .transition(.asymmetric( + insertion: .move(edge: .trailing).combined(with: .opacity), + removal: .move(edge: .leading).combined(with: .opacity) + )) + case .profile(let profileStore): ProfileCoordinatorView(store: profileStore) .navigationBarBackButtonHidden() diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift index 2dc9b38..3f3edc9 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift @@ -15,6 +15,7 @@ struct ExploreSelectedSpotCardView: View { let currentOffset: CGFloat let adjacentOffset: CGFloat? let cardOpacity: Double + let onCardTap: () -> Void let onRouteTap: () -> Void let onDragChanged: (DragGesture.Value) -> Void let onDragEnded: (DragGesture.Value) -> Void @@ -105,6 +106,8 @@ struct ExploreSelectedSpotCardView: View { spotImage(for: spot) } + .contentShape(Rectangle()) + .onTapGesture(perform: onCardTap) .padding(.horizontal, 16) .padding(.top, 16) .padding(.bottom, 20) diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index 5dd54ef..bcd7b66 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -13,6 +13,7 @@ import CoreLocation import UseCase import Entity import LogMacro +import Utill @Reducer public struct ExploreReducer: Sendable { @@ -144,6 +145,7 @@ public struct ExploreReducer: Sendable { public enum DelegateAction: Equatable { case presentExploreList + case presentExplorerDetail } @Dependency(\.getRouteUseCase) var getRouteUseCase @@ -507,7 +509,6 @@ extension ExploreReducer { return .none case .returnToCurrentLocation: - // ⭐️ 핵심: 선택된 스팟 클리어 (NaverMapComponent에서 스팟으로 다시 이동하는 것 방지) state.$userSession.withLock { $0.selectedExploreSpotID = "" } @@ -1009,6 +1010,9 @@ extension ExploreReducer { switch action { case .presentExploreList: return .none + + case .presentExplorerDetail: + return .none } } @@ -1157,14 +1161,6 @@ extension ExploreReducer.State: Hashable { hasher.combine(userSession) } } - - -private extension String { - var nilIfEmpty: String? { - isEmpty ? nil : self - } -} - extension ExploreReducer.AsyncAction { public static func == (lhs: Self, rhs: Self) -> Bool { switch (lhs, rhs) { diff --git a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift index 55da182..1fb475e 100644 --- a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift +++ b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift @@ -103,6 +103,9 @@ private extension ExploreView { currentOffset: store.cardBaseOffset + store.cardDragOffset, adjacentOffset: adjacentCardOffset, cardOpacity: cardOpacity, + onCardTap: { + store.send(.delegate(.presentExplorerDetail)) + }, onRouteTap: {}, onDragChanged: { value in store.send(.view(.cardDragChanged(value.translation.width))) diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift b/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift new file mode 100644 index 0000000..1d4f45c --- /dev/null +++ b/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift @@ -0,0 +1,117 @@ +// +// ExploreDetailFeature.swift +// Home +// +// Created by Wonji Suh on 3/28/26. +// + + +import Foundation +import ComposableArchitecture + + +@Reducer +public struct ExploreDetailFeature { + public init() {} + + @ObservableState + public struct State: Equatable { + + public init() {} + } + + public enum Action: ViewAction, BindableAction { + case binding(BindingAction) + case view(View) + case async(AsyncAction) + case inner(InnerAction) + case delegate(DelegateAction) + + } + + //MARK: - ViewAction + @CasePathable + public enum View { + + } + + + + //MARK: - AsyncAction 비동기 처리 액션 + public enum AsyncAction: Equatable { + + } + + //MARK: - 앱내에서 사용하는 액션 + public enum InnerAction: Equatable { + } + + //MARK: - NavigationAction + public enum DelegateAction: Equatable { + + + } + + + public var body: some Reducer { + BindingReducer() + Reduce { state, action in + switch action { + case .binding(_): + return .none + + case .view(let viewAction): + return handleViewAction(state: &state, action: viewAction) + + case .async(let asyncAction): + return handleAsyncAction(state: &state, action: asyncAction) + + case .inner(let innerAction): + return handleInnerAction(state: &state, action: innerAction) + + case .delegate(let delegateAction): + return handleDelegateAction(state: &state, action: delegateAction) + } + } + } +} + +extension ExploreDetailFeature { + private func handleViewAction( + state: inout State, + action: View + ) -> Effect { + switch action { + + } + } + + private func handleAsyncAction( + state: inout State, + action: AsyncAction + ) -> Effect { + switch action { + + } + } + + private func handleDelegateAction( + state: inout State, + action: DelegateAction + ) -> Effect { + switch action { + + } + } + + private func handleInnerAction( + state: inout State, + action: InnerAction + ) -> Effect { + switch action { + + } + } +} + +extension ExploreDetailFeature.State: Hashable {} diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift new file mode 100644 index 0000000..ce1e3b4 --- /dev/null +++ b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift @@ -0,0 +1,67 @@ +// +// ExploreDetailView.swift +// Home +// +// Created by Wonji Suh on 3/28/26. +// + + +import SwiftUI +import DesignSystem + +import ComposableArchitecture + +public struct ExploreDetailView: View { + @Bindable var store: StoreOf + @Environment(\.dismiss) private var dismiss + + public init( + store: StoreOf + ) { + self.store = store + } + + public var body: some View { + ZStack { + Color.gray100 + .edgesIgnoringSafeArea(.all) + + VStack { + Spacer() + .frame(height: 8) + + CustomNavigationBackBar(buttonAction: { + dismiss() + }, title: "") + + + exploreSpotNameTitle() + + Spacer() + } + } + } +} + + +private extension ExploreDetailView { + + @ViewBuilder + func exploreSpotNameTitle() -> some View { + VStack(alignment: .leading) { + Spacer() + .frame(height: 24) + + HStack(spacing: 8) { + Text("시티뷰 전망대") + .pretendardCustomFont(textStyle: .heading1) + .foregroundStyle(.staticBlack) + + Text("관광지") + .pretendardCustomFont(textStyle: .body2Regular) + .foregroundStyle(.gray700) + } + } + } + +} diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListSkeletonView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListSkeletonView.swift index e5c6add..0af6359 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListSkeletonView.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListSkeletonView.swift @@ -9,58 +9,69 @@ import DesignSystem struct ExploreListSkeletonView: View { var body: some View { - VStack(spacing: 0) { - VStack(spacing: 20) { - HStack(spacing: 16) { - RoundedRectangle(cornerRadius: 8) - .fill(.gray200) - .frame(width: 40, height: 40) + ZStack { + VStack(spacing: 0) { + VStack(spacing: 20) { + HStack(spacing: 16) { + RoundedRectangle(cornerRadius: 8) + .fill(.gray200) + .frame(width: 40, height: 40) - RoundedRectangle(cornerRadius: 20) - .fill(.gray200) - .frame(height: 44) - } + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + .frame(height: 44) + } + + VStack(spacing: 12) { + HStack(spacing: 8) { + ForEach(0..<4, id: \.self) { index in + Capsule() + .fill(.gray200) + .frame(width: CGFloat([80, 60, 70, 90][index]), height: 36) + } + Spacer() + } - VStack(spacing: 12) { - HStack(spacing: 8) { - ForEach(0..<4, id: \.self) { index in + HStack { Capsule() .fill(.gray200) - .frame(width: CGFloat([80, 60, 70, 90][index]), height: 36) + .frame(width: 100, height: 36) + Spacer() } - Spacer() } + } + .padding(.horizontal, 16) + .padding(.top, 8) - HStack { - Capsule() - .fill(.gray200) - .frame(width: 100, height: 36) - Spacer() + HStack { + Spacer() + RoundedRectangle(cornerRadius: 6) + .fill(.gray200) + .frame(width: 100, height: 24) + } + .padding(.top, 24) + .padding(.horizontal, 20) + + ScrollView(showsIndicators: false) { + LazyVStack(spacing: 16) { + ForEach(0..<5, id: \.self) { _ in + ExploreListSkeletonItemView() + } } + .padding(.horizontal, 16) + .padding(.top, 16) + .padding(.bottom, 100) } + .background(.gray100) } - .padding(.horizontal, 16) - .padding(.top, 8) - HStack { + VStack { Spacer() - RoundedRectangle(cornerRadius: 6) + Capsule() .fill(.gray200) - .frame(width: 100, height: 24) - } - .padding(.top, 24) - .padding(.horizontal, 20) - - ScrollView(showsIndicators: false) { - LazyVStack(spacing: 16) { - ForEach(0..<5, id: \.self) { _ in - ExploreListSkeletonItemView() - } - } - .padding(.horizontal, 16) - .padding(.top, 16) + .frame(width: 108, height: 44) + .padding(.bottom, 40) } - .background(.gray100) } } } diff --git a/Projects/Shared/Utill/Sources/String/String+.swift b/Projects/Shared/Utill/Sources/String/String+.swift index c03b336..245665e 100644 --- a/Projects/Shared/Utill/Sources/String/String+.swift +++ b/Projects/Shared/Utill/Sources/String/String+.swift @@ -146,4 +146,8 @@ public extension String { } return self } + + var nilIfEmpty: String? { + isEmpty ? nil : self + } } From c77111e32bead56902f6360fd0aec5efd4f673e4 Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 19:49:17 +0900 Subject: [PATCH 20/35] =?UTF-8?q?refactor:=20rename=20lat/lng=20to=20userL?= =?UTF-8?q?at/userLon=20=EC=88=98=EC=A0=95=20#14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Station/StationRepositoryImpl.swift | 8 ++++---- .../Service/Sources/Station/StationRequest.swift | 12 ++++++------ .../map/spotPin.imageset/Contents.json | 12 ++++++++++++ .../map/spotPin.imageset/spotLocation.svg | 4 ++++ 4 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/spotPin.imageset/Contents.json create mode 100644 Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/spotPin.imageset/spotLocation.svg diff --git a/Projects/Data/Repository/Sources/Station/StationRepositoryImpl.swift b/Projects/Data/Repository/Sources/Station/StationRepositoryImpl.swift index 2fe8b45..74c9e26 100644 --- a/Projects/Data/Repository/Sources/Station/StationRepositoryImpl.swift +++ b/Projects/Data/Repository/Sources/Station/StationRepositoryImpl.swift @@ -27,14 +27,14 @@ public final class StationRepositoryImpl: StationInterface, @unchecked Sendable } public func fetchStations( - lat: Double, - lng: Double, + userLat: Double, + userLon: Double, page: Int, size: Int ) async throws -> StationListEntity { let body: StationRequest = .init( - lat: lat, - lng: lng, + userLat: userLat, + userLon: userLon, page: page, size: size, sort: "stationName,ASC" diff --git a/Projects/Data/Service/Sources/Station/StationRequest.swift b/Projects/Data/Service/Sources/Station/StationRequest.swift index 4aa62e6..32e47a1 100644 --- a/Projects/Data/Service/Sources/Station/StationRequest.swift +++ b/Projects/Data/Service/Sources/Station/StationRequest.swift @@ -8,21 +8,21 @@ import Foundation public struct StationRequest: Encodable, Equatable { - public let lat: Double - public let lng: Double + public let userLat: Double + public let userLon: Double public let page: Int public let size: Int public let sort: String public init( - lat: Double, - lng: Double, + userLat: Double, + userLon: Double, page: Int = 1, size: Int = 10, sort: String = "stationName,ASC" ) { - self.lat = lat - self.lng = lng + self.userLat = userLat + self.userLon = userLon self.page = max(page, 1) self.size = max(size, 10) self.sort = sort diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/spotPin.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/spotPin.imageset/Contents.json new file mode 100644 index 0000000..9e83b8f --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/spotPin.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "spotLocation.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/spotPin.imageset/spotLocation.svg b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/spotPin.imageset/spotLocation.svg new file mode 100644 index 0000000..f3ca443 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/map/spotPin.imageset/spotLocation.svg @@ -0,0 +1,4 @@ + + + + From f734b6ad4f231f4b0332492035187fd070c38ff7 Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 22:11:44 +0900 Subject: [PATCH 21/35] =?UTF-8?q?feat:=20=EC=B9=B4=EB=A9=94=EB=9D=BC=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9C=84=EC=B9=98=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 위치 접근 제어를 위한 LocationPermissionManager 추가 - 카메라 작업을 위한 CameraControlResult 엔티티 및 CameraUseCase 추가 - 위치 관련 비즈니스 로직을 위한 LocationUseCase 추가 - 역 저장소 및 유스케이스 인터페이스 업데이트 --- .../Location/LocationPermissionManager.swift | 304 ++++++++++++++++++ .../DefaultStationRepositoryImpl.swift | 4 +- .../Sources/Station/StationInterface.swift | 4 +- .../Sources/Camera/CameraControlResult.swift | 30 ++ .../Sources/Camera/CameraUseCase.swift | 99 ++++++ .../Sources/Location/LocationUseCase.swift | 98 ++++++ .../Sources/Station/StationUseCaseImpl.swift | 8 +- 7 files changed, 539 insertions(+), 8 deletions(-) create mode 100644 Projects/Domain/DomainInterface/Sources/Location/LocationPermissionManager.swift create mode 100644 Projects/Domain/Entity/Sources/Camera/CameraControlResult.swift create mode 100644 Projects/Domain/UseCase/Sources/Camera/CameraUseCase.swift create mode 100644 Projects/Domain/UseCase/Sources/Location/LocationUseCase.swift diff --git a/Projects/Domain/DomainInterface/Sources/Location/LocationPermissionManager.swift b/Projects/Domain/DomainInterface/Sources/Location/LocationPermissionManager.swift new file mode 100644 index 0000000..1dfb652 --- /dev/null +++ b/Projects/Domain/DomainInterface/Sources/Location/LocationPermissionManager.swift @@ -0,0 +1,304 @@ +// +// LocationPermissionManager.swift +// DomainInterface +// +// Created by Wonji Suh on 3/28/26. +// + +import Foundation +import CoreLocation +import UIKit + +// MARK: - Location Errors +public enum LocationError: Error, LocalizedError, Equatable { + case permissionDenied + case locationUnavailable + case timeout + case networkError + case unknown(String) + + public var errorDescription: String? { + switch self { + case .permissionDenied: + return "위치 권한이 거부되었습니다." + case .locationUnavailable: + return "위치 정보를 가져올 수 없습니다." + case .timeout: + return "위치 요청 시간이 초과되었습니다." + case .networkError: + return "네트워크 오류가 발생했습니다." + case .unknown(let message): + return message + } + } +} + +// MARK: - LocationPermissionManager Protocol +public protocol LocationPermissionManagerProtocol: Sendable { + var authorizationStatus: CLAuthorizationStatus { get async } + var currentLocation: CLLocation? { get async } + var locationError: String? { get async } + + func requestLocationPermission() async -> CLAuthorizationStatus + func requestFullAccuracy() async + func startLocationUpdates() async + func stopLocationUpdates() async + func requestCurrentLocation() async throws -> CLLocation? + func isLocationServicesEnabled() async -> Bool + func openLocationSettings() + + // 콜백 설정 + func setLocationUpdateCallback(_ callback: @escaping @Sendable (CLLocation) -> Void) async + func setLocationErrorCallback(_ callback: @escaping @Sendable (Error) -> Void) async +} + +// MARK: - LocationPermissionManager Implementation +@MainActor +public final class LocationPermissionManager: NSObject, ObservableObject, LocationPermissionManagerProtocol { + + // 싱글톤 인스턴스 + public static let shared = LocationPermissionManager() + @Published public private(set) var authorizationStatus: CLAuthorizationStatus = .notDetermined + @Published public private(set) var currentLocation: CLLocation? + @Published public private(set) var locationError: String? + + private let locationManager = CLLocationManager() + private var authorizationContinuation: CheckedContinuation? + private var locationContinuation: CheckedContinuation? + private var locationTimeoutTask: Task? + + // 지속적인 위치 업데이트 콜백 (MainActor 격리) + @MainActor + public var onLocationUpdate: ((CLLocation) -> Void)? + @MainActor + public var onLocationError: ((Error) -> Void)? + + public override init() { + super.init() + setupLocationManager() + } + + private func setupLocationManager() { + locationManager.delegate = self + locationManager.desiredAccuracy = kCLLocationAccuracyBest + locationManager.distanceFilter = 10 // 10미터 이상 이동시 업데이트 + authorizationStatus = locationManager.authorizationStatus + } + + // MARK: - LocationPermissionManagerProtocol Implementation + + public func setLocationUpdateCallback(_ callback: @escaping @Sendable (CLLocation) -> Void) async { + self.onLocationUpdate = callback + } + + public func setLocationErrorCallback(_ callback: @escaping @Sendable (Error) -> Void) async { + self.onLocationError = callback + } + + // async/await을 사용한 위치 권한 요청 + public func requestLocationPermission() async -> CLAuthorizationStatus { + let isLocationServicesEnabled = await Task.detached { + CLLocationManager.locationServicesEnabled() + }.value + + guard isLocationServicesEnabled else { + locationError = "위치 서비스가 비활성화되어 있습니다. 설정에서 활성화해 주세요." + return .denied + } + + // authorizationStatus는 델리게이트에서 업데이트된 값 사용 + switch authorizationStatus { + case .notDetermined: + return await withCheckedContinuation { continuation in + self.authorizationContinuation = continuation + locationManager.requestWhenInUseAuthorization() + } + case .denied, .restricted: + locationError = "위치 권한이 거부되었습니다. 설정에서 허용해 주세요." + return authorizationStatus + case .authorizedWhenInUse, .authorizedAlways: + return authorizationStatus + @unknown default: + locationError = "알 수 없는 위치 권한 상태입니다." + return authorizationStatus + } + } + + // iOS 14+ 정확한 위치 권한 요청 + public func requestFullAccuracy() async { + if #available(iOS 14.0, *) { + do { + try await locationManager.requestTemporaryFullAccuracyAuthorization( + withPurposeKey: "TimeSpotLocationAccuracy" + ) + } catch { + locationError = "정확한 위치 권한 요청에 실패했습니다." + } + } + } + + // 위치 업데이트 시작 + public func startLocationUpdates() async { + #if os(iOS) + guard authorizationStatus == .authorizedWhenInUse || authorizationStatus == .authorizedAlways else { + locationError = "위치 권한이 없습니다." + return + } + #else + guard authorizationStatus == .authorizedAlways else { + locationError = "위치 권한이 없습니다." + return + } + #endif + + locationManager.startUpdatingLocation() + } + + // 위치 업데이트 중지 + public func stopLocationUpdates() async { + locationManager.stopUpdatingLocation() + } + + // async/await을 사용한 현재 위치 가져오기 + public func requestCurrentLocation() async throws -> CLLocation? { + #if os(iOS) + guard authorizationStatus == .authorizedWhenInUse || authorizationStatus == .authorizedAlways else { + locationError = "위치 권한이 없습니다." + throw LocationError.permissionDenied + } + #else + guard authorizationStatus == .authorizedAlways else { + locationError = "위치 권한이 없습니다." + throw LocationError.permissionDenied + } + #endif + + if let currentLocation { + return currentLocation + } + + if let cachedLocation = locationManager.location { + self.currentLocation = cachedLocation + return cachedLocation + } + + if locationContinuation != nil { + resumeLocationContinuation(with: .failure(LocationError.locationUnavailable)) + } + + return try await withCheckedThrowingContinuation { continuation in + self.locationContinuation = continuation + self.locationTimeoutTask?.cancel() + self.locationTimeoutTask = Task { [weak self] in + guard let self else { return } + try? await Task.sleep(for: .seconds(5)) + guard !Task.isCancelled else { return } + self.resumeLocationContinuation(with: .failure(LocationError.timeout)) + } + + if #available(iOS 14.0, *) { + locationManager.requestLocation() + } else { + // iOS 14 이전에서는 잠시 업데이트하고 중지 + locationManager.startUpdatingLocation() + Task { + try? await Task.sleep(for: .seconds(3)) + await self.stopLocationUpdates() + } + } + } + } + + // 위치 서비스 사용 가능 여부 + public func isLocationServicesEnabled() async -> Bool { + await Task.detached { + CLLocationManager.locationServicesEnabled() + }.value + } + + public func openLocationSettings() { + guard let settingsURL = URL(string: UIApplication.openSettingsURLString), + UIApplication.shared.canOpenURL(settingsURL) else { + return + } + + UIApplication.shared.open(settingsURL) + } + + // 권한 상태 문자열 + public var authorizationStatusString: String { + switch authorizationStatus { + case .notDetermined: + return "권한 미결정" + case .restricted: + return "권한 제한됨" + case .denied: + return "권한 거부됨" + case .authorizedAlways: + return "항상 허용" + case .authorizedWhenInUse: + return "사용 중 허용" + @unknown default: + return "알 수 없음" + } + } + + private func resumeLocationContinuation(with result: Result) { + locationTimeoutTask?.cancel() + locationTimeoutTask = nil + + guard let continuation = locationContinuation else { return } + locationContinuation = nil + + switch result { + case .success(let location): + continuation.resume(returning: location) + case .failure(let error): + continuation.resume(throwing: error) + } + } +} + +// MARK: - CLLocationManagerDelegate +extension LocationPermissionManager: CLLocationManagerDelegate { + + nonisolated public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + guard let location = locations.last else { return } + + Task { @MainActor in + self.currentLocation = location + self.locationError = nil + + // 지속적인 위치 업데이트 콜백 호출 + self.onLocationUpdate?(location) + + // continuation이 있으면 결과 반환 (일회성 요청용) + self.resumeLocationContinuation(with: .success(location)) + } + } + + nonisolated public func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + Task { @MainActor in + self.locationError = "위치 업데이트 실패: \(error.localizedDescription)" + + // 지속적인 위치 업데이트 에러 콜백 호출 + self.onLocationError?(error) + + // continuation이 있으면 에러 반환 (일회성 요청용) + self.resumeLocationContinuation(with: .failure(error)) + } + } + + nonisolated public func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + Task { @MainActor in + self.authorizationStatus = status + self.locationError = nil + + // continuation이 있으면 권한 상태 반환 + if let continuation = self.authorizationContinuation { + self.authorizationContinuation = nil + continuation.resume(returning: status) + } + } + } +} diff --git a/Projects/Domain/DomainInterface/Sources/Station/DefaultStationRepositoryImpl.swift b/Projects/Domain/DomainInterface/Sources/Station/DefaultStationRepositoryImpl.swift index 0442f7b..af32bb6 100644 --- a/Projects/Domain/DomainInterface/Sources/Station/DefaultStationRepositoryImpl.swift +++ b/Projects/Domain/DomainInterface/Sources/Station/DefaultStationRepositoryImpl.swift @@ -12,8 +12,8 @@ final public class DefaultStationRepositoryImpl: StationInterface { public init() {} public func fetchStations( - lat: Double, - lng: Double, + userLat: Double, + userLon: Double, page: Int, size: Int ) async throws -> StationListEntity { diff --git a/Projects/Domain/DomainInterface/Sources/Station/StationInterface.swift b/Projects/Domain/DomainInterface/Sources/Station/StationInterface.swift index 82e5cfb..f4feadb 100644 --- a/Projects/Domain/DomainInterface/Sources/Station/StationInterface.swift +++ b/Projects/Domain/DomainInterface/Sources/Station/StationInterface.swift @@ -11,8 +11,8 @@ import WeaveDI public protocol StationInterface: Sendable { func fetchStations( - lat: Double, - lng: Double, + userLat: Double, + userLon: Double, page: Int, size: Int ) async throws -> StationListEntity diff --git a/Projects/Domain/Entity/Sources/Camera/CameraControlResult.swift b/Projects/Domain/Entity/Sources/Camera/CameraControlResult.swift new file mode 100644 index 0000000..ace2cd7 --- /dev/null +++ b/Projects/Domain/Entity/Sources/Camera/CameraControlResult.swift @@ -0,0 +1,30 @@ +// +// CameraControlResult.swift +// Entity +// +// Created by Wonji Suh on 3/28/26. +// + +import Foundation + +public struct CameraControlResult: Equatable { + public let shouldUpdateTrigger: Bool + public let newTrigger: Int + public let shouldClearSpot: Bool + public let shouldResetFlag: Bool + public let shouldDismissCard: Bool + + public init( + shouldUpdateTrigger: Bool = false, + newTrigger: Int = 0, + shouldClearSpot: Bool = false, + shouldResetFlag: Bool = false, + shouldDismissCard: Bool = false + ) { + self.shouldUpdateTrigger = shouldUpdateTrigger + self.newTrigger = newTrigger + self.shouldClearSpot = shouldClearSpot + self.shouldResetFlag = shouldResetFlag + self.shouldDismissCard = shouldDismissCard + } +} \ No newline at end of file diff --git a/Projects/Domain/UseCase/Sources/Camera/CameraUseCase.swift b/Projects/Domain/UseCase/Sources/Camera/CameraUseCase.swift new file mode 100644 index 0000000..7294244 --- /dev/null +++ b/Projects/Domain/UseCase/Sources/Camera/CameraUseCase.swift @@ -0,0 +1,99 @@ +// +// CameraUseCase.swift +// UseCase +// +// Created by Wonji Suh on 3/28/26. +// + +import Foundation +import CoreLocation +import Entity +import ComposableArchitecture + +// MARK: - CameraUseCaseInterface Protocol + +public protocol CameraUseCaseInterface: Sendable { + /// 현재 위치로 돌아가기 트리거 생성 + func createReturnToCurrentLocationTrigger( + currentTrigger: Int, + hasCurrentLocation: Bool + ) -> CameraControlResult + + /// 선택된 스팟 클리어 및 관련 상태 업데이트 + func clearSelectedSpotForLocationReturn( + selectedSpotID: String, + isCardVisible: Bool + ) -> CameraControlResult + + /// 카메라 플래그 리셋 + func resetCameraFlag() -> CameraControlResult + + /// 위치 업데이트 시 카메라 트리거 처리 + func handleLocationUpdateForCamera( + shouldReturnToLocation: Bool, + currentTrigger: Int + ) -> CameraControlResult +} + +// MARK: - CameraUseCaseImpl + +public struct CameraUseCaseImpl: CameraUseCaseInterface { + public init() {} + + public func createReturnToCurrentLocationTrigger( + currentTrigger: Int, + hasCurrentLocation: Bool + ) -> CameraControlResult { + guard hasCurrentLocation else { + return CameraControlResult(shouldResetFlag: false) + } + + return CameraControlResult( + shouldUpdateTrigger: true, + newTrigger: currentTrigger + 1, + shouldClearSpot: true + ) + } + + public func clearSelectedSpotForLocationReturn( + selectedSpotID: String, + isCardVisible: Bool + ) -> CameraControlResult { + return CameraControlResult( + shouldClearSpot: !selectedSpotID.isEmpty, + shouldDismissCard: isCardVisible + ) + } + + public func resetCameraFlag() -> CameraControlResult { + return CameraControlResult(shouldResetFlag: true) + } + + public func handleLocationUpdateForCamera( + shouldReturnToLocation: Bool, + currentTrigger: Int + ) -> CameraControlResult { + guard shouldReturnToLocation else { + return CameraControlResult() + } + + return CameraControlResult( + shouldUpdateTrigger: true, + newTrigger: currentTrigger + 1, + shouldResetFlag: true + ) + } +} + +// MARK: - Dependency Extension + +extension DependencyValues { + public var cameraUseCase: CameraUseCaseInterface { + get { self[CameraUseCaseKey.self] } + set { self[CameraUseCaseKey.self] = newValue } + } +} + +private enum CameraUseCaseKey: DependencyKey { + static let liveValue: CameraUseCaseInterface = CameraUseCaseImpl() +} diff --git a/Projects/Domain/UseCase/Sources/Location/LocationUseCase.swift b/Projects/Domain/UseCase/Sources/Location/LocationUseCase.swift new file mode 100644 index 0000000..b765a77 --- /dev/null +++ b/Projects/Domain/UseCase/Sources/Location/LocationUseCase.swift @@ -0,0 +1,98 @@ +// +// LocationUseCase.swift +// UseCase +// +// Created by Wonji Suh on 3/28/26. +// + +import Foundation +import CoreLocation +import ComposableArchitecture +import DomainInterface + +// MARK: - LocationUseCaseInterface Protocol + +public protocol LocationUseCaseInterface: Sendable { + /// 위치 권한 상태 확인 + func getAuthorizationStatus() async -> CLAuthorizationStatus + + /// 위치 권한 요청 + func requestLocationPermission() async -> CLAuthorizationStatus + + /// 정확도 개선 요청 + func requestFullAccuracy() async + + /// 위치 업데이트 시작 및 콜백 설정 + func startLocationUpdates( + onUpdate: @escaping @Sendable (CLLocation) -> Void, + onError: @escaping @Sendable (Error) -> Void + ) async + + /// 위치 업데이트 중지 + func stopLocationUpdates() async + + /// 현재 위치 한번만 요청 + func requestCurrentLocation() async throws -> CLLocation? + + /// 위치 서비스 사용 가능 여부 + func isLocationServicesEnabled() async -> Bool +} + +// MARK: - LocationUseCaseImpl + +public struct LocationUseCaseImpl: LocationUseCaseInterface { + public init() {} + + public func getAuthorizationStatus() async -> CLAuthorizationStatus { + let locationManager = LocationPermissionManager.shared + return await locationManager.authorizationStatus + } + + public func requestLocationPermission() async -> CLAuthorizationStatus { + let locationManager = LocationPermissionManager.shared + return await locationManager.requestLocationPermission() + } + + public func requestFullAccuracy() async { + let locationManager = LocationPermissionManager.shared + await locationManager.requestFullAccuracy() + } + + public func startLocationUpdates( + onUpdate: @escaping @Sendable (CLLocation) -> Void, + onError: @escaping @Sendable (Error) -> Void + ) async { + let locationManager = LocationPermissionManager.shared + await locationManager.setLocationUpdateCallback(onUpdate) + await locationManager.setLocationErrorCallback(onError) + await locationManager.startLocationUpdates() + } + + public func stopLocationUpdates() async { + let locationManager = LocationPermissionManager.shared + await locationManager.stopLocationUpdates() + } + + public func requestCurrentLocation() async throws -> CLLocation? { + let locationManager = LocationPermissionManager.shared + return try await locationManager.requestCurrentLocation() + } + + public func isLocationServicesEnabled() async -> Bool { + let locationManager = LocationPermissionManager.shared + return await locationManager.isLocationServicesEnabled() + } +} + +// MARK: - Dependency Extension + +extension DependencyValues { + public var locationUseCase: LocationUseCaseInterface { + get { self[LocationUseCaseKey.self] } + set { self[LocationUseCaseKey.self] = newValue } + } +} + +private enum LocationUseCaseKey: DependencyKey { + static let liveValue: LocationUseCaseInterface = LocationUseCaseImpl() +} \ No newline at end of file diff --git a/Projects/Domain/UseCase/Sources/Station/StationUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Station/StationUseCaseImpl.swift index 1625f2a..23a072b 100644 --- a/Projects/Domain/UseCase/Sources/Station/StationUseCaseImpl.swift +++ b/Projects/Domain/UseCase/Sources/Station/StationUseCaseImpl.swift @@ -16,14 +16,14 @@ public struct StationUseCaseImpl: StationInterface { public init() {} public func fetchStations( - lat: Double, - lng: Double, + userLat: Double, + userLon: Double, page: Int, size: Int ) async throws -> StationListEntity { try await repository.fetchStations( - lat: lat, - lng: lng, + userLat: userLat, + userLon: userLon, page: page, size: size ) From ae9158bcf260eaa846268a1bae277b443743c5e2 Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 22:16:24 +0900 Subject: [PATCH 22/35] =?UTF-8?q?feat:=20=EC=9E=A5=EC=86=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EA=B3=B5=EC=9A=A9=20?= =?UTF-8?q?=EC=9C=A0=ED=8B=B8=EB=A6=AC=ED=8B=B0=20=EB=B0=8F=20=EB=94=94?= =?UTF-8?q?=EC=9E=90=EC=9D=B8=20=EC=97=90=EC=85=8B=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 위치 좌표 포맷팅, 시간 표시 유틸리티, 텍스트 처리 헬퍼, 장소 핀 아이콘, 다크 그레이 색상 변형을 추가해 탐색 및 장소 상세 수정 --- .../Sources/Color/ShapeStyle+.swift | 1 + .../Sources/Image/ImageAsset.swift | 1 + .../CLLocationCoordinate2D+.swift | 17 ++++ .../Shared/Utill/Sources/Date/Date+.swift | 9 ++ .../Shared/Utill/Sources/String/String+.swift | 82 +++++++++++++++++++ 5 files changed, 110 insertions(+) create mode 100644 Projects/Shared/Utill/Sources/CoreLocation/CLLocationCoordinate2D+.swift diff --git a/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift b/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift index 061ffa3..84c2203 100644 --- a/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift +++ b/Projects/Shared/DesignSystem/Sources/Color/ShapeStyle+.swift @@ -24,6 +24,7 @@ public extension ShapeStyle where Self == Color { static var gray830: Color { .init(hex: "3D3D3D") } static var gray850: Color { .init(hex: "373737") } static var gray900: Color { .init(hex: "181818") } + static var gray950: Color { .init(hex: "0A0A0A") } static var lightGray: Color { .init(hex: "CCCCCC") } static var mediumGray: Color { .init(hex: "6C6C6C")} static var slateGray : Color { .init(hex: "949FB1") } diff --git a/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift b/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift index 0e29510..10abc5b 100644 --- a/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift +++ b/Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift @@ -45,6 +45,7 @@ public enum ImageAsset: String { case etcPin case foodPin case gamePin + case spotPin case onBoardingLogo1 case onBoardingLogo2 diff --git a/Projects/Shared/Utill/Sources/CoreLocation/CLLocationCoordinate2D+.swift b/Projects/Shared/Utill/Sources/CoreLocation/CLLocationCoordinate2D+.swift new file mode 100644 index 0000000..5c72c04 --- /dev/null +++ b/Projects/Shared/Utill/Sources/CoreLocation/CLLocationCoordinate2D+.swift @@ -0,0 +1,17 @@ +// +// CLLocationCoordinate2D+.swift +// Utill +// + +import Foundation +import CoreLocation + +public extension CLLocationCoordinate2D { + var formattedCoordinateText: String { + String(format: "%.6f, %.6f", latitude, longitude) + } + + var approximateAddressText: String { + "\(formattedCoordinateText) 부근" + } +} diff --git a/Projects/Shared/Utill/Sources/Date/Date+.swift b/Projects/Shared/Utill/Sources/Date/Date+.swift index 4e118fd..4953710 100644 --- a/Projects/Shared/Utill/Sources/Date/Date+.swift +++ b/Projects/Shared/Utill/Sources/Date/Date+.swift @@ -139,6 +139,15 @@ public extension Date { dateFormatter.dateFormat = "a h시 m분" return dateFormatter.string(from: date) } + + func formattedReturnDeadlineText(addingMinutes minutes: Int) -> String { + let deadline = Calendar.current.date(byAdding: .minute, value: minutes, to: self) ?? self + + let formatter = DateFormatter() + formatter.locale = Locale(identifier: "ko_KR") + formatter.dateFormat = "a h:mm" + return formatter.string(from: deadline) + } } public extension Calendar { diff --git a/Projects/Shared/Utill/Sources/String/String+.swift b/Projects/Shared/Utill/Sources/String/String+.swift index 245665e..f59a03b 100644 --- a/Projects/Shared/Utill/Sources/String/String+.swift +++ b/Projects/Shared/Utill/Sources/String/String+.swift @@ -147,6 +147,88 @@ public extension String { return self } + var stayableMinutesDisplayText: String { + let text = self + .replacingOccurrences(of: " 체류 가능", with: "") + .replacingOccurrences(of: "약 ", with: "") + let value = text.isEmpty ? "0분" : text + return "약 \(value)" + } + + func walkMinutesDisplayText( + spotName: String, + subtitle: String, + distanceText: String + ) -> String { + let text = self + .replacingOccurrences(of: "\(spotName)에서 약 ", with: "") + .replacingOccurrences(of: "\(subtitle)에서 약 ", with: "") + .replacingOccurrences(of: "\(distanceText) ", with: "") + .components(separatedBy: "약 ") + .last? + .trimmingCharacters(in: .whitespacesAndNewlines) + + return (text?.isEmpty == false ? text! : "0분") + } + + var normalizedURL: URL? { + let trimmed = trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return nil } + + if let url = URL(string: trimmed) { + return url + } + + let encoded = trimmed.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) + return encoded.flatMap(URL.init(string:)) + } + + var minutesValue: Int { + Int( + replacingOccurrences(of: "약 ", with: "") + .replacingOccurrences(of: "분", with: "") + ) ?? 0 + } + + static func openingHoursText(status: String?, closing: String?) -> String { + switch (status?.nilIfEmpty, closing?.nilIfEmpty) { + case let (status?, closing?): + return "\(status) \(closing)" + case let (status?, nil): + return status + case let (nil, closing?): + return closing + case (nil, nil): + return "영업 시간 정보 준비 중" + } + } + + var formattedPlaceNameForDisplay: String { + var value = self + + let patterns = [ + #"(?<=[가-힣A-Za-z0-9])(서울역|용산역|청량리역|강릉역|수서역|부산역|대전역|동대구역)"#, + #"(?<=(서울역|용산역|청량리역|강릉역|수서역|부산역|대전역|동대구역))(?=[가-힣A-Za-z0-9])"#, + #"(?<=[가-힣A-Za-z0-9])(롯데아울렛|현대아울렛|신세계아울렛)"# + ] + + for pattern in patterns { + value = value.replacingOccurrences( + of: pattern, + with: pattern.contains("(?=") ? " " : " $1", + options: .regularExpression + ) + } + + value = value.replacingOccurrences( + of: #"\s+"#, + with: " ", + options: .regularExpression + ) + + return value.trimmingCharacters(in: .whitespacesAndNewlines) + } + var nilIfEmpty: String? { isEmpty ? nil : self } From 29d4a5d4147deb503117084488981f23dfce51eb Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 28 Mar 2026 22:17:17 +0900 Subject: [PATCH 23/35] =?UTF-8?q?refactor:=20Explore=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=95=84=ED=82=A4=ED=85=8D=EC=B2=98=20=EA=B0=9C=EC=84=A0=20?= =?UTF-8?q?=EB=B0=8F=20Detail=20=ED=99=94=EB=A9=B4=20=EA=B0=95=ED=99=94=20?= =?UTF-8?q?#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Coordinator/Reducer/HomeCoordinator.swift | 22 +- .../ExploreSelectedSpotCardView.swift | 52 +- .../Components/ExploreSpotListCardView.swift | 18 +- .../Sources/Explore/Helpers/CardHelpers.swift | 24 + .../Explore/Helpers/ExploreHelpers.swift | 164 +++++++ .../Explore/Reducer/ExploreReducer.swift | 460 ++++-------------- .../Reducer/ExploreState+Extensions.swift | 151 ++++++ .../Sources/Explore/View/ExploreView.swift | 58 +-- .../Reducer/ExploreDetailFeature.swift | 6 +- .../View/ExploreDetailView.swift | 356 +++++++++++++- .../Manager/LocationPermissionManager.swift | 256 ---------- .../Sources/Manager/NaverMapInitializer.swift | 2 +- .../Reducer/TrainStationFeature.swift | 8 +- 13 files changed, 878 insertions(+), 699 deletions(-) create mode 100644 Projects/Presentation/Home/Sources/Explore/Helpers/CardHelpers.swift create mode 100644 Projects/Presentation/Home/Sources/Explore/Helpers/ExploreHelpers.swift create mode 100644 Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift delete mode 100644 Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift diff --git a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift index a8454f4..c3bee34 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift @@ -52,7 +52,7 @@ public struct HomeCoordinator { case presentProfileWithAnimation case presentExplore case presentExploreList(ExploreReducer.State) - case presentExploreDetail + case presentExploreDetail(ExploreMapSpot) } // MARK: - NavigationAction @@ -114,8 +114,20 @@ extension HomeCoordinator { return .none } - case .routeAction(id: _, action: .explore(.delegate(.presentExplorerDetail))): - return .send(.inner(.presentExploreDetail)) + case let .routeAction(id: id, action: .explore(.delegate(.presentExplorerDetail))): + guard state.routes.indices.contains(id) else { + return .none + } + + switch state.routes[id] { + case let .push(.explore(exploreState)): + guard let selectedSpot = exploreState.selectedSpot else { + return .none + } + return .send(.inner(.presentExploreDetail(selectedSpot))) + default: + return .none + } case let .routeAction(id: id, action: .exploreList(.delegate(.presentExploreMapAtCurrentLocation))): guard state.routes.indices.contains(id) else { @@ -221,8 +233,8 @@ extension HomeCoordinator { state.routes.push(.exploreList(.init())) return .none - case .presentExploreDetail: - state.routes.push(.exploreDetail(.init())) + case .presentExploreDetail(let spot): + state.routes.push(.exploreDetail(.init(spot: spot))) return .none } } diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift index 3f3edc9..4da0913 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift @@ -8,6 +8,7 @@ import SwiftUI import DesignSystem import Entity import Kingfisher +import Utill struct ExploreSelectedSpotCardView: View { let currentSpot: ExploreMapSpot @@ -54,17 +55,26 @@ struct ExploreSelectedSpotCardView: View { .padding(.bottom, 12) } - HStack(alignment: .lastTextBaseline, spacing: 6) { - Text(spot.name) + HStack(alignment: .top, spacing: 6) { + Text(formattedDisplayName(for: spot)) .pretendardFont(family: .SemiBold, size: 18) .foregroundStyle(.staticBlack) - .lineLimit(1) + .lineLimit(titleLineLimit(for: spot)) + .fixedSize(horizontal: false, vertical: true) + .layoutPriority(1) + + if !spot.subtitle.isEmpty { + Text(spot.subtitle) + .pretendardCustomFont(textStyle: .caption) + .foregroundStyle(.gray650) + .lineLimit(1) + .fixedSize() + .padding(.top, 2) + } - Text(spot.subtitle) - .pretendardCustomFont(textStyle: .caption) - .foregroundStyle(.gray650) - .lineLimit(1) + Spacer(minLength: 0) } + .frame(minHeight: titleMinHeight(for: spot), alignment: .topLeading) .padding(.bottom, 4) if !spot.statusText.isEmpty || !spot.closingText.isEmpty { @@ -151,6 +161,34 @@ struct ExploreSelectedSpotCardView: View { } } + private func titleLineLimit(for spot: ExploreMapSpot) -> Int { + spot.name.count > 7 ? 2 : 1 + } + + private func titleMinHeight(for spot: ExploreMapSpot) -> CGFloat { + spot.name.count > 7 ? 44 : 24 + } + + private func formattedDisplayName(for spot: ExploreMapSpot) -> String { + let formatted = spot.name.formattedPlaceNameForDisplay + + guard spot.name.count > 7 else { + return formatted + } + + let characters = Array(formatted) + let threshold = min(7, characters.count) + + if let splitIndex = characters.indices.dropFirst(threshold).first(where: { characters[$0] == " " }) { + let left = String(characters[.. URL? { guard let imageURL = spot.imageURL?.trimmingCharacters(in: .whitespacesAndNewlines), !imageURL.isEmpty else { diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift index f8fad49..c1d1cd6 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift @@ -8,6 +8,7 @@ import SwiftUI import DesignSystem import Entity import Kingfisher +import Utill struct ExploreSpotListCardView: View { let spot: ExploreMapSpot @@ -118,12 +119,23 @@ struct ExploreSpotListCardView: View { } private var formattedDisplayName: String { + let formatted = spot.name.formattedPlaceNameForDisplay + guard spot.name.count > 7 else { - return spot.name + return formatted + } + + let characters = Array(formatted) + let threshold = min(7, characters.count) + + if let splitIndex = characters.indices.dropFirst(threshold).first(where: { characters[$0] == " " }) { + let left = String(characters[.. String { + return state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) + } + + public static func currentCategory(state: ExploreReducer.State) -> ExploreCategory? { + return state.selectedCategory == .all ? nil : state.selectedCategory + } + + public static func isSameCoordinate(_ lhs: Double?, _ rhs: Double?, tolerance: Double = 0.000001) -> Bool { + guard let lhs = lhs, let rhs = rhs else { + return lhs == nil && rhs == nil + } + + return abs(lhs - rhs) < tolerance + } + + public static func isResolvingSelectedMarkerDetail(state: ExploreReducer.State) -> Bool { + let selectedSpotID = state.userSession.selectedExploreSpotID + guard !selectedSpotID.isEmpty else { return false } + + let spot = state.spots.first { $0.id == selectedSpotID } + return spot?.hasDetail == false + } + + public static func hasUnresolvedBaseSpots(_ spots: [ExploreMapSpot]) -> Bool { + return spots.contains { !$0.hasDetail } + } + + // MARK: - Filtered Data + + public static func filteredSpots(state: ExploreReducer.State) -> [ExploreMapSpot] { + let query = currentKeyword(state: state) + let filtered = state.spots.filter { spot in + let hasDetail = spot.hasDetail + let matchesCategory = state.selectedCategory == .all || spot.category == state.selectedCategory + let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) + return hasDetail && matchesCategory && matchesQuery + } + + guard let currentLocation = state.currentLocation else { + return filtered + } + + return filtered.sorted { lhs, rhs in + let lhsDistance = currentLocation.distance( + from: CLLocation( + latitude: lhs.coordinate.latitude, + longitude: lhs.coordinate.longitude + ) + ) + let rhsDistance = currentLocation.distance( + from: CLLocation( + latitude: rhs.coordinate.latitude, + longitude: rhs.coordinate.longitude + ) + ) + + return lhsDistance < rhsDistance + } + } + + public static func syncSelectedSpot(state: inout ExploreReducer.State) { + guard let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty else { + return + } + + guard state.spots.contains(where: { $0.id == selectedSpotID }) else { + clearSelectedSpot(state: &state) + return + } + } + + public static func filteredCardSpots(state: ExploreReducer.State) -> [ExploreMapSpot] { + let query = currentKeyword(state: state) + let filtered = state.spots.filter { spot in + let hasDetail = spot.hasDetail + let matchesCategory = state.selectedCategory == .all || spot.category == state.selectedCategory + let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) + return hasDetail && matchesCategory && matchesQuery + } + + guard let currentLocation = state.currentLocation else { + return filtered + } + + return filtered.sorted { lhs, rhs in + let lhsDistance = currentLocation.distance( + from: CLLocation( + latitude: lhs.coordinate.latitude, + longitude: lhs.coordinate.longitude + ) + ) + let rhsDistance = currentLocation.distance( + from: CLLocation( + latitude: rhs.coordinate.latitude, + longitude: rhs.coordinate.longitude + ) + ) + + return lhsDistance < rhsDistance + } + } + + public static func currentCardSpots(state: ExploreReducer.State) -> [ExploreMapSpot] { + return filteredCardSpots(state: state) + } +} diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index bcd7b66..796fb64 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -150,6 +150,8 @@ public struct ExploreReducer: Sendable { @Dependency(\.getRouteUseCase) var getRouteUseCase @Dependency(\.placeUseCase) var placeUseCase + let locationUseCase = LocationUseCaseImpl() + let cameraUseCase = CameraUseCaseImpl() public var body: some ReducerOf { Reduce { state, action in @@ -175,166 +177,6 @@ public struct ExploreReducer: Sendable { } extension ExploreReducer { - private var cardTravelDistance: CGFloat { - UIScreen.main.bounds.width - 8 - } - - private var cardSwipeThreshold: CGFloat { - (UIScreen.main.bounds.width - 32) / 2 - } - - private func resetPagination(state: inout State) { - state.currentPage = 0 - state.hasNextPage = true - state.pendingSelectFirstSpotFromNextPage = false - } - - private func resetSearchContext(state: inout State, clearMarker: Bool = true) { - state.isLoadingPlaces = false - state.hasRequestedPlaces = false - resetPagination(state: &state) - if clearMarker { - state.searchMarkerLat = nil - state.searchMarkerLon = nil - } - } - - private func clearSelectedSpot(state: inout State) { - state.isSpotCardVisible = false - state.$userSession.withLock { - $0.selectedExploreSpotID = "" - } - state.cardDragOffset = 0 - state.cardBaseOffset = 0 - state.isCardTransitioning = false - } - - private func currentKeyword(state: State) -> String { - state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) - } - - private func currentCategory(state: State) -> ExploreCategory? { - state.selectedCategory == .all ? nil : state.selectedCategory - } - - private func isSameCoordinate(_ lhs: Double?, _ rhs: Double?, tolerance: Double = 0.000001) -> Bool { - switch (lhs, rhs) { - case (nil, nil): - return true - case let (lhs?, rhs?): - return abs(lhs - rhs) < tolerance - default: - return false - } - } - - private func isResolvingSelectedMarkerDetail(state: State) -> Bool { - guard state.searchMarkerLat != nil, - state.searchMarkerLon != nil, - let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty else { - return false - } - - return !state.spots.contains(where: { $0.id == selectedSpotID && $0.hasDetail }) - } - - private func hasUnresolvedBaseSpots(_ spots: [ExploreMapSpot]) -> Bool { - spots.contains(where: { !$0.hasDetail }) - } - - private func filteredSpots(state: State) -> [ExploreMapSpot] { - let query = currentKeyword(state: state) - - let filtered = state.spots.filter { spot in - let hasDetail = spot.hasDetail - let matchesCategory = state.selectedCategory == .all || spot.category == state.selectedCategory - let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) - return hasDetail && matchesCategory && matchesQuery - } - - guard let currentLocation = state.currentLocation else { - return filtered - } - - return filtered.sorted { lhs, rhs in - let lhsDistance = currentLocation.distance( - from: CLLocation( - latitude: lhs.coordinate.latitude, - longitude: lhs.coordinate.longitude - ) - ) - let rhsDistance = currentLocation.distance( - from: CLLocation( - latitude: rhs.coordinate.latitude, - longitude: rhs.coordinate.longitude - ) - ) - - return lhsDistance < rhsDistance - } - } - - private func syncSelectedSpot(state: inout State) { - guard let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty else { - return - } - - guard state.spots.contains(where: { $0.id == selectedSpotID }) else { - clearSelectedSpot(state: &state) - return - } - } - - private func filteredCardSpots(state: State) -> [ExploreMapSpot] { - let query = currentKeyword(state: state) - - let filtered = state.spots.filter { spot in - let hasDetail = spot.hasDetail - let matchesCategory = state.selectedCategory == .all || spot.category == state.selectedCategory - let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) - return hasDetail && matchesCategory && matchesQuery - } - - guard let currentLocation = state.currentLocation else { - return filtered - } - - return filtered.sorted { lhs, rhs in - let lhsDistance = currentLocation.distance( - from: CLLocation( - latitude: lhs.coordinate.latitude, - longitude: lhs.coordinate.longitude - ) - ) - let rhsDistance = currentLocation.distance( - from: CLLocation( - latitude: rhs.coordinate.latitude, - longitude: rhs.coordinate.longitude - ) - ) - - return lhsDistance < rhsDistance - } - } - - private func currentCardSpots(state: State) -> [ExploreMapSpot] { - let filteredSpots = filteredCardSpots(state: state) - let selectedSpotID = state.userSession.selectedExploreSpotID - - guard !selectedSpotID.isEmpty else { - return filteredSpots - } - - if filteredSpots.contains(where: { $0.id == selectedSpotID }) { - return filteredSpots - } - - if let selectedSearchSpot = state.spots.first(where: { $0.id == selectedSpotID && $0.hasDetail }) { - return [selectedSearchSpot] + filteredSpots - } - - return filteredSpots - } private func handleViewAction( state: inout State, @@ -353,23 +195,21 @@ extension ExploreReducer { } guard shouldBootstrap else { - syncSelectedSpot(state: &state) + ExploreHelpers.syncSelectedSpot(state: &state) return .run { send in - let locationManager = await LocationPermissionManager.shared - let currentStatus = await locationManager.authorizationStatus + let currentStatus = await locationUseCase.getAuthorizationStatus() await send(.inner(.locationPermissionStatusChanged(currentStatus))) } } state.isSpotCardVisible = false state.hasFetchedPlacesWithCurrentLocation = false - resetSearchContext(state: &state) + ExploreHelpers.resetSearchContext(state: &state) state.spots = [] - syncSelectedSpot(state: &state) + ExploreHelpers.syncSelectedSpot(state: &state) return .merge( .run { send in - let locationManager = await LocationPermissionManager.shared - let currentStatus = await locationManager.authorizationStatus + let currentStatus = await locationUseCase.getAuthorizationStatus() await send(.inner(.locationPermissionStatusChanged(currentStatus))) }, .send(.async(.fetchPlaces)) @@ -401,7 +241,10 @@ extension ExploreReducer { case .searchTextChanged(let text): state.searchText = text - resetSearchContext(state: &state) + ExploreHelpers.resetSearchContext( + state: &state, + preserveSearchText: true + ) return .merge( .cancel(id: CancelID.searchPlaces), .send(.async(.fetchPlaces)) @@ -409,7 +252,10 @@ extension ExploreReducer { case .categoryTapped(let category): state.selectedCategory = category - resetSearchContext(state: &state) + ExploreHelpers.resetSearchContext( + state: &state, + preserveSelectedCategory: true + ) return .merge( .cancel(id: CancelID.searchPlaces), .send(.async(.fetchPlaces)) @@ -417,7 +263,7 @@ extension ExploreReducer { case .spotTapped(let spotID): if state.userSession.selectedExploreSpotID == spotID, state.isSpotCardVisible { - clearSelectedSpot(state: &state) + ExploreHelpers.clearSelectedSpot(state: &state) state.searchMarkerLat = nil state.searchMarkerLon = nil state.pendingSelectFirstSpotFromNextPage = false @@ -436,7 +282,7 @@ extension ExploreReducer { state.searchMarkerLat = markerSpot.coordinate.latitude state.searchMarkerLon = markerSpot.coordinate.longitude - resetSearchContext(state: &state, clearMarker: false) + ExploreHelpers.resetSearchContext(state: &state, clearMarker: false) return .merge( .cancel(id: CancelID.searchPlaces), @@ -450,7 +296,7 @@ extension ExploreReducer { } state.isSpotCardVisible = true } else { - clearSelectedSpot(state: &state) + ExploreHelpers.clearSelectedSpot(state: &state) state.searchMarkerLat = nil state.searchMarkerLon = nil state.pendingSelectFirstSpotFromNextPage = false @@ -462,7 +308,7 @@ extension ExploreReducer { guard !state.isCardTransitioning else { return .none } - let limitedOffset = max(min(offset, cardTravelDistance), -cardTravelDistance) + let limitedOffset = max(min(offset, CardHelpers.cardTravelDistance), -CardHelpers.cardTravelDistance) state.cardDragOffset = limitedOffset return .none @@ -471,11 +317,11 @@ extension ExploreReducer { return .none } - if translationWidth > cardSwipeThreshold { + if translationWidth > CardHelpers.cardSwipeThreshold { return .send(.inner(.completeCardSwipe(next: false))) } - if translationWidth < -cardSwipeThreshold { + if translationWidth < -CardHelpers.cardSwipeThreshold { return .send(.inner(.completeCardSwipe(next: true))) } @@ -509,24 +355,40 @@ extension ExploreReducer { return .none case .returnToCurrentLocation: - state.$userSession.withLock { - $0.selectedExploreSpotID = "" + print("🟡 [CurrentLocationButton] CameraUseCase 사용") + + // CameraUseCase를 통한 스팟 클리어 처리 + let clearResult = cameraUseCase.clearSelectedSpotForLocationReturn( + selectedSpotID: state.userSession.selectedExploreSpotID, + isCardVisible: state.isSpotCardVisible + ) + + if clearResult.shouldClearSpot { + state.$userSession.withLock { + $0.selectedExploreSpotID = "" + } + } + + if clearResult.shouldDismissCard { + ExploreHelpers.clearSelectedSpot(state: &state) } // 경로만 제거하고 역 목적지 마커는 유지 state.routeInfo = nil - // 카드가 올라와있으면 먼저 내리기 - if state.isSpotCardVisible { - clearSelectedSpot(state: &state) - } + // CameraUseCase를 통한 카메라 트리거 처리 + let cameraResult = cameraUseCase.createReturnToCurrentLocationTrigger( + currentTrigger: state.returnToCurrentLocationTrigger, + hasCurrentLocation: state.currentLocation != nil + ) - guard state.currentLocation != nil else { + if !cameraResult.shouldUpdateTrigger { state.shouldReturnToCurrentLocation = true return .send(.async(.requestCurrentLocation)) } - state.returnToCurrentLocationTrigger += 1 + state.returnToCurrentLocationTrigger = cameraResult.newTrigger + print("🟢 [CurrentLocationButton] CameraUseCase 처리 완료") return .none } } @@ -558,14 +420,24 @@ extension ExploreReducer { case .locationUpdated(let location): state.currentLocation = location - if state.shouldReturnToCurrentLocation { + + // CameraUseCase를 통한 위치 업데이트 카메라 처리 + let cameraResult = cameraUseCase.handleLocationUpdateForCamera( + shouldReturnToLocation: state.shouldReturnToCurrentLocation, + currentTrigger: state.returnToCurrentLocationTrigger + ) + + if cameraResult.shouldUpdateTrigger { + state.returnToCurrentLocationTrigger = cameraResult.newTrigger + } + + if cameraResult.shouldResetFlag { state.shouldReturnToCurrentLocation = false - state.returnToCurrentLocationTrigger += 1 return .none } if !state.hasFetchedPlacesWithCurrentLocation, !state.isLoadingPlaces { - resetSearchContext(state: &state, clearMarker: false) + ExploreHelpers.resetSearchContext(state: &state, clearMarker: false) return .merge( .cancel(id: CancelID.fetchPlaces), .cancel(id: CancelID.searchPlaces), @@ -583,7 +455,7 @@ extension ExploreReducer { state.hasRequestedPlaces = false state.spots = entities.spots state.currentPage = entities.currentPage - state.hasNextPage = entities.hasNextPage || hasUnresolvedBaseSpots(entities.spots) + state.hasNextPage = entities.hasNextPage || ExploreHelpers.hasUnresolvedBaseSpots(entities.spots) state.hasFetchedPlacesWithCurrentLocation = usedCurrentLocation if state.currentLocation != nil && !usedCurrentLocation @@ -594,13 +466,13 @@ extension ExploreReducer { case .fetchPlacesFailed(let message, let usedCurrentLocation): state.hasRequestedPlaces = false - resetSearchContext(state: &state, clearMarker: false) + ExploreHelpers.resetSearchContext(state: &state, clearMarker: false) if usedCurrentLocation { state.hasFetchedPlacesWithCurrentLocation = false } #logDebug(" [ExploreReducer] 장소 조회 실패: \(message)") state.spots = [] - clearSelectedSpot(state: &state) + ExploreHelpers.clearSelectedSpot(state: &state) return .none case .searchPlacesResponse( @@ -616,8 +488,8 @@ extension ExploreReducer { state.isLoadingPlaces = false state.hasRequestedPlaces = false let previousDetailedCount = state.spots.filter(\.hasDetail).count - let currentKeyword = currentKeyword(state: state) - let currentCategory = currentCategory(state: state) + let currentKeyword = ExploreHelpers.currentKeyword(state: state) + let currentCategory = ExploreHelpers.currentCategory(state: state) let currentMarkerLat = state.searchMarkerLat let currentMarkerLon = state.searchMarkerLon @@ -626,8 +498,8 @@ extension ExploreReducer { } if requestedMarkerLat != nil || requestedMarkerLon != nil { - guard isSameCoordinate(requestedMarkerLat, currentMarkerLat), - isSameCoordinate(requestedMarkerLon, currentMarkerLon) else { + guard ExploreHelpers.isSameCoordinate(requestedMarkerLat, currentMarkerLat), + ExploreHelpers.isSameCoordinate(requestedMarkerLon, currentMarkerLon) else { return .none } } else { @@ -649,7 +521,7 @@ extension ExploreReducer { && requestedMarkerLon == nil && requestedKeyword.isEmpty && requestedCategory == nil - && hasUnresolvedBaseSpots(newSpots) + && ExploreHelpers.hasUnresolvedBaseSpots(newSpots) && (requestedPage == 0 || gainedMoreDetail) state.hasNextPage = pageEntity.hasNextPage || shouldKeepBootstrappingDetails @@ -663,7 +535,7 @@ extension ExploreReducer { } else if state.searchMarkerLat != nil { state.isSpotCardVisible = false } else { - clearSelectedSpot(state: &state) + ExploreHelpers.clearSelectedSpot(state: &state) } if state.pendingSelectFirstSpotFromNextPage, let firstNewSpotID { @@ -675,13 +547,13 @@ extension ExploreReducer { state.cardBaseOffset = 0 state.cardDragOffset = 0 state.isCardTransitioning = false - syncSelectedSpot(state: &state) + ExploreHelpers.syncSelectedSpot(state: &state) return .none } let wasPendingNextPage = state.pendingSelectFirstSpotFromNextPage state.pendingSelectFirstSpotFromNextPage = false - syncSelectedSpot(state: &state) + ExploreHelpers.syncSelectedSpot(state: &state) if let selectedSpotID, state.searchMarkerLat != nil, @@ -694,7 +566,7 @@ extension ExploreReducer { state.searchMarkerLat != nil, !state.spots.contains(where: { $0.id == selectedSpotID && $0.hasDetail }), !state.hasNextPage { - clearSelectedSpot(state: &state) + ExploreHelpers.clearSelectedSpot(state: &state) } if wasPendingNextPage { @@ -735,7 +607,10 @@ extension ExploreReducer { return .none case .resetCameraFlag: - state.shouldReturnToCurrentLocation = false + let cameraResult = cameraUseCase.resetCameraFlag() + if cameraResult.shouldResetFlag { + state.shouldReturnToCurrentLocation = false + } return .none case .completeCardSwipe(let next): @@ -747,12 +622,12 @@ extension ExploreReducer { let currentSelectedID = state.selectedSpot?.id ?? state.userSession.selectedExploreSpotID let currentIndex = cardSpots.firstIndex(where: { $0.id == currentSelectedID }) ?? 0 - let entryOffset: CGFloat = next ? cardTravelDistance : -cardTravelDistance + let entryOffset: CGFloat = next ? CardHelpers.cardTravelDistance : -CardHelpers.cardTravelDistance let isAtEnd = next && currentIndex == cardSpots.count - 1 let isAtStart = !next && currentIndex == 0 state.isCardTransitioning = true - state.cardDragOffset = next ? -cardTravelDistance : cardTravelDistance + state.cardDragOffset = next ? -CardHelpers.cardTravelDistance : CardHelpers.cardTravelDistance if isAtEnd { if state.hasNextPage { @@ -804,41 +679,31 @@ extension ExploreReducer { case .requestFullAccuracy: return .run { send in - await MainActor.run { - let locationManager = LocationPermissionManager.shared - locationManager.requestFullAccuracy() + await locationUseCase.requestFullAccuracy() - Task { - try await Task.sleep(for: .seconds(1)) - send(.async(.startLocationUpdates)) - } - } + try await Task.sleep(for: .seconds(1)) + await send(.async(.startLocationUpdates)) } case .startLocationUpdates: return .run { send in - let locationManager = await LocationPermissionManager.shared - - // 지속적인 위치 업데이트 콜백 설정 (MainActor에서 실행) - await MainActor.run { - locationManager.onLocationUpdate = { location in + // UseCase를 통한 위치 업데이트 시작 + await locationUseCase.startLocationUpdates( + onUpdate: { location in Task { @MainActor in - send(.inner(.locationUpdated(location))) + send(.inner(.locationUpdated(location))) } - } - - locationManager.onLocationError = { error in + }, + onError: { error in Task { @MainActor in - send(.inner(.locationUpdateFailed(error.localizedDescription))) + send(.inner(.locationUpdateFailed(error.localizedDescription))) } } - } - - await locationManager.startLocationUpdates() + ) // 초기 위치도 가져오기 do { - if let location = try await locationManager.requestCurrentLocation() { + if let location = try await locationUseCase.requestCurrentLocation() { await send(.inner(.locationUpdated(location))) } } catch { @@ -849,21 +714,16 @@ extension ExploreReducer { case .stopLocationUpdates: return .run { send in - await MainActor.run { - let locationManager = LocationPermissionManager.shared - locationManager.stopLocationUpdates() - } + await locationUseCase.stopLocationUpdates() } case .requestCurrentLocation: return .run { send in - let locationManager = await LocationPermissionManager.shared - do { - if let location = try await locationManager.requestCurrentLocation() { + if let location = try await locationUseCase.requestCurrentLocation() { await send(.inner(.locationUpdated(location))) } else { - await send(.inner(.locationUpdateFailed(LocationError.locationUnavailable.localizedDescription))) + await send(.inner(.locationUpdateFailed("위치 정보를 가져올 수 없습니다"))) } } catch { await send(.inner(.locationUpdateFailed(error.localizedDescription))) @@ -925,7 +785,7 @@ extension ExploreReducer { let requestedMarkerLat = state.searchMarkerLat let requestedMarkerLon = state.searchMarkerLon let rawKeyword = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) - let isResolvingSelectedMarkerDetail = isResolvingSelectedMarkerDetail(state: state) + let isResolvingSelectedMarkerDetail = ExploreHelpers.isResolvingSelectedMarkerDetail(state: state) let keyword = isResolvingSelectedMarkerDetail ? nil : rawKeyword.nilIfEmpty let category: ExploreCategory? = isResolvingSelectedMarkerDetail ? nil @@ -1046,139 +906,3 @@ extension ExploreReducer { } } } - -extension ExploreReducer.State { - var trimmedSearchText: String { - searchText.trimmingCharacters(in: .whitespacesAndNewlines) - } - - func hasVisibleMarkerContent(_ spot: ExploreMapSpot) -> Bool { - spot.hasDetail - || !spot.name.isEmpty - || !spot.badgeText.isEmpty - || !spot.statusText.isEmpty - || !spot.closingText.isEmpty - || !spot.distanceText.isEmpty - || !spot.walkTimeText.isEmpty - } - - func matchesCurrentFilters(_ spot: ExploreMapSpot) -> Bool { - let matchesCategory = selectedCategory == .all || spot.category == selectedCategory - let matchesQuery = trimmedSearchText.isEmpty || spot.name.localizedCaseInsensitiveContains(trimmedSearchText) - return matchesCategory && matchesQuery - } - - var filteredMapSpots: [ExploreMapSpot] { - spots.filter { spot in - hasVisibleMarkerContent(spot) - && (selectedCategory == .all || spot.category == selectedCategory) - } - } - - var filteredSpots: [ExploreMapSpot] { - spots.filter { spot in - spot.hasDetail && matchesCurrentFilters(spot) - } - } - - func mergedSpot(for spotID: String) -> ExploreMapSpot? { - spots.first(where: { $0.id == spotID && $0.hasDetail }) - } - - var cardSpots: [ExploreMapSpot] { - let selectedSpotID = userSession.selectedExploreSpotID - - guard !selectedSpotID.isEmpty else { - return filteredSpots - } - - if filteredSpots.contains(where: { $0.id == selectedSpotID }) { - return filteredSpots - } - - if let selectedSearchSpot = mergedSpot(for: selectedSpotID) { - return [selectedSearchSpot] + filteredSpots - } - - return filteredSpots - } - - var selectedSpot: ExploreMapSpot? { - guard isSpotCardVisible else { return nil } - - let selectedSpotID = userSession.selectedExploreSpotID - - if !selectedSpotID.isEmpty, - let selectedSpot = mergedSpot(for: selectedSpotID) { - return selectedSpot - } - - return nil - } - - func adjacentSpot(cardTravelDistance: CGFloat) -> ExploreMapSpot? { - let currentSelectedID = selectedSpot?.id ?? userSession.selectedExploreSpotID - guard let currentIndex = cardSpots.firstIndex(where: { $0.id == currentSelectedID }) else { - return nil - } - guard abs(cardDragOffset) > 0 else { - return nil - } - - let adjacentIndex: Int - if cardDragOffset < 0 { - adjacentIndex = (currentIndex + 1) % cardSpots.count - } else { - adjacentIndex = (currentIndex - 1 + cardSpots.count) % cardSpots.count - } - return cardSpots[adjacentIndex] - } - - func adjacentCardOffset(cardTravelDistance: CGFloat) -> CGFloat? { - guard adjacentSpot(cardTravelDistance: cardTravelDistance) != nil else { return nil } - let baseOffset = cardDragOffset >= 0 ? -cardTravelDistance : cardTravelDistance - return baseOffset + cardDragOffset - } - - func cardOpacity(cardTravelDistance: CGFloat) -> Double { - let progress = min(abs(cardBaseOffset + cardDragOffset) / cardTravelDistance, 1) - return 1 - (progress * 0.02) - } -} - -// MARK: - ExploreReducer.State + Hashable -extension ExploreReducer.State: Hashable { - public func hash(into hasher: inout Hasher) { - hasher.combine(locationPermissionStatus) - hasher.combine(currentLocation?.coordinate.latitude) - hasher.combine(currentLocation?.coordinate.longitude) - hasher.combine(isLocationPermissionDenied) - hasher.combine(locationError) - hasher.combine(spots) - hasher.combine(isLoadingRoute) - hasher.combine(routeError) - hasher.combine(shouldReturnToCurrentLocation) - hasher.combine(userSession) - } -} -extension ExploreReducer.AsyncAction { - public static func == (lhs: Self, rhs: Self) -> Bool { - switch (lhs, rhs) { - case (.requestLocationPermission, .requestLocationPermission), - (.requestFullAccuracy, .requestFullAccuracy), - (.startLocationUpdates, .startLocationUpdates), - (.stopLocationUpdates, .stopLocationUpdates), - (.requestCurrentLocation, .requestCurrentLocation), - (.fetchPlaces, .fetchPlaces): - return true - case (.searchPlaces(let lhsPage, let lhsAppend), .searchPlaces(let rhsPage, let rhsAppend)): - return lhsPage == rhsPage && lhsAppend == rhsAppend - case (.searchRoute(let lhsFrom, let lhsTo), .searchRoute(let rhsFrom, let rhsTo)): - return lhsFrom.latitude == rhsFrom.latitude - && lhsFrom.longitude == rhsFrom.longitude - && lhsTo == rhsTo - default: - return false - } - } -} diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift new file mode 100644 index 0000000..b6fe3e7 --- /dev/null +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift @@ -0,0 +1,151 @@ +// +// ExploreState+Extensions.swift +// Home +// +// Created by Wonji Suh on 3/28/26. +// + +import Foundation +import CoreLocation +import ComposableArchitecture +import Entity + +extension ExploreReducer.State { + var trimmedSearchText: String { + searchText.trimmingCharacters(in: .whitespacesAndNewlines) + } + + func hasVisibleMarkerContent(_ spot: ExploreMapSpot) -> Bool { + spot.hasDetail + || !spot.name.isEmpty + || !spot.badgeText.isEmpty + || !spot.statusText.isEmpty + || !spot.closingText.isEmpty + || !spot.distanceText.isEmpty + || !spot.walkTimeText.isEmpty + } + + func matchesCurrentFilters(_ spot: ExploreMapSpot) -> Bool { + let matchesCategory = selectedCategory == .all || spot.category == selectedCategory + let matchesQuery = trimmedSearchText.isEmpty || spot.name.localizedCaseInsensitiveContains(trimmedSearchText) + return matchesCategory && matchesQuery + } + + var filteredMapSpots: [ExploreMapSpot] { + spots.filter { spot in + hasVisibleMarkerContent(spot) + && (selectedCategory == .all || spot.category == selectedCategory) + } + } + + var filteredSpots: [ExploreMapSpot] { + spots.filter { spot in + spot.hasDetail && matchesCurrentFilters(spot) + } + } + + func mergedSpot(for spotID: String) -> ExploreMapSpot? { + spots.first(where: { $0.id == spotID && $0.hasDetail }) + } + + var cardSpots: [ExploreMapSpot] { + let selectedSpotID = userSession.selectedExploreSpotID + + guard !selectedSpotID.isEmpty else { + return filteredSpots + } + + if filteredSpots.contains(where: { $0.id == selectedSpotID }) { + return filteredSpots + } + + if let selectedSearchSpot = mergedSpot(for: selectedSpotID) { + return [selectedSearchSpot] + filteredSpots + } + + return filteredSpots + } + + var selectedSpot: ExploreMapSpot? { + guard isSpotCardVisible else { return nil } + + let selectedSpotID = userSession.selectedExploreSpotID + + if !selectedSpotID.isEmpty, + let selectedSpot = mergedSpot(for: selectedSpotID) { + return selectedSpot + } + + return nil + } + + func adjacentSpot(cardTravelDistance: CGFloat) -> ExploreMapSpot? { + let currentSelectedID = selectedSpot?.id ?? userSession.selectedExploreSpotID + guard let currentIndex = cardSpots.firstIndex(where: { $0.id == currentSelectedID }) else { + return nil + } + guard abs(cardDragOffset) > 0 else { + return nil + } + + let adjacentIndex: Int + if cardDragOffset < 0 { + adjacentIndex = (currentIndex + 1) % cardSpots.count + } else { + adjacentIndex = (currentIndex - 1 + cardSpots.count) % cardSpots.count + } + return cardSpots[adjacentIndex] + } + + func adjacentCardOffset(cardTravelDistance: CGFloat) -> CGFloat? { + guard adjacentSpot(cardTravelDistance: cardTravelDistance) != nil else { return nil } + let baseOffset = cardDragOffset >= 0 ? -cardTravelDistance : cardTravelDistance + return baseOffset + cardDragOffset + } + + func cardOpacity(cardTravelDistance: CGFloat) -> Double { + let progress = min(abs(cardBaseOffset + cardDragOffset) / cardTravelDistance, 1) + return 1 - (progress * 0.02) + } +} + +// MARK: - ExploreReducer.State + Hashable + +extension ExploreReducer.State: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(locationPermissionStatus) + hasher.combine(currentLocation?.coordinate.latitude) + hasher.combine(currentLocation?.coordinate.longitude) + hasher.combine(isLocationPermissionDenied) + hasher.combine(locationError) + hasher.combine(spots) + hasher.combine(isLoadingRoute) + hasher.combine(routeError) + hasher.combine(shouldReturnToCurrentLocation) + hasher.combine(userSession) + } +} + +// MARK: - ExploreReducer.AsyncAction + Equatable + +extension ExploreReducer.AsyncAction { + public static func == (lhs: Self, rhs: Self) -> Bool { + switch (lhs, rhs) { + case (.requestLocationPermission, .requestLocationPermission), + (.requestFullAccuracy, .requestFullAccuracy), + (.startLocationUpdates, .startLocationUpdates), + (.stopLocationUpdates, .stopLocationUpdates), + (.requestCurrentLocation, .requestCurrentLocation), + (.fetchPlaces, .fetchPlaces): + return true + case (.searchPlaces(let lhsPage, let lhsAppend), .searchPlaces(let rhsPage, let rhsAppend)): + return lhsPage == rhsPage && lhsAppend == rhsAppend + case (.searchRoute(let lhsFrom, let lhsTo), .searchRoute(let rhsFrom, let rhsTo)): + return lhsFrom.latitude == rhsFrom.latitude + && lhsFrom.longitude == rhsFrom.longitude + && lhsTo == rhsTo + default: + return false + } + } +} diff --git a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift index 1fb475e..f12fa9a 100644 --- a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift +++ b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift @@ -26,8 +26,6 @@ public struct ExploreView: View { (UIScreen.main.bounds.width - 32) / 2 } - private let cardHeight: CGFloat = 182 - public init(store: StoreOf) { self.store = store } @@ -64,7 +62,7 @@ private extension ExploreView { currentLocation: store.currentLocation, routeInfo: store.routeInfo, destination: store.selectedDestination, - spots: filteredMapSpots, + spots: store.state.filteredMapSpots, selectedSpotID: store.userSession.selectedExploreSpotID.isEmpty ? nil : store.userSession.selectedExploreSpotID, @@ -93,16 +91,28 @@ private extension ExploreView { @ViewBuilder func bottomSection() -> some View { + let selectedSpot = store.state.selectedSpot let hasSelectedSpotCard = selectedSpot != nil - ZStack(alignment: .bottom) { + VStack(spacing: 16) { + ExploreFloatingControlsView( + showsListButton: hasSelectedSpotCard, + controlsBottomPadding: 0, + onListTap: { + store.send(.delegate(.presentExploreList)) + }, + onCurrentLocationTap: { + store.send(.view(.returnToCurrentLocation)) + } + ) + if let selectedSpot { ExploreSelectedSpotCardView( currentSpot: selectedSpot, - adjacentSpot: adjacentSpot, + adjacentSpot: store.state.adjacentSpot(cardTravelDistance: cardTravelDistance), currentOffset: store.cardBaseOffset + store.cardDragOffset, - adjacentOffset: adjacentCardOffset, - cardOpacity: cardOpacity, + adjacentOffset: store.state.adjacentCardOffset(cardTravelDistance: cardTravelDistance), + cardOpacity: store.state.cardOpacity(cardTravelDistance: cardTravelDistance), onCardTap: { store.send(.delegate(.presentExplorerDetail)) }, @@ -114,41 +124,9 @@ private extension ExploreView { store.send(.view(.cardDragEnded(value.translation.width))) } ) - .padding(.horizontal, 16) - .frame(height: cardHeight) + .padding(.horizontal, 16) } - - ExploreFloatingControlsView( - showsListButton: hasSelectedSpotCard, - controlsBottomPadding: hasSelectedSpotCard ? cardHeight + 20 : 0, - onListTap: { - store.send(.delegate(.presentExploreList)) - }, - onCurrentLocationTap: { - store.send(.view(.returnToCurrentLocation)) - } - ) } .padding(.bottom, 36) } - - var filteredMapSpots: [ExploreMapSpot] { - store.state.filteredMapSpots - } - - var selectedSpot: ExploreMapSpot? { - store.state.selectedSpot - } - - var adjacentSpot: ExploreMapSpot? { - store.state.adjacentSpot(cardTravelDistance: cardTravelDistance) - } - - var adjacentCardOffset: CGFloat? { - store.state.adjacentCardOffset(cardTravelDistance: cardTravelDistance) - } - - var cardOpacity: Double { - store.state.cardOpacity(cardTravelDistance: cardTravelDistance) - } } diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift b/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift index 1d4f45c..60bda3f 100644 --- a/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift @@ -8,6 +8,7 @@ import Foundation import ComposableArchitecture +import Entity @Reducer @@ -16,8 +17,11 @@ public struct ExploreDetailFeature { @ObservableState public struct State: Equatable { + public let spot: ExploreMapSpot - public init() {} + public init(spot: ExploreMapSpot) { + self.spot = spot + } } public enum Action: ViewAction, BindableAction { diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift index ce1e3b4..48cb8b7 100644 --- a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift +++ b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift @@ -7,7 +7,11 @@ import SwiftUI +import MapKit import DesignSystem +import Kingfisher +import Entity +import Utill import ComposableArchitecture @@ -22,22 +26,48 @@ public struct ExploreDetailView: View { } public var body: some View { - ZStack { - Color.gray100 - .edgesIgnoringSafeArea(.all) + GeometryReader { proxy in + ZStack(alignment: .topLeading) { + Color.gray100 + .edgesIgnoringSafeArea(.all) - VStack { - Spacer() - .frame(height: 8) + VStack { + CustomNavigationBackBar(buttonAction: { + dismiss() + }, title: "") + .padding(.horizontal, 16) + .offset(y: -20) - CustomNavigationBackBar(buttonAction: { - dismiss() - }, title: "") + ScrollView(.vertical) { + VStack(alignment: .leading) { + exploreSpotNameTitle() + .padding(.top, 24) + imageSection() + .padding(.top, 24) - exploreSpotNameTitle() + stayInfoSection() + .padding(.top, 24) + + returnDeadlineSection() + .padding(.top, 24) + + placeInfoSection() + .padding(.top, 29) + + locationMapSection() + .padding(.top, 24) + + routeButtonSection() + .padding(.top, 24) + } + .padding(.top, 48) + .padding(.horizontal, 16) + .padding(.bottom, 28) + } + .scrollIndicators(.hidden) + } - Spacer() } } } @@ -50,17 +80,315 @@ private extension ExploreDetailView { func exploreSpotNameTitle() -> some View { VStack(alignment: .leading) { Spacer() - .frame(height: 24) + .frame(height: 4) HStack(spacing: 8) { - Text("시티뷰 전망대") + Text(store.spot.name.formattedPlaceNameForDisplay) .pretendardCustomFont(textStyle: .heading1) .foregroundStyle(.staticBlack) + .lineLimit(2) - Text("관광지") + Text(store.spot.subtitle) .pretendardCustomFont(textStyle: .body2Regular) .foregroundStyle(.gray700) + + Spacer() + } + } + } + + @ViewBuilder + func imageSection() -> some View { + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 12) { + ForEach(imageCards.indices, id: \.self) { index in + spotImageCard(for: imageCards[index], index: index) + } + } + } + } + + @ViewBuilder + func stayInfoSection() -> some View { + HStack(spacing: 0) { + metricColumn( + value: stayableMinutesText, + title: "체류시간", + valueColor: .orange800 + ) + + divider + + metricColumn( + value: walkMinutesText, + title: "도보", + valueColor: .gray830 + ) + + divider + + metricColumn( + value: store.spot.distanceText, + title: "거리", + valueColor: .gray830 + ) + } + .padding(.horizontal, 8) + .padding(.vertical, 16) + .background(.staticWhite) + .clipShape(RoundedRectangle(cornerRadius: 16)) + .overlay { + RoundedRectangle(cornerRadius: 16) + .stroke(.gray300, lineWidth: 1) + } + } + + @ViewBuilder + func returnDeadlineSection() -> some View { + VStack(alignment: .leading, spacing: 0) { + HStack(spacing: 12) { + Image(asset: .warning) + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + .padding(.vertical,11) + + VStack(alignment: .leading, spacing: 4) { + HStack { + Text("최종 복귀 시간") + .pretendardCustomFont(textStyle: .body2Bold) + .foregroundStyle(.gray700) + + Spacer() + } + + ( + Text(returnDeadlineText).foregroundStyle(.orange800) + + + Text("에는 역으로 출발해야 합니다.").foregroundStyle(.gray800) + ) + .pretendardCustomFont(textStyle: .body2Medium) + .lineSpacing(2) + .lineLimit(3) + .multilineTextAlignment(.leading) + .fixedSize(horizontal: false, vertical: true) + } } + + + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 21) + .padding(.vertical, 18) + .background(.orange200) + .clipShape(RoundedRectangle(cornerRadius: 20)) + .overlay { + RoundedRectangle(cornerRadius: 20) + .stroke(.orange500, lineWidth: 1) + } + } + + @ViewBuilder + func placeInfoSection() -> some View { + VStack(alignment: .leading, spacing: 24) { + Text("장소 정보") + .pretendardCustomFont(textStyle: .bodyBold) + .foregroundStyle(.gray850) + + VStack(alignment: .leading, spacing: 16) { + infoRow( + icon: "clock.fill", + title: "영업 시간", + content: openingHoursText + ) + + infoRow( + icon: "phone.fill", + title: "전화번호", + content: phoneNumberText + ) + + infoRow( + icon: "location.fill", + title: "주소", + content: addressText + ) + } + } + } + + @ViewBuilder + func locationMapSection() -> some View { + GeometryReader { proxy in + Map(initialPosition: .region(mapRegion), interactionModes: []) { + Annotation(store.spot.name, coordinate: store.spot.coordinate) { + Image(asset: .spotPin) + .resizable() + .scaledToFit() + .frame(width: 24, height: 28) + } + } + .frame(width: proxy.size.width, height: 180) + .clipShape(RoundedRectangle(cornerRadius: 20)) + .clipped() + } + .frame(height: 180) + } + + @ViewBuilder + func routeButtonSection() -> some View { + CustomButton( + action: {}, + title: "경로 확인하기", + config: CustomButtonConfig.create(), + isEnable: true + ) + } + + @ViewBuilder + func infoRow( + icon: String, + title: String, + content: String + ) -> some View { + HStack(alignment: .top, spacing: 10) { + Image(systemName: icon) + .font(.system(size: 14, weight: .semibold)) + .foregroundStyle(.gray700) + .frame(width: 20, height: 20) + .padding(.top, 1) + + VStack(alignment: .leading, spacing: 4) { + Text(title) + .pretendardCustomFont(textStyle: .body2Medium) + .foregroundStyle(.gray700) + + Text(content) + .pretendardCustomFont(textStyle: .bodyRegular) + .foregroundStyle(.gray850) + .fixedSize(horizontal: false, vertical: true) + } + + Spacer(minLength: 0) + } + } + + @ViewBuilder + func metricColumn( + value: String, + title: String, + valueColor: Color + ) -> some View { + VStack(spacing: 4) { + Text(value) + .pretendardCustomFont(textStyle: .bodyMedium) + .foregroundStyle(valueColor) + + Text(title) + .pretendardCustomFont(textStyle: .body2Regular) + .foregroundStyle(.gray800) + } + .frame(maxWidth: .infinity) + } + + var divider: some View { + Rectangle() + .fill(.gray300) + .frame(width: 1, height: 34) + } + + var stayableMinutesText: String { + store.spot.badgeText.stayableMinutesDisplayText + } + + var walkMinutesText: String { + store.spot.walkTimeText.walkMinutesDisplayText( + spotName: store.spot.name, + subtitle: store.spot.subtitle, + distanceText: store.spot.distanceText + ) + } + + var imageCards: [URL?] { + if let imageURL { + return [imageURL, imageURL] + } + return [nil, nil] + } + + var imageURL: URL? { + store.spot.imageURL?.normalizedURL + } + + var returnDeadlineText: String { + Date().formattedReturnDeadlineText(addingMinutes: stayableMinutesValue) + } + + var stayableMinutesValue: Int { + stayableMinutesText.minutesValue + } + + var openingHoursText: String { + String.openingHoursText( + status: store.spot.statusText, + closing: store.spot.closingText + ) + } + + var phoneNumberText: String { + "전화번호 정보 준비 중" + } + + var addressText: String { + store.spot.coordinate.approximateAddressText + } + + var mapRegion: MKCoordinateRegion { + MKCoordinateRegion( + center: store.spot.coordinate, + span: MKCoordinateSpan(latitudeDelta: 0.0035, longitudeDelta: 0.0035) + ) + } + + @ViewBuilder + func spotImageCard(for url: URL?, index: Int) -> some View { + Group { + if let url { + KFImage(url) + .placeholder { + imagePlaceholder() + } + .cancelOnDisappear(true) + .fade(duration: 0.2) + .resizable() + .scaledToFill() + } else { + imagePlaceholder() + } + } + .frame(width: 280, height: 180) + .background(.gray200) + .clipShape(RoundedRectangle(cornerRadius: 20)) + .overlay(alignment: .bottomLeading) { + if index == 0 { + LinearGradient( + colors: [.black.opacity(0.0), .black.opacity(0.18)], + startPoint: .top, + endPoint: .bottom + ) + .clipShape(RoundedRectangle(cornerRadius: 20)) + } + } + } + + func imagePlaceholder() -> some View { + ZStack { + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + + Image(systemName: "photo") + .font(.system(size: 28, weight: .medium)) + .foregroundStyle(.gray500) } } diff --git a/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift b/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift deleted file mode 100644 index 2e1ac1e..0000000 --- a/Projects/Presentation/Home/Sources/Manager/LocationPermissionManager.swift +++ /dev/null @@ -1,256 +0,0 @@ -// -// LocationPermissionManager.swift -// Home -// -// Created by Roy on 2026-03-11 -// Copyright © 2026 TimeSpot, Ltd., All rights reserved. -// - -import Foundation -import CoreLocation - -#if canImport(UIKit) -import UIKit -#endif - -// MARK: - Location Errors -public enum LocationError: Error, LocalizedError { - case permissionDenied - case locationUnavailable - case timeout - - public var errorDescription: String? { - switch self { - case .permissionDenied: - return "위치 권한이 거부되었습니다." - case .locationUnavailable: - return "위치 정보를 가져올 수 없습니다." - case .timeout: - return "위치 요청 시간이 초과되었습니다." - } - } -} - -// Swift Concurrency를 사용한 위치 권한 전용 관리자 -@MainActor -public final class LocationPermissionManager: NSObject, ObservableObject { - - // 싱글톤 인스턴스 - public static let shared = LocationPermissionManager() - @Published public private(set) var authorizationStatus: CLAuthorizationStatus = .notDetermined - @Published public private(set) var currentLocation: CLLocation? - @Published public private(set) var locationError: String? - - private let locationManager = CLLocationManager() - private var authorizationContinuation: CheckedContinuation? - private var locationContinuation: CheckedContinuation? - private var locationTimeoutTask: Task? - - // 지속적인 위치 업데이트 콜백 (MainActor 격리) - @MainActor - public var onLocationUpdate: (@MainActor (CLLocation) -> Void)? - @MainActor - public var onLocationError: (@MainActor (Error) -> Void)? - - public override init() { - super.init() - setupLocationManager() - } - - private func setupLocationManager() { - locationManager.delegate = self - locationManager.desiredAccuracy = kCLLocationAccuracyBest - locationManager.distanceFilter = 10 // 10미터 이상 이동시 업데이트 - authorizationStatus = locationManager.authorizationStatus - } - - // async/await을 사용한 위치 권한 요청 - public func requestLocationPermission() async -> CLAuthorizationStatus { - let isLocationServicesEnabled = await Task.detached { - CLLocationManager.locationServicesEnabled() - }.value - - guard isLocationServicesEnabled else { - locationError = "위치 서비스가 비활성화되어 있습니다. 설정에서 활성화해 주세요." - return .denied - } - - // authorizationStatus는 델리게이트에서 업데이트된 값 사용 - switch authorizationStatus { - case .notDetermined: - return await withCheckedContinuation { continuation in - self.authorizationContinuation = continuation - locationManager.requestWhenInUseAuthorization() - } - case .denied, .restricted: - locationError = "위치 권한이 거부되었습니다. 설정에서 허용해 주세요." - return authorizationStatus - case .authorizedWhenInUse, .authorizedAlways: - return authorizationStatus - @unknown default: - locationError = "알 수 없는 위치 권한 상태입니다." - return authorizationStatus - } - } - - // iOS 14+ 정확한 위치 권한 요청 - public func requestFullAccuracy() { - if #available(iOS 14.0, *) { - locationManager.requestTemporaryFullAccuracyAuthorization(withPurposeKey: "TimeSpotLocationAccuracy") - } - } - - // 위치 업데이트 시작 - public func startLocationUpdates() { - guard authorizationStatus == .authorizedWhenInUse || authorizationStatus == .authorizedAlways else { - locationError = "위치 권한이 없습니다." - return - } - - locationManager.startUpdatingLocation() - } - - // 위치 업데이트 중지 - public func stopLocationUpdates() { - locationManager.stopUpdatingLocation() - } - - // async/await을 사용한 현재 위치 가져오기 - public func requestCurrentLocation() async throws -> CLLocation? { - guard authorizationStatus == .authorizedWhenInUse || authorizationStatus == .authorizedAlways else { - locationError = "위치 권한이 없습니다." - throw LocationError.permissionDenied - } - - if let currentLocation { - return currentLocation - } - - if let cachedLocation = locationManager.location { - self.currentLocation = cachedLocation - return cachedLocation - } - - if locationContinuation != nil { - resumeLocationContinuation(with: .failure(LocationError.locationUnavailable)) - } - - return try await withCheckedThrowingContinuation { continuation in - self.locationContinuation = continuation - self.locationTimeoutTask?.cancel() - self.locationTimeoutTask = Task { [weak self] in - guard let self else { return } - try? await Task.sleep(for: .seconds(5)) - guard !Task.isCancelled else { return } - self.resumeLocationContinuation(with: .failure(LocationError.timeout)) - } - - if #available(iOS 14.0, *) { - locationManager.requestLocation() - } else { - // iOS 14 이전에서는 잠시 업데이트하고 중지 - locationManager.startUpdatingLocation() - Task { - try await Task.sleep(for: .seconds(3)) - self.stopLocationUpdates() - } - } - } - } - - // 설정 앱으로 이동 - public func openLocationSettings() { - #if canImport(UIKit) - Task { @MainActor in - if let settingsUrl = URL(string: UIApplication.openSettingsURLString), - UIApplication.shared.canOpenURL(settingsUrl) { - await UIApplication.shared.open(settingsUrl) - } - } - #endif - } - - // 위치 서비스 사용 가능 여부 - public func isLocationServicesEnabled() async -> Bool { - await Task.detached { - CLLocationManager.locationServicesEnabled() - }.value - } - - // 권한 상태 문자열 - public var authorizationStatusString: String { - switch authorizationStatus { - case .notDetermined: - return "권한 미결정" - case .restricted: - return "권한 제한됨" - case .denied: - return "권한 거부됨" - case .authorizedAlways: - return "항상 허용" - case .authorizedWhenInUse: - return "사용 중 허용" - @unknown default: - return "알 수 없음" - } - } - - private func resumeLocationContinuation(with result: Result) { - locationTimeoutTask?.cancel() - locationTimeoutTask = nil - - guard let continuation = locationContinuation else { return } - locationContinuation = nil - - switch result { - case .success(let location): - continuation.resume(returning: location) - case .failure(let error): - continuation.resume(throwing: error) - } - } -} - -// MARK: - CLLocationManagerDelegate -extension LocationPermissionManager: CLLocationManagerDelegate { - - nonisolated public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { - guard let location = locations.last else { return } - - Task { @MainActor in - self.currentLocation = location - self.locationError = nil - - // 지속적인 위치 업데이트 콜백 호출 - await self.onLocationUpdate?(location) - - // continuation이 있으면 결과 반환 (일회성 요청용) - self.resumeLocationContinuation(with: .success(location)) - } - } - - nonisolated public func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { - Task { @MainActor in - self.locationError = "위치 업데이트 실패: \(error.localizedDescription)" - - // 지속적인 위치 업데이트 에러 콜백 호출 - await self.onLocationError?(error) - - // continuation이 있으면 에러 반환 (일회성 요청용) - self.resumeLocationContinuation(with: .failure(error)) - } - } - - nonisolated public func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { - Task { @MainActor in - self.authorizationStatus = status - self.locationError = nil - - // continuation이 있으면 권한 상태 반환 - if let continuation = self.authorizationContinuation { - self.authorizationContinuation = nil - continuation.resume(returning: status) - } - } - } -} diff --git a/Projects/Presentation/Home/Sources/Manager/NaverMapInitializer.swift b/Projects/Presentation/Home/Sources/Manager/NaverMapInitializer.swift index bd779f3..9e8c066 100644 --- a/Projects/Presentation/Home/Sources/Manager/NaverMapInitializer.swift +++ b/Projects/Presentation/Home/Sources/Manager/NaverMapInitializer.swift @@ -2,7 +2,7 @@ // NaverMapInitializer.swift // Home // -// Created by Claude on 3/12/26. +// Created by Wonji Suh on 3/12/26. // import Foundation diff --git a/Projects/Presentation/Home/Sources/TrainStation/Reducer/TrainStationFeature.swift b/Projects/Presentation/Home/Sources/TrainStation/Reducer/TrainStationFeature.swift index 635b8d4..d9a23be 100644 --- a/Projects/Presentation/Home/Sources/TrainStation/Reducer/TrainStationFeature.swift +++ b/Projects/Presentation/Home/Sources/TrainStation/Reducer/TrainStationFeature.swift @@ -162,13 +162,13 @@ extension TrainStationFeature { return .run { [stationUseCase] send in let locationManager = await LocationPermissionManager.shared let location = await MainActor.run { locationManager.currentLocation } - let lat = location?.coordinate.latitude ?? 37.5666805 - let lng = location?.coordinate.longitude ?? 126.9784147 + let userLat = location?.coordinate.latitude ?? 37.5666805 + let userLon = location?.coordinate.longitude ?? 126.9784147 do { let entity = try await stationUseCase.fetchStations( - lat: lat, - lng: lng, + userLat: userLat, + userLon: userLon, page: 1, size: 30 ) From f43a0bf84d1fc42fca82e80b2f7997db473b2812 Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 01:57:59 +0900 Subject: [PATCH 24/35] =?UTF-8?q?refactor:=20Explore=20UI=20=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=95=84=EC=9B=83=20=EC=B5=9C=EC=A0=81=ED=99=94=20?= =?UTF-8?q?=EB=B0=8F=20=EC=84=B1=EB=8A=A5=20=EA=B0=9C=EC=84=A0=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ExploreDetail 화면 레이아웃 간격 조정 - Map 상호작용 활성화 및 중복 fetch 로직 제거 - 히스토리 페이지 사이즈 50으로 증가 --- .../Model/Sources/Place/DTO/PlaceDetailDTOModel.swift | 7 +++++++ .../Sources/Place/Mapper/PlaceDetailDTOModel+.swift | 0 .../Entity/Sources/Place/PlaceDetailEntity.swift | 0 .../Domain/Entity/Sources/Place/PlaceDetailInput.swift | 0 .../Domain/Entity/Sources/Place/PlaceSearchInput.swift | 0 .../Home/Sources/Explore/Reducer/ExploreReducer.swift | 8 ++------ .../Sources/ExploreDetail/View/ExploreDetailView.swift | 6 ++---- .../Profile/Sources/Main/Reducer/ProfileFeature.swift | 10 +++++++++- 8 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 Projects/Data/Model/Sources/Place/DTO/PlaceDetailDTOModel.swift create mode 100644 Projects/Data/Model/Sources/Place/Mapper/PlaceDetailDTOModel+.swift create mode 100644 Projects/Domain/Entity/Sources/Place/PlaceDetailEntity.swift create mode 100644 Projects/Domain/Entity/Sources/Place/PlaceDetailInput.swift create mode 100644 Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift diff --git a/Projects/Data/Model/Sources/Place/DTO/PlaceDetailDTOModel.swift b/Projects/Data/Model/Sources/Place/DTO/PlaceDetailDTOModel.swift new file mode 100644 index 0000000..f416a6b --- /dev/null +++ b/Projects/Data/Model/Sources/Place/DTO/PlaceDetailDTOModel.swift @@ -0,0 +1,7 @@ +// +// PlaceDetailDTOModle.swift +// Model +// +// Created by Wonji Suh on 3/28/26. +// + diff --git a/Projects/Data/Model/Sources/Place/Mapper/PlaceDetailDTOModel+.swift b/Projects/Data/Model/Sources/Place/Mapper/PlaceDetailDTOModel+.swift new file mode 100644 index 0000000..e69de29 diff --git a/Projects/Domain/Entity/Sources/Place/PlaceDetailEntity.swift b/Projects/Domain/Entity/Sources/Place/PlaceDetailEntity.swift new file mode 100644 index 0000000..e69de29 diff --git a/Projects/Domain/Entity/Sources/Place/PlaceDetailInput.swift b/Projects/Domain/Entity/Sources/Place/PlaceDetailInput.swift new file mode 100644 index 0000000..e69de29 diff --git a/Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift b/Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift new file mode 100644 index 0000000..e69de29 diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index 796fb64..d6c76d9 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -435,7 +435,8 @@ extension ExploreReducer { state.shouldReturnToCurrentLocation = false return .none } - if !state.hasFetchedPlacesWithCurrentLocation, + if state.spots.isEmpty, + !state.hasFetchedPlacesWithCurrentLocation, !state.isLoadingPlaces { ExploreHelpers.resetSearchContext(state: &state, clearMarker: false) return .merge( @@ -457,11 +458,6 @@ extension ExploreReducer { state.currentPage = entities.currentPage state.hasNextPage = entities.hasNextPage || ExploreHelpers.hasUnresolvedBaseSpots(entities.spots) state.hasFetchedPlacesWithCurrentLocation = usedCurrentLocation - if state.currentLocation != nil - && !usedCurrentLocation - && !state.hasFetchedPlacesWithCurrentLocation { - return .send(.async(.fetchPlaces)) - } return .none case .fetchPlacesFailed(let message, let usedCurrentLocation): diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift index 48cb8b7..de3578d 100644 --- a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift +++ b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift @@ -36,12 +36,11 @@ public struct ExploreDetailView: View { dismiss() }, title: "") .padding(.horizontal, 16) - .offset(y: -20) + .offset(y: -30) ScrollView(.vertical) { VStack(alignment: .leading) { exploreSpotNameTitle() - .padding(.top, 24) imageSection() .padding(.top, 24) @@ -61,7 +60,6 @@ public struct ExploreDetailView: View { routeButtonSection() .padding(.top, 24) } - .padding(.top, 48) .padding(.horizontal, 16) .padding(.bottom, 28) } @@ -220,7 +218,7 @@ private extension ExploreDetailView { @ViewBuilder func locationMapSection() -> some View { GeometryReader { proxy in - Map(initialPosition: .region(mapRegion), interactionModes: []) { + Map(initialPosition: .region(mapRegion), interactionModes: .all) { Annotation(store.spot.name, coordinate: store.spot.coordinate) { Image(asset: .spotPin) .resizable() diff --git a/Projects/Presentation/Profile/Sources/Main/Reducer/ProfileFeature.swift b/Projects/Presentation/Profile/Sources/Main/Reducer/ProfileFeature.swift index e60c6e8..e560837 100644 --- a/Projects/Presentation/Profile/Sources/Main/Reducer/ProfileFeature.swift +++ b/Projects/Presentation/Profile/Sources/Main/Reducer/ProfileFeature.swift @@ -14,6 +14,10 @@ import UseCase @Reducer public struct ProfileFeature { + private enum Constants { + static let historyPageSize = 50 + } + public init() {} @ObservableState @@ -160,7 +164,11 @@ extension ProfileFeature { } return .run { [travelHistorySort = state.travelHistorySort] send in let result = await Result { - try await historyUseCase.myHistory(page: page, size: 10, sort: travelHistorySort) + try await historyUseCase.myHistory( + page: page, + size: Constants.historyPageSize, + sort: travelHistorySort + ) } .mapError(ProfileError.from) await send(.inner(.fetchMyHistoryResponse(result, reset: reset))) From 2df3cc5ba5bbddf62a58bfb9d6640ce5c0c5fc74 Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 01:59:02 +0900 Subject: [PATCH 25/35] =?UTF-8?q?feat:=20Place=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=95=84=ED=82=A4=ED=85=8D=EC=B2=98=20=EA=B0=95?= =?UTF-8?q?=ED=99=94=20=EB=B0=8F=20=EC=83=81=EC=84=B8=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Place 기능의 전체 레이어에 걸친 아키텍처 개선: - PlaceError 도메인 오류 처리 시스템 추가 - PlaceDetailEntity 및 입력 모델 구조 개선 - API부터 UseCase까지 일관된 에러 핸들링 적용 - 장소 상세 정보 데이터 구조 확장 --- .../Data/API/Sources/API/Place/PlaceAPI.swift | 3 + .../Place/DTO/PlaceDetailDTOModel.swift | 23 +++++- .../Place/Mapper/PlaceDetailDTOModel+.swift | 30 +++++++ .../Sources/Place/PlaceRepositoryImpl.swift | 19 ++++- .../Service/Sources/Place/PlaceRequest.swift | 34 ++++++-- .../Service/Sources/Place/PlaceService.swift | 9 +- .../Place/DefaultPlaceRepositoryImpl.swift | 8 ++ .../Sources/Place/PlaceInterface.swift | 1 + .../Entity/Sources/Error/PlaceError.swift | 82 +++++++++++++++++++ .../Entity/Sources/OAuth/UserSession.swift | 8 +- .../Sources/Place/PlaceDetailEntity.swift | 54 ++++++++++++ .../Sources/Place/PlaceDetailInput.swift | 30 +++++++ .../Entity/Sources/Place/PlaceInput.swift | 39 --------- .../Sources/Place/PlaceSearchInput.swift | 49 +++++++++++ .../Sources/Place/PlaceUseCaseImpl.swift | 69 +++++++++++----- 15 files changed, 386 insertions(+), 72 deletions(-) create mode 100644 Projects/Domain/Entity/Sources/Error/PlaceError.swift diff --git a/Projects/Data/API/Sources/API/Place/PlaceAPI.swift b/Projects/Data/API/Sources/API/Place/PlaceAPI.swift index 3d2ef8d..a0f54aa 100644 --- a/Projects/Data/API/Sources/API/Place/PlaceAPI.swift +++ b/Projects/Data/API/Sources/API/Place/PlaceAPI.swift @@ -10,6 +10,7 @@ import Foundation public enum PlaceAPI: String, CaseIterable { case fetchPlace case searchPlace + case detailPlace public var description: String { switch self { @@ -17,6 +18,8 @@ public enum PlaceAPI: String, CaseIterable { return "" case .searchPlace: return "/search" + case .detailPlace: + return "/detail" } } } diff --git a/Projects/Data/Model/Sources/Place/DTO/PlaceDetailDTOModel.swift b/Projects/Data/Model/Sources/Place/DTO/PlaceDetailDTOModel.swift index f416a6b..df09bc6 100644 --- a/Projects/Data/Model/Sources/Place/DTO/PlaceDetailDTOModel.swift +++ b/Projects/Data/Model/Sources/Place/DTO/PlaceDetailDTOModel.swift @@ -1,7 +1,28 @@ // -// PlaceDetailDTOModle.swift +// PlaceDetailDTOModel.swift // Model // // Created by Wonji Suh on 3/28/26. // +import Foundation + +public typealias PlaceDetailDTOModel = BaseResponseDTO + +// MARK: - DataClass +public struct PlaceDetailDTOResponseModel: Decodable, Equatable { + let name, category, address: String + let distanceToStation, timeToStation, stayableMinutes: Int + let stationLat, stationLon: Double + let leaveTime: String + let imageURL: [String] + let weekday, weekend: [String] + let phoneNumber: String + + enum CodingKeys: String, CodingKey { + case name, category, address, distanceToStation, timeToStation, stayableMinutes, stationLat, stationLon, leaveTime + case imageURL = "imageUrl" + case weekday, weekend, phoneNumber + } +} + diff --git a/Projects/Data/Model/Sources/Place/Mapper/PlaceDetailDTOModel+.swift b/Projects/Data/Model/Sources/Place/Mapper/PlaceDetailDTOModel+.swift index e69de29..1c3afff 100644 --- a/Projects/Data/Model/Sources/Place/Mapper/PlaceDetailDTOModel+.swift +++ b/Projects/Data/Model/Sources/Place/Mapper/PlaceDetailDTOModel+.swift @@ -0,0 +1,30 @@ +// +// PlaceDetailDTOModel+.swift +// Model +// +// Created by Wonji Suh on 3/29/26. +// + +import Foundation + +import Entity + +public extension PlaceDetailDTOResponseModel { + func toDomain() -> PlaceDetailEntity { + PlaceDetailEntity( + name: name, + category: category, + address: address, + distanceToStation: distanceToStation, + timeToStation: timeToStation, + stayableMinutes: stayableMinutes, + stationLat: stationLat, + stationLon: stationLon, + leaveTime: leaveTime, + imageURL: imageURL, + weekday: weekday, + weekend: weekend, + phoneNumber: phoneNumber + ) + } +} diff --git a/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift b/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift index 46ba603..379de6c 100644 --- a/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift +++ b/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift @@ -52,11 +52,26 @@ public final class PlaceRepositoryImpl: PlaceInterface, @unchecked Sendable { keyword: input.keyword, category: input.category, sortBy: input.sortBy, - markerLat: input.markerLat, - markerLon: input.markerLon, + mapLat: input.mapLat, + mapLon: input.mapLon, pageable: .init(page: input.page, size: input.size) ) let dto: PlaceSearchDTOModel = try await provider.request(.searchPlaces(body: body)) return dto.data.toDomain() } + + public func detailPlaces( + _ input: PlaceDetailInput + ) async throws -> PlaceDetailEntity { + let body: PlaceDetailRequest = .init( + placeId: input.placeId, + stationId: input.stationId, + userLat: input.userLat, + userLon: input.userLon, + remainingMinutes: input.remainingMinutes + ) + + let dto: PlaceDetailDTOModel = try await provider.request(.detailPlaces(body: body)) + return dto.data.toDomain() + } } diff --git a/Projects/Data/Service/Sources/Place/PlaceRequest.swift b/Projects/Data/Service/Sources/Place/PlaceRequest.swift index 8756982..d727d74 100644 --- a/Projects/Data/Service/Sources/Place/PlaceRequest.swift +++ b/Projects/Data/Service/Sources/Place/PlaceRequest.swift @@ -41,8 +41,8 @@ public struct PlaceSearchRequest: Encodable { public let keyword: String? public let category: String? public let sortBy: String - public let markerLat: Double? - public let markerLon: Double? + public let mapLat: Double? + public let mapLon: Double? public let pageable: PageableRequest public init( @@ -53,8 +53,8 @@ public struct PlaceSearchRequest: Encodable { keyword: String? = nil, category: String? = nil, sortBy: String = "STATION_NEAREST", - markerLat: Double? = nil, - markerLon: Double? = nil, + mapLat: Double? = nil, + mapLon: Double? = nil, pageable: PageableRequest = .init() ) { self.userLat = userLat @@ -64,8 +64,8 @@ public struct PlaceSearchRequest: Encodable { self.keyword = keyword self.category = category self.sortBy = sortBy - self.markerLat = markerLat - self.markerLon = markerLon + self.mapLat = mapLat + self.mapLon = mapLon self.pageable = pageable } } @@ -82,3 +82,25 @@ public struct PageableRequest: Encodable, Equatable { self.size = size } } + +public struct PlaceDetailRequest: Encodable { + let placeId: Int + let stationId: Int + let userLat: Double + let userLon: Double + let remainingMinutes: Int + + public init( + placeId: Int, + stationId: Int, + userLat: Double, + userLon: Double, + remainingMinutes: Int + ) { + self.placeId = placeId + self.stationId = stationId + self.userLat = userLat + self.userLon = userLon + self.remainingMinutes = remainingMinutes + } +} diff --git a/Projects/Data/Service/Sources/Place/PlaceService.swift b/Projects/Data/Service/Sources/Place/PlaceService.swift index 8233ec7..28007c1 100644 --- a/Projects/Data/Service/Sources/Place/PlaceService.swift +++ b/Projects/Data/Service/Sources/Place/PlaceService.swift @@ -15,6 +15,7 @@ import AsyncMoya public enum PlaceService { case fetchPlaces(body: PlaceRequest) case searchPlaces(body: PlaceSearchRequest) + case detailPlaces(body: PlaceDetailRequest) } @@ -31,6 +32,8 @@ extension PlaceService: BaseTargetType { return PlaceAPI.fetchPlace.description case .searchPlaces: return PlaceAPI.searchPlace.description + case .detailPlaces: + return PlaceAPI.detailPlace.description } } @@ -40,9 +43,7 @@ extension PlaceService: BaseTargetType { public var method: Moya.Method { switch self { - case .fetchPlaces: - return .get - case .searchPlaces: + case .fetchPlaces, .searchPlaces, .detailPlaces: return .get } } @@ -53,6 +54,8 @@ extension PlaceService: BaseTargetType { return body.toDictionary case .searchPlaces(let body): return body.toDictionary + case .detailPlaces(let body): + return body.toDictionary } } diff --git a/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift b/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift index d25d21e..f07fd4d 100644 --- a/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift +++ b/Projects/Domain/DomainInterface/Sources/Place/DefaultPlaceRepositoryImpl.swift @@ -26,4 +26,12 @@ public final class DefaultPlaceRepositoryImpl: PlaceInterface { userInfo: [NSLocalizedDescriptionKey: "PlaceRepository is not configured."] ) } + + public func detailPlaces(_ input: PlaceDetailInput) async throws -> PlaceDetailEntity { + throw NSError( + domain: "PlaceRepository", + code: -1, + userInfo: [NSLocalizedDescriptionKey: "PlaceRepository is not configured."] + ) + } } diff --git a/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift b/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift index bcbd12d..e7db85c 100644 --- a/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift +++ b/Projects/Domain/DomainInterface/Sources/Place/PlaceInterface.swift @@ -13,6 +13,7 @@ import ComposableArchitecture public protocol PlaceInterface: Sendable { func fetchPlaces(_ input: PlaceInput) async throws -> [PlaceEntity] func searchPlaces(_ input: PlaceSearchInput) async throws -> PlaceSearchPageEntity + func detailPlaces(_ input: PlaceDetailInput) async throws -> PlaceDetailEntity } diff --git a/Projects/Domain/Entity/Sources/Error/PlaceError.swift b/Projects/Domain/Entity/Sources/Error/PlaceError.swift new file mode 100644 index 0000000..6d20d7b --- /dev/null +++ b/Projects/Domain/Entity/Sources/Error/PlaceError.swift @@ -0,0 +1,82 @@ +// +// PlaceError.swift +// Entity +// +// Created by Codex on 3/29/26. +// + +import Foundation + +public enum PlaceError: Error, LocalizedError, Equatable { + case placeNotFound + case placeAccessDenied + case placeDataCorrupted + case unknownError(String) + case userCancelled + case missingRequiredField(String) + + public var errorDescription: String? { + switch self { + case .placeNotFound: + return "장소를 찾을 수 없습니다" + case .placeAccessDenied: + return "장소 접근이 거부되었습니다" + case .placeDataCorrupted: + return "장소 데이터가 손상되었습니다" + case .unknownError(let message): + return "알 수 없는 오류가 발생했습니다: \(message)" + case .userCancelled: + return "사용자가 취소했습니다" + case .missingRequiredField(let field): + return "\(field)은(는) 필수 입력 항목입니다" + } + } + + public var failureReason: String? { + switch self { + case .placeNotFound: + return "장소 조회 실패" + case .placeAccessDenied: + return "장소 접근 권한 부족" + default: + return nil + } + } + + public var recoverySuggestion: String? { + switch self { + case .placeNotFound: + return "장소를 다시 선택하거나 잠시 후 다시 시도해주세요" + case .placeAccessDenied: + return "권한 상태를 확인하거나 다시 로그인해주세요" + default: + return "문제가 지속되면 고객센터에 문의해주세요" + } + } +} + +public extension PlaceError { + static func from(_ error: Error) -> PlaceError { + if let placeError = error as? PlaceError { + return placeError + } + return .unknownError(error.localizedDescription) + } + + var shouldPresentAuth: Bool { + switch self { + case .placeAccessDenied: + return true + + case .unknownError(let message): + return message.contains("잘못된 AccessToken") + || message.contains("유효하지 않은 토큰") + || message.contains("해당 회원을 찾을 수 없습니다") + || message.contains("statusCodeError(401)") + || message.contains("401") + + default: + return false + } + } +} diff --git a/Projects/Domain/Entity/Sources/OAuth/UserSession.swift b/Projects/Domain/Entity/Sources/OAuth/UserSession.swift index c0173d2..2c86ed8 100644 --- a/Projects/Domain/Entity/Sources/OAuth/UserSession.swift +++ b/Projects/Domain/Entity/Sources/OAuth/UserSession.swift @@ -19,6 +19,8 @@ public struct UserSession: Equatable, Hashable { public var travelStationLng: Double? public var remainingMinutes: Int public var selectedExploreSpotID: String + public var selectedExplorePlaceID: String + public var explorePlacesFetchedAt: Date? public init( name: String = "", @@ -31,7 +33,9 @@ public struct UserSession: Equatable, Hashable { travelStationLat: Double? = nil, travelStationLng: Double? = nil, remainingMinutes: Int = 0, - selectedExploreSpotID: String = "" + selectedExploreSpotID: String = "", + selectedExplorePlaceID: String = "", + explorePlacesFetchedAt: Date? = nil ) { self.name = name self.email = email @@ -44,6 +48,8 @@ public struct UserSession: Equatable, Hashable { self.travelStationLng = travelStationLng self.remainingMinutes = remainingMinutes self.selectedExploreSpotID = selectedExploreSpotID + self.selectedExplorePlaceID = selectedExplorePlaceID + self.explorePlacesFetchedAt = explorePlacesFetchedAt } } diff --git a/Projects/Domain/Entity/Sources/Place/PlaceDetailEntity.swift b/Projects/Domain/Entity/Sources/Place/PlaceDetailEntity.swift index e69de29..3f8dc42 100644 --- a/Projects/Domain/Entity/Sources/Place/PlaceDetailEntity.swift +++ b/Projects/Domain/Entity/Sources/Place/PlaceDetailEntity.swift @@ -0,0 +1,54 @@ +// +// PlaceDetailEntity.swift +// Entity +// +// Created by Wonji Suh on 3/28/26. +// + +import Foundation + +public struct PlaceDetailEntity: Equatable, Hashable { + public let name: String + public let category: String + public let address: String + public let distanceToStation: Int + public let timeToStation: Int + public let stayableMinutes: Int + public let stationLat: Double + public let stationLon: Double + public let leaveTime: String + public let imageURL: [String] + public let weekday: [String] + public let weekend: [String] + public let phoneNumber: String + + public init( + name: String, + category: String, + address: String, + distanceToStation: Int, + timeToStation: Int, + stayableMinutes: Int, + stationLat: Double, + stationLon: Double, + leaveTime: String, + imageURL: [String], + weekday: [String], + weekend: [String], + phoneNumber: String + ) { + self.name = name + self.category = category + self.address = address + self.distanceToStation = distanceToStation + self.timeToStation = timeToStation + self.stayableMinutes = stayableMinutes + self.stationLat = stationLat + self.stationLon = stationLon + self.leaveTime = leaveTime + self.imageURL = imageURL + self.weekday = weekday + self.weekend = weekend + self.phoneNumber = phoneNumber + } +} diff --git a/Projects/Domain/Entity/Sources/Place/PlaceDetailInput.swift b/Projects/Domain/Entity/Sources/Place/PlaceDetailInput.swift index e69de29..15c693d 100644 --- a/Projects/Domain/Entity/Sources/Place/PlaceDetailInput.swift +++ b/Projects/Domain/Entity/Sources/Place/PlaceDetailInput.swift @@ -0,0 +1,30 @@ +// +// PlaceDetailInput.swift +// Entity +// +// Created by Wonji Suh on 3/29/26. +// + +import Foundation + +public struct PlaceDetailInput: Equatable { + public let placeId: Int + public let stationId: Int + public let userLat: Double + public let userLon: Double + public let remainingMinutes: Int + + public init( + placeId: Int, + stationId: Int, + userLat: Double, + userLon: Double, + remainingMinutes: Int + ) { + self.placeId = placeId + self.stationId = stationId + self.userLat = userLat + self.userLon = userLon + self.remainingMinutes = remainingMinutes + } +} diff --git a/Projects/Domain/Entity/Sources/Place/PlaceInput.swift b/Projects/Domain/Entity/Sources/Place/PlaceInput.swift index b3233c4..d3b39bd 100644 --- a/Projects/Domain/Entity/Sources/Place/PlaceInput.swift +++ b/Projects/Domain/Entity/Sources/Place/PlaceInput.swift @@ -32,42 +32,3 @@ public struct PlaceInput { } } -public struct PlaceSearchInput: Equatable { - public let userLat: Double - public let userLon: Double - public let stationId: Int - public let remainingMinutes: Int - public let keyword: String? - public let category: String? - public let sortBy: String - public let markerLat: Double? - public let markerLon: Double? - public let page: Int - public let size: Int - - public init( - userLat: Double, - userLon: Double, - stationId: Int, - remainingMinutes: Int, - keyword: String? = nil, - category: String? = nil, - sortBy: String = "STATION_NEAREST", - markerLat: Double? = nil, - markerLon: Double? = nil, - page: Int = 0, - size: Int = 10 - ) { - self.userLat = userLat - self.userLon = userLon - self.stationId = stationId - self.remainingMinutes = remainingMinutes - self.keyword = keyword - self.category = category - self.sortBy = sortBy - self.markerLat = markerLat - self.markerLon = markerLon - self.page = page - self.size = size - } -} diff --git a/Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift b/Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift index e69de29..f8ac094 100644 --- a/Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift +++ b/Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift @@ -0,0 +1,49 @@ +// +// PlaceSearchInput.swift +// Entity +// +// Created by Wonji Suh on 3/29/26. +// + +import Foundation + + +public struct PlaceSearchInput: Equatable { + public let userLat: Double + public let userLon: Double + public let stationId: Int + public let remainingMinutes: Int + public let keyword: String? + public let category: String? + public let sortBy: String + public let mapLat: Double? + public let mapLon: Double? + public let page: Int + public let size: Int + + public init( + userLat: Double, + userLon: Double, + stationId: Int, + remainingMinutes: Int, + keyword: String? = nil, + category: String? = nil, + sortBy: String = "STATION_NEAREST", + mapLat: Double? = nil, + mapLon: Double? = nil, + page: Int = 0, + size: Int = 10 + ) { + self.userLat = userLat + self.userLon = userLon + self.stationId = stationId + self.remainingMinutes = remainingMinutes + self.keyword = keyword + self.category = category + self.sortBy = sortBy + self.mapLat = mapLat + self.mapLon = mapLon + self.page = page + self.size = size + } +} diff --git a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift index 98bbc85..8891061 100644 --- a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift +++ b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift @@ -11,8 +11,14 @@ import Entity import ComposableArchitecture import CoreLocation import Utill +import LogMacro public protocol PlaceUseCaseInterface: Sendable { + func detailPlace( + userSession: UserSession, + placeId: Int + ) async throws -> PlaceDetailEntity + func fetchPlaces( userSession: UserSession, userLat: Double, @@ -32,8 +38,8 @@ public protocol PlaceUseCaseInterface: Sendable { keyword: String?, category: ExploreCategory?, sortBy: String, - markerLat: Double?, - markerLon: Double?, + mapLat: Double?, + mapLon: Double?, page: Int ) async throws -> PlaceSearchPageEntity @@ -45,17 +51,40 @@ public protocol PlaceUseCaseInterface: Sendable { keyword: String?, category: ExploreCategory?, sortBy: String, - markerLat: Double?, - markerLon: Double?, + mapLat: Double?, + mapLon: Double?, page: Int ) async throws -> ExploreSpotPageEntity } public struct PlaceUseCaseImpl: PlaceUseCaseInterface { @Dependency(\.placeRepository) var repository + @Dependency(\.locationUseCase) var locationUseCase public init() {} + public func detailPlace( + userSession: UserSession, + placeId: Int + ) async throws -> PlaceDetailEntity { + let resolvedLocation: CLLocation? + do { + resolvedLocation = try await locationUseCase.requestCurrentLocation() + } catch { + resolvedLocation = nil + } + + let input = PlaceDetailInput( + placeId: placeId, + stationId: Int(userSession.travelID) ?? 0, + userLat: resolvedLocation?.coordinate.latitude ?? userSession.travelStationLat ?? 0, + userLon: resolvedLocation?.coordinate.longitude ?? userSession.travelStationLng ?? 0, + remainingMinutes: 250 + ) + + return try await repository.detailPlaces(input) + } + public func fetchPlaces( userSession: UserSession, userLat: Double, @@ -87,15 +116,15 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { keyword: nil, category: nil, sortBy: "STATION_NEAREST", - markerLat: userSession.travelStationLat, - markerLon: userSession.travelStationLng, + mapLat: userSession.travelStationLat, + mapLon: userSession.travelStationLng, page: 0, size: 30 // 더 많은 데이터 로딩 ) let pageEntity = try await repository.searchPlaces(searchInput) - print("🚀 [초기로딩] searchPlaces 응답: \(pageEntity.content.count)개") + #logDebug("🚀 [초기로딩] searchPlaces 응답: \(pageEntity.content.count)개") // 직접 마커 생성 (병합 없이) let spots = pageEntity.content.map { entity in @@ -108,7 +137,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { ) } - print("🚀 [초기로딩] 최종 spots: \(spots.count)개") + #logDebug("🚀 [초기로딩] 최종 spots: \(spots.count)개") return ExploreSpotPageEntity( spots: spots, @@ -124,8 +153,8 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { keyword: String?, category: ExploreCategory?, sortBy: String = "STATION_NEAREST", - markerLat: Double?, - markerLon: Double?, + mapLat: Double?, + mapLon: Double?, page: Int ) async throws -> PlaceSearchPageEntity { let input = PlaceSearchInput( @@ -136,8 +165,8 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { keyword: keyword, category: mapCategory(category), sortBy: sortBy, - markerLat: markerLat, - markerLon: markerLon, + mapLat: mapLat, + mapLon: mapLon, page: page, size: 10 ) @@ -153,8 +182,8 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { keyword: String?, category: ExploreCategory?, sortBy: String = "STATION_NEAREST", - markerLat: Double?, - markerLon: Double?, + mapLat: Double?, + mapLon: Double?, page: Int ) async throws -> ExploreSpotPageEntity { // 🔍 단순화: searchPlaces API 하나만 사용 @@ -166,19 +195,19 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { keyword: keyword, category: mapCategory(category), sortBy: sortBy, - markerLat: markerLat, - markerLon: markerLon, + mapLat: mapLat, + mapLon: mapLon, page: page, size: 30 // 더 많은 데이터 로딩 ) - print("🔍 [API요청] searchExploreSpots - page: \(page), size: 30") + #logDebug("🔍 [API요청] searchExploreSpots - page: \(page), size: 30") let pageEntity = try await repository.searchPlaces(searchInput) - print("🔍 [API응답] searchExploreSpots - 응답 size: \(pageEntity.content.count), hasNext: \(!pageEntity.isLastPage)") + #logDebug("🔍 [API응답] searchExploreSpots - 응답 size: \(pageEntity.content.count), hasNext: \(!pageEntity.isLastPage)") - print("🔍 [필터링] searchPlaces 응답: \(pageEntity.content.count)개") + #logDebug("🔍 [필터링] searchPlaces 응답: \(pageEntity.content.count)개") // 직접 마커 생성 (병합 없이) let spots = pageEntity.content.map { entity in @@ -191,7 +220,7 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { ) } - print("🔍 [필터링] 최종 spots: \(spots.count)개") + #logDebug("🔍 [필터링] 최종 spots: \(spots.count)개") return ExploreSpotPageEntity( spots: spots, From 53ffc979c35883ceb4f3a7b65d17fb9c7837ea34 Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 02:00:02 +0900 Subject: [PATCH 26/35] =?UTF-8?q?feat:=20Explore=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=A7=80=EB=8F=84=20=EC=97=B0=EB=8F=99=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EA=B0=95=ED=99=94=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/NaverMapComponent.swift | 16 +- .../Coordinator/Reducer/HomeCoordinator.swift | 28 +- .../Explore/Helpers/ExploreHelpers.swift | 20 + .../Explore/Reducer/ExploreReducer.swift | 129 ++++-- .../Reducer/ExploreState+Extensions.swift | 5 +- .../Sources/Explore/View/ExploreView.swift | 5 +- .../Reducer/ExploreDetailFeature.swift | 102 +++-- .../View/ExploreDetailView.swift | 366 +++++++++++++++--- .../Reducer/ExploreListFeature.swift | 152 ++++++-- .../ExploreList/View/ExploreListView.swift | 22 +- 10 files changed, 682 insertions(+), 163 deletions(-) diff --git a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift index 9271984..2be6b74 100644 --- a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift +++ b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift @@ -25,6 +25,7 @@ public struct NaverMapComponent: UIViewRepresentable { let returnToLocationTrigger: Int let onSpotTapped: ((String) -> Void)? let onMapTapped: (() -> Void)? + let onCameraIdle: ((CLLocationCoordinate2D) -> Void)? // 마커와 경로를 저장할 변수들 private static var currentMarker: NMFMarker? @@ -46,7 +47,8 @@ public struct NaverMapComponent: UIViewRepresentable { selectedSpotID: String? = nil, returnToLocationTrigger: Int = 0, onSpotTapped: ((String) -> Void)? = nil, - onMapTapped: (() -> Void)? = nil + onMapTapped: (() -> Void)? = nil, + onCameraIdle: ((CLLocationCoordinate2D) -> Void)? = nil ) { self.locationPermissionStatus = locationPermissionStatus self.currentLocation = currentLocation @@ -57,6 +59,7 @@ public struct NaverMapComponent: UIViewRepresentable { self.returnToLocationTrigger = returnToLocationTrigger self.onSpotTapped = onSpotTapped self.onMapTapped = onMapTapped + self.onCameraIdle = onCameraIdle } public func makeCoordinator() -> Coordinator { @@ -81,6 +84,7 @@ public struct NaverMapComponent: UIViewRepresentable { // 🎯 네이버 지도 위치 오버레이 설정 (항상 기본 오버레이 사용) mapView.locationOverlay.hidden = false mapView.touchDelegate = context.coordinator + mapView.addCameraDelegate(delegate: context.coordinator) // 현재 위치가 있으면 그 위치로, 없으면 선택한 역 위치, 그것도 없으면 서울 let initialLatitude = currentLocation?.coordinate.latitude @@ -101,6 +105,7 @@ public struct NaverMapComponent: UIViewRepresentable { } public static func dismantleUIView(_ uiView: NMFMapView, coordinator: Coordinator) { + uiView.removeCameraDelegate(delegate: coordinator) currentMarker?.mapView = nil destinationMarker?.mapView = nil routePath?.mapView = nil @@ -315,7 +320,7 @@ public struct NaverMapComponent: UIViewRepresentable { } } - public final class Coordinator: NSObject, NMFMapViewTouchDelegate { + public final class Coordinator: NSObject, NMFMapViewTouchDelegate, NMFMapViewCameraDelegate { var parent: NaverMapComponent private var shouldIgnoreNextMapTap = false @@ -334,6 +339,13 @@ public struct NaverMapComponent: UIViewRepresentable { } parent.onMapTapped?() } + + public func mapViewCameraIdle(_ mapView: NMFMapView) { + let target = mapView.cameraPosition.target + parent.onCameraIdle?( + CLLocationCoordinate2D(latitude: target.lat, longitude: target.lng) + ) + } } // MARK: - Helper Functions diff --git a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift index c3bee34..b1d712d 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift @@ -52,7 +52,7 @@ public struct HomeCoordinator { case presentProfileWithAnimation case presentExplore case presentExploreList(ExploreReducer.State) - case presentExploreDetail(ExploreMapSpot) + case presentExploreDetail } // MARK: - NavigationAction @@ -120,11 +120,8 @@ extension HomeCoordinator { } switch state.routes[id] { - case let .push(.explore(exploreState)): - guard let selectedSpot = exploreState.selectedSpot else { - return .none - } - return .send(.inner(.presentExploreDetail(selectedSpot))) + case .push(.explore): + return .send(.inner(.presentExploreDetail)) default: return .none } @@ -230,11 +227,24 @@ extension HomeCoordinator { return .none case let .presentExploreList(exploreState): - state.routes.push(.exploreList(.init())) + var exploreListState = ExploreListFeature.State() + exploreListState.searchText = exploreState.searchText + exploreListState.selectedCategory = exploreState.selectedCategory + exploreListState.currentLocation = exploreState.currentLocation?.coordinate + exploreListState.markerLat = exploreState.mapCenterLat ?? exploreState.searchMarkerLat + exploreListState.markerLon = exploreState.mapCenterLon ?? exploreState.searchMarkerLon + exploreListState.bufferedSpots = exploreState.spots + exploreListState.spots = Array( + exploreState.spots.prefix(ExploreListFeature.State.pageChunkSize) + ) + exploreListState.currentPage = exploreState.currentPage + exploreListState.hasNextPage = exploreState.hasNextPage + exploreListState.hasLoadedInitialPage = !exploreState.spots.isEmpty + state.routes.push(.exploreList(exploreListState)) return .none - case .presentExploreDetail(let spot): - state.routes.push(.exploreDetail(.init(spot: spot))) + case .presentExploreDetail: + state.routes.push(.exploreDetail(.init())) return .none } } diff --git a/Projects/Presentation/Home/Sources/Explore/Helpers/ExploreHelpers.swift b/Projects/Presentation/Home/Sources/Explore/Helpers/ExploreHelpers.swift index c587e19..d46a519 100644 --- a/Projects/Presentation/Home/Sources/Explore/Helpers/ExploreHelpers.swift +++ b/Projects/Presentation/Home/Sources/Explore/Helpers/ExploreHelpers.swift @@ -50,6 +50,7 @@ public struct ExploreHelpers { state.$userSession.withLock { $0.selectedExploreSpotID = "" + $0.selectedExplorePlaceID = "" } } @@ -127,6 +128,25 @@ public struct ExploreHelpers { } } + public static func syncSelectionWithFilters(state: inout ExploreReducer.State) { + guard let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty else { + return + } + + guard let selectedSpot = state.spots.first(where: { $0.id == selectedSpotID && $0.hasDetail }) else { + clearSelectedSpot(state: &state) + return + } + + let matchesCategory = state.selectedCategory == .all || selectedSpot.category == state.selectedCategory + let query = currentKeyword(state: state) + let matchesQuery = query.isEmpty || selectedSpot.name.localizedCaseInsensitiveContains(query) + + if !matchesCategory || !matchesQuery { + clearSelectedSpot(state: &state) + } + } + public static func filteredCardSpots(state: ExploreReducer.State) -> [ExploreMapSpot] { let query = currentKeyword(state: state) let filtered = state.spots.filter { spot in diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift index d6c76d9..b44a09a 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift @@ -42,6 +42,8 @@ public struct ExploreReducer: Sendable { public var pendingSelectFirstSpotFromNextPage: Bool = false public var searchMarkerLat: Double? public var searchMarkerLon: Double? + public var mapCenterLat: Double? + public var mapCenterLon: Double? @Presents public var alert: AlertState? @Shared(.inMemory("UserSession")) var userSession: UserSession = .empty @@ -94,10 +96,12 @@ public struct ExploreReducer: Sendable { case searchTextChanged(String) case categoryTapped(ExploreCategory) case spotTapped(String) + case detailTapped case spotCardChanged(String?) case cardDragChanged(CGFloat) case cardDragEnded(CGFloat) case loadNextSpotPage + case mapCenterChanged(CLLocationCoordinate2D) // 길찾기 관련 액션 case searchRouteToGangnam case clearRoute @@ -241,25 +245,13 @@ extension ExploreReducer { case .searchTextChanged(let text): state.searchText = text - ExploreHelpers.resetSearchContext( - state: &state, - preserveSearchText: true - ) - return .merge( - .cancel(id: CancelID.searchPlaces), - .send(.async(.fetchPlaces)) - ) + ExploreHelpers.syncSelectionWithFilters(state: &state) + return .none case .categoryTapped(let category): state.selectedCategory = category - ExploreHelpers.resetSearchContext( - state: &state, - preserveSelectedCategory: true - ) - return .merge( - .cancel(id: CancelID.searchPlaces), - .send(.async(.fetchPlaces)) - ) + ExploreHelpers.syncSelectionWithFilters(state: &state) + return .none case .spotTapped(let spotID): if state.userSession.selectedExploreSpotID == spotID, state.isSpotCardVisible { @@ -272,6 +264,7 @@ extension ExploreReducer { state.$userSession.withLock { $0.selectedExploreSpotID = spotID + $0.selectedExplorePlaceID = spotID } state.isSpotCardVisible = state.spots.contains(where: { $0.id == spotID && $0.hasDetail }) #logDebug(" [ExploreReducer] spotTapped id=\(spotID), hasDetail=\(state.isSpotCardVisible)") @@ -289,10 +282,26 @@ extension ExploreReducer { .send(.async(.fetchPlaces)) ) + case .detailTapped: + guard state.remainingSelectedSpotMinutes > 0 else { + state.alert = AlertState { + TextState("방문 불가능해요") + } actions: { + ButtonState(action: .dismissAlert) { + TextState("확인") + } + } message: { + TextState("남은 체류 시간이 없어서 상세 보기를 열 수 없어요.") + } + return .none + } + return .send(.delegate(.presentExplorerDetail)) + case .spotCardChanged(let spotID): if let spotID { state.$userSession.withLock { $0.selectedExploreSpotID = spotID + $0.selectedExplorePlaceID = spotID } state.isSpotCardVisible = true } else { @@ -335,6 +344,11 @@ extension ExploreReducer { state.pendingSelectFirstSpotFromNextPage = true return .send(.async(.searchPlaces(page: state.currentPage, append: true))) + case .mapCenterChanged(let coordinate): + state.mapCenterLat = coordinate.latitude + state.mapCenterLon = coordinate.longitude + return .none + // 길찾기 관련 액션 case .searchRouteToGangnam: guard let currentLocation = state.currentLocation else { @@ -366,6 +380,7 @@ extension ExploreReducer { if clearResult.shouldClearSpot { state.$userSession.withLock { $0.selectedExploreSpotID = "" + $0.selectedExplorePlaceID = "" } } @@ -458,6 +473,9 @@ extension ExploreReducer { state.currentPage = entities.currentPage state.hasNextPage = entities.hasNextPage || ExploreHelpers.hasUnresolvedBaseSpots(entities.spots) state.hasFetchedPlacesWithCurrentLocation = usedCurrentLocation + state.$userSession.withLock { + $0.explorePlacesFetchedAt = Date() + } return .none case .fetchPlacesFailed(let message, let usedCurrentLocation): @@ -486,8 +504,16 @@ extension ExploreReducer { let previousDetailedCount = state.spots.filter(\.hasDetail).count let currentKeyword = ExploreHelpers.currentKeyword(state: state) let currentCategory = ExploreHelpers.currentCategory(state: state) - let currentMarkerLat = state.searchMarkerLat - let currentMarkerLon = state.searchMarkerLon + let currentMarkerLat: Double? + let currentMarkerLon: Double? + + if ExploreHelpers.isResolvingSelectedMarkerDetail(state: state) { + currentMarkerLat = state.searchMarkerLat + currentMarkerLon = state.searchMarkerLon + } else { + currentMarkerLat = state.mapCenterLat ?? state.userSession.travelStationLat + currentMarkerLon = state.mapCenterLon ?? state.userSession.travelStationLng + } guard requestedPage == 0 || append else { return .none @@ -508,8 +534,19 @@ extension ExploreReducer { } state.hasFetchedPlacesWithCurrentLocation = usedCurrentLocation - state.currentPage = pageEntity.currentPage let newSpots = pageEntity.spots + let mergedSpots: [ExploreMapSpot] + if append { + let existingSpotIDs = Set(state.spots.map(\.id)) + let uniqueNewSpots = newSpots.filter { !existingSpotIDs.contains($0.id) } + mergedSpots = state.spots + uniqueNewSpots + } else { + mergedSpots = newSpots + } + state.currentPage = requestedPage + 1 + state.$userSession.withLock { + $0.explorePlacesFetchedAt = Date() + } let newDetailedCount = newSpots.filter(\.hasDetail).count let gainedMoreDetail = newDetailedCount > previousDetailedCount let shouldKeepBootstrappingDetails = @@ -524,9 +561,9 @@ extension ExploreReducer { let firstNewSpotID = newSpots.first(where: \.hasDetail)?.id let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty - state.spots = newSpots + state.spots = mergedSpots if let selectedSpotID, - newSpots.contains(where: { $0.id == selectedSpotID && $0.hasDetail }) { + mergedSpots.contains(where: { $0.id == selectedSpotID && $0.hasDetail }) { state.isSpotCardVisible = true } else if state.searchMarkerLat != nil { state.isSpotCardVisible = false @@ -537,6 +574,7 @@ extension ExploreReducer { if state.pendingSelectFirstSpotFromNextPage, let firstNewSpotID { state.$userSession.withLock { $0.selectedExploreSpotID = firstNewSpotID + $0.selectedExplorePlaceID = firstNewSpotID } state.isSpotCardVisible = true state.pendingSelectFirstSpotFromNextPage = false @@ -636,15 +674,18 @@ extension ExploreReducer { state.$userSession.withLock { $0.selectedExploreSpotID = cardSpots[0].id + $0.selectedExplorePlaceID = cardSpots[0].id } } else if isAtStart { state.$userSession.withLock { $0.selectedExploreSpotID = cardSpots[cardSpots.count - 1].id + $0.selectedExplorePlaceID = cardSpots[cardSpots.count - 1].id } } else { let newIndex = next ? currentIndex + 1 : currentIndex - 1 state.$userSession.withLock { $0.selectedExploreSpotID = cardSpots[newIndex].id + $0.selectedExplorePlaceID = cardSpots[newIndex].id } } @@ -776,17 +817,21 @@ extension ExploreReducer { let fallbackLng = state.userSession.travelStationLng ?? 0 let userLat = state.currentLocation?.coordinate.latitude ?? fallbackLat let userLon = state.currentLocation?.coordinate.longitude ?? fallbackLng - let markerLat = state.searchMarkerLat ?? state.userSession.travelStationLat ?? fallbackLat - let markerLon = state.searchMarkerLon ?? state.userSession.travelStationLng ?? fallbackLng - let requestedMarkerLat = state.searchMarkerLat - let requestedMarkerLon = state.searchMarkerLon let rawKeyword = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) let isResolvingSelectedMarkerDetail = ExploreHelpers.isResolvingSelectedMarkerDetail(state: state) + let mapLat = isResolvingSelectedMarkerDetail + ? (state.searchMarkerLat ?? state.userSession.travelStationLat ?? fallbackLat) + : (state.mapCenterLat ?? state.userSession.travelStationLat ?? fallbackLat) + let mapLon = isResolvingSelectedMarkerDetail + ? (state.searchMarkerLon ?? state.userSession.travelStationLng ?? fallbackLng) + : (state.mapCenterLon ?? state.userSession.travelStationLng ?? fallbackLng) + let requestedMarkerLat = mapLat + let requestedMarkerLon = mapLon let keyword = isResolvingSelectedMarkerDetail ? nil : rawKeyword.nilIfEmpty let category: ExploreCategory? = isResolvingSelectedMarkerDetail ? nil : (state.selectedCategory == .all ? nil : state.selectedCategory) - let sortBy = isResolvingSelectedMarkerDetail ? "MARKER_NEAREST" : "STATION_NEAREST" + let sortBy = "MAP_NEAREST" let usedCurrentLocation = state.currentLocation != nil let baseSpots = state.spots @@ -800,8 +845,8 @@ extension ExploreReducer { keyword: keyword, category: category, sortBy: sortBy, - markerLat: markerLat, - markerLon: markerLon, + mapLat: mapLat, + mapLon: mapLon, page: page ) } @@ -902,3 +947,31 @@ extension ExploreReducer { } } } + +private extension ExploreReducer.State { + var remainingSelectedSpotMinutes: Int { + guard let selectedSpot else { + return 0 + } + + let originalMinutes = selectedSpot.originalStayableMinutes + let elapsedMinutes = elapsedMinutesSincePlacesFetched + return max(originalMinutes - elapsedMinutes, 0) + } + + var elapsedMinutesSincePlacesFetched: Int { + guard let fetchedAt = userSession.explorePlacesFetchedAt else { + return 0 + } + + return max(Int(Date().timeIntervalSince(fetchedAt) / 60), 0) + } +} + +private extension ExploreMapSpot { + var originalStayableMinutes: Int { + let digits = badgeText.compactMap(\.wholeNumberValue) + guard !digits.isEmpty else { return 0 } + return digits.reduce(0) { ($0 * 10) + $1 } + } +} diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift index b6fe3e7..148427b 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift @@ -33,8 +33,7 @@ extension ExploreReducer.State { var filteredMapSpots: [ExploreMapSpot] { spots.filter { spot in - hasVisibleMarkerContent(spot) - && (selectedCategory == .all || spot.category == selectedCategory) + spot.hasDetail && matchesCurrentFilters(spot) } } @@ -118,6 +117,8 @@ extension ExploreReducer.State: Hashable { hasher.combine(currentLocation?.coordinate.longitude) hasher.combine(isLocationPermissionDenied) hasher.combine(locationError) + hasher.combine(mapCenterLat) + hasher.combine(mapCenterLon) hasher.combine(spots) hasher.combine(isLoadingRoute) hasher.combine(routeError) diff --git a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift index f12fa9a..da9cadf 100644 --- a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift +++ b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift @@ -72,6 +72,9 @@ private extension ExploreView { }, onMapTapped: { store.send(.view(.spotCardChanged(nil))) + }, + onCameraIdle: { coordinate in + store.send(.view(.mapCenterChanged(coordinate))) } ) .ignoresSafeArea(.all) @@ -114,7 +117,7 @@ private extension ExploreView { adjacentOffset: store.state.adjacentCardOffset(cardTravelDistance: cardTravelDistance), cardOpacity: store.state.cardOpacity(cardTravelDistance: cardTravelDistance), onCardTap: { - store.send(.delegate(.presentExplorerDetail)) + store.send(.view(.detailTapped)) }, onRouteTap: {}, onDragChanged: { value in diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift b/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift index 60bda3f..431ea5a 100644 --- a/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift @@ -5,11 +5,10 @@ // Created by Wonji Suh on 3/28/26. // - import Foundation import ComposableArchitecture import Entity - +import UseCase @Reducer public struct ExploreDetailFeature { @@ -17,11 +16,12 @@ public struct ExploreDetailFeature { @ObservableState public struct State: Equatable { - public let spot: ExploreMapSpot + public var placeDetail: PlaceDetailEntity? + public var isLoading: Bool = false + public var errorMessage: String? + @Shared(.inMemory("UserSession")) var userSession: UserSession = .empty - public init(spot: ExploreMapSpot) { - self.spot = spot - } + public init() {} } public enum Action: ViewAction, BindableAction { @@ -30,51 +30,39 @@ public struct ExploreDetailFeature { case async(AsyncAction) case inner(InnerAction) case delegate(DelegateAction) - } - //MARK: - ViewAction @CasePathable public enum View { - + case onAppear } - - - //MARK: - AsyncAction 비동기 처리 액션 public enum AsyncAction: Equatable { - + case fetchPlaceDetail } - //MARK: - 앱내에서 사용하는 액션 public enum InnerAction: Equatable { + case fetchPlaceDetailResponse(Result) } - //MARK: - NavigationAction - public enum DelegateAction: Equatable { - - - } + public enum DelegateAction: Equatable {} + @Dependency(\.placeUseCase) var placeUseCase public var body: some Reducer { BindingReducer() Reduce { state, action in switch action { - case .binding(_): - return .none - - case .view(let viewAction): - return handleViewAction(state: &state, action: viewAction) - - case .async(let asyncAction): - return handleAsyncAction(state: &state, action: asyncAction) - - case .inner(let innerAction): - return handleInnerAction(state: &state, action: innerAction) - - case .delegate(let delegateAction): - return handleDelegateAction(state: &state, action: delegateAction) + case .binding: + return .none + case .view(let viewAction): + return handleViewAction(state: &state, action: viewAction) + case .async(let asyncAction): + return handleAsyncAction(state: &state, action: asyncAction) + case .inner(let innerAction): + return handleInnerAction(state: &state, action: innerAction) + case .delegate(let delegateAction): + return handleDelegateAction(state: &state, action: delegateAction) } } } @@ -86,7 +74,8 @@ extension ExploreDetailFeature { action: View ) -> Effect { switch action { - + case .onAppear: + return .send(.async(.fetchPlaceDetail)) } } @@ -95,7 +84,27 @@ extension ExploreDetailFeature { action: AsyncAction ) -> Effect { switch action { + case .fetchPlaceDetail: + guard let placeID = Int(state.userSession.selectedExplorePlaceID) else { + state.errorMessage = PlaceError.placeNotFound.errorDescription + return .none + } + + state.isLoading = true + state.errorMessage = nil + let userSession = state.userSession + return .run { send in + let result = await Result { + try await placeUseCase.detailPlace( + userSession: userSession, + placeId: placeID + ) + } + .mapError(PlaceError.from) + + await send(.inner(.fetchPlaceDetailResponse(result))) + } } } @@ -103,9 +112,7 @@ extension ExploreDetailFeature { state: inout State, action: DelegateAction ) -> Effect { - switch action { - - } + switch action {} } private func handleInnerAction( @@ -113,9 +120,26 @@ extension ExploreDetailFeature { action: InnerAction ) -> Effect { switch action { - + case .fetchPlaceDetailResponse(let result): + state.isLoading = false + + switch result { + case .success(let detail): + state.placeDetail = detail + state.errorMessage = nil + case .failure(let error): + state.errorMessage = error.errorDescription + } + return .none } } } -extension ExploreDetailFeature.State: Hashable {} +extension ExploreDetailFeature.State: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(placeDetail) + hasher.combine(isLoading) + hasher.combine(errorMessage) + hasher.combine(userSession) + } +} diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift index de3578d..857be7e 100644 --- a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift +++ b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift @@ -32,33 +32,44 @@ public struct ExploreDetailView: View { .edgesIgnoringSafeArea(.all) VStack { - CustomNavigationBackBar(buttonAction: { - dismiss() - }, title: "") - .padding(.horizontal, 16) - .offset(y: -30) + if !(store.isLoading && store.placeDetail == nil) { + CustomNavigationBackBar(buttonAction: { + dismiss() + }, title: "") + .padding(.horizontal, 16) + .offset(y: -30) + } else { + Spacer() + .frame(height: 24) + } ScrollView(.vertical) { - VStack(alignment: .leading) { - exploreSpotNameTitle() + Group { + if store.isLoading && store.placeDetail == nil { + skeletonContent() + } else { + VStack(alignment: .leading) { + exploreSpotNameTitle() - imageSection() - .padding(.top, 24) + imageSection() + .padding(.top, 24) - stayInfoSection() - .padding(.top, 24) + stayInfoSection() + .padding(.top, 24) - returnDeadlineSection() - .padding(.top, 24) + returnDeadlineSection() + .padding(.top, 24) - placeInfoSection() - .padding(.top, 29) + placeInfoSection() + .padding(.top, 29) - locationMapSection() - .padding(.top, 24) + locationMapSection() + .padding(.top, 24) - routeButtonSection() - .padding(.top, 24) + routeButtonSection() + .padding(.top, 24) + } + } } .padding(.horizontal, 16) .padding(.bottom, 28) @@ -68,6 +79,9 @@ public struct ExploreDetailView: View { } } + .onAppear { + store.send(.view(.onAppear)) + } } } @@ -81,12 +95,12 @@ private extension ExploreDetailView { .frame(height: 4) HStack(spacing: 8) { - Text(store.spot.name.formattedPlaceNameForDisplay) + Text(placeNameText.formattedPlaceNameForDisplay) .pretendardCustomFont(textStyle: .heading1) .foregroundStyle(.staticBlack) .lineLimit(2) - Text(store.spot.subtitle) + Text(categoryText) .pretendardCustomFont(textStyle: .body2Regular) .foregroundStyle(.gray700) @@ -126,7 +140,7 @@ private extension ExploreDetailView { divider metricColumn( - value: store.spot.distanceText, + value: distanceText, title: "거리", valueColor: .gray830 ) @@ -161,9 +175,10 @@ private extension ExploreDetailView { } ( - Text(returnDeadlineText).foregroundStyle(.orange800) + Text(returnDeadlineText) + .foregroundStyle(isVisitUnavailable ? .gray700 : .orange800) + - Text("에는 역으로 출발해야 합니다.").foregroundStyle(.gray800) + Text(returnDeadlineSuffixText).foregroundStyle(.gray800) ) .pretendardCustomFont(textStyle: .body2Medium) .lineSpacing(2) @@ -219,7 +234,7 @@ private extension ExploreDetailView { func locationMapSection() -> some View { GeometryReader { proxy in Map(initialPosition: .region(mapRegion), interactionModes: .all) { - Annotation(store.spot.name, coordinate: store.spot.coordinate) { + Annotation(placeNameText, coordinate: mapCoordinate) { Image(asset: .spotPin) .resizable() .scaledToFit() @@ -237,9 +252,9 @@ private extension ExploreDetailView { func routeButtonSection() -> some View { CustomButton( action: {}, - title: "경로 확인하기", + title: isVisitUnavailable ? "방문 불가능" : "경로 확인하기", config: CustomButtonConfig.create(), - isEnable: true + isEnable: !isVisitUnavailable ) } @@ -296,58 +311,164 @@ private extension ExploreDetailView { } var stayableMinutesText: String { - store.spot.badgeText.stayableMinutesDisplayText + "약 \(remainingStayableMinutes)분" } var walkMinutesText: String { - store.spot.walkTimeText.walkMinutesDisplayText( - spotName: store.spot.name, - subtitle: store.spot.subtitle, - distanceText: store.spot.distanceText - ) + if let placeDetail = store.placeDetail { + return "\(placeDetail.timeToStation)분" + } + return "0분" } var imageCards: [URL?] { - if let imageURL { - return [imageURL, imageURL] + let urls = store.placeDetail?.imageURL.compactMap(\.normalizedURL) ?? [] + if !urls.isEmpty { + return urls } return [nil, nil] } - var imageURL: URL? { - store.spot.imageURL?.normalizedURL + var placeNameText: String { + store.placeDetail?.name ?? "" + } + + var categoryText: String { + store.placeDetail?.category ?? "" + } + + var distanceText: String { + if let placeDetail = store.placeDetail { + return "\(placeDetail.distanceToStation)m" + } + return "" } var returnDeadlineText: String { - Date().formattedReturnDeadlineText(addingMinutes: stayableMinutesValue) + if isVisitUnavailable { + return "방문 불가능해요" + } + + if let leaveTime = store.placeDetail?.leaveTime, + let formatted = formattedDeadlineTime(from: leaveTime) { + return formatted + } + + return Date().formattedReturnDeadlineText(addingMinutes: stayableMinutesValue) + "분" } var stayableMinutesValue: Int { - stayableMinutesText.minutesValue + remainingStayableMinutes + } + + var remainingStayableMinutes: Int { + let originalMinutes = store.placeDetail?.stayableMinutes ?? 0 + let elapsedMinutes = elapsedMinutesSincePlacesFetched + return max(originalMinutes - elapsedMinutes, 0) + } + + var elapsedMinutesSincePlacesFetched: Int { + guard let fetchedAt = store.userSession.explorePlacesFetchedAt else { + return 0 + } + + return max(Int(Date().timeIntervalSince(fetchedAt) / 60), 0) + } + + var isVisitUnavailable: Bool { + remainingStayableMinutes <= 0 + } + + var returnDeadlineSuffixText: String { + isVisitUnavailable ? "" : " 출발해야 해" } var openingHoursText: String { - String.openingHoursText( - status: store.spot.statusText, - closing: store.spot.closingText - ) + let weekdayText = summarizedOpeningHours(from: store.placeDetail?.weekday ?? []) + let weekendText = summarizedOpeningHours(from: store.placeDetail?.weekend ?? []) + + switch (weekdayText.isEmpty, weekendText.isEmpty) { + case (false, false): + return "평일 \(weekdayText), 주말 \(weekendText)" + case (false, true): + return "평일 \(weekdayText)" + case (true, false): + return "주말 \(weekendText)" + case (true, true): + return "영업 시간 정보 준비 중" + } + } + + func summarizedOpeningHours(from values: [String]) -> String { + let normalized = values + .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } + .filter { !$0.isEmpty } + + guard !normalized.isEmpty else { + return "" + } + + let extractedTimes = normalized.map { value in + guard let separatorIndex = value.firstIndex(of: ":") else { + return value + } + return value[value.index(after: separatorIndex)...] + .trimmingCharacters(in: .whitespacesAndNewlines) + } + + let uniqueTimes = Array(Set(extractedTimes)) + + if uniqueTimes.count == 1, let first = extractedTimes.first { + return first + } + + return normalized.joined(separator: ", ") } var phoneNumberText: String { - "전화번호 정보 준비 중" + (store.placeDetail?.phoneNumber)?.nilIfEmpty ?? "전화번호 정보 준비 중" } var addressText: String { - store.spot.coordinate.approximateAddressText + (store.placeDetail?.address)?.nilIfEmpty ?? "주소 정보 준비 중" } var mapRegion: MKCoordinateRegion { MKCoordinateRegion( - center: store.spot.coordinate, + center: mapCoordinate, span: MKCoordinateSpan(latitudeDelta: 0.0035, longitudeDelta: 0.0035) ) } + var mapCoordinate: CLLocationCoordinate2D { + if let placeDetail = store.placeDetail { + return CLLocationCoordinate2D( + latitude: placeDetail.stationLat, + longitude: placeDetail.stationLon + ) + } + + return CLLocationCoordinate2D( + latitude: store.userSession.travelStationLat ?? 37.5666805, + longitude: store.userSession.travelStationLng ?? 126.9784147 + ) + } + + func formattedDeadlineTime(from value: String) -> String? { + let formatter = DateFormatter() + formatter.locale = Locale(identifier: "ko_KR") + formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" + + guard let date = formatter.date(from: value) else { + return nil + } + + let outputFormatter = DateFormatter() + outputFormatter.locale = Locale(identifier: "ko_KR") + outputFormatter.dateFormat = "a h:mm분" + return outputFormatter.string(from: date) + } + @ViewBuilder func spotImageCard(for url: URL?, index: Int) -> some View { Group { @@ -389,5 +510,158 @@ private extension ExploreDetailView { .foregroundStyle(.gray500) } } +} +private extension ExploreDetailView { + @ViewBuilder + func skeletonContent() -> some View { + VStack(alignment: .leading, spacing: 0) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 84, height: 14) + .skeletonShimmer() + .padding(.top, 12) + + HStack(spacing: 12) { + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + .frame(height: 180) + .frame(maxWidth: .infinity) + .skeletonShimmer() + + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + .frame(width: 84, height: 180) + .skeletonShimmer() + } + .padding(.top, 24) + + HStack(spacing: 0) { + skeletonMetricColumn() + divider + skeletonMetricColumn() + divider + skeletonMetricColumn() + } + .padding(.horizontal, 8) + .padding(.vertical, 16) + .background(.staticWhite) + .clipShape(RoundedRectangle(cornerRadius: 16)) + .overlay { + RoundedRectangle(cornerRadius: 16) + .stroke(.gray300, lineWidth: 1) + } + .padding(.top, 24) + + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + .frame(height: 84) + .skeletonShimmer() + .padding(.top, 24) + + VStack(alignment: .leading, spacing: 16) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 64, height: 14) + .skeletonShimmer() + + skeletonInfoRow(lineWidth: 180) + skeletonInfoRow(lineWidth: 120) + skeletonInfoRow(lineWidth: 200) + } + .padding(.top, 24) + + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + .frame(height: 180) + .skeletonShimmer() + .padding(.top, 24) + + Capsule() + .fill(.gray200) + .frame(height: 56) + .skeletonShimmer() + .padding(.top, 24) + } + } + + @ViewBuilder + func skeletonMetricColumn() -> some View { + VStack(spacing: 8) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 46, height: 16) + .skeletonShimmer() + + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 34, height: 12) + .skeletonShimmer() + } + .frame(maxWidth: .infinity) + } + + @ViewBuilder + func skeletonInfoRow(lineWidth: CGFloat) -> some View { + HStack(alignment: .top, spacing: 10) { + Circle() + .fill(.gray200) + .frame(width: 20, height: 20) + .skeletonShimmer() + + VStack(alignment: .leading, spacing: 6) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 56, height: 12) + .skeletonShimmer() + + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: lineWidth, height: 14) + .skeletonShimmer() + } + + Spacer(minLength: 0) + } + } +} + +private extension View { + func skeletonShimmer() -> some View { + modifier(ExploreDetailSkeletonShimmerModifier()) + } +} + +private struct ExploreDetailSkeletonShimmerModifier: ViewModifier { + @State private var isAnimating = false + + func body(content: Content) -> some View { + content + .overlay { + GeometryReader { geometry in + LinearGradient( + colors: [ + .white.opacity(0), + .white.opacity(0.28), + .white.opacity(0) + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + .frame(width: geometry.size.width * 0.55) + .offset(x: isAnimating ? geometry.size.width * 1.25 : -geometry.size.width * 0.8) + } + .clipped() + } + .mask(content) + .onAppear { + guard !isAnimating else { return } + withAnimation( + .easeInOut(duration: 1.0) + .repeatForever(autoreverses: false) + ) { + isAnimating = true + } + } + } } diff --git a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift index cbb1e47..d2ea368 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift @@ -11,6 +11,7 @@ import CoreLocation import ComposableArchitecture import Entity import UseCase +import Utill public enum ExploreListSort: String, CaseIterable, Equatable { case stationNearest = "STATION_NEAREST" @@ -36,17 +37,22 @@ public struct ExploreListFeature { @ObservableState public struct State: Equatable { + public static let pageChunkSize = 10 + public var searchText: String = "" public var selectedCategory: ExploreCategory = .all public var selectedSort: ExploreListSort = .stationNearest public var requestSortBy: String = "STATION_NEAREST" public var spots: [ExploreMapSpot] = [] + public var bufferedSpots: [ExploreMapSpot] = [] public var currentPage: Int = 0 public var hasNextPage: Bool = true public var isLoading: Bool = false public var currentLocation: CLLocationCoordinate2D? public var markerLat: Double? public var markerLon: Double? + public var lastTriggeredLoadSpotID: String? + public var hasLoadedInitialPage: Bool = false @Shared(.inMemory("UserSession")) public var userSession: UserSession = .empty public init() {} @@ -80,7 +86,7 @@ public struct ExploreListFeature { //MARK: - 앱내에서 사용하는 액션 public enum InnerAction: Equatable { - case searchPlacesResponse(ExploreSpotPageEntity, append: Bool) + case searchPlacesResponse(ExploreSpotPageEntity, append: Bool, requestedPage: Int) case searchPlacesFailed(String) } @@ -124,40 +130,53 @@ extension ExploreListFeature { ) -> Effect { switch action { case .onAppear: + guard !state.hasLoadedInitialPage else { + return .none + } + state.hasLoadedInitialPage = true return .send(.async(.searchPlaces(page: 0, append: false))) case .searchTextChanged(let text): state.searchText = text - state.currentPage = 0 - state.hasNextPage = true - return .merge( - .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 0, append: false))) - ) + state.lastTriggeredLoadSpotID = nil + return .none case .categoryTapped(let category): state.selectedCategory = category - state.currentPage = 0 - state.hasNextPage = true - return .merge( - .cancel(id: CancelID.searchPlaces), - .send(.async(.searchPlaces(page: 0, append: false))) - ) + state.lastTriggeredLoadSpotID = nil + return .none case .sortTapped(let sort): state.selectedSort = sort state.requestSortBy = sort.rawValue state.currentPage = 0 state.hasNextPage = true + state.lastTriggeredLoadSpotID = nil return .merge( .cancel(id: CancelID.searchPlaces), .send(.async(.searchPlaces(page: 0, append: false))) ) case .loadNextPage: - guard state.hasNextPage, !state.isLoading else { + guard !state.isLoading else { + return .none + } + + let currentLastSpotID = state.spots.last?.id + guard state.lastTriggeredLoadSpotID != currentLastSpotID else { + return .none + } + if state.spots.count < state.bufferedSpots.count { + state.lastTriggeredLoadSpotID = currentLastSpotID + revealNextChunk(state: &state) + return .none + } + + guard state.hasNextPage else { return .none } + + state.lastTriggeredLoadSpotID = currentLastSpotID return .send(.async(.searchPlaces(page: state.currentPage, append: true))) } } @@ -181,30 +200,41 @@ extension ExploreListFeature { let trimmedKeyword = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) let keyword = trimmedKeyword.isEmpty ? nil : trimmedKeyword let category: ExploreCategory? = state.selectedCategory == .all ? nil : state.selectedCategory - let baseSpots = state.spots let sortBy = state.requestSortBy - let markerLat = state.markerLat ?? userSession.travelStationLat - let markerLon = state.markerLon ?? userSession.travelStationLng + let mapLat = state.markerLat ?? userSession.travelStationLat + let mapLon = state.markerLon ?? userSession.travelStationLng return .run { send in let result = await Result { - try await placeUseCase.searchExploreSpots( - baseSpots: baseSpots, + try await placeUseCase.searchPlaces( userSession: userSession, userLat: userLat, userLon: userLon, keyword: keyword, category: category, sortBy: sortBy, - markerLat: markerLat, - markerLon: markerLon, + mapLat: mapLat, + mapLon: mapLon, page: page ) } switch result { case .success(let pageEntity): - await send(.inner(.searchPlacesResponse(pageEntity, append: append))) + let spots = makeSpots(from: pageEntity.content, userSession: userSession) + await send( + .inner( + .searchPlacesResponse( + ExploreSpotPageEntity( + spots: spots, + currentPage: pageEntity.page + 1, + hasNextPage: !pageEntity.isLastPage + ), + append: append, + requestedPage: page + ) + ) + ) case .failure(let error): await send(.inner(.searchPlacesFailed(error.localizedDescription))) } @@ -228,22 +258,23 @@ extension ExploreListFeature { action: InnerAction ) -> Effect { switch action { - case let .searchPlacesResponse(pageEntity, append): + case let .searchPlacesResponse(pageEntity, append, requestedPage): state.isLoading = false if append { - // 무한 스크롤: 기존 데이터에 새 데이터 추가 (중복 제거) - let existingSpotIDs = Set(state.spots.map { $0.id }) + let existingSpotIDs = Set(state.bufferedSpots.map(\.id)) let uniqueNewSpots = pageEntity.spots.filter { !existingSpotIDs.contains($0.id) } - state.spots.append(contentsOf: uniqueNewSpots) - print("🔄 [무한스크롤] 기존: \(state.spots.count - uniqueNewSpots.count)개 + 신규: \(uniqueNewSpots.count)개 = 총: \(state.spots.count)개") + state.bufferedSpots.append(contentsOf: uniqueNewSpots) + revealNextChunk(state: &state) + print("🔄 [무한스크롤] 버퍼 총: \(state.bufferedSpots.count)개, 화면 노출: \(state.spots.count)개") } else { - // 첫 로딩/새로운 검색: 데이터 교체 - state.spots = pageEntity.spots - print("🆕 [새로고침] 총: \(state.spots.count)개 로딩") + state.bufferedSpots = pageEntity.spots + state.spots = [] + revealNextChunk(state: &state) + print("🆕 [새로고침] 버퍼 총: \(state.bufferedSpots.count)개, 화면 노출: \(state.spots.count)개") } - state.currentPage = pageEntity.currentPage + state.currentPage = requestedPage + 1 state.hasNextPage = pageEntity.hasNextPage return .none @@ -254,6 +285,65 @@ extension ExploreListFeature { } } +private extension ExploreListFeature { + func revealNextChunk(state: inout State) { + let nextCount = min( + state.spots.count + State.pageChunkSize, + state.bufferedSpots.count + ) + state.spots = Array(state.bufferedSpots.prefix(nextCount)) + } + + func makeSpots( + from places: [PlaceEntity], + userSession: UserSession + ) -> [ExploreMapSpot] { + places.map { place in + let coordinate = CLLocationCoordinate2D(latitude: place.lat, longitude: place.lon) + let closingText: String + + if let closingTime = place.closingTime, !closingTime.isEmpty { + closingText = closingTime.formattedClosingTimeText() + } else { + closingText = place.address + } + + let distanceText: String + let walkTimeText: String + + if let stationLat = userSession.travelStationLat, + let stationLon = userSession.travelStationLng { + let stationLocation = CLLocation(latitude: stationLat, longitude: stationLon) + let placeLocation = CLLocation(latitude: place.lat, longitude: place.lon) + let distanceInMeters = stationLocation.distance(from: placeLocation) + let roundedDistance = Int((distanceInMeters / 10).rounded() * 10) + let walkingMinutes = max(Int(ceil(distanceInMeters / 67)), 1) + + distanceText = "\(roundedDistance)m" + walkTimeText = "\(userSession.travelStationName)역에서 약 \(walkingMinutes)분" + } else { + distanceText = "" + walkTimeText = "" + } + + return ExploreMapSpot( + id: String(place.placeId), + name: place.name, + category: place.category, + coordinate: coordinate, + hasDetail: true, + imageURL: place.imageURL, + badgeText: place.stayableMinutes > 0 ? "\(place.stayableMinutes)분 체류 가능" : "", + subtitle: place.category.title, + statusText: place.isOpen ? "영업 중" : "영업 종료", + closingText: closingText, + distanceText: distanceText, + walkTimeText: walkTimeText + ) + } + } +} + extension ExploreListFeature.State: Hashable { public static func == (lhs: Self, rhs: Self) -> Bool { lhs.searchText == rhs.searchText diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift index 5d45ca4..34c4bc3 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift @@ -48,10 +48,11 @@ public struct ExploreListView: View { LazyVStack(spacing: 12) { ForEach(filteredSpots) { spot in ExploreSpotListCardView(spot: spot) - .onAppear { - guard spot.id == filteredSpots.last?.id else { return } - store.send(.view(.loadNextPage)) - } + .onAppear { + guard shouldShowLoadMore else { return } + guard spot.id == filteredSpots.last?.id else { return } + store.send(.view(.loadNextPage)) + } } if store.isLoading { @@ -84,9 +85,20 @@ public struct ExploreListView: View { } private extension ExploreListView { + var isFilteringLocally: Bool { + !store.searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty + || store.selectedCategory != .all + } + + var shouldShowLoadMore: Bool { + !isFilteringLocally && (store.spots.count < store.bufferedSpots.count || store.hasNextPage) + } + var filteredSpots: [ExploreMapSpot] { let query = store.searchText.trimmingCharacters(in: .whitespacesAndNewlines) - return store.spots.filter { spot in + let sourceSpots = isFilteringLocally ? store.bufferedSpots : store.spots + + return sourceSpots.filter { spot in let hasDetail = spot.hasDetail let matchesCategory = store.selectedCategory == .all || spot.category == store.selectedCategory let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) From bf57efc40731802de696ddf67df245226ec5074a Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 03:16:33 +0900 Subject: [PATCH 27/35] =?UTF-8?q?feat:=20=ED=83=90=EC=83=89=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=84=B1=EB=8A=A5=20=EC=B5=9C=EC=A0=81=ED=99=94=20?= =?UTF-8?q?=EB=B0=8F=20UX=20=EA=B0=9C=EC=84=A0=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지도 마커 이미지 캐싱, 스켈레톤 로딩 뷰 추가, 조건부 UI 표시 등 성능과 사용자 경험을 개선한 종합적인 업데이트 --- .../Components/NaverMapComponent.swift | 209 +++++++++++------- .../Coordinator/Reducer/HomeCoordinator.swift | 22 +- .../Explore/View/ExploreSkeletonView.swift | 135 +++++++++++ .../Reducer/ExploreDetailFeature.swift | 76 +++++++ .../View/ExploreDetailView.swift | 17 +- .../Reducer/ExploreListFeature.swift | 67 +++++- .../View/ExploreListSkeletonView.swift | 117 +--------- .../ExploreList/View/ExploreListView.swift | 6 +- 8 files changed, 441 insertions(+), 208 deletions(-) create mode 100644 Projects/Presentation/Home/Sources/Explore/View/ExploreSkeletonView.swift diff --git a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift index 2be6b74..5752533 100644 --- a/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift +++ b/Projects/Presentation/Home/Sources/Components/NaverMapComponent.swift @@ -31,6 +31,7 @@ public struct NaverMapComponent: UIViewRepresentable { private static var currentMarker: NMFMarker? private static var destinationMarker: NMFMarker? private static var spotMarkers: [String: NMFMarker] = [:] + private static let markerImageCache = NSCache() private static var selectedSpotID: String? private static var lastSyncedSpotID: String? private static var lastDestinationKey: String? @@ -106,19 +107,19 @@ public struct NaverMapComponent: UIViewRepresentable { public static func dismantleUIView(_ uiView: NMFMapView, coordinator: Coordinator) { uiView.removeCameraDelegate(delegate: coordinator) - currentMarker?.mapView = nil - destinationMarker?.mapView = nil - routePath?.mapView = nil - spotMarkers.values.forEach { $0.mapView = nil } - spotMarkers.removeAll() - currentMarker = nil - destinationMarker = nil - selectedSpotID = nil - lastSyncedSpotID = nil - lastDestinationKey = nil - lastReturnToLocationTrigger = nil - lastAutoFitKey = nil - routePath = nil + Self.currentMarker?.mapView = nil + Self.destinationMarker?.mapView = nil + Self.routePath?.mapView = nil + Self.spotMarkers.values.forEach { $0.mapView = nil } + Self.spotMarkers.removeAll() + Self.currentMarker = nil + Self.destinationMarker = nil + Self.selectedSpotID = nil + Self.lastSyncedSpotID = nil + Self.lastDestinationKey = nil + Self.lastReturnToLocationTrigger = nil + Self.lastAutoFitKey = nil + Self.routePath = nil } public func updateUIView(_ uiView: NMFMapView, context: Context) { @@ -128,12 +129,8 @@ public struct NaverMapComponent: UIViewRepresentable { && Self.lastReturnToLocationTrigger != returnToLocationTrigger let shouldPrioritizeCurrentLocation = shouldReturnToLocation let autoFitKey = makeAutoFitKey(destination: destination, spots: spots) - // 기존 마커들과 경로 제거 - Self.currentMarker?.mapView = nil - Self.destinationMarker?.mapView = nil - Self.spotMarkers.values.forEach { $0.mapView = nil } - Self.spotMarkers.removeAll() Self.routePath?.mapView = nil + Self.routePath = nil // 위치 권한이 허용되었고 현재 위치가 있을 때 - 항상 현재 위치 마커 표시 if (locationPermissionStatus == .authorizedWhenInUse || locationPermissionStatus == .authorizedAlways), @@ -157,45 +154,55 @@ public struct NaverMapComponent: UIViewRepresentable { // 경로가 있을 때는 출발점에 빨간색 마커도 추가로 표시 if routeInfo != nil { - let currentMarker = NMFMarker() - currentMarker.position = NMGLatLng(lat: location.coordinate.latitude, lng: location.coordinate.longitude) - - // 네이버 기본 마커 (빨간색) - currentMarker.iconTintColor = UIColor.red - currentMarker.touchHandler = { _ in - Self.selectedSpotID = nil - Self.updateSpotMarkerSelection() - onMapTapped?() - return true + if Self.currentMarker == nil { + let currentMarker = NMFMarker() + currentMarker.iconTintColor = UIColor.red + currentMarker.touchHandler = { _ in + Self.setSelectedSpotID(nil) + onMapTapped?() + return true + } + currentMarker.mapView = uiView + Self.currentMarker = currentMarker } - currentMarker.mapView = uiView - Self.currentMarker = currentMarker + + Self.currentMarker?.position = NMGLatLng( + lat: location.coordinate.latitude, + lng: location.coordinate.longitude + ) + Self.currentMarker?.mapView = uiView #logDebug(" [NaverMapComponent] 출발점 마커 추가") } else { + Self.currentMarker?.mapView = nil + Self.currentMarker = nil #logDebug(" [NaverMapComponent] 기본 위치 오버레이 사용") } + } else { + Self.currentMarker?.mapView = nil + Self.currentMarker = nil } // 목적지 마커 추가 (네이버 3D 기본 마커 - 초록색) if let destination = destination { let destinationKey = "\(destination.coordinate.latitude),\(destination.coordinate.longitude),\(destination.name)" - let destinationMarker = NMFMarker() - destinationMarker.position = NMGLatLng( + if Self.destinationMarker == nil { + let destinationMarker = NMFMarker() + destinationMarker.iconTintColor = UIColor.systemGreen + destinationMarker.touchHandler = { _ in + Self.setSelectedSpotID(nil) + onMapTapped?() + return true + } + destinationMarker.mapView = uiView + Self.destinationMarker = destinationMarker + } + + Self.destinationMarker?.position = NMGLatLng( lat: destination.coordinate.latitude, lng: destination.coordinate.longitude ) - - // 네이버 기본 마커 (초록색) - destinationMarker.iconTintColor = UIColor.systemGreen - destinationMarker.touchHandler = { _ in - Self.selectedSpotID = nil - Self.updateSpotMarkerSelection() - onMapTapped?() - return true - } - destinationMarker.mapView = uiView - Self.destinationMarker = destinationMarker + Self.destinationMarker?.mapView = uiView #logDebug(" [NaverMapComponent] 목적지 마커 추가: \(destination.name)") @@ -211,47 +218,24 @@ public struct NaverMapComponent: UIViewRepresentable { ) } } else { + Self.destinationMarker?.mapView = nil + Self.destinationMarker = nil Self.lastDestinationKey = nil } let previousSpotID = Self.lastSyncedSpotID - Self.selectedSpotID = selectedSpotID - Self.lastSyncedSpotID = selectedSpotID + Self.setSelectedSpotID(selectedSpotID) + Self.lastSyncedSpotID = Self.selectedSpotID if !spots.contains(where: { $0.id == Self.selectedSpotID }) { - Self.selectedSpotID = nil + Self.setSelectedSpotID(nil) } - for spot in spots { - let marker = NMFMarker() - marker.position = NMGLatLng( - lat: spot.coordinate.latitude, - lng: spot.coordinate.longitude - ) - marker.iconImage = NMFOverlayImage(image: markerImage(for: spot.category)) - marker.anchor = CGPoint(x: 0.5, y: 1.0) - Self.applySpotMarkerStyle( - marker, - isSelected: spot.id == Self.selectedSpotID - ) - marker.touchHandler = { _ in - context.coordinator.markMarkerTap() - Self.selectedSpotID = spot.id - Self.updateSpotMarkerSelection() - onSpotTapped?(spot.id) - moveCamera( - on: uiView, - to: NMGLatLng( - lat: spot.coordinate.latitude, - lng: spot.coordinate.longitude - ), - zoom: 17 - ) - return true - } - marker.mapView = uiView - Self.spotMarkers[spot.id] = marker - } + syncSpotMarkers( + on: uiView, + coordinator: context.coordinator, + onSpotTapped: onSpotTapped + ) if !shouldPrioritizeCurrentLocation, let selectedSpotID = Self.selectedSpotID, @@ -351,6 +335,11 @@ public struct NaverMapComponent: UIViewRepresentable { // MARK: - Helper Functions private func markerImage(for category: ExploreCategory) -> UIImage { + let cacheKey = NSString(string: "marker-\(category.rawValue)") + if let cachedImage = Self.markerImageCache.object(forKey: cacheKey) { + return cachedImage + } + let asset: ImageAsset switch category { case .all: @@ -367,7 +356,9 @@ public struct NaverMapComponent: UIViewRepresentable { asset = .etcPin } - return UIImage(asset) ?? UIImage() + let image = UIImage(asset) ?? UIImage() + Self.markerImageCache.setObject(image, forKey: cacheKey) + return image } private static func applySpotMarkerStyle( @@ -385,6 +376,70 @@ public struct NaverMapComponent: UIViewRepresentable { } } + private static func setSelectedSpotID(_ newValue: String?) { + guard selectedSpotID != newValue else { return } + + let previousSpotID = selectedSpotID + selectedSpotID = newValue + + if let previousSpotID, let previousMarker = spotMarkers[previousSpotID] { + applySpotMarkerStyle(previousMarker, isSelected: false) + } + + if let newValue, let selectedMarker = spotMarkers[newValue] { + applySpotMarkerStyle(selectedMarker, isSelected: true) + } + } + + private func syncSpotMarkers( + on mapView: NMFMapView, + coordinator: Coordinator, + onSpotTapped: ((String) -> Void)? + ) { + let currentSpotIDs = Set(spots.map(\.id)) + + for (spotID, marker) in Self.spotMarkers where !currentSpotIDs.contains(spotID) { + marker.mapView = nil + Self.spotMarkers.removeValue(forKey: spotID) + } + + for spot in spots { + let marker: NMFMarker + + if let existingMarker = Self.spotMarkers[spot.id] { + marker = existingMarker + } else { + let newMarker = NMFMarker() + newMarker.anchor = CGPoint(x: 0.5, y: 1.0) + newMarker.mapView = mapView + Self.spotMarkers[spot.id] = newMarker + marker = newMarker + } + + marker.position = NMGLatLng( + lat: spot.coordinate.latitude, + lng: spot.coordinate.longitude + ) + marker.iconImage = NMFOverlayImage(image: markerImage(for: spot.category)) + marker.mapView = mapView + marker.touchHandler = { _ in + coordinator.markMarkerTap() + Self.setSelectedSpotID(spot.id) + onSpotTapped?(spot.id) + moveCamera( + on: mapView, + to: NMGLatLng( + lat: spot.coordinate.latitude, + lng: spot.coordinate.longitude + ), + zoom: 17 + ) + return true + } + Self.applySpotMarkerStyle(marker, isSelected: spot.id == Self.selectedSpotID) + } + } + private func moveCamera( on mapView: NMFMapView, to target: NMGLatLng, diff --git a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift index b1d712d..594ea2d 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift @@ -233,13 +233,21 @@ extension HomeCoordinator { exploreListState.currentLocation = exploreState.currentLocation?.coordinate exploreListState.markerLat = exploreState.mapCenterLat ?? exploreState.searchMarkerLat exploreListState.markerLon = exploreState.mapCenterLon ?? exploreState.searchMarkerLon - exploreListState.bufferedSpots = exploreState.spots - exploreListState.spots = Array( - exploreState.spots.prefix(ExploreListFeature.State.pageChunkSize) - ) - exploreListState.currentPage = exploreState.currentPage - exploreListState.hasNextPage = exploreState.hasNextPage - exploreListState.hasLoadedInitialPage = !exploreState.spots.isEmpty + + let hasFullyLoadedMarkerData = + !exploreState.spots.isEmpty + && exploreState.spots.allSatisfy(\.hasDetail) + + if hasFullyLoadedMarkerData { + exploreListState.bufferedSpots = exploreState.spots + exploreListState.spots = Array( + exploreState.spots.prefix(ExploreListFeature.State.pageChunkSize) + ) + exploreListState.currentPage = exploreState.currentPage + exploreListState.hasNextPage = exploreState.hasNextPage + exploreListState.hasLoadedInitialPage = true + } + state.routes.push(.exploreList(exploreListState)) return .none diff --git a/Projects/Presentation/Home/Sources/Explore/View/ExploreSkeletonView.swift b/Projects/Presentation/Home/Sources/Explore/View/ExploreSkeletonView.swift new file mode 100644 index 0000000..80098ae --- /dev/null +++ b/Projects/Presentation/Home/Sources/Explore/View/ExploreSkeletonView.swift @@ -0,0 +1,135 @@ +// +// ExploreSkeletonView.swift +// Home +// + +import SwiftUI + +import DesignSystem + +struct ExploreSkeletonView: View { + var body: some View { + ZStack { + LinearGradient( + colors: [.gray200, .gray100], + startPoint: .top, + endPoint: .bottom + ) + .ignoresSafeArea() + + VStack(spacing: 0) { + headerSection() + .padding(.top, 8) + .padding(.horizontal, 20) + + Spacer() + + bottomSection() + } + } + } +} + +private extension ExploreSkeletonView { + @ViewBuilder + func headerSection() -> some View { + VStack(spacing: 0) { + HStack(spacing: 10) { + Circle() + .fill(.staticWhite.opacity(0.9)) + .frame(width: 48, height: 48) + + RoundedRectangle(cornerRadius: 18) + .fill(.staticWhite.opacity(0.9)) + .frame(height: 48) + } + + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 8) { + ForEach(0..<5, id: \.self) { index in + Capsule() + .fill(.staticWhite.opacity(0.9)) + .frame(width: CGFloat([72, 64, 80, 68, 76][index]), height: 36) + } + } + .padding(.top, 10) + .padding(.horizontal, 2) + } + } + } + + @ViewBuilder + func bottomSection() -> some View { + VStack(spacing: 16) { + HStack { + Spacer() + + Circle() + .fill(.staticWhite) + .frame(width: 48, height: 48) + .shadow(color: .black.opacity(0.08), radius: 8, y: 2) + } + .padding(.horizontal, 16) + + selectedSpotCardSkeleton() + .padding(.horizontal, 16) + } + .padding(.bottom, 36) + } + + @ViewBuilder + func selectedSpotCardSkeleton() -> some View { + VStack(alignment: .leading, spacing: 0) { + HStack(alignment: .top, spacing: 12) { + VStack(alignment: .leading, spacing: 0) { + Capsule() + .fill(.gray200) + .frame(width: 88, height: 24) + .padding(.bottom, 12) + + RoundedRectangle(cornerRadius: 6) + .fill(.gray200) + .frame(height: 22) + .padding(.bottom, 6) + + RoundedRectangle(cornerRadius: 6) + .fill(.gray200) + .frame(width: 120, height: 16) + .padding(.bottom, 12) + + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 180, height: 14) + .padding(.bottom, 8) + + HStack(spacing: 8) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 52, height: 14) + + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 120, height: 14) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + + RoundedRectangle(cornerRadius: 16) + .fill(.gray200) + .frame(width: 92, height: 112) + } + .padding(.horizontal, 16) + .padding(.top, 16) + .padding(.bottom, 20) + + RoundedRectangle(cornerRadius: 25) + .fill(.gray850) + .frame(height: 55) + .padding(.horizontal, 16) + .padding(.bottom, 12) + } + .background(.staticWhite) + .clipShape(RoundedRectangle(cornerRadius: 24)) + .shadow(color: .black.opacity(0.12), radius: 14, y: 4) + } +} diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift b/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift index 431ea5a..fc2ad84 100644 --- a/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift @@ -7,6 +7,7 @@ import Foundation import ComposableArchitecture +import DesignSystem import Entity import UseCase @@ -19,6 +20,9 @@ public struct ExploreDetailFeature { public var placeDetail: PlaceDetailEntity? public var isLoading: Bool = false public var errorMessage: String? + public var shouldDismiss: Bool = false + @Presents public var customAlert: CustomAlertState? + public var customAlertMode: CustomAlertMode? @Shared(.inMemory("UserSession")) var userSession: UserSession = .empty public init() {} @@ -29,9 +33,20 @@ public struct ExploreDetailFeature { case view(View) case async(AsyncAction) case inner(InnerAction) + case scope(ScopeAction) case delegate(DelegateAction) } + @CasePathable + public enum ScopeAction { + case customAlert(PresentationAction) + } + + public enum CustomAlertMode: Equatable { + case visitUnavailable + case networkError + } + @CasePathable public enum View { case onAppear @@ -61,10 +76,15 @@ public struct ExploreDetailFeature { return handleAsyncAction(state: &state, action: asyncAction) case .inner(let innerAction): return handleInnerAction(state: &state, action: innerAction) + case .scope(let scopeAction): + return handleScopeAction(state: &state, action: scopeAction) case .delegate(let delegateAction): return handleDelegateAction(state: &state, action: delegateAction) } } + .ifLet(\.$customAlert, action: \.scope.customAlert) { + CustomConfirmAlert() + } } } @@ -115,6 +135,33 @@ extension ExploreDetailFeature { switch action {} } + private func handleScopeAction( + state: inout State, + action: ScopeAction + ) -> Effect { + switch action { + case .customAlert(.presented(.confirmTapped)): + switch state.customAlertMode { + case .visitUnavailable, .networkError: + state.customAlert = nil + state.customAlertMode = nil + state.shouldDismiss = true + return .none + case .none: + state.customAlert = nil + return .none + } + + case .customAlert(.presented(.cancelTapped)), .customAlert(.dismiss): + state.customAlert = nil + state.customAlertMode = nil + return .none + + case .customAlert(.presented(.policyTapped)): + return .none + } + } + private func handleInnerAction( state: inout State, action: InnerAction @@ -127,12 +174,41 @@ extension ExploreDetailFeature { case .success(let detail): state.placeDetail = detail state.errorMessage = nil + if isVisitUnavailable(detail: detail, fetchedAt: state.userSession.explorePlacesFetchedAt) { + state.customAlertMode = .visitUnavailable + state.customAlert = .alert( + title: "방문 불가능해요", + message: "남은 체류 시간이 없어서 이전 화면으로 돌아갈게요.", + confirmTitle: "확인", + cancelTitle: "취소" + ) + } case .failure(let error): state.errorMessage = error.errorDescription + state.customAlertMode = .networkError + state.customAlert = .alert( + title: "오류가 발생했어요", + message: error.errorDescription ?? "장소 정보를 불러오지 못했어요.", + confirmTitle: "확인", + cancelTitle: "취소" + ) } return .none } } + + private func isVisitUnavailable( + detail: PlaceDetailEntity, + fetchedAt: Date? + ) -> Bool { + let elapsedMinutes: Int + if let fetchedAt { + elapsedMinutes = max(Int(Date().timeIntervalSince(fetchedAt) / 60), 0) + } else { + elapsedMinutes = 0 + } + return max(detail.stayableMinutes - elapsedMinutes, 0) <= 0 + } } extension ExploreDetailFeature.State: Hashable { diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift index 857be7e..89acc82 100644 --- a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift +++ b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift @@ -57,8 +57,10 @@ public struct ExploreDetailView: View { stayInfoSection() .padding(.top, 24) - returnDeadlineSection() - .padding(.top, 24) + if !isVisitUnavailable { + returnDeadlineSection() + .padding(.top, 24) + } placeInfoSection() .padding(.top, 29) @@ -66,8 +68,10 @@ public struct ExploreDetailView: View { locationMapSection() .padding(.top, 24) - routeButtonSection() - .padding(.top, 24) + if !isVisitUnavailable { + routeButtonSection() + .padding(.top, 24) + } } } } @@ -82,6 +86,11 @@ public struct ExploreDetailView: View { .onAppear { store.send(.view(.onAppear)) } + .onChange(of: store.shouldDismiss) { _, shouldDismiss in + guard shouldDismiss else { return } + dismiss() + } + .customAlert($store.scope(state: \.customAlert, action: \.scope.customAlert)) } } diff --git a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift index d2ea368..d7eaaa7 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift @@ -159,24 +159,39 @@ extension ExploreListFeature { case .loadNextPage: guard !state.isLoading else { + print("⏸️ [ExploreList] loadNextPage skipped: already loading") return .none } - let currentLastSpotID = state.spots.last?.id + let visibleSpots = filteredSpots(from: state.spots, state: state) + let bufferedVisibleSpots = filteredSpots(from: state.bufferedSpots, state: state) + let currentLastSpotID = visibleSpots.last?.id + guard state.lastTriggeredLoadSpotID != currentLastSpotID else { + print("⏸️ [ExploreList] loadNextPage skipped: duplicate trigger for lastVisibleSpotID=\(currentLastSpotID ?? "nil")") return .none } - if state.spots.count < state.bufferedSpots.count { + + if visibleSpots.count < bufferedVisibleSpots.count { state.lastTriggeredLoadSpotID = currentLastSpotID - revealNextChunk(state: &state) + print( + "📦 [ExploreList] reveal buffered chunk: lastVisibleSpotID=\(currentLastSpotID ?? "nil"), visible=\(visibleSpots.count), bufferedVisible=\(bufferedVisibleSpots.count), rawShown=\(state.spots.count), rawBuffered=\(state.bufferedSpots.count)" + ) + revealNextVisibleChunk(state: &state) return .none } guard state.hasNextPage else { + print( + "⏹️ [ExploreList] loadNextPage skipped: no next page, lastVisibleSpotID=\(currentLastSpotID ?? "nil"), visible=\(visibleSpots.count), bufferedVisible=\(bufferedVisibleSpots.count)" + ) return .none } state.lastTriggeredLoadSpotID = currentLastSpotID + print( + "🌐 [ExploreList] request next page: page=\(state.currentPage), lastVisibleSpotID=\(currentLastSpotID ?? "nil"), visible=\(visibleSpots.count), bufferedVisible=\(bufferedVisibleSpots.count)" + ) return .send(.async(.searchPlaces(page: state.currentPage, append: true))) } } @@ -264,10 +279,28 @@ extension ExploreListFeature { if append { let existingSpotIDs = Set(state.bufferedSpots.map(\.id)) let uniqueNewSpots = pageEntity.spots.filter { !existingSpotIDs.contains($0.id) } + let duplicateSpotIDs = pageEntity.spots + .map(\.id) + .filter { existingSpotIDs.contains($0) } + + print( + "📥 [ExploreList] append response: requestedPage=\(requestedPage), responseCount=\(pageEntity.spots.count), uniqueNew=\(uniqueNewSpots.count), duplicates=\(duplicateSpotIDs.count), firstID=\(pageEntity.spots.first?.id ?? "nil"), lastID=\(pageEntity.spots.last?.id ?? "nil"), hasNextPage=\(pageEntity.hasNextPage)" + ) + + if uniqueNewSpots.isEmpty { + let duplicatePreview = Array(duplicateSpotIDs.prefix(10)).joined(separator: ", ") + print( + "⚠️ [ExploreList] append response contained no new spots. duplicateIDs(prefix10)=[\(duplicatePreview)]" + ) + } + state.bufferedSpots.append(contentsOf: uniqueNewSpots) revealNextChunk(state: &state) print("🔄 [무한스크롤] 버퍼 총: \(state.bufferedSpots.count)개, 화면 노출: \(state.spots.count)개") } else { + print( + "📥 [ExploreList] initial response: requestedPage=\(requestedPage), responseCount=\(pageEntity.spots.count), firstID=\(pageEntity.spots.first?.id ?? "nil"), lastID=\(pageEntity.spots.last?.id ?? "nil"), hasNextPage=\(pageEntity.hasNextPage)" + ) state.bufferedSpots = pageEntity.spots state.spots = [] revealNextChunk(state: &state) @@ -294,6 +327,34 @@ private extension ExploreListFeature { state.spots = Array(state.bufferedSpots.prefix(nextCount)) } + func revealNextVisibleChunk(state: inout State) { + let currentVisibleCount = filteredSpots(from: state.spots, state: state).count + var nextCount = state.spots.count + + while nextCount < state.bufferedSpots.count { + nextCount = min(nextCount + State.pageChunkSize, state.bufferedSpots.count) + let nextSpots = Array(state.bufferedSpots.prefix(nextCount)) + let nextVisibleCount = filteredSpots(from: nextSpots, state: state).count + + state.spots = nextSpots + + if nextVisibleCount > currentVisibleCount || nextCount == state.bufferedSpots.count { + return + } + } + } + + func filteredSpots(from spots: [ExploreMapSpot], state: State) -> [ExploreMapSpot] { + let query = state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) + + return spots.filter { spot in + let hasDetail = spot.hasDetail + let matchesCategory = state.selectedCategory == .all || spot.category == state.selectedCategory + let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) + return hasDetail && matchesCategory && matchesQuery + } + } + func makeSpots( from places: [PlaceEntity], userSession: UserSession diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListSkeletonView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListSkeletonView.swift index 0af6359..a936b59 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListSkeletonView.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListSkeletonView.swift @@ -5,123 +5,8 @@ import SwiftUI -import DesignSystem - struct ExploreListSkeletonView: View { var body: some View { - ZStack { - VStack(spacing: 0) { - VStack(spacing: 20) { - HStack(spacing: 16) { - RoundedRectangle(cornerRadius: 8) - .fill(.gray200) - .frame(width: 40, height: 40) - - RoundedRectangle(cornerRadius: 20) - .fill(.gray200) - .frame(height: 44) - } - - VStack(spacing: 12) { - HStack(spacing: 8) { - ForEach(0..<4, id: \.self) { index in - Capsule() - .fill(.gray200) - .frame(width: CGFloat([80, 60, 70, 90][index]), height: 36) - } - Spacer() - } - - HStack { - Capsule() - .fill(.gray200) - .frame(width: 100, height: 36) - Spacer() - } - } - } - .padding(.horizontal, 16) - .padding(.top, 8) - - HStack { - Spacer() - RoundedRectangle(cornerRadius: 6) - .fill(.gray200) - .frame(width: 100, height: 24) - } - .padding(.top, 24) - .padding(.horizontal, 20) - - ScrollView(showsIndicators: false) { - LazyVStack(spacing: 16) { - ForEach(0..<5, id: \.self) { _ in - ExploreListSkeletonItemView() - } - } - .padding(.horizontal, 16) - .padding(.top, 16) - .padding(.bottom, 100) - } - .background(.gray100) - } - - VStack { - Spacer() - Capsule() - .fill(.gray200) - .frame(width: 108, height: 44) - .padding(.bottom, 40) - } - } - } -} - -private struct ExploreListSkeletonItemView: View { - var body: some View { - RoundedRectangle(cornerRadius: 12) - .fill(.staticWhite) - .frame(height: 140) - .overlay { - HStack(spacing: 16) { - VStack(alignment: .leading, spacing: 12) { - RoundedRectangle(cornerRadius: 10) - .fill(.gray200) - .frame(width: 60, height: 20) - - RoundedRectangle(cornerRadius: 6) - .fill(.gray200) - .frame(height: 18) - .frame(maxWidth: .infinity, alignment: .leading) - - VStack(alignment: .leading, spacing: 6) { - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 140, height: 14) - - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 100, height: 14) - } - - Spacer() - - HStack(spacing: 12) { - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 50, height: 12) - - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 80, height: 12) - } - } - .frame(maxWidth: .infinity, alignment: .leading) - - RoundedRectangle(cornerRadius: 12) - .fill(.gray200) - .frame(width: 100, height: 100) - } - .padding(16) - } + ExploreSkeletonView() } } diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift index 34c4bc3..49635d1 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift @@ -24,7 +24,7 @@ public struct ExploreListView: View { public var body: some View { ZStack { VStack(spacing: 0) { - if store.isLoading && store.spots.isEmpty { + if shouldShowInitialSkeleton { ExploreListSkeletonView() } else { ExploreSearchHeaderView( @@ -85,6 +85,10 @@ public struct ExploreListView: View { } private extension ExploreListView { + var shouldShowInitialSkeleton: Bool { + store.spots.isEmpty && (!store.hasLoadedInitialPage || store.isLoading) + } + var isFilteringLocally: Bool { !store.searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty || store.selectedCategory != .all From 5d80f0b92a6b592629a8e5c80176df51a914180f Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 05:25:05 +0900 Subject: [PATCH 28/35] =?UTF-8?q?feat:=20=EC=95=B1=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=B0=8F=20?= =?UTF-8?q?fastlane=20=EB=B0=B0=ED=8F=AC=20=ED=99=98=EA=B2=BD=20=EA=B5=AC?= =?UTF-8?q?=EC=B6=95=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppIcon.appiconset/Contents.json | 2 +- .../AppIcon.appiconset/darklogo 1.png | Bin 233049 -> 363771 bytes .../AppIcon.appiconset/darklogo 2.png | Bin 0 -> 363771 bytes .../AppIcon.appiconset/darklogo.png | Bin 233049 -> 0 bytes fastlane/Fastfile | 1 + fastlane/README.md | 59 ++++++++++++++++++ fastlane/metadata/copyright.txt | 1 + .../metadata/ko/apple_tv_privacy_policy.txt | 1 + fastlane/metadata/ko/description.txt | 1 + fastlane/metadata/ko/keywords.txt | 1 + fastlane/metadata/ko/marketing_url.txt | 1 + fastlane/metadata/ko/name.txt | 1 + fastlane/metadata/ko/privacy_url.txt | 1 + fastlane/metadata/ko/promotional_text.txt | 1 + fastlane/metadata/ko/release_notes.txt | 1 + fastlane/metadata/ko/subtitle.txt | 1 + fastlane/metadata/ko/support_url.txt | 1 + fastlane/metadata/primary_category.txt | 1 + .../metadata/primary_first_sub_category.txt | 1 + .../metadata/primary_second_sub_category.txt | 1 + .../review_information/demo_password.txt | 1 + .../metadata/review_information/demo_user.txt | 1 + .../review_information/email_address.txt | 1 + .../review_information/first_name.txt | 1 + .../metadata/review_information/last_name.txt | 1 + .../metadata/review_information/notes.txt | 1 + .../review_information/phone_number.txt | 1 + fastlane/metadata/secondary_category.txt | 1 + .../metadata/secondary_first_sub_category.txt | 1 + .../secondary_second_sub_category.txt | 1 + 30 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/darklogo 2.png delete mode 100644 Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/darklogo.png create mode 100644 fastlane/README.md create mode 100644 fastlane/metadata/copyright.txt create mode 100644 fastlane/metadata/ko/apple_tv_privacy_policy.txt create mode 100644 fastlane/metadata/ko/description.txt create mode 100644 fastlane/metadata/ko/keywords.txt create mode 100644 fastlane/metadata/ko/marketing_url.txt create mode 100644 fastlane/metadata/ko/name.txt create mode 100644 fastlane/metadata/ko/privacy_url.txt create mode 100644 fastlane/metadata/ko/promotional_text.txt create mode 100644 fastlane/metadata/ko/release_notes.txt create mode 100644 fastlane/metadata/ko/subtitle.txt create mode 100644 fastlane/metadata/ko/support_url.txt create mode 100644 fastlane/metadata/primary_category.txt create mode 100644 fastlane/metadata/primary_first_sub_category.txt create mode 100644 fastlane/metadata/primary_second_sub_category.txt create mode 100644 fastlane/metadata/review_information/demo_password.txt create mode 100644 fastlane/metadata/review_information/demo_user.txt create mode 100644 fastlane/metadata/review_information/email_address.txt create mode 100644 fastlane/metadata/review_information/first_name.txt create mode 100644 fastlane/metadata/review_information/last_name.txt create mode 100644 fastlane/metadata/review_information/notes.txt create mode 100644 fastlane/metadata/review_information/phone_number.txt create mode 100644 fastlane/metadata/secondary_category.txt create mode 100644 fastlane/metadata/secondary_first_sub_category.txt create mode 100644 fastlane/metadata/secondary_second_sub_category.txt diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json index 2a7279b..a9fd448 100644 --- a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -13,7 +13,7 @@ "value" : "dark" } ], - "filename" : "darklogo.png", + "filename" : "darklogo 2.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/darklogo 1.png b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/darklogo 1.png index c0b0d7d3a952193e4be68262be71127b01d38776..bd78546072d17aab92c03cf174f2c45444f480c3 100644 GIT binary patch literal 363771 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 z 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%0Dl*qm7$wQc?F`vHz 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

oCsF{m~$*4z?}^@Jb7Z;w`ow^;TBmjXYYvDpw`I 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 pc6#y2%{Y9^D5lBJ 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 diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/darklogo 2.png b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/darklogo 2.png new file mode 100644 index 0000000000000000000000000000000000000000..bd78546072d17aab92c03cf174f2c45444f480c3 GIT binary patch literal 363771 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 z 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%0Dl*qm7$wQc?F`vHz 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

oCsF{m~$*4z?}^@Jb7Z;w`ow^;TBmjXYYvDpw`I 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 pc6#y2%{Y9^D5lBJ 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 diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 5d556fd..869e948 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -44,6 +44,7 @@ platform :ios do app_identifier: ["io.TimeSpot.co"] ) + ipa_path = nil # Change to project root directory Dir.chdir("..") do puts "📁 Current directory: #{Dir.pwd}" diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 0000000..25c3781 --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,59 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +### tdd_ci + +```sh +[bundle exec] fastlane tdd_ci +``` + +TDD 테스트 및 자동 배포 + +---- + + +## iOS + +### ios QA + +```sh +[bundle exec] fastlane ios QA +``` + +Upload to TestFlight (Debug) + +### ios release + +```sh +[bundle exec] fastlane ios release +``` + +Submit to App Store + +### ios submit_for_review + +```sh +[bundle exec] fastlane ios submit_for_review +``` + +Submit already uploaded version for review + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/fastlane/metadata/copyright.txt b/fastlane/metadata/copyright.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/copyright.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/ko/apple_tv_privacy_policy.txt b/fastlane/metadata/ko/apple_tv_privacy_policy.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/ko/apple_tv_privacy_policy.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/ko/description.txt b/fastlane/metadata/ko/description.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/ko/description.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/ko/keywords.txt b/fastlane/metadata/ko/keywords.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/ko/keywords.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/ko/marketing_url.txt b/fastlane/metadata/ko/marketing_url.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/ko/marketing_url.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/ko/name.txt b/fastlane/metadata/ko/name.txt new file mode 100644 index 0000000..ed6012c --- /dev/null +++ b/fastlane/metadata/ko/name.txt @@ -0,0 +1 @@ +TimeSpot diff --git a/fastlane/metadata/ko/privacy_url.txt b/fastlane/metadata/ko/privacy_url.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/ko/privacy_url.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/ko/promotional_text.txt b/fastlane/metadata/ko/promotional_text.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/ko/promotional_text.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/ko/release_notes.txt b/fastlane/metadata/ko/release_notes.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/ko/release_notes.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/ko/subtitle.txt b/fastlane/metadata/ko/subtitle.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/ko/subtitle.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/ko/support_url.txt b/fastlane/metadata/ko/support_url.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/ko/support_url.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/primary_category.txt b/fastlane/metadata/primary_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/primary_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/primary_first_sub_category.txt b/fastlane/metadata/primary_first_sub_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/primary_first_sub_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/primary_second_sub_category.txt b/fastlane/metadata/primary_second_sub_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/primary_second_sub_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/review_information/demo_password.txt b/fastlane/metadata/review_information/demo_password.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/review_information/demo_password.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/review_information/demo_user.txt b/fastlane/metadata/review_information/demo_user.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/review_information/demo_user.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/review_information/email_address.txt b/fastlane/metadata/review_information/email_address.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/review_information/email_address.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/review_information/first_name.txt b/fastlane/metadata/review_information/first_name.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/review_information/first_name.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/review_information/last_name.txt b/fastlane/metadata/review_information/last_name.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/review_information/last_name.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/review_information/notes.txt b/fastlane/metadata/review_information/notes.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/review_information/notes.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/review_information/phone_number.txt b/fastlane/metadata/review_information/phone_number.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/review_information/phone_number.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/secondary_category.txt b/fastlane/metadata/secondary_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/secondary_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/secondary_first_sub_category.txt b/fastlane/metadata/secondary_first_sub_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/secondary_first_sub_category.txt @@ -0,0 +1 @@ + diff --git a/fastlane/metadata/secondary_second_sub_category.txt b/fastlane/metadata/secondary_second_sub_category.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fastlane/metadata/secondary_second_sub_category.txt @@ -0,0 +1 @@ + From 92b775ffcdd9aa3674249b8d3b4be833d2992dc0 Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 22:20:53 +0900 Subject: [PATCH 29/35] =?UTF-8?q?feat:=20update=20explore=20=EB=9E=91=20us?= =?UTF-8?q?ecase=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0=20=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entity/Sources/Explore/ExploreMapSpot.swift | 7 ++++++- .../Entity/Sources/Place/PlaceSearchInput.swift | 5 ++++- .../UseCase/Sources/Place/PlaceUseCaseImpl.swift | 12 ++++++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift b/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift index 2430cf9..e50f88d 100644 --- a/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift +++ b/Projects/Domain/Entity/Sources/Explore/ExploreMapSpot.swift @@ -21,6 +21,7 @@ public struct ExploreMapSpot: Identifiable { public let closingText: String public let distanceText: String public let walkTimeText: String + public let address: String public init( id: String, @@ -34,7 +35,8 @@ public struct ExploreMapSpot: Identifiable { statusText: String, closingText: String, distanceText: String, - walkTimeText: String + walkTimeText: String, + address: String ) { self.id = id self.name = name @@ -48,6 +50,7 @@ public struct ExploreMapSpot: Identifiable { self.closingText = closingText self.distanceText = distanceText self.walkTimeText = walkTimeText + self.address = address } } @@ -66,6 +69,7 @@ extension ExploreMapSpot: Equatable { && lhs.closingText == rhs.closingText && lhs.distanceText == rhs.distanceText && lhs.walkTimeText == rhs.walkTimeText + && lhs.address == rhs.address } } @@ -84,6 +88,7 @@ extension ExploreMapSpot: Hashable { hasher.combine(closingText) hasher.combine(distanceText) hasher.combine(walkTimeText) + hasher.combine(address) } } diff --git a/Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift b/Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift index f8ac094..e177a45 100644 --- a/Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift +++ b/Projects/Domain/Entity/Sources/Place/PlaceSearchInput.swift @@ -20,6 +20,7 @@ public struct PlaceSearchInput: Equatable { public let mapLon: Double? public let page: Int public let size: Int + public let sort: [String] public init( userLat: Double, @@ -32,7 +33,8 @@ public struct PlaceSearchInput: Equatable { mapLat: Double? = nil, mapLon: Double? = nil, page: Int = 0, - size: Int = 10 + size: Int = 200, + sort: [String] = ["MAP_NEAREST"] ) { self.userLat = userLat self.userLon = userLon @@ -45,5 +47,6 @@ public struct PlaceSearchInput: Equatable { self.mapLon = mapLon self.page = page self.size = size + self.sort = sort } } diff --git a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift index 8891061..8c1b2da 100644 --- a/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift +++ b/Projects/Domain/UseCase/Sources/Place/PlaceUseCaseImpl.swift @@ -119,7 +119,8 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { mapLat: userSession.travelStationLat, mapLon: userSession.travelStationLng, page: 0, - size: 30 // 더 많은 데이터 로딩 + size: 200, + sort: ["MAP_NEAREST"] ) let pageEntity = try await repository.searchPlaces(searchInput) @@ -168,7 +169,8 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { mapLat: mapLat, mapLon: mapLon, page: page, - size: 10 + size: 200, + sort: ["MAP_NEAREST"] ) return try await repository.searchPlaces(input) @@ -257,7 +259,8 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { statusText: "", closingText: "", distanceText: "", - walkTimeText: "" + walkTimeText: "", + address: entity.address ) } @@ -304,7 +307,8 @@ public struct PlaceUseCaseImpl: PlaceUseCaseInterface { statusText: entity.isOpen ? "영업 중" : "영업 종료", closingText: closingText, distanceText: distanceText, - walkTimeText: walkTimeText + walkTimeText: walkTimeText, + address: entity.address ) } From 984683a05b2b05275b9d3784d82264c75ef69446 Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 22:21:56 +0900 Subject: [PATCH 30/35] =?UTF-8?q?refactor:=20flatten=20place=20search=20AP?= =?UTF-8?q?I=20=EA=B3=BC=EB=A0=A8=20=20=EC=88=98=EC=A0=95=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Place/PlaceRepositoryImpl.swift | 4 +++- .../Data/Service/Sources/Place/PlaceRequest.swift | 14 ++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift b/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift index 379de6c..26e82d8 100644 --- a/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift +++ b/Projects/Data/Repository/Sources/Place/PlaceRepositoryImpl.swift @@ -54,7 +54,9 @@ public final class PlaceRepositoryImpl: PlaceInterface, @unchecked Sendable { sortBy: input.sortBy, mapLat: input.mapLat, mapLon: input.mapLon, - pageable: .init(page: input.page, size: input.size) + page: input.page, + size: input.size, + sort: ["MAP_NEAREST"] ) let dto: PlaceSearchDTOModel = try await provider.request(.searchPlaces(body: body)) return dto.data.toDomain() diff --git a/Projects/Data/Service/Sources/Place/PlaceRequest.swift b/Projects/Data/Service/Sources/Place/PlaceRequest.swift index d727d74..e6c5050 100644 --- a/Projects/Data/Service/Sources/Place/PlaceRequest.swift +++ b/Projects/Data/Service/Sources/Place/PlaceRequest.swift @@ -43,7 +43,9 @@ public struct PlaceSearchRequest: Encodable { public let sortBy: String public let mapLat: Double? public let mapLon: Double? - public let pageable: PageableRequest + public let page: Int + public let size: Int + public let sort: [String] public init( userLat: Double, @@ -55,7 +57,9 @@ public struct PlaceSearchRequest: Encodable { sortBy: String = "STATION_NEAREST", mapLat: Double? = nil, mapLon: Double? = nil, - pageable: PageableRequest = .init() + page: Int = 0, + size: Int = 200, + sort: [String] = ["MAP_NEAREST"] ) { self.userLat = userLat self.userLon = userLon @@ -66,7 +70,9 @@ public struct PlaceSearchRequest: Encodable { self.sortBy = sortBy self.mapLat = mapLat self.mapLon = mapLon - self.pageable = pageable + self.page = page + self.size = size + self.sort = sort } } @@ -76,7 +82,7 @@ public struct PageableRequest: Encodable, Equatable { public init( page: Int = 0, - size: Int = 10 + size: Int = 200 ) { self.page = page self.size = size From 7fceea01e484862bc0a76e4f3993fadbd7089619 Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 22:23:24 +0900 Subject: [PATCH 31/35] =?UTF-8?q?refactor:=20explore=20view=20=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EB=B0=8F=20=20=EC=8A=A4=EC=BC=88=EB=A0=88=ED=86=A4?= =?UTF-8?q?=20=EC=9E=91=EC=97=85=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Coordinator/Reducer/HomeCoordinator.swift | 6 +- .../ExploreSelectedSpotCardView.swift | 57 ++- .../Components/ExploreSpotListCardView.swift | 29 +- .../Explore/Helpers/ExploreHelpers.swift | 22 +- ...loreReducer.swift => ExploreFeature.swift} | 20 +- .../Reducer/ExploreState+Extensions.swift | 6 +- .../Sources/Explore/View/ExploreView.swift | 5 +- .../ExploreDetailSkeletonView.swift | 170 +++++++ .../Reducer/ExploreDetailFeature.swift | 174 ++++++++ .../View/ExploreDetailView.swift | 414 ++++-------------- .../Reducer/ExploreListFeature.swift | 92 ++-- .../ExploreList/View/ExploreListView.swift | 9 +- 12 files changed, 579 insertions(+), 425 deletions(-) rename Projects/Presentation/Home/Sources/Explore/Reducer/{ExploreReducer.swift => ExploreFeature.swift} (99%) create mode 100644 Projects/Presentation/Home/Sources/ExploreDetail/Components/ExploreDetailSkeletonView.swift diff --git a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift index 594ea2d..8dd9845 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift @@ -51,7 +51,7 @@ public struct HomeCoordinator { case presentProfile case presentProfileWithAnimation case presentExplore - case presentExploreList(ExploreReducer.State) + case presentExploreList(ExploreFeature.State) case presentExploreDetail } @@ -215,7 +215,7 @@ extension HomeCoordinator { return .none case .presentExplore: - var exploreState = ExploreReducer.State() + var exploreState = ExploreFeature.State() if let lat = exploreState.userSession.travelStationLat, let lng = exploreState.userSession.travelStationLng { exploreState.selectedDestination = Destination( @@ -263,7 +263,7 @@ extension HomeCoordinator { @Reducer public enum HomeScreen { case home(HomeFeature) - case explore(ExploreReducer) + case explore(ExploreFeature) case exploreList(ExploreListFeature) case exploreDetail(ExploreDetailFeature) case profile(ProfileCoordinator) diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift index 4da0913..cf778b2 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSelectedSpotCardView.swift @@ -9,10 +9,13 @@ import DesignSystem import Entity import Kingfisher import Utill +import ComposableArchitecture +import LogMacro struct ExploreSelectedSpotCardView: View { let currentSpot: ExploreMapSpot let adjacentSpot: ExploreMapSpot? + let store: StoreOf let currentOffset: CGFloat let adjacentOffset: CGFloat? let cardOpacity: Double @@ -38,6 +41,10 @@ struct ExploreSelectedSpotCardView: View { .onChanged(onDragChanged) .onEnded(onDragEnded) ) + .onAppear { + } + .onChange(of: currentSpot.id) { _ in + } } private func cardContent(for spot: ExploreMapSpot) -> some View { @@ -145,19 +152,25 @@ struct ExploreSelectedSpotCardView: View { @ViewBuilder private func spotImage(for spot: ExploreMapSpot) -> some View { - if let url = imageURL(for: spot) { - KFImage(url) - .placeholder { - imagePlaceholder() - } - .cancelOnDisappear(true) - .fade(duration: 0.2) - .resizable() - .scaledToFill() - .frame(width: 92, height: 112) - .clipShape(RoundedRectangle(cornerRadius: 16)) - } else { - imagePlaceholder() + Group { + if let url = imageURL(for: spot) { + KFImage(url) + .placeholder { + imagePlaceholder() + } + .cacheMemoryOnly(false) + .diskCacheExpiration(.days(7)) + .memoryCacheExpiration(.seconds(300)) + .loadDiskFileSynchronously() + .cancelOnDisappear(true) + .fade(duration: 0.2) + .resizable() + .scaledToFill() + .frame(width: 92, height: 112) + .clipShape(RoundedRectangle(cornerRadius: 16)) + } else { + imagePlaceholder() + } } } @@ -190,17 +203,18 @@ struct ExploreSelectedSpotCardView: View { } private func imageURL(for spot: ExploreMapSpot) -> URL? { - guard let imageURL = spot.imageURL?.trimmingCharacters(in: .whitespacesAndNewlines), - !imageURL.isEmpty else { - return nil + // 1. 기존 spot.imageURL이 있으면 우선 사용 + if let imageURL = spot.imageURL?.trimmingCharacters(in: .whitespacesAndNewlines), + !imageURL.isEmpty { + if let url = URL(string: imageURL) { + return url + } + let encoded = imageURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) + return encoded.flatMap(URL.init(string:)) } - if let url = URL(string: imageURL) { - return url - } - let encoded = imageURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) - return encoded.flatMap(URL.init(string:)) + return nil } private func imagePlaceholder() -> some View { @@ -214,4 +228,5 @@ struct ExploreSelectedSpotCardView: View { } .frame(width: 92, height: 112) } + } diff --git a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift index c1d1cd6..2d365d0 100644 --- a/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift +++ b/Projects/Presentation/Home/Sources/Explore/Components/ExploreSpotListCardView.swift @@ -9,9 +9,12 @@ import DesignSystem import Entity import Kingfisher import Utill +import ComposableArchitecture +import LogMacro struct ExploreSpotListCardView: View { let spot: ExploreMapSpot + let store: StoreOf var body: some View { HStack(alignment: .top, spacing: 14) { @@ -86,6 +89,10 @@ struct ExploreSpotListCardView: View { RoundedRectangle(cornerRadius: 22) .stroke(.enableColor, lineWidth: 1) } + .onAppear { + } + .onChange(of: spot.id) { _ in + } } @ViewBuilder @@ -145,6 +152,10 @@ struct ExploreSpotListCardView: View { .placeholder { imagePlaceholder() } + .cacheMemoryOnly(false) + .diskCacheExpiration(.days(7)) + .memoryCacheExpiration(.seconds(300)) + .loadDiskFileSynchronously() .cancelOnDisappear(true) .fade(duration: 0.2) .resizable() @@ -157,17 +168,18 @@ struct ExploreSpotListCardView: View { } private func imageURL(for spot: ExploreMapSpot) -> URL? { - guard let imageURL = spot.imageURL?.trimmingCharacters(in: .whitespacesAndNewlines), - !imageURL.isEmpty else { - return nil + // 1. 기존 spot.imageURL이 있으면 우선 사용 + if let imageURL = spot.imageURL?.trimmingCharacters(in: .whitespacesAndNewlines), + !imageURL.isEmpty { + if let url = URL(string: imageURL) { + return url + } + let encoded = imageURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) + return encoded.flatMap(URL.init(string:)) } - if let url = URL(string: imageURL) { - return url - } - let encoded = imageURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) - return encoded.flatMap(URL.init(string:)) + return nil } private func imagePlaceholder() -> some View { @@ -181,4 +193,5 @@ struct ExploreSpotListCardView: View { } .frame(width: 92, height: 112) } + } diff --git a/Projects/Presentation/Home/Sources/Explore/Helpers/ExploreHelpers.swift b/Projects/Presentation/Home/Sources/Explore/Helpers/ExploreHelpers.swift index d46a519..737ef43 100644 --- a/Projects/Presentation/Home/Sources/Explore/Helpers/ExploreHelpers.swift +++ b/Projects/Presentation/Home/Sources/Explore/Helpers/ExploreHelpers.swift @@ -15,14 +15,14 @@ public struct ExploreHelpers { // MARK: - State Management - public static func resetPagination(state: inout ExploreReducer.State) { + public static func resetPagination(state: inout ExploreFeature.State) { state.currentPage = 0 state.hasNextPage = true state.pendingSelectFirstSpotFromNextPage = false } public static func resetSearchContext( - state: inout ExploreReducer.State, + state: inout ExploreFeature.State, clearMarker: Bool = true, preserveSearchText: Bool = false, preserveSelectedCategory: Bool = false @@ -42,7 +42,7 @@ public struct ExploreHelpers { } } - public static func clearSelectedSpot(state: inout ExploreReducer.State) { + public static func clearSelectedSpot(state: inout ExploreFeature.State) { state.isSpotCardVisible = false state.cardDragOffset = 0 state.cardBaseOffset = 0 @@ -56,11 +56,11 @@ public struct ExploreHelpers { // MARK: - Data Calculations - public static func currentKeyword(state: ExploreReducer.State) -> String { + public static func currentKeyword(state: ExploreFeature.State) -> String { return state.searchText.trimmingCharacters(in: .whitespacesAndNewlines) } - public static func currentCategory(state: ExploreReducer.State) -> ExploreCategory? { + public static func currentCategory(state: ExploreFeature.State) -> ExploreCategory? { return state.selectedCategory == .all ? nil : state.selectedCategory } @@ -72,7 +72,7 @@ public struct ExploreHelpers { return abs(lhs - rhs) < tolerance } - public static func isResolvingSelectedMarkerDetail(state: ExploreReducer.State) -> Bool { + public static func isResolvingSelectedMarkerDetail(state: ExploreFeature.State) -> Bool { let selectedSpotID = state.userSession.selectedExploreSpotID guard !selectedSpotID.isEmpty else { return false } @@ -86,7 +86,7 @@ public struct ExploreHelpers { // MARK: - Filtered Data - public static func filteredSpots(state: ExploreReducer.State) -> [ExploreMapSpot] { + public static func filteredSpots(state: ExploreFeature.State) -> [ExploreMapSpot] { let query = currentKeyword(state: state) let filtered = state.spots.filter { spot in let hasDetail = spot.hasDetail @@ -117,7 +117,7 @@ public struct ExploreHelpers { } } - public static func syncSelectedSpot(state: inout ExploreReducer.State) { + public static func syncSelectedSpot(state: inout ExploreFeature.State) { guard let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty else { return } @@ -128,7 +128,7 @@ public struct ExploreHelpers { } } - public static func syncSelectionWithFilters(state: inout ExploreReducer.State) { + public static func syncSelectionWithFilters(state: inout ExploreFeature.State) { guard let selectedSpotID = state.userSession.selectedExploreSpotID.nilIfEmpty else { return } @@ -147,7 +147,7 @@ public struct ExploreHelpers { } } - public static func filteredCardSpots(state: ExploreReducer.State) -> [ExploreMapSpot] { + public static func filteredCardSpots(state: ExploreFeature.State) -> [ExploreMapSpot] { let query = currentKeyword(state: state) let filtered = state.spots.filter { spot in let hasDetail = spot.hasDetail @@ -178,7 +178,7 @@ public struct ExploreHelpers { } } - public static func currentCardSpots(state: ExploreReducer.State) -> [ExploreMapSpot] { + public static func currentCardSpots(state: ExploreFeature.State) -> [ExploreMapSpot] { return filteredCardSpots(state: state) } } diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreFeature.swift similarity index 99% rename from Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift rename to Projects/Presentation/Home/Sources/Explore/Reducer/ExploreFeature.swift index b44a09a..9c3dd34 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreReducer.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreFeature.swift @@ -1,5 +1,5 @@ // -// ExploreReducer.swift +// ExploreFeature.swift // Home // // Created by wonji suh on 2026-03-12 @@ -14,9 +14,10 @@ import UseCase import Entity import LogMacro import Utill +import IdentifiedCollections @Reducer -public struct ExploreReducer: Sendable { +public struct ExploreFeature: Sendable { public init() {} enum CancelID: Hashable { @@ -33,7 +34,6 @@ public struct ExploreReducer: Sendable { public var isLocationPermissionDenied: Bool = false public var locationError: String? public var searchText: String = "" - public var spots: [ExploreMapSpot] = [] public var isLoadingPlaces: Bool = false public var hasRequestedPlaces: Bool = false public var hasFetchedPlacesWithCurrentLocation: Bool = false @@ -46,6 +46,7 @@ public struct ExploreReducer: Sendable { public var mapCenterLon: Double? @Presents public var alert: AlertState? @Shared(.inMemory("UserSession")) var userSession: UserSession = .empty + public var spots: [ExploreMapSpot] = [] // 길찾기 관련 상태 public var selectedDestination: Destination? @@ -62,6 +63,7 @@ public struct ExploreReducer: Sendable { public var cardBaseOffset: CGFloat = 0 public var isCardTransitioning: Bool = false + public init() {} } @@ -132,6 +134,7 @@ public struct ExploreReducer: Sendable { case resetCameraFlag case completeCardSwipe(next: Bool) case finishCardTransition + // 네이버 이미지 검색 완료 } public enum AsyncAction: Equatable { @@ -154,8 +157,8 @@ public struct ExploreReducer: Sendable { @Dependency(\.getRouteUseCase) var getRouteUseCase @Dependency(\.placeUseCase) var placeUseCase - let locationUseCase = LocationUseCaseImpl() - let cameraUseCase = CameraUseCaseImpl() + @Dependency(\.locationUseCase) var locationUseCase + @Dependency(\.cameraUseCase) var cameraUseCase public var body: some ReducerOf { Reduce { state, action in @@ -180,7 +183,7 @@ public struct ExploreReducer: Sendable { } } -extension ExploreReducer { +extension ExploreFeature { private func handleViewAction( state: inout State, @@ -405,6 +408,7 @@ extension ExploreReducer { state.returnToCurrentLocationTrigger = cameraResult.newTrigger print("🟢 [CurrentLocationButton] CameraUseCase 처리 완료") return .none + } } @@ -703,6 +707,7 @@ extension ExploreReducer { state.cardDragOffset = 0 state.isCardTransitioning = false return .none + } } @@ -891,6 +896,7 @@ extension ExploreReducer { await send(.inner(.routeSearchResponse(routeResult))) } .cancellable(id: CancelID.searchRoute, cancelInFlight: true) + } } @@ -948,7 +954,7 @@ extension ExploreReducer { } } -private extension ExploreReducer.State { +private extension ExploreFeature.State { var remainingSelectedSpotMinutes: Int { guard let selectedSpot else { return 0 diff --git a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift index 148427b..2ef1b92 100644 --- a/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift +++ b/Projects/Presentation/Home/Sources/Explore/Reducer/ExploreState+Extensions.swift @@ -10,7 +10,7 @@ import CoreLocation import ComposableArchitecture import Entity -extension ExploreReducer.State { +extension ExploreFeature.State { var trimmedSearchText: String { searchText.trimmingCharacters(in: .whitespacesAndNewlines) } @@ -110,7 +110,7 @@ extension ExploreReducer.State { // MARK: - ExploreReducer.State + Hashable -extension ExploreReducer.State: Hashable { +extension ExploreFeature.State: Hashable { public func hash(into hasher: inout Hasher) { hasher.combine(locationPermissionStatus) hasher.combine(currentLocation?.coordinate.latitude) @@ -129,7 +129,7 @@ extension ExploreReducer.State: Hashable { // MARK: - ExploreReducer.AsyncAction + Equatable -extension ExploreReducer.AsyncAction { +extension ExploreFeature.AsyncAction { public static func == (lhs: Self, rhs: Self) -> Bool { switch (lhs, rhs) { case (.requestLocationPermission, .requestLocationPermission), diff --git a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift index da9cadf..f1adf8c 100644 --- a/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift +++ b/Projects/Presentation/Home/Sources/Explore/View/ExploreView.swift @@ -15,7 +15,7 @@ import DesignSystem import Entity public struct ExploreView: View { - @Bindable var store: StoreOf + @Bindable var store: StoreOf @Environment(\.dismiss) private var dismiss private var cardTravelDistance: CGFloat { @@ -26,7 +26,7 @@ public struct ExploreView: View { (UIScreen.main.bounds.width - 32) / 2 } - public init(store: StoreOf) { + public init(store: StoreOf) { self.store = store } @@ -113,6 +113,7 @@ private extension ExploreView { ExploreSelectedSpotCardView( currentSpot: selectedSpot, adjacentSpot: store.state.adjacentSpot(cardTravelDistance: cardTravelDistance), + store: store, currentOffset: store.cardBaseOffset + store.cardDragOffset, adjacentOffset: store.state.adjacentCardOffset(cardTravelDistance: cardTravelDistance), cardOpacity: store.state.cardOpacity(cardTravelDistance: cardTravelDistance), diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/Components/ExploreDetailSkeletonView.swift b/Projects/Presentation/Home/Sources/ExploreDetail/Components/ExploreDetailSkeletonView.swift new file mode 100644 index 0000000..52ce715 --- /dev/null +++ b/Projects/Presentation/Home/Sources/ExploreDetail/Components/ExploreDetailSkeletonView.swift @@ -0,0 +1,170 @@ +// +// ExploreDetailSkeletonView.swift +// Home +// +// Created by Wonji Suh on 3/29/26. +// + +import SwiftUI +import DesignSystem + +public struct ExploreDetailSkeletonView: View { + public init() {} + + public var body: some View { + VStack(alignment: .leading, spacing: 0) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 84, height: 14) + .skeletonShimmer() + .padding(.top, 12) + + HStack(spacing: 12) { + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + .frame(height: 180) + .frame(maxWidth: .infinity) + .skeletonShimmer() + + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + .frame(width: 84, height: 180) + .skeletonShimmer() + } + .padding(.top, 24) + + HStack(spacing: 0) { + skeletonMetricColumn() + divider + skeletonMetricColumn() + divider + skeletonMetricColumn() + } + .padding(.horizontal, 8) + .padding(.vertical, 16) + .background(.staticWhite) + .clipShape(RoundedRectangle(cornerRadius: 16)) + .overlay { + RoundedRectangle(cornerRadius: 16) + .stroke(.gray300, lineWidth: 1) + } + .padding(.top, 24) + + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + .frame(height: 84) + .skeletonShimmer() + .padding(.top, 24) + + VStack(alignment: .leading, spacing: 16) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 64, height: 14) + .skeletonShimmer() + + skeletonInfoRow(lineWidth: 180) + skeletonInfoRow(lineWidth: 120) + skeletonInfoRow(lineWidth: 200) + } + .padding(.top, 24) + + RoundedRectangle(cornerRadius: 20) + .fill(.gray200) + .frame(height: 180) + .skeletonShimmer() + .padding(.top, 24) + + Capsule() + .fill(.gray200) + .frame(height: 56) + .skeletonShimmer() + .padding(.top, 24) + } + } + + @ViewBuilder + private func skeletonMetricColumn() -> some View { + VStack(spacing: 8) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 46, height: 16) + .skeletonShimmer() + + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 34, height: 12) + .skeletonShimmer() + } + .frame(maxWidth: .infinity) + } + + @ViewBuilder + private func skeletonInfoRow(lineWidth: CGFloat) -> some View { + HStack(alignment: .top, spacing: 10) { + Circle() + .fill(.gray200) + .frame(width: 20, height: 20) + .skeletonShimmer() + + VStack(alignment: .leading, spacing: 6) { + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: 56, height: 12) + .skeletonShimmer() + + RoundedRectangle(cornerRadius: 4) + .fill(.gray200) + .frame(width: lineWidth, height: 14) + .skeletonShimmer() + } + + Spacer(minLength: 0) + } + } + + private var divider: some View { + Rectangle() + .fill(.gray300) + .frame(width: 1, height: 34) + } +} + +private extension View { + func skeletonShimmer() -> some View { + modifier(ExploreDetailSkeletonShimmerModifier()) + } +} + +private struct ExploreDetailSkeletonShimmerModifier: ViewModifier { + @State private var isAnimating = false + + func body(content: Content) -> some View { + content + .overlay { + GeometryReader { geometry in + LinearGradient( + colors: [ + .white.opacity(0), + .white.opacity(0.28), + .white.opacity(0) + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + .frame(width: geometry.size.width * 0.55) + .offset(x: isAnimating ? geometry.size.width * 1.25 : -geometry.size.width * 0.8) + } + .clipped() + } + .mask(content) + .onAppear { + guard !isAnimating else { return } + withAnimation( + .easeInOut(duration: 1.0) + .repeatForever(autoreverses: false) + ) { + isAnimating = true + } + } + } +} diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift b/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift index fc2ad84..dab6be0 100644 --- a/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreDetail/Reducer/ExploreDetailFeature.swift @@ -10,6 +10,8 @@ import ComposableArchitecture import DesignSystem import Entity import UseCase +import Utill +import MapKit @Reducer public struct ExploreDetailFeature { @@ -219,3 +221,175 @@ extension ExploreDetailFeature.State: Hashable { hasher.combine(userSession) } } + +// MARK: - State Computed Properties +extension ExploreDetailFeature.State { + + var imageCards: [URL?] { + let urls = placeDetail?.imageURL.compactMap { urlString -> URL? in + // Google Places API URL에 대한 특별한 처리 + if urlString.contains("places.googleapis.com") { + return URL(string: urlString.trimmingCharacters(in: .whitespacesAndNewlines)) + } + return urlString.normalizedURL + } ?? [] + + if !urls.isEmpty { + return urls + } + return [nil, nil] + } + + var placeNameText: String { + placeDetail?.name ?? "" + } + + var categoryText: String { + placeDetail?.category ?? "" + } + + var distanceText: String { + if let placeDetail = placeDetail { + return "\(placeDetail.distanceToStation)m" + } + return "" + } + + var returnDeadlineText: String { + if isVisitUnavailable { + return "방문 불가능해요" + } + + if let leaveTime = placeDetail?.leaveTime, + let formatted = formattedDeadlineTime(from: leaveTime) { + return formatted + } + + return Date().formattedReturnDeadlineText(addingMinutes: stayableMinutesValue) + "분" + } + + var stayableMinutesValue: Int { + remainingStayableMinutes + } + + var remainingStayableMinutes: Int { + let originalMinutes = placeDetail?.stayableMinutes ?? 0 + let elapsedMinutes = elapsedMinutesSincePlacesFetched + return max(originalMinutes - elapsedMinutes, 0) + } + + var elapsedMinutesSincePlacesFetched: Int { + guard let fetchedAt = userSession.explorePlacesFetchedAt else { + return 0 + } + + return max(Int(Date().timeIntervalSince(fetchedAt) / 60), 0) + } + + var isVisitUnavailable: Bool { + remainingStayableMinutes <= 0 + } + + var returnDeadlineSuffixText: String { + isVisitUnavailable ? "" : " 에는 역으로 출발해야 합니다." + } + + var openingHoursText: String { + let weekdayText = summarizedOpeningHours(from: placeDetail?.weekday ?? []) + let weekendText = summarizedOpeningHours(from: placeDetail?.weekend ?? []) + + switch (weekdayText.isEmpty, weekendText.isEmpty) { + case (false, false): + return "평일 \(weekdayText), 주말 \(weekendText)" + case (false, true): + return "평일 \(weekdayText)" + case (true, false): + return "주말 \(weekendText)" + case (true, true): + return "영업 시간 정보 준비 중" + } + } + + var phoneNumberText: String { + placeDetail?.phoneNumber.nilIfEmpty ?? "전화번호 정보 준비 중" + } + + var addressText: String { + placeDetail?.address.nilIfEmpty ?? "주소 정보 준비 중" + } + + var stayableMinutesText: String { + "약 \(remainingStayableMinutes)분" + } + + var walkMinutesText: String { + if let placeDetail = placeDetail { + return "\(placeDetail.timeToStation)분" + } + return "0분" + } + + var mapCoordinate: CLLocationCoordinate2D { + if let placeDetail = placeDetail { + return CLLocationCoordinate2D( + latitude: placeDetail.stationLat, + longitude: placeDetail.stationLon + ) + } + + return CLLocationCoordinate2D( + latitude: userSession.travelStationLat ?? 37.5666805, + longitude: userSession.travelStationLng ?? 126.9784147 + ) + } + + var mapRegion: MKCoordinateRegion { + MKCoordinateRegion( + center: mapCoordinate, + span: MKCoordinateSpan(latitudeDelta: 0.0035, longitudeDelta: 0.0035) + ) + } + + // MARK: - Private Helper Methods + + private func summarizedOpeningHours(from values: [String]) -> String { + let normalized = values + .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } + .filter { !$0.isEmpty } + + guard !normalized.isEmpty else { + return "" + } + + let extractedTimes = normalized.map { value in + guard let separatorIndex = value.firstIndex(of: ":") else { + return value + } + return value[value.index(after: separatorIndex)...] + .trimmingCharacters(in: .whitespacesAndNewlines) + } + + let uniqueTimes = Array(Set(extractedTimes)) + + if uniqueTimes.count == 1, let first = extractedTimes.first { + return first + } + + return normalized.joined(separator: ", ") + } + + private func formattedDeadlineTime(from leaveTime: String) -> String? { + let formatter = DateFormatter() + formatter.locale = Locale(identifier: "ko_KR") + formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" + + guard let date = formatter.date(from: leaveTime) else { + return nil + } + + let outputFormatter = DateFormatter() + outputFormatter.locale = Locale(identifier: "ko_KR") + outputFormatter.dateFormat = "a h:mm분" + return outputFormatter.string(from: date) + } +} diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift index 89acc82..b53dc3a 100644 --- a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift +++ b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift @@ -37,16 +37,13 @@ public struct ExploreDetailView: View { dismiss() }, title: "") .padding(.horizontal, 16) - .offset(y: -30) - } else { - Spacer() - .frame(height: 24) + .offset(y: -34) } ScrollView(.vertical) { Group { if store.isLoading && store.placeDetail == nil { - skeletonContent() + ExploreDetailSkeletonView() } else { VStack(alignment: .leading) { exploreSpotNameTitle() @@ -57,10 +54,8 @@ public struct ExploreDetailView: View { stayInfoSection() .padding(.top, 24) - if !isVisitUnavailable { - returnDeadlineSection() - .padding(.top, 24) - } + returnDeadlineSection() + .padding(.top, 24) placeInfoSection() .padding(.top, 29) @@ -68,7 +63,7 @@ public struct ExploreDetailView: View { locationMapSection() .padding(.top, 24) - if !isVisitUnavailable { + if !store.isVisitUnavailable { routeButtonSection() .padding(.top, 24) } @@ -86,6 +81,9 @@ public struct ExploreDetailView: View { .onAppear { store.send(.view(.onAppear)) } + .refreshable { + // 캐시된 이미지 다시 확인 + } .onChange(of: store.shouldDismiss) { _, shouldDismiss in guard shouldDismiss else { return } dismiss() @@ -104,12 +102,12 @@ private extension ExploreDetailView { .frame(height: 4) HStack(spacing: 8) { - Text(placeNameText.formattedPlaceNameForDisplay) + Text(store.placeNameText.formattedPlaceNameForDisplay) .pretendardCustomFont(textStyle: .heading1) .foregroundStyle(.staticBlack) .lineLimit(2) - Text(categoryText) + Text(store.categoryText) .pretendardCustomFont(textStyle: .body2Regular) .foregroundStyle(.gray700) @@ -122,8 +120,8 @@ private extension ExploreDetailView { func imageSection() -> some View { ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 12) { - ForEach(imageCards.indices, id: \.self) { index in - spotImageCard(for: imageCards[index], index: index) + ForEach(store.imageCards.indices, id: \.self) { index in + spotImageCard(for: store.imageCards[index], index: index) } } } @@ -133,7 +131,7 @@ private extension ExploreDetailView { func stayInfoSection() -> some View { HStack(spacing: 0) { metricColumn( - value: stayableMinutesText, + value: store.stayableMinutesText, title: "체류시간", valueColor: .orange800 ) @@ -141,7 +139,7 @@ private extension ExploreDetailView { divider metricColumn( - value: walkMinutesText, + value: store.walkMinutesText, title: "도보", valueColor: .gray830 ) @@ -149,7 +147,7 @@ private extension ExploreDetailView { divider metricColumn( - value: distanceText, + value: store.distanceText, title: "거리", valueColor: .gray830 ) @@ -178,16 +176,16 @@ private extension ExploreDetailView { HStack { Text("최종 복귀 시간") .pretendardCustomFont(textStyle: .body2Bold) - .foregroundStyle(.gray700) + .foregroundStyle(.staticBlack) Spacer() } ( - Text(returnDeadlineText) - .foregroundStyle(isVisitUnavailable ? .gray700 : .orange800) + Text(store.returnDeadlineText) + .foregroundStyle(store.isVisitUnavailable ? .gray700 : .orange800) + - Text(returnDeadlineSuffixText).foregroundStyle(.gray800) + Text(store.returnDeadlineSuffixText).foregroundStyle(.gray800) ) .pretendardCustomFont(textStyle: .body2Medium) .lineSpacing(2) @@ -221,19 +219,19 @@ private extension ExploreDetailView { infoRow( icon: "clock.fill", title: "영업 시간", - content: openingHoursText + content: store.openingHoursText ) infoRow( icon: "phone.fill", title: "전화번호", - content: phoneNumberText + content: store.phoneNumberText ) infoRow( icon: "location.fill", title: "주소", - content: addressText + content: store.addressText ) } } @@ -242,8 +240,8 @@ private extension ExploreDetailView { @ViewBuilder func locationMapSection() -> some View { GeometryReader { proxy in - Map(initialPosition: .region(mapRegion), interactionModes: .all) { - Annotation(placeNameText, coordinate: mapCoordinate) { + Map(initialPosition: .region(store.mapRegion), interactionModes: .all) { + Annotation(store.placeNameText, coordinate: store.mapCoordinate) { Image(asset: .spotPin) .resizable() .scaledToFit() @@ -261,9 +259,9 @@ private extension ExploreDetailView { func routeButtonSection() -> some View { CustomButton( action: {}, - title: isVisitUnavailable ? "방문 불가능" : "경로 확인하기", + title: store.isVisitUnavailable ? "방문 불가능" : "경로 확인하기", config: CustomButtonConfig.create(), - isEnable: !isVisitUnavailable + isEnable: !store.isVisitUnavailable ) } @@ -319,174 +317,24 @@ private extension ExploreDetailView { .frame(width: 1, height: 34) } - var stayableMinutesText: String { - "약 \(remainingStayableMinutes)분" - } - - var walkMinutesText: String { - if let placeDetail = store.placeDetail { - return "\(placeDetail.timeToStation)분" - } - return "0분" - } - - var imageCards: [URL?] { - let urls = store.placeDetail?.imageURL.compactMap(\.normalizedURL) ?? [] - if !urls.isEmpty { - return urls - } - return [nil, nil] - } - - var placeNameText: String { - store.placeDetail?.name ?? "" - } - - var categoryText: String { - store.placeDetail?.category ?? "" - } - - var distanceText: String { - if let placeDetail = store.placeDetail { - return "\(placeDetail.distanceToStation)m" - } - return "" - } - - var returnDeadlineText: String { - if isVisitUnavailable { - return "방문 불가능해요" - } - - if let leaveTime = store.placeDetail?.leaveTime, - let formatted = formattedDeadlineTime(from: leaveTime) { - return formatted - } - - return Date().formattedReturnDeadlineText(addingMinutes: stayableMinutesValue) + "분" - } - - var stayableMinutesValue: Int { - remainingStayableMinutes - } - - var remainingStayableMinutes: Int { - let originalMinutes = store.placeDetail?.stayableMinutes ?? 0 - let elapsedMinutes = elapsedMinutesSincePlacesFetched - return max(originalMinutes - elapsedMinutes, 0) - } - - var elapsedMinutesSincePlacesFetched: Int { - guard let fetchedAt = store.userSession.explorePlacesFetchedAt else { - return 0 - } - - return max(Int(Date().timeIntervalSince(fetchedAt) / 60), 0) - } - - var isVisitUnavailable: Bool { - remainingStayableMinutes <= 0 - } - - var returnDeadlineSuffixText: String { - isVisitUnavailable ? "" : " 출발해야 해" - } - - var openingHoursText: String { - let weekdayText = summarizedOpeningHours(from: store.placeDetail?.weekday ?? []) - let weekendText = summarizedOpeningHours(from: store.placeDetail?.weekend ?? []) - - switch (weekdayText.isEmpty, weekendText.isEmpty) { - case (false, false): - return "평일 \(weekdayText), 주말 \(weekendText)" - case (false, true): - return "평일 \(weekdayText)" - case (true, false): - return "주말 \(weekendText)" - case (true, true): - return "영업 시간 정보 준비 중" - } - } - - func summarizedOpeningHours(from values: [String]) -> String { - let normalized = values - .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } - .filter { !$0.isEmpty } - - guard !normalized.isEmpty else { - return "" - } - - let extractedTimes = normalized.map { value in - guard let separatorIndex = value.firstIndex(of: ":") else { - return value - } - return value[value.index(after: separatorIndex)...] - .trimmingCharacters(in: .whitespacesAndNewlines) - } + // All computed properties moved to ExploreDetailFeature.State extension - let uniqueTimes = Array(Set(extractedTimes)) - - if uniqueTimes.count == 1, let first = extractedTimes.first { - return first - } - - return normalized.joined(separator: ", ") - } - - var phoneNumberText: String { - (store.placeDetail?.phoneNumber)?.nilIfEmpty ?? "전화번호 정보 준비 중" - } - - var addressText: String { - (store.placeDetail?.address)?.nilIfEmpty ?? "주소 정보 준비 중" - } - - var mapRegion: MKCoordinateRegion { - MKCoordinateRegion( - center: mapCoordinate, - span: MKCoordinateSpan(latitudeDelta: 0.0035, longitudeDelta: 0.0035) - ) - } - - var mapCoordinate: CLLocationCoordinate2D { - if let placeDetail = store.placeDetail { - return CLLocationCoordinate2D( - latitude: placeDetail.stationLat, - longitude: placeDetail.stationLon - ) - } - - return CLLocationCoordinate2D( - latitude: store.userSession.travelStationLat ?? 37.5666805, - longitude: store.userSession.travelStationLng ?? 126.9784147 - ) - } - - func formattedDeadlineTime(from value: String) -> String? { - let formatter = DateFormatter() - formatter.locale = Locale(identifier: "ko_KR") - formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - - guard let date = formatter.date(from: value) else { - return nil - } - - let outputFormatter = DateFormatter() - outputFormatter.locale = Locale(identifier: "ko_KR") - outputFormatter.dateFormat = "a h:mm분" - return outputFormatter.string(from: date) - } + // Helper function moved to ExploreDetailFeature.State extension @ViewBuilder func spotImageCard(for url: URL?, index: Int) -> some View { Group { if let url { + // Google Places API 이미지 로드 (제한적 네트워크 허용) KFImage(url) .placeholder { imagePlaceholder() } - .cancelOnDisappear(true) + .setProcessor(DownsamplingImageProcessor(size: CGSize(width: 280, height: 180))) + .loadDiskFileSynchronously() + .memoryCacheExpiration(.seconds(1800)) + .diskCacheExpiration(.days(7)) // 더 긴 캐시 (할당량 절약) + .requestModifier(rateLimitedImageModifier) .fade(duration: 0.2) .resizable() .scaledToFill() @@ -509,168 +357,76 @@ private extension ExploreDetailView { } } - func imagePlaceholder() -> some View { - ZStack { - RoundedRectangle(cornerRadius: 20) - .fill(.gray200) + // Rate Limiting을 고려한 Google Places API 이미지용 요청 modifier + private var rateLimitedImageModifier: AnyModifier { + AnyModifier { request in + var modifiedRequest = request + modifiedRequest.timeoutInterval = 45.0 // 더 긴 타임아웃 + modifiedRequest.setValue("TimeSpot-iOS/1.0", forHTTPHeaderField: "User-Agent") + modifiedRequest.setValue("image/*", forHTTPHeaderField: "Accept") + // Rate limiting 방지를 위해 캐시 우선 사용 + modifiedRequest.cachePolicy = .returnCacheDataElseLoad - Image(systemName: "photo") - .font(.system(size: 28, weight: .medium)) - .foregroundStyle(.gray500) + return modifiedRequest } } -} -private extension ExploreDetailView { - @ViewBuilder - func skeletonContent() -> some View { - VStack(alignment: .leading, spacing: 0) { - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 84, height: 14) - .skeletonShimmer() - .padding(.top, 12) + // 캐시된 이미지만 클리어 (네트워크 요청 없음) + private func forceReloadImages() { + let urls = store.imageCards.compactMap { $0 } + for url in urls { + KingfisherManager.shared.cache.removeImage(forKey: url.absoluteString) + } + } - HStack(spacing: 12) { - RoundedRectangle(cornerRadius: 20) - .fill(.gray200) - .frame(height: 180) - .frame(maxWidth: .infinity) - .skeletonShimmer() - - RoundedRectangle(cornerRadius: 20) - .fill(.gray200) - .frame(width: 84, height: 180) - .skeletonShimmer() - } - .padding(.top, 24) - - HStack(spacing: 0) { - skeletonMetricColumn() - divider - skeletonMetricColumn() - divider - skeletonMetricColumn() - } - .padding(.horizontal, 8) - .padding(.vertical, 16) - .background(.staticWhite) - .clipShape(RoundedRectangle(cornerRadius: 16)) - .overlay { - RoundedRectangle(cornerRadius: 16) - .stroke(.gray300, lineWidth: 1) - } - .padding(.top, 24) + // Rate Limit을 고려한 제한적 프리페칭 (첫 번째 이미지만) + private func prefetchImagesWithRateLimit() { + let urls = store.imageCards.compactMap { $0 } + guard !urls.isEmpty else { return } - RoundedRectangle(cornerRadius: 20) - .fill(.gray200) - .frame(height: 84) - .skeletonShimmer() - .padding(.top, 24) + // 첫 번째 이미지만 프리페치 (Rate Limit 방지) + let limitedUrls = Array(urls.prefix(1)) - VStack(alignment: .leading, spacing: 16) { - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 64, height: 14) - .skeletonShimmer() - - skeletonInfoRow(lineWidth: 180) - skeletonInfoRow(lineWidth: 120) - skeletonInfoRow(lineWidth: 200) - } - .padding(.top, 24) + let prefetcher = ImagePrefetcher( + urls: limitedUrls, + options: [ + .processor(DownsamplingImageProcessor(size: CGSize(width: 280, height: 180))), + .requestModifier(rateLimitedImageModifier), + .backgroundDecode, + .diskCacheExpiration(.days(1)), + .memoryCacheExpiration(.seconds(1800)) + ] + ) + + prefetcher.start() + } + func imagePlaceholder() -> some View { + ZStack { RoundedRectangle(cornerRadius: 20) .fill(.gray200) - .frame(height: 180) - .skeletonShimmer() - .padding(.top, 24) - Capsule() - .fill(.gray200) - .frame(height: 56) - .skeletonShimmer() - .padding(.top, 24) + Image(systemName: "photo") + .font(.system(size: 28, weight: .medium)) + .foregroundStyle(.gray500) } } - @ViewBuilder - func skeletonMetricColumn() -> some View { - VStack(spacing: 8) { - RoundedRectangle(cornerRadius: 4) + func loadingPlaceholder() -> some View { + ZStack { + RoundedRectangle(cornerRadius: 20) .fill(.gray200) - .frame(width: 46, height: 16) - .skeletonShimmer() - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 34, height: 12) - .skeletonShimmer() - } - .frame(maxWidth: .infinity) - } + VStack(spacing: 8) { + ProgressView() + .progressViewStyle(CircularProgressViewStyle(tint: .gray600)) + .scaleEffect(0.8) - @ViewBuilder - func skeletonInfoRow(lineWidth: CGFloat) -> some View { - HStack(alignment: .top, spacing: 10) { - Circle() - .fill(.gray200) - .frame(width: 20, height: 20) - .skeletonShimmer() - - VStack(alignment: .leading, spacing: 6) { - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: 56, height: 12) - .skeletonShimmer() - - RoundedRectangle(cornerRadius: 4) - .fill(.gray200) - .frame(width: lineWidth, height: 14) - .skeletonShimmer() + Text("로딩 중...") + .pretendardCustomFont(textStyle: .body2Regular) + .foregroundStyle(.gray600) } - - Spacer(minLength: 0) } } -} -private extension View { - func skeletonShimmer() -> some View { - modifier(ExploreDetailSkeletonShimmerModifier()) - } -} - -private struct ExploreDetailSkeletonShimmerModifier: ViewModifier { - @State private var isAnimating = false - - func body(content: Content) -> some View { - content - .overlay { - GeometryReader { geometry in - LinearGradient( - colors: [ - .white.opacity(0), - .white.opacity(0.28), - .white.opacity(0) - ], - startPoint: .topLeading, - endPoint: .bottomTrailing - ) - .frame(width: geometry.size.width * 0.55) - .offset(x: isAnimating ? geometry.size.width * 1.25 : -geometry.size.width * 0.8) - } - .clipped() - } - .mask(content) - .onAppear { - guard !isAnimating else { return } - withAnimation( - .easeInOut(duration: 1.0) - .repeatForever(autoreverses: false) - ) { - isAnimating = true - } - } - } } diff --git a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift index d7eaaa7..4aba515 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift @@ -12,6 +12,7 @@ import ComposableArchitecture import Entity import UseCase import Utill +import IdentifiedCollections public enum ExploreListSort: String, CaseIterable, Equatable { case stationNearest = "STATION_NEAREST" @@ -55,6 +56,7 @@ public struct ExploreListFeature { public var hasLoadedInitialPage: Bool = false @Shared(.inMemory("UserSession")) public var userSession: UserSession = .empty + public init() {} } @@ -75,6 +77,8 @@ public struct ExploreListFeature { case categoryTapped(ExploreCategory) case sortTapped(ExploreListSort) case loadNextPage + // Explore에서 데이터 동기화 + case syncSpotsFromExplore([ExploreMapSpot], currentPage: Int, hasNextPage: Bool) } @@ -88,6 +92,7 @@ public struct ExploreListFeature { public enum InnerAction: Equatable { case searchPlacesResponse(ExploreSpotPageEntity, append: Bool, requestedPage: Int) case searchPlacesFailed(String) + case forceResetLoading } //MARK: - NavigationAction @@ -143,8 +148,13 @@ extension ExploreListFeature { case .categoryTapped(let category): state.selectedCategory = category + state.currentPage = 0 + state.hasNextPage = true state.lastTriggeredLoadSpotID = nil - return .none + return .merge( + .cancel(id: CancelID.searchPlaces), + .send(.async(.searchPlaces(page: 0, append: false))) + ) case .sortTapped(let sort): state.selectedSort = sort @@ -159,40 +169,49 @@ extension ExploreListFeature { case .loadNextPage: guard !state.isLoading else { - print("⏸️ [ExploreList] loadNextPage skipped: already loading") - return .none + // 5초 후 강제 리셋 (무한 로딩 방지) + return .run { send in + try await Task.sleep(nanoseconds: 5_000_000_000) // 5초 + await send(.inner(.forceResetLoading)) + } } let visibleSpots = filteredSpots(from: state.spots, state: state) let bufferedVisibleSpots = filteredSpots(from: state.bufferedSpots, state: state) let currentLastSpotID = visibleSpots.last?.id - guard state.lastTriggeredLoadSpotID != currentLastSpotID else { - print("⏸️ [ExploreList] loadNextPage skipped: duplicate trigger for lastVisibleSpotID=\(currentLastSpotID ?? "nil")") - return .none + // 버퍼가 완전히 소진되지 않았을 때만 중복 체크 + let isBufferExhausted = visibleSpots.count >= bufferedVisibleSpots.count + + if !isBufferExhausted { + guard state.lastTriggeredLoadSpotID != currentLastSpotID else { + return .none + } } if visibleSpots.count < bufferedVisibleSpots.count { state.lastTriggeredLoadSpotID = currentLastSpotID - print( - "📦 [ExploreList] reveal buffered chunk: lastVisibleSpotID=\(currentLastSpotID ?? "nil"), visible=\(visibleSpots.count), bufferedVisible=\(bufferedVisibleSpots.count), rawShown=\(state.spots.count), rawBuffered=\(state.bufferedSpots.count)" - ) revealNextVisibleChunk(state: &state) return .none } guard state.hasNextPage else { - print( - "⏹️ [ExploreList] loadNextPage skipped: no next page, lastVisibleSpotID=\(currentLastSpotID ?? "nil"), visible=\(visibleSpots.count), bufferedVisible=\(bufferedVisibleSpots.count)" - ) return .none } state.lastTriggeredLoadSpotID = currentLastSpotID - print( - "🌐 [ExploreList] request next page: page=\(state.currentPage), lastVisibleSpotID=\(currentLastSpotID ?? "nil"), visible=\(visibleSpots.count), bufferedVisible=\(bufferedVisibleSpots.count)" - ) return .send(.async(.searchPlaces(page: state.currentPage, append: true))) + + + case .syncSpotsFromExplore(let spots, let currentPage, let hasNextPage): + // Explore에서 전달받은 데이터로 동기화 + state.bufferedSpots = spots + state.spots = [] + revealNextChunk(state: &state) + state.currentPage = currentPage + state.hasNextPage = hasNextPage + state.hasLoadedInitialPage = true + return .none } } @@ -255,6 +274,7 @@ extension ExploreListFeature { } } .cancellable(id: CancelID.searchPlaces, cancelInFlight: true) + } } @@ -274,46 +294,39 @@ extension ExploreListFeature { ) -> Effect { switch action { case let .searchPlacesResponse(pageEntity, append, requestedPage): + // 무조건 로딩 해제 (중복 데이터여도) state.isLoading = false if append { let existingSpotIDs = Set(state.bufferedSpots.map(\.id)) let uniqueNewSpots = pageEntity.spots.filter { !existingSpotIDs.contains($0.id) } - let duplicateSpotIDs = pageEntity.spots - .map(\.id) - .filter { existingSpotIDs.contains($0) } - - print( - "📥 [ExploreList] append response: requestedPage=\(requestedPage), responseCount=\(pageEntity.spots.count), uniqueNew=\(uniqueNewSpots.count), duplicates=\(duplicateSpotIDs.count), firstID=\(pageEntity.spots.first?.id ?? "nil"), lastID=\(pageEntity.spots.last?.id ?? "nil"), hasNextPage=\(pageEntity.hasNextPage)" - ) - - if uniqueNewSpots.isEmpty { - let duplicatePreview = Array(duplicateSpotIDs.prefix(10)).joined(separator: ", ") - print( - "⚠️ [ExploreList] append response contained no new spots. duplicateIDs(prefix10)=[\(duplicatePreview)]" - ) - } - state.bufferedSpots.append(contentsOf: uniqueNewSpots) - revealNextChunk(state: &state) - print("🔄 [무한스크롤] 버퍼 총: \(state.bufferedSpots.count)개, 화면 노출: \(state.spots.count)개") + // 중복 데이터만 있어도 페이지는 업데이트 + state.currentPage = requestedPage + 1 + state.hasNextPage = pageEntity.hasNextPage + + if !uniqueNewSpots.isEmpty { + state.bufferedSpots.append(contentsOf: uniqueNewSpots) + revealNextChunk(state: &state) + } } else { - print( - "📥 [ExploreList] initial response: requestedPage=\(requestedPage), responseCount=\(pageEntity.spots.count), firstID=\(pageEntity.spots.first?.id ?? "nil"), lastID=\(pageEntity.spots.last?.id ?? "nil"), hasNextPage=\(pageEntity.hasNextPage)" - ) state.bufferedSpots = pageEntity.spots state.spots = [] revealNextChunk(state: &state) - print("🆕 [새로고침] 버퍼 총: \(state.bufferedSpots.count)개, 화면 노출: \(state.spots.count)개") + state.currentPage = requestedPage + 1 + state.hasNextPage = pageEntity.hasNextPage } - state.currentPage = requestedPage + 1 - state.hasNextPage = pageEntity.hasNextPage return .none case .searchPlacesFailed: state.isLoading = false return .none + + + case .forceResetLoading: + state.isLoading = false + return .none } } } @@ -399,7 +412,8 @@ private extension ExploreListFeature { statusText: place.isOpen ? "영업 중" : "영업 종료", closingText: closingText, distanceText: distanceText, - walkTimeText: walkTimeText + walkTimeText: walkTimeText, + address: place.address ) } } diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift index 49635d1..ff6199a 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift @@ -47,10 +47,14 @@ public struct ExploreListView: View { ScrollView(showsIndicators: false) { LazyVStack(spacing: 12) { ForEach(filteredSpots) { spot in - ExploreSpotListCardView(spot: spot) + ExploreSpotListCardView(spot: spot, store: store) .onAppear { guard shouldShowLoadMore else { return } - guard spot.id == filteredSpots.last?.id else { return } + + // 간단하게 마지막 3개 아이템 중 하나면 로드 + let lastFewSpots = filteredSpots.suffix(3) + guard lastFewSpots.contains(where: { $0.id == spot.id }) else { return } + store.send(.view(.loadNextPage)) } } @@ -61,6 +65,7 @@ public struct ExploreListView: View { .padding(.vertical, 16) } + // 플로팅 버튼 공간 Spacer(minLength: 80) } From e7b12cee0bc8ae8f4224c5d65cd1eb8ea96f8d00 Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 22:24:04 +0900 Subject: [PATCH 32/35] =?UTF-8?q?feat:=20Google=20Places=20API=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=BA=90=EC=8B=B1=20=EC=B5=9C=EC=A0=81?= =?UTF-8?q?=ED=99=94=20=EC=84=A4=EC=A0=95=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../App/Sources/Application/AppDelegate.swift | 41 +++++++++++++++++++ Projects/App/Sources/Di/DiRegister.swift | 2 - 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/Projects/App/Sources/Application/AppDelegate.swift b/Projects/App/Sources/Application/AppDelegate.swift index 6e28cf9..36fae9f 100644 --- a/Projects/App/Sources/Application/AppDelegate.swift +++ b/Projects/App/Sources/Application/AppDelegate.swift @@ -8,6 +8,7 @@ import UIKit import WeaveDI import Home +import Kingfisher class AppDelegate: UIResponder, UIApplicationDelegate { @@ -20,6 +21,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { await AppDIManager.shared.registerDefaultDependencies() } + // Kingfisher 캐시 최적화 설정 + configureImageCaching() + // 네이버맵 초기화 (Home 모듈의 NaverMapInitializer 사용) NaverMapInitializer.initialize() @@ -39,4 +43,41 @@ class AppDelegate: UIResponder, UIApplicationDelegate { didDiscardSceneSessions sceneSessions: Set ) { } + + // MARK: - Image Caching Configuration + private func configureImageCaching() { + let cache = ImageCache.default + + // 메모리 캐시 설정 - 50MB로 제한 + cache.memoryStorage.config.totalCostLimit = 50 * 1024 * 1024 + + // 디스크 캐시 설정 - 200MB로 제한, 1주일 보관 + cache.diskStorage.config.sizeLimit = 200 * 1024 * 1024 + cache.diskStorage.config.expiration = .days(7) + + // 이미지 다운로드 설정 (Google Places API 최적화) + let modifier = AnyModifier { request in + var r = request + r.setValue("image/webp,image/*,*/*;q=0.8", forHTTPHeaderField: "Accept") + r.setValue("TimeSpot-iOS/1.0", forHTTPHeaderField: "User-Agent") + r.cachePolicy = .useProtocolCachePolicy + // Google Places API 이미지는 응답이 느릴 수 있으므로 타임아웃 증가 + r.timeoutInterval = 30.0 + return r + } + + KingfisherManager.shared.defaultOptions = [ + .requestModifier(modifier), + .backgroundDecode, + .diskCacheExpiration(.days(1)), // Google Places 이미지는 1일만 캐시 + .memoryCacheExpiration(.seconds(300)) + ] + + // Google Places API를 위한 네트워크 최적화 + let config = KingfisherManager.shared.downloader.sessionConfiguration + config.httpMaximumConnectionsPerHost = 6 + config.timeoutIntervalForRequest = 30.0 + config.timeoutIntervalForResource = 60.0 + config.waitsForConnectivity = true + } } diff --git a/Projects/App/Sources/Di/DiRegister.swift b/Projects/App/Sources/Di/DiRegister.swift index d4f45da..5f63c11 100644 --- a/Projects/App/Sources/Di/DiRegister.swift +++ b/Projects/App/Sources/Di/DiRegister.swift @@ -51,8 +51,6 @@ public final class AppDIManager { // MARK: - 장소 .register(PlaceInterface.self) { PlaceRepositoryImpl() } - - .configure() } } From 0541a8ccd0ac17207558c23452d2f6be14c89a16 Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 22:40:56 +0900 Subject: [PATCH 33/35] =?UTF-8?q?feat:=20Web=20=EB=AA=A8=EB=93=88=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=EC=84=B1=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TargetDependency+Module/Modules.swift | 1 + Projects/Presentation/Auth/Project.swift | 7 +- .../Coordinator/Reducer/AuthCoordinator.swift | 6 + .../{ => Main}/Reducer/LoginFeature.swift | 2 - .../Sources/{ => Main}/View/LoginView.swift | 0 Projects/Presentation/Profile/Project.swift | 9 +- .../Reducer/ProfileCoordinator.swift | 13 ++ .../View/ProfileCoordinatorView.swift | 9 + .../Setting/Reducer/SettingReducer.swift | 9 + .../Sources/Setting/View/SettingView.swift | 10 +- Projects/Presentation/Web/Project.swift | 18 ++ .../Web/Sources/Reducer/WebFeature.swift | 44 +++++ .../Sources/View/WebRepresentableView.swift | 171 ++++++++++++++++++ .../Web/Sources/View/WebView.swift | 45 +++++ .../Web/ebTests/Sources/Test.swift | 8 + 15 files changed, 341 insertions(+), 11 deletions(-) rename Projects/Presentation/Auth/Sources/{ => Main}/Reducer/LoginFeature.swift (99%) rename Projects/Presentation/Auth/Sources/{ => Main}/View/LoginView.swift (100%) create mode 100644 Projects/Presentation/Web/Project.swift create mode 100644 Projects/Presentation/Web/Sources/Reducer/WebFeature.swift create mode 100644 Projects/Presentation/Web/Sources/View/WebRepresentableView.swift create mode 100644 Projects/Presentation/Web/Sources/View/WebView.swift create mode 100644 Projects/Presentation/Web/ebTests/Sources/Test.swift diff --git a/Plugins/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+Module/Modules.swift b/Plugins/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+Module/Modules.swift index 27daddd..f7ac803 100644 --- a/Plugins/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+Module/Modules.swift +++ b/Plugins/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+Module/Modules.swift @@ -25,6 +25,7 @@ public extension ModulePath { case Auth case OnBoarding case Profile + case Web public static let name: String = "Presentation" diff --git a/Projects/Presentation/Auth/Project.swift b/Projects/Presentation/Auth/Project.swift index f3ddf7d..ad8af72 100644 --- a/Projects/Presentation/Auth/Project.swift +++ b/Projects/Presentation/Auth/Project.swift @@ -12,11 +12,12 @@ let project = Project.makeModule( product: .staticFramework, settings: .settings(), dependencies: [ - .Domain(implements: .UseCase), - .Shared(implements: .Shared), .SPM.composableArchitecture, .SPM.tcaCoordinator, - .Presentation(implements: .OnBoarding) + .Domain(implements: .UseCase), + .Shared(implements: .Shared), + .Presentation(implements: .OnBoarding), + .Presentation(implements: .Web) ], sources: ["Sources/**"] ) diff --git a/Projects/Presentation/Auth/Sources/Coordinator/Reducer/AuthCoordinator.swift b/Projects/Presentation/Auth/Sources/Coordinator/Reducer/AuthCoordinator.swift index 4fd7663..7ec2d4d 100644 --- a/Projects/Presentation/Auth/Sources/Coordinator/Reducer/AuthCoordinator.swift +++ b/Projects/Presentation/Auth/Sources/Coordinator/Reducer/AuthCoordinator.swift @@ -8,6 +8,7 @@ import ComposableArchitecture import TCACoordinators import OnBoarding +import Web @Reducer public struct AuthCoordinator { @@ -95,6 +96,10 @@ extension AuthCoordinator { case .routeAction(id: _, action: .onBoarding(.navigation(.onBoardingCompleted))): return .send(.navigation(.presentMain)) + case .routeAction(id: _, action: .login(.delegate(.presentPrivacyWeb))): + state.routes.push(.web(.init(url: "https://www.notion.so/329f94ae438b807d95dcd0f5f8abf66a?source=copy_link"))) + return .none + default: return .none } @@ -160,6 +165,7 @@ extension AuthCoordinator { public enum AuthScreen { case login(LoginFeature) case onBoarding(OnBoardingFeature) + case web(WebFeature) } } diff --git a/Projects/Presentation/Auth/Sources/Reducer/LoginFeature.swift b/Projects/Presentation/Auth/Sources/Main/Reducer/LoginFeature.swift similarity index 99% rename from Projects/Presentation/Auth/Sources/Reducer/LoginFeature.swift rename to Projects/Presentation/Auth/Sources/Main/Reducer/LoginFeature.swift index 0b77221..9955cbd 100644 --- a/Projects/Presentation/Auth/Sources/Reducer/LoginFeature.swift +++ b/Projects/Presentation/Auth/Sources/Main/Reducer/LoginFeature.swift @@ -15,8 +15,6 @@ import Utill import ComposableArchitecture import LogMacro - - @Reducer public struct LoginFeature { public init() {} diff --git a/Projects/Presentation/Auth/Sources/View/LoginView.swift b/Projects/Presentation/Auth/Sources/Main/View/LoginView.swift similarity index 100% rename from Projects/Presentation/Auth/Sources/View/LoginView.swift rename to Projects/Presentation/Auth/Sources/Main/View/LoginView.swift diff --git a/Projects/Presentation/Profile/Project.swift b/Projects/Presentation/Profile/Project.swift index d0e049e..ce138bf 100644 --- a/Projects/Presentation/Profile/Project.swift +++ b/Projects/Presentation/Profile/Project.swift @@ -11,11 +11,12 @@ let project = Project.makeAppModule( product: .staticFramework, settings: .settings(), dependencies: [ + .SPM.composableArchitecture, + .SPM.tcaCoordinator, + .Domain(implements: .UseCase), + .Shared(implements: .DesignSystem), + .Presentation(implements: .Web) - .Domain(implements: .UseCase), - .Shared(implements: .DesignSystem), - .SPM.composableArchitecture, - .SPM.tcaCoordinator, ], sources: ["Sources/**"] ) diff --git a/Projects/Presentation/Profile/Sources/Coordinator/Reducer/ProfileCoordinator.swift b/Projects/Presentation/Profile/Sources/Coordinator/Reducer/ProfileCoordinator.swift index 5a27cbc..8599b17 100644 --- a/Projects/Presentation/Profile/Sources/Coordinator/Reducer/ProfileCoordinator.swift +++ b/Projects/Presentation/Profile/Sources/Coordinator/Reducer/ProfileCoordinator.swift @@ -7,6 +7,7 @@ import ComposableArchitecture import TCACoordinators +import Web @Reducer public struct ProfileCoordinator { @@ -119,6 +120,17 @@ extension ProfileCoordinator { case .routeAction(id: _, action: .notification(.delegate(.presentBack))): return .send(.view(.backAction)) + case .routeAction(id: _, action: .setting(.delegate(.presentPrivacyPolicy))): + state.routes.push(.web(.init(url: "https://www.notion.so/329f94ae438b807d95dcd0f5f8abf66a?source=copy_link"))) + return .none + + case .routeAction(id: _, action: .setting(.delegate(.presentServicePolicy))): + state.routes.push(.web(.init(url: "https://www.notion.so/329f94ae438b804d99a3f8ba2c761e15?source=copy_link"))) + return .none + + case .routeAction(id: _, action: .web(.backToRoot)): + return .send(.view(.backAction)) + default: return .none } @@ -178,6 +190,7 @@ extension ProfileCoordinator { case setting(SettingFeature) case withDraw(WithDrawFeature) case notification(NotificationSettingFeature) + case web(WebFeature) } } diff --git a/Projects/Presentation/Profile/Sources/Coordinator/View/ProfileCoordinatorView.swift b/Projects/Presentation/Profile/Sources/Coordinator/View/ProfileCoordinatorView.swift index a06eac9..fb36851 100644 --- a/Projects/Presentation/Profile/Sources/Coordinator/View/ProfileCoordinatorView.swift +++ b/Projects/Presentation/Profile/Sources/Coordinator/View/ProfileCoordinatorView.swift @@ -9,6 +9,7 @@ import SwiftUI import ComposableArchitecture import TCACoordinators +import Web public struct ProfileCoordinatorView: View { @Bindable var store: StoreOf @@ -48,6 +49,14 @@ public struct ProfileCoordinatorView: View { insertion: .move(edge: .trailing), removal: .move(edge: .leading) )) + + case .web(let webStore): + WebView(store: webStore) + .navigationBarBackButtonHidden() + .transition(.asymmetric( + insertion: .move(edge: .trailing), + removal: .move(edge: .leading) + )) } } } diff --git a/Projects/Presentation/Profile/Sources/Setting/Reducer/SettingReducer.swift b/Projects/Presentation/Profile/Sources/Setting/Reducer/SettingReducer.swift index e2fbadd..e8feb88 100644 --- a/Projects/Presentation/Profile/Sources/Setting/Reducer/SettingReducer.swift +++ b/Projects/Presentation/Profile/Sources/Setting/Reducer/SettingReducer.swift @@ -82,6 +82,8 @@ public struct SettingFeature { case presentAuth case presentWithDraw case presentNotificationSetting + case presentPrivacyPolicy + case presentServicePolicy } @@ -225,6 +227,13 @@ extension SettingFeature { case .presentNotificationSetting: return .none + + case .presentServicePolicy: + return .none + + case .presentPrivacyPolicy: + return .none + } } diff --git a/Projects/Presentation/Profile/Sources/Setting/View/SettingView.swift b/Projects/Presentation/Profile/Sources/Setting/View/SettingView.swift index b720e7e..be08b57 100644 --- a/Projects/Presentation/Profile/Sources/Setting/View/SettingView.swift +++ b/Projects/Presentation/Profile/Sources/Setting/View/SettingView.swift @@ -114,11 +114,17 @@ extension SettingView { private var accountSettingsSection: some View { settingsSection { SettingMenuRowView( - title: "서비스 이용 약관" + title: "서비스 이용 약관", + action: { + store.send(.delegate(.presentServicePolicy)) + } ) SettingMenuRowView( - title: "개인정보 처리방침" + title: "개인정보 처리방침", + action: { + store.send(.delegate(.presentPrivacyPolicy)) + } ) SettingMenuRowView( diff --git a/Projects/Presentation/Web/Project.swift b/Projects/Presentation/Web/Project.swift new file mode 100644 index 0000000..63a05bf --- /dev/null +++ b/Projects/Presentation/Web/Project.swift @@ -0,0 +1,18 @@ +import Foundation +import ProjectDescription +import DependencyPlugin +import ProjectTemplatePlugin +import ProjectTemplatePlugin +import DependencyPackagePlugin + +let project = Project.makeModule( + name: "Web", + bundleId: .appBundleID(name: ".Web"), + product: .staticFramework, + settings: .settings(), + dependencies: [ + .SPM.composableArchitecture, + .Shared(implements: .DesignSystem), + ], + sources: ["Sources/**"] +) diff --git a/Projects/Presentation/Web/Sources/Reducer/WebFeature.swift b/Projects/Presentation/Web/Sources/Reducer/WebFeature.swift new file mode 100644 index 0000000..e82cb28 --- /dev/null +++ b/Projects/Presentation/Web/Sources/Reducer/WebFeature.swift @@ -0,0 +1,44 @@ +// +// WebFeature.swift +// Profile +// +// Created by Wonji Suh on 1/4/26. +// + +import Foundation +import ComposableArchitecture + + +@Reducer +public struct WebFeature { + public init() {} + + @ObservableState + public struct State: Equatable { + var url: String = "" + + public init(url: String) { + self.url = url + } + } + + public enum Action { + case backToRoot + + } + + public var body: some Reducer { + Reduce { state, action in + switch action { + case .backToRoot: + return .none + } + } + } +} + +extension WebReducer.State: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(url) + } +} diff --git a/Projects/Presentation/Web/Sources/View/WebRepresentableView.swift b/Projects/Presentation/Web/Sources/View/WebRepresentableView.swift new file mode 100644 index 0000000..43168ae --- /dev/null +++ b/Projects/Presentation/Web/Sources/View/WebRepresentableView.swift @@ -0,0 +1,171 @@ +// +// WebRepresentableView.swift +// Profile +// +// Created by Wonji Suh on 1/4/26. +// + +import SwiftUI +import WebKit + +import DesignSystem + +import SDWebImageSwiftUI + + +public struct WebRepresentableView: UIViewRepresentable { + + // MARK: - URL to load + private var urlToLoad: String + + public init(urlToLoad: String) { + self.urlToLoad = urlToLoad + } + + public func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + public func makeUIView(context: Context) -> UIView { + // 컨테이너 + let containerView = UIView() + containerView.backgroundColor = UIColor(red: 26/255.0, green: 26/255.0, blue: 26/255.0, alpha: 1.0) + + // WKWebView + let configuration = WKWebViewConfiguration() + let webView = WKWebView(frame: .zero, configuration: configuration) + webView.scrollView.showsVerticalScrollIndicator = false + webView.scrollView.minimumZoomScale = 1.0 + webView.scrollView.maximumZoomScale = 1.0 + webView.navigationDelegate = context.coordinator + webView.uiDelegate = context.coordinator + webView.allowsLinkPreview = true + webView.backgroundColor = UIColor(red: 26/255.0, green: 26/255.0, blue: 26/255.0, alpha: 1.0) + webView.translatesAutoresizingMaskIntoConstraints = false + + // AnimatedImage로 로딩 GIF 표시 + let loadingContainer = createAnimatedImageLoader() + loadingContainer.translatesAutoresizingMaskIntoConstraints = false + + containerView.addSubview(webView) + containerView.addSubview(loadingContainer) + + NSLayoutConstraint.activate([ + // WebView는 전체 + webView.topAnchor.constraint(equalTo: containerView.topAnchor), + webView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), + webView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), + webView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), + + // 로딩 컨테이너는 중앙 + loadingContainer.centerXAnchor.constraint(equalTo: containerView.centerXAnchor), + loadingContainer.centerYAnchor.constraint(equalTo: containerView.centerYAnchor), + loadingContainer.widthAnchor.constraint(equalToConstant: 200), + loadingContainer.heightAnchor.constraint(equalToConstant: 200), + ]) + + // 코디네이터가 참조 보관 + context.coordinator.webView = webView + context.coordinator.loadingIndicator = loadingContainer + + // 로드 직전에 로딩 컨테이너 표시 + loadingContainer.alpha = 1 + + // 로드 + _Concurrency.Task { + await loadURLInWebView(urlToLoad: urlToLoad, webView: webView) + } + + return containerView + } + + func loadURLInWebView(urlToLoad: String, webView: WKWebView) async { + guard let url = URL(string: urlToLoad) else { + return + } + let request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy) + + await MainActor.run { + webView.configuration.upgradeKnownHostsToHTTPS = true + webView.configuration.preferences.minimumFontSize = 16 + webView.load(request) + } + } + + public func updateUIView(_ uiView: UIView, context: Context) { + // 필요 시 업데이트 + } + + // MARK: - AnimatedImage Loading Helper Functions + + private func createAnimatedImageLoader() -> UIView { + let containerView = UIView() + containerView.backgroundColor = .clear + + // SwiftUI AnimatedImage를 UIKit에 임베드 + let animatedImageView = UIHostingController(rootView: + AnimatedImage(name: "DDDLoding.gif", isAnimating: .constant(true)) + .resizable() + .scaledToFit() + .frame(width: 200, height: 200) + ) + + animatedImageView.view.backgroundColor = .clear + animatedImageView.view.translatesAutoresizingMaskIntoConstraints = false + + containerView.addSubview(animatedImageView.view) + + NSLayoutConstraint.activate([ + animatedImageView.view.topAnchor.constraint(equalTo: containerView.topAnchor), + animatedImageView.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), + animatedImageView.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), + animatedImageView.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), + ]) + + return containerView + } + + // MARK: - Coordinator + public class Coordinator: NSObject, WKNavigationDelegate, WKUIDelegate { + var parent: WebRepresentableView + weak var webView: WKWebView? + weak var loadingIndicator: UIView? + + init(_ parent: WebRepresentableView) { + self.parent = parent + } + + // MARK: - WKNavigationDelegate + + public func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { + // 로딩 시작 → AnimatedImage 표시 + DispatchQueue.main.async { [weak self] in + guard let self = self, let loadingIndicator = self.loadingIndicator else { return } + loadingIndicator.alpha = 1 + } + } + + public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + // 로딩 완료 → AnimatedImage 숨김(페이드아웃) + hideLoadingIndicator() + } + + public func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { + hideLoadingIndicator() + } + + public func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { + hideLoadingIndicator() + } + + private func hideLoadingIndicator() { + DispatchQueue.main.async { [weak self] in + guard let self = self, let loadingIndicator = self.loadingIndicator else { return } + + UIView.animate(withDuration: 0.3, animations: { + loadingIndicator.alpha = 0 + }) + } + } + } +} diff --git a/Projects/Presentation/Web/Sources/View/WebView.swift b/Projects/Presentation/Web/Sources/View/WebView.swift new file mode 100644 index 0000000..e38aaea --- /dev/null +++ b/Projects/Presentation/Web/Sources/View/WebView.swift @@ -0,0 +1,45 @@ +// +// WebView.swift +// Profile +// +// Created by Wonji Suh on 1/4/26. +// + +import SwiftUI +import DesignSystem +import ComposableArchitecture + + +public struct WebView: View { + @Bindable var store: StoreOf + + public init( + store: StoreOf, + ) { + self.store = store + } + + public var body: some View { + ZStack { + Color.staticWhite + .edgesIgnoringSafeArea(.all) + + VStack { + Spacer() + .frame(height: 8) + + CustomNavigationBackBar { + store.send(.backToRoot) + } + + Spacer() + .frame(height: 20) + + WebRepresentableView(urlToLoad: store.url) + .edgesIgnoringSafeArea(.bottom) + } + .navigationBarBackButtonHidden(true) + } + } +} + diff --git a/Projects/Presentation/Web/ebTests/Sources/Test.swift b/Projects/Presentation/Web/ebTests/Sources/Test.swift new file mode 100644 index 0000000..9c3864f --- /dev/null +++ b/Projects/Presentation/Web/ebTests/Sources/Test.swift @@ -0,0 +1,8 @@ +// +// base.swift +// DDDAttendance +// +// Created by Roy on 2026-03-29 +// Copyright © 2026 DDD , Ltd. All rights reserved. +// + From b1167a904699cff926da042bae38c4a7caecf41d Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 23:06:05 +0900 Subject: [PATCH 34/35] =?UTF-8?q?refactor:=20ProfileCoordinator=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20Web=20Sta?= =?UTF-8?q?te=20Hashable=20=EA=B0=9C=EC=84=A0=20315?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../View/AuthCoordinatorView.swift | 5 +++ .../Reducer/ProfileCoordinator.swift | 2 +- .../Web/Sources/Reducer/WebFeature.swift | 8 +---- .../Sources/View/WebRepresentableView.swift | 35 ++++++++++--------- .../Web/Sources/View/WebView.swift | 6 ++-- 5 files changed, 29 insertions(+), 27 deletions(-) diff --git a/Projects/Presentation/Auth/Sources/Coordinator/View/AuthCoordinatorView.swift b/Projects/Presentation/Auth/Sources/Coordinator/View/AuthCoordinatorView.swift index c53b0ab..2b0dff9 100644 --- a/Projects/Presentation/Auth/Sources/Coordinator/View/AuthCoordinatorView.swift +++ b/Projects/Presentation/Auth/Sources/Coordinator/View/AuthCoordinatorView.swift @@ -10,6 +10,7 @@ import SwiftUI import ComposableArchitecture import TCACoordinators import OnBoarding +import Web public struct AuthCoordinatorView: View { @Bindable private var store: StoreOf @@ -29,6 +30,10 @@ public struct AuthCoordinatorView: View { OnBoardingView(store: onBoardingStore) .navigationBarBackButtonHidden() .transition(.opacity.combined(with: .scale(scale: 0.98))) + + case .web(let webStore): + WebView(store: webStore) + .navigationBarBackButtonHidden() } } } diff --git a/Projects/Presentation/Profile/Sources/Coordinator/Reducer/ProfileCoordinator.swift b/Projects/Presentation/Profile/Sources/Coordinator/Reducer/ProfileCoordinator.swift index 8599b17..ecee5be 100644 --- a/Projects/Presentation/Profile/Sources/Coordinator/Reducer/ProfileCoordinator.swift +++ b/Projects/Presentation/Profile/Sources/Coordinator/Reducer/ProfileCoordinator.swift @@ -194,7 +194,7 @@ extension ProfileCoordinator { } } -// MARK: - AuthScreen State Equatable & Hashable +// MARK: - ProfileScreen State Equatable & Hashable extension ProfileCoordinator.ProfileScreen.State: Equatable {} extension ProfileCoordinator.ProfileScreen.State: Hashable {} diff --git a/Projects/Presentation/Web/Sources/Reducer/WebFeature.swift b/Projects/Presentation/Web/Sources/Reducer/WebFeature.swift index e82cb28..d80b57a 100644 --- a/Projects/Presentation/Web/Sources/Reducer/WebFeature.swift +++ b/Projects/Presentation/Web/Sources/Reducer/WebFeature.swift @@ -14,7 +14,7 @@ public struct WebFeature { public init() {} @ObservableState - public struct State: Equatable { + public struct State: Equatable, Hashable { var url: String = "" public init(url: String) { @@ -36,9 +36,3 @@ public struct WebFeature { } } } - -extension WebReducer.State: Hashable { - public func hash(into hasher: inout Hasher) { - hasher.combine(url) - } -} diff --git a/Projects/Presentation/Web/Sources/View/WebRepresentableView.swift b/Projects/Presentation/Web/Sources/View/WebRepresentableView.swift index 43168ae..81962de 100644 --- a/Projects/Presentation/Web/Sources/View/WebRepresentableView.swift +++ b/Projects/Presentation/Web/Sources/View/WebRepresentableView.swift @@ -10,8 +10,6 @@ import WebKit import DesignSystem -import SDWebImageSwiftUI - public struct WebRepresentableView: UIViewRepresentable { @@ -102,24 +100,24 @@ public struct WebRepresentableView: UIViewRepresentable { let containerView = UIView() containerView.backgroundColor = .clear - // SwiftUI AnimatedImage를 UIKit에 임베드 - let animatedImageView = UIHostingController(rootView: - AnimatedImage(name: "DDDLoding.gif", isAnimating: .constant(true)) - .resizable() - .scaledToFit() + // SwiftUI ProgressView를 UIKit에 임베드 + let progressView = UIHostingController(rootView: + ProgressView() + .progressViewStyle(CircularProgressViewStyle(tint: .white)) + .scaleEffect(1.5) .frame(width: 200, height: 200) ) - animatedImageView.view.backgroundColor = .clear - animatedImageView.view.translatesAutoresizingMaskIntoConstraints = false + progressView.view.backgroundColor = .clear + progressView.view.translatesAutoresizingMaskIntoConstraints = false - containerView.addSubview(animatedImageView.view) + containerView.addSubview(progressView.view) NSLayoutConstraint.activate([ - animatedImageView.view.topAnchor.constraint(equalTo: containerView.topAnchor), - animatedImageView.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), - animatedImageView.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), - animatedImageView.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), + progressView.view.topAnchor.constraint(equalTo: containerView.topAnchor), + progressView.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), + progressView.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), + progressView.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), ]) return containerView @@ -162,9 +160,12 @@ public struct WebRepresentableView: UIViewRepresentable { DispatchQueue.main.async { [weak self] in guard let self = self, let loadingIndicator = self.loadingIndicator else { return } - UIView.animate(withDuration: 0.3, animations: { - loadingIndicator.alpha = 0 - }) + // 로딩을 2초 더 표시한 후 숨김 + DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { + UIView.animate(withDuration: 0.5, animations: { + loadingIndicator.alpha = 0 + }) + } } } } diff --git a/Projects/Presentation/Web/Sources/View/WebView.swift b/Projects/Presentation/Web/Sources/View/WebView.swift index e38aaea..b4648e1 100644 --- a/Projects/Presentation/Web/Sources/View/WebView.swift +++ b/Projects/Presentation/Web/Sources/View/WebView.swift @@ -28,9 +28,11 @@ public struct WebView: View { Spacer() .frame(height: 8) - CustomNavigationBackBar { + CustomNavigationBackBar(buttonAction: { store.send(.backToRoot) - } + }, title: "") + .padding(.horizontal, 16) + Spacer() .frame(height: 20) From d13be3da36b04d584ca0329b8747aff5c041ead9 Mon Sep 17 00:00:00 2001 From: Roy Date: Sun, 29 Mar 2026 23:44:35 +0900 Subject: [PATCH 35/35] =?UTF-8?q?fix:=20=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20=ED=83=90=EC=83=89=20=EB=B7=B0=20=EA=B0=9C=EC=84=A0?= =?UTF-8?q?=20=20#15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ExploreListFeature와 해당 뷰에서 카테고리 기반 필터를수정 - 목표 시간이 현재 시간보다 이전일 때도 올바르게 처리하도록 시간 계산을 수정 --- .../ExploreDetail/View/ExploreDetailView.swift | 11 +++-------- .../ExploreList/Reducer/ExploreListFeature.swift | 6 ++---- .../Sources/ExploreList/View/ExploreListView.swift | 4 +--- Projects/Shared/Utill/Sources/Date/Date+.swift | 9 ++++++++- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift index b53dc3a..543ca8e 100644 --- a/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift +++ b/Projects/Presentation/Home/Sources/ExploreDetail/View/ExploreDetailView.swift @@ -37,7 +37,7 @@ public struct ExploreDetailView: View { dismiss() }, title: "") .padding(.horizontal, 16) - .offset(y: -34) + .offset(y: -24) } ScrollView(.vertical) { @@ -63,10 +63,8 @@ public struct ExploreDetailView: View { locationMapSection() .padding(.top, 24) - if !store.isVisitUnavailable { - routeButtonSection() - .padding(.top, 24) - } + routeButtonSection() + .padding(.top, 24) } } } @@ -98,9 +96,6 @@ private extension ExploreDetailView { @ViewBuilder func exploreSpotNameTitle() -> some View { VStack(alignment: .leading) { - Spacer() - .frame(height: 4) - HStack(spacing: 8) { Text(store.placeNameText.formattedPlaceNameForDisplay) .pretendardCustomFont(textStyle: .heading1) diff --git a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift index 4aba515..05e6d57 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/Reducer/ExploreListFeature.swift @@ -311,8 +311,7 @@ extension ExploreListFeature { } } else { state.bufferedSpots = pageEntity.spots - state.spots = [] - revealNextChunk(state: &state) + state.spots = pageEntity.spots // 카테고리 변경 시 모든 데이터 바로 표시 state.currentPage = requestedPage + 1 state.hasNextPage = pageEntity.hasNextPage } @@ -362,9 +361,8 @@ private extension ExploreListFeature { return spots.filter { spot in let hasDetail = spot.hasDetail - let matchesCategory = state.selectedCategory == .all || spot.category == state.selectedCategory let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) - return hasDetail && matchesCategory && matchesQuery + return hasDetail && matchesQuery } } diff --git a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift index ff6199a..82be137 100644 --- a/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift +++ b/Projects/Presentation/Home/Sources/ExploreList/View/ExploreListView.swift @@ -96,7 +96,6 @@ private extension ExploreListView { var isFilteringLocally: Bool { !store.searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty - || store.selectedCategory != .all } var shouldShowLoadMore: Bool { @@ -109,9 +108,8 @@ private extension ExploreListView { return sourceSpots.filter { spot in let hasDetail = spot.hasDetail - let matchesCategory = store.selectedCategory == .all || spot.category == store.selectedCategory let matchesQuery = query.isEmpty || spot.name.localizedCaseInsensitiveContains(query) - return hasDetail && matchesCategory && matchesQuery + return hasDetail && matchesQuery } } diff --git a/Projects/Shared/Utill/Sources/Date/Date+.swift b/Projects/Shared/Utill/Sources/Date/Date+.swift index 4953710..09440ad 100644 --- a/Projects/Shared/Utill/Sources/Date/Date+.swift +++ b/Projects/Shared/Utill/Sources/Date/Date+.swift @@ -152,7 +152,14 @@ public extension Date { public extension Calendar { func remainingTimeComponents(from currentTime: Date, to targetTime: Date) -> DateComponents { - let components = dateComponents([.hour, .minute], from: currentTime, to: targetTime) + // targetTime이 currentTime보다 이전이면 다음날로 간주 + var adjustedTargetTime = targetTime + if targetTime < currentTime { + // 다음 날 같은 시간으로 조정 + adjustedTargetTime = date(byAdding: .day, value: 1, to: targetTime) ?? targetTime + } + + let components = dateComponents([.hour, .minute], from: currentTime, to: adjustedTargetTime) return DateComponents(hour: max(components.hour ?? 0, 0), minute: max(components.minute ?? 0, 0)) } }