@@ -11,6 +11,7 @@ final class HomeViewModel: Store {
1111 struct State {
1212 var todoKindPreferences = TodoKind . allCases. map { TodoKindPreference ( kind: $0, isVisible: true ) }
1313 var pinnedTodos : [ PinnedTodoItem ] = [ ]
14+ var webPages : [ WebPageItem ] = [ ]
1415 var showTodoKindPicker : Bool = false
1516 var showTodoEditor : Bool = false
1617 var showSearchView : Bool = false
@@ -19,7 +20,9 @@ final class HomeViewModel: Store {
1920 var searchText : String = " "
2021 var isSearching : Bool = false
2122 var reorderTodo : Bool = false
22- var isLoading : Bool = false
23+ var isPinnedLoading : Bool = false
24+ var isWebPageLoading : Bool = false
25+ var isWebPageInputLoading : Bool = false
2326 var showAlert : Bool = false
2427 var alertTitle : String = " "
2528 var alertType : AlertType ?
@@ -40,14 +43,20 @@ final class HomeViewModel: Store {
4043 case updateSearchText( String )
4144 case upsertTodo( Todo )
4245 case addWebPage
46+ case deleteWebPage( WebPageItem )
4347 case fetchPinnedTodos( [ PinnedTodoItem ] )
44- case setLoading( Bool )
48+ case fetchWebPages( [ WebPageItem ] )
49+ case setPinnedLoading( Bool )
50+ case setWebPageLoading( Bool )
51+ case setWebPageInputLoading( Bool )
4552 }
4653
4754 enum SideEffect {
4855 case upsertTodo( Todo )
4956 case addWebPage( String )
57+ case deleteWebPage( String )
5058 case fetchPinnedTodos
59+ case fetchWebPages
5160 }
5261
5362 enum AlertType {
@@ -58,17 +67,23 @@ final class HomeViewModel: Store {
5867
5968 private let upsertTodoUseCase : UpsertTodoUseCase
6069 private let addWebPageUseCase : AddWebPageUseCase
70+ private let deleteWebPageUseCase : DeleteWebPageUseCase
6171 private let fetchPinnedTodosUseCase : FetchPinnedTodosUseCase
72+ private let fetchWebPagesUseCase : FetchWebPagesUseCase
6273 @Published private( set) var state = State ( )
6374
6475 init (
6576 addWebPageUseCase: AddWebPageUseCase ,
77+ deleteWebPageUseCase: DeleteWebPageUseCase ,
6678 upsertTodoUseCase: UpsertTodoUseCase ,
67- fetchPinnedTodosUseCase: FetchPinnedTodosUseCase
79+ fetchPinnedTodosUseCase: FetchPinnedTodosUseCase ,
80+ fetchWebPagesUseCase: FetchWebPagesUseCase
6881 ) {
6982 self . addWebPageUseCase = addWebPageUseCase
83+ self . deleteWebPageUseCase = deleteWebPageUseCase
7084 self . upsertTodoUseCase = upsertTodoUseCase
7185 self . fetchPinnedTodosUseCase = fetchPinnedTodosUseCase
86+ self . fetchWebPagesUseCase = fetchWebPagesUseCase
7287 }
7388
7489 func reduce( with action: Action ) -> [ SideEffect ] {
@@ -81,10 +96,10 @@ final class HomeViewModel: Store {
8196 . updateWebPageURLInput, . setAlert:
8297 effects = reduceByUser ( action, state: & state)
8398
84- case . onAppear, . updateSearching, . updateSearchText, . upsertTodo, . addWebPage:
99+ case . onAppear, . updateSearching, . updateSearchText, . upsertTodo, . addWebPage, . deleteWebPage :
85100 effects = reduceByView ( action, state: & state)
86101
87- case . fetchPinnedTodos, . setLoading :
102+ case . fetchPinnedTodos, . fetchWebPages , . setPinnedLoading , . setWebPageLoading , . setWebPageInputLoading :
88103 effects = reduceByRun ( action, state: & state)
89104 }
90105
@@ -97,8 +112,6 @@ final class HomeViewModel: Store {
97112 case . upsertTodo( let todo) :
98113 Task {
99114 do {
100- defer { send ( . setLoading( false ) ) }
101- send ( . setLoading( true ) )
102115 try await upsertTodoUseCase. execute ( todo)
103116 } catch {
104117 send ( . setAlert( isPresented: true , type: . error) )
@@ -107,24 +120,51 @@ final class HomeViewModel: Store {
107120 case . addWebPage( let urlString) :
108121 Task {
109122 do {
110- defer { send ( . setLoading( false ) ) }
111- send ( . setLoading( true ) )
112- _ = try await addWebPageUseCase. execute ( urlString)
123+ defer { send ( . setWebPageInputLoading( false ) ) }
124+ send ( . setWebPageInputLoading( true ) )
125+ try await addWebPageUseCase. execute ( urlString)
126+ let pages = try await fetchWebPagesUseCase. execute ( " " )
127+ send ( . fetchWebPages( pages. map { WebPageItem ( from: $0) } ) )
113128 } catch {
129+ send ( . setWebPageInputLoading( false ) )
130+ send ( . setAlert( isPresented: true , type: . error) )
131+ }
132+ }
133+ case . deleteWebPage( let urlString) :
134+ Task {
135+ do {
136+ defer { send ( . setWebPageLoading( false ) ) }
137+ send ( . setWebPageLoading( true ) )
138+ try await deleteWebPageUseCase. execute ( urlString)
139+ let pages = try await fetchWebPagesUseCase. execute ( " " )
140+ send ( . fetchWebPages( pages. map { WebPageItem ( from: $0) } ) )
141+ } catch {
142+ send ( . setWebPageLoading( false ) )
114143 send ( . setAlert( isPresented: true , type: . error) )
115144 }
116145 }
117146 case . fetchPinnedTodos:
118147 Task {
119148 do {
120- defer { send ( . setLoading ( false ) ) }
121- send ( . setLoading ( true ) )
149+ defer { send ( . setPinnedLoading ( false ) ) }
150+ send ( . setPinnedLoading ( true ) )
122151 let todos = try await fetchPinnedTodosUseCase. execute ( )
123152 send ( . fetchPinnedTodos( todos. map { PinnedTodoItem ( from: $0) } ) )
124153 } catch {
125154 send ( . setAlert( isPresented: true , type: . error) )
126155 }
127156 }
157+ case . fetchWebPages:
158+ Task {
159+ do {
160+ defer { send ( . setWebPageLoading( false ) ) }
161+ send ( . setWebPageLoading( true ) )
162+ let pages = try await fetchWebPagesUseCase. execute ( " " )
163+ send ( . fetchWebPages( pages. map { WebPageItem ( from: $0) } ) )
164+ } catch {
165+ send ( . setAlert( isPresented: true , type: . error) )
166+ }
167+ }
128168 }
129169 }
130170}
@@ -161,7 +201,7 @@ private extension HomeViewModel {
161201 func reduceByView( _ action: Action , state: inout State ) -> [ SideEffect ] {
162202 switch action {
163203 case . onAppear:
164- return [ . fetchPinnedTodos]
204+ return [ . fetchPinnedTodos, . fetchWebPages ]
165205 case . updateSearching( let isSearching) :
166206 state. isSearching = isSearching
167207 case . updateSearchText( let text) :
@@ -175,6 +215,8 @@ private extension HomeViewModel {
175215 }
176216 setAlert ( & state, isPresented: false , type: nil )
177217 return [ . addWebPage( normalizedURL) ]
218+ case . deleteWebPage( let page) :
219+ return [ . deleteWebPage( page. url. absoluteString) ]
178220 default :
179221 break
180222 }
@@ -185,8 +227,14 @@ private extension HomeViewModel {
185227 switch action {
186228 case . fetchPinnedTodos( let todos) :
187229 state. pinnedTodos = todos
188- case . setLoading( let isLoading) :
189- state. isLoading = isLoading
230+ case . fetchWebPages( let pages) :
231+ state. webPages = pages
232+ case . setPinnedLoading( let isLoading) :
233+ state. isPinnedLoading = isLoading
234+ case . setWebPageLoading( let isLoading) :
235+ state. isWebPageLoading = isLoading
236+ case . setWebPageInputLoading( let isLoading) :
237+ state. isWebPageInputLoading = isLoading
190238 default :
191239 break
192240 }
0 commit comments