67 lines
2.1 KiB
Swift
67 lines
2.1 KiB
Swift
// Copyright © 2020 Metabolist. All rights reserved.
|
|
|
|
import Mastodon
|
|
import SwiftUI
|
|
import ViewModels
|
|
|
|
struct FiltersView: View {
|
|
@StateObject var viewModel: FiltersViewModel
|
|
|
|
var body: some View {
|
|
Form {
|
|
Section {
|
|
NavigationLink(destination: EditFilterView(
|
|
viewModel: .init(filter: .new, identityContext: viewModel.identityContext))) {
|
|
Label("add", systemImage: "plus.circle")
|
|
}
|
|
}
|
|
section(title: "filters.active", filters: viewModel.activeFilters)
|
|
section(title: "filters.expired", filters: viewModel.expiredFilters)
|
|
}
|
|
.navigationTitle("preferences.filters")
|
|
.toolbar {
|
|
ToolbarItem(placement: ToolbarItemPlacement.navigationBarTrailing) {
|
|
EditButton()
|
|
}
|
|
}
|
|
.alertItem($viewModel.alertItem)
|
|
.onAppear(perform: viewModel.refreshFilters)
|
|
}
|
|
}
|
|
|
|
private extension FiltersView {
|
|
@ViewBuilder
|
|
func section(title: LocalizedStringKey, filters: [Filter]) -> some View {
|
|
if !filters.isEmpty {
|
|
Section(header: Text(title)) {
|
|
ForEach(filters) { filter in
|
|
NavigationLink(destination: EditFilterView(
|
|
viewModel: .init(filter: filter, identityContext: viewModel.identityContext))) {
|
|
HStack {
|
|
Text(filter.phrase)
|
|
Spacer()
|
|
Text(ListFormatter.localizedString(byJoining: filter.context.map(\.localized)))
|
|
.foregroundColor(.secondary)
|
|
}
|
|
}
|
|
}
|
|
.onDelete {
|
|
guard let index = $0.first else { return }
|
|
|
|
viewModel.delete(filter: filters[index])
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#if DEBUG
|
|
import PreviewViewModels
|
|
|
|
struct FiltersView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
FiltersView(viewModel: .init(identityContext: .preview))
|
|
}
|
|
}
|
|
#endif
|