export default function OneOnOneMeetingStatusProvider()

in src/components/Moderator/OneOnOneMeeting/MeetingStatusProvider.tsx [38:180]


export default function OneOnOneMeetingStatusProvider(props: Props) {
  const MeetingStatusContext = getMeetingStatusContext();
  const liveEventMessagesDispatch = useLiveEventMessagesDispatch();
  const { children } = props;
  const chime: ChimeSdkWrapper | null = useContext(getChimeContext());
  const [meetingStatus, setMeetingStatus] = useState<{
    meetingStatus: MeetingStatus;
    errorMessage?: string;
  }>({
    meetingStatus: MeetingStatus.Loading,
  });
  useVideoSendError(meetingStatus.meetingStatus);
  const {
    oneOnOneMeetingId,
    activeAudio,
    onStartOneOnOneError,
    onStartOneOnOneSuccess,
  } = useMetaState();
  const dispatch = useMetaDispatch();
  const audioElement = useRef<HTMLAudioElement>(null);

  useEffect(() => {
    if (!oneOnOneMeetingId) return;

    const observer = {
      audioVideoDidStop: (sessionStatus: MeetingSessionStatus): void => {
        const status = sessionStatus.statusCode();
        if (status === MeetingSessionStatusCode.AudioCallEnded) {
          console.log(`1on1 meeting ended with status - ${status}`);
          dispatch({
            type: Types.ONE_ON_ONE_ENDED,
          });
        }
      },
    };

    const presenceChanged = (
      attendeeID: string,
      present: boolean,
      externalAttendeeId?: string | null | undefined
    ) => {
      const self = chime?.configuration?.credentials?.attendeeId;
      if (attendeeID === self) {
        return;
      }
      console.log(`Attendee ${attendeeID} changed presence to ${present}.`);
      console.log(`External Attendee Id: ${externalAttendeeId}`);
      if (!present) {
        console.log(`Other attendee left; ending meeting.`);
        dispatch({
          type: Types.ONE_ON_ONE_ENDED,
        });
      } else {
        liveEventMessagesDispatch?.({
          type: MsgType.REMOVE_QUEUED_MESSAGE,
          payload: {
            attendeeId: externalAttendeeId,
            event: RemoveMessageEventType.MODERATOR_1ON1_STARTED,
          } as RemoveMessagePayload,
        });
        console.log('Attendee joined: remotely unmuting them.');
        dispatch({
          type: Types.ATTENDEE_JOINED_ONE_ON_ONE,
          payload: externalAttendeeId,
        });
        chime?.sendMessage(MessageType.UNMUTE, {
          targetAttendeeId: attendeeID,
        });
      }
    };

    const start = async () => {
      try {
        await chime?.createRoom(oneOnOneMeetingId, 'Moderator', 'us-east-1');

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

        chime?.audioVideo?.addObserver(observer);
        chime?.audioVideo?.realtimeSubscribeToAttendeeIdPresence(
          presenceChanged
        );

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

    return () => {
      chime?.audioVideo?.realtimeUnsubscribeToAttendeeIdPresence(
        presenceChanged
      );
      chime?.audioVideo?.removeObserver(observer);

      // This means we left a 1:1 for some reason, so delete (by ending) that meetingID.
      const endMeeting = true;
      chime?.disableVideoAndLeaveRoom(endMeeting);

      setMeetingStatus({
        meetingStatus: MeetingStatus.Ended,
      });
    };
  }, [oneOnOneMeetingId]);

  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>
  );
}