@@ -45,7 +45,6 @@ final class TodoListViewModel: Store {
4545 case undoDelete
4646
4747 // View
48- case confirmDelete
4948 case onAppear
5049 case loadNextPage
5150 case setSearchText( String )
@@ -83,7 +82,7 @@ final class TodoListViewModel: Store {
8382 private let upsertTodoUseCase : UpsertTodoUseCase
8483 private let deleteTodoUseCase : DeleteTodoUseCase
8584 private let undoDeleteTodoUseCase : UndoDeleteTodoUseCase
86- private var pendingTask : ( TodoListItem , Int ) ?
85+ private var undoDeleteTodoId : String ?
8786 private var nextCursor : TodoCursor ?
8887
8988 init (
@@ -126,7 +125,7 @@ final class TodoListViewModel: Store {
126125 . setShowAllSearchResults, . tapToggleCompleted, . tapTogglePinned, . undoDelete:
127126 effects = reduceByUser ( action, state: & state)
128127
129- case . confirmDelete , . onAppear, . loadNextPage, . setSearchText, . setToast, . upsertTodo:
128+ case . onAppear, . loadNextPage, . setSearchText, . setToast, . upsertTodo:
130129 effects = reduceByView ( action, state: & state)
131130
132131 case . setSearchQuery, . fetchSearchResults, . didToggleCompleted, . didTogglePinned,
@@ -254,7 +253,7 @@ private extension TodoListViewModel {
254253 state. showEditor = value
255254 case . swipeTodo( let todo) :
256255 if let index = state. todos. firstIndex ( where: { $0. id == todo. id } ) {
257- pendingTask = ( todo, index )
256+ undoDeleteTodoId = todo. id
258257 state. todos. remove ( at: index)
259258 setToast ( & state, isPresented: true )
260259 return [ . delete( todo, index) ]
@@ -294,9 +293,9 @@ private extension TodoListViewModel {
294293 case . tapTogglePinned( let todo) :
295294 return [ . togglePinned( todo) ]
296295 case . undoDelete:
297- guard let ( todo , _ ) = pendingTask else { return [ ] }
298- pendingTask = nil
299- return [ . undoDelete( todo . id ) ]
296+ guard let undoDeleteTodoId else { return [ ] }
297+ self . undoDeleteTodoId = nil
298+ return [ . undoDelete( undoDeleteTodoId ) ]
300299 default :
301300 break
302301 }
@@ -305,12 +304,10 @@ private extension TodoListViewModel {
305304
306305 func reduceByView( _ action: Action , state: inout State ) -> [ SideEffect ] {
307306 switch action {
308- case . confirmDelete:
309- pendingTask = nil
310307 case . onAppear:
311308 return [ . fetch]
312309 case . loadNextPage:
313- guard state. hasMore, !state. isLoading, pendingTask == nil else { return [ ] }
310+ guard state. hasMore, !state. isLoading else { return [ ] }
314311 return [ . loadNextPage]
315312 case . setSearchText( let text) :
316313 guard state. searchText != text else { return [ ] }
@@ -327,6 +324,7 @@ private extension TodoListViewModel {
327324 }
328325 case . setToast( let isPresented) :
329326 setToast ( & state, isPresented: isPresented)
327+ if !isPresented { undoDeleteTodoId = nil }
330328 case . upsertTodo( let todo) :
331329 return [ . upsert( todo) ]
332330 default :
@@ -363,19 +361,13 @@ private extension TodoListViewModel {
363361 state. todos. append ( todo)
364362 }
365363
366- if let ( pendingItem , _ ) = pendingTask , pendingItem . id == todo. id {
367- pendingTask = nil
364+ if undoDeleteTodoId == todo. id {
365+ undoDeleteTodoId = nil
368366 }
369367 case . setLoading( let value) :
370368 state. isLoading = value
371369 case . appendTodos( let todos, let nextCursor) :
372- let filteredTodos : [ TodoListItem ]
373- if let ( pendingItem, _) = pendingTask {
374- filteredTodos = todos. filter { $0. id != pendingItem. id }
375- } else {
376- filteredTodos = todos
377- }
378- state. todos. append ( contentsOf: filteredTodos)
370+ state. todos. append ( contentsOf: todos)
379371 self . nextCursor = nextCursor
380372 case . resetPagination:
381373 state. todos = [ ]
0 commit comments