From ec76c0dec069761fb3ac4b78215be7e4d7d79f65 Mon Sep 17 00:00:00 2001 From: obrucheoghene Date: Wed, 25 Mar 2026 17:13:07 +0100 Subject: [PATCH] fix: resolve media permission bugs and improve device access UX - Fix requestCameraPermission filtering audioinput instead of videoinput - Fix toggleMic calling requestCameraPermission instead of requestMicPermission - Replace alert() calls with sonner toast.error() using structured title/description - Show toast when requestCameraAndMicPermissions is denied (was silently swallowed) - Add proactive navigator.permissions check on pre-join screen with actionable denied toast - Add micPending/cameraPending loading state; show spinner on buttons during acquisition --- src/components/room/camera.tsx | 9 ++- src/components/room/join/join-controls.tsx | 24 +++++++- src/components/room/media-control-button.tsx | 3 + src/components/room/mic.tsx | 19 ++++-- src/hooks/use-media.ts | 61 +++++++++++++------- 5 files changed, 86 insertions(+), 30 deletions(-) diff --git a/src/components/room/camera.tsx b/src/components/room/camera.tsx index eecf7d9..4377cba 100644 --- a/src/components/room/camera.tsx +++ b/src/components/room/camera.tsx @@ -1,4 +1,4 @@ -import { Video, VideoOff } from 'lucide-react'; +import { Loader2, Video, VideoOff } from 'lucide-react'; import MediaDeviceDropdown from './media-device-dropdown'; import { @@ -10,7 +10,7 @@ import { useMedia } from '@/hooks/use-media'; import MediaControlButton from './media-control-button'; const Camera = () => { - const { toggleCamera } = useMedia(); + const { toggleCamera, cameraPending } = useMedia(); const cameraOn = useCameraOn(); const cameraDeviceId = useCameraDeviceId(); @@ -22,8 +22,11 @@ const Camera = () => { isActive={cameraOn} onClick={toggleCamera} label={cameraOn ? 'Stop' : 'Start'} + disabled={cameraPending} > - {cameraOn ? ( + {cameraPending ? ( + + ) : cameraOn ? (