2017-11-23 16:26:47 +00:00
|
|
|
// @flow
|
2017-01-10 21:55:31 +00:00
|
|
|
|
2017-10-11 05:45:20 +00:00
|
|
|
import _ from 'lodash';
|
2019-03-20 20:09:23 +00:00
|
|
|
import React from 'react';
|
2016-12-12 21:13:17 +00:00
|
|
|
|
2019-01-30 13:05:35 +00:00
|
|
|
import VideoLayout from '../../../../../modules/UI/videolayout/VideoLayout';
|
2020-05-20 10:57:03 +00:00
|
|
|
import { getConferenceNameForTitle } from '../../../base/conference';
|
2019-01-30 13:05:35 +00:00
|
|
|
import { connect, disconnect } from '../../../base/connection';
|
2021-10-25 09:16:03 +00:00
|
|
|
import { isMobileBrowser } from '../../../base/environment/utils';
|
2019-01-30 13:05:35 +00:00
|
|
|
import { translate } from '../../../base/i18n';
|
2019-03-21 16:38:29 +00:00
|
|
|
import { connect as reactReduxConnect } from '../../../base/redux';
|
2021-03-23 12:11:11 +00:00
|
|
|
import { setColorAlpha } from '../../../base/util';
|
2019-01-30 13:05:35 +00:00
|
|
|
import { Chat } from '../../../chat';
|
|
|
|
import { Filmstrip } from '../../../filmstrip';
|
|
|
|
import { CalleeInfoContainer } from '../../../invite';
|
|
|
|
import { LargeVideo } from '../../../large-video';
|
2020-06-23 10:16:50 +00:00
|
|
|
import { KnockingParticipantList, LobbyScreen } from '../../../lobby';
|
2021-08-20 08:53:11 +00:00
|
|
|
import { getIsLobbyVisible } from '../../../lobby/functions';
|
2021-05-19 10:08:30 +00:00
|
|
|
import { ParticipantsPane } from '../../../participants-pane/components/web';
|
2021-04-21 13:48:05 +00:00
|
|
|
import { getParticipantsPaneOpen } from '../../../participants-pane/functions';
|
2021-10-14 17:00:14 +00:00
|
|
|
import { Prejoin, isPrejoinPageVisible } from '../../../prejoin';
|
2021-10-25 09:16:03 +00:00
|
|
|
import { toggleToolboxVisible } from '../../../toolbox/actions.any';
|
2020-11-10 22:21:07 +00:00
|
|
|
import { fullScreenChanged, showToolbox } from '../../../toolbox/actions.web';
|
2021-10-04 14:07:05 +00:00
|
|
|
import { JitsiPortal, Toolbox } from '../../../toolbox/components/web';
|
2020-05-20 10:57:03 +00:00
|
|
|
import { LAYOUTS, getCurrentLayout } from '../../../video-layout';
|
2019-01-30 13:05:35 +00:00
|
|
|
import { maybeShowSuboptimalExperienceNotification } from '../../functions';
|
2019-03-20 20:09:23 +00:00
|
|
|
import {
|
|
|
|
AbstractConference,
|
|
|
|
abstractMapStateToProps
|
|
|
|
} from '../AbstractConference';
|
2019-02-07 22:52:31 +00:00
|
|
|
import type { AbstractProps } from '../AbstractConference';
|
2018-01-03 22:14:17 +00:00
|
|
|
|
2021-04-08 08:35:26 +00:00
|
|
|
import ConferenceInfo from './ConferenceInfo';
|
2020-04-01 07:47:51 +00:00
|
|
|
import { default as Notice } from './Notice';
|
|
|
|
|
2017-02-07 14:45:51 +00:00
|
|
|
declare var APP: Object;
|
2017-07-06 02:07:00 +00:00
|
|
|
declare var interfaceConfig: Object;
|
2017-02-07 14:45:51 +00:00
|
|
|
|
2018-03-07 00:28:19 +00:00
|
|
|
/**
|
|
|
|
* DOM events for when full screen mode has changed. Different browsers need
|
|
|
|
* different vendor prefixes.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @type {Array<string>}
|
|
|
|
*/
|
|
|
|
const FULL_SCREEN_EVENTS = [
|
|
|
|
'webkitfullscreenchange',
|
|
|
|
'mozfullscreenchange',
|
|
|
|
'fullscreenchange'
|
|
|
|
];
|
|
|
|
|
2018-07-25 20:00:00 +00:00
|
|
|
/**
|
|
|
|
* The CSS class to apply to the root element of the conference so CSS can
|
|
|
|
* modify the app layout.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @type {Object}
|
|
|
|
*/
|
2018-08-08 18:48:23 +00:00
|
|
|
const LAYOUT_CLASSNAMES = {
|
|
|
|
[LAYOUTS.HORIZONTAL_FILMSTRIP_VIEW]: 'horizontal-filmstrip',
|
|
|
|
[LAYOUTS.TILE_VIEW]: 'tile-view',
|
|
|
|
[LAYOUTS.VERTICAL_FILMSTRIP_VIEW]: 'vertical-filmstrip'
|
2018-07-25 20:00:00 +00:00
|
|
|
};
|
|
|
|
|
2016-11-23 21:46:46 +00:00
|
|
|
/**
|
2017-11-23 16:26:47 +00:00
|
|
|
* The type of the React {@code Component} props of {@link Conference}.
|
2016-11-23 21:46:46 +00:00
|
|
|
*/
|
2019-02-07 22:52:31 +00:00
|
|
|
type Props = AbstractProps & {
|
2017-01-10 21:55:31 +00:00
|
|
|
|
2021-03-23 12:11:11 +00:00
|
|
|
/**
|
2021-11-04 21:10:43 +00:00
|
|
|
* The alpha(opacity) of the background.
|
2021-03-23 12:11:11 +00:00
|
|
|
*/
|
|
|
|
_backgroundAlpha: number,
|
|
|
|
|
2021-04-21 13:48:05 +00:00
|
|
|
/**
|
|
|
|
* If participants pane is visible or not.
|
|
|
|
*/
|
|
|
|
_isParticipantsPaneVisible: boolean,
|
|
|
|
|
2018-07-25 20:00:00 +00:00
|
|
|
/**
|
|
|
|
* The CSS class to apply to the root of {@link Conference} to modify the
|
|
|
|
* application layout.
|
|
|
|
*/
|
2018-08-08 18:48:23 +00:00
|
|
|
_layoutClassName: string,
|
2018-07-25 20:00:00 +00:00
|
|
|
|
2021-06-09 10:09:08 +00:00
|
|
|
/**
|
2021-11-04 21:10:43 +00:00
|
|
|
* The config specified interval for triggering mouseMoved iframe api events.
|
2021-06-09 10:09:08 +00:00
|
|
|
*/
|
|
|
|
_mouseMoveCallbackInterval: number,
|
|
|
|
|
2021-10-04 14:07:05 +00:00
|
|
|
/**
|
|
|
|
*Whether or not the notifications should be displayed in the overflow drawer.
|
|
|
|
*/
|
|
|
|
_overflowDrawer: boolean,
|
|
|
|
|
2020-04-02 07:13:07 +00:00
|
|
|
/**
|
|
|
|
* Name for this conference room.
|
|
|
|
*/
|
|
|
|
_roomName: string,
|
|
|
|
|
2021-08-20 08:53:11 +00:00
|
|
|
/**
|
|
|
|
* If lobby page is visible or not.
|
|
|
|
*/
|
|
|
|
_showLobby: boolean,
|
|
|
|
|
2020-04-16 10:47:10 +00:00
|
|
|
/**
|
|
|
|
* If prejoin page is visible or not.
|
|
|
|
*/
|
|
|
|
_showPrejoin: boolean,
|
|
|
|
|
2018-01-03 22:14:17 +00:00
|
|
|
dispatch: Function,
|
|
|
|
t: Function
|
2017-11-23 16:26:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The conference page of the Web application.
|
|
|
|
*/
|
2019-03-20 20:09:23 +00:00
|
|
|
class Conference extends AbstractConference<Props, *> {
|
2018-03-07 00:28:19 +00:00
|
|
|
_onFullScreenChange: Function;
|
2021-06-09 10:09:08 +00:00
|
|
|
_onMouseEnter: Function;
|
|
|
|
_onMouseLeave: Function;
|
|
|
|
_onMouseMove: Function;
|
2017-11-23 16:26:47 +00:00
|
|
|
_onShowToolbar: Function;
|
2021-10-25 09:16:03 +00:00
|
|
|
_onVidespaceTouchStart: Function;
|
2021-06-09 10:09:08 +00:00
|
|
|
_originalOnMouseMove: Function;
|
2017-11-23 16:26:47 +00:00
|
|
|
_originalOnShowToolbar: Function;
|
2021-03-23 12:11:11 +00:00
|
|
|
_setBackground: Function;
|
2017-01-10 21:55:31 +00:00
|
|
|
|
2017-10-11 05:45:20 +00:00
|
|
|
/**
|
|
|
|
* Initializes a new Conference instance.
|
|
|
|
*
|
|
|
|
* @param {Object} props - The read-only properties with which the new
|
|
|
|
* instance is to be initialized.
|
|
|
|
*/
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
|
2021-06-09 10:09:08 +00:00
|
|
|
const { _mouseMoveCallbackInterval } = props;
|
|
|
|
|
2017-10-11 05:45:20 +00:00
|
|
|
// Throttle and bind this component's mousemove handler to prevent it
|
|
|
|
// from firing too often.
|
|
|
|
this._originalOnShowToolbar = this._onShowToolbar;
|
2021-06-09 10:09:08 +00:00
|
|
|
this._originalOnMouseMove = this._onMouseMove;
|
|
|
|
|
2017-10-11 05:45:20 +00:00
|
|
|
this._onShowToolbar = _.throttle(
|
|
|
|
() => this._originalOnShowToolbar(),
|
|
|
|
100,
|
|
|
|
{
|
|
|
|
leading: true,
|
|
|
|
trailing: false
|
|
|
|
});
|
2018-03-07 00:28:19 +00:00
|
|
|
|
2021-06-09 10:09:08 +00:00
|
|
|
this._onMouseMove = _.throttle(
|
|
|
|
event => this._originalOnMouseMove(event),
|
|
|
|
_mouseMoveCallbackInterval,
|
|
|
|
{
|
|
|
|
leading: true,
|
|
|
|
trailing: false
|
|
|
|
});
|
|
|
|
|
2018-03-07 00:28:19 +00:00
|
|
|
// Bind event handler so it is only bound once for every instance.
|
|
|
|
this._onFullScreenChange = this._onFullScreenChange.bind(this);
|
2021-10-25 09:16:03 +00:00
|
|
|
this._onVidespaceTouchStart = this._onVidespaceTouchStart.bind(this);
|
2021-03-23 12:11:11 +00:00
|
|
|
this._setBackground = this._setBackground.bind(this);
|
2017-10-11 05:45:20 +00:00
|
|
|
}
|
|
|
|
|
2016-12-12 21:13:17 +00:00
|
|
|
/**
|
core: refactor routing
Unfortunately, as the Jitsi Meet development evolved the routing mechanism
became more complex and thre logic ended up spread across multiple parts of the
codebase, which made it hard to follow and extend.
This change aims to fix that by rewriting the routing logic and centralizing it
in (pretty much) a single place, with no implicit inter-dependencies.
In order to arrive there, however, some extra changes were needed, which were
not caught early enough and are thus part of this change:
- JitsiMeetJS initialization is now synchronous: there is nothing async about
it, and the only async requirement (Temasys support) was lifted. See [0].
- WebRTC support can be detected early: building on top of the above, WebRTC
support can now be detected immediately, so take advantage of this to simplify
how we handle unsupported browsers. See [0].
The new router takes decissions based on the Redux state at the time of
invocation. A route can be represented by either a component or a URl reference,
with the latter taking precedence. On mobile, obviously, there is no concept of
URL reference so routing is based solely on components.
[0]: https://github.com/jitsi/lib-jitsi-meet/pull/779
2018-06-29 07:58:31 +00:00
|
|
|
* Start the connection and get the UI ready for the conference.
|
2016-12-12 21:13:17 +00:00
|
|
|
*
|
|
|
|
* @inheritdoc
|
|
|
|
*/
|
|
|
|
componentDidMount() {
|
2020-04-02 07:13:07 +00:00
|
|
|
document.title = `${this.props._roomName} | ${interfaceConfig.APP_NAME}`;
|
2019-10-09 12:35:09 +00:00
|
|
|
this._start();
|
2016-12-12 21:13:17 +00:00
|
|
|
}
|
|
|
|
|
2018-08-08 18:48:23 +00:00
|
|
|
/**
|
|
|
|
* Calls into legacy UI to update the application layout, if necessary.
|
|
|
|
*
|
|
|
|
* @inheritdoc
|
|
|
|
* returns {void}
|
|
|
|
*/
|
|
|
|
componentDidUpdate(prevProps) {
|
|
|
|
if (this.props._shouldDisplayTileView
|
|
|
|
=== prevProps._shouldDisplayTileView) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: For now VideoLayout is being called as LargeVideo and Filmstrip
|
|
|
|
// sizing logic is still handled outside of React. Once all components
|
|
|
|
// are in react they should calculate size on their own as much as
|
|
|
|
// possible and pass down sizings.
|
|
|
|
VideoLayout.refreshLayout();
|
|
|
|
}
|
|
|
|
|
2016-12-12 21:13:17 +00:00
|
|
|
/**
|
|
|
|
* Disconnect from the conference when component will be
|
|
|
|
* unmounted.
|
|
|
|
*
|
|
|
|
* @inheritdoc
|
|
|
|
*/
|
|
|
|
componentWillUnmount() {
|
2017-02-15 21:39:16 +00:00
|
|
|
APP.UI.unbindEvents();
|
|
|
|
|
2018-03-07 00:28:19 +00:00
|
|
|
FULL_SCREEN_EVENTS.forEach(name =>
|
|
|
|
document.removeEventListener(name, this._onFullScreenChange));
|
|
|
|
|
2017-02-02 16:01:03 +00:00
|
|
|
APP.conference.isJoined() && this.props.dispatch(disconnect());
|
2016-12-12 21:13:17 +00:00
|
|
|
}
|
|
|
|
|
2016-11-23 21:46:46 +00:00
|
|
|
/**
|
|
|
|
* Implements React's {@link Component#render()}.
|
|
|
|
*
|
|
|
|
* @inheritdoc
|
|
|
|
* @returns {ReactElement}
|
|
|
|
*/
|
|
|
|
render() {
|
2020-04-16 10:47:10 +00:00
|
|
|
const {
|
2021-04-21 13:48:05 +00:00
|
|
|
_isParticipantsPaneVisible,
|
2020-04-16 10:47:10 +00:00
|
|
|
_layoutClassName,
|
2021-10-04 14:07:05 +00:00
|
|
|
_notificationsVisible,
|
|
|
|
_overflowDrawer,
|
2021-08-20 08:53:11 +00:00
|
|
|
_showLobby,
|
2020-04-16 10:47:10 +00:00
|
|
|
_showPrejoin
|
|
|
|
} = this.props;
|
2017-07-06 02:07:00 +00:00
|
|
|
|
2016-11-23 21:46:46 +00:00
|
|
|
return (
|
2021-06-09 10:09:08 +00:00
|
|
|
<div
|
|
|
|
id = 'layout_wrapper'
|
|
|
|
onMouseEnter = { this._onMouseEnter }
|
|
|
|
onMouseLeave = { this._onMouseLeave }
|
|
|
|
onMouseMove = { this._onMouseMove } >
|
2021-04-21 13:48:05 +00:00
|
|
|
<div
|
|
|
|
className = { _layoutClassName }
|
|
|
|
id = 'videoconference_page'
|
2021-10-25 09:16:03 +00:00
|
|
|
onMouseMove = { isMobileBrowser() ? undefined : this._onShowToolbar }
|
2021-04-21 13:48:05 +00:00
|
|
|
ref = { this._setBackground }>
|
|
|
|
<ConferenceInfo />
|
2017-02-16 23:02:40 +00:00
|
|
|
|
2021-04-21 13:48:05 +00:00
|
|
|
<Notice />
|
2021-10-25 09:16:03 +00:00
|
|
|
<div
|
|
|
|
id = 'videospace'
|
|
|
|
onTouchStart = { this._onVidespaceTouchStart }>
|
2021-04-21 13:48:05 +00:00
|
|
|
<LargeVideo />
|
2021-06-23 11:23:44 +00:00
|
|
|
{!_isParticipantsPaneVisible
|
|
|
|
&& <div id = 'notification-participant-list'>
|
|
|
|
<KnockingParticipantList />
|
|
|
|
</div>}
|
2021-04-21 13:48:05 +00:00
|
|
|
<Filmstrip />
|
|
|
|
</div>
|
2017-05-24 17:01:46 +00:00
|
|
|
|
2021-09-02 11:42:39 +00:00
|
|
|
{ _showPrejoin || _showLobby || <Toolbox showDominantSpeakerName = { true } /> }
|
2021-04-21 13:48:05 +00:00
|
|
|
<Chat />
|
2017-05-17 21:05:48 +00:00
|
|
|
|
2021-10-04 14:07:05 +00:00
|
|
|
{_notificationsVisible && (_overflowDrawer
|
|
|
|
? <JitsiPortal className = 'notification-portal'>
|
|
|
|
{this.renderNotificationsContainer({ portal: true })}
|
|
|
|
</JitsiPortal>
|
|
|
|
: this.renderNotificationsContainer())
|
|
|
|
}
|
2020-05-20 08:25:31 +00:00
|
|
|
|
2021-04-21 13:48:05 +00:00
|
|
|
<CalleeInfoContainer />
|
|
|
|
|
|
|
|
{ _showPrejoin && <Prejoin />}
|
2021-08-20 08:53:11 +00:00
|
|
|
{ _showLobby && <LobbyScreen />}
|
2021-04-21 13:48:05 +00:00
|
|
|
</div>
|
|
|
|
<ParticipantsPane />
|
2017-05-17 21:05:48 +00:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
2017-10-11 05:45:20 +00:00
|
|
|
|
2021-03-23 12:11:11 +00:00
|
|
|
/**
|
|
|
|
* Sets custom background opacity based on config. It also applies the
|
|
|
|
* opacity on parent element, as the parent element is not accessible directly,
|
|
|
|
* only though it's child.
|
|
|
|
*
|
|
|
|
* @param {Object} element - The DOM element for which to apply opacity.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
_setBackground(element) {
|
|
|
|
if (!element) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.props._backgroundAlpha !== undefined) {
|
|
|
|
const elemColor = element.style.background;
|
|
|
|
const alphaElemColor = setColorAlpha(elemColor, this.props._backgroundAlpha);
|
|
|
|
|
|
|
|
element.style.background = alphaElemColor;
|
|
|
|
if (element.parentElement) {
|
|
|
|
const parentColor = element.parentElement.style.background;
|
|
|
|
const alphaParentColor = setColorAlpha(parentColor, this.props._backgroundAlpha);
|
|
|
|
|
|
|
|
element.parentElement.style.background = alphaParentColor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-25 09:16:03 +00:00
|
|
|
/**
|
|
|
|
* Handler used for touch start on Video container.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
_onVidespaceTouchStart() {
|
|
|
|
this.props.dispatch(toggleToolboxVisible());
|
|
|
|
}
|
|
|
|
|
2018-03-07 00:28:19 +00:00
|
|
|
/**
|
|
|
|
* Updates the Redux state when full screen mode has been enabled or
|
|
|
|
* disabled.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
_onFullScreenChange() {
|
|
|
|
this.props.dispatch(fullScreenChanged(APP.UI.isFullScreen()));
|
|
|
|
}
|
|
|
|
|
2021-06-09 10:09:08 +00:00
|
|
|
/**
|
|
|
|
* Triggers iframe API mouseEnter event.
|
|
|
|
*
|
|
|
|
* @param {MouseEvent} event - The mouse event.
|
|
|
|
* @private
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
_onMouseEnter(event) {
|
|
|
|
APP.API.notifyMouseEnter(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Triggers iframe API mouseLeave event.
|
|
|
|
*
|
|
|
|
* @param {MouseEvent} event - The mouse event.
|
|
|
|
* @private
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
_onMouseLeave(event) {
|
|
|
|
APP.API.notifyMouseLeave(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Triggers iframe API mouseMove event.
|
|
|
|
*
|
|
|
|
* @param {MouseEvent} event - The mouse event.
|
|
|
|
* @private
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
_onMouseMove(event) {
|
|
|
|
APP.API.notifyMouseMove(event);
|
|
|
|
}
|
|
|
|
|
2017-10-11 05:45:20 +00:00
|
|
|
/**
|
|
|
|
* Displays the toolbar.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
_onShowToolbar() {
|
|
|
|
this.props.dispatch(showToolbox());
|
|
|
|
}
|
core: refactor routing
Unfortunately, as the Jitsi Meet development evolved the routing mechanism
became more complex and thre logic ended up spread across multiple parts of the
codebase, which made it hard to follow and extend.
This change aims to fix that by rewriting the routing logic and centralizing it
in (pretty much) a single place, with no implicit inter-dependencies.
In order to arrive there, however, some extra changes were needed, which were
not caught early enough and are thus part of this change:
- JitsiMeetJS initialization is now synchronous: there is nothing async about
it, and the only async requirement (Temasys support) was lifted. See [0].
- WebRTC support can be detected early: building on top of the above, WebRTC
support can now be detected immediately, so take advantage of this to simplify
how we handle unsupported browsers. See [0].
The new router takes decissions based on the Redux state at the time of
invocation. A route can be represented by either a component or a URl reference,
with the latter taking precedence. On mobile, obviously, there is no concept of
URL reference so routing is based solely on components.
[0]: https://github.com/jitsi/lib-jitsi-meet/pull/779
2018-06-29 07:58:31 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Until we don't rewrite UI using react components
|
|
|
|
* we use UI.start from old app. Also method translates
|
|
|
|
* component right after it has been mounted.
|
|
|
|
*
|
|
|
|
* @inheritdoc
|
|
|
|
*/
|
|
|
|
_start() {
|
|
|
|
APP.UI.start();
|
|
|
|
|
|
|
|
APP.UI.registerListeners();
|
|
|
|
APP.UI.bindEvents();
|
|
|
|
|
|
|
|
FULL_SCREEN_EVENTS.forEach(name =>
|
|
|
|
document.addEventListener(name, this._onFullScreenChange));
|
|
|
|
|
|
|
|
const { dispatch, t } = this.props;
|
|
|
|
|
|
|
|
dispatch(connect());
|
|
|
|
|
|
|
|
maybeShowSuboptimalExperienceNotification(dispatch, t);
|
|
|
|
}
|
2016-11-23 21:46:46 +00:00
|
|
|
}
|
2016-12-12 21:13:17 +00:00
|
|
|
|
2017-11-22 10:18:08 +00:00
|
|
|
/**
|
|
|
|
* Maps (parts of) the Redux state to the associated props for the
|
|
|
|
* {@code Conference} component.
|
|
|
|
*
|
|
|
|
* @param {Object} state - The Redux state.
|
|
|
|
* @private
|
2019-02-07 22:52:31 +00:00
|
|
|
* @returns {Props}
|
2017-11-22 10:18:08 +00:00
|
|
|
*/
|
|
|
|
function _mapStateToProps(state) {
|
2021-06-09 10:09:08 +00:00
|
|
|
const { backgroundAlpha, mouseMoveCallbackInterval } = state['features/base/config'];
|
2021-10-04 14:07:05 +00:00
|
|
|
const { overflowDrawer } = state['features/toolbox'];
|
2021-06-09 10:09:08 +00:00
|
|
|
|
2017-11-22 10:18:08 +00:00
|
|
|
return {
|
2019-02-07 22:52:31 +00:00
|
|
|
...abstractMapStateToProps(state),
|
2021-06-09 10:09:08 +00:00
|
|
|
_backgroundAlpha: backgroundAlpha,
|
2021-04-21 13:48:05 +00:00
|
|
|
_isParticipantsPaneVisible: getParticipantsPaneOpen(state),
|
2020-04-25 14:36:14 +00:00
|
|
|
_layoutClassName: LAYOUT_CLASSNAMES[getCurrentLayout(state)],
|
2021-06-09 10:09:08 +00:00
|
|
|
_mouseMoveCallbackInterval: mouseMoveCallbackInterval,
|
2021-10-04 14:07:05 +00:00
|
|
|
_overflowDrawer: overflowDrawer,
|
2020-04-16 10:47:10 +00:00
|
|
|
_roomName: getConferenceNameForTitle(state),
|
2021-08-20 08:53:11 +00:00
|
|
|
_showLobby: getIsLobbyVisible(state),
|
2021-10-14 17:00:14 +00:00
|
|
|
_showPrejoin: isPrejoinPageVisible(state)
|
2017-11-22 10:18:08 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2018-01-03 22:14:17 +00:00
|
|
|
export default reactReduxConnect(_mapStateToProps)(translate(Conference));
|