Browse Source

fix(av-moderation) Check for moderation support

Show av moderation toggles on mute all / stop everyone's video dialogs only if moderation is supported
Show Ask to Unmute only for moderators
master
robertpin 3 years ago
parent
commit
1beed8c490

+ 4
- 1
react/features/participants-pane/components/ParticipantQuickAction.js View File

63
             </QuickActionButton>
63
             </QuickActionButton>
64
         );
64
         );
65
     }
65
     }
66
-    default: {
66
+    case QUICK_ACTION_BUTTON.ASK_TO_UNMUTE: {
67
         return (
67
         return (
68
             <AskToUnmuteButton
68
             <AskToUnmuteButton
69
                 askUnmuteText = { askUnmuteText }
69
                 askUnmuteText = { askUnmuteText }
70
                 participantID = { participantID } />
70
                 participantID = { participantID } />
71
         );
71
         );
72
     }
72
     }
73
+    default: {
74
+        return null;
75
+    }
73
     }
76
     }
74
 }
77
 }

+ 24
- 2
react/features/participants-pane/components/web/MeetingParticipantItem.js View File

2
 
2
 
3
 import React, { useCallback, useEffect, useState } from 'react';
3
 import React, { useCallback, useEffect, useState } from 'react';
4
 
4
 
5
+import { isSupported } from '../../../av-moderation/functions';
5
 import { translate } from '../../../base/i18n';
6
 import { translate } from '../../../base/i18n';
6
 import { JitsiTrackEvents } from '../../../base/lib-jitsi-meet';
7
 import { JitsiTrackEvents } from '../../../base/lib-jitsi-meet';
7
 import { MEDIA_TYPE } from '../../../base/media';
8
 import { MEDIA_TYPE } from '../../../base/media';
9
     getLocalParticipant,
10
     getLocalParticipant,
10
     getParticipantByIdOrUndefined,
11
     getParticipantByIdOrUndefined,
11
     getParticipantDisplayName,
12
     getParticipantDisplayName,
13
+    isLocalParticipantModerator,
12
     isParticipantModerator
14
     isParticipantModerator
13
 } from '../../../base/participants';
15
 } from '../../../base/participants';
14
 import { connect } from '../../../base/redux';
16
 import { connect } from '../../../base/redux';
18
     isParticipantAudioMuted,
20
     isParticipantAudioMuted,
19
     isParticipantVideoMuted
21
     isParticipantVideoMuted
20
 } from '../../../base/tracks';
22
 } from '../../../base/tracks';
21
-import { ACTION_TRIGGER, type MediaState, MEDIA_STATE } from '../../constants';
23
+import { ACTION_TRIGGER, type MediaState, MEDIA_STATE, QUICK_ACTION_BUTTON } from '../../constants';
22
 import {
24
 import {
23
     getParticipantAudioMediaState,
25
     getParticipantAudioMediaState,
24
     getParticipantVideoMediaState,
26
     getParticipantVideoMediaState,
51
      */
53
      */
52
     _displayName: string,
54
     _displayName: string,
53
 
55
 
56
+    /**
57
+     * Whether or not moderation is supported.
58
+     */
59
+    _isModerationSupported: boolean,
60
+
54
     /**
61
     /**
55
      * True if the participant is the local participant.
62
      * True if the participant is the local participant.
56
      */
63
      */
57
     _local: Boolean,
64
     _local: Boolean,
58
 
65
 
66
+    /**
67
+     * Whether or not the local participant is moderator.
68
+     */
69
+    _localModerator: boolean,
70
+
59
     /**
71
     /**
60
      * Shared video local participant owner.
72
      * Shared video local participant owner.
61
      */
73
      */
162
     _audioTrack,
174
     _audioTrack,
163
     _disableModeratorIndicator,
175
     _disableModeratorIndicator,
164
     _displayName,
176
     _displayName,
177
+    _isModerationSupported,
165
     _local,
178
     _local,
179
+    _localModerator,
166
     _localVideoOwner,
180
     _localVideoOwner,
167
     _participant,
181
     _participant,
168
     _participantID,
182
     _participantID,
220
         askToUnmuteText = t('participantsPane.actions.allowVideo');
234
         askToUnmuteText = t('participantsPane.actions.allowVideo');
221
     }
235
     }
222
 
236
 
237
+    const buttonType = _isModerationSupported
238
+        ? _localModerator ? QUICK_ACTION_BUTTON.ASK_TO_UNMUTE : _quickActionButtonType
239
+        : '';
240
+
223
     return (
241
     return (
224
         <ParticipantItem
242
         <ParticipantItem
225
             actionsTrigger = { ACTION_TRIGGER.HOVER }
243
             actionsTrigger = { ACTION_TRIGGER.HOVER }
241
                 && <>
259
                 && <>
242
                     <ParticipantQuickAction
260
                     <ParticipantQuickAction
243
                         askUnmuteText = { askToUnmuteText }
261
                         askUnmuteText = { askToUnmuteText }
244
-                        buttonType = { _quickActionButtonType }
262
+                        buttonType = { buttonType }
245
                         muteAudio = { muteAudio }
263
                         muteAudio = { muteAudio }
246
                         muteParticipantButtonText = { muteParticipantButtonText }
264
                         muteParticipantButtonText = { muteParticipantButtonText }
247
                         participantID = { _participantID } />
265
                         participantID = { _participantID } />
287
 
305
 
288
     const { disableModeratorIndicator } = state['features/base/config'];
306
     const { disableModeratorIndicator } = state['features/base/config'];
289
 
307
 
308
+    const _localModerator = isLocalParticipantModerator(state);
309
+
290
     return {
310
     return {
291
         _audioMediaState,
311
         _audioMediaState,
292
         _audioTrack,
312
         _audioTrack,
293
         _disableModeratorIndicator: disableModeratorIndicator,
313
         _disableModeratorIndicator: disableModeratorIndicator,
294
         _displayName: getParticipantDisplayName(state, participant?.id),
314
         _displayName: getParticipantDisplayName(state, participant?.id),
315
+        _isModerationSupported: isSupported()(state),
295
         _local: Boolean(participant?.local),
316
         _local: Boolean(participant?.local),
317
+        _localModerator,
296
         _localVideoOwner: Boolean(ownerId === localParticipantId),
318
         _localVideoOwner: Boolean(ownerId === localParticipantId),
297
         _participant: participant,
319
         _participant: participant,
298
         _participantID: participant?.id,
320
         _participantID: participant?.id,

+ 5
- 3
react/features/video-menu/components/AbstractMuteEveryoneDialog.js View File

3
 import React from 'react';
3
 import React from 'react';
4
 
4
 
5
 import { requestDisableAudioModeration, requestEnableAudioModeration } from '../../av-moderation/actions';
5
 import { requestDisableAudioModeration, requestEnableAudioModeration } from '../../av-moderation/actions';
6
-import { isEnabledFromState } from '../../av-moderation/functions';
6
+import { isEnabledFromState, isSupported } from '../../av-moderation/functions';
7
 import { Dialog } from '../../base/dialog';
7
 import { Dialog } from '../../base/dialog';
8
 import { MEDIA_TYPE } from '../../base/media';
8
 import { MEDIA_TYPE } from '../../base/media';
9
 import { getLocalParticipant, getParticipantDisplayName } from '../../base/participants';
9
 import { getLocalParticipant, getParticipantDisplayName } from '../../base/participants';
23
     exclude: Array<string>,
23
     exclude: Array<string>,
24
     title: string,
24
     title: string,
25
     showAdvancedModerationToggle: boolean,
25
     showAdvancedModerationToggle: boolean,
26
-    isAudioModerationEnabled: boolean
26
+    isAudioModerationEnabled: boolean,
27
+    isModerationSupported: boolean
27
 };
28
 };
28
 
29
 
29
 type State = {
30
 type State = {
135
         title: t('dialog.muteEveryoneElseTitle', { whom })
136
         title: t('dialog.muteEveryoneElseTitle', { whom })
136
     } : {
137
     } : {
137
         title: t('dialog.muteEveryoneTitle'),
138
         title: t('dialog.muteEveryoneTitle'),
138
-        isAudioModerationEnabled: isEnabledFromState(MEDIA_TYPE.AUDIO, state)
139
+        isAudioModerationEnabled: isEnabledFromState(MEDIA_TYPE.AUDIO, state),
140
+        isModerationSupported: isSupported()(state)
139
     };
141
     };
140
 }
142
 }

+ 5
- 3
react/features/video-menu/components/AbstractMuteEveryonesVideoDialog.js View File

3
 import React from 'react';
3
 import React from 'react';
4
 
4
 
5
 import { requestDisableVideoModeration, requestEnableVideoModeration } from '../../av-moderation/actions';
5
 import { requestDisableVideoModeration, requestEnableVideoModeration } from '../../av-moderation/actions';
6
-import { isEnabledFromState } from '../../av-moderation/functions';
6
+import { isEnabledFromState, isSupported } from '../../av-moderation/functions';
7
 import { Dialog } from '../../base/dialog';
7
 import { Dialog } from '../../base/dialog';
8
 import { MEDIA_TYPE } from '../../base/media';
8
 import { MEDIA_TYPE } from '../../base/media';
9
 import { getLocalParticipant, getParticipantDisplayName } from '../../base/participants';
9
 import { getLocalParticipant, getParticipantDisplayName } from '../../base/participants';
23
     exclude: Array<string>,
23
     exclude: Array<string>,
24
     title: string,
24
     title: string,
25
     showAdvancedModerationToggle: boolean,
25
     showAdvancedModerationToggle: boolean,
26
-    isVideoModerationEnabled: boolean
26
+    isVideoModerationEnabled: boolean,
27
+    isModerationSupported: boolean
27
 };
28
 };
28
 
29
 
29
 type State = {
30
 type State = {
137
         title: t('dialog.muteEveryoneElsesVideoTitle', { whom })
138
         title: t('dialog.muteEveryoneElsesVideoTitle', { whom })
138
     } : {
139
     } : {
139
         title: t('dialog.muteEveryonesVideoTitle'),
140
         title: t('dialog.muteEveryonesVideoTitle'),
140
-        isVideoModerationEnabled
141
+        isVideoModerationEnabled,
142
+        isModerationSupported: isSupported()(state)
141
     };
143
     };
142
 }
144
 }

+ 1
- 1
react/features/video-menu/components/web/MuteEveryoneDialog.js View File

48
                 width = 'small'>
48
                 width = 'small'>
49
                 <div className = 'mute-dialog'>
49
                 <div className = 'mute-dialog'>
50
                     { this.state.content }
50
                     { this.state.content }
51
-                    {this.props.exclude.length === 0 && (
51
+                    { this.props.isModerationSupported && this.props.exclude.length === 0 && (
52
                         <>
52
                         <>
53
                             <div className = 'separator-line' />
53
                             <div className = 'separator-line' />
54
                             <div className = 'control-row'>
54
                             <div className = 'control-row'>

+ 1
- 1
react/features/video-menu/components/web/MuteEveryonesVideoDialog.js View File

48
                 width = 'small'>
48
                 width = 'small'>
49
                 <div className = 'mute-dialog'>
49
                 <div className = 'mute-dialog'>
50
                     {this.state.content}
50
                     {this.state.content}
51
-                    {this.props.exclude.length === 0 && (
51
+                    { this.props.isModerationSupported && this.props.exclude.length === 0 && (
52
                         <>
52
                         <>
53
                             <div className = 'separator-line' />
53
                             <div className = 'separator-line' />
54
                             <div className = 'control-row'>
54
                             <div className = 'control-row'>

Loading…
Cancel
Save