import React, { useState, useEffect } from 'react'; import { connect } from 'react-redux'; import { withStyles } from '@material-ui/core/styles'; import { withRoomContext } from '../RoomContext'; import classnames from 'classnames'; import isElectron from 'is-electron'; import * as settingsActions from '../actions/settingsActions'; import PropTypes from 'prop-types'; import { useIntl, FormattedMessage } from 'react-intl'; import Dialog from '@material-ui/core/Dialog'; import DialogContentText from '@material-ui/core/DialogContentText'; import IconButton from '@material-ui/core/IconButton'; import AccountCircle from '@material-ui/icons/AccountCircle'; import Avatar from '@material-ui/core/Avatar'; import Typography from '@material-ui/core/Typography'; import Button from '@material-ui/core/Button'; import TextField from '@material-ui/core/TextField'; import Tooltip from '@material-ui/core/Tooltip'; import CookieConsent from 'react-cookie-consent'; import MuiDialogTitle from '@material-ui/core/DialogTitle'; import MuiDialogContent from '@material-ui/core/DialogContent'; import MuiDialogActions from '@material-ui/core/DialogActions'; const styles = (theme) => ({ root : { display : 'flex', width : '100%', height : '100%', backgroundColor : 'var(--background-color)', backgroundImage : `url(${window.config ? window.config.background : null})`, backgroundAttachment : 'fixed', backgroundPosition : 'center', backgroundSize : 'cover', backgroundRepeat : 'no-repeat' }, dialogTitle : { }, dialogPaper : { width : '30vw', padding : theme.spacing(2), [theme.breakpoints.down('lg')] : { width : '40vw' }, [theme.breakpoints.down('md')] : { width : '50vw' }, [theme.breakpoints.down('sm')] : { width : '70vw' }, [theme.breakpoints.down('xs')] : { width : '90vw' } }, logo : { display : 'block', paddingBottom : '1vh' }, loginButton : { position : 'absolute', right : theme.spacing(2), top : theme.spacing(2), padding : 0 }, largeIcon : { fontSize : '2em' }, largeAvatar : { width : 50, height : 50 }, green : { color : 'rgba(0, 153, 0, 1)' }, red : { color : 'rgba(153, 0, 0, 1)' } }); const DialogTitle = withStyles(styles)((props) => { const [ open, setOpen ] = useState(false); const intl = useIntl(); useEffect(() => { const openTimer = setTimeout(() => setOpen(true), 1000); const closeTimer = setTimeout(() => setOpen(false), 4000); return () => { clearTimeout(openTimer); clearTimeout(closeTimer); }; }, []); const { children, classes, myPicture, onLogin, loggedIn, ...other } = props; const handleTooltipClose = () => { setOpen(false); }; const handleTooltipOpen = () => { setOpen(true); }; const loginTooltip = loggedIn ? intl.formatMessage({ id : 'tooltip.logout', defaultMessage : 'Log out' }) : intl.formatMessage({ id : 'tooltip.login', defaultMessage : 'Log in' }); return ( { window.config.logo && Logo } {children} { window.config.loginEnabled && { myPicture ? : } } ); }); const DialogContent = withStyles((theme) => ({ root : { padding : theme.spacing(2) } }))(MuiDialogContent); const DialogActions = withStyles((theme) => ({ root : { margin : 0, padding : theme.spacing(1) } }))(MuiDialogActions); const JoinDialog = ({ roomClient, room, roomId, displayName, displayNameInProgress, loggedIn, myPicture, changeDisplayName, classes }) => { const intl = useIntl(); const handleKeyDown = (event) => { const { key } = event; switch (key) { case 'Enter': case 'Escape': { if (displayName === '') changeDisplayName('Guest'); if (room.inLobby) roomClient.changeDisplayName(displayName); break; } default: break; } }; return (
{ loggedIn ? roomClient.logout(roomId) : roomClient.login(roomId); }} loggedIn={loggedIn} > { window.config.title ? window.config.title : 'Multiparty meeting' }
{ const { value } = event.target; changeDisplayName(value); }} onKeyDown={handleKeyDown} onBlur={() => { if (displayName === '') changeDisplayName('Guest'); if (room.inLobby) roomClient.changeDisplayName(displayName); }} fullWidth /> {!room.inLobby && room.overRoomLimit && } { !room.inLobby ? : { room.signInRequired ? : } } { !isElectron() && }
); }; JoinDialog.propTypes = { roomClient : PropTypes.any.isRequired, room : PropTypes.object.isRequired, roomId : PropTypes.string.isRequired, displayName : PropTypes.string.isRequired, displayNameInProgress : PropTypes.bool.isRequired, loginEnabled : PropTypes.bool.isRequired, loggedIn : PropTypes.bool.isRequired, myPicture : PropTypes.string, changeDisplayName : PropTypes.func.isRequired, classes : PropTypes.object.isRequired }; const mapStateToProps = (state) => { return { room : state.room, displayName : state.settings.displayName, displayNameInProgress : state.me.displayNameInProgress, loginEnabled : state.me.loginEnabled, loggedIn : state.me.loggedIn, myPicture : state.me.picture }; }; const mapDispatchToProps = (dispatch) => { return { changeDisplayName : (displayName) => { dispatch(settingsActions.setDisplayName(displayName)); } }; }; export default withRoomContext(connect( mapStateToProps, mapDispatchToProps, null, { areStatesEqual : (next, prev) => { return ( prev.room.inLobby === next.room.inLobby && prev.room.signInRequired === next.room.signInRequired && prev.room.overRoomLimit === next.room.overRoomLimit && prev.settings.displayName === next.settings.displayName && prev.me.displayNameInProgress === next.me.displayNameInProgress && prev.me.loginEnabled === next.me.loginEnabled && prev.me.loggedIn === next.me.loggedIn && prev.me.picture === next.me.picture ); } } )(withStyles(styles)(JoinDialog)));