in src/components/attendee/MeetingStatusProvider.tsx [30:146]
export default function MeetingStatusProvider(props: Props): JSX.Element {
const MeetingStatusContext = getMeetingStatusContext();
const { children, joinMuted = false } = props;
const chime: ChimeSdkWrapper | null = useContext(getChimeContext());
const talentMeetingService = useTalentMeetingContext();
const verifiedParticipant = useVerifiedParticipantContext();
const attendeeName = verifiedParticipant.attendeeName;
const [meetingStatus, setMeetingStatus] = useState<{
meetingStatus: MeetingStatus;
errorMessage?: string;
}>({
meetingStatus: MeetingStatus.Loading,
});
useVideoSendError(meetingStatus.meetingStatus);
const { activeAudio } = useMetaState();
const history = useHistory();
const query = new URLSearchParams(useLocation().search);
const audioElement = useRef<HTMLAudioElement>(null);
const meetingId =
query.get('title') || talentMeetingService.talentMeeting?.id;
useEffect(() => {
let mainObserver: AudioVideoObserver;
const start = async (): Promise<void> => {
try {
if (!meetingId) {
throw new Error('Cannot join meeting without a meeting ID.');
}
if (!chime) {
throw new Error('Chime has not been initialized.');
}
await chime.createRoom(
meetingId,
attendeeName,
query.get('region') || 'us-east-1'
);
setMeetingStatus({
meetingStatus: MeetingStatus.Succeeded,
});
if (!chime.audioVideo) {
return;
}
mainObserver = makeAVObserver(chime.audioVideo, {
...makeReselects(chime),
joinMuted,
joinWithVideo: false,
onEnded: () => {
history.push(routes.HOME);
},
});
chime.audioVideo.addObserver(mainObserver);
await chime.joinRoom(audioElement.current);
} catch (error) {
console.error(`Failed to join meeting ${meetingId} - ${error}`);
setMeetingStatus({
meetingStatus: MeetingStatus.Failed,
});
}
};
if (meetingId) {
start();
}
return (): void => {
console.log('Meeting title param changed, leaving meeting...');
setMeetingStatus({
meetingStatus: MeetingStatus.Ended,
});
chime?.audioVideo?.removeObserver(mainObserver);
chime?.dropAudio().then(() => {
chime?.disableVideoAndLeaveRoom(false);
});
};
}, [meetingId]);
useEffect(() => {
if (
activeAudio === MeetingAudio.ONE_ON_ONE ||
meetingStatus.meetingStatus !== MeetingStatus.Succeeded
) {
return;
}
if (audioElement.current) {
console.log(`ActiveAudio changed: ${activeAudio}. Binding audio element`);
chime?.audioVideo?.bindAudioElement(audioElement.current);
}
return (): void => {
console.log(`Unbinding audio element from ${activeAudio}`);
chime?.audioVideo?.unbindAudioElement();
chime?.audioVideo?.realtimeMuteLocalAudio();
};
}, [activeAudio, meetingStatus.meetingStatus]);
return (
<MeetingStatusContext.Provider value={meetingStatus}>
<audio
ref={audioElement}
style={{
display: 'none',
}}
/>
{children}
</MeetingStatusContext.Provider>
);
}