1 contributor
//
// ChargerEditorSheetView.swift
// USB Meter
//
import SwiftUI
struct ChargerEditorSheetView: View {
@EnvironmentObject private var appData: AppData
@Environment(\.dismiss) private var dismiss
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(
chargedDevice: ChargedDeviceSummary? = nil,
meterMACAddress: String? = nil,
standalone: Bool = true
) {
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 {
ChargedDeviceEditorScaffoldView(
title: editorTitle,
saveButtonTitle: saveButtonTitle,
canSave: canSave,
standalone: standalone,
save: save
) {
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)
}
}
}
private var editorTitle: String {
chargedDevice == nil ? "New Charger" : "Edit Charger"
}
private var saveButtonTitle: String {
chargedDevice == nil ? "Save" : "Update"
}
private var canSave: Bool {
!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()
}
}
}