Plugin entries were not syncing properly inside the plugins view. Instead of adding events to update filtered lists, make it so that these filtered lists are updated on state changes. This is the intended method of reactive programming and removes complexity from filtering logic. Signed-off-by: kingbri <bdashore3@proton.me>
78 lines
2.9 KiB
Swift
78 lines
2.9 KiB
Swift
//
|
|
// SourceListView.swift
|
|
// Ferrite
|
|
//
|
|
// Created by Brian Dashore on 7/24/22.
|
|
//
|
|
import SwiftUI
|
|
|
|
struct PluginListView<P: Plugin, PJ: PluginJson>: View {
|
|
@EnvironmentObject var pluginManager: PluginManager
|
|
@EnvironmentObject var navModel: NavigationViewModel
|
|
|
|
let backgroundContext = PersistenceController.shared.backgroundContext
|
|
|
|
@AppStorage("Behavior.AutocorrectSearch") var autocorrectSearch = true
|
|
|
|
@Binding var searchText: String
|
|
|
|
@State private var isEditingSearch = false
|
|
@State private var isSearching = false
|
|
|
|
@State private var sourcePredicate: NSPredicate?
|
|
|
|
var body: some View {
|
|
DynamicFetchRequest(predicate: sourcePredicate) { (installedPlugins: FetchedResults<P>) in
|
|
List {
|
|
if
|
|
let filteredUpdatedPlugins = pluginManager.fetchUpdatedPlugins(
|
|
forType: PJ.self,
|
|
installedPlugins: installedPlugins,
|
|
searchText: searchText
|
|
),
|
|
!filteredUpdatedPlugins.isEmpty
|
|
{
|
|
Section(header: InlineHeader("Updates")) {
|
|
ForEach(filteredUpdatedPlugins, id: \.self) { (updatedPlugin: PJ) in
|
|
PluginCatalogButtonView(availablePlugin: updatedPlugin, doUpsert: true)
|
|
}
|
|
}
|
|
}
|
|
|
|
if !installedPlugins.isEmpty {
|
|
Section(header: InlineHeader("Installed")) {
|
|
ForEach(installedPlugins, id: \.self) { source in
|
|
InstalledPluginButtonView(installedPlugin: source)
|
|
}
|
|
}
|
|
}
|
|
|
|
if
|
|
let filteredAvailablePlugins = pluginManager.fetchFilteredPlugins(
|
|
forType: PJ.self,
|
|
installedPlugins: installedPlugins,
|
|
searchText: searchText
|
|
),
|
|
!filteredAvailablePlugins.isEmpty
|
|
{
|
|
Section(header: InlineHeader("Catalog")) {
|
|
ForEach(filteredAvailablePlugins, id: \.self) { availablePlugin in
|
|
PluginCatalogButtonView(availablePlugin: availablePlugin, doUpsert: false)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.inlinedList(inset: 0)
|
|
.listStyle(.insetGrouped)
|
|
.sheet(isPresented: $navModel.showSourceSettings) {
|
|
if String(describing: P.self) == "Source" {
|
|
SourceSettingsView()
|
|
.environmentObject(navModel)
|
|
}
|
|
}
|
|
.onChange(of: searchText) { _ in
|
|
sourcePredicate = searchText.isEmpty ? nil : NSPredicate(format: "name CONTAINS[cd] %@", searchText)
|
|
}
|
|
}
|
|
}
|
|
}
|