Contributing all buttons in one place goes against the designs that we set out at the beginning of the project's rewrite and that multiple of us have been following since then.
81 lines
1.9 KiB
JavaScript
81 lines
1.9 KiB
JavaScript
// @flow
|
|
|
|
import { connect } from 'react-redux';
|
|
|
|
import { translate } from '../../../base/i18n';
|
|
import { MEDIA_TYPE, toggleCameraFacingMode } from '../../../base/media';
|
|
import { AbstractButton } from '../../../base/toolbox';
|
|
import type { AbstractButtonProps } from '../../../base/toolbox';
|
|
import { isLocalTrackMuted } from '../../../base/tracks';
|
|
|
|
type Props = AbstractButtonProps & {
|
|
|
|
/**
|
|
* Whether the current conference is in audio only mode or not.
|
|
*/
|
|
_audioOnly: boolean,
|
|
|
|
/**
|
|
* Whether video is currently muted or not.
|
|
*/
|
|
_videoMuted: boolean,
|
|
|
|
/**
|
|
* The redux {@code dispatch} function.
|
|
*/
|
|
dispatch: Function
|
|
};
|
|
|
|
/**
|
|
* An implementation of a button for toggling the camera facing mode.
|
|
*/
|
|
class ToggleCameraButton extends AbstractButton<Props, *> {
|
|
accessibilityLabel = 'Share room';
|
|
iconName = 'icon-switch-camera';
|
|
label = 'toolbar.switchCamera';
|
|
|
|
/**
|
|
* Handles clicking / pressing the button.
|
|
*
|
|
* @private
|
|
* @returns {void}
|
|
*/
|
|
_handleClick() {
|
|
this.props.dispatch(toggleCameraFacingMode());
|
|
}
|
|
|
|
/**
|
|
* Indicates whether this button is disabled or not.
|
|
*
|
|
* @override
|
|
* @private
|
|
* @returns {boolean}
|
|
*/
|
|
_isDisabled() {
|
|
return this.props._audioOnly || this.props._videoMuted;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Maps (parts of) the redux state to the associated props for the
|
|
* {@code ToggleCameraButton} component.
|
|
*
|
|
* @param {Object} state - The Redux state.
|
|
* @private
|
|
* @returns {{
|
|
* _audioOnly: boolean,
|
|
* _videoMuted: boolean
|
|
* }}
|
|
*/
|
|
function _mapStateToProps(state): Object {
|
|
const { audioOnly } = state['features/base/conference'];
|
|
const tracks = state['features/base/tracks'];
|
|
|
|
return {
|
|
_audioOnly: Boolean(audioOnly),
|
|
_videoMuted: isLocalTrackMuted(tracks, MEDIA_TYPE.VIDEO)
|
|
};
|
|
}
|
|
|
|
export default translate(connect(_mapStateToProps)(ToggleCameraButton));
|