Skip to content

Commit 82c3251

Browse files
committed
refactor: 불필요 액션 제거 및 pendingTask 대신 임시로 갖고있는 Todo의 id 형태로 최소화
1 parent 7d427e3 commit 82c3251

2 files changed

Lines changed: 12 additions & 21 deletions

File tree

DevLog/Presentation/ViewModel/TodoListViewModel.swift

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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 = []

DevLog/UI/Home/TodoListView.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,7 @@ struct TodoListView: View {
7171
set: { viewModel.send(.setToast(isPresented: $0)) }
7272
),
7373
duration: 5,
74-
action: { viewModel.send(.undoDelete) },
75-
onDismiss: { viewModel.send(.confirmDelete) }
74+
action: { viewModel.send(.undoDelete) }
7675
) {
7776
Label(viewModel.state.toastMessage, systemImage: "arrow.uturn.left")
7877
}

0 commit comments

Comments
 (0)