feat: persist listen mode across views via localStorage
Extract listen mode into a shared useListenMode() composable backed by
localStorage ('fa_listen_mode'). ChatView and BriefingView both use it,
so toggling auto-read on in one view keeps it on after navigation or
page refresh — no need to re-enable it each visit.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
import { ref, watch } from 'vue'
|
||||
|
||||
const LISTEN_MODE_KEY = 'fa_listen_mode'
|
||||
|
||||
// Shared across all views — persisted to localStorage
|
||||
const _listenMode = ref<boolean>(localStorage.getItem(LISTEN_MODE_KEY) === 'true')
|
||||
|
||||
watch(_listenMode, (v) => {
|
||||
localStorage.setItem(LISTEN_MODE_KEY, String(v))
|
||||
})
|
||||
|
||||
export function useListenMode() {
|
||||
return _listenMode
|
||||
}
|
||||
@@ -3,6 +3,7 @@ import { ref, computed, onMounted, watch, nextTick } from 'vue'
|
||||
import { useBackgroundRefresh } from '@/composables/useBackgroundRefresh'
|
||||
import { useVoiceRecorder } from '@/composables/useVoiceRecorder'
|
||||
import { useVoiceAudio } from '@/composables/useVoiceAudio'
|
||||
import { useListenMode } from '@/composables/useListenMode'
|
||||
import { useChatStore } from '@/stores/chat'
|
||||
import { useSettingsStore } from '@/stores/settings'
|
||||
import ChatMessage from '@/components/ChatMessage.vue'
|
||||
@@ -258,7 +259,7 @@ function convLabel(c: BriefingConversation): string {
|
||||
// Mic PTT needs STT; listen/speak mode also needs TTS
|
||||
const voiceEnabled = computed(() => settingsStore.voiceSttReady)
|
||||
const voiceTtsEnabled = computed(() => settingsStore.voiceTtsReady)
|
||||
const listenMode = ref(false)
|
||||
const listenMode = useListenMode()
|
||||
const transcribing = ref(false)
|
||||
const synthesising = ref(false)
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import { apiGet, transcribeAudio, synthesiseSpeech } from "@/api/client";
|
||||
import { renderMarkdown } from "@/utils/markdown";
|
||||
import { useVoiceRecorder } from "@/composables/useVoiceRecorder";
|
||||
import { useVoiceAudio, setVoiceVolume } from "@/composables/useVoiceAudio";
|
||||
import { useListenMode } from "@/composables/useListenMode";
|
||||
import ChatMessage from "@/components/ChatMessage.vue";
|
||||
import ToolCallCard from "@/components/ToolCallCard.vue";
|
||||
import ToolConfirmCard from "@/components/ToolConfirmCard.vue";
|
||||
@@ -30,7 +31,7 @@ const recorder = useVoiceRecorder();
|
||||
const audio = useVoiceAudio();
|
||||
const voiceEnabled = computed(() => settingsStore.voiceSttReady);
|
||||
const voiceTtsEnabled = computed(() => settingsStore.voiceTtsReady);
|
||||
const listenMode = ref(false);
|
||||
const listenMode = useListenMode();
|
||||
const synthesising = ref(false);
|
||||
const showVolumeSlider = ref(false);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user