️(frontend) memoize the ParticipantName component

Memoize the ParticipantName component so it does not re-render on
unrelated parent updates when its props have not changed.
This commit is contained in:
lebaudantoine
2026-07-13 23:13:36 +02:00
parent 7cc16303d9
commit 89d1c74f7b
2 changed files with 27 additions and 25 deletions
@@ -1,8 +1,6 @@
import type { CSSProperties } from 'react'
import React, { CSSProperties } from 'react'
import { Text } from '@/primitives'
import { useTranslation } from 'react-i18next'
import { useParticipantInfo } from '@livekit/components-react'
import type { Participant } from 'livekit-client'
const participantNameStyles: CSSProperties = {
paddingBottom: '0.1rem',
@@ -16,29 +14,29 @@ const participantNameScreenShareStyles: CSSProperties = {
marginLeft: '0.4rem',
}
export const ParticipantName = ({
participant,
isScreenShare = false,
}: {
participant: Participant
isScreenShare: boolean
}) => {
const { t } = useTranslation('rooms', { keyPrefix: 'participantTile' })
export const ParticipantName = React.memo(
({
displayedName,
isScreenShare = false,
}: {
displayedName?: string
isScreenShare: boolean
}) => {
const { t } = useTranslation('rooms', { keyPrefix: 'participantTile' })
if (isScreenShare) {
return (
<Text variant="sm" style={participantNameScreenShareStyles}>
{t('screenShare', { name: displayedName })}
</Text>
)
}
const { identity, name } = useParticipantInfo({ participant })
const displayedName = name != '' ? name : identity
if (isScreenShare) {
return (
<Text variant="sm" style={participantNameScreenShareStyles}>
{t('screenShare', { name: displayedName })}
<Text variant="sm" style={participantNameStyles} aria-hidden="true">
{displayedName}
</Text>
)
}
)
return (
<Text variant="sm" style={participantNameStyles} aria-hidden="true">
{displayedName}
</Text>
)
}
ParticipantName.displayName = 'ParticipantName'
@@ -12,6 +12,7 @@ import {
VideoTrack,
TrackRefContext,
ParticipantContextIfNeeded,
useParticipantInfo,
} from '@livekit/components-react'
import React from 'react'
import {
@@ -74,9 +75,12 @@ export const ParticipantTile: (
ref
) {
const { pinnedTrackRef } = useSnapshot(layoutStore)
const trackReference = useEnsureTrackRef(trackRef)
const { identity, name } = useParticipantInfo({
participant: trackReference.participant,
})
const { elementProps } = useParticipantTile<HTMLDivElement>({
htmlProps,
disableSpeakingIndicator,
@@ -222,8 +226,8 @@ export const ParticipantTile: (
)}
<div className="lk-participant-name-wrapper">
<ParticipantName
displayedName={name != '' ? name : identity}
isScreenShare={isScreenShare}
participant={trackReference.participant}
/>
</div>
</div>