♻️(frontend) replace toggle device config with keyboard shortcut hook

Remove ugly toggle device configuration and implement hook to determine
appropriate keyboard shortcuts based on media device kind.

Cleaner approach that encapsulates shortcut logic in reusable hook
instead of scattered configuration objects.
This commit is contained in:
lebaudantoine
2025-08-21 23:38:44 +02:00
committed by aleb_the_flash
parent 2367750395
commit f17e0a3ba0
7 changed files with 54 additions and 92 deletions
@@ -660,18 +660,16 @@ export const Join = ({
})}
>
<ToggleDevice
source={Track.Source.Microphone}
kind="audioinput"
initialState={audioEnabled}
track={audioTrack}
onChange={(enabled) => saveAudioInputEnabled(enabled)}
onDeviceError={(error) => console.error(error)}
/>
<ToggleDevice
source={Track.Source.Camera}
kind="videoinput"
initialState={videoEnabled}
track={videoTrack}
onChange={(enabled) => saveVideoInputEnabled(enabled)}
onDeviceError={(error) => console.error(error)}
/>
</div>
<div
@@ -1,33 +1,32 @@
import { UseTrackToggleProps } from '@livekit/components-react'
import { ToggleDevice as BaseToggleDevice } from '../../livekit/components/controls/Device/ToggleDevice'
import {
TOGGLE_DEVICE_CONFIG,
ToggleSource,
} from '../../livekit/config/ToggleDeviceConfig'
import { LocalAudioTrack, LocalVideoTrack } from 'livekit-client'
import { LocalAudioTrack, LocalVideoTrack, Track } from 'livekit-client'
import { ButtonRecipeProps } from '@/primitives/buttonRecipe'
import { useCallback, useState } from 'react'
type ToggleDeviceProps<T extends ToggleSource> = UseTrackToggleProps<T> & {
type ToggleSource = Exclude<
Track.Source,
| Track.Source.ScreenShareAudio
| Track.Source.Unknown
| Track.Source.ScreenShare
>
type ToggleDeviceProps<T extends ToggleSource> = Pick<
UseTrackToggleProps<T>,
'onChange' | 'initialState'
> & {
track?: LocalAudioTrack | LocalVideoTrack
source: ToggleSource
kind: MediaDeviceKind
variant?: NonNullable<ButtonRecipeProps>['variant']
}
export const ToggleDevice = <T extends ToggleSource>({
track,
kind,
onChange,
...props
initialState,
}: ToggleDeviceProps<T>) => {
const config = TOGGLE_DEVICE_CONFIG[props.source]
if (!config) {
throw new Error('Invalid source')
}
const [isTrackEnabled, setIsTrackEnabled] = useState(
props.initialState ?? false
)
const [isTrackEnabled, setIsTrackEnabled] = useState(initialState ?? false)
const toggle = useCallback(async () => {
try {
@@ -49,7 +48,7 @@ export const ToggleDevice = <T extends ToggleSource>({
<BaseToggleDevice
enabled={isTrackEnabled}
toggle={toggle}
config={config}
kind={kind}
variant="whiteCircle"
errorVariant="errorCircle"
toggleButtonProps={{