Manual Entry kinda works
This commit is contained in:
@@ -1,81 +1,7 @@
|
||||
import SwiftUI
|
||||
import LabWiseKit
|
||||
|
||||
@Observable
|
||||
final class ChemicalsViewModel {
|
||||
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 chemical."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct ChemicalsListView: View {
|
||||
@State private var viewModel = ChemicalsViewModel()
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Group {
|
||||
if viewModel.isLoading && viewModel.chemicals.isEmpty {
|
||||
ProgressView("Loading chemicals...")
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
} else if viewModel.chemicals.isEmpty {
|
||||
ContentUnavailableView(
|
||||
"No Chemicals",
|
||||
systemImage: "flask",
|
||||
description: Text("Your chemical inventory is empty.")
|
||||
)
|
||||
} 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("Chemicals")
|
||||
.alert("Error", isPresented: .constant(viewModel.errorMessage != nil)) {
|
||||
Button("OK") { viewModel.errorMessage = nil }
|
||||
} message: {
|
||||
Text(viewModel.errorMessage ?? "")
|
||||
}
|
||||
}
|
||||
.task {
|
||||
await viewModel.loadChemicals()
|
||||
}
|
||||
}
|
||||
}
|
||||
// MARK: - Chemical row
|
||||
|
||||
struct ChemicalRowView: View {
|
||||
let chemical: Chemical
|
||||
@@ -101,6 +27,8 @@ struct ChemicalRowView: View {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Physical state badge
|
||||
|
||||
struct PhysicalStateBadge: View {
|
||||
let state: String
|
||||
|
||||
@@ -124,8 +52,10 @@ struct PhysicalStateBadge: View {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Percentage bar
|
||||
|
||||
struct PercentageBar: View {
|
||||
let value: Double // 0.0 - 1.0
|
||||
let value: Double // 0.0 – 1.0
|
||||
|
||||
var body: some View {
|
||||
GeometryReader { geo in
|
||||
|
||||
Reference in New Issue
Block a user