IceCubesApp/Packages/Account/Sources/Account/Filters/FiltersListView.swift
Thomas Ricouard 1f858414d8 format .
2024-02-14 12:48:14 +01:00

117 lines
3.3 KiB
Swift

import DesignSystem
import Env
import Models
import Network
import SwiftUI
@MainActor
public struct FiltersListView: View {
@Environment(\.dismiss) private var dismiss
@Environment(Theme.self) private var theme
@Environment(CurrentAccount.self) private var account
@Environment(Client.self) private var client
@State private var isLoading: Bool = true
@State private var filters: [ServerFilter] = []
public init() {}
public var body: some View {
NavigationStack {
Form {
if !isLoading, filters.isEmpty {
EmptyView()
} else {
Section {
if isLoading, filters.isEmpty {
ProgressView()
} else {
ForEach(filters) { filter in
NavigationLink(destination: EditFilterView(filter: filter)) {
VStack(alignment: .leading) {
Text(filter.title)
.font(.scaledSubheadline)
Text("\(filter.context.map(\.name).joined(separator: ", "))")
.font(.scaledBody)
.foregroundStyle(.secondary)
if filter.hasExpiry() {
if filter.isExpired() {
Text("filter.expired")
.font(.footnote)
.foregroundStyle(.secondary)
} else {
Text("filter.expiry-\(filter.expiresAt!.relativeFormatted)")
.font(.footnote)
.foregroundStyle(.secondary)
}
}
}
}
}
.onDelete { indexes in
deleteFilter(indexes: indexes)
}
}
}
#if !os(visionOS)
.listRowBackground(theme.primaryBackgroundColor)
#endif
}
Section {
NavigationLink(destination: EditFilterView(filter: nil)) {
Label("filter.new", systemImage: "plus")
}
}
#if !os(visionOS)
.listRowBackground(theme.primaryBackgroundColor)
#endif
}
.toolbar {
toolbarContent
}
.navigationTitle("filter.filters")
.navigationBarTitleDisplayMode(.inline)
#if !os(visionOS)
.scrollContentBackground(.hidden)
.background(theme.secondaryBackgroundColor)
#endif
.task {
do {
isLoading = true
filters = try await client.get(endpoint: ServerFilters.filters, forceVersion: .v2)
isLoading = false
} catch {
isLoading = false
}
}
}
}
private func deleteFilter(indexes: IndexSet) {
if let index = indexes.first {
Task {
do {
let response = try await client.delete(endpoint: ServerFilters.filter(id: filters[index].id),
forceVersion: .v2)
if response?.statusCode == 200 {
filters.remove(at: index)
}
} catch {}
}
}
}
@ToolbarContentBuilder
private var toolbarContent: some ToolbarContent {
ToolbarItem(placement: .navigationBarTrailing) {
Button {
dismiss()
} label: {
Text("action.done").bold()
}
}
}
}