@@ -70,6 +70,7 @@ final class TodoListViewModel: Store {
7070 case search( String )
7171 case upsert( Todo )
7272 case delete( TodoListItem , Int )
73+ case undoDelete( String )
7374 case toggleCompleted( TodoListItem )
7475 case togglePinned( TodoListItem )
7576 }
@@ -81,6 +82,7 @@ final class TodoListViewModel: Store {
8182 private let fetchTodoByIdUseCase : FetchTodoByIdUseCase
8283 private let upsertTodoUseCase : UpsertTodoUseCase
8384 private let deleteTodoUseCase : DeleteTodoUseCase
85+ private let undoDeleteTodoUseCase : UndoDeleteTodoUseCase
8486 private var pendingTask : ( TodoListItem , Int ) ?
8587 private var nextCursor : TodoCursor ?
8688
@@ -89,12 +91,14 @@ final class TodoListViewModel: Store {
8991 fetchTodoByIdUseCase: FetchTodoByIdUseCase ,
9092 upsertTodoUseCase: UpsertTodoUseCase ,
9193 deleteTodoUseCase: DeleteTodoUseCase ,
94+ undoDeleteTodoUseCase: UndoDeleteTodoUseCase ,
9295 kind: TodoKind
9396 ) {
9497 self . fetchTodosUseCase = fetchTodosUseCase
9598 self . fetchTodoByIdUseCase = fetchTodoByIdUseCase
9699 self . upsertTodoUseCase = upsertTodoUseCase
97100 self . deleteTodoUseCase = deleteTodoUseCase
101+ self . undoDeleteTodoUseCase = undoDeleteTodoUseCase
98102 self . state = State (
99103 kind: kind,
100104 query: TodoQuery ( kind: kind)
@@ -225,6 +229,15 @@ final class TodoListViewModel: Store {
225229 send ( . setAlert( true ) )
226230 }
227231 }
232+ case . undoDelete( let todoId) :
233+ Task {
234+ do {
235+ try await undoDeleteTodoUseCase. execute ( todoId)
236+ } catch {
237+ send ( . setAlert( true ) )
238+ send ( . refresh)
239+ }
240+ }
228241 }
229242 }
230243}
@@ -240,19 +253,12 @@ private extension TodoListViewModel {
240253 case . setShowEditor( let value) :
241254 state. showEditor = value
242255 case . swipeTodo( let todo) :
243- var effects : [ SideEffect ] = [ ]
244- if let ( pendingItem, _) = pendingTask {
245- effects = [ . delete( pendingItem. id) ]
246- }
247-
248256 if let index = state. todos. firstIndex ( where: { $0. id == todo. id } ) {
249257 pendingTask = ( todo, index)
250258 state. todos. remove ( at: index)
251259 setToast ( & state, isPresented: true )
252260 return [ . delete( todo, index) ]
253261 }
254-
255- return effects
256262 case . setSortTarget( let target) :
257263 state. query. sortTarget = target
258264 self . nextCursor = nil
@@ -293,6 +299,7 @@ private extension TodoListViewModel {
293299 state. todos. insert ( todo, at: index)
294300 }
295301 pendingTask = nil
302+ return [ . undoDelete( todo. id) ]
296303 default :
297304 break
298305 }
@@ -302,11 +309,7 @@ private extension TodoListViewModel {
302309 func reduceByView( _ action: Action , state: inout State ) -> [ SideEffect ] {
303310 switch action {
304311 case . confirmDelete:
305- guard let ( item, _) = pendingTask else {
306- return [ ]
307- }
308312 pendingTask = nil
309- return [ . delete( item. id) ]
310313 case . onAppear:
311314 return [ . fetch]
312315 case . loadNextPage:
0 commit comments