Merge remote-tracking branch 'origin/develop' into feat-output-select
This commit is contained in:
@@ -385,7 +385,7 @@ const Me = (props) =>
|
||||
</Fab>
|
||||
</div>
|
||||
</Tooltip>
|
||||
{ !me.isMobile &&
|
||||
{ me.browser.platform !== 'mobile' &&
|
||||
<Tooltip title={screenTip} placement='left'>
|
||||
<div>
|
||||
<Fab
|
||||
|
||||
@@ -121,7 +121,7 @@ const Peer = (props) =>
|
||||
advancedMode,
|
||||
peer,
|
||||
activeSpeaker,
|
||||
isMobile,
|
||||
browser,
|
||||
micConsumer,
|
||||
webcamConsumer,
|
||||
screenConsumer,
|
||||
@@ -260,7 +260,7 @@ const Peer = (props) =>
|
||||
</div>
|
||||
</Tooltip>
|
||||
|
||||
{ !isMobile &&
|
||||
{ browser.platform !== 'mobile' &&
|
||||
<Tooltip
|
||||
title={intl.formatMessage({
|
||||
id : 'label.newWindow',
|
||||
@@ -408,7 +408,7 @@ const Peer = (props) =>
|
||||
}, 2000);
|
||||
}}
|
||||
>
|
||||
{ !isMobile &&
|
||||
{ browser.platform !== 'mobile' &&
|
||||
<Tooltip
|
||||
title={intl.formatMessage({
|
||||
id : 'label.newWindow',
|
||||
@@ -509,7 +509,7 @@ Peer.propTypes =
|
||||
screenConsumer : appPropTypes.Consumer,
|
||||
windowConsumer : PropTypes.string,
|
||||
activeSpeaker : PropTypes.bool,
|
||||
isMobile : PropTypes.bool,
|
||||
browser : PropTypes.object.isRequired,
|
||||
spacing : PropTypes.number,
|
||||
style : PropTypes.object,
|
||||
smallButtons : PropTypes.bool,
|
||||
@@ -530,7 +530,7 @@ const makeMapStateToProps = (initialState, { id }) =>
|
||||
...getPeerConsumers(state, id),
|
||||
windowConsumer : state.room.windowConsumer,
|
||||
activeSpeaker : id === state.room.activeSpeakerId,
|
||||
isMobile : state.me.isMobile
|
||||
browser : state.me.browser
|
||||
};
|
||||
};
|
||||
|
||||
@@ -565,7 +565,7 @@ export default withRoomContext(connect(
|
||||
prev.consumers === next.consumers &&
|
||||
prev.room.activeSpeakerId === next.room.activeSpeakerId &&
|
||||
prev.room.windowConsumer === next.room.windowConsumer &&
|
||||
prev.me.isMobile === next.me.isMobile
|
||||
prev.me.browser === next.me.browser
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { withStyles } from '@material-ui/core/styles';
|
||||
import Paper from '@material-ui/core/Paper';
|
||||
import ChatModerator from './ChatModerator';
|
||||
import MessageList from './MessageList';
|
||||
import ChatInput from './ChatInput';
|
||||
|
||||
@@ -25,6 +26,7 @@ const Chat = (props) =>
|
||||
|
||||
return (
|
||||
<Paper className={classes.root}>
|
||||
<ChatModerator />
|
||||
<MessageList />
|
||||
<ChatInput />
|
||||
</Paper>
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import PropTypes from 'prop-types';
|
||||
import { withRoomContext } from '../../../RoomContext';
|
||||
import { withStyles } from '@material-ui/core/styles';
|
||||
import { useIntl, FormattedMessage } from 'react-intl';
|
||||
import Button from '@material-ui/core/Button';
|
||||
|
||||
const styles = (theme) =>
|
||||
({
|
||||
root :
|
||||
{
|
||||
padding : theme.spacing(1),
|
||||
width : '100%',
|
||||
overflow : 'hidden',
|
||||
cursor : 'auto',
|
||||
display : 'flex',
|
||||
listStyleType : 'none',
|
||||
boxShadow : '0 2px 5px 2px rgba(0, 0, 0, 0.2)',
|
||||
backgroundColor : 'rgba(255, 255, 255, 1)'
|
||||
},
|
||||
listheader :
|
||||
{
|
||||
padding : theme.spacing(1),
|
||||
fontWeight : 'bolder'
|
||||
},
|
||||
actionButton :
|
||||
{
|
||||
marginLeft : 'auto'
|
||||
}
|
||||
});
|
||||
|
||||
const ChatModerator = (props) =>
|
||||
{
|
||||
const intl = useIntl();
|
||||
|
||||
const {
|
||||
roomClient,
|
||||
isChatModerator,
|
||||
room,
|
||||
classes
|
||||
} = props;
|
||||
|
||||
if (!isChatModerator)
|
||||
return;
|
||||
|
||||
return (
|
||||
<ul className={classes.root}>
|
||||
<li className={classes.listheader}>
|
||||
<FormattedMessage
|
||||
id='room.moderatoractions'
|
||||
defaultMessage='Moderator actions'
|
||||
/>
|
||||
</li>
|
||||
<Button
|
||||
aria-label={intl.formatMessage({
|
||||
id : 'room.clearChat',
|
||||
defaultMessage : 'Clear chat'
|
||||
})}
|
||||
className={classes.actionButton}
|
||||
variant='contained'
|
||||
color='secondary'
|
||||
disabled={room.clearChatInProgress}
|
||||
onClick={() => roomClient.clearChat()}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='room.clearChat'
|
||||
defaultMessage='Clear chat'
|
||||
/>
|
||||
</Button>
|
||||
</ul>
|
||||
);
|
||||
};
|
||||
|
||||
ChatModerator.propTypes =
|
||||
{
|
||||
roomClient : PropTypes.any.isRequired,
|
||||
isChatModerator : PropTypes.bool,
|
||||
room : PropTypes.object,
|
||||
classes : PropTypes.object.isRequired
|
||||
};
|
||||
|
||||
const mapStateToProps = (state) =>
|
||||
({
|
||||
isChatModerator :
|
||||
state.me.roles.some((role) =>
|
||||
state.room.permissionsFromRoles.MODERATE_CHAT.includes(role)),
|
||||
room : state.room
|
||||
});
|
||||
|
||||
export default withRoomContext(connect(
|
||||
mapStateToProps,
|
||||
null,
|
||||
null,
|
||||
{
|
||||
areStatesEqual : (next, prev) =>
|
||||
{
|
||||
return (
|
||||
prev.room === next.room &&
|
||||
prev.me === next.me
|
||||
);
|
||||
}
|
||||
}
|
||||
)(withStyles(styles)(ChatModerator)));
|
||||
@@ -5,6 +5,7 @@ import { withStyles } from '@material-ui/core/styles';
|
||||
import { withRoomContext } from '../../../RoomContext';
|
||||
import { useIntl } from 'react-intl';
|
||||
import FileList from './FileList';
|
||||
import FileSharingModerator from './FileSharingModerator';
|
||||
import Paper from '@material-ui/core/Paper';
|
||||
import Button from '@material-ui/core/Button';
|
||||
|
||||
@@ -58,6 +59,7 @@ const FileSharing = (props) =>
|
||||
|
||||
return (
|
||||
<Paper className={classes.root}>
|
||||
<FileSharingModerator />
|
||||
<input
|
||||
className={classes.input}
|
||||
type='file'
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import PropTypes from 'prop-types';
|
||||
import { withRoomContext } from '../../../RoomContext';
|
||||
import { withStyles } from '@material-ui/core/styles';
|
||||
import { useIntl, FormattedMessage } from 'react-intl';
|
||||
import Button from '@material-ui/core/Button';
|
||||
|
||||
const styles = (theme) =>
|
||||
({
|
||||
root :
|
||||
{
|
||||
padding : theme.spacing(1),
|
||||
width : '100%',
|
||||
overflow : 'hidden',
|
||||
cursor : 'auto',
|
||||
display : 'flex',
|
||||
listStyleType : 'none',
|
||||
boxShadow : '0 2px 5px 2px rgba(0, 0, 0, 0.2)',
|
||||
backgroundColor : 'rgba(255, 255, 255, 1)'
|
||||
},
|
||||
listheader :
|
||||
{
|
||||
padding : theme.spacing(1),
|
||||
fontWeight : 'bolder'
|
||||
},
|
||||
actionButton :
|
||||
{
|
||||
marginLeft : 'auto'
|
||||
}
|
||||
});
|
||||
|
||||
const FileSharingModerator = (props) =>
|
||||
{
|
||||
const intl = useIntl();
|
||||
|
||||
const {
|
||||
roomClient,
|
||||
isFileSharingModerator,
|
||||
room,
|
||||
classes
|
||||
} = props;
|
||||
|
||||
if (!isFileSharingModerator)
|
||||
return;
|
||||
|
||||
return (
|
||||
<ul className={classes.root}>
|
||||
<li className={classes.listheader}>
|
||||
<FormattedMessage
|
||||
id='room.moderatoractions'
|
||||
defaultMessage='Moderator actions'
|
||||
/>
|
||||
</li>
|
||||
<Button
|
||||
aria-label={intl.formatMessage({
|
||||
id : 'room.clearFileSharing',
|
||||
defaultMessage : 'Clear files'
|
||||
})}
|
||||
className={classes.actionButton}
|
||||
variant='contained'
|
||||
color='secondary'
|
||||
disabled={room.clearFileSharingInProgress}
|
||||
onClick={() => roomClient.clearFileSharing()}
|
||||
>
|
||||
<FormattedMessage
|
||||
id='room.clearFileSharing'
|
||||
defaultMessage='Clear files'
|
||||
/>
|
||||
</Button>
|
||||
</ul>
|
||||
);
|
||||
};
|
||||
|
||||
FileSharingModerator.propTypes =
|
||||
{
|
||||
roomClient : PropTypes.any.isRequired,
|
||||
isFileSharingModerator : PropTypes.bool,
|
||||
room : PropTypes.object,
|
||||
classes : PropTypes.object.isRequired
|
||||
};
|
||||
|
||||
const mapStateToProps = (state) =>
|
||||
({
|
||||
isFileSharingModerator :
|
||||
state.me.roles.some((role) =>
|
||||
state.room.permissionsFromRoles.MODERATE_FILES.includes(role)),
|
||||
room : state.room
|
||||
});
|
||||
|
||||
export default withRoomContext(connect(
|
||||
mapStateToProps,
|
||||
null,
|
||||
null,
|
||||
{
|
||||
areStatesEqual : (next, prev) =>
|
||||
{
|
||||
return (
|
||||
prev.room === next.room &&
|
||||
prev.me === next.me
|
||||
);
|
||||
}
|
||||
}
|
||||
)(withStyles(styles)(FileSharingModerator)));
|
||||
@@ -16,10 +16,6 @@ const styles = (theme) =>
|
||||
cursor : 'auto',
|
||||
display : 'flex'
|
||||
},
|
||||
actionButtons :
|
||||
{
|
||||
display : 'flex'
|
||||
},
|
||||
divider :
|
||||
{
|
||||
marginLeft : theme.spacing(2)
|
||||
@@ -43,7 +39,6 @@ const ListModerator = (props) =>
|
||||
id : 'room.muteAll',
|
||||
defaultMessage : 'Mute all'
|
||||
})}
|
||||
className={classes.actionButton}
|
||||
variant='contained'
|
||||
color='secondary'
|
||||
disabled={room.muteAllInProgress}
|
||||
@@ -60,7 +55,6 @@ const ListModerator = (props) =>
|
||||
id : 'room.stopAllVideo',
|
||||
defaultMessage : 'Stop all video'
|
||||
})}
|
||||
className={classes.actionButton}
|
||||
variant='contained'
|
||||
color='secondary'
|
||||
disabled={room.stopAllVideoInProgress}
|
||||
@@ -77,7 +71,6 @@ const ListModerator = (props) =>
|
||||
id : 'room.closeMeeting',
|
||||
defaultMessage : 'Close meeting'
|
||||
})}
|
||||
className={classes.actionButton}
|
||||
variant='contained'
|
||||
color='secondary'
|
||||
disabled={room.closeMeetingInProgress}
|
||||
|
||||
@@ -139,7 +139,7 @@ class Room extends React.PureComponent
|
||||
{
|
||||
const {
|
||||
room,
|
||||
isMobile,
|
||||
browser,
|
||||
advancedMode,
|
||||
toolAreaOpen,
|
||||
toggleToolArea,
|
||||
@@ -204,7 +204,7 @@ class Room extends React.PureComponent
|
||||
</Hidden>
|
||||
</nav>
|
||||
|
||||
{ isMobile &&
|
||||
{ browser.platform === 'mobile' && browser.os !== 'ios' &&
|
||||
<WakeLock />
|
||||
}
|
||||
|
||||
@@ -225,7 +225,7 @@ class Room extends React.PureComponent
|
||||
Room.propTypes =
|
||||
{
|
||||
room : appPropTypes.Room.isRequired,
|
||||
isMobile : PropTypes.bool.isRequired,
|
||||
browser : PropTypes.object.isRequired,
|
||||
advancedMode : PropTypes.bool.isRequired,
|
||||
toolAreaOpen : PropTypes.bool.isRequired,
|
||||
setToolbarsVisible : PropTypes.func.isRequired,
|
||||
@@ -237,7 +237,7 @@ Room.propTypes =
|
||||
const mapStateToProps = (state) =>
|
||||
({
|
||||
room : state.room,
|
||||
isMobile : state.me.isMobile,
|
||||
browser : state.me.browser,
|
||||
advancedMode : state.settings.advancedMode,
|
||||
toolAreaOpen : state.toolarea.toolAreaOpen
|
||||
});
|
||||
@@ -263,7 +263,7 @@ export default connect(
|
||||
{
|
||||
return (
|
||||
prev.room === next.room &&
|
||||
prev.me.isMobile === next.me.isMobile &&
|
||||
prev.me.browser === next.me.browser &&
|
||||
prev.settings.advancedMode === next.settings.advancedMode &&
|
||||
prev.toolarea.toolAreaOpen === next.toolarea.toolAreaOpen
|
||||
);
|
||||
|
||||
@@ -9,7 +9,7 @@ import SignalCellular0BarIcon from '@material-ui/icons/SignalCellular0Bar';
|
||||
import SignalCellular1BarIcon from '@material-ui/icons/SignalCellular1Bar';
|
||||
import SignalCellular2BarIcon from '@material-ui/icons/SignalCellular2Bar';
|
||||
import SignalCellular3BarIcon from '@material-ui/icons/SignalCellular3Bar';
|
||||
import SignalCellular4BarIcon from '@material-ui/icons/SignalCellular4Bar';
|
||||
import SignalCellularAltIcon from '@material-ui/icons/SignalCellularAlt';
|
||||
|
||||
const styles = (theme) =>
|
||||
({
|
||||
@@ -217,7 +217,7 @@ class VideoView extends React.PureComponent
|
||||
case 9:
|
||||
case 10:
|
||||
{
|
||||
quality = <SignalCellular4BarIcon style={{ color: green[500] }}/>;
|
||||
quality = <SignalCellularAltIcon style={{ color: green[500] }}/>;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user