import React, { Fragment } from 'react'; import { connect } from 'react-redux'; import { withRoomContext } from '../RoomContext'; import ReactTooltip from 'react-tooltip'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import CopyToClipboard from 'react-copy-to-clipboard'; import CookieConsent from 'react-cookie-consent'; import * as appPropTypes from './appPropTypes'; import * as requestActions from '../redux/requestActions'; import * as stateActions from '../redux/stateActions'; import { Appear } from './transitions'; import Me from './Containers/Me'; import Peers from './Layouts/Peers'; import AudioPeers from './PeerAudio/AudioPeers'; import Notifications from './Notifications'; import ToolArea from './ToolArea/ToolArea'; import FullScreenView from './VideoContainers/FullScreenView'; import VideoWindow from './VideoWindow/VideoWindow'; import Draggable from 'react-draggable'; import { idle } from '../utils'; import Sidebar from './Controls/Sidebar'; import Filmstrip from './Layouts/Filmstrip'; // Hide toolbars after 10 seconds of inactivity. const TIMEOUT = 10 * 1000; class Room extends React.Component { /** * Hides the different toolbars on the page after a * given amount of time has passed since the * last time the cursor was moved. */ waitForHide = idle(() => { this.props.setToolbarsVisible(false); }, TIMEOUT); handleMovement = () => { // If the toolbars were hidden, show them again when // the user moves their cursor. if (!this.props.room.toolbarsVisible) { this.props.setToolbarsVisible(true); } this.waitForHide(); } componentDidMount() { window.addEventListener('mousemove', this.handleMovement); window.addEventListener('touchstart', this.handleMovement); } componentWillUnmount() { window.removeEventListener('mousemove', this.handleMovement); window.removeEventListener('touchstart', this.handleMovement); } render() { const { roomClient, room, amActiveSpeaker, onRoomLinkCopy } = this.props; const View = { filmstrip : Filmstrip, democratic : Peers }[room.mode]; if (room.audioSuspended) { return (
This webpage required sound and video to play, please click to allow.
{ roomClient.notify('Joining.'); roomClient.resumeAudio(); }} className='button' > Allow
); } else if (room.lockedOut) { return (
This room is locked at the moment, try again later.
); } else { return (
This website uses cookies to enhance the user experience.
); } } } Room.propTypes = { roomClient : PropTypes.object.isRequired, room : appPropTypes.Room.isRequired, me : appPropTypes.Me.isRequired, amActiveSpeaker : PropTypes.bool.isRequired, toolAreaOpen : PropTypes.bool.isRequired, screenProducer : appPropTypes.Producer, onRoomLinkCopy : PropTypes.func.isRequired, setToolbarsVisible : PropTypes.func.isRequired }; const mapStateToProps = (state) => { const producersArray = Object.values(state.producers); const screenProducer = producersArray.find((producer) => producer.source === 'screen'); return { room : state.room, me : state.me, toolAreaOpen : state.toolarea.toolAreaOpen, amActiveSpeaker : state.me.name === state.room.activeSpeakerName, screenProducer : screenProducer }; }; const mapDispatchToProps = (dispatch) => { return { onRoomLinkCopy : () => { dispatch(requestActions.notify( { text : 'Room link copied to the clipboard' })); }, setToolbarsVisible : (visible) => { dispatch(stateActions.setToolbarsVisible(visible)); } }; }; const RoomContainer = withRoomContext(connect( mapStateToProps, mapDispatchToProps )(Room)); export default RoomContainer;