Skip to content

Commit d275023

Browse files
committed
refactor: 웹페이지 액션을 ContentPicker 내로 이전
1 parent e2ce200 commit d275023

4 files changed

Lines changed: 78 additions & 29 deletions

File tree

Application/DevLogPresentation/Sources/Home/Home/HomeFeature+Effects.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ extension HomeFeature {
153153
state.selectedTodoCategory = nil
154154
}
155155
case .contentPicker:
156-
state.sheet = isPresented ? .contentPicker : state.showContentPicker ? nil : state.sheet
156+
state.sheet = isPresented ? .contentPicker(.init()) : state.showContentPicker ? nil : state.sheet
157157
case .searchView:
158158
state.fullScreenCover = isPresented ? .search : nil
159159
}

Application/DevLogPresentation/Sources/Home/Home/HomeFeature.swift

Lines changed: 69 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ struct HomeFeature {
1616
@Presents var alert: AlertState<Never>?
1717
@Presents var sheet: SheetState?
1818
@Presents var fullScreenCover: FullScreenCoverState?
19-
@Presents var webPageInput: WebPageInputState?
2019
var preferences = [TodoCategoryItem]()
2120
var recentTodos = [RecentTodoItem]()
2221
var webPages = [WebPageItem]()
@@ -27,7 +26,7 @@ struct HomeFeature {
2726
var deletedWebPageURLString: String?
2827
var loading = LoadingFeature.State()
2928

30-
var showContentPicker: Bool { sheet == .contentPicker }
29+
var showContentPicker: Bool { sheet?.contentPickerState != nil }
3130
var showTodoEditor: Bool { fullScreenCover?.destination == .todoEditor }
3231

3332
var isPreferencesLoading: Bool {
@@ -51,12 +50,10 @@ struct HomeFeature {
5150
case alert(PresentationAction<Never>)
5251
case sheet(PresentationAction<Sheet>)
5352
case fullScreenCover(PresentationAction<Never>)
54-
case webPageInput(PresentationAction<Never>)
5553
case startObserving
5654
case fetchData
5755
case refreshRecentTodos
5856
case networkStatusChanged(Bool)
59-
case tapWebPageInput
6057
case setSheet(SheetState?)
6158
case setPresentation(Presentation, Bool)
6259
case setAlert(isPresented: Bool, type: AlertType? = nil)
@@ -85,11 +82,46 @@ struct HomeFeature {
8582
case error
8683
}
8784

85+
@ObservableState
86+
struct ContentPickerState: Equatable {
87+
@Presents var webPageInput: WebPageInputState?
88+
}
89+
8890
@ObservableState
8991
struct WebPageInputState: Equatable, Identifiable {
9092
let id = UUID()
9193
}
9294

95+
@ObservableState
96+
@CasePathable
97+
enum SheetState: Equatable {
98+
case reorderTodo
99+
case contentPicker(ContentPickerState)
100+
101+
var contentPickerState: ContentPickerState? {
102+
get {
103+
guard case .contentPicker(let state) = self else { return nil }
104+
return state
105+
}
106+
set {
107+
guard let newValue else { return }
108+
self = .contentPicker(newValue)
109+
}
110+
}
111+
}
112+
113+
@CasePathable
114+
enum Sheet: Equatable {
115+
case tapCloseButton
116+
case contentPicker(ContentPicker)
117+
118+
@CasePathable
119+
enum ContentPicker: Equatable {
120+
case tapWebPageInput
121+
case webPageInput(PresentationAction<Never>)
122+
}
123+
}
124+
93125
@ObservableState
94126
struct FullScreenCoverState: Equatable {
95127
var destination: Destination
@@ -107,17 +139,6 @@ struct HomeFeature {
107139
static let search = Self(destination: .search)
108140
}
109141

110-
@ObservableState
111-
@CasePathable
112-
enum SheetState: Equatable {
113-
case reorderTodo
114-
case contentPicker
115-
}
116-
117-
enum Sheet: Equatable {
118-
case tapCloseButton
119-
}
120-
121142
enum ModalType: Hashable {
122143
case todoEditor
123144
}
@@ -172,10 +193,6 @@ struct HomeFeature {
172193
state.selectedTodoCategory = nil
173194
case .fullScreenCover:
174195
break
175-
case .webPageInput(.dismiss):
176-
state.webPageInput = nil
177-
case .webPageInput:
178-
break
179196
case .sheet(.dismiss), .sheet(.presented(.tapCloseButton)):
180197
state.sheet = nil
181198
case .sheet:
@@ -192,8 +209,6 @@ struct HomeFeature {
192209
return fetchRecentTodosEffect()
193210
case .networkStatusChanged(let isConnected):
194211
state.isNetworkConnected = isConnected
195-
case .tapWebPageInput:
196-
state.webPageInput = .init()
197212
case .setSheet(let sheet):
198213
state.sheet = sheet
199214
case .setPresentation(let presentation, let isPresented):
@@ -232,7 +247,6 @@ struct HomeFeature {
232247
Self.setAlert(&state, isPresented: true, type: .invalidURL)
233248
return .none
234249
}
235-
state.webPageInput = nil
236250
state.sheet = nil
237251
Self.setAlert(&state, isPresented: false, type: nil)
238252
return addWebPageEffect(normalizedURL)
@@ -266,7 +280,39 @@ struct HomeFeature {
266280
}
267281
.ifLet(\.$alert, action: \.alert)
268282
.ifLet(\.$sheet, action: \.sheet) {
269-
EmptyReducer()
283+
HomeSheetFeature()
284+
}
285+
}
286+
}
287+
288+
private struct HomeSheetFeature: Reducer {
289+
typealias State = HomeFeature.SheetState
290+
typealias Action = HomeFeature.Sheet
291+
292+
var body: some ReducerOf<Self> {
293+
EmptyReducer()
294+
.ifCaseLet(\.contentPicker, action: \.contentPicker) {
295+
HomeContentPickerFeature()
296+
}
297+
}
298+
}
299+
300+
private struct HomeContentPickerFeature: Reducer {
301+
typealias State = HomeFeature.ContentPickerState
302+
typealias Action = HomeFeature.Sheet.ContentPicker
303+
304+
var body: some ReducerOf<Self> {
305+
Reduce { state, action in
306+
switch action {
307+
case .tapWebPageInput:
308+
state.webPageInput = .init()
309+
case .webPageInput(.dismiss):
310+
state.webPageInput = nil
311+
case .webPageInput:
312+
break
313+
}
314+
315+
return .none
270316
}
271317
.ifLet(\.$webPageInput, action: \.webPageInput) {
272318
HomeWebPageInputFeature()

Application/DevLogPresentation/Sources/Home/Home/HomeView.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ struct HomeView: View {
149149
private var toolbar: some ToolbarContent {
150150
ToolbarItem(placement: .topBarTrailing) {
151151
Button {
152-
store.send(.setSheet(.contentPicker))
152+
store.send(.setSheet(.contentPicker(.init())))
153153
} label: {
154154
Image(systemName: "plus")
155155
}
@@ -169,7 +169,8 @@ struct HomeView: View {
169169

170170
@ViewBuilder
171171
private func sheetContent(_ sheetStore: Store<HomeFeature.SheetState, HomeFeature.Sheet>) -> some View {
172-
if sheetStore.state == .contentPicker {
172+
if let contentPickerStore = sheetStore.scope(state: \.contentPickerState, action: \.contentPicker) {
173+
@Bindable var contentPickerStore = contentPickerStore
173174
NavigationStack {
174175
List {
175176
Section {
@@ -199,7 +200,7 @@ struct HomeView: View {
199200

200201
Section {
201202
Button {
202-
store.send(.tapWebPageInput)
203+
contentPickerStore.send(.tapWebPageInput)
203204
} label: {
204205
labelImage(
205206
text: "URL",
@@ -214,7 +215,7 @@ struct HomeView: View {
214215
}
215216
}
216217
.navigationDestination(
217-
item: $store.scope(state: \.webPageInput, action: \.webPageInput)
218+
item: $contentPickerStore.scope(state: \.webPageInput, action: \.webPageInput)
218219
) { _ in
219220
Form {
220221
Section {

Application/DevLogPresentation/Tests/Home/HomeFeatureTestSupport.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,9 @@ struct HomeStoreTestAdapter: HomeStateDriving {
136136
var webPages: [WebPageItem] { store.state.webPages }
137137
var isNetworkConnected: Bool { store.state.isNetworkConnected }
138138
var showContentPicker: Bool { store.state.showContentPicker }
139-
var showWebPageInputNavigation: Bool { store.state.showWebPageInput }
139+
var showWebPageInputNavigation: Bool {
140+
store.state.sheet?.contentPickerState?.webPageInput != nil
141+
}
140142
var showTodoEditor: Bool { store.state.showTodoEditor }
141143
var showAlert: Bool { store.state.alert != nil }
142144
var alertType: HomeFeature.AlertType? {

0 commit comments

Comments
 (0)