|
|
@ -2,6 +2,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
import React, { useCallback, useEffect, useState } from 'react'; |
|
|
|
import React, { useCallback, useEffect, useState } from 'react'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import { isSupported } from '../../../av-moderation/functions'; |
|
|
|
import { translate } from '../../../base/i18n'; |
|
|
|
import { translate } from '../../../base/i18n'; |
|
|
|
import { JitsiTrackEvents } from '../../../base/lib-jitsi-meet'; |
|
|
|
import { JitsiTrackEvents } from '../../../base/lib-jitsi-meet'; |
|
|
|
import { MEDIA_TYPE } from '../../../base/media'; |
|
|
|
import { MEDIA_TYPE } from '../../../base/media'; |
|
|
@ -9,6 +10,7 @@ import { |
|
|
|
getLocalParticipant, |
|
|
|
getLocalParticipant, |
|
|
|
getParticipantByIdOrUndefined, |
|
|
|
getParticipantByIdOrUndefined, |
|
|
|
getParticipantDisplayName, |
|
|
|
getParticipantDisplayName, |
|
|
|
|
|
|
|
isLocalParticipantModerator, |
|
|
|
isParticipantModerator |
|
|
|
isParticipantModerator |
|
|
|
} from '../../../base/participants'; |
|
|
|
} from '../../../base/participants'; |
|
|
|
import { connect } from '../../../base/redux'; |
|
|
|
import { connect } from '../../../base/redux'; |
|
|
@ -18,7 +20,7 @@ import { |
|
|
|
isParticipantAudioMuted, |
|
|
|
isParticipantAudioMuted, |
|
|
|
isParticipantVideoMuted |
|
|
|
isParticipantVideoMuted |
|
|
|
} from '../../../base/tracks'; |
|
|
|
} from '../../../base/tracks'; |
|
|
|
import { ACTION_TRIGGER, type MediaState, MEDIA_STATE } from '../../constants'; |
|
|
|
import { ACTION_TRIGGER, type MediaState, MEDIA_STATE, QUICK_ACTION_BUTTON } from '../../constants'; |
|
|
|
import { |
|
|
|
import { |
|
|
|
getParticipantAudioMediaState, |
|
|
|
getParticipantAudioMediaState, |
|
|
|
getParticipantVideoMediaState, |
|
|
|
getParticipantVideoMediaState, |
|
|
@ -51,11 +53,21 @@ type Props = { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
_displayName: string, |
|
|
|
_displayName: string, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Whether or not moderation is supported. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
_isModerationSupported: boolean, |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* True if the participant is the local participant. |
|
|
|
* True if the participant is the local participant. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
_local: Boolean, |
|
|
|
_local: Boolean, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Whether or not the local participant is moderator. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
_localModerator: boolean, |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Shared video local participant owner. |
|
|
|
* Shared video local participant owner. |
|
|
|
*/ |
|
|
|
*/ |
|
|
@ -162,7 +174,9 @@ function MeetingParticipantItem({ |
|
|
|
_audioTrack, |
|
|
|
_audioTrack, |
|
|
|
_disableModeratorIndicator, |
|
|
|
_disableModeratorIndicator, |
|
|
|
_displayName, |
|
|
|
_displayName, |
|
|
|
|
|
|
|
_isModerationSupported, |
|
|
|
_local, |
|
|
|
_local, |
|
|
|
|
|
|
|
_localModerator, |
|
|
|
_localVideoOwner, |
|
|
|
_localVideoOwner, |
|
|
|
_participant, |
|
|
|
_participant, |
|
|
|
_participantID, |
|
|
|
_participantID, |
|
|
@ -220,6 +234,10 @@ function MeetingParticipantItem({ |
|
|
|
askToUnmuteText = t('participantsPane.actions.allowVideo'); |
|
|
|
askToUnmuteText = t('participantsPane.actions.allowVideo'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const buttonType = _isModerationSupported |
|
|
|
|
|
|
|
? _localModerator ? QUICK_ACTION_BUTTON.ASK_TO_UNMUTE : _quickActionButtonType |
|
|
|
|
|
|
|
: ''; |
|
|
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
return ( |
|
|
|
<ParticipantItem |
|
|
|
<ParticipantItem |
|
|
|
actionsTrigger = { ACTION_TRIGGER.HOVER } |
|
|
|
actionsTrigger = { ACTION_TRIGGER.HOVER } |
|
|
@ -241,7 +259,7 @@ function MeetingParticipantItem({ |
|
|
|
&& <> |
|
|
|
&& <> |
|
|
|
<ParticipantQuickAction |
|
|
|
<ParticipantQuickAction |
|
|
|
askUnmuteText = { askToUnmuteText } |
|
|
|
askUnmuteText = { askToUnmuteText } |
|
|
|
buttonType = { _quickActionButtonType } |
|
|
|
buttonType = { buttonType } |
|
|
|
muteAudio = { muteAudio } |
|
|
|
muteAudio = { muteAudio } |
|
|
|
muteParticipantButtonText = { muteParticipantButtonText } |
|
|
|
muteParticipantButtonText = { muteParticipantButtonText } |
|
|
|
participantID = { _participantID } /> |
|
|
|
participantID = { _participantID } /> |
|
|
@ -287,12 +305,16 @@ function _mapStateToProps(state, ownProps): Object { |
|
|
|
|
|
|
|
|
|
|
|
const { disableModeratorIndicator } = state['features/base/config']; |
|
|
|
const { disableModeratorIndicator } = state['features/base/config']; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const _localModerator = isLocalParticipantModerator(state); |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
return { |
|
|
|
_audioMediaState, |
|
|
|
_audioMediaState, |
|
|
|
_audioTrack, |
|
|
|
_audioTrack, |
|
|
|
_disableModeratorIndicator: disableModeratorIndicator, |
|
|
|
_disableModeratorIndicator: disableModeratorIndicator, |
|
|
|
_displayName: getParticipantDisplayName(state, participant?.id), |
|
|
|
_displayName: getParticipantDisplayName(state, participant?.id), |
|
|
|
|
|
|
|
_isModerationSupported: isSupported()(state), |
|
|
|
_local: Boolean(participant?.local), |
|
|
|
_local: Boolean(participant?.local), |
|
|
|
|
|
|
|
_localModerator, |
|
|
|
_localVideoOwner: Boolean(ownerId === localParticipantId), |
|
|
|
_localVideoOwner: Boolean(ownerId === localParticipantId), |
|
|
|
_participant: participant, |
|
|
|
_participant: participant, |
|
|
|
_participantID: participant?.id, |
|
|
|
_participantID: participant?.id, |
|
|
|