import SwiftUI /// Die Kühlbox von der Uhr aus stellen – das einzige Gerät, das sich stellen /// lässt. /// /// Wie am iPhone folgen die Schalter dem Gerät, nicht der Vermutung: Getippt /// wird ein Befehl, angezeigt wird, was die Box zurückmeldet. Über die Uhr /// dauert das einen Wimpernschlag länger – der Weg geht über das iPhone –, /// dafür kann kein Schalter etwas behaupten, das die Box nie bestätigt hat. struct WatchFridgeControls: View { let deviceID: UUID let fridge: WatchFridge @Environment(PhoneLink.self) private var link var body: some View { Section { Toggle("Ein", isOn: Binding( get: { fridge.isPoweredOn }, set: { link.send(.fridgePower(device: deviceID, on: $0)) } )) Toggle("Eco", isOn: Binding( get: { fridge.isEco }, set: { link.send(.fridgeEco(device: deviceID, eco: $0)) } )) .disabled(!fridge.isPoweredOn) target(zone: .left, title: fridge.isDualZone ? "Soll links" : "Soll", value: fridge.leftTarget) if fridge.isDualZone { target(zone: .right, title: "Soll rechts", value: fridge.rightTarget) } } header: { Text("Kühlbox") } footer: { if !link.isReachable { Text("iPhone gerade nicht erreichbar – Stellbefehle gehen erst " + "wieder durch, wenn es antwortet.") .font(.caption2) } else if !fridge.isLive { // Kein Messwert, sondern der zuletzt gestellte Stand: Die Box // wird erst verbunden, während man diese Ansicht offen hat. Text("Zuletzt gestellter Stand. Die Box verbindet sich gerade – " + "die Werte kommen gleich.") .font(.caption2) } } } private func target(zone: WatchFridgeZone, title: String, value: Int?) -> some View { Stepper(value: Binding( get: { value ?? fridge.targetRange.lowerBound }, set: { link.send(.fridgeTarget(device: deviceID, zone: zone, value: $0)) } ), in: fridge.targetRange) { VStack(alignment: .leading, spacing: 0) { Text(title) .font(.caption2) .foregroundStyle(.secondary) Text(value.map { "\($0) \(fridge.unitSymbol)" } ?? "–") .font(.headline) .monospacedDigit() } } .disabled(!fridge.isPoweredOn || value == nil) } }