diff options
| author | Fuwn <[email protected]> | 2025-06-12 06:06:02 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-06-12 06:06:02 -0700 |
| commit | be4df8b17789aa881c85176dd07a07b621f0cde3 (patch) | |
| tree | 2a822a49e403c9dcd18b0844591a864c83c22107 /Sora/Views | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-be4df8b17789aa881c85176dd07a07b621f0cde3.tar.xz sora-testing-be4df8b17789aa881c85176dd07a07b621f0cde3.zip | |
feat: Development commit
Diffstat (limited to 'Sora/Views')
| -rw-r--r-- | Sora/Views/SearchSuggestionsView.swift | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/Sora/Views/SearchSuggestionsView.swift b/Sora/Views/SearchSuggestionsView.swift index 244de49..2f2d572 100644 --- a/Sora/Views/SearchSuggestionsView.swift +++ b/Sora/Views/SearchSuggestionsView.swift @@ -3,29 +3,51 @@ import SwiftUI struct SearchSuggestionsView: View { var items: [Either<BooruTag, BooruSearchQuery>] @Binding var searchText: String + private var lastSearchTag: String { String(searchText.split(separator: " ").last ?? "").lowercased() } + private var filteredItems: [Either<BooruTag, BooruSearchQuery>] { - guard !lastSearchTag.isEmpty else { return [] } + let matchCanidateTag = lastSearchTag + let matchingTagsLimit = 50 + + guard !matchCanidateTag.isEmpty else { return [] } + + var seenTags = Set<String>() + var matchingTags: [Either<BooruTag, BooruSearchQuery>] = [] - var seen = Set<String>() + matchingTags.reserveCapacity(matchingTagsLimit) + + for item in items { + if matchingTags.count >= matchingTagsLimit { break } - return items.filter { item in switch item { case .left(let tag): - return tag.name.lowercased().contains(lastSearchTag) - && seen.insert(tag.name.lowercased()).inserted + let lowercasedName = tag.name.lowercased() - case .right(let query): - let newTags = query.tags.filter { tag in - tag.lowercased().contains(lastSearchTag) - && seen.insert(tag.lowercased()).inserted + if lowercasedName.contains(matchCanidateTag), + seenTags.insert(lowercasedName).inserted + { + matchingTags.append(item) } - return !newTags.isEmpty + case .right(let query): + for tagName in query.tags { + let lowercasedTagName = tagName.lowercased() + + if lowercasedTagName.contains(matchCanidateTag), + seenTags.insert(lowercasedTagName).inserted + { + matchingTags.append(item) + + break + } + } } } + + return matchingTags } var body: some View { |