Component props
The rendered VideoTile component
Use VideoTile for remote participants - it handles both video display and audio playback (via a hidden audio element). For the local user's video, use LocalVideoTile instead.
When to use VideoTile vs LocalVideoTile:
When to use VideoTile directly vs VideoGrid:
Key Features:
Audio Handling: The component uses a separate hidden audio element for audio playback. The video element is always muted to prevent echo - audio comes from the separate audio element.
Basic usage:
import { VideoTile } from '@hiyve/react-ui';
<VideoTile
userId="participant-123"
videoStream={participant.videoStream}
audioStream={participant.audioStream}
userName="John Doe"
/>
Audio-only participant (no video):
<VideoTile
userId="participant-123"
videoStream={null}
audioStream={participant.audioStream}
audioOnly={true}
userName="John Doe"
/>
With all status indicators:
<VideoTile
userId="participant-123"
videoStream={participant.videoStream}
audioStream={participant.audioStream}
userName="John Doe"
showMuteIndicators={true}
showName={true}
isMuted={{ audio: true, video: false }}
isRaisedHand={true}
isDominant={activeSpeakerId === "participant-123"}
/>
Full customization:
<VideoTile
userId="participant-123"
videoStream={participant.videoStream}
audioStream={participant.audioStream}
userName="John Doe"
showMuteIndicators={true}
showZoom={true}
isDominant={true}
labelPosition="bottom-left"
statusPosition="top-right"
controlPosition="bottom-right"
colors={{
dominantBorder: '#00ff00',
avatarPalette: ['#ff6b6b', '#4ecdc4', '#45b7d1'],
}}
renderProps={{
renderOverlay: () => <CustomBadge />,
renderAvatar: (userId, name, color) => <CustomAvatar name={name} />,
}}
onClick={() => handleParticipantClick("participant-123")}
/>
VideoGrid from @hiyve/react-ui for automatic layout of all tiles
VideoTile displays a remote participant's video and audio stream.