File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -146,8 +146,13 @@ final class TodoService {
146146 let snapshot = try await firestoreQuery. getDocuments ( )
147147 let todos = snapshot. documents. compactMap { makeResponse ( from: $0) }
148148
149+ let todoNumber = searchedTodoNumber ( from: trimmedKeyword)
149150 let filtered = todos. filter { todo in
150- todo. title. localizedCaseInsensitiveContains ( trimmedKeyword)
151+ if let todoNumber, todo. number == todoNumber {
152+ return true
153+ }
154+
155+ return todo. title. localizedCaseInsensitiveContains ( trimmedKeyword)
151156 || todo. content. localizedCaseInsensitiveContains ( trimmedKeyword)
152157 || todo. tags. contains { $0. localizedCaseInsensitiveContains ( trimmedKeyword) }
153158 }
@@ -483,6 +488,19 @@ private extension TodoService {
483488 )
484489 }
485490
491+ func searchedTodoNumber( from keyword: String ) -> Int ? {
492+ guard keyword. hasPrefix ( " # " ) else {
493+ return nil
494+ }
495+
496+ let numberText = String ( keyword. dropFirst ( ) )
497+ guard !numberText. isEmpty, numberText. allSatisfy ( \. isNumber) else {
498+ return nil
499+ }
500+
501+ return Int ( numberText)
502+ }
503+
486504 enum TodoFieldKey : String {
487505 case id
488506 case isPinned
Original file line number Diff line number Diff line change @@ -137,12 +137,16 @@ final class SearchViewModel: Store {
137137 do {
138138 send ( . setLoading( true ) )
139139 defer { send ( . setLoading( false ) ) }
140+ let searchesTodoOnly = searchesTodoOnly ( query)
140141 async let todos = fetchTodosUseCase. execute ( TodoQuery ( keyword: query) , cursor: nil )
141- async let webPages = fetchWebPagesUseCase. execute ( query)
142+ async let webPageItems = fetchWebPageItems (
143+ query: query,
144+ searchesTodoOnly: searchesTodoOnly
145+ )
142146 let todoItems = try await todos. items. compactMap { TodoListItem ( from: $0) }
143- let webPageItems = try await webPages . map { WebPageItem ( from : $0 ) }
147+ let resolvedWebPageItems = try await webPageItems
144148 send ( . fetchTodos( todoItems) )
145- send ( . fetchWebPage( webPageItems ) )
149+ send ( . fetchWebPage( resolvedWebPageItems ) )
146150 } catch {
147151 send ( . setAlert( true ) )
148152 }
@@ -178,6 +182,22 @@ private extension SearchViewModel {
178182 searchDebounceTask = nil
179183 }
180184
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+
181201 func saveRecentQueries( _ queries: OrderedSet < String > ) {
182202 updateRecentSearchQueriesUseCase. execute ( Array ( queries) )
183203 }
Original file line number Diff line number Diff line change 14951495 "en" : {
14961496 "stringUnit" : {
14971497 "state" : "translated",
1498- "value" : "Search"
1498+ "value" : "Search (e.g. #123) "
14991499 }
15001500 },
15011501 "ko" : {
15021502 "stringUnit" : {
15031503 "state" : "translated",
1504- "value" : "검색"
1504+ "value" : "검색 (예: #123) "
15051505 }
15061506 }
15071507 }
29502950 "en" : {
29512951 "stringUnit" : {
29522952 "state" : "translated",
2953- "value" : "Search %1$@"
2953+ "value" : "Search %1$@ (e.g. #123) "
29542954 }
29552955 },
29562956 "ko" : {
29572957 "stringUnit" : {
29582958 "state" : "translated",
2959- "value" : "%1$@ 검색"
2959+ "value" : "%1$@ 검색 (예: #123) "
29602960 }
29612961 }
29622962 }
33673367 }
33683368 },
33693369 "version" : "1.0"
3370- }
3370+ }
You can’t perform that action at this time.
0 commit comments