in src/components/Controls.tsx [27:175]
export default function Controls(props: Props) {
const {
allowAudioControls,
allowVideoControls,
allowLeave,
allowEnd,
onEnd,
} = props;
const chime: ChimeSdkWrapper | null = useContext(getChimeContext());
const [muted, setMuted] = useState(false);
const [videoStatus, setVideoStatus] = useState(VideoStatus.Disabled);
const translate = useTranslate();
const history = useHistory();
useEffect(() => {
const callback = (localMuted: boolean) => {
setMuted(localMuted);
};
chime?.audioVideo?.realtimeSubscribeToMuteAndUnmuteLocalAudio(callback);
if (chime?.audioVideo?.hasStartedLocalVideoTile()) {
setVideoStatus(VideoStatus.Enabled);
}
return () => {
chime?.audioVideo?.realtimeUnsubscribeToMuteAndUnmuteLocalAudio(callback);
};
}, []);
return (
<ButtonGroup
className={cx('controls', {
videoEnabled: videoStatus === VideoStatus.Enabled,
audioMuted: muted,
})}
>
{allowAudioControls && (
<>
<div className={cx('micMuted')}>
<FormattedMessage id='Controls.micMutedInScreenViewMode' />
</div>
<Tooltip
tooltip={
muted
? translate('Controls.unmuteTooltip')
: translate('Controls.muteTooltip')
}
>
<IconButton
className={cx('muteButton', {
enabled: !muted,
})}
onClick={async () => {
if (muted) {
chime?.audioVideo?.realtimeUnmuteLocalAudio();
} else {
chime?.audioVideo?.realtimeMuteLocalAudio();
}
// Adds a slight delay to close the tooltip before rendering the updated text in it
await new Promise(resolve => setTimeout(resolve, 10));
}}
icon={muted ? icons.MIC_DISABLED : icons.MIC}
/>
</Tooltip>
</>
)}
{allowVideoControls && (
<Tooltip
tooltip={
videoStatus === VideoStatus.Disabled
? translate('Controls.turnOnVideoTooltip')
: translate('Controls.turnOffVideoTooltip')
}
>
<IconButton
className={cx('videoButton', {
enabled: videoStatus === VideoStatus.Enabled,
})}
onClick={async () => {
// Adds a slight delay to close the tooltip before rendering the updated text in it
await new Promise(resolve => setTimeout(resolve, 10));
console.debug('Current video status:', VideoStatus.Disabled);
if (videoStatus === VideoStatus.Disabled) {
setVideoStatus(VideoStatus.Loading);
try {
if (!chime?.currentVideoInputDevice) {
throw new Error('currentVideoInputDevice does not exist');
}
await chime?.chooseVideoInputDevice(
chime?.currentVideoInputDevice
);
console.info('Starting local video.', chime?.audioVideo);
console.info(
'Current input:',
chime?.currentVideoInputDevice
);
chime?.audioVideo?.startLocalVideoTile();
setVideoStatus(VideoStatus.Enabled);
} catch (error) {
console.error(error);
setVideoStatus(VideoStatus.Disabled);
}
} else if (videoStatus === VideoStatus.Enabled) {
setVideoStatus(VideoStatus.Loading);
chime?.audioVideo?.stopLocalVideoTile();
setVideoStatus(VideoStatus.Disabled);
}
}}
icon={
videoStatus === VideoStatus.Enabled
? icons.VIDEO
: icons.VIDEO_DISABLED
}
/>
</Tooltip>
)}
{allowEnd && (
<Tooltip tooltip={translate('Controls.endMeetingTooltip')}>
<IconButton
variant='danger'
onClick={() => {
if (onEnd) {
onEnd();
} else {
chime?.disableVideoAndLeaveRoom(true).then(() => {
history.push(routes.HOME);
});
}
}}
icon={icons.CLOSE}
/>
</Tooltip>
)}
{allowLeave && (
<Tooltip tooltip={translate('Controls.leaveMeetingTooltip')}>
<IconButton
variant='danger'
onClick={() => {
chime?.disableVideoAndLeaveRoom().then(() => {
history.push(`${routes.HOME}`);
});
}}
icon={icons.CLOSE}
/>
</Tooltip>
)}
</ButtonGroup>
);
}