AutoCat/AutoCat/Screens/HistoryScreen/HistoryScreen.swift
2025-02-09 18:38:35 +03:00

102 lines
3.4 KiB
Swift

//
// HistoryScreen.swift
// AutoCat
//
// Created by Selim Mustafaev on 15.01.2025.
// Copyright © 2025 Selim Mustafaev. All rights reserved.
//
import SwiftUI
import AutoCatCore
struct HistoryScreen: View {
@State var viewModel: HistoryViewModel
@State var filterSheetPresented = false
@State var exportSheetPresented = false
var body: some View {
List {
ForEach(viewModel.vehicleSections) { section in
Section(header: Text(section.header)) {
ForEach(section.elements) { vehicle in
VehicleCellView(vehicle: vehicle)
.onTapGesture {
Task { await viewModel.openReport(vehicle: vehicle) }
}
.swipeActions(allowsFullSwipe: false) {
makeActions(for: vehicle)
}
.contextMenu {
makeActions(for: vehicle, useLabels: true)
}
}
}
}
}
.onAppear {
Task { await viewModel.onAppear() }
}
.hud($viewModel.hud)
.listStyle(.plain)
.navigationTitle(String.localizedStringWithFormat(NSLocalizedString("vehicles found", comment: ""),
viewModel.vehiclesCount))
.searchable(text: $viewModel.searchText, prompt: "Search plate numbers")
.autocorrectionDisabled()
.textInputAutocapitalization(.never)
.keyboardType(.asciiCapable)
.toolbar {
ToolbarItem(placement: .primaryAction) {
Button("", systemImage: "square.and.arrow.up") {
exportSheetPresented = true
}
}
ToolbarItem(placement: .primaryAction) {
Button("", systemImage: "line.horizontal.3.decrease") {
filterSheetPresented = true
}
}
}
.confirmationDialog("Filter check history", isPresented: $filterSheetPresented, titleVisibility: .visible) {
ForEach(HistoryFilter.allCases) { filter in
Button(filter.title) {
viewModel.filter = filter
viewModel.applyFilters()
}
}
}
.confirmationDialog("Export history as", isPresented: $exportSheetPresented, titleVisibility: .visible) {
ShareLink(item: viewModel.vehiclesArchive, preview: SharePreview(VehiclesArchive.fileName)) {
Text("CSV table")
}
if let dbUrl = viewModel.dbFileURL {
ShareLink(item: dbUrl) {
Text("Database file")
}
}
}
}
@ViewBuilder
func makeActions(for vehicle: VehicleDto, useLabels: Bool = false) -> some View {
Button {
Task { await viewModel.updateVehicle(vehicle) }
} label: {
Label(useLabels ? "Update" : "", systemImage: "arrow.2.circlepath")
}
Button(role: .destructive) {
Task { await viewModel.deleteVehicle(vehicle) }
} label: {
Label(useLabels ? "Delete" : "", systemImage: "trash")
}
}
}
//#Preview {
// HistoryScreen(viewModel: .init())
//}