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>
106 lines
3.2 KiB
Swift
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()
|
|
}
|
|
}
|