|
|
import DesignSystem
|
|
|
import MusubiCore
|
|
|
import Remote
|
|
|
import SwiftUI
|
|
|
|
|
|
struct SettingsView: View {
|
|
|
let coordinator: Coordinator
|
|
|
@State private var interfaces: [NetworkInterfaces.Info] = []
|
|
|
@State private var launchAtLogin = false
|
|
|
|
|
|
private var settings: AppSettings { coordinator.settings }
|
|
|
|
|
|
var body: some View {
|
|
|
Form {
|
|
|
Picker("Rolle", selection: Binding(get: { settings.role }, set: { settings.role = $0; restart() })) {
|
|
|
Text("Regie – steuert Knoten, verwaltet Szenen").tag(Role.control)
|
|
|
Text("Knoten – folgt der Regie").tag(Role.node)
|
|
|
}
|
|
|
Picker("Technik-Netz", selection: Binding(get: { settings.interfaceName }, set: { settings.interfaceName = $0; restart() })) {
|
|
|
ForEach(interfaces) { interface in
|
|
|
Text(verbatim: "\(interface.name) · \(interface.kind)").tag(interface.name)
|
|
|
}
|
|
|
if !interfaces.contains(where: { $0.name == settings.interfaceName }) {
|
|
|
Text(verbatim: "\(settings.interfaceName) · nicht verbunden").tag(settings.interfaceName)
|
|
|
}
|
|
|
}
|
|
|
Text("Regie und Knoten finden sich nur über diese Schnittstelle.")
|
|
|
.font(Theme.Font.caption)
|
|
|
.foregroundStyle(Theme.Color.nezumi)
|
|
|
if settings.role == .control {
|
|
|
Picker("Klinik-Netz", selection: Binding(get: { settings.clinicInterfaceName }, set: { settings.clinicInterfaceName = $0; restartIntercom() })) {
|
|
|
Text("Aus – kein Intercom").tag("")
|
|
|
ForEach(interfaces) { interface in
|
|
|
Text(verbatim: "\(interface.name) · \(interface.kind)").tag(interface.name)
|
|
|
}
|
|
|
if !settings.clinicInterfaceName.isEmpty, !interfaces.contains(where: { $0.name == settings.clinicInterfaceName }) {
|
|
|
Text(verbatim: "\(settings.clinicInterfaceName) · nicht verbunden").tag(settings.clinicInterfaceName)
|
|
|
}
|
|
|
}
|
|
|
Text(settings.clinicInterfaceName == settings.interfaceName
|
|
|
? "Gleiche Schnittstelle wie das Technik-Netz: nur zum Testen. Im Einsatz getrennt halten."
|
|
|
: "Handys erreichen das Intercom nur über diese Schnittstelle.")
|
|
|
.font(Theme.Font.caption)
|
|
|
.foregroundStyle(settings.clinicInterfaceName == settings.interfaceName ? Theme.Color.kohaku : Theme.Color.nezumi)
|
|
|
}
|
|
|
Toggle("Beim Anmelden starten", isOn: Binding(get: { launchAtLogin }, set: {
|
|
|
settings.launchAtLogin = $0
|
|
|
launchAtLogin = settings.launchAtLogin
|
|
|
}))
|
|
|
LabeledContent("Name im Netz") { Text(verbatim: settings.machineName) }
|
|
|
}
|
|
|
.formStyle(.grouped)
|
|
|
.frame(width: 460)
|
|
|
.task {
|
|
|
interfaces = await NetworkInterfaces.available()
|
|
|
launchAtLogin = settings.launchAtLogin
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private func restart() {
|
|
|
Task {
|
|
|
await coordinator.startRemote()
|
|
|
await coordinator.intercom.restart()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private func restartIntercom() {
|
|
|
Task { await coordinator.intercom.restart() }
|
|
|
}
|
|
|
}
|