From c9b08cdfd2508ea080d0250a0a4b85ef666fb561 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Mon, 27 Apr 2026 20:30:54 +0200 Subject: [PATCH] feat(devices): sweep stale persisted device ids on mount and devicechange --- packages/web/src/components/layout/AppLayout.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/web/src/components/layout/AppLayout.tsx b/packages/web/src/components/layout/AppLayout.tsx index f148582a..eaefe4b2 100644 --- a/packages/web/src/components/layout/AppLayout.tsx +++ b/packages/web/src/components/layout/AppLayout.tsx @@ -92,6 +92,16 @@ export function AppLayout() { AudioManager.getInstance().setOutputDevice(outputDeviceId); }, [outputDeviceId]); + // Sweep stale persisted device IDs (mic/speaker/camera) on mount and whenever + // the device list changes (USB plug/unplug, permission unlock, etc.). + useEffect(() => { + const prune = useVoiceStore.getState().pruneStaleDevices; + prune(); // initial sweep + const handler = () => prune(); + navigator.mediaDevices.addEventListener('devicechange', handler); + return () => navigator.mediaDevices.removeEventListener('devicechange', handler); + }, []); + const { user, isLoading } = useAuth(); const showBootSkeleton = useDelayedLoading(isLoading); const setCurrentSpace = useSpaceStore((s) => s.setCurrentSpace);