diff --git a/src/frontend/src/features/rooms/hooks/useWatchDeviceReleased.ts b/src/frontend/src/features/rooms/hooks/useWatchDeviceReleased.ts index 8329b188..889ca0d3 100644 --- a/src/frontend/src/features/rooms/hooks/useWatchDeviceReleased.ts +++ b/src/frontend/src/features/rooms/hooks/useWatchDeviceReleased.ts @@ -36,10 +36,18 @@ function useWatchKind( useEffect(() => { if (!inUse) return - const id = setInterval( - () => void probeDeviceReleased(kind, selectedDeviceId || undefined), - RETRY_INTERVAL_MS - ) - return () => clearInterval(id) + let stopped = false + let timer: number | undefined + const tick = async () => { + await probeDeviceReleased(kind, selectedDeviceId || undefined) + if (!stopped) { + timer = window.setTimeout(tick, RETRY_INTERVAL_MS) + } + } + timer = window.setTimeout(tick, RETRY_INTERVAL_MS) + return () => { + stopped = true + window.clearTimeout(timer) + } }, [kind, inUse, selectedDeviceId]) } diff --git a/src/frontend/src/features/rooms/livekit/hooks/useJoinTracks.ts b/src/frontend/src/features/rooms/livekit/hooks/useJoinTracks.ts index 1a60c132..40ef40be 100644 --- a/src/frontend/src/features/rooms/livekit/hooks/useJoinTracks.ts +++ b/src/frontend/src/features/rooms/livekit/hooks/useJoinTracks.ts @@ -151,14 +151,15 @@ function useLocalTrack({ let cancelled = false create() .then((newTrack) => { - noteDeviceReady(permissionKind) if (cancelled) { newTrack.stop() return } + noteDeviceReady(permissionKind) setTrack(newTrack) }) .catch((error) => { + if (cancelled) return onMediaPermissionError( error as Error, permissionKind,