mirror of
https://github.com/yattee/yattee.git
synced 2026-07-20 14:22:02 +00:00
Fix recent search tap showing suggestions instead of results on macOS Sequoia
Tapping a recent search (or suggestion, or opening a query deep link) mutates the searchable text, which fires the onChange handler that clears results and re-fetches suggestions. That raced against the search Task started by the same tap: on Sequoia the onChange settled last, cancelling the in-flight search and leaving suggestions visible instead of results. Suppress the onChange-driven suggestion fetch for the single programmatic text mutation via a one-shot flag, so the execute paths go straight to results regardless of onChange-vs-Task ordering. Manual typing is unaffected.
This commit is contained in:
@@ -35,6 +35,11 @@ struct SearchView: View {
|
|||||||
@State private var showViewOptions = false
|
@State private var showViewOptions = false
|
||||||
@State private var isSearchHistoryExpanded = false
|
@State private var isSearchHistoryExpanded = false
|
||||||
|
|
||||||
|
/// Suppresses the next onChange suggestion-fetch when the search text is set
|
||||||
|
/// programmatically (recent search / suggestion tap / deep link), so it goes
|
||||||
|
/// straight to results instead of re-showing suggestions.
|
||||||
|
@State private var suppressNextTextChangeSearch = false
|
||||||
|
|
||||||
@AppStorage("searchFilters") private var savedFiltersData: Data?
|
@AppStorage("searchFilters") private var savedFiltersData: Data?
|
||||||
|
|
||||||
// Persisted search instance selection
|
// Persisted search instance selection
|
||||||
@@ -111,6 +116,10 @@ struct SearchView: View {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
.onChange(of: searchTextBinding.wrappedValue) { _, newValue in
|
.onChange(of: searchTextBinding.wrappedValue) { _, newValue in
|
||||||
|
if suppressNextTextChangeSearch {
|
||||||
|
suppressNextTextChangeSearch = false
|
||||||
|
return
|
||||||
|
}
|
||||||
if newValue.isEmpty {
|
if newValue.isEmpty {
|
||||||
searchViewModel?.clearResults() // Clear everything when empty
|
searchViewModel?.clearResults() // Clear everything when empty
|
||||||
searchViewModel?.filters = .defaults
|
searchViewModel?.filters = .defaults
|
||||||
@@ -127,6 +136,7 @@ struct SearchView: View {
|
|||||||
.task(id: initialQuery) {
|
.task(id: initialQuery) {
|
||||||
// Auto-execute search when opened with an initial query
|
// Auto-execute search when opened with an initial query
|
||||||
if let query = initialQuery, !query.isEmpty, searchTextBinding.wrappedValue.isEmpty {
|
if let query = initialQuery, !query.isEmpty, searchTextBinding.wrappedValue.isEmpty {
|
||||||
|
suppressNextTextChangeSearch = true
|
||||||
searchTextBinding.wrappedValue = query
|
searchTextBinding.wrappedValue = query
|
||||||
searchViewModel?.cancelSuggestions()
|
searchViewModel?.cancelSuggestions()
|
||||||
searchViewModel?.filters.type = .video
|
searchViewModel?.filters.type = .video
|
||||||
@@ -914,6 +924,7 @@ struct SearchView: View {
|
|||||||
ForEach(vm.suggestions, id: \.self) { suggestion in
|
ForEach(vm.suggestions, id: \.self) { suggestion in
|
||||||
Button {
|
Button {
|
||||||
dismissKeyboard()
|
dismissKeyboard()
|
||||||
|
suppressNextTextChangeSearch = (suggestion != searchTextBinding.wrappedValue)
|
||||||
searchTextBinding.wrappedValue = suggestion
|
searchTextBinding.wrappedValue = suggestion
|
||||||
vm.cancelSuggestions()
|
vm.cancelSuggestions()
|
||||||
vm.filters.type = .video
|
vm.filters.type = .video
|
||||||
@@ -1366,6 +1377,7 @@ struct SearchView: View {
|
|||||||
|
|
||||||
private func executeSearch(_ query: String) {
|
private func executeSearch(_ query: String) {
|
||||||
dismissKeyboard()
|
dismissKeyboard()
|
||||||
|
suppressNextTextChangeSearch = (query != searchTextBinding.wrappedValue)
|
||||||
searchTextBinding.wrappedValue = query
|
searchTextBinding.wrappedValue = query
|
||||||
searchViewModel?.cancelSuggestions()
|
searchViewModel?.cancelSuggestions()
|
||||||
searchViewModel?.filters.type = .video
|
searchViewModel?.filters.type = .video
|
||||||
|
|||||||
Reference in New Issue
Block a user