// @flow import type { Dispatch } from 'redux'; import UIEvents from '../../../service/UI/UIEvents'; import { AUDIO_MUTE, createRemoteMuteConfirmedEvent, createToolbarEvent, sendAnalytics } from '../analytics'; import { hideDialog } from '../base/dialog'; import { setAudioMuted } from '../base/media'; import { getLocalParticipant, muteRemoteParticipant } from '../base/participants'; import { RemoteVideoMenu } from './components'; declare var APP: Object; /** * Hides the remote video menu. * * @returns {Function} */ export function hideRemoteVideoMenu() { return hideDialog(RemoteVideoMenu); } /** * Mutes the local participant. * * @param {boolean} enable - Whether to mute or unmute. * @returns {Function} */ export function muteLocal(enable: boolean) { return (dispatch: Dispatch) => { sendAnalytics(createToolbarEvent(AUDIO_MUTE, { enable })); dispatch(setAudioMuted(enable, /* 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(UIEvents.AUDIO_MUTED, enable, true); }; } /** * Mutes the remote participant with the given ID. * * @param {string} participantId - ID of the participant to mute. * @returns {Function} */ export function muteRemote(participantId: string) { return (dispatch: Dispatch) => { sendAnalytics(createRemoteMuteConfirmedEvent(participantId)); dispatch(muteRemoteParticipant(participantId)); }; } /** * Mutes all participants. * * @param {Array} exclude - Array of participant IDs to not mute. * @returns {Function} */ export function muteAllParticipants(exclude: Array) { 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) : muteRemote(id)) .map(dispatch); /* eslint-enable no-confusing-arrow */ }; }