Ferrite-backup/Ferrite/Views/ContentView.swift
kingbri 44e4f74258 Searching: Cleanup existing searches
If a user searched after cancelling the search the first time,
the first search would still continue.

Assign the search task to navigation view and automatically cancel
it and dismiss the searchbar when the user switches to a different
tab.

Also add a ProgressView to show which source is being parsed.

Signed-off-by: kingbri <bdashore3@gmail.com>
2022-08-09 12:29:18 -04:00

106 lines
3.2 KiB
Swift

//
// ContentView.swift
// Ferrite
//
// Created by Brian Dashore on 7/1/22.
//
import SwiftUI
struct ContentView: View {
@EnvironmentObject var scrapingModel: ScrapingViewModel
@EnvironmentObject var debridManager: DebridManager
@EnvironmentObject var navModel: NavigationViewModel
@AppStorage("RealDebrid.Enabled") var realDebridEnabled = false
@FetchRequest(
entity: Source.entity(),
sortDescriptors: []
) var sources: FetchedResults<Source>
@State private var selectedSource: Source? {
didSet {
scrapingModel.filteredSource = selectedSource
}
}
var body: some View {
NavView {
VStack(spacing: 10) {
HStack {
Text("Filter")
.foregroundColor(.secondary)
Menu {
Button {
selectedSource = nil
} label: {
Text("None")
if selectedSource == nil {
Image(systemName: "checkmark")
}
}
ForEach(sources, id: \.self) { source in
if let name = source.name, source.enabled {
Button {
selectedSource = source
} label: {
Text(name)
if selectedSource == source {
Image(systemName: "checkmark")
}
}
}
}
} label: {
Text(selectedSource?.name ?? "Source")
.padding(.trailing, -3)
Image(systemName: "chevron.down")
}
.foregroundColor(.primary)
Spacer()
}
.padding(.horizontal, 20)
SearchResultsView()
}
.searchable(text: $scrapingModel.searchText)
.onSubmit(of: .search) {
scrapingModel.runningSearchTask = Task {
navModel.showSearchProgress = true
await scrapingModel.scanSources(sources: sources.compactMap { $0 })
if realDebridEnabled {
await debridManager.populateDebridHashes(scrapingModel.searchResults)
}
navModel.showSearchProgress = false
}
}
.navigationTitle("Search")
}
.sheet(item: $navModel.currentChoiceSheet) { item in
Group {
switch item {
case .magnet:
MagnetChoiceView()
case .batch:
BatchChoiceView()
}
}
.tint(.primary)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}