Skip to content

Commit 8acf3a4

Browse files
committed
update
1 parent 033c622 commit 8acf3a4

File tree

1 file changed

+103
-2
lines changed

1 file changed

+103
-2
lines changed

Project/src/MakeCall/CallCard.js

Lines changed: 103 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Panel, PanelType } from 'office-ui-fabric-react/lib/Panel';
77
import { Icon } from '@fluentui/react/lib/Icon';
88
import LocalVideoPreviewCard from './LocalVideoPreviewCard';
99
import { Dropdown } from 'office-ui-fabric-react/lib/Dropdown';
10-
import { LocalVideoStream, Features, LocalAudioStream } from '@azure/communication-calling';
10+
import { LocalVideoStream, Features, LocalAudioStream, MediaAccess } from '@azure/communication-calling';
1111
import { utils } from '../Utils/Utils';
1212
import CustomVideoEffects from "./RawVideoAccess/CustomVideoEffects";
1313
import VideoEffectsContainer from './VideoEffects/VideoEffectsContainer';
@@ -55,8 +55,17 @@ export default class CallCard extends React.Component {
5555
this.pptLiveFeature = this.call.feature(Features.PPTLive);
5656
this.pptLiveHtml = React.createRef();
5757
}
58+
let meetingMediaAccess = undefined;
59+
let remoteParticipantsMediaAccess = undefined;
60+
let mediaAccessMap = undefined;
5861
if (Features.MediaAccess) {
5962
this.mediaAccessCallFeature = this.call.feature(Features.MediaAccess);
63+
meetingMediaAccess = this.call.feature(Features.MediaAccess).getMeetingMediaAccess();
64+
remoteParticipantsMediaAccess = this.call.feature(Features.MediaAccess).getAllOthersMediaAccess();
65+
mediaAccessMap = new Map();
66+
remoteParticipantsMediaAccess.forEach((mediaAccess) => {
67+
mediaAccessMap.set(mediaAccess.participant.rawId, mediaAccess);
68+
});
6069
}
6170
this.isTeamsUser = props.isTeamsUser;
6271
this.dummyStreamTimeout = undefined;
@@ -115,7 +124,11 @@ export default class CallCard extends React.Component {
115124
isRecordingActive: false,
116125
isTranscriptionActive: false,
117126
lobbyParticipantsCount: this.lobby?.participants.length,
118-
mediaAccessMap: Map
127+
mediaAccessMap,
128+
meetingMediaAccess: {
129+
isAudioPermitted: meetingMediaAccess?.isAudioPermitted,
130+
isVideoPermitted: meetingMediaAccess?.isVideoPermitted,
131+
}
119132
};
120133
this.selectedRemoteParticipants = new Set();
121134
this.dataChannelRef = React.createRef();
@@ -158,6 +171,7 @@ export default class CallCard extends React.Component {
158171
this.dominantSpeakersFeature.off('dominantSpeakersChanged', this.dominantSpeakersChanged);
159172
if (Features.mediaAccess) {
160173
this.mediaAccessCallFeature.off('mediaAccessChanged', this.mediaAccessChangedHandler);
174+
this.mediaAccessCallFeature.off('meetingMediaAccessChanged', this.meetingMediaAccessChangedHandler);
161175
}
162176
}
163177

@@ -248,10 +262,14 @@ export default class CallCard extends React.Component {
248262
if (this.call.state === 'LocalHold' || this.call.state === 'RemoteHold') {
249263
this.setState({ canRaiseHands: false });
250264
this.setState({ canSpotlight: false });
265+
this.setState({ canForbidOthersAudio: false });
266+
this.setState({ canForbidOthersVideo: false });
251267
}
252268
if (this.call.state === 'Connected') {
253269
this.setState({ canRaiseHands: this.capabilities.raiseHand?.isPresent || this.capabilities.raiseHand?.reason === 'FeatureNotSupported' });
254270
this.setState({ canSpotlight: this.capabilities.spotlightParticipant?.isPresent || this.capabilities.spotlightParticipant?.reason === 'FeatureNotSupported' });
271+
this.setState({ canForbidOthersAudio: this.capabilities.forbidOthersAudio?.isPresent || this.capabilities.forbidOthersAudio?.reason === 'FeatureNotSupported' });
272+
this.setState({ canForbidOthersVideo: this.capabilities.forbidOthersVideo?.isPresent || this.capabilities.forbidOthersVideo?.reason === 'FeatureNotSupported' });
255273
}
256274
}
257275
callStateChanged();
@@ -491,6 +509,7 @@ export default class CallCard extends React.Component {
491509
this.realTimeTextFeature?.on('realTimeTextReceived', this.realTimeTextReceivedHandler);
492510
if (Features.MediaAccess) {
493511
this.mediaAccessCallFeature.on('mediaAccessChanged', this.mediaAccessChangedHandler);
512+
this.mediaAccessCallFeature.on('meetingMediaAccessChanged', this.meetingMediaAccessChangedHandler);
494513
}
495514
}
496515
}
@@ -562,6 +581,15 @@ export default class CallCard extends React.Component {
562581
this.setState({mediaAccessMap});
563582
}
564583

584+
meetingMediaAccessChangedHandler = (event) => {
585+
if (event.meetingMediaAccess) {
586+
this.setState({meetingMediaAccess: {
587+
isAudioPermitted: event.meetingMediaAccess.isAudioPermitted,
588+
isVideoPermitted: event.meetingMediaAccess.isVideoPermitted,
589+
}});
590+
}
591+
}
592+
565593
isRecordingActiveChangedHandler = (event) => {
566594
this.setState({ isRecordingActive: this.recordingFeature.isRecordingActive })
567595
}
@@ -678,6 +706,14 @@ export default class CallCard extends React.Component {
678706
(value.isPresent) ? this.setState({ canReact: true }) : this.setState({ canReact: false });
679707
continue;
680708
}
709+
if(key === 'forbidOthersAudio' && value.reason != 'FeatureNotSupported') {
710+
(value.isPresent) ? this.setState({ canForbidOthersAudio: true }) : this.setState({ canForbidOthersAudio: false });
711+
continue;
712+
}
713+
if(key === 'forbidOthersVideo' && value.reason != 'FeatureNotSupported') {
714+
(value.isPresent) ? this.setState({ canForbidOthersVideo: true }) : this.setState({ canForbidOthersVideo: false });
715+
continue;
716+
}
681717
}
682718
this.capabilities = this.capabilitiesFeature.capabilities;
683719
}
@@ -1182,6 +1218,34 @@ export default class CallCard extends React.Component {
11821218
} catch(e) {
11831219
console.error(e);
11841220
}
1221+
},
1222+
forbidOthersAudio: async () => {
1223+
try {
1224+
await this.mediaAccessCallFeature.forbidOthersAudio();
1225+
} catch(e) {
1226+
console.error(e);
1227+
}
1228+
},
1229+
permitOthersAudio: async () => {
1230+
try {
1231+
await this.mediaAccessCallFeature.permitOthersAudio();
1232+
} catch(e) {
1233+
console.error(e);
1234+
}
1235+
},
1236+
forbidOthersVideo: async () => {
1237+
try {
1238+
await this.mediaAccessCallFeature.forbidOthersVideo();
1239+
} catch(e) {
1240+
console.error(e);
1241+
}
1242+
},
1243+
permitOthersVideo: async () => {
1244+
try {
1245+
await this.mediaAccessCallFeature.permitOthersVideo();
1246+
} catch(e) {
1247+
console.error(e);
1248+
}
11851249
}
11861250
}
11871251
}
@@ -1263,6 +1327,43 @@ export default class CallCard extends React.Component {
12631327
onClick: (e) => menuCallBacks.consentToBeingRecorded(e)
12641328
});
12651329

1330+
1331+
if (this.state.canForbidOthersAudio && this.state.meetingMediaAccess.isAudioPermitted){
1332+
menuItems.push({
1333+
key: 'Disable mic for all attendees',
1334+
iconProps: { iconName: 'Focus'},
1335+
text: 'Disable mic for all attendees',
1336+
onClick: () => menuCallBacks.forbidOthersAudio()
1337+
});
1338+
}
1339+
1340+
if (this.state.canForbidOthersAudio && !this.state.meetingMediaAccess.isAudioPermitted){
1341+
menuItems.push({
1342+
key: 'Enable mic for all attendees',
1343+
iconProps: { iconName: 'Focus'},
1344+
text: 'Enable mic for all attendees',
1345+
onClick: () => menuCallBacks.permitOthersAudio()
1346+
});
1347+
}
1348+
1349+
if (this.state.canForbidOthersVideo && this.state.meetingMediaAccess.isVideoPermitted){
1350+
menuItems.push({
1351+
key: 'Disable camera for all attendees',
1352+
iconProps: { iconName: 'Focus'},
1353+
text: 'Disable camera for all attendees',
1354+
onClick: () => menuCallBacks.forbidOthersVideo()
1355+
});
1356+
}
1357+
1358+
if (this.state.canForbidOthersVideo && !this.state.meetingMediaAccess.isVideoPermitted){
1359+
menuItems.push({
1360+
key: 'Enable camera for all attendees',
1361+
iconProps: { iconName: 'Focus'},
1362+
text: 'Enable camera for all attendees',
1363+
onClick: () => menuCallBacks.permitOthersVideo()
1364+
});
1365+
}
1366+
12661367
return menuItems.filter(item => item != 0)
12671368
}
12681369

0 commit comments

Comments
 (0)