@@ -107,6 +107,7 @@ final class SearchViewModel: Store {
107107 cancelDebounce ( )
108108 state. webPages = [ ]
109109 state. todos = [ ]
110+ state. isLoading = false
110111 } else {
111112 state. isLoading = true
112113 scheduleDebouncedQuery ( query)
@@ -136,12 +137,16 @@ final class SearchViewModel: Store {
136137 do {
137138 send ( . setLoading( true ) )
138139 defer { send ( . setLoading( false ) ) }
140+ let searchesTodoOnly = searchesTodoOnly ( query)
139141 async let todos = fetchTodosUseCase. execute ( TodoQuery ( keyword: query) , cursor: nil )
140- async let webPages = fetchWebPagesUseCase. execute ( query)
142+ async let webPageItems = fetchWebPageItems (
143+ query: query,
144+ searchesTodoOnly: searchesTodoOnly
145+ )
141146 let todoItems = try await todos. items. compactMap { TodoListItem ( from: $0) }
142- let webPageItems = try await webPages . map { WebPageItem ( from : $0 ) }
147+ let resolvedWebPageItems = try await webPageItems
143148 send ( . fetchTodos( todoItems) )
144- send ( . fetchWebPage( webPageItems ) )
149+ send ( . fetchWebPage( resolvedWebPageItems ) )
145150 } catch {
146151 send ( . setAlert( true ) )
147152 }
@@ -177,6 +182,22 @@ private extension SearchViewModel {
177182 searchDebounceTask = nil
178183 }
179184
185+ func searchesTodoOnly( _ query: String ) -> Bool {
186+ query. trimmingCharacters ( in: . whitespacesAndNewlines) . hasPrefix ( " # " )
187+ }
188+
189+ func fetchWebPageItems(
190+ query: String ,
191+ searchesTodoOnly: Bool
192+ ) async throws -> [ WebPageItem ] {
193+ if searchesTodoOnly {
194+ return [ ]
195+ }
196+
197+ let webPages = try await fetchWebPagesUseCase. execute ( query)
198+ return webPages. map { WebPageItem ( from: $0) }
199+ }
200+
180201 func saveRecentQueries( _ queries: OrderedSet < String > ) {
181202 updateRecentSearchQueriesUseCase. execute ( Array ( queries) )
182203 }
0 commit comments