A button to promote all peers from lobby, fixes #287

auto_join_3.3
Håvar Aambø Fosstveit 2020-05-04 15:09:05 +02:00
parent a00d33ee4b
commit a1ed79c5db
23 changed files with 117 additions and 39 deletions

View File

@ -1274,6 +1274,26 @@ export default class RoomClient
roomActions.setSelectedPeer(peerId)); roomActions.setSelectedPeer(peerId));
} }
async promoteAllLobbyPeers()
{
logger.debug('promoteAllLobbyPeers()');
store.dispatch(
roomActions.setLobbyPeersPromotionInProgress(true));
try
{
await this.sendRequest('promoteAllPeers');
}
catch (error)
{
logger.error('promoteAllLobbyPeers() [error:"%o"]', error);
}
store.dispatch(
roomActions.setLobbyPeersPromotionInProgress(false));
}
async promoteLobbyPeer(peerId) async promoteLobbyPeer(peerId)
{ {
logger.debug('promoteLobbyPeer() [peerId:"%s"]', peerId); logger.debug('promoteLobbyPeer() [peerId:"%s"]', peerId);

View File

@ -123,6 +123,12 @@ export const toggleConsumerFullscreen = (consumerId) =>
payload : { consumerId } payload : { consumerId }
}); });
export const setLobbyPeersPromotionInProgress = (flag) =>
({
type : 'SET_LOBBY_PEERS_PROMOTION_IN_PROGRESS',
payload : { flag }
});
export const setMuteAllInProgress = (flag) => export const setMuteAllInProgress = (flag) =>
({ ({
type : 'MUTE_ALL_IN_PROGRESS', type : 'MUTE_ALL_IN_PROGRESS',

View File

@ -27,6 +27,7 @@ const ListLobbyPeer = (props) =>
const { const {
roomClient, roomClient,
peer, peer,
promotionInProgress,
canPromote, canPromote,
classes classes
} = props; } = props;
@ -55,7 +56,11 @@ const ListLobbyPeer = (props) =>
})} })}
> >
<IconButton <IconButton
disabled={!canPromote || peer.promotionInProgress} disabled={
!canPromote ||
peer.promotionInProgress ||
promotionInProgress
}
onClick={(e) => onClick={(e) =>
{ {
e.stopPropagation(); e.stopPropagation();
@ -71,18 +76,20 @@ const ListLobbyPeer = (props) =>
ListLobbyPeer.propTypes = ListLobbyPeer.propTypes =
{ {
roomClient : PropTypes.any.isRequired, roomClient : PropTypes.any.isRequired,
advancedMode : PropTypes.bool, advancedMode : PropTypes.bool,
peer : PropTypes.object.isRequired, peer : PropTypes.object.isRequired,
canPromote : PropTypes.bool.isRequired, promotionInProgress : PropTypes.bool.isRequired,
classes : PropTypes.object.isRequired canPromote : PropTypes.bool.isRequired,
classes : PropTypes.object.isRequired
}; };
const mapStateToProps = (state, { id }) => const mapStateToProps = (state, { id }) =>
{ {
return { return {
peer : state.lobbyPeers[id], peer : state.lobbyPeers[id],
canPromote : promotionInProgress : state.room.lobbyPeersPromotionInProgress,
canPromote :
state.me.roles.some((role) => state.me.roles.some((role) =>
state.room.permissionsFromRoles.PROMOTE_PEER.includes(role)) state.room.permissionsFromRoles.PROMOTE_PEER.includes(role))
}; };
@ -97,6 +104,8 @@ export default withRoomContext(connect(
{ {
return ( return (
prev.room.permissionsFromRoles === next.room.permissionsFromRoles && prev.room.permissionsFromRoles === next.room.permissionsFromRoles &&
prev.room.lobbyPeersPromotionInProgress ===
next.room.lobbyPeersPromotionInProgress &&
prev.me.roles === next.me.roles && prev.me.roles === next.me.roles &&
prev.lobbyPeers === next.lobbyPeers prev.lobbyPeers === next.lobbyPeers
); );

View File

@ -51,9 +51,11 @@ const styles = (theme) =>
}); });
const LockDialog = ({ const LockDialog = ({
roomClient,
room, room,
handleCloseLockDialog, handleCloseLockDialog,
lobbyPeers, lobbyPeers,
canPromote,
classes classes
}) => }) =>
{ {
@ -102,6 +104,20 @@ const LockDialog = ({
</DialogContent> </DialogContent>
} }
<DialogActions> <DialogActions>
<Button
disabled={
lobbyPeers.length === 0 ||
!canPromote ||
room.lobbyPeersPromotionInProgress
}
onClick={() => roomClient.promoteAllLobbyPeers()}
color='primary'
>
<FormattedMessage
id='label.promoteAllPeers'
defaultMessage='Promote all'
/>
</Button>
<Button onClick={() => handleCloseLockDialog(false)} color='primary'> <Button onClick={() => handleCloseLockDialog(false)} color='primary'>
<FormattedMessage <FormattedMessage
id='label.close' id='label.close'
@ -115,10 +131,12 @@ const LockDialog = ({
LockDialog.propTypes = LockDialog.propTypes =
{ {
roomClient : PropTypes.object.isRequired,
room : appPropTypes.Room.isRequired, room : appPropTypes.Room.isRequired,
handleCloseLockDialog : PropTypes.func.isRequired, handleCloseLockDialog : PropTypes.func.isRequired,
handleAccessCode : PropTypes.func.isRequired, handleAccessCode : PropTypes.func.isRequired,
lobbyPeers : PropTypes.array, lobbyPeers : PropTypes.array,
canPromote : PropTypes.bool,
classes : PropTypes.object.isRequired classes : PropTypes.object.isRequired
}; };
@ -126,7 +144,10 @@ const mapStateToProps = (state) =>
{ {
return { return {
room : state.room, room : state.room,
lobbyPeers : lobbyPeersKeySelector(state) lobbyPeers : lobbyPeersKeySelector(state),
canPromote :
state.me.roles.some((role) =>
state.room.permissionsFromRoles.PROMOTE_PEER.includes(role))
}; };
}; };
@ -144,6 +165,7 @@ export default withRoomContext(connect(
{ {
return ( return (
prev.room === next.room && prev.room === next.room &&
prev.me.roles === next.me.roles &&
prev.lobbyPeers === next.lobbyPeers prev.lobbyPeers === next.lobbyPeers
); );
} }

View File

@ -1,36 +1,37 @@
const initialState = const initialState =
{ {
name : '', name : '',
// new/connecting/connected/disconnected/closed, // new/connecting/connected/disconnected/closed,
state : 'new', state : 'new',
locked : false, locked : false,
inLobby : false, inLobby : false,
signInRequired : false, signInRequired : false,
// access code to the room if locked and joinByAccessCode == true // access code to the room if locked and joinByAccessCode == true
accessCode : '', accessCode : '',
// if true: accessCode is a possibility to open the room // if true: accessCode is a possibility to open the room
joinByAccessCode : true, joinByAccessCode : true,
activeSpeakerId : null, activeSpeakerId : null,
torrentSupport : false, torrentSupport : false,
showSettings : false, showSettings : false,
fullScreenConsumer : null, // ConsumerID fullScreenConsumer : null, // ConsumerID
windowConsumer : null, // ConsumerID windowConsumer : null, // ConsumerID
toolbarsVisible : true, toolbarsVisible : true,
mode : window.config.defaultLayout || 'democratic', mode : window.config.defaultLayout || 'democratic',
selectedPeerId : null, selectedPeerId : null,
spotlights : [], spotlights : [],
settingsOpen : false, settingsOpen : false,
extraVideoOpen : false, extraVideoOpen : false,
currentSettingsTab : 'media', // media, appearence, advanced currentSettingsTab : 'media', // media, appearence, advanced
lockDialogOpen : false, lockDialogOpen : false,
joined : false, joined : false,
muteAllInProgress : false, muteAllInProgress : false,
stopAllVideoInProgress : false, lobbyPeersPromotionInProgress : false,
closeMeetingInProgress : false, stopAllVideoInProgress : false,
clearChatInProgress : false, closeMeetingInProgress : false,
clearFileSharingInProgress : false, clearChatInProgress : false,
userRoles : { NORMAL: 'normal' }, // Default role clearFileSharingInProgress : false,
permissionsFromRoles : { userRoles : { NORMAL: 'normal' }, // Default role
permissionsFromRoles : {
CHANGE_ROOM_LOCK : [], CHANGE_ROOM_LOCK : [],
PROMOTE_PEER : [], PROMOTE_PEER : [],
SEND_CHAT : [], SEND_CHAT : [],
@ -199,6 +200,9 @@ const room = (state = initialState, action) =>
return { ...state, spotlights }; return { ...state, spotlights };
} }
case 'SET_LOBBY_PEERS_PROMOTION_IN_PROGRESS':
return { ...state, lobbyPeersPromotionInProgress: action.payload.flag };
case 'MUTE_ALL_IN_PROGRESS': case 'MUTE_ALL_IN_PROGRESS':
return { ...state, muteAllInProgress: action.payload.flag }; return { ...state, muteAllInProgress: action.payload.flag };

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "设置", "settings.settings": "设置",
"settings.camera": "视频设备", "settings.camera": "视频设备",

View File

@ -105,6 +105,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Nastavení", "settings.settings": "Nastavení",
"settings.camera": "Kamera", "settings.camera": "Kamera",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Einstellungen", "settings.settings": "Einstellungen",
"settings.camera": "Kamera", "settings.camera": "Kamera",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Indstillinger", "settings.settings": "Indstillinger",
"settings.camera": "Kamera", "settings.camera": "Kamera",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Ρυθμίσεις", "settings.settings": "Ρυθμίσεις",
"settings.camera": "Κάμερα", "settings.camera": "Κάμερα",

View File

@ -106,6 +106,7 @@
"label.appearence": "Appearence", "label.appearence": "Appearence",
"label.advanced": "Advanced", "label.advanced": "Advanced",
"label.addVideo": "Add video", "label.addVideo": "Add video",
"label.promoteAllPeers": "Promote all",
"settings.settings": "Settings", "settings.settings": "Settings",
"settings.camera": "Camera", "settings.camera": "Camera",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Ajustes", "settings.settings": "Ajustes",
"settings.camera": "Cámara", "settings.camera": "Cámara",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Paramètres", "settings.settings": "Paramètres",
"settings.camera": "Caméra", "settings.camera": "Caméra",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Postavke", "settings.settings": "Postavke",
"settings.camera": "Kamera", "settings.camera": "Kamera",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Beállítások", "settings.settings": "Beállítások",
"settings.camera": "Kamera", "settings.camera": "Kamera",

View File

@ -105,6 +105,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Impostazioni", "settings.settings": "Impostazioni",
"settings.camera": "Videocamera", "settings.camera": "Videocamera",

View File

@ -106,6 +106,7 @@
"label.appearence": "Utseende", "label.appearence": "Utseende",
"label.advanced": "Avansert", "label.advanced": "Avansert",
"label.addVideo": "Legg til video", "label.addVideo": "Legg til video",
"label.promoteAllPeers": "Slipp inn alle",
"settings.settings": "Innstillinger", "settings.settings": "Innstillinger",
"settings.camera": "Kamera", "settings.camera": "Kamera",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Ustawienia", "settings.settings": "Ustawienia",
"settings.camera": "Kamera", "settings.camera": "Kamera",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Definições", "settings.settings": "Definições",
"settings.camera": "Camera", "settings.camera": "Camera",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Setări", "settings.settings": "Setări",
"settings.camera": "Cameră video", "settings.camera": "Cameră video",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Ayarlar", "settings.settings": "Ayarlar",
"settings.camera": "Kamera", "settings.camera": "Kamera",

View File

@ -106,6 +106,7 @@
"label.appearence": null, "label.appearence": null,
"label.advanced": null, "label.advanced": null,
"label.addVideo": null, "label.addVideo": null,
"label.promoteAllPeers": null,
"settings.settings": "Налаштування", "settings.settings": "Налаштування",
"settings.camera": "Камера", "settings.camera": "Камера",

View File

@ -63,8 +63,8 @@ class Lobby extends EventEmitter
for (const peer in this._peers) for (const peer in this._peers)
{ {
if (peer.socket) if (!this._peers[peer].closed)
this.promotePeer(peer.id); this.promotePeer(peer);
} }
} }