@@ -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 ( )
0 commit comments