@azure/communication-react 1.23.0-alpha-202412200016 → 1.23.0-alpha-202412210016

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/communication-react.d.ts +174 -15
  2. package/dist/dist-cjs/communication-react/{ChatMessageComponentAsRichTextEditBox-bdhcp77f.js → ChatMessageComponentAsRichTextEditBox-9kQzqcEk.js} +2 -2
  3. package/dist/dist-cjs/communication-react/{ChatMessageComponentAsRichTextEditBox-bdhcp77f.js.map → ChatMessageComponentAsRichTextEditBox-9kQzqcEk.js.map} +1 -1
  4. package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-DCfnYa5y.js → RichTextSendBoxWrapper-CPU8bZEb.js} +2 -2
  5. package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-DCfnYa5y.js.map → RichTextSendBoxWrapper-CPU8bZEb.js.map} +1 -1
  6. package/dist/dist-cjs/communication-react/{index-O64dqfKP.js → index-C8ch4y0S.js} +840 -156
  7. package/dist/dist-cjs/communication-react/index-C8ch4y0S.js.map +1 -0
  8. package/dist/dist-cjs/communication-react/index.js +1 -1
  9. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  10. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  11. package/dist/dist-esm/calling-component-bindings/src/baseSelectors.js +1 -1
  12. package/dist/dist-esm/calling-component-bindings/src/baseSelectors.js.map +1 -1
  13. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.d.ts +0 -8
  14. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js.map +1 -1
  15. package/dist/dist-esm/calling-component-bindings/src/notificationStackSelector.js +1 -1
  16. package/dist/dist-esm/calling-component-bindings/src/notificationStackSelector.js.map +1 -1
  17. package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js +2 -2
  18. package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js.map +1 -1
  19. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.d.ts +1 -1
  20. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js +12 -25
  21. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js.map +1 -1
  22. package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +2 -2
  23. package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
  24. package/dist/dist-esm/calling-stateful-client/src/CallContext.js +5 -5
  25. package/dist/dist-esm/calling-stateful-client/src/CallContext.js.map +1 -1
  26. package/dist/dist-esm/calling-stateful-client/src/index-public.js.map +1 -1
  27. package/dist/dist-esm/react-components/src/components/LocalVideoTile.d.ts +2 -0
  28. package/dist/dist-esm/react-components/src/components/LocalVideoTile.js +11 -4
  29. package/dist/dist-esm/react-components/src/components/LocalVideoTile.js.map +1 -1
  30. package/dist/dist-esm/react-components/src/components/NotificationStack.d.ts +12 -0
  31. package/dist/dist-esm/react-components/src/components/NotificationStack.js.map +1 -1
  32. package/dist/dist-esm/react-components/src/components/ParticipantList.js +23 -4
  33. package/dist/dist-esm/react-components/src/components/ParticipantList.js.map +1 -1
  34. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.d.ts +4 -0
  35. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js +23 -5
  36. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js.map +1 -1
  37. package/dist/dist-esm/react-components/src/components/VideoGallery/LocalScreenShare.js +3 -1
  38. package/dist/dist-esm/react-components/src/components/VideoGallery/LocalScreenShare.js.map +1 -1
  39. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoStreamLifecycleMaintainer.d.ts +1 -0
  40. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoStreamLifecycleMaintainer.js +18 -9
  41. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoStreamLifecycleMaintainer.js.map +1 -1
  42. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoTileContextualMenuProps.d.ts +8 -0
  43. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoTileContextualMenuProps.js +99 -14
  44. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoTileContextualMenuProps.js.map +1 -1
  45. package/dist/dist-esm/react-components/src/components/VideoGallery.d.ts +16 -0
  46. package/dist/dist-esm/react-components/src/components/VideoGallery.js +37 -11
  47. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  48. package/dist/dist-esm/react-components/src/components/VideoTile.d.ts +5 -0
  49. package/dist/dist-esm/react-components/src/components/VideoTile.js +18 -3
  50. package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
  51. package/dist/dist-esm/react-components/src/components/utils.js +8 -0
  52. package/dist/dist-esm/react-components/src/components/utils.js.map +1 -1
  53. package/dist/dist-esm/react-components/src/theming/icons.d.ts +5 -0
  54. package/dist/dist-esm/react-components/src/theming/icons.js +13 -1
  55. package/dist/dist-esm/react-components/src/theming/icons.js.map +1 -1
  56. package/dist/dist-esm/react-components/src/types/ParticipantListParticipant.d.ts +1 -1
  57. package/dist/dist-esm/react-components/src/types/ParticipantListParticipant.js.map +1 -1
  58. package/dist/dist-esm/react-components/src/types/VideoGalleryParticipant.d.ts +5 -2
  59. package/dist/dist-esm/react-components/src/types/VideoGalleryParticipant.js.map +1 -1
  60. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.d.ts +70 -0
  61. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.js.map +1 -1
  62. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.d.ts +9 -0
  63. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +76 -10
  64. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
  65. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.d.ts +32 -0
  66. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
  67. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js +52 -10
  68. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js.map +1 -1
  69. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CapabilitiesChangedNotificationBar.js +4 -0
  70. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CapabilitiesChangedNotificationBar.js.map +1 -1
  71. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/usePeoplePane.d.ts +10 -0
  72. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/usePeoplePane.js +288 -26
  73. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/usePeoplePane.js.map +1 -1
  74. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useAdaptedSelector.js +1 -1
  75. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useAdaptedSelector.js.map +1 -1
  76. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js +57 -8
  77. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js.map +1 -1
  78. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.d.ts +3 -0
  79. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.js +3 -0
  80. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.js.map +1 -1
  81. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.d.ts +8 -0
  82. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js +48 -0
  83. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js.map +1 -1
  84. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.d.ts +18 -0
  85. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.js.map +1 -1
  86. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.d.ts +8 -0
  87. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js +48 -0
  88. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js.map +1 -1
  89. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.d.ts +4 -0
  90. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js.map +1 -1
  91. package/dist/dist-esm/react-composites/src/composites/common/icons.d.ts +9 -2
  92. package/dist/dist-esm/react-composites/src/composites/common/icons.js.map +1 -1
  93. package/package.json +1 -1
  94. package/dist/dist-cjs/communication-react/index-O64dqfKP.js.map +0 -1
@@ -188,7 +188,7 @@ function getDefaultExportFromCjs (x) {
188
188
  // Copyright (c) Microsoft Corporation.
189
189
  // Licensed under the MIT License.
190
190
  // GENERATED FILE. DO NOT EDIT MANUALLY.
191
- var telemetryVersion = '1.23.0-alpha-202412200016';
191
+ var telemetryVersion = '1.23.0-alpha-202412210016';
192
192
 
193
193
 
194
194
  var telemetryVersion$1 = /*@__PURE__*/getDefaultExportFromCjs(telemetryVersion);
@@ -528,7 +528,7 @@ const getIdentifier = (state) => toFlatCommunicationIdentifier(state.userId);
528
528
  * @private
529
529
  */
530
530
  const getLatestErrors$1 = (state) => state.latestErrors;
531
- /* @conditional-compile-remove(breakout-rooms) */
531
+ /* @conditional-compile-remove(breakout-rooms) */ /* @conditional-compile-remove(media-access) */
532
532
  /**
533
533
  * @private
534
534
  */
@@ -1654,7 +1654,7 @@ const createDefaultTeamsCallingHandlers = memoizeOne((callClient, callAgent, dev
1654
1654
  */
1655
1655
  const notificationStackSelector = reselect.createSelector([
1656
1656
  getLatestErrors$1,
1657
- /* @conditional-compile-remove(breakout-rooms) */ getLatestNotifications,
1657
+ /* @conditional-compile-remove(breakout-rooms) */ /* @conditional-compile-remove(media-access) */ getLatestNotifications,
1658
1658
  getDiagnostics,
1659
1659
  getDeviceManager$1,
1660
1660
  getEnvironmentInfo$1,
@@ -2621,7 +2621,7 @@ let CallContext$2 = class CallContext {
2621
2621
  constructor(userId, maxListeners = 50) {
2622
2622
  this._callIdHistory = new CallIdHistory();
2623
2623
  this._timeOutId = {};
2624
- /* @conditional-compile-remove(breakout-rooms) */
2624
+ /* @conditional-compile-remove(breakout-rooms) */ /* @conditional-compile-remove(media-access) */
2625
2625
  this._latestCallIdsThatPushedNotifications = {};
2626
2626
  /**
2627
2627
  * Tees direct errors to state.
@@ -2654,7 +2654,7 @@ let CallContext$2 = class CallContext {
2654
2654
  userId: userId,
2655
2655
  environmentInfo: undefined,
2656
2656
  latestErrors: {},
2657
- /* @conditional-compile-remove(breakout-rooms) */ latestNotifications: {}
2657
+ /* @conditional-compile-remove(breakout-rooms) */ /* @conditional-compile-remove(media-access) */ latestNotifications: {}
2658
2658
  };
2659
2659
  this._emitter = new events.EventEmitter();
2660
2660
  this._emitter.setMaxListeners(maxListeners);
@@ -3719,14 +3719,14 @@ let CallContext$2 = class CallContext {
3719
3719
  draft.latestErrors[target] = error;
3720
3720
  });
3721
3721
  }
3722
- /* @conditional-compile-remove(breakout-rooms) */
3722
+ /* @conditional-compile-remove(breakout-rooms) */ /* @conditional-compile-remove(media-access) */
3723
3723
  setLatestNotification(callId, notification) {
3724
3724
  this._latestCallIdsThatPushedNotifications[notification.target] = callId;
3725
3725
  this.modifyState((draft) => {
3726
3726
  draft.latestNotifications[notification.target] = notification;
3727
3727
  });
3728
3728
  }
3729
- /* @conditional-compile-remove(breakout-rooms) */
3729
+ /* @conditional-compile-remove(breakout-rooms) */ /* @conditional-compile-remove(media-access) */
3730
3730
  deleteLatestNotification(callId, notificationTarget) {
3731
3731
  let callIdToPushLatestNotification = this._latestCallIdsThatPushedNotifications[notificationTarget];
3732
3732
  callIdToPushLatestNotification = callIdToPushLatestNotification
@@ -3767,7 +3767,7 @@ let CallContext$2 = class CallContext {
3767
3767
  return;
3768
3768
  }
3769
3769
  if (meetingMediaAccess) {
3770
- call.mediaAccess = {
3770
+ call.meetingMediaAccess = {
3771
3771
  isAudioPermitted: meetingMediaAccess.isAudioPermitted,
3772
3772
  isVideoPermitted: meetingMediaAccess.isVideoPermitted
3773
3773
  };
@@ -7851,6 +7851,14 @@ const customNotificationIconName = {
7851
7851
  breakoutRoomJoined: 'NotificationBarBreakoutRoomJoined',
7852
7852
  /* @conditional-compile-remove(breakout-rooms) */
7853
7853
  breakoutRoomClosingSoon: 'NotificationBarBreakoutRoomClosingSoon',
7854
+ /* @conditional-compile-remove(media-access) */
7855
+ capabilityTurnVideoOnPresent: 'ControlButtonCameraOff',
7856
+ /* @conditional-compile-remove(media-access) */
7857
+ capabilityTurnVideoOnAbsent: 'ControlButtonCameraProhibited',
7858
+ /* @conditional-compile-remove(media-access) */
7859
+ capabilityUnmuteMicPresent: 'ControlButtonMicOff',
7860
+ /* @conditional-compile-remove(media-access) */
7861
+ capabilityUnmuteMicAbsent: 'ControlButtonMicProhibited',
7854
7862
  /* @conditional-compile-remove(together-mode) */
7855
7863
  togetherModeStarted: 'NotificationBarTogetherModeIcon',
7856
7864
  /* @conditional-compile-remove(together-mode) */
@@ -8545,6 +8553,14 @@ const DEFAULT_COMPONENT_ICONS = {
8545
8553
  ControlButtonScreenShareStop: React.createElement(reactIcons.ShareScreenStop20Filled, null),
8546
8554
  ControlButtonRaiseHand: React.createElement(ControlButtonRaiseHandIcon, null),
8547
8555
  ControlButtonLowerHand: React.createElement(ControlButtonLowerHandIcon, null),
8556
+ /* @conditional-compile-remove(media-access) */
8557
+ ControlButtonMicProhibited: React.createElement(reactIcons.MicProhibited20Filled, null),
8558
+ /* @conditional-compile-remove(media-access) */
8559
+ ControlButtonMicProhibitedSmall: React.createElement(reactIcons.MicProhibited16Filled, null),
8560
+ /* @conditional-compile-remove(media-access) */
8561
+ ControlButtonCameraProhibited: React.createElement(reactIcons.VideoProhibited20Filled, null),
8562
+ /* @conditional-compile-remove(media-access) */
8563
+ ControlButtonCameraProhibitedSmall: React.createElement(reactIcons.VideoProhibited16Filled, null),
8548
8564
  RaiseHandContextualMenuItem: React.createElement(reactIcons.HandRight20Regular, null),
8549
8565
  LowerHandContextualMenuItem: React.createElement(reactIcons.HandRightOff20Regular, null),
8550
8566
  ReactionButtonIcon: React.createElement(reactIcons.Emoji20Regular, null),
@@ -8608,6 +8624,8 @@ const DEFAULT_COMPONENT_ICONS = {
8608
8624
  SendBoxSend: React.createElement(reactIcons.Send20Regular, null),
8609
8625
  SendBoxSendHovered: React.createElement(reactIcons.Send20Filled, null),
8610
8626
  VideoTileMicOff: React.createElement(reactIcons.MicOff16Filled, null),
8627
+ /* @conditional-compile-remove(media-access) */
8628
+ VideoTileCameraOff: React.createElement(reactIcons.VideoProhibited16Filled, null),
8611
8629
  DialpadBackspace: React.createElement(reactIcons.Backspace20Regular, null),
8612
8630
  /* @conditional-compile-remove(call-readiness) */
8613
8631
  SitePermissionsSparkle: React.createElement(SitePermissionSparkle20Filled, null),
@@ -16119,7 +16137,7 @@ class _ErrorBoundary extends React.Component {
16119
16137
  // Copyright (c) Microsoft Corporation.
16120
16138
  // Licensed under the MIT License.
16121
16139
  /* @conditional-compile-remove(rich-text-editor) */
16122
- const ChatMessageComponentAsRichTextEditBox = React.lazy(() => Promise.resolve().then(function () { return require('./ChatMessageComponentAsRichTextEditBox-bdhcp77f.js'); }));
16140
+ const ChatMessageComponentAsRichTextEditBox = React.lazy(() => Promise.resolve().then(function () { return require('./ChatMessageComponentAsRichTextEditBox-9kQzqcEk.js'); }));
16123
16141
  /**
16124
16142
  * @private
16125
16143
  * Use this function to load RoosterJS dependencies early in the lifecycle.
@@ -16127,7 +16145,7 @@ const ChatMessageComponentAsRichTextEditBox = React.lazy(() => Promise.resolve()
16127
16145
  *
16128
16146
  * @conditional-compile-remove(rich-text-editor)
16129
16147
  */
16130
- const loadChatMessageComponentAsRichTextEditBox = () => Promise.resolve().then(function () { return require('./ChatMessageComponentAsRichTextEditBox-bdhcp77f.js'); });
16148
+ const loadChatMessageComponentAsRichTextEditBox = () => Promise.resolve().then(function () { return require('./ChatMessageComponentAsRichTextEditBox-9kQzqcEk.js'); });
16131
16149
  /**
16132
16150
  * @private
16133
16151
  */
@@ -17698,9 +17716,18 @@ const onRenderParticipantDefault = (participant, strings, myUserId, onRenderAvat
17698
17716
  const displayName = formatDisplayName(participant.displayName);
17699
17717
  const callingPalette = theme.callingPalette;
17700
17718
  const isPinned = pinnedParticipants && (pinnedParticipants === null || pinnedParticipants === void 0 ? void 0 : pinnedParticipants.includes(participant.userId));
17701
- const onRenderIcon = (callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.isScreenSharing) || (callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.isMuted) || (callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.raisedHand) || isPinned
17719
+ const showRenderIconTrampoline = () => {
17720
+ /* @conditional-compile-remove(media-access) */
17721
+ return !!((callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.isScreenSharing) ||
17722
+ (callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.isMuted) ||
17723
+ (callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.raisedHand) ||
17724
+ isPinned ||
17725
+ !((callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.mediaAccess) ? callingParticipant.mediaAccess.isAudioPermitted : true) ||
17726
+ !((callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.mediaAccess) ? callingParticipant.mediaAccess.isVideoPermitted : true));
17727
+ };
17728
+ const onRenderIcon = showRenderIconTrampoline()
17702
17729
  ? () => {
17703
- var _a;
17730
+ var _a, _b;
17704
17731
  return (React.createElement(react.Stack, { horizontal: true, tokens: { childrenGap: '0.5rem' } },
17705
17732
  callingParticipant.raisedHand && (React.createElement(react.Stack, { horizontal: true, tokens: { childrenGap: '0.2rem' }, style: {
17706
17733
  alignItems: 'center',
@@ -17713,9 +17740,15 @@ const onRenderParticipantDefault = (participant, strings, myUserId, onRenderAvat
17713
17740
  React.createElement(react.Stack.Item, null,
17714
17741
  React.createElement(RaisedHandIcon, null)))),
17715
17742
  callingParticipant.isScreenSharing && (React.createElement(react.Icon, { iconName: "ParticipantItemScreenShareStart", className: iconStyles$2, ariaLabel: strings.sharingIconLabel })),
17716
- callingParticipant.isMuted && (React.createElement(react.Icon, { iconName: "ParticipantItemMicOff", className: iconStyles$2, ariaLabel: strings.mutedIconLabel })),
17717
17743
  callingParticipant.spotlight && React.createElement(react.Icon, { iconName: "ParticipantItemSpotlighted", className: iconStyles$2 }),
17718
- isPinned && React.createElement(react.Icon, { iconName: "ParticipantItemPinned", className: iconStyles$2 })));
17744
+ isPinned && React.createElement(react.Icon, { iconName: "ParticipantItemPinned", className: iconStyles$2 }),
17745
+ /* @conditional-compile-remove(media-access) */ callingParticipant.mediaAccess &&
17746
+ !callingParticipant.mediaAccess.isVideoPermitted ? (React.createElement(react.Icon, { iconName: "ControlButtonCameraProhibited", className: iconStyles$2, ariaLabel: strings.mutedIconLabel })) : undefined,
17747
+ /* @conditional-compile-remove(media-access) */ callingParticipant.mediaAccess &&
17748
+ !((_b = callingParticipant.mediaAccess) === null || _b === void 0 ? void 0 : _b.isAudioPermitted) ? (React.createElement(react.Icon, { iconName: "ControlButtonMicProhibited", className: iconStyles$2, ariaLabel: strings.mutedIconLabel })) : undefined,
17749
+ /* @conditional-compile-remove(media-access) */ (callingParticipant.mediaAccess
17750
+ ? callingParticipant.mediaAccess.isAudioPermitted
17751
+ : true) && callingParticipant.isMuted ? (React.createElement(react.Icon, { iconName: "ParticipantItemMicOff", className: iconStyles$2, ariaLabel: strings.mutedIconLabel })) : undefined));
17719
17752
  }
17720
17753
  : () => null;
17721
17754
  const onRenderAvatarWithRaiseHand = (callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.raisedHand) && onRenderAvatar
@@ -18319,15 +18352,26 @@ const callingComponentLogger = logger.createClientLogger('communication-react:ca
18319
18352
  * @private
18320
18353
  */
18321
18354
  const useVideoStreamLifecycleMaintainer = (props) => {
18322
- const { isMirrored, isScreenSharingOn, isStreamAvailable, onCreateStreamView, onDisposeStreamView, renderElementExists, scalingMode, streamId } = props;
18355
+ const { isMirrored, isScreenSharingOn, isStreamAvailable, onCreateStreamView, onDisposeStreamView, renderElementExists, scalingMode, streamId,
18356
+ /* @conditional-compile-remove(media-access) */
18357
+ isVideoPermitted } = props;
18323
18358
  const [videoStreamViewResult, setVideoStreamViewResult] = React.useState();
18324
- React.useEffect(() => {
18359
+ const createStreamViewTrampoline = React.useCallback((isStreamAvailable, renderElementExists,
18360
+ /* @conditional-compile-remove(media-access) */ isVideoPermitted) => {
18325
18361
  var _a;
18362
+ /* @conditional-compile-remove(media-access) */
18363
+ if (isVideoPermitted === false) {
18364
+ return;
18365
+ }
18326
18366
  if (isStreamAvailable && !renderElementExists) {
18327
18367
  (_a = onCreateStreamView === null || onCreateStreamView === void 0 ? void 0 : onCreateStreamView({ isMirrored, scalingMode })) === null || _a === void 0 ? void 0 : _a.then((result) => {
18328
18368
  result && setVideoStreamViewResult(result);
18329
18369
  });
18330
18370
  }
18371
+ }, [isMirrored, onCreateStreamView, scalingMode]);
18372
+ React.useEffect(() => {
18373
+ createStreamViewTrampoline(isStreamAvailable, renderElementExists,
18374
+ /* @conditional-compile-remove(media-access) */ isVideoPermitted);
18331
18375
  // Always clean up element to make tile up to date and be able to dispose correctly
18332
18376
  return () => {
18333
18377
  if (renderElementExists) {
@@ -18348,12 +18392,10 @@ const useVideoStreamLifecycleMaintainer = (props) => {
18348
18392
  onDisposeStreamView,
18349
18393
  renderElementExists,
18350
18394
  scalingMode,
18351
- /**
18352
- * this is here in order to force a re-render when streamId changes
18353
- * - this should not happen but to recover for the user we will make sure that we subscribe to the
18354
- * new stream by forcing a re-render.
18355
- */
18356
- streamId
18395
+ streamId,
18396
+ createStreamViewTrampoline,
18397
+ /* @conditional-compile-remove(media-access) */
18398
+ isVideoPermitted
18357
18399
  ]);
18358
18400
  // The execution order for above useEffect is onCreateRemoteStreamView =>(async time gap) RenderElement generated => element disposed => onDisposeRemoteStreamView
18359
18401
  // Element disposed could happen during async time gap, which still cause leaks for unused renderElement.
@@ -18408,12 +18450,21 @@ const useRemoteVideoStreamLifecycleMaintainer = (props) => {
18408
18450
  */
18409
18451
  const useVideoTileContextualMenuProps = (props) => {
18410
18452
  var _a;
18411
- const { participant, view, strings, isPinned, onPinParticipant, onUnpinParticipant, onUpdateScalingMode, disablePinMenuItem, toggleAnnouncerString, spotlightedParticipantUserIds = [], isSpotlighted, onStartSpotlight, onStopSpotlight, maxParticipantsToSpotlight, myUserId, onMuteParticipant } = props;
18453
+ const { participant, view, strings, isPinned, onPinParticipant, onUnpinParticipant, onUpdateScalingMode, disablePinMenuItem, toggleAnnouncerString, spotlightedParticipantUserIds = [], isSpotlighted, onStartSpotlight, onStopSpotlight, maxParticipantsToSpotlight, myUserId, onMuteParticipant,
18454
+ /* @conditional-compile-remove(media-access) */
18455
+ onForbidAudio,
18456
+ /* @conditional-compile-remove(media-access) */
18457
+ onPermitAudio,
18458
+ /* @conditional-compile-remove(media-access) */
18459
+ onForbidVideo,
18460
+ /* @conditional-compile-remove(media-access) */
18461
+ onPermitVideo } = props;
18412
18462
  const scalingMode = React.useMemo(() => {
18413
18463
  var _a;
18414
18464
  return (_a = props.participant.videoStream) === null || _a === void 0 ? void 0 : _a.scalingMode;
18415
18465
  }, [(_a = props.participant.videoStream) === null || _a === void 0 ? void 0 : _a.scalingMode]);
18416
18466
  const contextualMenuProps = React.useMemo(() => {
18467
+ var _a, _b;
18417
18468
  const items = [];
18418
18469
  if (onMuteParticipant && (strings === null || strings === void 0 ? void 0 : strings.muteParticipantMenuItemLabel)) {
18419
18470
  items.push({
@@ -18429,6 +18480,68 @@ const useVideoTileContextualMenuProps = (props) => {
18429
18480
  disabled: participant.isMuted
18430
18481
  });
18431
18482
  }
18483
+ /* @conditional-compile-remove(media-access) */
18484
+ if (participant.canAudioBeForbidden &&
18485
+ participant.mediaAccess &&
18486
+ !participant.mediaAccess.isAudioPermitted &&
18487
+ onPermitAudio) {
18488
+ items.push({
18489
+ key: 'permitAudio',
18490
+ text: strings === null || strings === void 0 ? void 0 : strings.permitAudioTileMenuLabel,
18491
+ iconProps: {
18492
+ iconName: 'ControlButtonMicOn',
18493
+ styles: { root: { lineHeight: 0 } }
18494
+ },
18495
+ onClick: () => onPermitAudio([participant.userId]),
18496
+ 'data-ui-id': 'audio-tile-permit-audio',
18497
+ ariaLabel: strings === null || strings === void 0 ? void 0 : strings.permitAudioTileMenuLabel
18498
+ });
18499
+ }
18500
+ /* @conditional-compile-remove(media-access) */
18501
+ if (participant.canAudioBeForbidden && ((_a = participant.mediaAccess) === null || _a === void 0 ? void 0 : _a.isAudioPermitted) && onForbidAudio) {
18502
+ items.push({
18503
+ key: 'forbidAudio',
18504
+ text: strings === null || strings === void 0 ? void 0 : strings.forbidAudioTileMenuLabel,
18505
+ iconProps: {
18506
+ iconName: 'ControlButtonMicProhibited',
18507
+ styles: { root: { lineHeight: 0 } }
18508
+ },
18509
+ onClick: () => onForbidAudio([participant.userId]),
18510
+ 'data-ui-id': 'audio-tile-forbid-audio',
18511
+ ariaLabel: strings === null || strings === void 0 ? void 0 : strings.forbidAudioTileMenuLabel
18512
+ });
18513
+ }
18514
+ /* @conditional-compile-remove(media-access) */
18515
+ if (participant.canVideoBeForbidden &&
18516
+ participant.mediaAccess &&
18517
+ !participant.mediaAccess.isVideoPermitted &&
18518
+ onPermitVideo) {
18519
+ items.push({
18520
+ key: 'permitVideo',
18521
+ text: strings === null || strings === void 0 ? void 0 : strings.permitVideoTileMenuLabel,
18522
+ iconProps: {
18523
+ iconName: 'ControlButtonCameraOn',
18524
+ styles: { root: { lineHeight: 0 } }
18525
+ },
18526
+ onClick: () => onPermitVideo([participant.userId]),
18527
+ 'data-ui-id': 'video-tile-permit-video',
18528
+ ariaLabel: strings === null || strings === void 0 ? void 0 : strings.permitVideoTileMenuLabel
18529
+ });
18530
+ }
18531
+ /* @conditional-compile-remove(media-access) */
18532
+ if (participant.canVideoBeForbidden && ((_b = participant.mediaAccess) === null || _b === void 0 ? void 0 : _b.isVideoPermitted) && onForbidVideo) {
18533
+ items.push({
18534
+ key: 'forbidVideo',
18535
+ text: strings === null || strings === void 0 ? void 0 : strings.forbidVideoTileMenuLabel,
18536
+ iconProps: {
18537
+ iconName: 'ControlButtonCameraProhibited',
18538
+ styles: { root: { lineHeight: 0 } }
18539
+ },
18540
+ onClick: () => onForbidVideo([participant.userId]),
18541
+ 'data-ui-id': 'video-tile-forbid-video',
18542
+ ariaLabel: strings === null || strings === void 0 ? void 0 : strings.forbidVideoTileMenuLabel
18543
+ });
18544
+ }
18432
18545
  if (isPinned !== undefined) {
18433
18546
  if (isPinned && onUnpinParticipant && (strings === null || strings === void 0 ? void 0 : strings.unpinParticipantForMe)) {
18434
18547
  let unpinActionString = undefined;
@@ -18554,25 +18667,39 @@ const useVideoTileContextualMenuProps = (props) => {
18554
18667
  }
18555
18668
  return { items, styles: {}, calloutProps: { preventDismissOnEvent: _preventDismissOnEvent }, shouldFocusOnContainer: false };
18556
18669
  }, [
18557
- scalingMode,
18670
+ onMuteParticipant,
18558
18671
  strings,
18559
- view,
18560
- isPinned,
18561
- onPinParticipant,
18562
- onUnpinParticipant,
18563
- onUpdateScalingMode,
18672
+ participant.isMuted,
18564
18673
  participant.userId,
18565
18674
  participant.displayName,
18566
- disablePinMenuItem,
18567
- toggleAnnouncerString,
18568
- spotlightedParticipantUserIds,
18675
+ isPinned,
18569
18676
  isSpotlighted,
18570
- onStartSpotlight,
18677
+ scalingMode,
18678
+ onUnpinParticipant,
18679
+ onPinParticipant,
18680
+ toggleAnnouncerString,
18681
+ disablePinMenuItem,
18682
+ myUserId,
18571
18683
  onStopSpotlight,
18684
+ spotlightedParticipantUserIds,
18572
18685
  maxParticipantsToSpotlight,
18573
- myUserId,
18574
- onMuteParticipant,
18575
- participant.isMuted
18686
+ onStartSpotlight,
18687
+ onUpdateScalingMode,
18688
+ view,
18689
+ /* @conditional-compile-remove(media-access) */
18690
+ participant.canAudioBeForbidden,
18691
+ /* @conditional-compile-remove(media-access) */
18692
+ participant.canVideoBeForbidden,
18693
+ /* @conditional-compile-remove(media-access) */
18694
+ participant.mediaAccess,
18695
+ /* @conditional-compile-remove(media-access) */
18696
+ onPermitAudio,
18697
+ /* @conditional-compile-remove(media-access) */
18698
+ onForbidAudio,
18699
+ /* @conditional-compile-remove(media-access) */
18700
+ onPermitVideo,
18701
+ /* @conditional-compile-remove(media-access) */
18702
+ onForbidVideo
18576
18703
  ]);
18577
18704
  return contextualMenuProps;
18578
18705
  };
@@ -18973,7 +19100,9 @@ const VideoTileMoreOptionsButton = (props) => {
18973
19100
  * @public
18974
19101
  */
18975
19102
  const VideoTile = (props) => {
18976
- const { children, displayName, initialsName, isMirrored, isMuted, isSpotlighted, isPinned, onRenderPlaceholder, renderElement, overlay: reactionOverlay, showLabel = true, showMuteIndicator = true, styles, userId, noVideoAvailableAriaLabel, isSpeaking, raisedHand, personaMinSize = DEFAULT_PERSONA_MIN_SIZE_PX, personaMaxSize = DEFAULT_PERSONA_MAX_SIZE_PX, contextualMenu } = props;
19103
+ const { children, displayName, initialsName, isMirrored, isMuted, isSpotlighted, isPinned, onRenderPlaceholder, renderElement, overlay: reactionOverlay, showLabel = true, showMuteIndicator = true, styles, userId, noVideoAvailableAriaLabel, isSpeaking, raisedHand, personaMinSize = DEFAULT_PERSONA_MIN_SIZE_PX, personaMaxSize = DEFAULT_PERSONA_MAX_SIZE_PX, contextualMenu,
19104
+ /* @conditional-compile-remove(media-access) */
19105
+ mediaAccess } = props;
18977
19106
  const [isHovered, setIsHovered] = React.useState(false);
18978
19107
  const [isFocused, setIsFocused] = React.useState(false);
18979
19108
  // need to set a default otherwise the resizeObserver will get stuck in an infinite loop.
@@ -19091,8 +19220,9 @@ const VideoTile = (props) => {
19091
19220
  React.createElement(react.Stack, { horizontal: true, className: tileInfoStyle },
19092
19221
  canShowLabel && (React.createElement(react.Text, { className: react.mergeStyles(displayNameStyle), title: displayName, style: { color: participantStateString ? theme.palette.neutralSecondary : 'inherit' }, "data-ui-id": "video-tile-display-name" }, displayName)),
19093
19222
  participantStateString && (React.createElement(react.Text, { className: react.mergeStyles(participantStateStringStyles(theme)) }, bracketedParticipantString(participantStateString, !!canShowLabel))),
19094
- showMuteIndicator && isMuted && (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
19095
- React.createElement(react.Icon, { iconName: "VideoTileMicOff" }))),
19223
+ getMediaAccessIconsTrampoline(showMuteIndicator, isMuted,
19224
+ /* @conditional-compile-remove(media-access) */
19225
+ mediaAccess),
19096
19226
  isSpotlighted && (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
19097
19227
  React.createElement(react.Icon, { iconName: "VideoTileSpotlighted" }))),
19098
19228
  isPinned && (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
@@ -19105,6 +19235,16 @@ const VideoTile = (props) => {
19105
19235
  React.createElement(react.Stack.Item, null,
19106
19236
  React.createElement(RaisedHandIcon, null)))))));
19107
19237
  };
19238
+ const getMediaAccessIconsTrampoline = (showMuteIndicator, isMuted, mediaAccess) => {
19239
+ /* @conditional-compile-remove(media-access) */
19240
+ return (React.createElement(React.Fragment, null,
19241
+ mediaAccess && !(mediaAccess === null || mediaAccess === void 0 ? void 0 : mediaAccess.isVideoPermitted) ? (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
19242
+ React.createElement(react.Icon, { iconName: "ControlButtonCameraProhibitedSmall" }))) : undefined,
19243
+ (mediaAccess ? mediaAccess.isAudioPermitted : true) && showMuteIndicator && isMuted ? (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
19244
+ React.createElement(react.Icon, { iconName: "VideoTileMicOff" }))) : undefined,
19245
+ mediaAccess && !(mediaAccess === null || mediaAccess === void 0 ? void 0 : mediaAccess.isAudioPermitted) && showMuteIndicator ? (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
19246
+ React.createElement(react.Icon, { iconName: "ControlButtonMicProhibitedSmall" }))) : undefined));
19247
+ };
19108
19248
  const getParticipantStateString = (props, locale) => {
19109
19249
  const strings = Object.assign(Object.assign({}, locale.strings.videoTile), props.strings);
19110
19250
  return props.participantState === 'EarlyMedia' || props.participantState === 'Ringing'
@@ -19806,7 +19946,15 @@ const MeetingReactionOverlay = (props) => {
19806
19946
  const _RemoteVideoTile = React.memo((props) => {
19807
19947
  var _a, _b;
19808
19948
  const { isAvailable, isReceiving = true, // default to true to prevent any breaking change
19809
- isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind, isPinned, onPinParticipant, onUnpinParticipant, spotlightedParticipantUserIds, isSpotlighted, onStartSpotlight, onStopSpotlight, maxParticipantsToSpotlight, onMuteParticipant, onUpdateScalingMode, disablePinMenuItem, toggleAnnouncerString, strings, reactionResources, streamId } = props;
19949
+ isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind, isPinned, onPinParticipant, onUnpinParticipant, spotlightedParticipantUserIds, isSpotlighted, onStartSpotlight, onStopSpotlight, maxParticipantsToSpotlight, onMuteParticipant, onUpdateScalingMode, disablePinMenuItem, toggleAnnouncerString, strings, reactionResources, streamId,
19950
+ /* @conditional-compile-remove(media-access) */
19951
+ onForbidAudio,
19952
+ /* @conditional-compile-remove(media-access) */
19953
+ onPermitAudio,
19954
+ /* @conditional-compile-remove(media-access) */
19955
+ onForbidVideo,
19956
+ /* @conditional-compile-remove(media-access) */
19957
+ onPermitVideo } = props;
19810
19958
  const remoteVideoStreamProps = React.useMemo(() => ({
19811
19959
  isMirrored: remoteVideoViewOptions === null || remoteVideoViewOptions === void 0 ? void 0 : remoteVideoViewOptions.isMirrored,
19812
19960
  isScreenSharingOn,
@@ -19817,7 +19965,9 @@ const _RemoteVideoTile = React.memo((props) => {
19817
19965
  remoteParticipantId: userId,
19818
19966
  renderElementExists: !!renderElement,
19819
19967
  scalingMode: remoteVideoViewOptions === null || remoteVideoViewOptions === void 0 ? void 0 : remoteVideoViewOptions.scalingMode,
19820
- streamId
19968
+ streamId,
19969
+ /* @conditional-compile-remove(media-access) */
19970
+ isVideoPermitted: remoteParticipant.mediaAccess ? remoteParticipant.mediaAccess.isVideoPermitted : true
19821
19971
  }), [
19822
19972
  isAvailable,
19823
19973
  isReceiving,
@@ -19828,7 +19978,9 @@ const _RemoteVideoTile = React.memo((props) => {
19828
19978
  remoteVideoViewOptions === null || remoteVideoViewOptions === void 0 ? void 0 : remoteVideoViewOptions.scalingMode,
19829
19979
  renderElement,
19830
19980
  userId,
19831
- streamId
19981
+ streamId,
19982
+ /* @conditional-compile-remove(media-access) */
19983
+ remoteParticipant.mediaAccess
19832
19984
  ]);
19833
19985
  // Handle creating, destroying and updating the video stream as necessary
19834
19986
  const createVideoStreamResult = useRemoteVideoStreamLifecycleMaintainer(remoteVideoStreamProps);
@@ -19847,7 +19999,11 @@ const _RemoteVideoTile = React.memo((props) => {
19847
19999
  onStartSpotlight,
19848
20000
  onStopSpotlight,
19849
20001
  maxParticipantsToSpotlight,
19850
- onMuteParticipant
20002
+ onMuteParticipant,
20003
+ /* @conditional-compile-remove(media-access) */ onForbidAudio,
20004
+ /* @conditional-compile-remove(media-access) */ onPermitAudio,
20005
+ /* @conditional-compile-remove(media-access) */ onForbidVideo,
20006
+ /* @conditional-compile-remove(media-access) */ onPermitVideo
19851
20007
  });
19852
20008
  const videoTileContextualMenuProps = React.useMemo(() => {
19853
20009
  if (menuKind !== 'contextual' || !contextualMenuProps) {
@@ -19892,7 +20048,9 @@ const _RemoteVideoTile = React.memo((props) => {
19892
20048
  return (React.createElement(react.Stack, { tabIndex: menuKind === 'drawer' ? 0 : undefined, onKeyDown: menuKind === 'drawer' ? onKeyDown : undefined, style: remoteVideoTileWrapperStyle },
19893
20049
  React.createElement(VideoTile, Object.assign({ key: userId, userId: userId, initialsName: (_b = formatInitialsName()) !== null && _b !== void 0 ? _b : '', renderElement: renderVideoStreamElement, displayName: displayName, onRenderPlaceholder: onRenderAvatar, isMuted: remoteParticipant.isMuted, raisedHand: remoteParticipant.raisedHand, isSpeaking: remoteParticipant.isSpeaking, showMuteIndicator: showMuteIndicator, personaMinSize: props.personaMinSize, showLabel: props.showLabel, alwaysShowLabelBackground: props.alwaysShowLabelBackground, participantState: participantState }, videoTileContextualMenuProps, { isPinned: props.isPinned, onLongTouch: props.onLongTouch
19894
20050
  ? props.onLongTouch
19895
- : () => setDrawerMenuItemProps(convertContextualMenuItemsToDrawerMenuItemProps$1(contextualMenuProps, () => setDrawerMenuItemProps([]))), isSpotlighted: isSpotlighted, overlay: reactionOverlay })),
20051
+ : () => setDrawerMenuItemProps(convertContextualMenuItemsToDrawerMenuItemProps$1(contextualMenuProps, () => setDrawerMenuItemProps([]))), isSpotlighted: isSpotlighted, overlay: reactionOverlay,
20052
+ /* @conditional-compile-remove(media-access) */
20053
+ mediaAccess: remoteParticipant.mediaAccess })),
19896
20054
  drawerMenuItemProps.length > 0 && (React.createElement(react.Layer, { hostId: props.drawerMenuHostId },
19897
20055
  React.createElement(react.Stack, { styles: drawerMenuWrapperStyles },
19898
20056
  React.createElement(_DrawerMenu, { onLightDismiss: () => setDrawerMenuItemProps([]), items: drawerMenuItemProps, heading: displayName }))))));
@@ -19997,7 +20155,9 @@ const LocalScreenShare = React.memo((props) => {
19997
20155
  ? locale.strings.videoGallery.displayNamePlaceholder
19998
20156
  : localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.displayName;
19999
20157
  const loadingMessage = locale.strings.videoGallery.localScreenShareLoadingMessage;
20000
- return (React.createElement(VideoTile, { displayName: displayName, isMuted: localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.isMuted, renderElement: renderElement ? (React.createElement(StreamMedia, { videoStreamElement: renderElement, loadingState: isAvailable === false ? 'loading' : 'none' })) : undefined, onRenderPlaceholder: () => React.createElement(LoadingSpinner, { loadingMessage: loadingMessage }) }));
20158
+ return (React.createElement(VideoTile, { displayName: displayName, isMuted: localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.isMuted, renderElement: renderElement ? (React.createElement(StreamMedia, { videoStreamElement: renderElement, loadingState: isAvailable === false ? 'loading' : 'none' })) : undefined, onRenderPlaceholder: () => React.createElement(LoadingSpinner, { loadingMessage: loadingMessage }),
20159
+ /* @conditional-compile-remove(media-access) */
20160
+ mediaAccess: localParticipant.mediaAccess }));
20001
20161
  });
20002
20162
 
20003
20163
  // Copyright (c) Microsoft Corporation.
@@ -20102,7 +20262,9 @@ const LocalVideoCameraCycleButton = (props) => {
20102
20262
  * @internal
20103
20263
  */
20104
20264
  const _LocalVideoTile = React.memo((props) => {
20105
- const { isAvailable, isMuted, onCreateLocalStreamView, onDisposeLocalStreamView, localVideoViewOptions, renderElement, userId, showLabel, alwaysShowLabelBackground, displayName, initialsName, onRenderAvatar, showMuteIndicator, styles, showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel, localVideoSelectedDescription, raisedHand, reaction, isSpotlighted, spotlightedParticipantUserIds, onStartSpotlight, onStopSpotlight, maxParticipantsToSpotlight, menuKind, strings, reactionResources, isScreenSharingOn } = props;
20265
+ const { isAvailable, isMuted, onCreateLocalStreamView, onDisposeLocalStreamView, localVideoViewOptions, renderElement, userId, showLabel, alwaysShowLabelBackground, displayName, initialsName, onRenderAvatar, showMuteIndicator, styles, showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel, localVideoSelectedDescription, raisedHand, reaction, isSpotlighted, spotlightedParticipantUserIds, onStartSpotlight, onStopSpotlight, maxParticipantsToSpotlight, menuKind, strings, reactionResources, isScreenSharingOn,
20266
+ /* @conditional-compile-remove(media-access) */
20267
+ mediaAccess } = props;
20106
20268
  const theme = useTheme();
20107
20269
  const localVideoStreamProps = React.useMemo(() => ({
20108
20270
  isMirrored: localVideoViewOptions === null || localVideoViewOptions === void 0 ? void 0 : localVideoViewOptions.isMirrored,
@@ -20110,14 +20272,18 @@ const _LocalVideoTile = React.memo((props) => {
20110
20272
  onCreateLocalStreamView,
20111
20273
  onDisposeLocalStreamView,
20112
20274
  renderElementExists: !!renderElement,
20113
- scalingMode: localVideoViewOptions === null || localVideoViewOptions === void 0 ? void 0 : localVideoViewOptions.scalingMode
20275
+ scalingMode: localVideoViewOptions === null || localVideoViewOptions === void 0 ? void 0 : localVideoViewOptions.scalingMode,
20276
+ /* @conditional-compile-remove(media-access) */
20277
+ isVideoPermitted: mediaAccess ? mediaAccess.isVideoPermitted : true
20114
20278
  }), [
20115
20279
  isAvailable,
20116
20280
  localVideoViewOptions === null || localVideoViewOptions === void 0 ? void 0 : localVideoViewOptions.isMirrored,
20117
20281
  localVideoViewOptions === null || localVideoViewOptions === void 0 ? void 0 : localVideoViewOptions.scalingMode,
20118
20282
  onCreateLocalStreamView,
20119
20283
  onDisposeLocalStreamView,
20120
- renderElement
20284
+ renderElement,
20285
+ /* @conditional-compile-remove(media-access) */
20286
+ mediaAccess
20121
20287
  ]);
20122
20288
  // Handle creating, destroying and updating the video stream as necessary
20123
20289
  useLocalVideoStreamLifecycleMaintainer(localVideoStreamProps);
@@ -20188,7 +20354,8 @@ const _LocalVideoTile = React.memo((props) => {
20188
20354
  React.createElement(react.Spinner, { label: strings === null || strings === void 0 ? void 0 : strings.waitingScreenText, ariaLive: "assertive", labelPosition: "bottom", role: "alert", styles: loadSpinnerStyles(theme, false) })));
20189
20355
  }, [strings === null || strings === void 0 ? void 0 : strings.waitingScreenText, theme]);
20190
20356
  return (React.createElement(react.Stack, { "data-ui-id": "local-video-tile", className: react.mergeStyles({ width: '100%', height: '100%' }), onKeyDown: menuKind === 'drawer' ? onKeyDown : undefined },
20191
- React.createElement(VideoTile, Object.assign({ key: userId !== null && userId !== void 0 ? userId : 'local-video-tile', userId: userId, renderElement: renderVideoStreamElement, showLabel: showLabel, alwaysShowLabelBackground: alwaysShowLabelBackground, displayName: displayName, initialsName: initialsName, styles: videoTileStyles, onRenderPlaceholder: props.participantsCount === 1 && !isScreenSharingOn ? onRenderAvatarOneParticipant : onRenderAvatar, isMuted: isMuted, showMuteIndicator: showMuteIndicator, personaMinSize: props.personaMinSize, raisedHand: raisedHand, isSpotlighted: isSpotlighted }, videoTileContextualMenuProps, { onLongTouch: () => setDrawerMenuItemProps(convertContextualMenuItemsToDrawerMenuItemProps(contextualMenuProps, () => setDrawerMenuItemProps([]))), overlay: videoTileOverlay }), drawerMenuItemProps.length > 0 && (React.createElement(react.Layer, { hostId: props.drawerMenuHostId },
20357
+ React.createElement(VideoTile, Object.assign({ key: userId !== null && userId !== void 0 ? userId : 'local-video-tile', userId: userId, renderElement: renderVideoStreamElement, showLabel: showLabel, alwaysShowLabelBackground: alwaysShowLabelBackground, displayName: displayName, initialsName: initialsName, styles: videoTileStyles, onRenderPlaceholder: props.participantsCount === 1 && !isScreenSharingOn ? onRenderAvatarOneParticipant : onRenderAvatar, isMuted: isMuted, showMuteIndicator: showMuteIndicator, personaMinSize: props.personaMinSize, raisedHand: raisedHand, isSpotlighted: isSpotlighted }, videoTileContextualMenuProps, { onLongTouch: () => setDrawerMenuItemProps(convertContextualMenuItemsToDrawerMenuItemProps(contextualMenuProps, () => setDrawerMenuItemProps([]))), overlay: videoTileOverlay,
20358
+ /* @conditional-compile-remove(media-access) */ mediaAccess: mediaAccess }), drawerMenuItemProps.length > 0 && (React.createElement(react.Layer, { hostId: props.drawerMenuHostId },
20192
20359
  React.createElement(react.Stack, { styles: drawerMenuWrapperStyles },
20193
20360
  React.createElement(_DrawerMenu, { onLightDismiss: () => setDrawerMenuItemProps([]), items: drawerMenuItemProps })))))));
20194
20361
  });
@@ -22176,7 +22343,15 @@ const MAX_PINNED_REMOTE_VIDEO_TILES$1 = 4;
22176
22343
  */
22177
22344
  const VideoGallery = (props) => {
22178
22345
  var _a, _b, _c, _d;
22179
- const { localParticipant, remoteParticipants = [], localVideoViewOptions, remoteVideoViewOptions, dominantSpeakers, onRenderLocalVideoTile, onRenderRemoteVideoTile, onCreateLocalStreamView, onDisposeLocalStreamView, onCreateRemoteStreamView, onDisposeRemoteScreenShareStreamView, onDisposeLocalScreenShareStreamView, onDisposeRemoteVideoStreamView, styles, layout, onRenderAvatar, showMuteIndicator, maxRemoteVideoStreams = DEFAULT_MAX_REMOTE_VIDEO_STREAMS, showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps, onPinParticipant: onPinParticipantHandler, onUnpinParticipant: onUnpinParticipantHandler, remoteVideoTileMenu = DEFAULT_REMOTE_VIDEO_TILE_MENU_OPTIONS, overflowGalleryPosition = 'horizontalBottom', localVideoTileSize = 'followDeviceOrientation', spotlightedParticipants, onStartLocalSpotlight, onStartRemoteSpotlight, onStopLocalSpotlight, onStopRemoteSpotlight, maxParticipantsToSpotlight, reactionResources, videoTilesOptions, onMuteParticipant } = props;
22346
+ const { localParticipant, remoteParticipants = [], localVideoViewOptions, remoteVideoViewOptions, dominantSpeakers, onRenderLocalVideoTile, onRenderRemoteVideoTile, onCreateLocalStreamView, onDisposeLocalStreamView, onCreateRemoteStreamView, onDisposeRemoteScreenShareStreamView, onDisposeLocalScreenShareStreamView, onDisposeRemoteVideoStreamView, styles, layout, onRenderAvatar, showMuteIndicator, maxRemoteVideoStreams = DEFAULT_MAX_REMOTE_VIDEO_STREAMS, showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps, onPinParticipant: onPinParticipantHandler, onUnpinParticipant: onUnpinParticipantHandler, remoteVideoTileMenu = DEFAULT_REMOTE_VIDEO_TILE_MENU_OPTIONS, overflowGalleryPosition = 'horizontalBottom', localVideoTileSize = 'followDeviceOrientation', spotlightedParticipants, onStartLocalSpotlight, onStartRemoteSpotlight, onStopLocalSpotlight, onStopRemoteSpotlight, maxParticipantsToSpotlight, reactionResources, videoTilesOptions, onMuteParticipant,
22347
+ /* @conditional-compile-remove(media-access) */
22348
+ onForbidAudio,
22349
+ /* @conditional-compile-remove(media-access) */
22350
+ onPermitAudio,
22351
+ /* @conditional-compile-remove(media-access) */
22352
+ onForbidVideo,
22353
+ /* @conditional-compile-remove(media-access) */
22354
+ onPermitVideo } = props;
22180
22355
  const ids = useIdentifiers();
22181
22356
  const theme = useTheme();
22182
22357
  const localeStrings = useLocale$1().strings.videoGallery;
@@ -22234,7 +22409,9 @@ const VideoGallery = (props) => {
22234
22409
  return layout === 'default' ? strings.localVideoLabel : isNarrow ? '' : strings.localVideoLabel;
22235
22410
  };
22236
22411
  return (React.createElement(react.Stack, { styles: localVideoTileContainerStyles, key: "local-video-tile-key" },
22237
- React.createElement(_LocalVideoTile, { alwaysShowLabelBackground: videoTilesOptions === null || videoTilesOptions === void 0 ? void 0 : videoTilesOptions.alwaysShowLabelBackground, userId: localParticipant.userId, onCreateLocalStreamView: onCreateLocalStreamView, onDisposeLocalStreamView: onDisposeLocalStreamView, isAvailable: (_a = localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable, isMuted: localParticipant.isMuted, renderElement: (_b = localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.videoStream) === null || _b === void 0 ? void 0 : _b.renderElement, displayName: showDisplayNameTrampoline(), initialsName: initialsName, localVideoViewOptions: localVideoViewOptions, onRenderAvatar: onRenderAvatar, showLabel: showLocalVideoTileLabel, showMuteIndicator: showMuteIndicator, showCameraSwitcherInLocalPreview: showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps: localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel: strings.localVideoCameraSwitcherLabel, localVideoSelectedDescription: strings.localVideoSelectedDescription, styles: localVideoTileStyles, raisedHand: localParticipant.raisedHand, reaction: localParticipant.reaction, spotlightedParticipantUserIds: spotlightedParticipants, isSpotlighted: isSpotlighted, onStartSpotlight: onStartLocalSpotlight, onStopSpotlight: onStopLocalSpotlight, maxParticipantsToSpotlight: maxParticipantsToSpotlight, menuKind: remoteVideoTileMenu ? (remoteVideoTileMenu.kind === 'drawer' ? 'drawer' : 'contextual') : undefined, drawerMenuHostId: drawerMenuHostId, strings: strings, reactionResources: reactionResources, participantsCount: remoteParticipants.length + 1, isScreenSharingOn: localParticipant.isScreenSharingOn })));
22412
+ React.createElement(_LocalVideoTile, { alwaysShowLabelBackground: videoTilesOptions === null || videoTilesOptions === void 0 ? void 0 : videoTilesOptions.alwaysShowLabelBackground, userId: localParticipant.userId, onCreateLocalStreamView: onCreateLocalStreamView, onDisposeLocalStreamView: onDisposeLocalStreamView, isAvailable: (_a = localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable, isMuted: localParticipant.isMuted, renderElement: (_b = localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.videoStream) === null || _b === void 0 ? void 0 : _b.renderElement, displayName: showDisplayNameTrampoline(), initialsName: initialsName, localVideoViewOptions: localVideoViewOptions, onRenderAvatar: onRenderAvatar, showLabel: showLocalVideoTileLabel, showMuteIndicator: showMuteIndicator, showCameraSwitcherInLocalPreview: showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps: localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel: strings.localVideoCameraSwitcherLabel, localVideoSelectedDescription: strings.localVideoSelectedDescription, styles: localVideoTileStyles, raisedHand: localParticipant.raisedHand, reaction: localParticipant.reaction, spotlightedParticipantUserIds: spotlightedParticipants, isSpotlighted: isSpotlighted, onStartSpotlight: onStartLocalSpotlight, onStopSpotlight: onStopLocalSpotlight, maxParticipantsToSpotlight: maxParticipantsToSpotlight, menuKind: remoteVideoTileMenu ? (remoteVideoTileMenu.kind === 'drawer' ? 'drawer' : 'contextual') : undefined, drawerMenuHostId: drawerMenuHostId, strings: strings, reactionResources: reactionResources, participantsCount: remoteParticipants.length + 1, isScreenSharingOn: localParticipant.isScreenSharingOn,
22413
+ /* @conditional-compile-remove(media-access) */
22414
+ mediaAccess: localParticipant.mediaAccess })));
22238
22415
  }, [
22239
22416
  isNarrow,
22240
22417
  localParticipant,
@@ -22314,30 +22491,46 @@ const VideoGallery = (props) => {
22314
22491
  ? remoteVideoTileMenu.kind === 'drawer'
22315
22492
  ? 'drawer'
22316
22493
  : 'contextual'
22317
- : undefined, drawerMenuHostId: drawerMenuHostId, onPinParticipant: onPinParticipant, onUnpinParticipant: onUnpinParticipant, onUpdateScalingMode: onUpdateScalingMode, isPinned: isPinned, disablePinMenuItem: pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES$1, toggleAnnouncerString: toggleAnnouncerString, spotlightedParticipantUserIds: spotlightedParticipants, isSpotlighted: isSpotlighted, onStartSpotlight: onStartRemoteSpotlight, onStopSpotlight: onStopRemoteSpotlight, maxParticipantsToSpotlight: maxParticipantsToSpotlight, reactionResources: reactionResources, onMuteParticipant: onMuteParticipant }));
22494
+ : undefined, drawerMenuHostId: drawerMenuHostId, onPinParticipant: onPinParticipant, onUnpinParticipant: onUnpinParticipant, onUpdateScalingMode: onUpdateScalingMode, isPinned: isPinned, disablePinMenuItem: pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES$1, toggleAnnouncerString: toggleAnnouncerString, spotlightedParticipantUserIds: spotlightedParticipants, isSpotlighted: isSpotlighted, onStartSpotlight: onStartRemoteSpotlight, onStopSpotlight: onStopRemoteSpotlight, maxParticipantsToSpotlight: maxParticipantsToSpotlight, reactionResources: reactionResources, onMuteParticipant: onMuteParticipant,
22495
+ /* @conditional-compile-remove(media-access) */
22496
+ onForbidAudio: onForbidAudio,
22497
+ /* @conditional-compile-remove(media-access) */
22498
+ onPermitAudio: onPermitAudio,
22499
+ /* @conditional-compile-remove(media-access) */
22500
+ onForbidVideo: onForbidVideo,
22501
+ /* @conditional-compile-remove(media-access) */
22502
+ onPermitVideo: onPermitVideo }));
22318
22503
  }, [
22504
+ selectedScalingModeState,
22505
+ pinnedParticipants,
22506
+ videoTilesOptions === null || videoTilesOptions === void 0 ? void 0 : videoTilesOptions.alwaysShowLabelBackground,
22319
22507
  onCreateRemoteStreamView,
22320
22508
  onDisposeRemoteVideoStreamView,
22321
- remoteVideoViewOptions,
22322
- localParticipant,
22323
22509
  onRenderAvatar,
22324
22510
  showMuteIndicator,
22325
22511
  strings,
22326
- drawerMenuHostId,
22512
+ localParticipant.userId,
22327
22513
  remoteVideoTileMenu,
22328
- selectedScalingModeState,
22329
- pinnedParticipants,
22514
+ drawerMenuHostId,
22330
22515
  onPinParticipant,
22331
22516
  onUnpinParticipant,
22332
- toggleAnnouncerString,
22333
22517
  onUpdateScalingMode,
22518
+ toggleAnnouncerString,
22334
22519
  spotlightedParticipants,
22335
22520
  onStartRemoteSpotlight,
22336
22521
  onStopRemoteSpotlight,
22337
22522
  maxParticipantsToSpotlight,
22338
- onMuteParticipant,
22339
22523
  reactionResources,
22340
- videoTilesOptions
22524
+ onMuteParticipant,
22525
+ /* @conditional-compile-remove(media-access) */
22526
+ onForbidAudio,
22527
+ /* @conditional-compile-remove(media-access) */
22528
+ onPermitAudio,
22529
+ /* @conditional-compile-remove(media-access) */
22530
+ onForbidVideo,
22531
+ /* @conditional-compile-remove(media-access) */
22532
+ onPermitVideo,
22533
+ remoteVideoViewOptions
22341
22534
  ]);
22342
22535
  const screenShareParticipant = remoteParticipants.find((participant) => { var _a; return (_a = participant.screenShareStream) === null || _a === void 0 ? void 0 : _a.isAvailable; });
22343
22536
  const localScreenShareStreamComponent = (React.createElement(LocalScreenShare, { localParticipant: localParticipant, renderElement: (_a = localParticipant.screenShareStream) === null || _a === void 0 ? void 0 : _a.renderElement, isAvailable: (_b = localParticipant.screenShareStream) === null || _b === void 0 ? void 0 : _b.isAvailable, onCreateLocalStreamView: onCreateLocalStreamView, onDisposeLocalScreenShareStreamView: onDisposeLocalScreenShareStreamView }));
@@ -26520,31 +26713,17 @@ const _videoGalleryRemoteParticipantsMemo = (remoteParticipants, isHideAttendeeN
26520
26713
  const displayName = maskDisplayNameWithRole(participant.displayName, localUserRole, participant.role, isHideAttendeeNamesEnabled);
26521
26714
  const remoteParticipantReaction = memoizedConvertToVideoTileReaction(participant.reactionState);
26522
26715
  const spotlight = participant.spotlight;
26523
- return memoizedFn(toFlatCommunicationIdentifier(participant.identifier), participant.isMuted, checkIsSpeaking(participant), participant.videoStreams, state, displayName, participant.raisedHand, participant.contentSharingStream, remoteParticipantReaction, spotlight,
26716
+ return memoizedFn(toFlatCommunicationIdentifier(participant.identifier), participant.isMuted, checkIsSpeaking(participant), participant.videoStreams, state, displayName, participant.raisedHand, participant.contentSharingStream, remoteParticipantReaction, spotlight, participant.mediaAccess, participant.role,
26524
26717
  /* @conditional-compile-remove(remote-ufd) */
26525
- Math.max(((_c = (_b = (_a = participant.diagnostics) === null || _a === void 0 ? void 0 : _a.networkReceiveQuality) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : 0), ((_f = (_e = (_d = participant.diagnostics) === null || _d === void 0 ? void 0 : _d.networkSendQuality) === null || _e === void 0 ? void 0 : _e.value) !== null && _f !== void 0 ? _f : 0)),
26526
- /* @conditional-compile-remove(media-access) */
26527
- participant.mediaAccess,
26528
- /* @conditional-compile-remove(media-access) */
26529
- participant.role);
26718
+ Math.max(((_c = (_b = (_a = participant.diagnostics) === null || _a === void 0 ? void 0 : _a.networkReceiveQuality) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : 0), ((_f = (_e = (_d = participant.diagnostics) === null || _d === void 0 ? void 0 : _d.networkSendQuality) === null || _e === void 0 ? void 0 : _e.value) !== null && _f !== void 0 ? _f : 0)));
26530
26719
  }));
26531
26720
  });
26532
26721
  };
26533
- const memoizedAllConvertRemoteParticipant = memoizeFnAll((userId, isMuted, isSpeaking, videoStreams, state, displayName, raisedHand, contentSharingStream, reaction, spotlight,
26534
- /* @conditional-compile-remove(remote-ufd) */
26535
- signalStrength, mediaAccess, role) => {
26536
- return convertRemoteParticipantToVideoGalleryRemoteParticipant(userId, isMuted, isSpeaking, videoStreams, state, displayName, raisedHand, contentSharingStream, reaction, spotlight,
26537
- /* @conditional-compile-remove(remote-ufd) */
26538
- signalStrength,
26539
- /* @conditional-compile-remove(media-access) */
26540
- mediaAccess,
26541
- /* @conditional-compile-remove(media-access) */
26542
- role);
26722
+ const memoizedAllConvertRemoteParticipant = memoizeFnAll((userId, isMuted, isSpeaking, videoStreams, state, displayName, raisedHand, contentSharingStream, reaction, spotlight, mediaAccess, role, signalStrength) => {
26723
+ return convertRemoteParticipantToVideoGalleryRemoteParticipant(userId, isMuted, isSpeaking, videoStreams, state, displayName, raisedHand, contentSharingStream, reaction, spotlight, signalStrength, mediaAccess, role);
26543
26724
  });
26544
26725
  /** @private */
26545
- const convertRemoteParticipantToVideoGalleryRemoteParticipant = (userId, isMuted, isSpeaking, videoStreams, state, displayName, raisedHand, contentSharingStream, reaction, spotlight,
26546
- /* @conditional-compile-remove(remote-ufd) */
26547
- signalStrength, mediaAccess, role) => {
26726
+ const convertRemoteParticipantToVideoGalleryRemoteParticipant = (userId, isMuted, isSpeaking, videoStreams, state, displayName, raisedHand, contentSharingStream, reaction, spotlight, signalStrength, mediaAccess, role) => {
26548
26727
  const rawVideoStreamsArray = Object.values(videoStreams);
26549
26728
  let videoStream = undefined;
26550
26729
  let screenShareStream = undefined;
@@ -26580,12 +26759,13 @@ signalStrength, mediaAccess, role) => {
26580
26759
  raisedHand,
26581
26760
  reaction,
26582
26761
  spotlight,
26583
- /* @conditional-compile-remove(remote-ufd) */
26584
- signalStrength,
26585
- /* @conditional-compile-remove(media-access) */
26586
26762
  mediaAccess,
26587
26763
  /* @conditional-compile-remove(media-access) */
26588
- role
26764
+ canAudioBeForbidden: role === 'Attendee',
26765
+ /* @conditional-compile-remove(media-access) */
26766
+ canVideoBeForbidden: role === 'Attendee',
26767
+ /* @conditional-compile-remove(remote-ufd) */
26768
+ signalStrength
26589
26769
  };
26590
26770
  };
26591
26771
  const convertRemoteVideoStreamToVideoGalleryStream = (stream) => {
@@ -26632,8 +26812,8 @@ const memoizeLocalParticipant = memoizeOne((identifier, displayName, isMuted, is
26632
26812
  capabilities,
26633
26813
  /* @conditional-compile-remove(media-access) */
26634
26814
  mediaAccess: {
26635
- isAudioPermitted: capabilities === null || capabilities === void 0 ? void 0 : capabilities.unmuteMic.isPresent,
26636
- isVideoPermitted: capabilities === null || capabilities === void 0 ? void 0 : capabilities.turnVideoOn.isPresent
26815
+ isAudioPermitted: (capabilities === null || capabilities === void 0 ? void 0 : capabilities.unmuteMic) ? capabilities.unmuteMic.isPresent : true,
26816
+ isVideoPermitted: (capabilities === null || capabilities === void 0 ? void 0 : capabilities.turnVideoOn) ? capabilities.turnVideoOn.isPresent : true
26637
26817
  }
26638
26818
  });
26639
26819
  });
@@ -26797,8 +26977,8 @@ capabilities) => {
26797
26977
  spotlight: memoizedSpotlight(spotlightCallFeature === null || spotlightCallFeature === void 0 ? void 0 : spotlightCallFeature.spotlightedParticipants, userId),
26798
26978
  /* @conditional-compile-remove(media-access) */
26799
26979
  mediaAccess: {
26800
- isAudioPermitted: capabilities ? capabilities.unmuteMic.isPresent : true,
26801
- isVideoPermitted: capabilities ? capabilities.turnVideoOn.isPresent : true
26980
+ isAudioPermitted: (capabilities === null || capabilities === void 0 ? void 0 : capabilities.unmuteMic) ? capabilities.unmuteMic.isPresent : true,
26981
+ isVideoPermitted: (capabilities === null || capabilities === void 0 ? void 0 : capabilities.turnVideoOn) ? capabilities.turnVideoOn.isPresent : true
26802
26982
  }
26803
26983
  });
26804
26984
  /* @conditional-compile-remove(total-participant-count) */
@@ -30980,7 +31160,7 @@ const AttachmentDownloadErrorBar = (props) => {
30980
31160
  /**
30981
31161
  * Wrapper for RichTextSendBox component to allow us to use usePropsFor with richTextSendBox with lazy loading
30982
31162
  */
30983
- const RichTextSendBoxWrapper = React.lazy(() => Promise.resolve().then(function () { return require('./RichTextSendBoxWrapper-DCfnYa5y.js'); }).then((module) => ({ default: module.RichTextSendBoxWrapper })));
31163
+ const RichTextSendBoxWrapper = React.lazy(() => Promise.resolve().then(function () { return require('./RichTextSendBoxWrapper-CPU8bZEb.js'); }).then((module) => ({ default: module.RichTextSendBoxWrapper })));
30984
31164
  /**
30985
31165
  * @private
30986
31166
  * Use this function to load RoosterJS dependencies early in the lifecycle.
@@ -30988,7 +31168,7 @@ const RichTextSendBoxWrapper = React.lazy(() => Promise.resolve().then(function
30988
31168
  *
30989
31169
  /* @conditional-compile-remove(rich-text-editor-composite-support)
30990
31170
  */
30991
- const loadRichTextSendBox = () => Promise.resolve().then(function () { return require('./RichTextSendBoxWrapper-DCfnYa5y.js'); }).then((module) => ({ default: module.RichTextSendBoxWrapper }));
31171
+ const loadRichTextSendBox = () => Promise.resolve().then(function () { return require('./RichTextSendBoxWrapper-CPU8bZEb.js'); }).then((module) => ({ default: module.RichTextSendBoxWrapper }));
30992
31172
  /**
30993
31173
  * @private
30994
31174
  */
@@ -31904,7 +32084,7 @@ const memoizeState = memoizeOne((userId, deviceManager, calls, latestErrors, lat
31904
32084
  callAgent: { displayName },
31905
32085
  calls,
31906
32086
  latestErrors,
31907
- /* @conditional-compile-remove(breakout-rooms) */
32087
+ /* @conditional-compile-remove(breakout-rooms) */ /* @conditional-compile-remove(media-access) */
31908
32088
  latestNotifications: latestNotifications !== null && latestNotifications !== void 0 ? latestNotifications : {},
31909
32089
  alternateCallerId,
31910
32090
  environmentInfo
@@ -32747,6 +32927,9 @@ const getAlternateCallerId = (state) => state.alternateCallerId;
32747
32927
  const getIsRoomsCall = (state) => state.isRoomsCall;
32748
32928
  /** @private */
32749
32929
  const getVideoBackgroundImages = (state) => state.videoBackgroundImages;
32930
+ /* @conditional-compile-remove(media-access) */
32931
+ /** @private */
32932
+ const getMediaAccessSetting = (state) => { var _a; return (_a = state.call) === null || _a === void 0 ? void 0 : _a.meetingMediaAccess; };
32750
32933
 
32751
32934
  // Copyright (c) Microsoft Corporation.
32752
32935
  // Licensed under the MIT License.
@@ -32771,6 +32954,7 @@ _component) => {
32771
32954
  return createCompositeHandlers(adapter, capabilities);
32772
32955
  };
32773
32956
  const createCompositeHandlers = memoizeOne((adapter, capabilities) => {
32957
+ var _a, _b, _c, _d, _e, _f, _g, _h;
32774
32958
  return {
32775
32959
  onCreateLocalStreamView: (options) => __awaiter$q(void 0, void 0, void 0, function* () {
32776
32960
  return yield adapter.createStreamView(undefined, options);
@@ -32782,8 +32966,8 @@ const createCompositeHandlers = memoizeOne((adapter, capabilities) => {
32782
32966
  yield adapter.leaveCall(forEveryone);
32783
32967
  }),
32784
32968
  onToggleHold: () => __awaiter$q(void 0, void 0, void 0, function* () {
32785
- var _a;
32786
- return ((_a = adapter.getState().call) === null || _a === void 0 ? void 0 : _a.state) === 'LocalHold' ? yield adapter.resumeCall() : yield adapter.holdCall();
32969
+ var _j;
32970
+ return ((_j = adapter.getState().call) === null || _j === void 0 ? void 0 : _j.state) === 'LocalHold' ? yield adapter.resumeCall() : yield adapter.holdCall();
32787
32971
  }),
32788
32972
  onAddParticipant: (participant, options) => __awaiter$q(void 0, void 0, void 0, function* () {
32789
32973
  if ('communicationUserId' in participant) {
@@ -32811,8 +32995,8 @@ const createCompositeHandlers = memoizeOne((adapter, capabilities) => {
32811
32995
  yield adapter.lowerHand();
32812
32996
  }),
32813
32997
  onToggleRaiseHand: () => __awaiter$q(void 0, void 0, void 0, function* () {
32814
- var _b;
32815
- ((_b = adapter.getState().call) === null || _b === void 0 ? void 0 : _b.raiseHand.localParticipantRaisedHand)
32998
+ var _k;
32999
+ ((_k = adapter.getState().call) === null || _k === void 0 ? void 0 : _k.raiseHand.localParticipantRaisedHand)
32816
33000
  ? yield adapter.lowerHand()
32817
33001
  : yield adapter.raiseHand();
32818
33002
  }),
@@ -32842,12 +33026,12 @@ const createCompositeHandlers = memoizeOne((adapter, capabilities) => {
32842
33026
  isCameraOn(adapter.getState()) ? yield adapter.stopCamera() : yield adapter.startCamera(options);
32843
33027
  }),
32844
33028
  onToggleMicrophone: () => __awaiter$q(void 0, void 0, void 0, function* () {
32845
- var _c;
32846
- return ((_c = adapter.getState().call) === null || _c === void 0 ? void 0 : _c.isMuted) ? yield adapter.unmute() : yield adapter.mute();
33029
+ var _l;
33030
+ return ((_l = adapter.getState().call) === null || _l === void 0 ? void 0 : _l.isMuted) ? yield adapter.unmute() : yield adapter.mute();
32847
33031
  }),
32848
33032
  onToggleScreenShare: () => __awaiter$q(void 0, void 0, void 0, function* () {
32849
- var _d;
32850
- return ((_d = adapter.getState().call) === null || _d === void 0 ? void 0 : _d.isScreenSharingOn)
33033
+ var _m;
33034
+ return ((_m = adapter.getState().call) === null || _m === void 0 ? void 0 : _m.isScreenSharingOn)
32851
33035
  ? yield adapter.stopScreenShare()
32852
33036
  : yield adapter.startScreenShare();
32853
33037
  }),
@@ -32940,6 +33124,54 @@ const createCompositeHandlers = memoizeOne((adapter, capabilities) => {
32940
33124
  onMuteAllRemoteParticipants: () => __awaiter$q(void 0, void 0, void 0, function* () {
32941
33125
  yield adapter.muteAllRemoteParticipants();
32942
33126
  }),
33127
+ /* @conditional-compile-remove(media-access) */
33128
+ onForbidAudio: ((_a = capabilities === null || capabilities === void 0 ? void 0 : capabilities.forbidOthersAudio) === null || _a === void 0 ? void 0 : _a.isPresent)
33129
+ ? (userIds) => __awaiter$q(void 0, void 0, void 0, function* () {
33130
+ yield adapter.forbidAudio(userIds);
33131
+ })
33132
+ : undefined,
33133
+ /* @conditional-compile-remove(media-access) */
33134
+ onPermitAudio: ((_b = capabilities === null || capabilities === void 0 ? void 0 : capabilities.forbidOthersAudio) === null || _b === void 0 ? void 0 : _b.isPresent)
33135
+ ? (userIds) => __awaiter$q(void 0, void 0, void 0, function* () {
33136
+ yield adapter.permitAudio(userIds);
33137
+ })
33138
+ : undefined,
33139
+ /* @conditional-compile-remove(media-access) */
33140
+ onForbidOthersAudio: ((_c = capabilities === null || capabilities === void 0 ? void 0 : capabilities.forbidOthersAudio) === null || _c === void 0 ? void 0 : _c.isPresent)
33141
+ ? () => __awaiter$q(void 0, void 0, void 0, function* () {
33142
+ yield adapter.forbidOthersAudio();
33143
+ })
33144
+ : undefined,
33145
+ /* @conditional-compile-remove(media-access) */
33146
+ onPermitOthersAudio: ((_d = capabilities === null || capabilities === void 0 ? void 0 : capabilities.forbidOthersAudio) === null || _d === void 0 ? void 0 : _d.isPresent)
33147
+ ? () => __awaiter$q(void 0, void 0, void 0, function* () {
33148
+ yield adapter.permitOthersAudio();
33149
+ })
33150
+ : undefined,
33151
+ /* @conditional-compile-remove(media-access) */
33152
+ onForbidVideo: ((_e = capabilities === null || capabilities === void 0 ? void 0 : capabilities.forbidOthersVideo) === null || _e === void 0 ? void 0 : _e.isPresent)
33153
+ ? (userIds) => __awaiter$q(void 0, void 0, void 0, function* () {
33154
+ yield adapter.forbidVideo(userIds);
33155
+ })
33156
+ : undefined,
33157
+ /* @conditional-compile-remove(media-access) */
33158
+ onPermitVideo: ((_f = capabilities === null || capabilities === void 0 ? void 0 : capabilities.forbidOthersVideo) === null || _f === void 0 ? void 0 : _f.isPresent)
33159
+ ? (userIds) => __awaiter$q(void 0, void 0, void 0, function* () {
33160
+ yield adapter.permitVideo(userIds);
33161
+ })
33162
+ : undefined,
33163
+ /* @conditional-compile-remove(media-access) */
33164
+ onForbidOthersVideo: ((_g = capabilities === null || capabilities === void 0 ? void 0 : capabilities.forbidOthersVideo) === null || _g === void 0 ? void 0 : _g.isPresent)
33165
+ ? () => __awaiter$q(void 0, void 0, void 0, function* () {
33166
+ yield adapter.forbidOthersVideo();
33167
+ })
33168
+ : undefined,
33169
+ /* @conditional-compile-remove(media-access) */
33170
+ onPermitOthersVideo: ((_h = capabilities === null || capabilities === void 0 ? void 0 : capabilities.forbidOthersVideo) === null || _h === void 0 ? void 0 : _h.isPresent)
33171
+ ? () => __awaiter$q(void 0, void 0, void 0, function* () {
33172
+ yield adapter.permitOthersVideo();
33173
+ })
33174
+ : undefined,
32943
33175
  /* @conditional-compile-remove(together-mode) */
32944
33176
  onCreateTogetherModeStreamView: (options) => __awaiter$q(void 0, void 0, void 0, function* () {
32945
33177
  return yield adapter.createTogetherModeStreamView(options);
@@ -36536,7 +36768,25 @@ const canRemoveParticipants = (role) => {
36536
36768
  const PEOPLE_SIDE_PANE_ID = 'people';
36537
36769
  /** @private */
36538
36770
  const usePeoplePane = (props) => {
36539
- const { updateSidePaneRenderer, inviteLink, onFetchAvatarPersonaData, onFetchParticipantMenuItems, setDrawerMenuItems, mobileView, peopleButtonRef, setParticipantActioned, spotlightedParticipantUserIds, onStartLocalSpotlight, onStopLocalSpotlight, onStartRemoteSpotlight, onStopRemoteSpotlight, onStopAllSpotlight, maxParticipantsToSpotlight, onMuteParticipant, pinnedParticipants, onPinParticipant, onUnpinParticipant, disablePinMenuItem, onMuteAllRemoteParticipants } = props;
36771
+ const { updateSidePaneRenderer, inviteLink, onFetchAvatarPersonaData, onFetchParticipantMenuItems, setDrawerMenuItems, mobileView, peopleButtonRef, setParticipantActioned, spotlightedParticipantUserIds, onStartLocalSpotlight, onStopLocalSpotlight, onStartRemoteSpotlight, onStopRemoteSpotlight, onStopAllSpotlight, maxParticipantsToSpotlight, onMuteParticipant, pinnedParticipants, onPinParticipant, onUnpinParticipant, disablePinMenuItem, onMuteAllRemoteParticipants,
36772
+ /* @conditional-compile-remove(media-access) */
36773
+ onForbidAudio,
36774
+ /* @conditional-compile-remove(media-access) */
36775
+ onPermitAudio,
36776
+ /* @conditional-compile-remove(media-access) */
36777
+ onForbidOthersAudio,
36778
+ /* @conditional-compile-remove(media-access) */
36779
+ onPermitOthersAudio,
36780
+ /* @conditional-compile-remove(media-access) */
36781
+ onForbidVideo,
36782
+ /* @conditional-compile-remove(media-access) */
36783
+ onPermitVideo,
36784
+ /* @conditional-compile-remove(media-access) */
36785
+ onForbidOthersVideo,
36786
+ /* @conditional-compile-remove(media-access) */
36787
+ onPermitOthersVideo,
36788
+ /* @conditional-compile-remove(media-access) */
36789
+ meetingMediaAccess } = props;
36540
36790
  const closePane = React.useCallback(() => {
36541
36791
  var _a;
36542
36792
  updateSidePaneRenderer(undefined);
@@ -36560,6 +36810,34 @@ const usePeoplePane = (props) => {
36560
36810
  onMuteAllRemoteParticipants && onMuteAllRemoteParticipants();
36561
36811
  setShowMuteAllPrompt(false);
36562
36812
  }, [onMuteAllRemoteParticipants, setShowMuteAllPrompt]);
36813
+ /* @conditional-compile-remove(media-access) */
36814
+ const [showForbidOthersAudioPrompt, setShowForbidOthersAudioPrompt] = React.useState(false);
36815
+ /* @conditional-compile-remove(media-access) */
36816
+ const [showPermitOthersAudioPrompt, setShowPermitOthersAudioPrompt] = React.useState(false);
36817
+ /* @conditional-compile-remove(media-access) */
36818
+ const [showForbidOthersVideoPrompt, setShowForbidOthersVideoPrompt] = React.useState(false);
36819
+ /* @conditional-compile-remove(media-access) */
36820
+ const [showPermitOthersVideoPrompt, setShowPermitOthersVideoPrompt] = React.useState(false);
36821
+ /* @conditional-compile-remove(media-access) */
36822
+ const onForbidAllAttendeesPromptConfirm = React.useCallback(() => {
36823
+ onForbidOthersAudio && onForbidOthersAudio();
36824
+ setShowForbidOthersAudioPrompt(false);
36825
+ }, [onForbidOthersAudio, setShowForbidOthersAudioPrompt]);
36826
+ /* @conditional-compile-remove(media-access) */
36827
+ const onPermitAllAttendeesPromptConfirm = React.useCallback(() => {
36828
+ onPermitOthersAudio && onPermitOthersAudio();
36829
+ setShowPermitOthersAudioPrompt(false);
36830
+ }, [onPermitOthersAudio, setShowPermitOthersAudioPrompt]);
36831
+ /* @conditional-compile-remove(media-access) */
36832
+ const onForbidOthersVideoPromptConfirm = React.useCallback(() => {
36833
+ onForbidOthersVideo && onForbidOthersVideo();
36834
+ setShowForbidOthersVideoPrompt(false);
36835
+ }, [onForbidOthersVideo, setShowForbidOthersVideoPrompt]);
36836
+ /* @conditional-compile-remove(media-access) */
36837
+ const onPermitOthersVideoPromptConfirm = React.useCallback(() => {
36838
+ onPermitOthersVideo && onPermitOthersVideo();
36839
+ setShowPermitOthersVideoPrompt(false);
36840
+ }, [onPermitOthersVideo, setShowPermitOthersVideoPrompt]);
36563
36841
  const sidePaneHeaderMenuProps = React.useMemo(() => {
36564
36842
  const menuItems = [];
36565
36843
  if (onMuteAllRemoteParticipants && remoteParticipants) {
@@ -36587,6 +36865,97 @@ const usePeoplePane = (props) => {
36587
36865
  disabled: isAllMuted
36588
36866
  });
36589
36867
  }
36868
+ /* @conditional-compile-remove(media-access) */
36869
+ let hasAttendee = false;
36870
+ /* @conditional-compile-remove(media-access) */
36871
+ if (remoteParticipants) {
36872
+ for (const participant of Object.values(remoteParticipants)) {
36873
+ if (participant.role && participant.role === 'Attendee') {
36874
+ hasAttendee = true;
36875
+ break;
36876
+ }
36877
+ }
36878
+ }
36879
+ /* @conditional-compile-remove(media-access) */
36880
+ const isMeetingAudioPermitted = meetingMediaAccess ? meetingMediaAccess.isAudioPermitted : true;
36881
+ /* @conditional-compile-remove(media-access) */
36882
+ const isMeetingVideoPermitted = meetingMediaAccess ? meetingMediaAccess.isVideoPermitted : true;
36883
+ /* @conditional-compile-remove(media-access) */
36884
+ if (onForbidOthersAudio && remoteParticipants) {
36885
+ hasAttendee &&
36886
+ isMeetingAudioPermitted &&
36887
+ menuItems.push({
36888
+ ['data-ui-id']: 'people-pane-forbid-all-attendees-audio',
36889
+ key: 'forbidOthersAudio',
36890
+ text: localeStrings.forbidOthersAudioMenuLabel,
36891
+ iconProps: {
36892
+ iconName: 'ControlButtonMicProhibited',
36893
+ styles: { root: { lineHeight: 0 } }
36894
+ },
36895
+ onClick: () => {
36896
+ setShowForbidOthersAudioPrompt(true);
36897
+ },
36898
+ ariaLabel: localeStrings.forbidOthersAudioMenuLabel,
36899
+ disabled: !hasAttendee
36900
+ });
36901
+ }
36902
+ /* @conditional-compile-remove(media-access) */
36903
+ if (onPermitOthersAudio && remoteParticipants) {
36904
+ hasAttendee &&
36905
+ !isMeetingAudioPermitted &&
36906
+ menuItems.push({
36907
+ ['data-ui-id']: 'people-pane-permit-all-attendees-audio',
36908
+ key: 'permitOthersAudio',
36909
+ text: localeStrings.permitOthersAudioMenuLabel,
36910
+ iconProps: {
36911
+ iconName: 'ControlButtonMicOn',
36912
+ styles: { root: { lineHeight: 0 } }
36913
+ },
36914
+ onClick: () => {
36915
+ setShowPermitOthersAudioPrompt(true);
36916
+ },
36917
+ ariaLabel: localeStrings.permitOthersAudioMenuLabel,
36918
+ disabled: !hasAttendee
36919
+ });
36920
+ }
36921
+ /* @conditional-compile-remove(media-access) */
36922
+ if (onForbidOthersVideo && remoteParticipants) {
36923
+ hasAttendee &&
36924
+ isMeetingVideoPermitted &&
36925
+ menuItems.push({
36926
+ ['data-ui-id']: 'people-pane-forbid-all-attendees-video',
36927
+ key: 'forbidOthersVideo',
36928
+ text: localeStrings.forbidOthersVideoMenuLabel,
36929
+ iconProps: {
36930
+ iconName: 'ControlButtonCameraProhibitedSmall',
36931
+ styles: { root: { lineHeight: 0 } }
36932
+ },
36933
+ onClick: () => {
36934
+ setShowForbidOthersVideoPrompt(true);
36935
+ },
36936
+ ariaLabel: localeStrings.forbidOthersVideoMenuLabel,
36937
+ disabled: !hasAttendee
36938
+ });
36939
+ }
36940
+ /* @conditional-compile-remove(media-access) */
36941
+ if (onPermitOthersVideo && remoteParticipants) {
36942
+ hasAttendee &&
36943
+ !isMeetingVideoPermitted &&
36944
+ menuItems.push({
36945
+ ['data-ui-id']: 'people-pane-permit-all-attendees-video',
36946
+ key: 'permitOthersVideo',
36947
+ text: localeStrings.permitOthersVideoMenuLabel,
36948
+ iconProps: {
36949
+ iconName: 'ControlButtonCameraOn',
36950
+ styles: { root: { lineHeight: 0 } }
36951
+ },
36952
+ onClick: () => {
36953
+ setShowPermitOthersVideoPrompt(true);
36954
+ },
36955
+ ariaLabel: localeStrings.permitOthersVideoMenuLabel,
36956
+ disabled: !hasAttendee
36957
+ });
36958
+ }
36590
36959
  if (onStopAllSpotlight && spotlightedParticipantUserIds && spotlightedParticipantUserIds.length > 0) {
36591
36960
  menuItems.push({
36592
36961
  key: 'stopAllSpotlightKey',
@@ -36602,16 +36971,30 @@ const usePeoplePane = (props) => {
36602
36971
  items: menuItems
36603
36972
  };
36604
36973
  }, [
36974
+ onMuteAllRemoteParticipants,
36975
+ remoteParticipants,
36976
+ /* @conditional-compile-remove(media-access) */
36977
+ meetingMediaAccess,
36978
+ /* @conditional-compile-remove(media-access) */
36979
+ onForbidOthersAudio,
36980
+ /* @conditional-compile-remove(media-access) */
36981
+ onPermitOthersAudio,
36982
+ /* @conditional-compile-remove(media-access) */
36983
+ onForbidOthersVideo,
36984
+ /* @conditional-compile-remove(media-access) */
36985
+ onPermitOthersVideo,
36605
36986
  onStopAllSpotlight,
36606
36987
  spotlightedParticipantUserIds,
36607
- localeStrings.stopAllSpotlightMenuLabel,
36608
36988
  localeStrings.muteAllMenuLabel,
36609
- onMuteAllRemoteParticipants,
36610
- setShowMuteAllPrompt,
36611
- remoteParticipants
36989
+ localeStrings.forbidOthersAudioMenuLabel,
36990
+ localeStrings.permitOthersAudioMenuLabel,
36991
+ localeStrings.forbidOthersVideoMenuLabel,
36992
+ localeStrings.permitOthersVideoMenuLabel,
36993
+ localeStrings.stopAllSpotlightMenuLabel
36612
36994
  ]);
36613
36995
  const onRenderHeader = React.useCallback(() => (React.createElement(SidePaneHeader, { onClose: closePane, headingText: localeStrings.peoplePaneTitle, dismissSidePaneButtonAriaLabel: localeStrings.dismissSidePaneButtonLabel, mobileView: mobileView !== null && mobileView !== void 0 ? mobileView : false })), [mobileView, closePane, localeStrings]);
36614
36996
  const onFetchParticipantMenuItemsForCallComposite = React.useCallback((participantId, myUserId, defaultMenuItems) => {
36997
+ var _a, _b;
36615
36998
  let isPinned = pinnedParticipants === null || pinnedParticipants === void 0 ? void 0 : pinnedParticipants.includes(participantId);
36616
36999
  const _defaultMenuItems = [];
36617
37000
  const isSpotlighted = spotlightedParticipantUserIds === null || spotlightedParticipantUserIds === void 0 ? void 0 : spotlightedParticipantUserIds.includes(participantId);
@@ -36635,6 +37018,78 @@ const usePeoplePane = (props) => {
36635
37018
  disabled: isMuted
36636
37019
  });
36637
37020
  }
37021
+ /* @conditional-compile-remove(media-access) */
37022
+ const remoteParticipant = remoteParticipants === null || remoteParticipants === void 0 ? void 0 : remoteParticipants[participantId];
37023
+ /* @conditional-compile-remove(media-access) */
37024
+ if ((remoteParticipant === null || remoteParticipant === void 0 ? void 0 : remoteParticipant.mediaAccess) &&
37025
+ !remoteParticipant.mediaAccess.isAudioPermitted &&
37026
+ (remoteParticipant === null || remoteParticipant === void 0 ? void 0 : remoteParticipant.role) === 'Attendee' &&
37027
+ onPermitAudio) {
37028
+ _defaultMenuItems.push({
37029
+ key: 'permit-audio',
37030
+ text: localeStrings.permitAudioMenuLabel,
37031
+ iconProps: {
37032
+ iconName: 'ControlButtonMicOn',
37033
+ styles: { root: { lineHeight: '1rem', textAlign: 'center' } }
37034
+ },
37035
+ onClick: () => {
37036
+ onPermitAudio([participantId]);
37037
+ },
37038
+ 'data-ui-id': 'participant-item-permit-microphone-button',
37039
+ ariaLabel: localeStrings.permitAudioMenuLabel
37040
+ });
37041
+ }
37042
+ /* @conditional-compile-remove(media-access) */
37043
+ if (((_a = remoteParticipant === null || remoteParticipant === void 0 ? void 0 : remoteParticipant.mediaAccess) === null || _a === void 0 ? void 0 : _a.isAudioPermitted) && (remoteParticipant === null || remoteParticipant === void 0 ? void 0 : remoteParticipant.role) === 'Attendee' && onForbidAudio) {
37044
+ _defaultMenuItems.push({
37045
+ key: 'forbid-audio',
37046
+ text: localeStrings.forbidAudioMenuLabel,
37047
+ iconProps: {
37048
+ iconName: 'ControlButtonMicProhibited',
37049
+ styles: { root: { lineHeight: '1rem', textAlign: 'center' } }
37050
+ },
37051
+ onClick: () => {
37052
+ onForbidAudio([participantId]);
37053
+ },
37054
+ 'data-ui-id': 'participant-item-forbid-microphone-button',
37055
+ ariaLabel: localeStrings.forbidAudioMenuLabel
37056
+ });
37057
+ }
37058
+ /* @conditional-compile-remove(media-access) */
37059
+ if ((remoteParticipant === null || remoteParticipant === void 0 ? void 0 : remoteParticipant.mediaAccess) &&
37060
+ !remoteParticipant.mediaAccess.isVideoPermitted &&
37061
+ (remoteParticipant === null || remoteParticipant === void 0 ? void 0 : remoteParticipant.role) === 'Attendee' &&
37062
+ onPermitVideo) {
37063
+ _defaultMenuItems.push({
37064
+ key: 'permit-video',
37065
+ text: localeStrings.permitVideoMenuLabel,
37066
+ iconProps: {
37067
+ iconName: 'ControlButtonCameraOn',
37068
+ styles: { root: { lineHeight: '1rem', textAlign: 'center' } }
37069
+ },
37070
+ onClick: () => {
37071
+ onPermitVideo([participantId]);
37072
+ },
37073
+ 'data-ui-id': 'participant-item-permit-camera-button',
37074
+ ariaLabel: localeStrings.permitVideoMenuLabel
37075
+ });
37076
+ }
37077
+ /* @conditional-compile-remove(media-access) */
37078
+ if (((_b = remoteParticipant === null || remoteParticipant === void 0 ? void 0 : remoteParticipant.mediaAccess) === null || _b === void 0 ? void 0 : _b.isVideoPermitted) && (remoteParticipant === null || remoteParticipant === void 0 ? void 0 : remoteParticipant.role) === 'Attendee' && onForbidVideo) {
37079
+ _defaultMenuItems.push({
37080
+ key: 'forbid-video',
37081
+ text: localeStrings.forbidVideoMenuLabel,
37082
+ iconProps: {
37083
+ iconName: 'ControlButtonCameraProhibitedSmall',
37084
+ styles: { root: { lineHeight: '1rem', textAlign: 'center' } }
37085
+ },
37086
+ onClick: () => {
37087
+ onForbidVideo([participantId]);
37088
+ },
37089
+ 'data-ui-id': 'participant-item-forbid-camera-button',
37090
+ ariaLabel: localeStrings.forbidVideoMenuLabel
37091
+ });
37092
+ }
36638
37093
  if (isSpotlighted) {
36639
37094
  const stopSpotlightMenuText = isMe
36640
37095
  ? localeStrings.stopSpotlightOnSelfMenuLabel
@@ -36732,51 +37187,90 @@ const usePeoplePane = (props) => {
36732
37187
  ? onFetchParticipantMenuItems(participantId, myUserId, _defaultMenuItems)
36733
37188
  : _defaultMenuItems;
36734
37189
  }, [
37190
+ pinnedParticipants,
36735
37191
  spotlightedParticipantUserIds,
36736
- onStartLocalSpotlight,
36737
- onStopLocalSpotlight,
36738
- onStartRemoteSpotlight,
36739
- onStopRemoteSpotlight,
36740
- onFetchParticipantMenuItems,
36741
37192
  onMuteParticipant,
36742
37193
  remoteParticipants,
36743
- localeStrings.stopSpotlightMenuLabel,
37194
+ onPermitAudio,
37195
+ onForbidAudio,
37196
+ onPermitVideo,
37197
+ onForbidVideo,
37198
+ onFetchParticipantMenuItems,
37199
+ localeStrings.permitAudioMenuLabel,
37200
+ localeStrings.forbidAudioMenuLabel,
37201
+ localeStrings.permitVideoMenuLabel,
37202
+ localeStrings.forbidVideoMenuLabel,
36744
37203
  localeStrings.stopSpotlightOnSelfMenuLabel,
37204
+ localeStrings.stopSpotlightMenuLabel,
36745
37205
  localeStrings.addSpotlightMenuLabel,
36746
37206
  localeStrings.startSpotlightMenuLabel,
36747
37207
  localeStrings.spotlightLimitReachedMenuTitle,
36748
- maxParticipantsToSpotlight,
36749
- pinnedParticipants,
36750
- onPinParticipant,
36751
- onUnpinParticipant,
36752
- disablePinMenuItem,
37208
+ localeStrings === null || localeStrings === void 0 ? void 0 : localeStrings.unpinParticipantMenuLabel,
36753
37209
  localeStrings.pinParticipantMenuLabel,
36754
- localeStrings.pinParticipantLimitReachedMenuLabel,
36755
- localeStrings.unpinParticipantMenuLabel,
36756
37210
  localeStrings.unpinParticipantMenuItemAriaLabel,
36757
- localeStrings.pinParticipantMenuItemAriaLabel
37211
+ localeStrings.pinParticipantLimitReachedMenuLabel,
37212
+ localeStrings.pinParticipantMenuItemAriaLabel,
37213
+ onStopLocalSpotlight,
37214
+ onStopRemoteSpotlight,
37215
+ maxParticipantsToSpotlight,
37216
+ onStartLocalSpotlight,
37217
+ onStartRemoteSpotlight,
37218
+ onUnpinParticipant,
37219
+ onPinParticipant,
37220
+ disablePinMenuItem
36758
37221
  ]);
36759
37222
  const role = useSelector$1(getRole);
36760
37223
  const alternateCallerId = useSelector$1(getAlternateCallerId);
36761
37224
  const onRenderContent = React.useCallback(() => {
36762
37225
  return (React.createElement(React.Fragment, null,
36763
37226
  React.createElement(Prompt, Object.assign({}, muteAllPromptLabels, { styles: { main: { minWidth: '22.5rem', padding: '1.5rem' } }, onConfirm: () => onMuteAllPromptConfirm(), isOpen: showMuteAllPrompt, onCancel: () => setShowMuteAllPrompt(false) })),
37227
+ /* @conditional-compile-remove(media-access) */
37228
+ React.createElement(Prompt, { heading: localeStrings.forbidOthersAudioDialogTitle, text: localeStrings.forbidOthersAudioDialogContent, confirmButtonLabel: localeStrings.forbidOthersAudioConfirmButtonLabel, cancelButtonLabel: localeStrings.forbidOthersAudioCancelButtonLabel, styles: { main: { minWidth: '22.5rem', padding: '1.5rem' } }, onConfirm: () => onForbidAllAttendeesPromptConfirm(), isOpen: showForbidOthersAudioPrompt, onCancel: () => setShowForbidOthersAudioPrompt(false) }),
37229
+ /* @conditional-compile-remove(media-access) */
37230
+ React.createElement(Prompt, { heading: localeStrings.permitOthersAudioDialogTitle, text: localeStrings.permitOthersAudioDialogContent, confirmButtonLabel: localeStrings.permitOthersAudioConfirmButtonLabel, cancelButtonLabel: localeStrings.permitOthersAudioCancelButtonLabel, styles: { main: { minWidth: '22.5rem', padding: '1.5rem' } }, onConfirm: () => onPermitAllAttendeesPromptConfirm(), isOpen: showPermitOthersAudioPrompt, onCancel: () => setShowForbidOthersAudioPrompt(false) }),
37231
+ /* @conditional-compile-remove(media-access) */
37232
+ React.createElement(Prompt, { heading: localeStrings.forbidOthersVideoDialogTitle, text: localeStrings.forbidOthersVideoDialogContent, confirmButtonLabel: localeStrings.forbidOthersVideoConfirmButtonLabel, cancelButtonLabel: localeStrings.forbidOthersVideoCancelButtonLabel, styles: { main: { minWidth: '22.5rem', padding: '1.5rem' } }, onConfirm: () => onForbidOthersVideoPromptConfirm(), isOpen: showForbidOthersVideoPrompt, onCancel: () => setShowForbidOthersVideoPrompt(false) }),
37233
+ /* @conditional-compile-remove(media-access) */
37234
+ React.createElement(Prompt, { heading: localeStrings.permitOthersVideoDialogTitle, text: localeStrings.permitOthersVideoDialogContent, confirmButtonLabel: localeStrings.permitOthersVideoConfirmButtonLabel, cancelButtonLabel: localeStrings.permitOthersVideoCancelButtonLabel, styles: { main: { minWidth: '22.5rem', padding: '1.5rem' } }, onConfirm: () => onPermitOthersVideoPromptConfirm(), isOpen: showPermitOthersVideoPrompt, onCancel: () => setShowForbidOthersVideoPrompt(false) }),
36764
37235
  React.createElement(PeoplePaneContent, { inviteLink: inviteLink, onFetchAvatarPersonaData: onFetchAvatarPersonaData, onFetchParticipantMenuItems: onFetchParticipantMenuItemsForCallComposite, setDrawerMenuItems: setDrawerMenuItems, mobileView: mobileView, setParticipantActioned: setParticipantActioned, participantListHeadingMoreButtonProps: sidePaneHeaderMenuProps, pinnedParticipants: pinnedParticipants, role: role, alternateCallerId: alternateCallerId })));
36765
37236
  }, [
37237
+ muteAllPromptLabels,
37238
+ showMuteAllPrompt,
37239
+ localeStrings.forbidOthersAudioDialogTitle,
37240
+ localeStrings.forbidOthersAudioDialogContent,
37241
+ localeStrings.forbidOthersAudioConfirmButtonLabel,
37242
+ localeStrings.forbidOthersAudioCancelButtonLabel,
37243
+ localeStrings.permitOthersAudioDialogTitle,
37244
+ localeStrings.permitOthersAudioDialogContent,
37245
+ localeStrings.permitOthersAudioConfirmButtonLabel,
37246
+ localeStrings.permitOthersAudioCancelButtonLabel,
37247
+ localeStrings.forbidOthersVideoDialogTitle,
37248
+ localeStrings.forbidOthersVideoDialogContent,
37249
+ localeStrings.forbidOthersVideoConfirmButtonLabel,
37250
+ localeStrings.forbidOthersVideoCancelButtonLabel,
37251
+ localeStrings.permitOthersVideoDialogTitle,
37252
+ localeStrings.permitOthersVideoDialogContent,
37253
+ localeStrings.permitOthersVideoConfirmButtonLabel,
37254
+ localeStrings.permitOthersVideoCancelButtonLabel,
37255
+ showForbidOthersAudioPrompt,
37256
+ showPermitOthersAudioPrompt,
37257
+ showForbidOthersVideoPrompt,
37258
+ showPermitOthersVideoPrompt,
36766
37259
  inviteLink,
36767
- mobileView,
36768
37260
  onFetchAvatarPersonaData,
36769
37261
  onFetchParticipantMenuItemsForCallComposite,
36770
37262
  setDrawerMenuItems,
37263
+ mobileView,
36771
37264
  setParticipantActioned,
36772
37265
  sidePaneHeaderMenuProps,
36773
37266
  pinnedParticipants,
36774
37267
  role,
36775
37268
  alternateCallerId,
36776
- showMuteAllPrompt,
36777
- setShowMuteAllPrompt,
36778
- muteAllPromptLabels,
36779
- onMuteAllPromptConfirm
37269
+ onMuteAllPromptConfirm,
37270
+ onForbidAllAttendeesPromptConfirm,
37271
+ onPermitAllAttendeesPromptConfirm,
37272
+ onForbidOthersVideoPromptConfirm,
37273
+ onPermitOthersVideoPromptConfirm
36780
37274
  ]);
36781
37275
  const sidePaneRenderer = React.useMemo(() => ({
36782
37276
  headerRenderer: onRenderHeader,
@@ -37470,22 +37964,14 @@ const CapabilitiesChangedNotificationBar = (props) => {
37470
37964
  })));
37471
37965
  };
37472
37966
  const getCapabilityChangedNotificationString = (notification, strings) => {
37473
- var _a, _b, _c, _d, _e, _f, _g, _h;
37967
+ var _e, _f, _g, _h;
37474
37968
  switch (notification.capabilityName) {
37475
37969
  case 'turnVideoOn':
37476
- if (notification.changedReason === 'MeetingOptionOrOrganizerPolicyChanged') {
37477
- return notification.isPresent
37478
- ? (_a = strings === null || strings === void 0 ? void 0 : strings.turnVideoOn) === null || _a === void 0 ? void 0 : _a.grantedDueToMeetingOption
37479
- : (_b = strings === null || strings === void 0 ? void 0 : strings.turnVideoOn) === null || _b === void 0 ? void 0 : _b.lostDueToMeetingOption;
37480
- }
37481
- break;
37970
+ /* @conditional-compile-remove(media-access) */
37971
+ return undefined;
37482
37972
  case 'unmuteMic':
37483
- if (notification.changedReason === 'MeetingOptionOrOrganizerPolicyChanged') {
37484
- return notification.isPresent
37485
- ? (_c = strings === null || strings === void 0 ? void 0 : strings.unmuteMic) === null || _c === void 0 ? void 0 : _c.grantedDueToMeetingOption
37486
- : (_d = strings === null || strings === void 0 ? void 0 : strings.unmuteMic) === null || _d === void 0 ? void 0 : _d.lostDueToMeetingOption;
37487
- }
37488
- break;
37973
+ /* @conditional-compile-remove(media-access) */
37974
+ return undefined;
37489
37975
  case 'shareScreen':
37490
37976
  if (notification.isPresent && notification.changedReason === 'RoleChanged' && notification.role === 'Presenter') {
37491
37977
  return (_e = strings === null || strings === void 0 ? void 0 : strings.shareScreen) === null || _e === void 0 ? void 0 : _e.grantedDueToRoleChangeToPresenter;
@@ -37814,7 +38300,7 @@ const MAX_PINNED_REMOTE_VIDEO_TILES = 4;
37814
38300
  * @private
37815
38301
  */
37816
38302
  const CallArrangement = (props) => {
37817
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
38303
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
37818
38304
  const containerClassName = React.useMemo(() => {
37819
38305
  return props.mobileView ? containerStyleMobile : containerStyleDesktop;
37820
38306
  }, [props.mobileView]);
@@ -37872,7 +38358,15 @@ const CallArrangement = (props) => {
37872
38358
  const videoGalleryProps = usePropsFor$1(VideoGallery);
37873
38359
  const muteAllHandlers = useHandlers();
37874
38360
  const { setPromptProps, setIsPromptOpen, hideSpotlightButtons } = props;
37875
- const { onStartLocalSpotlight, onStopLocalSpotlight, onStartRemoteSpotlight, onStopRemoteSpotlight, onMuteParticipant, spotlightedParticipants, maxParticipantsToSpotlight, localParticipant } = videoGalleryProps;
38361
+ const { onStartLocalSpotlight, onStopLocalSpotlight, onStartRemoteSpotlight, onStopRemoteSpotlight, onMuteParticipant, spotlightedParticipants, maxParticipantsToSpotlight, localParticipant,
38362
+ /* @conditional-compile-remove(media-access) */
38363
+ onForbidAudio,
38364
+ /* @conditional-compile-remove(media-access) */
38365
+ onPermitAudio,
38366
+ /* @conditional-compile-remove(media-access) */
38367
+ onForbidVideo,
38368
+ /* @conditional-compile-remove(media-access) */
38369
+ onPermitVideo } = videoGalleryProps;
37876
38370
  const [showTeamsMeetingConferenceModal, setShowTeamsMeetingConferenceModal] = React.useState(false);
37877
38371
  const toggleTeamsMeetingConferenceModal = React.useCallback(() => {
37878
38372
  setShowTeamsMeetingConferenceModal(!showTeamsMeetingConferenceModal);
@@ -37946,7 +38440,39 @@ const CallArrangement = (props) => {
37946
38440
  stopAllSpotlightWithPrompt,
37947
38441
  spotlightedParticipants
37948
38442
  ]);
37949
- const { isPeoplePaneOpen, openPeoplePane, closePeoplePane } = usePeoplePane(Object.assign(Object.assign(Object.assign(Object.assign({}, peoplePaneProps), spotlightPeoplePaneProps), onMuteParticipantPeoplePaneProps), pinPeoplePaneProps));
38443
+ /* @conditional-compile-remove(media-access) */
38444
+ const meetingMediaAccess = useSelector$1(getMediaAccessSetting);
38445
+ /* @conditional-compile-remove(media-access) */
38446
+ const canForbidOthersAudio = !!((_b = capabilities === null || capabilities === void 0 ? void 0 : capabilities.forbidOthersAudio) === null || _b === void 0 ? void 0 : _b.isPresent);
38447
+ /* @conditional-compile-remove(media-access) */
38448
+ const canForbidOthersVideo = !!((_c = capabilities === null || capabilities === void 0 ? void 0 : capabilities.forbidOthersVideo) === null || _c === void 0 ? void 0 : _c.isPresent);
38449
+ /* @conditional-compile-remove(media-access) */
38450
+ const onToggleParticipantMicPeoplePaneProps = React.useMemo(() => {
38451
+ return {
38452
+ onForbidAudio: canForbidOthersAudio ? onForbidAudio : undefined,
38453
+ onPermitAudio: canForbidOthersAudio ? onPermitAudio : undefined,
38454
+ onForbidOthersAudio: canForbidOthersAudio ? muteAllHandlers.onForbidOthersAudio : undefined,
38455
+ onPermitOthersAudio: canForbidOthersAudio ? muteAllHandlers.onPermitOthersAudio : undefined,
38456
+ onForbidVideo: canForbidOthersVideo ? onForbidVideo : undefined,
38457
+ onPermitVideo: canForbidOthersVideo ? onPermitVideo : undefined,
38458
+ onForbidOthersVideo: canForbidOthersVideo ? muteAllHandlers.onForbidOthersVideo : undefined,
38459
+ onPermitOthersVideo: canForbidOthersVideo ? muteAllHandlers.onPermitOthersVideo : undefined,
38460
+ meetingMediaAccess
38461
+ };
38462
+ }, [
38463
+ canForbidOthersAudio,
38464
+ onForbidAudio,
38465
+ onPermitAudio,
38466
+ muteAllHandlers.onForbidOthersAudio,
38467
+ muteAllHandlers.onPermitOthersAudio,
38468
+ muteAllHandlers.onForbidOthersVideo,
38469
+ muteAllHandlers.onPermitOthersVideo,
38470
+ canForbidOthersVideo,
38471
+ onForbidVideo,
38472
+ onPermitVideo,
38473
+ meetingMediaAccess
38474
+ ]);
38475
+ const { isPeoplePaneOpen, openPeoplePane, closePeoplePane } = usePeoplePane(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, peoplePaneProps), spotlightPeoplePaneProps), onMuteParticipantPeoplePaneProps), pinPeoplePaneProps), onToggleParticipantMicPeoplePaneProps));
37950
38476
  const togglePeoplePane = React.useCallback(() => {
37951
38477
  if (isPeoplePaneOpen) {
37952
38478
  closePeoplePane();
@@ -38022,7 +38548,7 @@ const CallArrangement = (props) => {
38022
38548
  const galleryContainerStyles = React.useMemo(() => {
38023
38549
  var _a;
38024
38550
  return Object.assign(Object.assign({}, mediaGalleryContainerStyles$1), (((_a = props === null || props === void 0 ? void 0 : props.captionsOptions) === null || _a === void 0 ? void 0 : _a.height) === 'full' ? { root: { postion: 'absolute' } } : {}));
38025
- }, [(_b = props === null || props === void 0 ? void 0 : props.captionsOptions) === null || _b === void 0 ? void 0 : _b.height]);
38551
+ }, [(_d = props === null || props === void 0 ? void 0 : props.captionsOptions) === null || _d === void 0 ? void 0 : _d.height]);
38026
38552
  if (isTeamsMeeting) {
38027
38553
  filteredLatestErrorNotifications
38028
38554
  .filter((notification) => notification.type === 'teamsMeetingCallNetworkQualityLow')
@@ -38035,8 +38561,8 @@ const CallArrangement = (props) => {
38035
38561
  const verticalControlBar = props.mobileView && containerWidth && containerHeight && containerWidth / containerHeight > 1 ? true : false;
38036
38562
  // Filter out shareScreen capability notifications if on mobile
38037
38563
  const filteredCapabilitesChangedNotifications = props.mobileView
38038
- ? (_c = props.capabilitiesChangedNotificationBarProps) === null || _c === void 0 ? void 0 : _c.capabilitiesChangedNotifications.filter((notification) => notification.capabilityName !== 'shareScreen')
38039
- : (_d = props.capabilitiesChangedNotificationBarProps) === null || _d === void 0 ? void 0 : _d.capabilitiesChangedNotifications;
38564
+ ? (_e = props.capabilitiesChangedNotificationBarProps) === null || _e === void 0 ? void 0 : _e.capabilitiesChangedNotifications.filter((notification) => notification.capabilityName !== 'shareScreen')
38565
+ : (_f = props.capabilitiesChangedNotificationBarProps) === null || _f === void 0 ? void 0 : _f.capabilitiesChangedNotifications;
38040
38566
  /* @conditional-compile-remove(breakout-rooms) */
38041
38567
  const notificationStackStrings = useCompositeStringsForNotificationStackStrings(locale);
38042
38568
  let latestNotifications = props.latestNotifications;
@@ -38050,11 +38576,11 @@ const CallArrangement = (props) => {
38050
38576
  return (React.createElement("div", { ref: containerRef, className: react.mergeStyles(containerDivStyles), id: props.id },
38051
38577
  React.createElement(react.Stack, { verticalFill: true, horizontalAlign: "stretch", className: containerClassName, "data-ui-id": props.dataUiId },
38052
38578
  React.createElement(react.Stack, { reversed: true, horizontal: verticalControlBar, grow: true, styles: callArrangementContainerStyles(verticalControlBar) },
38053
- ((_e = props.callControlProps) === null || _e === void 0 ? void 0 : _e.options) !== false && !isMobileWithActivePane && (React.createElement(react.Stack, { verticalAlign: 'center', className: react.mergeStyles({
38579
+ ((_g = props.callControlProps) === null || _g === void 0 ? void 0 : _g.options) !== false && !isMobileWithActivePane && (React.createElement(react.Stack, { verticalAlign: 'center', className: react.mergeStyles({
38054
38580
  zIndex: CONTROL_BAR_Z_INDEX,
38055
38581
  padding: verticalControlBar ? '0.25rem' : 'unset'
38056
- }) }, isLegacyCallControlEnabled((_f = props.callControlProps) === null || _f === void 0 ? void 0 : _f.options) ? (React.createElement(CallControls, Object.assign({}, props.callControlProps, { containerWidth: containerWidth, containerHeight: containerHeight, isMobile: props.mobileView, peopleButtonChecked: isPeoplePaneOpen, onPeopleButtonClicked: togglePeoplePane, displayVertical: verticalControlBar }))) : (React.createElement(CommonCallControlBar, Object.assign({}, props.callControlProps, { ref: controlBarRef, callControls: props.callControlProps.options, callAdapter: adapter, mobileView: props.mobileView, disableButtonsForLobbyPage: isInLobby, disableButtonsForHoldScreen: isInLocalHold, peopleButtonChecked: isPeoplePaneOpen, onPeopleButtonClicked: togglePeoplePane, onMoreButtonClicked: onMoreButtonClicked, isCaptionsSupported: (useTeamsCaptions && hasJoinedCall) || hasJoinedCall, useTeamsCaptions: useTeamsCaptions, isCaptionsOn: isCaptionsOn, onClickVideoEffects: onResolveVideoEffectDependency ? openVideoEffectsPane : undefined, displayVertical: verticalControlBar, onUserSetOverflowGalleryPositionChange: props.onUserSetOverflowGalleryPositionChange, onUserSetGalleryLayout: props.onUserSetGalleryLayoutChange, userSetGalleryLayout: props.userSetGalleryLayout, onSetDialpadPage: props.onSetDialpadPage, dtmfDialerPresent: props.dtmfDialerPresent, peopleButtonRef: peopleButtonRef, cameraButtonRef: cameraButtonRef, onStopLocalSpotlight: !hideSpotlightButtons && localParticipant.spotlight ? onStopLocalSpotlightWithPrompt : undefined, onToggleTeamsMeetingConferenceModal: toggleTeamsMeetingConferenceModal, teamsMeetingConferenceModalPresent: showTeamsMeetingConferenceModal }))))),
38057
- ((_g = props.callControlProps) === null || _g === void 0 ? void 0 : _g.options) !== false && showDrawer && (React.createElement(react.Stack, { styles: drawerContainerStylesValue },
38582
+ }) }, isLegacyCallControlEnabled((_h = props.callControlProps) === null || _h === void 0 ? void 0 : _h.options) ? (React.createElement(CallControls, Object.assign({}, props.callControlProps, { containerWidth: containerWidth, containerHeight: containerHeight, isMobile: props.mobileView, peopleButtonChecked: isPeoplePaneOpen, onPeopleButtonClicked: togglePeoplePane, displayVertical: verticalControlBar }))) : (React.createElement(CommonCallControlBar, Object.assign({}, props.callControlProps, { ref: controlBarRef, callControls: props.callControlProps.options, callAdapter: adapter, mobileView: props.mobileView, disableButtonsForLobbyPage: isInLobby, disableButtonsForHoldScreen: isInLocalHold, peopleButtonChecked: isPeoplePaneOpen, onPeopleButtonClicked: togglePeoplePane, onMoreButtonClicked: onMoreButtonClicked, isCaptionsSupported: (useTeamsCaptions && hasJoinedCall) || hasJoinedCall, useTeamsCaptions: useTeamsCaptions, isCaptionsOn: isCaptionsOn, onClickVideoEffects: onResolveVideoEffectDependency ? openVideoEffectsPane : undefined, displayVertical: verticalControlBar, onUserSetOverflowGalleryPositionChange: props.onUserSetOverflowGalleryPositionChange, onUserSetGalleryLayout: props.onUserSetGalleryLayoutChange, userSetGalleryLayout: props.userSetGalleryLayout, onSetDialpadPage: props.onSetDialpadPage, dtmfDialerPresent: props.dtmfDialerPresent, peopleButtonRef: peopleButtonRef, cameraButtonRef: cameraButtonRef, onStopLocalSpotlight: !hideSpotlightButtons && localParticipant.spotlight ? onStopLocalSpotlightWithPrompt : undefined, onToggleTeamsMeetingConferenceModal: toggleTeamsMeetingConferenceModal, teamsMeetingConferenceModalPresent: showTeamsMeetingConferenceModal }))))),
38583
+ ((_j = props.callControlProps) === null || _j === void 0 ? void 0 : _j.options) !== false && showDrawer && (React.createElement(react.Stack, { styles: drawerContainerStylesValue },
38058
38584
  React.createElement(PreparedMoreDrawer, { callControls: props.callControlProps.options, onLightDismiss: closeDrawer, onPeopleButtonClicked: onMoreDrawerPeopleClicked, disableButtonsForHoldScreen: isInLocalHold, isCaptionsSupported: (useTeamsCaptions && hasJoinedCall) || hasJoinedCall, useTeamsCaptions: useTeamsCaptions, onUserSetGalleryLayout: props.onUserSetGalleryLayoutChange, userSetGalleryLayout: props.userSetGalleryLayout, onSetDialpadPage: props.onSetDialpadPage, dtmfDialerPresent: props.dtmfDialerPresent, dtmfDialerOptions: props.dtmfDialerOptions, reactionResources: reactionResources, onClickMeetingPhoneInfo: onMeetingPhoneInfoClicked }))),
38059
38585
  React.createElement(react.Stack, { horizontal: true, grow: true },
38060
38586
  React.createElement(react.Stack.Item, { style: callCompositeContainerCSS },
@@ -38077,7 +38603,7 @@ const CallArrangement = (props) => {
38077
38603
  React.createElement(SidePane, { mobileView: props.mobileView, maxWidth: isVideoPaneOpen ? `${VIDEO_EFFECTS_SIDE_PANE_WIDTH_REM}rem` : undefined, minWidth: isVideoPaneOpen ? `${VIDEO_EFFECTS_SIDE_PANE_WIDTH_REM}rem` : undefined, updateSidePaneRenderer: props.updateSidePaneRenderer, onPeopleButtonClicked: props.mobileView && !shouldShowPeopleTabHeaderButton(props.callControlProps.options)
38078
38604
  ? undefined
38079
38605
  : togglePeoplePane, disablePeopleButton: typeof props.callControlProps.options !== 'boolean' &&
38080
- isDisabled$4((_h = props.callControlProps.options) === null || _h === void 0 ? void 0 : _h.participantsButton), onChatButtonClicked: (_j = props.mobileChatTabHeader) === null || _j === void 0 ? void 0 : _j.onClick, disableChatButton: (_k = props.mobileChatTabHeader) === null || _k === void 0 ? void 0 : _k.disabled, showAddPeopleButton: !!props.callControlProps.callInvitationURL, ariaLabel: isVideoEffectsPaneOpen ? locale.strings.call.videoEffectsPaneAriaLabel : undefined }),
38606
+ isDisabled$4((_k = props.callControlProps.options) === null || _k === void 0 ? void 0 : _k.participantsButton), onChatButtonClicked: (_l = props.mobileChatTabHeader) === null || _l === void 0 ? void 0 : _l.onClick, disableChatButton: (_m = props.mobileChatTabHeader) === null || _m === void 0 ? void 0 : _m.disabled, showAddPeopleButton: !!props.callControlProps.callInvitationURL, ariaLabel: isVideoEffectsPaneOpen ? locale.strings.call.videoEffectsPaneAriaLabel : undefined }),
38081
38607
  props.mobileView && (React.createElement(ModalLocalAndRemotePIP, { modalLayerHostId: props.modalLayerHostId, hidden: !isSidePaneOpen, styles: pipStyles, strings: modalStrings, minDragPosition: minMaxDragPosition.minDragPosition, maxDragPosition: minMaxDragPosition.maxDragPosition, onDismissSidePane: () => {
38082
38608
  closePeoplePane();
38083
38609
  if (props.onCloseChatPane) {
@@ -41774,6 +42300,14 @@ class AzureCommunicationCallAdapter {
41774
42300
  this.stopAllSpotlight.bind(this);
41775
42301
  this.muteParticipant.bind(this);
41776
42302
  this.muteAllRemoteParticipants.bind(this);
42303
+ /* @conditional-compile-remove(media-access) */
42304
+ this.forbidOthersAudio.bind(this);
42305
+ /* @conditional-compile-remove(media-access) */
42306
+ this.permitOthersAudio.bind(this);
42307
+ /* @conditional-compile-remove(media-access) */
42308
+ this.forbidOthersAudio.bind(this);
42309
+ /* @conditional-compile-remove(media-access) */
42310
+ this.permitOthersAudio.bind(this);
41777
42311
  }
41778
42312
  dispose() {
41779
42313
  this.resetDiagnosticsForwarder();
@@ -42303,6 +42837,62 @@ class AzureCommunicationCallAdapter {
42303
42837
  this.handlers.onStopAllSpotlight();
42304
42838
  });
42305
42839
  }
42840
+ /* @conditional-compile-remove(media-access) */
42841
+ forbidAudio(userIds) {
42842
+ return __awaiter$7(this, void 0, void 0, function* () {
42843
+ var _a, _b;
42844
+ (_b = (_a = this.handlers).onForbidAudio) === null || _b === void 0 ? void 0 : _b.call(_a, userIds);
42845
+ });
42846
+ }
42847
+ /* @conditional-compile-remove(media-access) */
42848
+ permitAudio(userIds) {
42849
+ return __awaiter$7(this, void 0, void 0, function* () {
42850
+ var _a, _b;
42851
+ (_b = (_a = this.handlers).onPermitAudio) === null || _b === void 0 ? void 0 : _b.call(_a, userIds);
42852
+ });
42853
+ }
42854
+ /* @conditional-compile-remove(media-access) */
42855
+ forbidOthersAudio() {
42856
+ return __awaiter$7(this, void 0, void 0, function* () {
42857
+ var _a, _b;
42858
+ (_b = (_a = this.handlers).onForbidOthersAudio) === null || _b === void 0 ? void 0 : _b.call(_a);
42859
+ });
42860
+ }
42861
+ /* @conditional-compile-remove(media-access) */
42862
+ permitOthersAudio() {
42863
+ return __awaiter$7(this, void 0, void 0, function* () {
42864
+ var _a, _b;
42865
+ (_b = (_a = this.handlers).onPermitOthersAudio) === null || _b === void 0 ? void 0 : _b.call(_a);
42866
+ });
42867
+ }
42868
+ /* @conditional-compile-remove(media-access) */
42869
+ forbidVideo(userIds) {
42870
+ return __awaiter$7(this, void 0, void 0, function* () {
42871
+ var _a, _b;
42872
+ (_b = (_a = this.handlers).onForbidVideo) === null || _b === void 0 ? void 0 : _b.call(_a, userIds);
42873
+ });
42874
+ }
42875
+ /* @conditional-compile-remove(media-access) */
42876
+ permitVideo(userIds) {
42877
+ return __awaiter$7(this, void 0, void 0, function* () {
42878
+ var _a, _b;
42879
+ (_b = (_a = this.handlers).onPermitVideo) === null || _b === void 0 ? void 0 : _b.call(_a, userIds);
42880
+ });
42881
+ }
42882
+ /* @conditional-compile-remove(media-access) */
42883
+ forbidOthersVideo() {
42884
+ return __awaiter$7(this, void 0, void 0, function* () {
42885
+ var _a, _b;
42886
+ (_b = (_a = this.handlers).onForbidOthersVideo) === null || _b === void 0 ? void 0 : _b.call(_a);
42887
+ });
42888
+ }
42889
+ /* @conditional-compile-remove(media-access) */
42890
+ permitOthersVideo() {
42891
+ return __awaiter$7(this, void 0, void 0, function* () {
42892
+ var _a, _b;
42893
+ (_b = (_a = this.handlers).onPermitOthersVideo) === null || _b === void 0 ? void 0 : _b.call(_a);
42894
+ });
42895
+ }
42306
42896
  /* @conditional-compile-remove(breakout-rooms) */
42307
42897
  returnFromBreakoutRoom() {
42308
42898
  return __awaiter$7(this, void 0, void 0, function* () {
@@ -42475,20 +43065,18 @@ class AzureCommunicationCallAdapter {
42475
43065
  transferAccepted(args) {
42476
43066
  this.emitter.emit('transferAccepted', args);
42477
43067
  }
43068
+ capabilitiesChangedunmuteMicTrampoline(data) {
43069
+ /* @conditional-compile-remove(media-access) */
43070
+ return;
43071
+ }
42478
43072
  capabilitiesChanged(data) {
42479
- var _a, _b, _c, _d, _e;
43073
+ var _a, _b;
42480
43074
  if (((_a = data.newValue.turnVideoOn) === null || _a === void 0 ? void 0 : _a.isPresent) === false) {
42481
- // Only stop camera when the call state is not on hold. The Calling SDK does not allow us to stop camera when
42482
- // the call state is on hold.
42483
- if (((_b = this.call) === null || _b === void 0 ? void 0 : _b.state) !== 'LocalHold' && ((_c = this.call) === null || _c === void 0 ? void 0 : _c.state) !== 'RemoteHold') {
42484
- this.stopCamera();
42485
- }
43075
+ // stopCamera is handled by web sdk when video hard muted.
42486
43076
  this.disposeLocalVideoStreamView();
42487
43077
  }
42488
- if (((_d = data.newValue.unmuteMic) === null || _d === void 0 ? void 0 : _d.isPresent) === false) {
42489
- this.mute();
42490
- }
42491
- if (((_e = data.newValue.shareScreen) === null || _e === void 0 ? void 0 : _e.isPresent) === false) {
43078
+ this.capabilitiesChangedunmuteMicTrampoline(data);
43079
+ if (((_b = data.newValue.shareScreen) === null || _b === void 0 ? void 0 : _b.isPresent) === false) {
42492
43080
  this.stopScreenShare();
42493
43081
  }
42494
43082
  this.emitter.emit('capabilitiesChanged', data);
@@ -43194,6 +43782,54 @@ class CallWithChatBackedCallAdapter {
43194
43782
  return this.callWithChatAdapter.returnFromBreakoutRoom();
43195
43783
  });
43196
43784
  }
43785
+ /* @conditional-compile-remove(media-access) */
43786
+ forbidAudio(userIds) {
43787
+ return __awaiter$6(this, void 0, void 0, function* () {
43788
+ return this.callWithChatAdapter.forbidAudio(userIds);
43789
+ });
43790
+ }
43791
+ /* @conditional-compile-remove(media-access) */
43792
+ permitAudio(userIds) {
43793
+ return __awaiter$6(this, void 0, void 0, function* () {
43794
+ return this.callWithChatAdapter.permitAudio(userIds);
43795
+ });
43796
+ }
43797
+ /* @conditional-compile-remove(media-access) */
43798
+ forbidOthersAudio() {
43799
+ return __awaiter$6(this, void 0, void 0, function* () {
43800
+ return this.callWithChatAdapter.forbidOthersAudio();
43801
+ });
43802
+ }
43803
+ /* @conditional-compile-remove(media-access) */
43804
+ permitOthersAudio() {
43805
+ return __awaiter$6(this, void 0, void 0, function* () {
43806
+ return this.callWithChatAdapter.permitOthersAudio();
43807
+ });
43808
+ }
43809
+ /* @conditional-compile-remove(media-access) */
43810
+ forbidVideo(userIds) {
43811
+ return __awaiter$6(this, void 0, void 0, function* () {
43812
+ return this.callWithChatAdapter.forbidAudio(userIds);
43813
+ });
43814
+ }
43815
+ /* @conditional-compile-remove(media-access) */
43816
+ permitVideo(userIds) {
43817
+ return __awaiter$6(this, void 0, void 0, function* () {
43818
+ return this.callWithChatAdapter.permitAudio(userIds);
43819
+ });
43820
+ }
43821
+ /* @conditional-compile-remove(media-access) */
43822
+ forbidOthersVideo() {
43823
+ return __awaiter$6(this, void 0, void 0, function* () {
43824
+ return this.callWithChatAdapter.forbidOthersAudio();
43825
+ });
43826
+ }
43827
+ /* @conditional-compile-remove(media-access) */
43828
+ permitOthersVideo() {
43829
+ return __awaiter$6(this, void 0, void 0, function* () {
43830
+ return this.callWithChatAdapter.permitOthersAudio();
43831
+ });
43832
+ }
43197
43833
  }
43198
43834
  function callAdapterStateFromCallWithChatAdapterState(callWithChatAdapterState) {
43199
43835
  return {
@@ -44476,6 +45112,54 @@ class AzureCommunicationCallWithChatAdapter {
44476
45112
  }
44477
45113
  });
44478
45114
  }
45115
+ /* @conditional-compile-remove(media-access) */
45116
+ forbidAudio(userIds) {
45117
+ return __awaiter$4(this, void 0, void 0, function* () {
45118
+ return this.callAdapter.forbidAudio(userIds);
45119
+ });
45120
+ }
45121
+ /* @conditional-compile-remove(media-access) */
45122
+ permitAudio(userIds) {
45123
+ return __awaiter$4(this, void 0, void 0, function* () {
45124
+ return this.callAdapter.permitAudio(userIds);
45125
+ });
45126
+ }
45127
+ /* @conditional-compile-remove(media-access) */
45128
+ forbidOthersAudio() {
45129
+ return __awaiter$4(this, void 0, void 0, function* () {
45130
+ return this.callAdapter.forbidOthersAudio();
45131
+ });
45132
+ }
45133
+ /* @conditional-compile-remove(media-access) */
45134
+ permitOthersAudio() {
45135
+ return __awaiter$4(this, void 0, void 0, function* () {
45136
+ return this.callAdapter.permitOthersAudio();
45137
+ });
45138
+ }
45139
+ /* @conditional-compile-remove(media-access) */
45140
+ forbidVideo(userIds) {
45141
+ return __awaiter$4(this, void 0, void 0, function* () {
45142
+ return this.callAdapter.forbidVideo(userIds);
45143
+ });
45144
+ }
45145
+ /* @conditional-compile-remove(media-access) */
45146
+ permitVideo(userIds) {
45147
+ return __awaiter$4(this, void 0, void 0, function* () {
45148
+ return this.callAdapter.permitVideo(userIds);
45149
+ });
45150
+ }
45151
+ /* @conditional-compile-remove(media-access) */
45152
+ forbidOthersVideo() {
45153
+ return __awaiter$4(this, void 0, void 0, function* () {
45154
+ return this.callAdapter.forbidOthersVideo();
45155
+ });
45156
+ }
45157
+ /* @conditional-compile-remove(media-access) */
45158
+ permitOthersVideo() {
45159
+ return __awaiter$4(this, void 0, void 0, function* () {
45160
+ return this.callAdapter.permitOthersVideo();
45161
+ });
45162
+ }
44479
45163
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
44480
45164
  on(event, listener) {
44481
45165
  switch (event) {
@@ -45670,4 +46354,4 @@ exports.useTeamsCall = useTeamsCall;
45670
46354
  exports.useTeamsCallAdapter = useTeamsCallAdapter;
45671
46355
  exports.useTeamsCallAgent = useTeamsCallAgent;
45672
46356
  exports.useTheme = useTheme;
45673
- //# sourceMappingURL=index-O64dqfKP.js.map
46357
+ //# sourceMappingURL=index-C8ch4y0S.js.map