mirror of
https://github.com/cranci1/Sora.git
synced 2026-05-13 21:40:43 +00:00
fix double search bar bug when on liquid glass
This commit is contained in:
parent
a58be1bdfa
commit
d08b44bb30
1 changed files with 45 additions and 24 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue