Skip to content

Commit 3160f01

Browse files
committed
fix: 검색 로딩 상태 반영이 누락되던 문제 수정
1 parent d30b015 commit 3160f01

2 files changed

Lines changed: 22 additions & 9 deletions

File tree

DevLog/Presentation/ViewModel/SearchViewModel.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ final class SearchViewModel: Store {
4040
}
4141

4242
enum SideEffect {
43+
case cancelSearch
44+
case debounceFetch(String)
4345
case fetch(String)
4446
}
4547

@@ -103,20 +105,21 @@ final class SearchViewModel: Store {
103105
state.isLoading = isLoading
104106
case .setSearching(let isSearching):
105107
state.isSearching = isSearching
108+
if !isSearching {
109+
effects = [.cancelSearch]
110+
}
106111
case .setSearchQuery(let query):
107112
guard state.searchQuery != query else { return [] }
108113
state.searchQuery = query
109114
state.showAllTodos = false
110115
state.showAllWebPages = false
111116
let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines)
112117
if trimmed.isEmpty {
113-
cancelSearch()
114118
state.webPages = []
115119
state.todos = []
120+
effects = [.cancelSearch]
116121
} else {
117-
cancelSearch()
118-
beginLoading(.immediate)
119-
scheduleDebouncedFetch(trimmed)
122+
effects = [.cancelSearch, .debounceFetch(trimmed)]
120123
}
121124
case .applySearchQuery(let query):
122125
effects = [.fetch(query)]
@@ -132,6 +135,11 @@ final class SearchViewModel: Store {
132135

133136
func run(_ effect: SideEffect) {
134137
switch effect {
138+
case .cancelSearch:
139+
cancelSearch()
140+
case .debounceFetch(let query):
141+
beginLoading(.immediate)
142+
scheduleDebouncedFetch(query)
135143
case .fetch(let query):
136144
searchTasks[.request]?.cancel()
137145
let requestTask = Task { [weak self] in

DevLog/Presentation/ViewModel/TodoListViewModel.swift

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ final class TodoListViewModel: Store {
6464
}
6565

6666
enum SideEffect {
67+
case cancelSearch
68+
case debounceSearch(String)
6769
case fetch
6870
case loadNextPage
6971
case search(String)
@@ -146,6 +148,11 @@ final class TodoListViewModel: Store {
146148
// swiftlint:disable function_body_length
147149
func run(_ effect: SideEffect) {
148150
switch effect {
151+
case .cancelSearch:
152+
cancelSearch()
153+
case .debounceSearch(let keyword):
154+
beginLoading(.immediate)
155+
scheduleDebouncedSearch(keyword)
149156
case .fetch:
150157
beginLoading(.delayed)
151158
Task {
@@ -312,10 +319,10 @@ private extension TodoListViewModel {
312319
case .setIsSearching(let value):
313320
state.isSearching = value
314321
if !value {
315-
cancelSearch()
316322
state.searchText = ""
317323
state.searchResults = []
318324
state.showAllSearchResults = false
325+
return [.cancelSearch]
319326
}
320327
case .setShowAllSearchResults(let value):
321328
state.showAllSearchResults = value
@@ -346,12 +353,10 @@ private extension TodoListViewModel {
346353
state.showAllSearchResults = false
347354
let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines)
348355
if trimmed.isEmpty {
349-
cancelSearch()
350356
state.searchResults = []
357+
return [.cancelSearch]
351358
} else {
352-
cancelSearch()
353-
beginLoading(.immediate)
354-
scheduleDebouncedSearch(trimmed)
359+
return [.cancelSearch, .debounceSearch(trimmed)]
355360
}
356361
case .setToast(let isPresented):
357362
setToast(&state, isPresented: isPresented)

0 commit comments

Comments
 (0)