103 lines
2.6 KiB
JavaScript
103 lines
2.6 KiB
JavaScript
|
/* @flow */
|
||
|
|
||
|
import type { Dispatch } from 'redux';
|
||
|
|
||
|
import { appNavigate } from '../app';
|
||
|
import { toggleAudioMuted, toggleVideoMuted } from '../base/media';
|
||
|
|
||
|
/**
|
||
|
* Maps (redux) actions to React component props.
|
||
|
*
|
||
|
* @param {Function} dispatch - Redux action dispatcher.
|
||
|
* @returns {{
|
||
|
* _onHangup: Function,
|
||
|
* _onToggleAudio: Function,
|
||
|
* _onToggleVideo: Function
|
||
|
* }}
|
||
|
* @private
|
||
|
*/
|
||
|
export function abstractMapDispatchToProps(dispatch: Dispatch<*>): Object {
|
||
|
return {
|
||
|
/**
|
||
|
* Dispatches action to leave the current conference.
|
||
|
*
|
||
|
* @private
|
||
|
* @returns {void}
|
||
|
* @type {Function}
|
||
|
*/
|
||
|
_onHangup() {
|
||
|
// XXX We don't know here which value is effectively/internally
|
||
|
// used when there's no valid room name to join. It isn't our
|
||
|
// business to know that anyway. The undefined value is our
|
||
|
// expression of (1) the lack of knowledge & (2) the desire to no
|
||
|
// longer have a valid room name to join.
|
||
|
return dispatch(appNavigate(undefined));
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Dispatches an action to toggle the mute state of the
|
||
|
* audio/microphone.
|
||
|
*
|
||
|
* @private
|
||
|
* @returns {Object} - Dispatched action.
|
||
|
* @type {Function}
|
||
|
*/
|
||
|
_onToggleAudio() {
|
||
|
return dispatch(toggleAudioMuted());
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Dispatches an action to toggle the mute state of the video/camera.
|
||
|
*
|
||
|
* @private
|
||
|
* @returns {Object} - Dispatched action.
|
||
|
* @type {Function}
|
||
|
*/
|
||
|
_onToggleVideo() {
|
||
|
return dispatch(toggleVideoMuted());
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Maps parts of media state to component props.
|
||
|
*
|
||
|
* @param {Object} state - Redux state.
|
||
|
* @protected
|
||
|
* @returns {{
|
||
|
* _audioMuted: boolean,
|
||
|
* _videoMuted: boolean,
|
||
|
* _visible: boolean
|
||
|
* }}
|
||
|
*/
|
||
|
export function abstractMapStateToProps(state: Object): Object {
|
||
|
const media = state['features/base/media'];
|
||
|
const { visible } = state['features/toolbox'];
|
||
|
|
||
|
return {
|
||
|
/**
|
||
|
* Flag showing that audio is muted.
|
||
|
*
|
||
|
* @protected
|
||
|
* @type {boolean}
|
||
|
*/
|
||
|
_audioMuted: media.audio.muted,
|
||
|
|
||
|
/**
|
||
|
* Flag showing whether video is muted.
|
||
|
*
|
||
|
* @protected
|
||
|
* @type {boolean}
|
||
|
*/
|
||
|
_videoMuted: media.video.muted,
|
||
|
|
||
|
/**
|
||
|
* Flag showing whether toolbox is visible.
|
||
|
*
|
||
|
* @protected
|
||
|
* @type {boolean}
|
||
|
*/
|
||
|
_visible: visible
|
||
|
};
|
||
|
}
|