From 22c68da2af6d1ce90b2617e1c1b789d538de7ea1 Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Thu, 21 Aug 2025 21:56:17 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(frontend)=20extract=20permis?= =?UTF-8?q?sion=20checks=20into=20reusable=20hook=20by=20media=20kind?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create hook to encapsulate permission denied/prompted/loading checks based on media kind, eliminating props drilling and simplifying code. Returns appropriate permission state for consuming components based on media type, cleaning up code structure with small enhancement. --- .../src/features/rooms/components/Join.tsx | 13 +++---- .../rooms/components/join/ToggleDevice.tsx | 16 +-------- .../controls/Device/AudioDevicesControl.tsx | 14 ++------ .../controls/Device/SelectDevice.tsx | 20 ++--------- .../controls/Device/VideoDeviceControl.tsx | 14 ++------ .../components/controls/ToggleDevice.tsx | 19 +++++----- .../rooms/livekit/hooks/useCannotUseDevice.ts | 35 +++++++++++++++++++ 7 files changed, 57 insertions(+), 74 deletions(-) create mode 100644 src/frontend/src/features/rooms/livekit/hooks/useCannotUseDevice.ts diff --git a/src/frontend/src/features/rooms/components/Join.tsx b/src/frontend/src/features/rooms/components/Join.tsx index f5de1f9c..da5ed28c 100644 --- a/src/frontend/src/features/rooms/components/Join.tsx +++ b/src/frontend/src/features/rooms/components/Join.tsx @@ -33,12 +33,12 @@ import { ApiLobbyStatus, ApiRequestEntry } from '../api/requestEntry' import { Spinner } from '@/primitives/Spinner' import { ApiAccessLevel } from '../api/ApiRoom' import { useLoginHint } from '@/hooks/useLoginHint' -import { useSnapshot } from 'valtio' -import { openPermissionsDialog, permissionsStore } from '@/stores/permissions' +import { openPermissionsDialog } from '@/stores/permissions' import { ToggleDevice } from './join/ToggleDevice' import { useResolveInitiallyDefaultDeviceId } from '../livekit/hooks/useResolveInitiallyDefaultDeviceId' import { isSafari } from '@/utils/livekit' import type { LocalUserChoices } from '@/stores/userChoices' +import { useCannotUseDevice } from '../livekit/hooks/useCannotUseDevice' const onError = (e: Error) => console.error('ERROR', e) @@ -350,13 +350,8 @@ export const Join = ({ enterRoom() } - const permissions = useSnapshot(permissionsStore) - - const isCameraDeniedOrPrompted = - permissions.isCameraDenied || permissions.isCameraPrompted - - const isMicrophoneDeniedOrPrompted = - permissions.isMicrophoneDenied || permissions.isMicrophonePrompted + const isCameraDeniedOrPrompted = useCannotUseDevice('videoinput') + const isMicrophoneDeniedOrPrompted = useCannotUseDevice('audioinput') const hintMessage = useMemo(() => { if (isCameraDeniedOrPrompted) { diff --git a/src/frontend/src/features/rooms/components/join/ToggleDevice.tsx b/src/frontend/src/features/rooms/components/join/ToggleDevice.tsx index 76172aec..9950c0aa 100644 --- a/src/frontend/src/features/rooms/components/join/ToggleDevice.tsx +++ b/src/frontend/src/features/rooms/components/join/ToggleDevice.tsx @@ -6,9 +6,7 @@ import { } from '../../livekit/config/ToggleDeviceConfig' import { LocalAudioTrack, LocalVideoTrack } from 'livekit-client' import { ButtonRecipeProps } from '@/primitives/buttonRecipe' -import { useCallback, useMemo, useState } from 'react' -import { useSnapshot } from 'valtio' -import { permissionsStore } from '@/stores/permissions' +import { useCallback, useState } from 'react' type ToggleDeviceProps = UseTrackToggleProps & { track?: LocalAudioTrack | LocalVideoTrack @@ -31,17 +29,6 @@ export const ToggleDevice = ({ props.initialState ?? false ) - const permissions = useSnapshot(permissionsStore) - - const isPermissionDeniedOrPrompted = useMemo(() => { - if (config.kind == 'audioinput') { - return permissions.isMicrophoneDenied || permissions.isMicrophonePrompted - } - if (config.kind == 'videoinput') { - return permissions.isCameraDenied || permissions.isCameraPrompted - } - }, [config, permissions]) - const toggle = useCallback(async () => { try { if (isTrackEnabled) { @@ -61,7 +48,6 @@ export const ToggleDevice = ({ return (