summaryrefslogtreecommitdiff
path: root/Sora/Views/SearchSuggestionsView.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Sora/Views/SearchSuggestionsView.swift')
-rw-r--r--Sora/Views/SearchSuggestionsView.swift57
1 files changed, 44 insertions, 13 deletions
diff --git a/Sora/Views/SearchSuggestionsView.swift b/Sora/Views/SearchSuggestionsView.swift
index 2a1a8d6..244de49 100644
--- a/Sora/Views/SearchSuggestionsView.swift
+++ b/Sora/Views/SearchSuggestionsView.swift
@@ -1,29 +1,60 @@
import SwiftUI
struct SearchSuggestionsView: View {
- var tags: [BooruTag]
+ var items: [Either<BooruTag, BooruSearchQuery>]
@Binding var searchText: String
private var lastSearchTag: String {
String(searchText.split(separator: " ").last ?? "").lowercased()
}
- private var filteredTags: [BooruTag] {
+ private var filteredItems: [Either<BooruTag, BooruSearchQuery>] {
guard !lastSearchTag.isEmpty else { return [] }
- return tags.filter { $0.name.lowercased().contains(lastSearchTag) }
+ var seen = Set<String>()
+
+ return items.filter { item in
+ switch item {
+ case .left(let tag):
+ return tag.name.lowercased().contains(lastSearchTag)
+ && seen.insert(tag.name.lowercased()).inserted
+
+ case .right(let query):
+ let newTags = query.tags.filter { tag in
+ tag.lowercased().contains(lastSearchTag)
+ && seen.insert(tag.lowercased()).inserted
+ }
+
+ return !newTags.isEmpty
+ }
+ }
}
var body: some View {
- ForEach(
- tags.filter { tag in
- tag.name.lowercased().contains(lastSearchTag)
- }
- ) { suggestion in
- Button {
- if let range = searchText.range(of: lastSearchTag, options: .backwards) {
- searchText.replaceSubrange(range, with: suggestion.name)
+ ForEach(filteredItems, id: \.self) { item in
+ switch item {
+ case .left(let tag):
+ Button {
+ if let range = searchText.range(of: lastSearchTag, options: .backwards) {
+ searchText.replaceSubrange(range, with: tag.name)
+ }
+ } label: {
+ Text(tag.name)
+ }
+
+ case .right(let query):
+ Button {
+ if let range = searchText.range(of: lastSearchTag, options: .backwards),
+ let matchingTag = query.tags.first(where: { $0.lowercased().contains(lastSearchTag) })
+ {
+ searchText.replaceSubrange(range, with: matchingTag)
+ }
+ } label: {
+ if let matchingTag = query.tags.first(where: { $0.lowercased().contains(lastSearchTag) })
+ {
+ Text(matchingTag)
+ } else {
+ Text(query.tags.first ?? "")
+ }
}
- } label: {
- Text(suggestion.name)
}
}
}