summaryrefslogtreecommitdiff
path: root/Sora/Views
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-06-12 06:06:02 -0700
committerFuwn <[email protected]>2025-06-12 06:06:02 -0700
commitbe4df8b17789aa881c85176dd07a07b621f0cde3 (patch)
tree2a822a49e403c9dcd18b0844591a864c83c22107 /Sora/Views
parentfeat: Development commit (diff)
downloadsora-testing-be4df8b17789aa881c85176dd07a07b621f0cde3.tar.xz
sora-testing-be4df8b17789aa881c85176dd07a07b621f0cde3.zip
feat: Development commit
Diffstat (limited to 'Sora/Views')
-rw-r--r--Sora/Views/SearchSuggestionsView.swift42
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 {