(front) make ToggleDevice work outside of a room

This component is needed on the join screen thus out of a room context.
This commit is contained in:
Nathan Vasse
2025-01-16 14:54:34 +01:00
committed by NathanVss
parent eac9158734
commit d48a18b36b

View File

@@ -6,13 +6,19 @@ import { useTranslation } from 'react-i18next'
import { SelectToggleDeviceConfig } from './SelectToggleDevice' import { SelectToggleDeviceConfig } from './SelectToggleDevice'
import useLongPress from '@/features/shortcuts/useLongPress' import useLongPress from '@/features/shortcuts/useLongPress'
import { ActiveSpeaker } from '@/features/rooms/components/ActiveSpeaker' import { ActiveSpeaker } from '@/features/rooms/components/ActiveSpeaker'
import { useIsSpeaking, useLocalParticipant } from '@livekit/components-react' import {
useIsSpeaking,
useLocalParticipant,
useMaybeRoomContext,
} from '@livekit/components-react'
import { ButtonRecipeProps } from '@/primitives/buttonRecipe'
import { ToggleButtonProps } from '@/primitives/ToggleButton' import { ToggleButtonProps } from '@/primitives/ToggleButton'
export type ToggleDeviceProps = { export type ToggleDeviceProps = {
enabled: boolean enabled: boolean
toggle: () => void toggle: () => void
config: SelectToggleDeviceConfig config: SelectToggleDeviceConfig
variant?: NonNullable<ButtonRecipeProps>['variant']
toggleButtonProps?: Partial<ToggleButtonProps> toggleButtonProps?: Partial<ToggleButtonProps>
} }
@@ -20,6 +26,7 @@ export const ToggleDevice = ({
config, config,
enabled, enabled,
toggle, toggle,
variant = 'primaryDark',
toggleButtonProps, toggleButtonProps,
}: ToggleDeviceProps) => { }: ToggleDeviceProps) => {
const { t } = useTranslation('rooms', { keyPrefix: 'join' }) const { t } = useTranslation('rooms', { keyPrefix: 'join' })
@@ -51,17 +58,15 @@ export const ToggleDevice = ({
const Icon = enabled ? iconOn : iconOff const Icon = enabled ? iconOn : iconOff
const { localParticipant } = useLocalParticipant() const context = useMaybeRoomContext()
const isSpeaking = useIsSpeaking(localParticipant) if (kind === 'audioinput' && pushToTalk && context) {
return <ActiveSpeakerWrapper />
if (kind === 'audioinput' && pushToTalk) {
return <ActiveSpeaker isSpeaking={isSpeaking} pushToTalk />
} }
return ( return (
<ToggleButton <ToggleButton
isSelected={!enabled} isSelected={!enabled}
variant={enabled ? 'primaryDark' : 'error2'} variant={enabled ? variant : 'error2'}
shySelected shySelected
onPress={() => toggle()} onPress={() => toggle()}
aria-label={toggleLabel} aria-label={toggleLabel}
@@ -73,3 +78,9 @@ export const ToggleDevice = ({
</ToggleButton> </ToggleButton>
) )
} }
const ActiveSpeakerWrapper = () => {
const { localParticipant } = useLocalParticipant()
const isSpeaking = useIsSpeaking(localParticipant)
return <ActiveSpeaker isSpeaking={isSpeaking} pushToTalk />
}