// @flow import { getLogger } from 'jitsi-meet-logger'; import type { Dispatch } from 'redux'; import UIEvents from '../../../service/UI/UIEvents'; import { AUDIO_MUTE, createRemoteMuteConfirmedEvent, createToolbarEvent, sendAnalytics, VIDEO_MUTE } from '../analytics'; import { MEDIA_TYPE, setAudioMuted, setVideoMuted, VIDEO_MUTISM_AUTHORITY } from '../base/media'; import { getLocalParticipant, muteRemoteParticipant } from '../base/participants'; declare var APP: Object; const logger = getLogger(__filename); /** * Mutes the local participant. * * @param {boolean} enable - Whether to mute or unmute. * @param {MEDIA_TYPE} mediaType - The type of the media channel to mute. * @returns {Function} */ export function muteLocal(enable: boolean, mediaType: MEDIA_TYPE) { return (dispatch: Dispatch) => { const isAudio = mediaType === MEDIA_TYPE.AUDIO; if (!isAudio && mediaType !== MEDIA_TYPE.VIDEO) { logger.error(`Unsupported media type: ${mediaType}`); return; } sendAnalytics(createToolbarEvent(isAudio ? AUDIO_MUTE : VIDEO_MUTE, { enable })); dispatch(isAudio ? setAudioMuted(enable, /* ensureTrack */ true) : setVideoMuted(enable, mediaType, VIDEO_MUTISM_AUTHORITY.USER, /* ensureTrack */ true)); // FIXME: The old conference logic as well as the shared video feature // still rely on this event being emitted. typeof APP === 'undefined' || APP.UI.emitEvent(isAudio ? UIEvents.AUDIO_MUTED : UIEvents.VIDEO_MUTED, enable, true); }; } /** * Mutes the remote participant with the given ID. * * @param {string} participantId - ID of the participant to mute. * @param {MEDIA_TYPE} mediaType - The type of the media channel to mute. * @returns {Function} */ export function muteRemote(participantId: string, mediaType: MEDIA_TYPE) { return (dispatch: Dispatch) => { if (mediaType !== MEDIA_TYPE.AUDIO && mediaType !== MEDIA_TYPE.VIDEO) { logger.error(`Unsupported media type: ${mediaType}`); return; } sendAnalytics(createRemoteMuteConfirmedEvent(participantId, mediaType)); dispatch(muteRemoteParticipant(participantId, mediaType)); }; } /** * Mutes all participants. * * @param {Array} exclude - Array of participant IDs to not mute. * @param {MEDIA_TYPE} mediaType - The media type to mute. * @returns {Function} */ export function muteAllParticipants(exclude: Array, mediaType: MEDIA_TYPE) { return (dispatch: Dispatch, getState: Function) => { const state = getState(); const localId = getLocalParticipant(state).id; const participantIds = state['features/base/participants'] .map(p => p.id); /* eslint-disable no-confusing-arrow */ participantIds .filter(id => !exclude.includes(id)) .map(id => id === localId ? muteLocal(true, mediaType) : muteRemote(id, mediaType)) .map(dispatch); /* eslint-enable no-confusing-arrow */ }; }