jiti-meet/react/features/toolbox/components/Toolbox.web.js

229 lines
5.3 KiB
JavaScript
Raw Normal View History

2017-02-16 23:02:40 +00:00
/* @flow */
import React, { Component } from 'react';
import { connect } from 'react-redux';
import UIEvents from '../../../../service/UI/UIEvents';
2017-04-01 05:52:40 +00:00
import { setToolboxAlwaysVisible } from '../actions';
2017-02-16 23:02:40 +00:00
import {
abstractMapStateToProps,
showCustomToolbarPopup
} from '../functions';
import Notice from './Notice';
import PrimaryToolbar from './PrimaryToolbar';
import SecondaryToolbar from './SecondaryToolbar';
declare var APP: Object;
declare var config: Object;
declare var interfaceConfig: Object;
/**
2017-04-01 05:52:40 +00:00
* Implements the conference toolbox on React/Web.
2017-02-16 23:02:40 +00:00
*/
2017-04-01 05:52:40 +00:00
class Toolbox extends Component {
2017-02-16 23:02:40 +00:00
/**
* App component's property types.
*
* @static
*/
static propTypes = {
/**
2017-04-01 05:52:40 +00:00
* Handler dispatching reset always visible toolbox action.
2017-02-16 23:02:40 +00:00
*/
2017-04-01 05:52:40 +00:00
_setToolboxAlwaysVisible: React.PropTypes.func,
2017-02-16 23:02:40 +00:00
/**
* Represents conference subject.
*/
_subject: React.PropTypes.string,
/**
* Flag showing whether to set subject slide in animation.
*/
_subjectSlideIn: React.PropTypes.bool,
/**
2017-04-01 05:52:40 +00:00
* Property containing toolbox timeout id.
2017-02-16 23:02:40 +00:00
*/
2017-04-01 05:52:40 +00:00
_timeoutID: React.PropTypes.number
2017-02-16 23:02:40 +00:00
};
/**
2017-04-01 05:52:40 +00:00
* Invokes reset always visible toolbox after mounting the component and
2017-02-16 23:02:40 +00:00
* registers legacy UI listeners.
*
* @returns {void}
*/
componentDidMount(): void {
2017-04-01 05:52:40 +00:00
this.props._setToolboxAlwaysVisible();
2017-02-16 23:02:40 +00:00
2017-04-01 05:52:40 +00:00
APP.UI.addListener(
UIEvents.SHOW_CUSTOM_TOOLBAR_BUTTON_POPUP,
2017-02-16 23:02:40 +00:00
showCustomToolbarPopup);
}
/**
* Unregisters legacy UI listeners.
*
* @returns {void}
*/
componentWillUnmount(): void {
2017-04-01 05:52:40 +00:00
APP.UI.removeListener(
UIEvents.SHOW_CUSTOM_TOOLBAR_BUTTON_POPUP,
2017-02-16 23:02:40 +00:00
showCustomToolbarPopup);
}
/**
* Implements React's {@link Component#render()}.
*
* @inheritdoc
* @returns {ReactElement}
*/
render(): ReactElement<*> {
return (
<div>
{
this._renderSubject()
}
{
this._renderToolbars()
}
<div id = 'sideToolbarContainer' />
</div>
);
}
/**
2017-04-01 05:52:40 +00:00
* Returns React element representing toolbox subject.
2017-02-16 23:02:40 +00:00
*
* @returns {ReactElement}
* @private
*/
_renderSubject(): ReactElement<*> | null {
const { _subjectSlideIn, _subject } = this.props;
const classNames = [ 'subject' ];
if (!_subject) {
return null;
}
if (_subjectSlideIn) {
classNames.push('subject_slide-in');
} else {
classNames.push('subject_slide-out');
}
// XXX: Since chat is now not reactified we have to dangerously set
// inner HTML into the component. This has to be refactored while
// reactification of the Chat.js
const innerHtml = {
__html: _subject
};
return (
<div
className = { classNames.join(' ') }
// eslint-disable-next-line react/no-danger
dangerouslySetInnerHTML = { innerHtml }
id = 'subject' />
);
}
/**
* Renders primary and secondary toolbars.
*
* @returns {ReactElement}
* @private
*/
_renderToolbars(): ReactElement<*> | null {
2017-04-01 05:52:40 +00:00
// The toolbars should not be shown until timeoutID is initialized.
if (this.props._timeoutID === null) {
2017-02-16 23:02:40 +00:00
return null;
}
return (
<div>
<Notice />
<PrimaryToolbar />
<SecondaryToolbar />
</div>
);
}
}
/**
* Maps parts of Redux actions to component props.
*
* @param {Function} dispatch - Redux action dispatcher.
* @returns {{
2017-04-01 05:52:40 +00:00
* _setToolboxAlwaysVisible: Function
2017-02-16 23:02:40 +00:00
* }}
* @private
*/
function _mapDispatchToProps(dispatch: Function): Object {
return {
/**
2017-04-01 05:52:40 +00:00
* Dispatches an action resetting always visible toolbox.
2017-02-16 23:02:40 +00:00
*
* @returns {Object} Dispatched action.
*/
2017-04-01 05:52:40 +00:00
_setToolboxAlwaysVisible() {
dispatch(
setToolboxAlwaysVisible(config.alwaysVisibleToolbar === true));
2017-02-16 23:02:40 +00:00
}
};
}
/**
2017-04-01 05:52:40 +00:00
* Maps parts of toolbox state to component props.
2017-02-16 23:02:40 +00:00
*
* @param {Object} state - Redux state.
* @private
* @returns {{
* _audioMuted: boolean,
* _locked: boolean,
* _subjectSlideIn: boolean,
* _videoMuted: boolean
* }}
*/
function _mapStateToProps(state: Object): Object {
const {
subject,
subjectSlideIn,
2017-04-01 05:52:40 +00:00
timeoutID
} = state['features/toolbox'];
2017-02-16 23:02:40 +00:00
return {
...abstractMapStateToProps(state),
/**
* Property containing conference subject.
*
* @protected
* @type {string}
*/
_subject: subject,
/**
* Flag showing whether to set subject slide in animation.
*
* @protected
* @type {boolean}
*/
_subjectSlideIn: subjectSlideIn,
/**
2017-04-01 05:52:40 +00:00
* Property containing toolbox timeout id.
2017-02-16 23:02:40 +00:00
*
* @protected
* @type {number}
*/
2017-04-01 05:52:40 +00:00
_timeoutID: timeoutID
2017-02-16 23:02:40 +00:00
};
}
2017-04-01 05:52:40 +00:00
export default connect(_mapStateToProps, _mapDispatchToProps)(Toolbox);