diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 86ff228..6b4e139 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -25,6 +25,15 @@ function startAppServices() { settingsStore.checkVoiceStatus(); // Sync browser timezone to the server on every login/page load. apiPut("/api/settings", { user_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone }).catch(() => {}); + // Re-check voice status when the tab becomes visible again (model may + // have finished loading while the user was away). + document.addEventListener("visibilitychange", onVisibilityChange); +} + +function onVisibilityChange() { + if (document.visibilityState === "visible" && authStore.isAuthenticated) { + settingsStore.checkVoiceStatus(); + } } function stopAppServices() { @@ -150,6 +159,7 @@ watch( onUnmounted(() => { document.removeEventListener("keydown", onGlobalKeydown); + document.removeEventListener("visibilitychange", onVisibilityChange); stopAppServices(); }); diff --git a/frontend/src/views/SettingsView.vue b/frontend/src/views/SettingsView.vue index 0c50c89..ba1fffc 100644 --- a/frontend/src/views/SettingsView.vue +++ b/frontend/src/views/SettingsView.vue @@ -500,6 +500,8 @@ async function saveAdminVoice() { adminVoiceSaved.value = true; setTimeout(() => { adminVoiceSaved.value = false; }, 2000); voiceTabLoaded.value = false; + // Always update global voice state so mic buttons appear/disappear immediately + await store.checkVoiceStatus(); if (adminVoiceEnabled.value) { await reloadVoiceModels(); }