/* @flow */ import type { Dispatch } from 'redux'; import { SET_AUDIO_MUTED, SET_AUDIO_AVAILABLE, SET_CAMERA_FACING_MODE, SET_VIDEO_AVAILABLE, SET_VIDEO_MUTED, TOGGLE_CAMERA_FACING_MODE } from './actionTypes'; import { CAMERA_FACING_MODE, VIDEO_MUTISM_AUTHORITY } from './constants'; /** * Action to adjust the availability of the local audio. * * @param {boolean} available - True if the local audio is to be marked as * available or false if the local audio is not available. * @returns {{ * type: SET_AUDIO_AVAILABLE, * available: boolean * }} */ export function setAudioAvailable(available: boolean) { return { type: SET_AUDIO_AVAILABLE, available }; } /** * Action to set the muted state of the local audio. * * @param {boolean} muted - True if the local audio is to be muted or false if * the local audio is to be unmuted. * @returns {{ * type: SET_AUDIO_MUTED, * muted: boolean * }} */ export function setAudioMuted(muted: boolean) { return { type: SET_AUDIO_MUTED, muted }; } /** * Action to set the facing mode of the local camera. * * @param {CAMERA_FACING_MODE} cameraFacingMode - The camera facing mode to set. * @returns {{ * type: SET_CAMERA_FACING_MODE, * cameraFacingMode: CAMERA_FACING_MODE * }} */ export function setCameraFacingMode(cameraFacingMode: CAMERA_FACING_MODE) { return { type: SET_CAMERA_FACING_MODE, cameraFacingMode }; } /** * Action to adjust the availability of the local video. * * @param {boolean} available - True if the local video is to be marked as * available or false if the local video is not available. * @returns {{ * type: SET_VIDEO_AVAILABLE, * available: boolean * }} */ export function setVideoAvailable(available: boolean) { return { type: SET_VIDEO_AVAILABLE, available }; } /** * Action to set the muted state of the local video. * * @param {boolean} muted - True if the local video is to be muted or false if * the local video is to be unmuted. * @param {number} authority - The {@link VIDEO_MUTISM_AUTHORITY} which is * muting/unmuting the local video. * @returns {Function} */ export function setVideoMuted( muted: boolean, authority: number = VIDEO_MUTISM_AUTHORITY.USER) { return (dispatch: Dispatch<*>, getState: Function) => { const oldValue = getState()['features/base/media'].video.muted; // eslint-disable-next-line no-bitwise const newValue = muted ? oldValue | authority : oldValue & ~authority; return dispatch({ type: SET_VIDEO_MUTED, muted: newValue }); }; } /** * Toggles the mute state of the local audio track(s). * * @returns {Function} */ export function toggleAudioMuted() { return (dispatch: Dispatch<*>, getState: Function) => { const muted = getState()['features/base/media'].audio.muted; return dispatch(setAudioMuted(!muted)); }; } /** * Toggles the camera facing mode. Most commonly, for example, mobile devices * such as phones have a front/user-facing and a back/environment-facing * cameras. In contrast to setCameraFacingMode, allows the toggling to be * optimally and/or natively implemented without the overhead of separate reads * and writes of the current/effective camera facing mode. * * @returns {{ * type: TOGGLE_CAMERA_FACING_MODE * }} */ export function toggleCameraFacingMode() { return { type: TOGGLE_CAMERA_FACING_MODE }; } /** * Toggles the mute state of the local video track(s). * * @returns {Function} */ export function toggleVideoMuted() { return (dispatch: Dispatch<*>, getState: Function) => { const muted = getState()['features/base/media'].video.muted; // XXX The following directly invokes the action creator in order to // silence Flow. return setVideoMuted(!muted)(dispatch, getState); }; }