Skip to content

Commit 0134a9d

Browse files
committed
feat: 삭제 실패 시 복원하는 로직 추가
1 parent dbbf2e9 commit 0134a9d

1 file changed

Lines changed: 20 additions & 5 deletions

File tree

DevLog/Presentation/ViewModel/TodoListViewModel.swift

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)