@@ -81,7 +81,7 @@ final class HomeViewModel: Store {
8181 case searchView
8282 }
8383
84- enum LoadingTarget {
84+ enum LoadingTarget : Hashable {
8585 case recentTodos
8686 case webPage
8787 case overlay
@@ -94,6 +94,7 @@ final class HomeViewModel: Store {
9494 private let undoDeleteWebPageUseCase : UndoDeleteWebPageUseCase
9595 private let fetchTodosUseCase : FetchTodosUseCase
9696 private let fetchWebPagesUseCase : FetchWebPagesUseCase
97+ private let loadingState = LoadingState ( )
9798 private var deletedWebPageURLString : String ?
9899
99100 init (
@@ -133,10 +134,10 @@ final class HomeViewModel: Store {
133134 func run( _ effect: SideEffect ) {
134135 switch effect {
135136 case . addTodo( let todo) :
137+ beginLoading ( for: . overlay, mode: . delayed)
136138 Task {
137139 do {
138- defer { send ( . setLoading( . overlay, false ) ) }
139- send ( . setLoading( . overlay, true ) )
140+ defer { endLoading ( for: . overlay, mode: . delayed) }
140141 try await upsertTodoUseCase. execute ( todo)
141142 let page = try await fetchRecentTodos ( )
142143 let items = page. items
@@ -149,10 +150,10 @@ final class HomeViewModel: Store {
149150 }
150151 }
151152 case . fetchRecentTodos:
153+ beginLoading ( for: . recentTodos, mode: . immediate)
152154 Task {
153155 do {
154- defer { send ( . setLoading( . recentTodos, false ) ) }
155- send ( . setLoading( . recentTodos, true ) )
156+ defer { endLoading ( for: . recentTodos, mode: . immediate) }
156157 let page = try await fetchRecentTodos ( )
157158 let items = page. items
158159 . filter { $0. createdAt != $0. updatedAt }
@@ -164,10 +165,10 @@ final class HomeViewModel: Store {
164165 }
165166 }
166167 case . addWebPage( let urlString) :
168+ beginLoading ( for: . overlay, mode: . delayed)
167169 Task {
168170 do {
169- defer { send ( . setLoading( . overlay, false ) ) }
170- send ( . setLoading( . overlay, true ) )
171+ defer { endLoading ( for: . overlay, mode: . delayed) }
171172 try await addWebPageUseCase. execute ( urlString)
172173 let pages = try await fetchWebPagesUseCase. execute ( " " )
173174 send ( . updateWebPages( pages. map { WebPageItem ( from: $0) } ) )
@@ -176,20 +177,20 @@ final class HomeViewModel: Store {
176177 }
177178 }
178179 case . deleteWebPage( let page, let index) :
180+ beginLoading ( for: . webPage, mode: . delayed)
179181 Task {
180182 do {
181- defer { send ( . setLoading( . webPage, false ) ) }
182- send ( . setLoading( . webPage, true ) )
183+ defer { endLoading ( for: . webPage, mode: . delayed) }
183184 try await deleteWebPageUseCase. execute ( page. url. absoluteString)
184185 } catch {
185186 send ( . restoreWebPage( page, index) )
186187 send ( . setAlert( isPresented: true , type: . error) )
187188 }
188189 }
189190 case . undoDeleteWebPage( let urlString) :
191+ beginLoading ( for: . webPage, mode: . delayed)
190192 Task {
191- defer { send ( . setLoading( . webPage, false ) ) }
192- send ( . setLoading( . webPage, true ) )
193+ defer { endLoading ( for: . webPage, mode: . delayed) }
193194
194195 var shouldPresentError = false
195196
@@ -211,10 +212,10 @@ final class HomeViewModel: Store {
211212 }
212213 }
213214 case . fetchWebPages:
215+ beginLoading ( for: . webPage, mode: . immediate)
214216 Task {
215217 do {
216- defer { send ( . setLoading( . webPage, false ) ) }
217- send ( . setLoading( . webPage, true ) )
218+ defer { endLoading ( for: . webPage, mode: . immediate) }
218219 let pages = try await fetchWebPagesUseCase. execute ( " " )
219220 send ( . updateWebPages( pages. map { WebPageItem ( from: $0) } ) )
220221 } catch {
@@ -411,4 +412,22 @@ private extension HomeViewModel {
411412 cursor: nil
412413 )
413414 }
415+
416+ private func beginLoading(
417+ for target: LoadingTarget ,
418+ mode: LoadingState . Mode
419+ ) {
420+ loadingState. begin ( target: target, mode: mode) { [ weak self] target, isLoading in
421+ self ? . send ( . setLoading( target, isLoading) )
422+ }
423+ }
424+
425+ private func endLoading(
426+ for target: LoadingTarget ,
427+ mode: LoadingState . Mode
428+ ) {
429+ loadingState. end ( target: target, mode: mode) { [ weak self] target, isLoading in
430+ self ? . send ( . setLoading( target, isLoading) )
431+ }
432+ }
414433}
0 commit comments