From 884179d25f94ab32b852c33696b1b61fe422c8b5 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Wed, 8 Apr 2026 21:16:32 -0700 Subject: [PATCH] =?UTF-8?q?feat(companion-app):=20=E2=9C=A8=20Implement=20?= =?UTF-8?q?new=20settings=20management=20props=20and=20state=20in=20Compan?= =?UTF-8?q?ionApp.tsx=20for=20user=20configuration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- @applications/web/src/app/CompanionApp.tsx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/@applications/web/src/app/CompanionApp.tsx b/@applications/web/src/app/CompanionApp.tsx index 5dbfa63..e47493f 100644 --- a/@applications/web/src/app/CompanionApp.tsx +++ b/@applications/web/src/app/CompanionApp.tsx @@ -168,6 +168,27 @@ function CompanionAppInner(): ReactElement { const activeAssistantIdRef = useRef(null); const audioInitializedRef = useRef(false); + // SW → client audio message (notification tap with audioUrl) + useEffect(() => { + if (!('serviceWorker' in navigator)) return; + const handler = (event: MessageEvent) => { + if ( + event.data !== null && + typeof event.data === 'object' && + 'type' in event.data && + (event.data as { type: unknown }).type === 'play-tts' && + 'url' in event.data && + typeof (event.data as { url: unknown }).url === 'string' + ) { + const audioUrl = (event.data as { url: string }).url; + const audio = new Audio(audioUrl); + audio.play().catch(() => {/* autoplay may be blocked — user will still see the notification */}); + } + }; + navigator.serviceWorker.addEventListener('message', handler); + return () => navigator.serviceWorker.removeEventListener('message', handler); + }, []); + // PWA install prompt const installPromptRef = useRef(null); useEffect(() => {