// @ts-expect-error import UIEvents from '../../../service/UI/UIEvents'; import { VIDEO_MUTE, createToolbarEvent } from '../analytics/AnalyticsEvents'; import { sendAnalytics } from '../analytics/functions'; import { IStore } from '../app/types'; import { setAudioOnly } from '../base/audio-only/actions'; import { setVideoMuted } from '../base/media/actions'; import { VIDEO_MUTISM_AUTHORITY } from '../base/media/constants'; import { getLocalVideoType } from '../base/tracks/functions'; import { SET_TOOLBOX_ENABLED, SET_TOOLBOX_VISIBLE, TOGGLE_TOOLBOX_VISIBLE } from './actionTypes'; /** * Enables/disables the toolbox. * * @param {boolean} enabled - True to enable the toolbox or false to disable it. * @returns {{ * type: SET_TOOLBOX_ENABLED, * enabled: boolean * }} */ export function setToolboxEnabled(enabled: boolean): Object { return { type: SET_TOOLBOX_ENABLED, enabled }; } /** * Shows/hides the toolbox. * * @param {boolean} visible - True to show the toolbox or false to hide it. * @returns {Function} */ export function setToolboxVisible(visible: boolean) { return (dispatch: IStore['dispatch'], getState: IStore['getState']) => { const { toolbarConfig } = getState()['features/base/config']; const alwaysVisible = toolbarConfig?.alwaysVisible; if (!visible && alwaysVisible) { return; } dispatch({ type: SET_TOOLBOX_VISIBLE, visible }); }; } /** * Action to toggle the toolbox visibility. * * @returns {Function} */ export function toggleToolboxVisible() { return (dispatch: IStore['dispatch'], getState: IStore['getState']) => { const state = getState(); const { toolbarConfig } = getState()['features/base/config']; const alwaysVisible = toolbarConfig?.alwaysVisible; const { visible } = state['features/toolbox']; if (visible && alwaysVisible) { return; } dispatch({ type: TOGGLE_TOOLBOX_VISIBLE }); }; } /** * Action to handle toggle video from toolbox's video buttons. * * @param {boolean} muted - Whether to mute or unmute. * @param {boolean} showUI - When set to false will not display any error. * @param {boolean} ensureTrack - True if we want to ensure that a new track is * created if missing. * @returns {Function} */ export function handleToggleVideoMuted(muted: boolean, showUI: boolean, ensureTrack: boolean) { return (dispatch: IStore['dispatch'], getState: IStore['getState']) => { const state = getState(); const { enabled: audioOnly } = state['features/base/audio-only']; const tracks = state['features/base/tracks']; sendAnalytics(createToolbarEvent(VIDEO_MUTE, { enable: muted })); if (audioOnly) { dispatch(setAudioOnly(false)); } const mediaType = getLocalVideoType(tracks); dispatch( setVideoMuted( muted, mediaType, VIDEO_MUTISM_AUTHORITY.USER, ensureTrack)); // FIXME: The old conference logic still relies on this event being // emitted. typeof APP === 'undefined' || APP.UI.emitEvent(UIEvents.VIDEO_MUTED, muted, showUI); }; }