Manual Entry kinda works
This commit is contained in:
119
LabWise/InventoryView.swift
Normal file
119
LabWise/InventoryView.swift
Normal file
@@ -0,0 +1,119 @@
|
||||
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 {
|
||||
print("[InventoryViewModel] loadChemicals error: \(error)")
|
||||
errorMessage = "Failed to load chemicals: \(error)"
|
||||
}
|
||||
}
|
||||
|
||||
func delete(chemical: Chemical) async {
|
||||
do {
|
||||
try await client.delete(id: chemical.id)
|
||||
chemicals.removeAll { $0.id == chemical.id }
|
||||
} catch {
|
||||
print("[InventoryViewModel] delete error: \(error)")
|
||||
errorMessage = "Failed to delete: \(error)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
}
|
||||
}
|
||||
.task {
|
||||
await viewModel.loadChemicals()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user