From fa861c59a49e1292acfead532a9cf789988d7ea5 Mon Sep 17 00:00:00 2001 From: cxybd <88518598+cxybd@users.noreply.github.com> Date: Mon, 16 Mar 2026 10:20:01 +0800 Subject: [PATCH] fix: cleanup SpeechRecognition on component unmount - Add useEffect cleanup to stop recognition and clear event handlers - Prevents memory leak when component unmounts during recording - Fixes potential privacy issue with background recording - Wrapped stop() in try-catch as recognition might not be started --- .../x/components/sender/hooks/use-speech.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/x/components/sender/hooks/use-speech.ts b/packages/x/components/sender/hooks/use-speech.ts index 452ff6d73..2ccd354cc 100644 --- a/packages/x/components/sender/hooks/use-speech.ts +++ b/packages/x/components/sender/hooks/use-speech.ts @@ -134,5 +134,22 @@ export default function useSpeech( } }); + // Cleanup SpeechRecognition on component unmount + React.useEffect(() => { + return () => { + if (recognitionRef.current) { + try { + recognitionRef.current.stop(); + } catch (e) { + // Recognition might not be started + } + recognitionRef.current.onstart = null; + recognitionRef.current.onend = null; + recognitionRef.current.onresult = null; + recognitionRef.current = null; + } + }; + }, []); + return [mergedAllowSpeech, triggerSpeech, recording] as const; }