import SwiftUI /// Bedienelemente einer Alpicool-Kühlbox. /// /// Alle Schalter folgen dem Gerät, nicht der Vermutung: nach jedem Stellbefehl /// fragt die Sitzung den Zustand neu ab, und die Ansicht zeigt, was zurückkam. struct FridgeControls: View { let device: ConfiguredDevice let state: AlpicoolState @Environment(BluetoothManager.self) private var bluetooth @State private var showPowerOffConfirmation = false var body: some View { Section { Toggle("Eingeschaltet", isOn: Binding( get: { state.isPoweredOn }, set: { wanted in // Ausschalten heisst: der Inhalt taut auf. Einmal nachfragen. if wanted { bluetooth.setFridgePower(true, for: device.id) } else { showPowerOffConfirmation = true } } )) Picker("Betriebsart", selection: Binding( get: { state.isEco }, set: { bluetooth.setFridgeEco($0, for: device.id) } )) { Text("Max").tag(false) Text("Eco").tag(true) } .pickerStyle(.segmented) .disabled(!state.isPoweredOn) targetStepper(zone: .left, title: state.isDualZone ? "Soll links" : "Solltemperatur", value: state.leftTarget) if state.isDualZone { targetStepper(zone: .right, title: "Soll rechts", value: state.rightTarget) } Toggle("Bedienfeld gesperrt", isOn: Binding( get: { state.isLocked }, set: { bluetooth.setFridgeLock($0, for: device.id) } )) } header: { Text("Steuerung") } footer: { Text("Änderungen gehen direkt an die Box. Der angezeigte Stand kommt " + "aus ihrer Antwort, nicht aus der Eingabe.") } .confirmationDialog("Kühlbox ausschalten?", isPresented: $showPowerOffConfirmation, titleVisibility: .visible) { Button("Ausschalten", role: .destructive) { bluetooth.setFridgePower(false, for: device.id) } } message: { Text("Die Kühlung stoppt, bis sie wieder eingeschaltet wird.") } } private func targetStepper(zone: AlpicoolState.Zone, title: String, value: Int?) -> some View { let range = state.targetRange return Stepper(value: Binding( get: { value ?? range.lowerBound }, set: { bluetooth.setFridgeTarget($0, zone: zone, for: device.id) } ), in: range) { LabeledContent(title) { Text(value.map { "\($0) \(state.unitSymbol)" } ?? "–") .monospacedDigit() } } .disabled(!state.isPoweredOn || value == nil) } }