Files
LabWiseiOS/LabWise/InventoryView.swift
2026-03-22 01:35:53 -05:00

121 lines
3.9 KiB
Swift

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()
}
}
}