| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 | 
							- /* @flow */
 - 
 - import SideContainerToggler
 -     from '../../../modules/UI/side_pannels/SideContainerToggler';
 - 
 - import { appNavigate } from '../app';
 - import { toggleAudioMuted, toggleVideoMuted } from '../base/media';
 - 
 - import defaultToolbarButtons from './defaultToolbarButtons';
 - 
 - import type { Dispatch } from 'redux-thunk';
 - 
 - type MapOfAttributes = { [key: string]: * };
 - 
 - declare var $: Function;
 - declare var AJS: Object;
 - declare var interfaceConfig: Object;
 - 
 - /**
 -  * 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
 -     };
 - }
 - 
 - /* eslint-disable flowtype/space-before-type-colon */
 - 
 - /**
 -  * Takes toolbar button props and maps them to HTML attributes to set.
 -  *
 -  * @param {Object} props - Props set to the React component.
 -  * @returns {MapOfAttributes}
 -  */
 - export function getButtonAttributesByProps(props: Object = {})
 -         : MapOfAttributes {
 -     let classNames = props.classNames;
 - 
 -     if (classNames) {
 -         // XXX Make sure to not modify props.classNames because that'd be bad
 -         // practice.
 -         classNames = [ ...classNames ];
 -     }
 - 
 -     props.toggled && classNames.push('toggled');
 -     props.unclickable && classNames.push('unclickable');
 - 
 -     const result: MapOfAttributes = {
 -         className: classNames.join(' '),
 -         'data-container': 'body',
 -         'data-placement': 'bottom',
 -         id: props.id
 -     };
 - 
 -     if (!props.enabled) {
 -         result.disabled = 'disabled';
 -     }
 - 
 -     if (props.hidden) {
 -         result.style = { display: 'none' };
 -     }
 - 
 -     return result;
 - }
 - 
 - /* eslint-enable flowtype/space-before-type-colon */
 - 
 - /**
 -  * Returns an object which contains the default buttons for the primary and
 -  * secondary toolbars.
 -  *
 -  * @returns {Object}
 -  */
 - export function getDefaultToolboxButtons(): Object {
 -     let toolbarButtons = {
 -         primaryToolbarButtons: new Map(),
 -         secondaryToolbarButtons: new Map()
 -     };
 - 
 -     if (typeof interfaceConfig !== 'undefined'
 -             && interfaceConfig.TOOLBAR_BUTTONS) {
 -         const { filmStripOnly } = interfaceConfig;
 - 
 -         toolbarButtons
 -             = interfaceConfig.TOOLBAR_BUTTONS.reduce(
 -                 (acc, buttonName) => {
 -                     const button = defaultToolbarButtons[buttonName];
 - 
 -                     if (button) {
 -                         const place = _getToolbarButtonPlace(buttonName);
 - 
 -                         button.buttonName = buttonName;
 - 
 -                         // In filmstrip-only mode we only add a button if it's
 -                         // filmstrip-only enabled.
 -                         if (!filmStripOnly || button.filmstripOnlyEnabled) {
 -                             acc[place].set(buttonName, button);
 -                         }
 -                     }
 - 
 -                     return acc;
 -                 },
 -                 toolbarButtons);
 -     }
 - 
 -     return toolbarButtons;
 - }
 - 
 - /**
 -  * Get place for toolbar button. Now it can be in the primary Toolbar or in the
 -  * secondary Toolbar.
 -  *
 -  * @param {string} btn - Button name.
 -  * @private
 -  * @returns {string}
 -  */
 - function _getToolbarButtonPlace(btn) {
 -     return (
 -         interfaceConfig.MAIN_TOOLBAR_BUTTONS.includes(btn)
 -             ? 'primaryToolbarButtons'
 -             : 'secondaryToolbarButtons');
 - }
 - 
 - /**
 -  * Returns toolbar class names to add while rendering.
 -  *
 -  * @param {Object} props - Props object pass to React component.
 -  * @returns {Object}
 -  * @private
 -  */
 - export function getToolbarClassNames(props: Object) {
 -     const primaryToolbarClassNames = [
 -         interfaceConfig.filmStripOnly
 -             ? 'toolbar_filmstrip-only'
 -             : 'toolbar_primary'
 -     ];
 -     const secondaryToolbarClassNames = [ 'toolbar_secondary' ];
 - 
 -     if (props._visible) {
 -         const slideInAnimation
 -             = SideContainerToggler.isVisible ? 'slideInExtX' : 'slideInX';
 - 
 -         primaryToolbarClassNames.push('fadeIn');
 -         secondaryToolbarClassNames.push(slideInAnimation);
 -     } else {
 -         const slideOutAnimation
 -             = SideContainerToggler.isVisible ? 'slideOutExtX' : 'slideOutX';
 - 
 -         primaryToolbarClassNames.push('fadeOut');
 -         secondaryToolbarClassNames.push(slideOutAnimation);
 -     }
 - 
 -     return {
 -         primaryToolbarClassName: primaryToolbarClassNames.join(' '),
 -         secondaryToolbarClassName: secondaryToolbarClassNames.join(' ')
 -     };
 - }
 - 
 - /**
 -  * Show custom popup/tooltip for a specified button.
 -  *
 -  * @param {string} popupSelectorID - The selector id of the popup to show.
 -  * @param {boolean} show - True or false/show or hide the popup.
 -  * @param {number} timeout - The time to show the popup.
 -  * @returns {void}
 -  */
 - export function showCustomToolbarPopup(
 -         popupSelectorID: string,
 -         show: boolean,
 -         timeout: number) {
 -     AJS.$(popupSelectorID).tooltip({
 -         gravity: $(popupSelectorID).attr('data-popup'),
 -         html: true,
 -         title: 'title',
 -         trigger: 'manual'
 -     });
 - 
 -     if (show) {
 -         AJS.$(popupSelectorID).tooltip('show');
 - 
 -         setTimeout(
 -             () => {
 -                 // hide the tooltip
 -                 AJS.$(popupSelectorID).tooltip('hide');
 -             },
 -             timeout);
 -     } else {
 -         AJS.$(popupSelectorID).tooltip('hide');
 -     }
 - }
 
 
  |