Skip to content

Commit b61dc3b

Browse files
authored
[Feat]/#133 카페 검색 시, waypoint 및 place api 호출 구현 및 역기반 이동 (#138)
* [UI] #133 PlaceCellView 제작 * [UI] #133 WaypointCellView제작 * [Chore] #133 swfitLint 수정 수정: (type_body_length) 추가 * [Chore] #133 WayPoint Equatable 추가 * [Feat] #133 연관검색어 구현 및 검색 시 역이동 구현 * [Feat] #133 지도 카메라 포지션 이동 후 -> viewStore 카메라 포지션 동기화 * [UI] #133 CafeSearchView UI 구현 * [Feat] #133 역기반 검색 구현 및 역으로 이동 * [Chore] #133 Equatable 제거 * [Chore] #133 네이밍 수정 - (deprecated: timingCheckFlag) - 기존: timingCheckFlag - 수정: isSubmitfasterThanDebounce * [Chore] #133 CancelId -> DebouncingCancelId 수정 * [Chore] #133 코드 내 불필요한 주석 제거 * [Chore] #133 주석 컨벤션에 맞게 수정 * [Chore] #133 cafeList, cafeMarkerList 제거 기존: cafeList, cafeMarkerList 수정: cafes * [Chore] #133 requestWaypointSearchPlace 네이밍 수정 - 기존: requestWaypointSearchPlace - 수정: requestSearchPlacesByWaypoint * [Chore] #133 action case별 라벨링 추가 * [Chore] #133 if 조건문 검색어 기준으로 변경 * [Chore] #133 debounce, action네이밍 수정 * [Chore] #133 deleteRecentSearchWord label 추가 * [Chore] #133 isUpdatingCameraPosition 기존: isMovingToCurrentPosition 수정: isUpdatingCameraPosition * [Chore] #133 조건문 변수화 진행 * [Chore] #133 네이밍 수정 [needToRetry~ ] - 기존: isSubmitFasterThanFetchResponse - 수정: needToRetryFetchResponse * [Chore] #133 checkFetchPlaceResponse 네이밍 수정 - 기존: checkFetchPlaceResponse - 수정: retryFetchPlacesAndWaypointsResponse * [Chore] #133 tappedRecentSearchWord 수정 - 기존: tappedRecentSearchWord - 수정: recentSearchWordCellTapped * [Chore] #133 조건문 변수화 진행 - isSearchTextEqualToWaypoint * [Chore] #133 API 네이밍 수정, - 기존: searchPlaces(requestValue: fetchPlaces(requestValue -수정: searchPlaces(by text: String) searchPlaces(by requestValue * [Chore] #133 action 네이밍 수정 및 조건문 함수화
1 parent 7fb4c87 commit b61dc3b

10 files changed

+239
-48
lines changed

.swiftlint.yml

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Default Rules에서 비활성화할 규칙
33
disabled_rules:
44
- unused_closure_parameter
5+
- type_body_length
56

67
# Default Rules에 없지만 활성화하고 싶은 규칙
78
opt_in_rules:

Projects/Coffice/.swiftlint.yml

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Default Rules에서 비활성화할 규칙
33
disabled_rules:
44
- unused_closure_parameter
5+
- type_body_length
56

67
# Default Rules에 없지만 활성화하고 싶은 규칙
78
opt_in_rules:

Projects/Coffice/Sources/App/Dependencies/SearchPlaceAPIClient.swift

+5-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import Network
1313
struct SearchPlaceAPIClient: DependencyKey {
1414
static var liveValue: SearchPlaceAPIClient = .liveValue
1515

16-
func searchPlaces(requestValue: SearchPlaceRequestValue) async throws -> CafeSearchResponse {
16+
func searchPlaces(by requestValue: SearchPlaceRequestValue) async throws -> CafeSearchResponse {
1717
let coreNetwork = CoreNetwork.shared
1818
var urlComponents = URLComponents(string: coreNetwork.baseURL)
1919
urlComponents?.path = "/api/v1/places/search"
@@ -38,14 +38,14 @@ struct SearchPlaceAPIClient: DependencyKey {
3838
return cafeSearchResponse
3939
}
4040

41-
func fetchPlaces(requestValue: PlaceRequestValue) async throws -> CafeSearchResponse {
41+
func searchPlaces(by text: String) async throws -> CafeSearchResponse {
4242
let coreNetwork = CoreNetwork.shared
4343
var urlComponents = URLComponents(string: coreNetwork.baseURL)
4444
urlComponents?.path = "/api/v1/places"
4545
urlComponents?.queryItems = [
46-
.init(name: "name", value: requestValue.name),
47-
.init(name: "page", value: String(requestValue.page)),
48-
.init(name: "sort", value: requestValue.sort.name)
46+
.init(name: "name", value: text),
47+
.init(name: "page", value: String(0)),
48+
.init(name: "sort", value: SortDescriptor.ascending.name)
4949
]
5050
guard let request = urlComponents?.toURLRequest(method: .get)
5151
else { throw CoreNetworkError.requestConvertFailed }

Projects/Coffice/Sources/App/Entities/WayPoint.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import Foundation
1010
import Network
1111

12-
struct WayPoint {
12+
struct WayPoint: Hashable {
1313
let id: Int
1414
let name: String
1515
let latitude: Double

Projects/Coffice/Sources/App/Main/Search/CafeMapCore.swift

+60-19
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,13 @@ struct CafeMapCore: ReducerProtocol {
4343

4444
// MARK: NaverMapView
4545
var currentCameraPosition = CLLocationCoordinate2D(latitude: 37.4971, longitude: 127.0287)
46-
var cafeMarkerList: [Cafe] = []
47-
var cafeList: [Cafe] = []
46+
var cafes: [Cafe] = []
4847
var shouldClearMarkers: Bool = false
4948
let bottomFloatingButtons = BottomFloatingButton.allCases
50-
var isMovingToCurrentPosition = false
49+
var isUpdatingCameraPosition = false
5150
var isUpdatingMarkers = false
5251
var shouldUpdateMarkers: Bool {
53-
return cafeMarkerList.isNotEmpty && isUpdatingMarkers
52+
return cafes.isNotEmpty && isUpdatingMarkers
5453
}
5554
var isUpdatingBookmarkState = false
5655
var shouldShowRefreshButtonView: Bool {
@@ -83,11 +82,12 @@ struct CafeMapCore: ReducerProtocol {
8382
case cleardMarkers
8483
case refreshButtonTapped
8584
case updateCameraUpdateReason(NaverMapCameraUpdateReason)
86-
case cameraPositionMoved
85+
case cameraPositionMoved(newCameraPosition: CLLocationCoordinate2D)
8786

8887
// MARK: Search
8988
case infiniteScrollSearchPlaceResponse(TaskResult<CafeSearchResponse>)
9089
case requestSearchPlaceResponse(TaskResult<CafeSearchResponse>, String)
90+
case requestWaypointSearchPlaceResponse(TaskResult<CafeSearchResponse>)
9191

9292
// MARK: Temporary
9393
case pushToSearchDetailForTest(cafeId: Int)
@@ -142,6 +142,26 @@ struct CafeMapCore: ReducerProtocol {
142142
return .none
143143

144144
// MARK: Sub-Core Actions
145+
case .cafeSearchAction(.searchPlacesByWaypoint(let waypoint)):
146+
state.cafeSearchListState.title = waypoint.name
147+
state.currentCameraPosition = CLLocationCoordinate2D(
148+
latitude: waypoint.latitude, longitude: waypoint.longitude
149+
)
150+
state.cafeSearchState.searchTextSnapshot = ""
151+
state.cafeSearchState.searchCameraPositionSnapshot = state.currentCameraPosition
152+
return .run { send in
153+
let result = await TaskResult {
154+
let cafeRequest = SearchPlaceRequestValue(
155+
searchText: "", userLatitude: waypoint.latitude, userLongitude: waypoint.longitude,
156+
maximumSearchDistance: 2000, isOpened: nil, hasCommunalTable: nil,
157+
filters: nil, pageSize: 10, pageableKey: nil
158+
)
159+
let cafeListData = try await placeAPIClient.searchPlaces(by: cafeRequest)
160+
return cafeListData
161+
}
162+
await send(.requestWaypointSearchPlaceResponse(result))
163+
}
164+
145165
case .cafeSearchAction(.dismiss):
146166
switch state.cafeSearchState.previousViewType {
147167
case .mainMapView:
@@ -162,7 +182,7 @@ struct CafeMapCore: ReducerProtocol {
162182
case .cafeSearchListAction(.dismiss):
163183
return .send(.resetResult(.dismissSearchResultView))
164184

165-
case .cafeSearchAction(.requestSearchPlace(let searchText)):
185+
case .cafeSearchAction(.searchPlacesByRequestValue(let searchText)):
166186
let title = searchText
167187
let cameraPosition = state.currentCameraPosition
168188
let isOpened = state.cafeFilterInformation.isOpened
@@ -183,7 +203,7 @@ struct CafeMapCore: ReducerProtocol {
183203
pageSize: 10,
184204
pageableKey: nil
185205
)
186-
let cafeSearchResponose = try await placeAPIClient.searchPlaces(requestValue: cafeRequest)
206+
let cafeSearchResponose = try await placeAPIClient.searchPlaces(by: cafeRequest)
187207
return cafeSearchResponose
188208
}
189209
await send(.requestSearchPlaceResponse(result, title))
@@ -210,7 +230,7 @@ struct CafeMapCore: ReducerProtocol {
210230
pageSize: pageSize,
211231
pageableKey: PageableKey(lastCafeDistance: lastDistance)
212232
)
213-
let cafeSearchResponse = try await placeAPIClient.searchPlaces(requestValue: cafeRequest)
233+
let cafeSearchResponse = try await placeAPIClient.searchPlaces(by: cafeRequest)
214234
return cafeSearchResponse
215235
}
216236
await send(.infiniteScrollSearchPlaceResponse(result))
@@ -224,7 +244,7 @@ struct CafeMapCore: ReducerProtocol {
224244
case .bottomFloatingButtonTapped(let buttonType):
225245
switch buttonType {
226246
case .currentLocationButton:
227-
state.isMovingToCurrentPosition = true
247+
state.isUpdatingCameraPosition = true
228248
return .send(.updateCurrentLocation)
229249
case .bookmarkButton:
230250
return .none
@@ -254,7 +274,7 @@ struct CafeMapCore: ReducerProtocol {
254274
pageableKey: nil
255275
)
256276

257-
let cafeListData = try await placeAPIClient.searchPlaces(requestValue: cafeRequest)
277+
let cafeListData = try await placeAPIClient.searchPlaces(by: cafeRequest)
258278
return cafeListData.cafes
259279
}
260280
await send(.cafeListResponse(result))
@@ -263,7 +283,7 @@ struct CafeMapCore: ReducerProtocol {
263283
case .cafeListResponse(let result):
264284
switch result {
265285
case .success(let cafeList):
266-
state.cafeMarkerList = cafeList
286+
state.cafes = cafeList
267287
return .none
268288
case .failure(let error):
269289
debugPrint(error)
@@ -281,7 +301,7 @@ struct CafeMapCore: ReducerProtocol {
281301
return .none
282302

283303
case .movedToCurrentPosition:
284-
state.isMovingToCurrentPosition = false
304+
state.isUpdatingCameraPosition = false
285305
return .none
286306

287307
case .markersUpdated:
@@ -301,18 +321,19 @@ struct CafeMapCore: ReducerProtocol {
301321
state.cameraUpdateReason = updateReason
302322
return .none
303323

304-
case .cameraPositionMoved:
324+
case .cameraPositionMoved(let newCameraPosition):
325+
state.currentCameraPosition = newCameraPosition
305326
state.isMovingCameraPosition = false
306327
return .none
307328

329+
// MARK: Search
308330
case .requestSearchPlaceResponse(let result, let title):
309331
switch result {
310332
case .success(let searchResponse):
311333
if searchResponse.cafes.isEmpty {
312334
return .send(.resetResult(.searchResultIsEmpty))
313335
}
314-
state.cafeList = searchResponse.cafes
315-
state.cafeMarkerList = searchResponse.cafes
336+
state.cafes = searchResponse.cafes
316337
state.isUpdatingMarkers = true
317338
state.cafeSearchListState.cafeList = searchResponse.cafes
318339
state.cafeSearchListState.hasNext = searchResponse.hasNext
@@ -323,7 +344,7 @@ struct CafeMapCore: ReducerProtocol {
323344
latitude: cafe.latitude,
324345
longitude: cafe.longitude
325346
)
326-
state.isMovingToCurrentPosition = true
347+
state.isUpdatingCameraPosition = true
327348
state.cafeSearchListState.title = title
328349
state.displayViewType = .searchResultView
329350
state.cafeSearchState.previousViewType = .searchResultView
@@ -344,7 +365,7 @@ struct CafeMapCore: ReducerProtocol {
344365
}
345366
if removedDuplicationCafes.isNotEmpty {
346367
state.cafeSearchListState.cafeList += cafeSearchResponse.cafes
347-
state.cafeMarkerList += cafeSearchResponse.cafes
368+
state.cafes += cafeSearchResponse.cafes
348369
state.isUpdatingMarkers = true
349370
}
350371
return .none
@@ -353,10 +374,30 @@ struct CafeMapCore: ReducerProtocol {
353374
return .none
354375
}
355376

377+
case .requestWaypointSearchPlaceResponse(let result):
378+
switch result {
379+
case .success(let searchResponse):
380+
state.cafeSearchListState.hasNext = searchResponse.hasNext
381+
if searchResponse.cafes.isEmpty {
382+
return .send(.resetResult(.searchResultIsEmpty))
383+
}
384+
state.cafes = searchResponse.cafes
385+
state.selectedCafe = nil
386+
state.isUpdatingMarkers = true
387+
state.cafeSearchListState.cafeList = searchResponse.cafes
388+
state.cafeSearchListState.hasNext = searchResponse.hasNext
389+
state.isUpdatingCameraPosition = true
390+
state.displayViewType = .searchResultView
391+
state.cafeSearchState.previousViewType = .searchResultView
392+
return .send(.cafeSearchAction(.dismiss))
393+
case .failure(let error):
394+
debugPrint(error)
395+
return .none
396+
}
397+
356398
// MARK: Common
357399
case .resetResult(let resetState):
358-
state.cafeList = []
359-
state.cafeMarkerList = []
400+
state.cafes = []
360401
state.cafeSearchListState.cafeList = []
361402
state.cafeSearchListState.hasNext = nil
362403
state.cameraUpdateReason = .changedByDeveloper

0 commit comments

Comments
 (0)