feat(ios): sync wake words via gateway

This commit is contained in:
Peter Steinberger
2025-12-14 05:05:20 +00:00
parent 7b2f712e20
commit 0cef22ef83
6 changed files with 106 additions and 3 deletions

View File

@@ -57,6 +57,8 @@ struct SettingsTab: View {
NavigationLink {
VoiceWakeWordsSettingsView()
.environmentObject(self.appModel)
.environmentObject(self.voiceWake)
} label: {
LabeledContent(
"Wake Words",

View File

@@ -1,7 +1,9 @@
import SwiftUI
struct VoiceWakeWordsSettingsView: View {
@State private var triggerWords: [String] = []
@EnvironmentObject private var appModel: NodeAppModel
@State private var triggerWords: [String] = VoiceWakePreferences.loadTriggerWords()
@State private var syncTask: Task<Void, Never>?
var body: some View {
Form {
@@ -34,13 +36,21 @@ struct VoiceWakeWordsSettingsView: View {
}
.navigationTitle("Wake Words")
.toolbar { EditButton() }
.task {
.onAppear {
if self.triggerWords.isEmpty {
self.triggerWords = VoiceWakePreferences.loadTriggerWords()
self.triggerWords = VoiceWakePreferences.defaultTriggerWords
}
}
.onChange(of: self.triggerWords) { _, newValue in
// Keep local voice wake responsive even if bridge isn't connected yet.
VoiceWakePreferences.saveTriggerWords(newValue)
let snapshot = VoiceWakePreferences.sanitizeTriggerWords(newValue)
self.syncTask?.cancel()
self.syncTask = Task { [snapshot, weak appModel = self.appModel] in
try? await Task.sleep(nanoseconds: 650_000_000)
await appModel?.setGlobalWakeWords(snapshot)
}
}
}