♻️(frontend) extract raised hand logic in a reusable hook

Encapsulate code responsible for toggling hand,
and determining the hand state based on participant metadata.

This gonna be reused across the codebase.
This commit is contained in:
lebaudantoine
2024-09-03 14:06:46 +02:00
committed by aleb_the_flash
parent 1fd1cb71ba
commit 26fdaac589
2 changed files with 30 additions and 15 deletions

View File

@@ -2,25 +2,18 @@ import { useTranslation } from 'react-i18next'
import { RiHand } from '@remixicon/react'
import { ToggleButton } from '@/primitives'
import { css } from '@/styled-system/css'
import {
useLocalParticipant,
useParticipantInfo,
} from '@livekit/components-react'
import { useLocalParticipant } from '@livekit/components-react'
import { useRaisedHand } from '@/features/rooms/livekit/hooks/useRaisedHand'
export const HandToggle = () => {
const { t } = useTranslation('rooms')
const localParticipant = useLocalParticipant().localParticipant
const { metadata } = useParticipantInfo({ participant: localParticipant })
const { isHandRaised, toggleRaisedHand } = useRaisedHand({
participant: localParticipant,
})
const parsedMetadata = JSON.parse(metadata || '{}')
const sendRaise = () => {
parsedMetadata.raised = !parsedMetadata.raised
localParticipant.setMetadata(JSON.stringify(parsedMetadata))
}
const label = parsedMetadata.raised
const label = isHandRaised
? t('controls.hand.lower')
: t('controls.hand.raise')
@@ -36,8 +29,8 @@ export const HandToggle = () => {
legacyStyle
aria-label={label}
tooltip={label}
isSelected={parsedMetadata.raised}
onPress={() => sendRaise()}
isSelected={isHandRaised}
onPress={() => toggleRaisedHand()}
>
<RiHand />
</ToggleButton>

View File

@@ -0,0 +1,22 @@
import { LocalParticipant, Participant } from 'livekit-client'
import { useParticipantInfo } from '@livekit/components-react'
import { isLocal } from '@/utils/livekit'
type useRaisedHandProps = {
participant: Participant
}
export function useRaisedHand({ participant }: useRaisedHandProps) {
const { metadata } = useParticipantInfo({ participant })
const parsedMetadata = JSON.parse(metadata || '{}')
const toggleRaisedHand = () => {
if (isLocal(participant)) {
parsedMetadata.raised = !parsedMetadata.raised
const localParticipant = participant as LocalParticipant
localParticipant.setMetadata(JSON.stringify(parsedMetadata))
}
}
return { isHandRaised: parsedMetadata.raised, toggleRaisedHand }
}