fix double search bar bug when on liquid glass

This commit is contained in:
686udjie 2025-11-28 02:26:57 +02:00
parent a58be1bdfa
commit d08b44bb30

View file

@ -40,6 +40,7 @@ struct SearchView: View {
@State private var saveDebounceTimer: Timer? @State private var saveDebounceTimer: Timer?
@State private var searchDebounceTimer: Timer? @State private var searchDebounceTimer: Timer?
@State private var isActive: Bool = false @State private var isActive: Bool = false
@State private var currentSearchTask: Task<Void, Never>?
init(searchQuery: Binding<String>) { init(searchQuery: Binding<String>) {
self._searchQuery = searchQuery self._searchQuery = searchQuery
@ -247,37 +248,57 @@ struct SearchView: View {
isSearchFieldFocused = false isSearchFieldFocused = false
currentSearchTask?.cancel()
currentSearchTask = nil
isSearching = true isSearching = true
hasNoResults = false hasNoResults = false
searchItems = [] searchItems = []
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { currentSearchTask = Task {
Task { do {
do { try await Task.sleep(nanoseconds: 500_000_000) // 0.5 seconds
let jsContent = try moduleManager.getModuleContent(module) guard !Task.isCancelled else { return }
jsController.loadScript(jsContent)
if module.metadata.asyncJS == true { let jsContent = try moduleManager.getModuleContent(module)
jsController.fetchJsSearchResults(keyword: searchQuery, module: module) { items in jsController.loadScript(jsContent)
DispatchQueue.main.async {
searchItems = items guard !Task.isCancelled else { return }
hasNoResults = items.isEmpty
isSearching = false if module.metadata.asyncJS == true {
} jsController.fetchJsSearchResults(keyword: searchQuery, module: module) { items in
} guard !Task.isCancelled else { return }
} else { DispatchQueue.main.async {
jsController.fetchSearchResults(keyword: searchQuery, module: module) { items in let uniqueItems = items.reduce(into: [String: SearchItem]()) { dict, item in
DispatchQueue.main.async { dict[item.href] = item
searchItems = items }.values
hasNoResults = items.isEmpty searchItems = Array(uniqueItems)
isSearching = false hasNoResults = uniqueItems.isEmpty
} isSearching = false
currentSearchTask = nil
} }
} }
} catch { } else {
jsController.fetchSearchResults(keyword: searchQuery, module: module) { items in
guard !Task.isCancelled else { return }
DispatchQueue.main.async {
let uniqueItems = items.reduce(into: [String: SearchItem]()) { dict, item in
dict[item.href] = item
}.values
searchItems = Array(uniqueItems)
hasNoResults = uniqueItems.isEmpty
isSearching = false
currentSearchTask = nil
}
}
}
} catch {
if !Task.isCancelled {
Logger.shared.log("Error loading module: \(error)", type: "Error") Logger.shared.log("Error loading module: \(error)", type: "Error")
DispatchQueue.main.async { DispatchQueue.main.async {
isSearching = false isSearching = false
hasNoResults = true hasNoResults = true
currentSearchTask = nil
} }
} }
} }