/* @flow */ import React, { Component } from 'react'; import { connect } from 'react-redux'; import UIEvents from '../../../../service/UI/UIEvents'; import { setDefaultToolboxButtons, setToolboxAlwaysVisible } from '../actions'; 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; /** * Implements the conference toolbox on React/Web. */ class Toolbox extends Component { /** * App component's property types. * * @static */ static propTypes = { /** * Handler dispatching setting default buttons action. */ _setDefaultToolboxButtons: React.PropTypes.func, /** * Handler dispatching reset always visible toolbox action. */ _setToolboxAlwaysVisible: React.PropTypes.func, /** * Represents conference subject. */ _subject: React.PropTypes.string, /** * Flag showing whether to set subject slide in animation. */ _subjectSlideIn: React.PropTypes.bool, /** * Property containing toolbox timeout id. */ _timeoutID: React.PropTypes.number }; /** * Invokes reset always visible toolbox after mounting the component and * registers legacy UI listeners. * * @returns {void} */ componentDidMount(): void { this.props._setToolboxAlwaysVisible(); APP.UI.addListener( UIEvents.SHOW_CUSTOM_TOOLBAR_BUTTON_POPUP, showCustomToolbarPopup); // FIXME The redux action SET_DEFAULT_TOOLBOX_BUTTONS and related source // code such as the redux action creator setDefaultToolboxButtons and // _setDefaultToolboxButtons were introduced to solve the following bug // in the implementation of features/toolbar at the time of this // writing: getDefaultToolboxButtons uses interfaceConfig which is not // in the redux store at the time of this writing yet interfaceConfig is // modified after getDefaultToolboxButtons is called. // SET_DEFAULT_TOOLBOX_BUTTONS represents/implements an explicit delay // of the invocation of getDefaultToolboxButtons until, heuristically, // all existing changes to interfaceConfig have been applied already in // our known execution paths. this.props._setDefaultToolboxButtons(); } /** * Unregisters legacy UI listeners. * * @returns {void} */ componentWillUnmount(): void { APP.UI.removeListener( UIEvents.SHOW_CUSTOM_TOOLBAR_BUTTON_POPUP, showCustomToolbarPopup); } /** * Implements React's {@link Component#render()}. * * @inheritdoc * @returns {ReactElement} */ render(): ReactElement<*> { return (