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';
|
|
|
|
|
|
|
|
import { showDesktopSharingButton, toggleFullScreen } from '../actions';
|
|
|
|
import { getToolbarClassNames } from '../functions';
|
2017-04-06 22:40:10 +00:00
|
|
|
import Toolbar from './Toolbar';
|
2017-02-16 23:02:40 +00:00
|
|
|
|
|
|
|
declare var APP: Object;
|
|
|
|
declare var interfaceConfig: Object;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Implementation of PrimaryToolbar React Component.
|
|
|
|
*
|
|
|
|
* @class PrimaryToolbar
|
|
|
|
* @extends Component
|
|
|
|
*/
|
|
|
|
class PrimaryToolbar extends Component {
|
|
|
|
static propTypes = {
|
|
|
|
/**
|
|
|
|
* Handler for toggling fullscreen mode.
|
|
|
|
*/
|
|
|
|
_onFullScreenToggled: React.PropTypes.func,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handler for showing desktop sharing button.
|
|
|
|
*/
|
|
|
|
_onShowDesktopSharingButton: React.PropTypes.func,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Contains toolbar buttons for primary toolbar.
|
|
|
|
*/
|
|
|
|
_primaryToolbarButtons: React.PropTypes.instanceOf(Map),
|
|
|
|
|
|
|
|
/**
|
2017-04-01 05:52:40 +00:00
|
|
|
* Shows whether toolbox is visible.
|
2017-02-16 23:02:40 +00:00
|
|
|
*/
|
|
|
|
_visible: React.PropTypes.bool
|
|
|
|
};
|
|
|
|
|
2017-04-06 22:40:10 +00:00
|
|
|
state: Object;
|
|
|
|
|
2017-02-16 23:02:40 +00:00
|
|
|
/**
|
|
|
|
* Constructs instance of primary toolbar React component.
|
|
|
|
*
|
|
|
|
* @param {Object} props - React component's properties.
|
|
|
|
*/
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
|
|
|
|
const buttonHandlers = {
|
|
|
|
/**
|
|
|
|
* Mount handler for desktop button.
|
|
|
|
*
|
|
|
|
* @type {Object}
|
|
|
|
*/
|
|
|
|
desktop: {
|
|
|
|
onMount: () => this.props._onShowDesktopSharingButton()
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Mount/Unmount handler for toggling fullscreen button.
|
|
|
|
*
|
|
|
|
* @type {Object}
|
|
|
|
*/
|
|
|
|
fullscreen: {
|
|
|
|
onMount: () =>
|
2017-04-06 22:40:10 +00:00
|
|
|
APP.UI.addListener(
|
|
|
|
UIEvents.FULLSCREEN_TOGGLED,
|
2017-02-16 23:02:40 +00:00
|
|
|
this.props._onFullScreenToggled),
|
|
|
|
onUnmount: () =>
|
2017-04-06 22:40:10 +00:00
|
|
|
APP.UI.removeListener(
|
|
|
|
UIEvents.FULLSCREEN_TOGGLED,
|
2017-02-16 23:02:40 +00:00
|
|
|
this.props._onFullScreenToggled)
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const splitterIndex = interfaceConfig.MAIN_TOOLBAR_SPLITTER_INDEX;
|
|
|
|
|
|
|
|
this.state = {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Object containing on mount/unmount handlers for toolbar buttons.
|
|
|
|
*
|
|
|
|
* @type {Object}
|
|
|
|
*/
|
|
|
|
buttonHandlers,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If deployment supports toolbar splitter this value contains its
|
|
|
|
* index.
|
|
|
|
*
|
|
|
|
* @type {number}
|
|
|
|
*/
|
|
|
|
splitterIndex
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Renders primary toolbar component.
|
|
|
|
*
|
|
|
|
* @returns {ReactElement}
|
|
|
|
*/
|
2017-04-06 18:43:36 +00:00
|
|
|
render(): ReactElement<*> | null {
|
2017-02-16 23:02:40 +00:00
|
|
|
const { _primaryToolbarButtons } = this.props;
|
2017-04-06 18:43:36 +00:00
|
|
|
|
|
|
|
// The number of buttons to show in the toolbar isn't fixed, it depends
|
2017-04-06 22:40:10 +00:00
|
|
|
// on the availability of features and configuration parameters. So
|
|
|
|
// there may be nothing to render.
|
2017-04-06 18:43:36 +00:00
|
|
|
if (_primaryToolbarButtons.size === 0) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
const { buttonHandlers, splitterIndex } = this.state;
|
2017-02-16 23:02:40 +00:00
|
|
|
const { primaryToolbarClassName } = getToolbarClassNames(this.props);
|
2017-04-06 22:40:10 +00:00
|
|
|
const tooltipPosition
|
|
|
|
= interfaceConfig.filmStripOnly ? 'left' : 'bottom';
|
2017-02-16 23:02:40 +00:00
|
|
|
|
|
|
|
return (
|
2017-04-01 05:52:40 +00:00
|
|
|
<Toolbar
|
2017-02-16 23:02:40 +00:00
|
|
|
buttonHandlers = { buttonHandlers }
|
|
|
|
className = { primaryToolbarClassName }
|
|
|
|
splitterIndex = { splitterIndex }
|
2017-04-06 22:40:10 +00:00
|
|
|
toolbarButtons = { _primaryToolbarButtons }
|
|
|
|
tooltipPosition = { tooltipPosition } />
|
2017-02-16 23:02:40 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Maps some of the Redux actions to the component props.
|
|
|
|
*
|
|
|
|
* @param {Function} dispatch - Redux action dispatcher.
|
|
|
|
* @returns {{
|
2017-04-06 22:40:10 +00:00
|
|
|
* _onShowDesktopSharingButton: Function
|
2017-02-16 23:02:40 +00:00
|
|
|
* }}
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
function _mapDispatchToProps(dispatch: Function): Object {
|
|
|
|
return {
|
|
|
|
/**
|
|
|
|
* Dispatches an action signalling that full screen mode is toggled.
|
|
|
|
*
|
|
|
|
* @param {boolean} isFullScreen - Show whether fullscreen mode is on.
|
|
|
|
* @returns {Object} Dispatched action.
|
|
|
|
*/
|
|
|
|
_onFullScreenToggled(isFullScreen: boolean) {
|
|
|
|
return dispatch(toggleFullScreen(isFullScreen));
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Dispatches an action signalling that desktop sharing button
|
|
|
|
* should be shown.
|
|
|
|
*
|
|
|
|
* @returns {Object} Dispatched action.
|
|
|
|
*/
|
|
|
|
_onShowDesktopSharingButton() {
|
|
|
|
dispatch(showDesktopSharingButton());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Maps part of Redux store to React component props.
|
|
|
|
*
|
|
|
|
* @param {Object} state - Snapshot of Redux store.
|
|
|
|
* @returns {{
|
2017-04-06 22:40:10 +00:00
|
|
|
* _primaryToolbarButtons: Map,
|
|
|
|
* _visible: boolean
|
2017-02-16 23:02:40 +00:00
|
|
|
* }}
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
function _mapStateToProps(state: Object): Object {
|
|
|
|
const {
|
|
|
|
primaryToolbarButtons,
|
|
|
|
visible
|
2017-04-01 05:52:40 +00:00
|
|
|
} = state['features/toolbox'];
|
2017-02-16 23:02:40 +00:00
|
|
|
|
|
|
|
return {
|
|
|
|
/**
|
|
|
|
* Default toolbar buttons for primary toolbar.
|
|
|
|
*
|
2017-04-06 22:40:10 +00:00
|
|
|
* @private
|
2017-02-16 23:02:40 +00:00
|
|
|
* @type {Map}
|
|
|
|
*/
|
|
|
|
_primaryToolbarButtons: primaryToolbarButtons,
|
|
|
|
|
|
|
|
/**
|
2017-04-01 05:52:40 +00:00
|
|
|
* Shows whether toolbox is visible.
|
2017-02-16 23:02:40 +00:00
|
|
|
*
|
2017-04-06 22:40:10 +00:00
|
|
|
* @private
|
2017-02-16 23:02:40 +00:00
|
|
|
* @type {boolean}
|
|
|
|
*/
|
|
|
|
_visible: visible
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export default connect(_mapStateToProps, _mapDispatchToProps)(PrimaryToolbar);
|