export default function MeetingStatusProvider()

in src/components/talent/MeetingStatusProvider.tsx [29:134]


export default function MeetingStatusProvider(props: Props) {
  const translate = useTranslate();
  const MeetingStatusContext = getMeetingStatusContext();
  const { children, joinMuted = false, joinWithVideo = true } = props;
  const chime: ChimeSdkWrapper | null = useContext(getChimeContext());
  const talentMeetingService = useTalentMeetingContext();
  const verifiedParticipant = useVerifiedParticipantContext();

  const [meetingStatus, setMeetingStatus] = useState<MeetingStatus>(
    MeetingStatus.Loading
  );
  const [errorMessage, setErrorMessage] = useState<string>();

  useVideoSendError(meetingStatus);
  const state = useMetaState();

  const history = useHistory();
  const query = new URLSearchParams(useLocation().search);
  const audioElement = useRef<HTMLAudioElement>(null);
  const meetingId = talentMeetingService.talentMeeting?.id;

  useEffect(() => {
    let mainObserver: AudioVideoObserver;
    const start = async () => {
      try {
        if (!meetingId) {
          throw new Error('Must have meetingId to get meeting status.');
        }

        if (!chime) {
          return;
        }

        await chime.createRoom(
          meetingId,
          verifiedParticipant.attendeeName,
          query.get('region') || 'us-east-1'
        );

        setMeetingStatus(MeetingStatus.Succeeded);

        if (!chime.audioVideo) {
          return;
        }

        mainObserver = makeAVObserver(chime.audioVideo, {
          ...makeReselects(chime),
          joinMuted,
          joinWithVideo,
          onEnded: () => {
            history.push(routes.HOME);
          },
        });

        chime.audioVideo.addObserver(mainObserver);

        await chime.joinRoom(audioElement.current);

        const attendeeId = chime?.configuration?.credentials?.attendeeId;
        if (!attendeeId) {
          throw Error(
            'Unable to set the talentAttendeeId for the talent meeting.'
          );
        }
        await talentMeetingService.setTalentAttendeeId(attendeeId);
      } catch (error) {
        console.error('Error setting talent meeting attendee id', error);
        setMeetingStatus(MeetingStatus.Failed);
        setErrorMessage(
          translate('Failed to join the talent meeting. Please try again.')
        );
      }
    };

    if (meetingId) {
      start();
    }

    return () => {
      console.log('Meeting title param changed, leaving meeting...');
      setMeetingStatus(MeetingStatus.Ended);
      chime?.audioVideo?.removeObserver(mainObserver);
      chime?.leaveRoom(false);
    };
  }, [meetingId]);

  useEffect(() => {
    if (meetingStatus !== MeetingStatus.Succeeded || !audioElement.current) {
      return;
    }

    if (state.oneOnOneMeetingId) {
      console.log('1on1 meeting started, muting primary meeting audio');
      chime?.audioVideo?.unbindAudioElement();
    } else {
      chime?.audioVideo?.bindAudioElement(audioElement.current);
    }
  }, [meetingStatus, state.oneOnOneMeetingId]);

  return (
    <MeetingStatusContext.Provider value={{ meetingStatus, errorMessage }}>
      <audio ref={audioElement} style={{ display: 'none' }} />
      {children}
    </MeetingStatusContext.Provider>
  );
}