@@ -57,6 +57,7 @@ final class TodoListViewModel: Store {
5757 case fetchSearchResults( [ TodoListItem ] )
5858 case didToggleCompleted( TodoListItem )
5959 case didTogglePinned( TodoListItem )
60+ case restoreTodo( TodoListItem , Int )
6061 case setLoading( Bool )
6162 case appendTodos( [ TodoListItem ] , nextCursor: TodoCursor ? )
6263 case resetPagination
@@ -68,7 +69,7 @@ final class TodoListViewModel: Store {
6869 case loadNextPage
6970 case search( String )
7071 case upsert( Todo )
71- case delete( String )
72+ case delete( TodoListItem , Int )
7273 case toggleCompleted( TodoListItem )
7374 case togglePinned( TodoListItem )
7475 }
@@ -124,8 +125,8 @@ final class TodoListViewModel: Store {
124125 case . confirmDelete, . onAppear, . loadNextPage, . setSearchText, . setToast, . upsertTodo:
125126 effects = reduceByView ( action, state: & state)
126127
127- case . setSearchQuery, . fetchSearchResults,
128- . didToggleCompleted , . didTogglePinned , . setLoading, . appendTodos, . resetPagination, . setHasMore:
128+ case . setSearchQuery, . fetchSearchResults, . didToggleCompleted , . didTogglePinned ,
129+ . restoreTodo , . setLoading, . appendTodos, . resetPagination, . setHasMore:
129130 effects = reduceByRun ( action, state: & state)
130131 }
131132
@@ -215,11 +216,12 @@ final class TodoListViewModel: Store {
215216 send ( . setAlert( true ) )
216217 }
217218 }
218- case . delete( let todoId ) :
219+ case . delete( let item , let index ) :
219220 Task {
220221 do {
221- try await deleteTodoUseCase. execute ( todoId )
222+ try await deleteTodoUseCase. execute ( item . id )
222223 } catch {
224+ send ( . restoreTodo( item, index) )
223225 send ( . setAlert( true ) )
224226 }
225227 }
@@ -247,6 +249,7 @@ private extension TodoListViewModel {
247249 pendingTask = ( todo, index)
248250 state. todos. remove ( at: index)
249251 setToast ( & state, isPresented: true )
252+ return [ . delete( todo, index) ]
250253 }
251254
252255 return effects
@@ -351,6 +354,18 @@ private extension TodoListViewModel {
351354 if let index = state. todos. firstIndex ( where: { $0. id == todo. id } ) {
352355 state. todos [ index] = todo
353356 }
357+ case . restoreTodo( let todo, let index) :
358+ if state. todos. contains ( where: { $0. id == todo. id } ) { break }
359+
360+ if index <= state. todos. count {
361+ state. todos. insert ( todo, at: index)
362+ } else {
363+ state. todos. append ( todo)
364+ }
365+
366+ if let ( pendingItem, _) = pendingTask, pendingItem. id == todo. id {
367+ pendingTask = nil
368+ }
354369 case . setLoading( let value) :
355370 state. isLoading = value
356371 case . appendTodos( let todos, let nextCursor) :
0 commit comments