import { useEffect, useRef } from 'react'; import { useSetRecoilState } from 'recoil'; import { useGetCustomConfigSpeechQuery } from 'librechat-data-provider/react-query'; import { logger } from '~/utils'; import store from '~/store'; /** * Initializes speech-related Recoil values from the server-side custom * configuration on first load (only when the user is authenticated) */ export default function useSpeechSettingsInit(isAuthenticated: boolean) { const { data } = useGetCustomConfigSpeechQuery({ enabled: isAuthenticated }); const setters = useRef({ conversationMode: useSetRecoilState(store.conversationMode), advancedMode: useSetRecoilState(store.advancedMode), speechToText: useSetRecoilState(store.speechToText), textToSpeech: useSetRecoilState(store.textToSpeech), cacheTTS: useSetRecoilState(store.cacheTTS), engineSTT: useSetRecoilState(store.engineSTT), languageSTT: useSetRecoilState(store.languageSTT), autoTranscribeAudio: useSetRecoilState(store.autoTranscribeAudio), decibelValue: useSetRecoilState(store.decibelValue), autoSendText: useSetRecoilState(store.autoSendText), engineTTS: useSetRecoilState(store.engineTTS), voice: useSetRecoilState(store.voice), cloudBrowserVoices: useSetRecoilState(store.cloudBrowserVoices), languageTTS: useSetRecoilState(store.languageTTS), automaticPlayback: useSetRecoilState(store.automaticPlayback), playbackRate: useSetRecoilState(store.playbackRate), }).current; useEffect(() => { if (!isAuthenticated || !data || data.message === 'not_found') return; logger.log('Initializing speech settings from config:', data); Object.entries(data).forEach(([key, value]) => { if (key === 'sttExternal' || key === 'ttsExternal') return; if (localStorage.getItem(key) !== null) return; const setter = setters[key as keyof typeof setters]; if (setter) { logger.log(`Setting default speech setting: ${key} = ${value}`); setter(value as any); } }); }, [isAuthenticated, data, setters]); }