diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index 2217d65..71c530b 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -1432,6 +1432,26 @@ export default class RoomClient peerActions.setStopPeerVideoInProgress(peerId, false)); } + async stopPeerScreenSharing(peerId) + { + logger.debug('stopPeerScreenSharing() [peerId:"%s"]', peerId); + + store.dispatch( + peerActions.setStopPeerScreenSharingInProgress(peerId, true)); + + try + { + await this.sendRequest('moderator:stopScreenSharing', { peerId }); + } + catch (error) + { + logger.error('stopPeerScreenSharing() failed: %o', error); + } + + store.dispatch( + peerActions.setStopPeerScreenSharingInProgress(peerId, false)); + } + async muteAllPeers() { logger.debug('muteAllPeers()'); @@ -2592,7 +2612,6 @@ export default class RoomClient case 'moderator:stopVideo': { this.disableWebcam(); - this.disableScreenSharing(); store.dispatch(requestActions.notify( { @@ -2605,6 +2624,21 @@ export default class RoomClient break; } + case 'moderator:stopScreenSharing': + { + this.disableScreenSharing(); + + store.dispatch(requestActions.notify( + { + text : intl.formatMessage({ + id : 'moderator.muteScreenSharingModerator', + defaultMessage : 'Moderator stopped your screen sharing' + }) + })); + + break; + } + case 'moderator:kick': { // Need some feedback diff --git a/app/src/actions/peerActions.js b/app/src/actions/peerActions.js index 5672b47..8a67371 100644 --- a/app/src/actions/peerActions.js +++ b/app/src/actions/peerActions.js @@ -86,3 +86,10 @@ export const setStopPeerVideoInProgress = (peerId, flag) => type : 'STOP_PEER_VIDEO_IN_PROGRESS', payload : { peerId, flag } }); + +export const setStopPeerScreenSharingInProgress = (peerId, flag) => +({ + type : 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS', + payload : { peerId, flag } +}); + diff --git a/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js b/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js index 7aa5181..b375c6f 100644 --- a/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js +++ b/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js @@ -306,6 +306,33 @@ const ListPeer = (props) => } + { isModerator && screenConsumer && + + + { + e.stopPropagation(); + + roomClient.stopPeerScreenSharing(peer.id); + }} + > + { !screenConsumer.remotelyPaused ? + + : + + } + + + } {children} ); diff --git a/app/src/reducers/peers.js b/app/src/reducers/peers.js index 32d6fef..8e6a7f7 100644 --- a/app/src/reducers/peers.js +++ b/app/src/reducers/peers.js @@ -82,6 +82,11 @@ const peer = (state = initialState, action) => stopPeerVideoInProgress : action.payload.flag }; + case 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS': + return { + ...state, + stopPeerScreenSharingInProgress : action.payload.flag + }; default: return state; } @@ -118,6 +123,7 @@ const peers = (state = initialState, action) => case 'REMOVE_PEER_ROLE': case 'STOP_PEER_AUDIO_IN_PROGRESS': case 'STOP_PEER_VIDEO_IN_PROGRESS': + case 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS': { const oldPeer = state[action.payload.peerId]; diff --git a/app/src/translations/en.json b/app/src/translations/en.json index 344d660..d667fa4 100644 --- a/app/src/translations/en.json +++ b/app/src/translations/en.json @@ -183,5 +183,6 @@ "moderator.clearChat": "Moderator cleared the chat", "moderator.clearFiles": "Moderator cleared the files", "moderator.muteAudio": "Moderator muted your audio", - "moderator.muteVideo": "Moderator muted your video" + "moderator.muteVideo": "Moderator muted your video", + "moderator.muteScreenSharing": "Moderator muted your screen sharing" } \ No newline at end of file diff --git a/server/lib/Room.js b/server/lib/Room.js index 74accc4..0610ffe 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -1441,6 +1441,25 @@ class Room extends EventEmitter break; } + case 'moderator:stopScreenSharing': + { + if (!this._hasPermission(peer, MODERATE_ROOM)) + throw new Error('peer not authorized'); + + const { peerId } = request.data; + + const stopVideoPeer = this._peers[peerId]; + + if (!stopVideoPeer) + throw new Error(`peer with id "${peerId}" not found`); + + this._notification(stopVideoPeer.socket, 'moderator:stopScreenSharing'); + + cb(); + + break; + } + case 'moderator:closeMeeting': { if (!this._hasPermission(peer, MODERATE_ROOM))