import SwiftUI import LabWiseKit @Observable final class InventoryViewModel { var chemicals: [Chemical] = [] var isLoading = false var errorMessage: String? private let client = ChemicalsClient() func loadChemicals() async { isLoading = true errorMessage = nil defer { isLoading = false } do { chemicals = try await client.list() } catch { errorMessage = "Failed to load chemicals" } } func delete(chemical: Chemical) async { do { try await client.delete(id: chemical.id) chemicals.removeAll { $0.id == chemical.id } } catch { errorMessage = "Failed to delete" } } } struct InventoryView: View { @State private var viewModel = InventoryViewModel() @State private var showAddSheet = false @State private var showScanSheet = false @State private var addMode: AddMode? enum AddMode: String, Identifiable { case manual, scan var id: String { rawValue } } var body: some View { NavigationStack { Group { if viewModel.isLoading && viewModel.chemicals.isEmpty { ProgressView("Loading...") .frame(maxWidth: .infinity, maxHeight: .infinity) } else if viewModel.chemicals.isEmpty { ContentUnavailableView( "No Chemicals", systemImage: "flask", description: Text("Add your first chemical using the + button.") ) } else { List { ForEach(viewModel.chemicals) { chemical in NavigationLink(destination: ChemicalDetailView(chemical: chemical)) { ChemicalRowView(chemical: chemical) } } .onDelete { indexSet in for index in indexSet { let chemical = viewModel.chemicals[index] Task { await viewModel.delete(chemical: chemical) } } } } .refreshable { await viewModel.loadChemicals() } } } .navigationTitle("Inventory") .toolbar { ToolbarItem(placement: .topBarTrailing) { Menu { Button { addMode = .scan } label: { Label("Scan Label", systemImage: "camera.fill") } Button { addMode = .manual } label: { Label("Manual Entry", systemImage: "square.and.pencil") } } label: { Image(systemName: "plus") } } } .alert("Error", isPresented: .constant(viewModel.errorMessage != nil)) { Button("OK") { viewModel.errorMessage = nil } } message: { Text(viewModel.errorMessage ?? "") } } .sheet(item: $addMode) { mode in switch mode { case .manual: AddChemicalView { saved in addMode = nil if saved { Task { await viewModel.loadChemicals() } } } case .scan: ScanView() .onDisappear { Task { await viewModel.loadChemicals() } } } } .task { await viewModel.loadChemicals() } } }