diff options
Diffstat (limited to 'Sora/Views/SearchSuggestionsView.swift')
| -rw-r--r-- | Sora/Views/SearchSuggestionsView.swift | 57 |
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) } } } |