Skip to content

Commit bb2fa01

Browse files
committed
[FIX] fix search filter view
1 parent 24810eb commit bb2fa01

6 files changed

Lines changed: 162 additions & 107 deletions

File tree

HotSpot/Sources/Presentation/Coordinator/AppCoordinator.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,18 @@ final class AppCoordinator {
3939
push(searchView)
4040
}
4141

42+
func showSearchFilter() {
43+
let searchFilterView = SearchFilterView(
44+
store: Store(
45+
initialState: SearchFilterStore.State(),
46+
reducer: { SearchFilterStore() }
47+
)
48+
)
49+
.environment(\.coordinator, self)
50+
51+
push(searchFilterView)
52+
}
53+
4254
func showShopDetail(_ shop: ShopModel) {
4355
let shopDetailView = ShopDetailView(
4456
store: Store(

HotSpot/Sources/Presentation/Map/MapView.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import Kingfisher
77
struct MapView: View {
88
let store: StoreOf<MapStore>
99
@State private var shopImages: [String: UIImage] = [:]
10-
@State private var lastRegion: MKCoordinateRegion?
1110
@Environment(\.coordinator) private var coordinator
1211

1312
var body: some View {

HotSpot/Sources/Presentation/Search/SearchStore.swift

Lines changed: 21 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,8 @@ struct SearchStore {
1313
var error: String? = nil
1414
var currentLocation: CLLocationCoordinate2D?
1515
var paginationState: PaginationState = .init()
16-
var isFilterSheetPresented: Bool = false
1716

18-
// Filter states
19-
var selectedBudget: Int = 0
20-
var hasWiFi: Bool = false
21-
var hasPrivateRoom: Bool = false
22-
var isNonSmoking: Bool = false
23-
var hasParking: Bool = false
24-
var selectedCuisine: Int = 0
25-
var selectedDistance: Int = 3
17+
var filterState: SearchFilterStore.State = .init()
2618

2719
static func == (lhs: State, rhs: State) -> Bool {
2820
lhs.shops == rhs.shops &&
@@ -31,14 +23,7 @@ struct SearchStore {
3123
lhs.currentLocation?.latitude == rhs.currentLocation?.latitude &&
3224
lhs.currentLocation?.longitude == rhs.currentLocation?.longitude &&
3325
lhs.paginationState == rhs.paginationState &&
34-
lhs.isFilterSheetPresented == rhs.isFilterSheetPresented &&
35-
lhs.selectedBudget == rhs.selectedBudget &&
36-
lhs.hasWiFi == rhs.hasWiFi &&
37-
lhs.hasPrivateRoom == rhs.hasPrivateRoom &&
38-
lhs.isNonSmoking == rhs.isNonSmoking &&
39-
lhs.hasParking == rhs.hasParking &&
40-
lhs.selectedCuisine == rhs.selectedCuisine &&
41-
lhs.selectedDistance == rhs.selectedDistance
26+
lhs.filterState == rhs.filterState
4227
}
4328
}
4429

@@ -50,17 +35,7 @@ struct SearchStore {
5035
case handleError(Error)
5136
case loadMore
5237
case updatePaginationState(PaginationState)
53-
54-
// Filter actions
55-
case toggleFilterSheet
56-
case updateBudget(Int)
57-
case toggleWiFi
58-
case togglePrivateRoom
59-
case toggleNonSmoking
60-
case toggleParking
61-
case updateCuisine(Int)
62-
case updateDistance(Int)
63-
case resetFilters
38+
case updateFilterState(SearchFilterStore.State)
6439
}
6540

6641
var body: some ReducerOf<Self> {
@@ -97,16 +72,16 @@ struct SearchStore {
9772
let request = ShopSearchRequestDTO(
9873
lat: location.latitude,
9974
lng: location.longitude,
100-
range: state.selectedDistance,
75+
range: state.filterState.selectedDistance,
10176
count: nil,
10277
keyword: text,
103-
genre: state.selectedCuisine > 0 ? String(state.selectedCuisine) : nil,
78+
genre: state.filterState.selectedCuisine > 0 ? String(state.filterState.selectedCuisine) : nil,
10479
order: nil,
10580
start: nil,
106-
budget: state.selectedBudget > 0 ? String(state.selectedBudget) : nil,
107-
privateRoom: state.hasPrivateRoom ? true : nil,
108-
wifi: state.hasWiFi ? true : nil,
109-
nonSmoking: state.isNonSmoking ? true : nil,
81+
budget: state.filterState.selectedBudget > 0 ? String(state.filterState.selectedBudget) : nil,
82+
privateRoom: state.filterState.hasPrivateRoom ? true : nil,
83+
wifi: state.filterState.hasWiFi ? true : nil,
84+
nonSmoking: state.filterState.isNonSmoking ? true : nil,
11085
coupon: nil,
11186
openNow: nil
11287
)
@@ -135,16 +110,16 @@ struct SearchStore {
135110
let request = ShopSearchRequestDTO(
136111
lat: location.latitude,
137112
lng: location.longitude,
138-
range: state.selectedDistance,
113+
range: state.filterState.selectedDistance,
139114
count: nil,
140115
keyword: state.searchText,
141-
genre: state.selectedCuisine > 0 ? String(state.selectedCuisine) : nil,
116+
genre: state.filterState.selectedCuisine > 0 ? String(state.filterState.selectedCuisine) : nil,
142117
order: nil,
143118
start: nil,
144-
budget: state.selectedBudget > 0 ? String(state.selectedBudget) : nil,
145-
privateRoom: state.hasPrivateRoom ? true : nil,
146-
wifi: state.hasWiFi ? true : nil,
147-
nonSmoking: state.isNonSmoking ? true : nil,
119+
budget: state.filterState.selectedBudget > 0 ? String(state.filterState.selectedBudget) : nil,
120+
privateRoom: state.filterState.hasPrivateRoom ? true : nil,
121+
wifi: state.filterState.hasWiFi ? true : nil,
122+
nonSmoking: state.filterState.isNonSmoking ? true : nil,
148123
coupon: nil,
149124
openNow: nil
150125
)
@@ -173,48 +148,12 @@ struct SearchStore {
173148
case let .updatePaginationState(paginationState):
174149
state.paginationState = paginationState
175150
return .none
176-
177-
case .toggleFilterSheet:
178-
state.isFilterSheetPresented.toggle()
179-
return .none
180-
181-
case let .updateBudget(budget):
182-
state.selectedBudget = budget
183-
return .none
184-
185-
case .toggleWiFi:
186-
state.hasWiFi.toggle()
187-
return .none
188-
189-
case .togglePrivateRoom:
190-
state.hasPrivateRoom.toggle()
191-
return .none
192-
193-
case .toggleNonSmoking:
194-
state.isNonSmoking.toggle()
195-
return .none
196-
197-
case .toggleParking:
198-
state.hasParking.toggle()
199-
return .none
200-
201-
case let .updateCuisine(cuisine):
202-
state.selectedCuisine = cuisine
203-
return .none
204-
205-
case let .updateDistance(distance):
206-
state.selectedDistance = distance
207-
return .none
208-
209-
case .resetFilters:
210-
state.selectedBudget = 0
211-
state.hasWiFi = false
212-
state.hasPrivateRoom = false
213-
state.isNonSmoking = false
214-
state.hasParking = false
215-
state.selectedCuisine = 0
216-
state.selectedDistance = 3
217-
return .none
151+
152+
case let .updateFilterState(filterState):
153+
state.filterState = filterState
154+
return .run { [state] send in
155+
await send(.search(state.searchText))
156+
}
218157
}
219158
}
220159
}

HotSpot/Sources/Presentation/Search/SearchView.swift

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ struct SearchView: View {
2020
rightSide: .icon,
2121
rightIcon: UIImage.icMore,
2222
rightAction: {
23-
viewStore.send(.toggleFilterSheet)
23+
coordinator?.showSearchFilter()
2424
}
2525
)
2626
}
@@ -49,12 +49,6 @@ struct SearchView: View {
4949
.onTapGesture {
5050
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
5151
}
52-
.sheet(isPresented: viewStore.binding(
53-
get: \.isFilterSheetPresented,
54-
send: SearchStore.Action.toggleFilterSheet
55-
)) {
56-
SearchFilterView(store: store)
57-
}
5852
}
5953
}
6054
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import Foundation
2+
import ComposableArchitecture
3+
4+
@Reducer
5+
struct SearchFilterStore {
6+
private enum UserDefaultsKey {
7+
static let budget = "shop_filter_budget"
8+
static let hasWiFi = "shop_filter_has_wifi"
9+
static let hasPrivateRoom = "shop_filter_has_private_room"
10+
static let isNonSmoking = "shop_filter_is_non_smoking"
11+
static let hasParking = "shop_filter_has_parking"
12+
static let cuisine = "shop_filter_cuisine"
13+
static let distance = "shop_filter_distance"
14+
}
15+
16+
struct State: Equatable {
17+
var selectedBudget: Int
18+
var hasWiFi: Bool
19+
var hasPrivateRoom: Bool
20+
var isNonSmoking: Bool
21+
var hasParking: Bool
22+
var selectedCuisine: Int
23+
var selectedDistance: Int
24+
25+
init() {
26+
let defaults = UserDefaults.standard
27+
self.selectedBudget = defaults.integer(forKey: UserDefaultsKey.budget)
28+
self.hasWiFi = defaults.bool(forKey: UserDefaultsKey.hasWiFi)
29+
self.hasPrivateRoom = defaults.bool(forKey: UserDefaultsKey.hasPrivateRoom)
30+
self.isNonSmoking = defaults.bool(forKey: UserDefaultsKey.isNonSmoking)
31+
self.hasParking = defaults.bool(forKey: UserDefaultsKey.hasParking)
32+
self.selectedCuisine = defaults.integer(forKey: UserDefaultsKey.cuisine)
33+
self.selectedDistance = defaults.integer(forKey: UserDefaultsKey.distance)
34+
}
35+
}
36+
37+
enum Action {
38+
case updateBudget(Int)
39+
case toggleWiFi
40+
case togglePrivateRoom
41+
case toggleNonSmoking
42+
case toggleParking
43+
case updateCuisine(Int)
44+
case updateDistance(Int)
45+
case resetFilters
46+
case applyFilters
47+
}
48+
49+
var body: some ReducerOf<Self> {
50+
Reduce { state, action in
51+
switch action {
52+
case let .updateBudget(budget):
53+
state.selectedBudget = budget
54+
UserDefaults.standard.set(budget, forKey: UserDefaultsKey.budget)
55+
return .none
56+
57+
case .toggleWiFi:
58+
state.hasWiFi.toggle()
59+
UserDefaults.standard.set(state.hasWiFi, forKey: UserDefaultsKey.hasWiFi)
60+
return .none
61+
62+
case .togglePrivateRoom:
63+
state.hasPrivateRoom.toggle()
64+
UserDefaults.standard.set(state.hasPrivateRoom, forKey: UserDefaultsKey.hasPrivateRoom)
65+
return .none
66+
67+
case .toggleNonSmoking:
68+
state.isNonSmoking.toggle()
69+
UserDefaults.standard.set(state.isNonSmoking, forKey: UserDefaultsKey.isNonSmoking)
70+
return .none
71+
72+
case .toggleParking:
73+
state.hasParking.toggle()
74+
UserDefaults.standard.set(state.hasParking, forKey: UserDefaultsKey.hasParking)
75+
return .none
76+
77+
case let .updateCuisine(cuisine):
78+
state.selectedCuisine = cuisine
79+
UserDefaults.standard.set(cuisine, forKey: UserDefaultsKey.cuisine)
80+
return .none
81+
82+
case let .updateDistance(distance):
83+
state.selectedDistance = distance
84+
UserDefaults.standard.set(distance, forKey: UserDefaultsKey.distance)
85+
return .none
86+
87+
case .resetFilters:
88+
state.selectedBudget = 0
89+
state.hasWiFi = false
90+
state.hasPrivateRoom = false
91+
state.isNonSmoking = false
92+
state.hasParking = false
93+
state.selectedCuisine = 0
94+
state.selectedDistance = 3
95+
96+
UserDefaults.standard.removeObject(forKey: UserDefaultsKey.budget)
97+
UserDefaults.standard.removeObject(forKey: UserDefaultsKey.hasWiFi)
98+
UserDefaults.standard.removeObject(forKey: UserDefaultsKey.hasPrivateRoom)
99+
UserDefaults.standard.removeObject(forKey: UserDefaultsKey.isNonSmoking)
100+
UserDefaults.standard.removeObject(forKey: UserDefaultsKey.hasParking)
101+
UserDefaults.standard.removeObject(forKey: UserDefaultsKey.cuisine)
102+
UserDefaults.standard.removeObject(forKey: UserDefaultsKey.distance)
103+
104+
return .none
105+
106+
case .applyFilters:
107+
return .none
108+
}
109+
}
110+
}
111+
}

0 commit comments

Comments
 (0)