From 23677503951de646fcee5e56e7f47d25bc7d2346 Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Thu, 21 Aug 2025 22:58:31 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(frontend)=20extract=20media?= =?UTF-8?q?=20icon=20logic=20into=20optimized=20reusable=20hook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create simple hook to assign icons to toggle/select components based on media kind using dictionary lookup for optimization. Eliminates duplicate icon assignment logic across components with straightforward, performant implementation that's easy to maintain. --- .../controls/Device/AudioDevicesControl.tsx | 4 +- .../controls/Device/SelectDevice.tsx | 57 +++++-------------- .../controls/Device/ToggleDevice.tsx | 7 ++- .../controls/Device/VideoDeviceControl.tsx | 4 +- .../livekit/config/ToggleDeviceConfig.ts | 13 ----- .../rooms/livekit/hooks/useDeviceIcons.ts | 37 ++++++++++++ src/frontend/src/primitives/Select.tsx | 23 +++++--- 7 files changed, 72 insertions(+), 73 deletions(-) create mode 100644 src/frontend/src/features/rooms/livekit/hooks/useDeviceIcons.ts diff --git a/src/frontend/src/features/rooms/livekit/components/controls/Device/AudioDevicesControl.tsx b/src/frontend/src/features/rooms/livekit/components/controls/Device/AudioDevicesControl.tsx index f9a055c5..ccff7568 100644 --- a/src/frontend/src/features/rooms/livekit/components/controls/Device/AudioDevicesControl.tsx +++ b/src/frontend/src/features/rooms/livekit/components/controls/Device/AudioDevicesControl.tsx @@ -1,7 +1,7 @@ import { useTranslation } from 'react-i18next' import { useTrackToggle, UseTrackToggleProps } from '@livekit/components-react' import { Button, Popover } from '@/primitives' -import { RiArrowUpSLine, RiMicLine, RiMicOffLine } from '@remixicon/react' +import { RiArrowUpSLine } from '@remixicon/react' import { Track } from 'livekit-client' import { ToggleDevice } from './ToggleDevice' @@ -26,8 +26,6 @@ export const AudioDevicesControl = ({ }: AudioDevicesControlProps) => { const config: ToggleDeviceConfig = { kind: 'audioinput', - iconOn: RiMicLine, - iconOff: RiMicOffLine, shortcut: { key: 'd', ctrlKey: true, diff --git a/src/frontend/src/features/rooms/livekit/components/controls/Device/SelectDevice.tsx b/src/frontend/src/features/rooms/livekit/components/controls/Device/SelectDevice.tsx index b1cb8fe3..980dd94e 100644 --- a/src/frontend/src/features/rooms/livekit/components/controls/Device/SelectDevice.tsx +++ b/src/frontend/src/features/rooms/livekit/components/controls/Device/SelectDevice.tsx @@ -1,22 +1,13 @@ -import { - RemixiconComponentType, - RiMicLine, - RiVideoOnLine, - RiVolumeDownLine, -} from '@remixicon/react' import { useTranslation } from 'react-i18next' import { useMediaDeviceSelect } from '@livekit/components-react' import { useEffect, useMemo } from 'react' -import { Select } from '@/primitives/Select' +import { Select, SelectProps } from '@/primitives/Select' import { Placement } from '@react-types/overlays' import { useCannotUseDevice } from '../../../hooks/useCannotUseDevice' +import { useDeviceIcons } from '@/features/rooms/livekit/hooks/useDeviceIcons' type DeviceItems = Array<{ value: string; label: string }> -type DeviceConfig = { - icon: RemixiconComponentType -} - type SelectDeviceContext = { variant?: 'light' | 'dark' placement?: Placement @@ -29,20 +20,19 @@ type SelectDeviceProps = { context?: 'join' | 'room' } -type SelectDevicePermissionsProps = SelectDeviceProps & { - config: DeviceConfig - contextProps: SelectDeviceContext -} +type SelectDevicePermissionsProps = SelectDeviceProps & + Pick, 'placement' | 'variant'> -const SelectDevicePermissions = ({ +const SelectDevicePermissions = ({ id, kind, - config, onSubmit, - contextProps, -}: SelectDevicePermissionsProps) => { + ...props +}: SelectDevicePermissionsProps) => { const { t } = useTranslation('rooms', { keyPrefix: 'join' }) + const deviceIcons = useDeviceIcons(kind) + const { devices, activeDeviceId, setActiveMediaDevice } = useMediaDeviceSelect({ kind: kind, requestPermissions: true }) @@ -75,7 +65,7 @@ const SelectDevicePermissions = ({ label="" isDisabled={items.length === 0} items={items} - iconComponent={config?.icon} + iconComponent={deviceIcons.select} placeholder={ items.length === 0 ? t('selectDevice.loading') @@ -86,7 +76,7 @@ const SelectDevicePermissions = ({ onSubmit?.(key as string) setActiveMediaDevice(key as string) }} - {...contextProps} + {...props} /> ) } @@ -106,27 +96,9 @@ export const SelectDevice = ({ return {} }, [context]) - const config = useMemo(() => { - switch (kind) { - case 'audioinput': - return { - icon: RiMicLine, - } - case 'audiooutput': - return { - icon: RiVolumeDownLine, - } - case 'videoinput': - return { - icon: RiVideoOnLine, - } - } - }, [kind]) - + const deviceIcons = useDeviceIcons(kind) const cannotUseDevice = useCannotUseDevice(kind) - if (!config) return null - if (cannotUseDevice) { return (