function _addConferenceListeners()

in react/features/base/conference/actions.js [85:256]


function _addConferenceListeners(conference, dispatch, state) {
    // A simple logger for conference errors received through
    // the listener. These errors are not handled now, but logged.
    conference.on(JitsiConferenceEvents.CONFERENCE_ERROR,
        error => logger.error('Conference error.', error));

    // Dispatches into features/base/conference follow:

    conference.on(
        JitsiConferenceEvents.CONFERENCE_FAILED,
        (...args) => dispatch(conferenceFailed(conference, ...args)));
    conference.on(
        JitsiConferenceEvents.CONFERENCE_JOINED,
        (...args) => dispatch(conferenceJoined(conference, ...args)));
    conference.on(
        JitsiConferenceEvents.CONFERENCE_LEFT,
        (...args) => {
            dispatch(conferenceTimestampChanged(0));
            dispatch(conferenceLeft(conference, ...args));
        });
    conference.on(JitsiConferenceEvents.SUBJECT_CHANGED,
        (...args) => dispatch(conferenceSubjectChanged(...args)));

    conference.on(JitsiConferenceEvents.CONFERENCE_CREATED_TIMESTAMP,
        (...args) => dispatch(conferenceTimestampChanged(...args)));

    conference.on(
        JitsiConferenceEvents.KICKED,
        (...args) => dispatch(kickedOut(conference, ...args)));

    conference.on(
        JitsiConferenceEvents.PARTICIPANT_KICKED,
        (kicker, kicked) => dispatch(participantKicked(kicker, kicked)));

    conference.on(
        JitsiConferenceEvents.LOCK_STATE_CHANGED,
        (...args) => dispatch(lockStateChanged(conference, ...args)));

    // Dispatches into features/base/media follow:

    conference.on(
        JitsiConferenceEvents.STARTED_MUTED,
        () => {
            const audioMuted = Boolean(conference.isStartAudioMuted());
            const videoMuted = Boolean(conference.isStartVideoMuted());
            const localTracks = getLocalTracks(state['features/base/tracks']);

            sendAnalytics(createStartMutedConfigurationEvent('remote', audioMuted, videoMuted));
            logger.log(`Start muted: ${audioMuted ? 'audio, ' : ''}${videoMuted ? 'video' : ''}`);

            // XXX Jicofo tells lib-jitsi-meet to start with audio and/or video
            // muted i.e. Jicofo expresses an intent. Lib-jitsi-meet has turned
            // Jicofo's intent into reality by actually muting the respective
            // tracks. The reality is expressed in base/tracks already so what
            // is left is to express Jicofo's intent in base/media.
            // TODO Maybe the app needs to learn about Jicofo's intent and
            // transfer that intent to lib-jitsi-meet instead of lib-jitsi-meet
            // acting on Jicofo's intent without the app's knowledge.
            dispatch(setAudioMuted(audioMuted));
            dispatch(setVideoMuted(videoMuted));

            // Remove the tracks from peerconnection as well.
            for (const track of localTracks) {
                const trackType = track.jitsiTrack.getType();

                // Do not remove the audio track on RN. Starting with iOS 15 it will fail to unmute otherwise.
                if ((audioMuted && trackType === MEDIA_TYPE.AUDIO && navigator.product !== 'ReactNative')
                        || (videoMuted && trackType === MEDIA_TYPE.VIDEO)) {
                    dispatch(replaceLocalTrack(track.jitsiTrack, null, conference));
                }
            }
        });

    conference.on(
        JitsiConferenceEvents.AUDIO_UNMUTE_PERMISSIONS_CHANGED,
        disableAudioMuteChange => {
            const muted = isAudioMuted(state);

            // Disable the mute button only if its muted.
            if (!disableAudioMuteChange || (disableAudioMuteChange && muted)) {
                dispatch(setAudioUnmutePermissions(disableAudioMuteChange));
            }
        });
    conference.on(
        JitsiConferenceEvents.VIDEO_UNMUTE_PERMISSIONS_CHANGED,
        disableVideoMuteChange => {
            const muted = isVideoMuted(state);

            // Disable the mute button only if its muted.
            if (!disableVideoMuteChange || (disableVideoMuteChange && muted)) {
                dispatch(setVideoUnmutePermissions(disableVideoMuteChange));
            }
        });

    // Dispatches into features/base/tracks follow:

    conference.on(
        JitsiConferenceEvents.TRACK_ADDED,
        t => t && !t.isLocal() && dispatch(trackAdded(t)));
    conference.on(
        JitsiConferenceEvents.TRACK_REMOVED,
        t => t && !t.isLocal() && dispatch(trackRemoved(t)));

    conference.on(
        JitsiConferenceEvents.TRACK_MUTE_CHANGED,
        (track, participantThatMutedUs) => {
            if (participantThatMutedUs) {
                dispatch(participantMutedUs(participantThatMutedUs, track));
            }
        });

    // Dispatches into features/base/participants follow:
    conference.on(
        JitsiConferenceEvents.DISPLAY_NAME_CHANGED,
        (id, displayName) => dispatch(participantUpdated({
            conference,
            id,
            name: getNormalizedDisplayName(displayName)
        })));

    conference.on(
        JitsiConferenceEvents.DOMINANT_SPEAKER_CHANGED,
        (dominant, previous) => dispatch(dominantSpeakerChanged(dominant, previous, conference)));

    conference.on(
        JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED,
        (...args) => dispatch(endpointMessageReceived(...args)));

    conference.on(
        JitsiConferenceEvents.NON_PARTICIPANT_MESSAGE_RECEIVED,
        (...args) => dispatch(nonParticipantMessageReceived(...args)));

    conference.on(
        JitsiConferenceEvents.PARTICIPANT_CONN_STATUS_CHANGED,
        (...args) => dispatch(participantConnectionStatusChanged(...args)));

    conference.on(
        JitsiConferenceEvents.USER_JOINED,
        (id, user) => commonUserJoinedHandling({ dispatch }, conference, user));
    conference.on(
        JitsiConferenceEvents.USER_LEFT,
        (id, user) => commonUserLeftHandling({ dispatch }, conference, user));
    conference.on(
        JitsiConferenceEvents.USER_ROLE_CHANGED,
        (...args) => dispatch(participantRoleChanged(...args)));
    conference.on(
        JitsiConferenceEvents.USER_STATUS_CHANGED,
        (...args) => dispatch(participantPresenceChanged(...args)));

    conference.on(
        JitsiConferenceEvents.BOT_TYPE_CHANGED,
        (id, botType) => dispatch(participantUpdated({
            conference,
            id,
            botType
        })));

    conference.addCommandListener(
        AVATAR_URL_COMMAND,
        (data, id) => dispatch(participantUpdated({
            conference,
            id,
            avatarURL: data.value
        })));
    conference.addCommandListener(
        EMAIL_COMMAND,
        (data, id) => dispatch(participantUpdated({
            conference,
            id,
            email: data.value
        })));
}