| import SwiftUI |
|
|
| struct VoiceTab: View { |
| @Environment(NodeAppModel.self) private var appModel |
| @Environment(VoiceWakeManager.self) private var voiceWake |
| @AppStorage("voiceWake.enabled") private var voiceWakeEnabled: Bool = false |
| @AppStorage("talk.enabled") private var talkEnabled: Bool = false |
|
|
| var body: some View { |
| NavigationStack { |
| List { |
| Section("Status") { |
| LabeledContent("Voice Wake", value: self.voiceWakeEnabled ? "Enabled" : "Disabled") |
| LabeledContent("Listener", value: self.voiceWake.isListening ? "Listening" : "Idle") |
| Text(self.voiceWake.statusText) |
| .font(.footnote) |
| .foregroundStyle(.secondary) |
| LabeledContent("Talk Mode", value: self.talkEnabled ? "Enabled" : "Disabled") |
| } |
|
|
| Section("Notes") { |
| let triggers = self.voiceWake.activeTriggerWords |
| Group { |
| if triggers.isEmpty { |
| Text("Add wake words in Settings.") |
| } else if triggers.count == 1 { |
| Text("Say β\(triggers[0]) β¦β to trigger.") |
| } else if triggers.count == 2 { |
| Text("Say β\(triggers[0]) β¦β or β\(triggers[1]) β¦β to trigger.") |
| } else { |
| Text("Say β\(triggers.joined(separator: " β¦β, β")) β¦β to trigger.") |
| } |
| } |
| .foregroundStyle(.secondary) |
| } |
| } |
| .navigationTitle("Voice") |
| .onChange(of: self.voiceWakeEnabled) { _, newValue in |
| self.appModel.setVoiceWakeEnabled(newValue) |
| } |
| .onChange(of: self.talkEnabled) { _, newValue in |
| self.appModel.setTalkEnabled(newValue) |
| } |
| } |
| } |
| } |
|
|