Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions Ruddarr/Utilities/Helpers.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
import Foundation
import CloudKit

struct SearchRequest: Equatable {
private let id = UUID()

let query: String
let isDebounced: Bool

init(query: String, isDebounced: Bool) {
self.query = query
self.isDebounced = isDebounced
}

func waitForDebounce() async -> Bool {
guard isDebounced else { return true }

try? await Task.sleep(for: .milliseconds(250))
return !Task.isCancelled
}
}

protocol OptionalProtocol {
associatedtype Wrapped
var wrappedValue: Wrapped? { get set }
Expand Down
22 changes: 9 additions & 13 deletions Ruddarr/Views/Movies/Search/MovieSearchView.swift
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import SwiftUI
import Combine

struct MovieSearchView: View {
@State var searchQuery: String
@State private var searchPresented: Bool = true
@State private var searchRequest: SearchRequest?

@Environment(RadarrInstance.self) private var instance

let searchTextPublisher = PassthroughSubject<String, Never>()

var body: some View {
@Bindable var discovery = Discovery.shared
@Bindable var movieLookup = instance.lookup
Expand Down Expand Up @@ -56,13 +54,13 @@ struct MovieSearchView: View {
await discovery.fetch(.movies)
}
.onSubmit(of: .search) {
searchTextPublisher.send(searchQuery)
performSearch()
}
.onChange(of: searchQuery, initial: true, handleSearchQueryChange)
.onReceive(
searchTextPublisher.debounce(for: .milliseconds(250), scheduler: DispatchQueue.main)
) { _ in
performSearch()
.task(id: searchRequest) {
guard let searchRequest, await searchRequest.waitForDebounce() else { return }

await instance.lookup.search(query: searchRequest.query)
}
.alert(
isPresented: instance.lookup.errorBinding,
Expand All @@ -81,10 +79,8 @@ struct MovieSearchView: View {
}
}

func performSearch() {
Task {
await instance.lookup.search(query: searchQuery)
}
func performSearch(debounced: Bool = false) {
searchRequest = SearchRequest(query: searchQuery, isDebounced: debounced)
}

func handleSearchQueryChange(oldQuery: String, newQuery: String) {
Expand All @@ -99,7 +95,7 @@ struct MovieSearchView: View {
} else if oldQuery == newQuery {
performSearch() // always perform initial search
} else {
searchTextPublisher.send(searchQuery)
performSearch(debounced: true)
}
}
}
Expand Down
22 changes: 9 additions & 13 deletions Ruddarr/Views/Series/Search/SeriesSearchView.swift
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import SwiftUI
import Combine

struct SeriesSearchView: View {
@State var searchQuery: String
@State private var searchPresented: Bool = true
@State private var searchRequest: SearchRequest?

@Environment(SonarrInstance.self) private var instance

let searchTextPublisher = PassthroughSubject<String, Never>()

var body: some View {
@Bindable var discovery = Discovery.shared
@Bindable var seriesLookup = instance.lookup
Expand Down Expand Up @@ -54,13 +52,13 @@ struct SeriesSearchView: View {
await discovery.fetch(.series)
}
.onSubmit(of: .search) {
searchTextPublisher.send(searchQuery)
performSearch()
}
.onChange(of: searchQuery, initial: true, handleSearchQueryChange)
.onReceive(
searchTextPublisher.debounce(for: .milliseconds(250), scheduler: DispatchQueue.main)
) { _ in
performSearch()
.task(id: searchRequest) {
guard let searchRequest, await searchRequest.waitForDebounce() else { return }

await instance.lookup.search(query: searchRequest.query)
}
.alert(
isPresented: instance.lookup.errorBinding,
Expand All @@ -79,10 +77,8 @@ struct SeriesSearchView: View {
}
}

func performSearch() {
Task { @MainActor in
await instance.lookup.search(query: searchQuery)
}
func performSearch(debounced: Bool = false) {
searchRequest = SearchRequest(query: searchQuery, isDebounced: debounced)
}

func handleSearchQueryChange(oldQuery: String, newQuery: String) {
Expand All @@ -97,7 +93,7 @@ struct SeriesSearchView: View {
} else if oldQuery == newQuery {
performSearch() // always perform initial search
} else {
searchTextPublisher.send(searchQuery)
performSearch(debounced: true)
}
}
}
Expand Down