1 contributor
//
// ChargerEditorSheetView.swift
// USB Meter
//
import SwiftUI
struct ChargerEditorSheetView: View {
@Environment(\.dismiss) private var dismiss
let appData: AppData
let chargedDevice: ChargedDeviceSummary?
let meterMACAddress: String?
/// When false the view omits its own NavigationView (used as a push destination).
let standalone: Bool
@State private var name: String
@State private var chargerType: ChargerType
@State private var notes: String
init(
appData: AppData,
chargedDevice: ChargedDeviceSummary? = nil,
meterMACAddress: String? = nil,
standalone: Bool = true
) {
self.appData = appData
self.chargedDevice = chargedDevice
self.meterMACAddress = meterMACAddress
self.standalone = standalone
_name = State(initialValue: chargedDevice?.name ?? "")
_chargerType = State(initialValue: chargedDevice?.chargerType ?? .genericQi)
_notes = State(initialValue: chargedDevice?.notes ?? "")
}
var body: some View {
if standalone {
NavigationView { formContent }
.navigationViewStyle(StackNavigationViewStyle())
} else {
formContent
}
}
private var formContent: some View {
Form {
Section(header: Text("Identity")) {
TextField("Charger name", text: $name)
if let chargedDevice {
Text(chargedDevice.qrIdentifier)
.font(.caption.monospaced())
.foregroundColor(.secondary)
.textSelection(.enabled)
}
}
Section(
header: ContextInfoHeader(
title: "Charger Type",
message: "MagSafe and Watch chargers use magnetic alignment, enabling accurate efficiency calibration. Standby current and efficiency are learned automatically from sessions."
)
) {
Picker("Type", selection: $chargerType) {
ForEach(ChargerType.allCases) { type in
Label(type.title, systemImage: type.symbolName)
.tag(type)
}
}
.pickerStyle(.menu)
}
Section(header: Text("Notes")) {
TextField("Optional notes", text: $notes)
}
}
.navigationTitle(chargedDevice == nil ? "New Charger" : "Edit Charger")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("Cancel") { dismiss() }
}
ToolbarItem(placement: .confirmationAction) {
Button(chargedDevice == nil ? "Save" : "Update") {
save()
}
.disabled(name.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty)
}
}
}
private func save() {
let trimmedNotes = notes.trimmingCharacters(in: .whitespacesAndNewlines)
let notesValue: String? = trimmedNotes.isEmpty ? nil : trimmedNotes
let didSave: Bool
if let chargedDevice {
didSave = appData.updateCharger(
id: chargedDevice.id,
name: name,
chargerType: chargerType,
notes: notesValue
)
} else {
didSave = appData.createCharger(
name: name,
chargerType: chargerType,
notes: notesValue,
meterMACAddress: meterMACAddress
)
}
if didSave {
dismiss()
}
}
}