export default function LiveEventMeetingStatusProvider()

in src/components/Moderator/LiveEventView/MeetingStatusProvider.tsx [31:154]


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

  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;

  const observer = {
    audioVideoDidStop: (sessionStatus: MeetingSessionStatus): void => {
      if (
        sessionStatus.statusCode() === MeetingSessionStatusCode.AudioCallEnded
      ) {
        history.push(routes.HOME);
      }
    },
    audioVideoDidStart: (): void => {
      console.log('AV did start.');

      if (chime && chime.currentAudioInputDevice) {
        console.log(
          'Re-selecting current audio:',
          chime.currentAudioInputDevice
        );
        chime.audioVideo?.chooseAudioInputDevice(
          chime.currentAudioInputDevice.value
        );
      }

      // There is a chance that we need this to unbreak audio.
      // chime?.audioVideo?.realtimeUnmuteLocalAudio();
    },
  };

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

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

        if (joinMuted) {
          console.log('Automatically muting self on join.');
          chime?.audioVideo?.realtimeMuteLocalAudio();
        }

        setMeetingStatus({
          meetingStatus: MeetingStatus.Succeeded,
        });

        chime?.audioVideo?.addObserver(observer);

        await chime?.joinRoom(audioElement.current);
      } catch (error) {
        console.error(error);
        setMeetingStatus({
          meetingStatus: MeetingStatus.Failed,
          errorMessage: error.message,
        });
      }
    };

    if (meetingId) {
      start();
    }

    return () => {
      console.log('Meeting title param changed, leaving meeting...');
      setMeetingStatus({
        meetingStatus: MeetingStatus.Ended,
      });
      chime?.audioVideo?.removeObserver(observer);
      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 () => {
      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>
  );
}