@azure/communication-react 1.7.1-alpha-202308170011 → 1.7.1-alpha-202308172328

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 (128) hide show
  1. package/dist/communication-react.d.ts +115 -8
  2. package/dist/dist-cjs/communication-react/index.js +688 -117
  3. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  4. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  5. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  6. package/dist/dist-esm/calling-component-bindings/src/baseSelectors.d.ts +5 -0
  7. package/dist/dist-esm/calling-component-bindings/src/baseSelectors.js +8 -0
  8. package/dist/dist-esm/calling-component-bindings/src/baseSelectors.js.map +1 -1
  9. package/dist/dist-esm/calling-component-bindings/src/callControlSelectors.d.ts +15 -0
  10. package/dist/dist-esm/calling-component-bindings/src/callControlSelectors.js +16 -1
  11. package/dist/dist-esm/calling-component-bindings/src/callControlSelectors.js.map +1 -1
  12. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.d.ts +3 -0
  13. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js +28 -6
  14. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js.map +1 -1
  15. package/dist/dist-esm/calling-component-bindings/src/handlers/createTeamsCallHandlers.js.map +1 -1
  16. package/dist/dist-esm/calling-component-bindings/src/hooks/usePropsFor.js +13 -1
  17. package/dist/dist-esm/calling-component-bindings/src/hooks/usePropsFor.js.map +1 -1
  18. package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js +8 -1
  19. package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js.map +1 -1
  20. package/dist/dist-esm/calling-component-bindings/src/utils/participantListSelectorUtils.d.ts +2 -2
  21. package/dist/dist-esm/calling-component-bindings/src/utils/participantListSelectorUtils.js +4 -10
  22. package/dist/dist-esm/calling-component-bindings/src/utils/participantListSelectorUtils.js.map +1 -1
  23. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.d.ts +3 -2
  24. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js +22 -7
  25. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js.map +1 -1
  26. package/dist/dist-esm/calling-component-bindings/src/videoGallerySelector.js +14 -4
  27. package/dist/dist-esm/calling-component-bindings/src/videoGallerySelector.js.map +1 -1
  28. package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +11 -4
  29. package/dist/dist-esm/calling-stateful-client/src/CallClientState.js +0 -1
  30. package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
  31. package/dist/dist-esm/calling-stateful-client/src/CallContext.js +13 -3
  32. package/dist/dist-esm/calling-stateful-client/src/CallContext.js.map +1 -1
  33. package/dist/dist-esm/calling-stateful-client/src/Converter.d.ts +6 -0
  34. package/dist/dist-esm/calling-stateful-client/src/Converter.js +9 -0
  35. package/dist/dist-esm/calling-stateful-client/src/Converter.js.map +1 -1
  36. package/dist/dist-esm/calling-stateful-client/src/index-public.d.ts +1 -0
  37. package/dist/dist-esm/calling-stateful-client/src/index-public.js.map +1 -1
  38. package/dist/dist-esm/communication-react/src/index.d.ts +2 -0
  39. package/dist/dist-esm/communication-react/src/index.js +2 -0
  40. package/dist/dist-esm/communication-react/src/index.js.map +1 -1
  41. package/dist/dist-esm/react-components/src/components/ParticipantList.js +45 -13
  42. package/dist/dist-esm/react-components/src/components/ParticipantList.js.map +1 -1
  43. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js +10 -2
  44. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js.map +1 -1
  45. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js +2 -1
  46. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js.map +1 -1
  47. package/dist/dist-esm/react-components/src/components/VideoGallery/SpeakerVideoLayout.d.ts +28 -0
  48. package/dist/dist-esm/react-components/src/components/VideoGallery/SpeakerVideoLayout.js +145 -0
  49. package/dist/dist-esm/react-components/src/components/VideoGallery/SpeakerVideoLayout.js.map +1 -0
  50. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.d.ts +2 -0
  51. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js +19 -2
  52. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js.map +1 -1
  53. package/dist/dist-esm/react-components/src/components/VideoGallery.d.ts +1 -1
  54. package/dist/dist-esm/react-components/src/components/VideoGallery.js +14 -5
  55. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  56. package/dist/dist-esm/react-components/src/components/VideoTile.js +2 -2
  57. package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
  58. package/dist/dist-esm/react-components/src/gallery/dominantSpeaker.d.ts +7 -0
  59. package/dist/dist-esm/react-components/src/gallery/dominantSpeaker.js +5 -1
  60. package/dist/dist-esm/react-components/src/gallery/dominantSpeaker.js.map +1 -1
  61. package/dist/dist-esm/react-components/src/theming/icons.d.ts +2 -0
  62. package/dist/dist-esm/react-components/src/theming/icons.js +5 -1
  63. package/dist/dist-esm/react-components/src/theming/icons.js.map +1 -1
  64. package/dist/dist-esm/react-components/src/types/ParticipantListParticipant.d.ts +1 -1
  65. package/dist/dist-esm/react-components/src/types/ParticipantListParticipant.js.map +1 -1
  66. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.d.ts +10 -0
  67. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js +5 -3
  68. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js.map +1 -1
  69. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.d.ts +12 -0
  70. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.js.map +1 -1
  71. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.d.ts +2 -0
  72. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +20 -0
  73. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
  74. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.d.ts +12 -0
  75. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
  76. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.d.ts +3 -0
  77. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js +5 -1
  78. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js.map +1 -1
  79. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.js +29 -0
  80. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.js.map +1 -1
  81. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalAndRemotePIP.d.ts +2 -0
  82. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalAndRemotePIP.js +6 -2
  83. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalAndRemotePIP.js.map +1 -1
  84. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.d.ts +2 -0
  85. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.js +21 -11
  86. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.js.map +1 -1
  87. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/RaiseHand.d.ts +12 -0
  88. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/RaiseHand.js +26 -0
  89. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/RaiseHand.js.map +1 -0
  90. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js +19 -4
  91. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js.map +1 -1
  92. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.d.ts +2 -0
  93. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js +13 -3
  94. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js.map +1 -1
  95. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.d.ts +5 -0
  96. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.js +5 -0
  97. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.js.map +1 -1
  98. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localAndRemotePIPSelector.d.ts +3 -1
  99. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localAndRemotePIPSelector.js +12 -2
  100. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localAndRemotePIPSelector.js.map +1 -1
  101. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.d.ts +10 -0
  102. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js +6 -2
  103. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js.map +1 -1
  104. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.d.ts +4 -0
  105. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js +18 -0
  106. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js.map +1 -1
  107. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.d.ts +12 -0
  108. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.js.map +1 -1
  109. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.d.ts +2 -0
  110. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js +4 -0
  111. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js.map +1 -1
  112. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js +11 -5
  113. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js.map +1 -1
  114. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/CommonCallControlBar.d.ts +3 -0
  115. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/CommonCallControlBar.js +13 -1
  116. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/CommonCallControlBar.js.map +1 -1
  117. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.d.ts +3 -0
  118. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.js +56 -0
  119. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.js.map +1 -1
  120. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js +25 -0
  121. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js.map +1 -1
  122. package/dist/dist-esm/react-composites/src/composites/common/icons.d.ts +16 -2
  123. package/dist/dist-esm/react-composites/src/composites/common/icons.js +11 -1
  124. package/dist/dist-esm/react-composites/src/composites/common/icons.js.map +1 -1
  125. package/dist/dist-esm/react-composites/src/composites/common/types/CommonCallControlOptions.d.ts +7 -0
  126. package/dist/dist-esm/react-composites/src/composites/common/types/CommonCallControlOptions.js.map +1 -1
  127. package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +4 -1
  128. package/package.json +8 -8
@@ -178,7 +178,7 @@ const _isValidIdentifier = (identifier) => {
178
178
  // Copyright (c) Microsoft Corporation.
179
179
  // Licensed under the MIT license.
180
180
  // GENERATED FILE. DO NOT EDIT MANUALLY.
181
- var telemetryVersion = '1.7.1-alpha-202308170011';
181
+ var telemetryVersion = '1.7.1-alpha-202308172328';
182
182
 
183
183
  // Copyright (c) Microsoft Corporation.
184
184
  /**
@@ -360,6 +360,14 @@ const getRemoteParticipants$1 = (state, props) => {
360
360
  var _a;
361
361
  return (_a = state.calls[props.callId]) === null || _a === void 0 ? void 0 : _a.remoteParticipants;
362
362
  };
363
+ /* @conditional-compile-remove(raise-hand) */
364
+ /**
365
+ * @private
366
+ */
367
+ const getLocalParticipantRaisedHand$1 = (state, props) => {
368
+ var _a, _b;
369
+ return (_b = (_a = state.calls[props.callId]) === null || _a === void 0 ? void 0 : _a.raiseHand) === null || _b === void 0 ? void 0 : _b.localParticipantRaisedHand;
370
+ };
363
371
  /**
364
372
  * @private
365
373
  */
@@ -602,6 +610,19 @@ const cameraButtonSelector = reselect__namespace.createSelector([
602
610
  selectedCamera: deviceManager.selectedCamera
603
611
  };
604
612
  });
613
+ /* @conditional-compile-remove(raise-hand) */
614
+ /**
615
+ * Selector for {@link RaiseHandButton} component.
616
+ *
617
+ * @public
618
+ */
619
+ const raiseHandButtonSelector = reselect__namespace.createSelector([getLocalParticipantRaisedHand$1, getCallState], (raisedHand, callState) => {
620
+ var _a;
621
+ return {
622
+ checked: raisedHand ? true : false,
623
+ disabled: callState === 'InLobby' ? true : (_a = callState === 'Connecting') !== null && _a !== void 0 ? _a : false
624
+ };
625
+ });
605
626
  /**
606
627
  * Selector for {@link ScreenShareButton} component.
607
628
  *
@@ -624,7 +645,7 @@ const screenShareButtonSelector = reselect__namespace.createSelector([
624
645
  role === 'Consumer' ||
625
646
  role === 'Attendee';
626
647
  /* @conditional-compile-remove(PSTN-calls) */
627
- disabled = disabled || ['InLobby', 'Connecting'].includes(callState);
648
+ disabled = disabled || ['InLobby', 'Connecting', 'LocalHold'].includes(callState);
628
649
  return {
629
650
  checked: isScreenSharingOn,
630
651
  disabled
@@ -794,6 +815,22 @@ const createDefaultCommonCallingHandlers = memoizeOne__default['default']((callC
794
815
  }, options);
795
816
  }
796
817
  });
818
+ /* @conditional-compile-remove(raise-hand) */
819
+ const onRaiseHand = () => __awaiter$L(void 0, void 0, void 0, function* () { var _a; return yield ((_a = call === null || call === void 0 ? void 0 : call.feature(communicationCalling.Features.RaiseHand)) === null || _a === void 0 ? void 0 : _a.raiseHand()); });
820
+ /* @conditional-compile-remove(raise-hand) */
821
+ const onLowerHand = () => __awaiter$L(void 0, void 0, void 0, function* () { var _b; return yield ((_b = call === null || call === void 0 ? void 0 : call.feature(communicationCalling.Features.RaiseHand)) === null || _b === void 0 ? void 0 : _b.lowerHand()); });
822
+ /* @conditional-compile-remove(raise-hand) */
823
+ const onToggleRaiseHand = () => __awaiter$L(void 0, void 0, void 0, function* () {
824
+ const raiseHandFeature = call === null || call === void 0 ? void 0 : call.feature(communicationCalling.Features.RaiseHand);
825
+ const localUserId = callClient.getState().userId;
826
+ const isLocalRaisedHand = raiseHandFeature === null || raiseHandFeature === void 0 ? void 0 : raiseHandFeature.getRaisedHands().find((publishedState) => toFlatCommunicationIdentifier(publishedState.identifier) === toFlatCommunicationIdentifier(localUserId));
827
+ if (isLocalRaisedHand) {
828
+ yield (raiseHandFeature === null || raiseHandFeature === void 0 ? void 0 : raiseHandFeature.lowerHand());
829
+ }
830
+ else {
831
+ yield (raiseHandFeature === null || raiseHandFeature === void 0 ? void 0 : raiseHandFeature.raiseHand());
832
+ }
833
+ });
797
834
  const onToggleMicrophone = () => __awaiter$L(void 0, void 0, void 0, function* () {
798
835
  if (!call || !_isInCall(call.state)) {
799
836
  throw new Error(`Please invoke onToggleMicrophone after call is started`);
@@ -807,7 +844,7 @@ const createDefaultCommonCallingHandlers = memoizeOne__default['default']((callC
807
844
  /* @conditional-compile-remove(PSTN-calls) */
808
845
  const onToggleHold = () => __awaiter$L(void 0, void 0, void 0, function* () { return (call === null || call === void 0 ? void 0 : call.state) === 'LocalHold' ? yield (call === null || call === void 0 ? void 0 : call.resume()) : yield (call === null || call === void 0 ? void 0 : call.hold()); });
809
846
  const onCreateLocalStreamView = (options = { scalingMode: 'Crop', isMirrored: true }) => __awaiter$L(void 0, void 0, void 0, function* () {
810
- var _a;
847
+ var _c;
811
848
  if (!call || call.localVideoStreams.length === 0) {
812
849
  return;
813
850
  }
@@ -819,7 +856,7 @@ const createDefaultCommonCallingHandlers = memoizeOne__default['default']((callC
819
856
  if (!localStream) {
820
857
  return;
821
858
  }
822
- const { view } = (_a = (yield callClient.createView(call.id, undefined, localStream, options))) !== null && _a !== void 0 ? _a : {};
859
+ const { view } = (_c = (yield callClient.createView(call.id, undefined, localStream, options))) !== null && _c !== void 0 ? _c : {};
823
860
  return view ? { view } : undefined;
824
861
  });
825
862
  const onCreateRemoteStreamView = (userId, options = { scalingMode: 'Crop' }) => __awaiter$L(void 0, void 0, void 0, function* () {
@@ -946,7 +983,7 @@ const createDefaultCommonCallingHandlers = memoizeOne__default['default']((callC
946
983
  });
947
984
  /* @conditional-compile-remove(video-background-effects) */
948
985
  const onBlurVideoBackground = (backgroundBlurConfig) => __awaiter$L(void 0, void 0, void 0, function* () {
949
- var _b;
986
+ var _d;
950
987
  const stream = (call === null || call === void 0 ? void 0 : call.localVideoStreams.find((stream) => stream.mediaStreamType === 'Video')) ||
951
988
  (deviceManager === null || deviceManager === void 0 ? void 0 : deviceManager.getUnparentedVideoStreams().find((stream) => stream.mediaStreamType === 'Video'));
952
989
  if (stream) {
@@ -954,13 +991,13 @@ const createDefaultCommonCallingHandlers = memoizeOne__default['default']((callC
954
991
  throw new Error(`Video background effects dependency not resolved`);
955
992
  }
956
993
  const createEffect = (options === null || options === void 0 ? void 0 : options.onResolveVideoBackgroundEffectsDependency) &&
957
- ((_b = (yield options.onResolveVideoBackgroundEffectsDependency())) === null || _b === void 0 ? void 0 : _b.createBackgroundBlurEffect);
994
+ ((_d = (yield options.onResolveVideoBackgroundEffectsDependency())) === null || _d === void 0 ? void 0 : _d.createBackgroundBlurEffect);
958
995
  return createEffect && stream.feature(communicationCalling.Features.VideoEffects).startEffects(createEffect(backgroundBlurConfig));
959
996
  }
960
997
  });
961
998
  /* @conditional-compile-remove(video-background-effects) */
962
999
  const onReplaceVideoBackground = (backgroundReplacementConfig) => __awaiter$L(void 0, void 0, void 0, function* () {
963
- var _c;
1000
+ var _e;
964
1001
  const stream = (call === null || call === void 0 ? void 0 : call.localVideoStreams.find((stream) => stream.mediaStreamType === 'Video')) ||
965
1002
  (deviceManager === null || deviceManager === void 0 ? void 0 : deviceManager.getUnparentedVideoStreams().find((stream) => stream.mediaStreamType === 'Video'));
966
1003
  if (stream) {
@@ -968,7 +1005,7 @@ const createDefaultCommonCallingHandlers = memoizeOne__default['default']((callC
968
1005
  throw new Error(`Video background effects dependency not resolved`);
969
1006
  }
970
1007
  const createEffect = (options === null || options === void 0 ? void 0 : options.onResolveVideoBackgroundEffectsDependency) &&
971
- ((_c = (yield options.onResolveVideoBackgroundEffectsDependency())) === null || _c === void 0 ? void 0 : _c.createBackgroundReplacementEffect);
1008
+ ((_e = (yield options.onResolveVideoBackgroundEffectsDependency())) === null || _e === void 0 ? void 0 : _e.createBackgroundReplacementEffect);
972
1009
  return (createEffect && stream.feature(communicationCalling.Features.VideoEffects).startEffects(createEffect(backgroundReplacementConfig)));
973
1010
  }
974
1011
  });
@@ -1007,6 +1044,12 @@ const createDefaultCommonCallingHandlers = memoizeOne__default['default']((callC
1007
1044
  onDisposeLocalStreamView,
1008
1045
  onDisposeRemoteScreenShareStreamView,
1009
1046
  onDisposeRemoteVideoStreamView,
1047
+ /* @conditional-compile-remove(raise-hand) */
1048
+ onRaiseHand,
1049
+ /* @conditional-compile-remove(raise-hand) */
1050
+ onLowerHand,
1051
+ /* @conditional-compile-remove(raise-hand) */
1052
+ onToggleRaiseHand,
1010
1053
  /* @conditional-compile-remove(PSTN-calls) */
1011
1054
  onAddParticipant: notImplemented,
1012
1055
  onRemoveParticipant: notImplemented,
@@ -1376,6 +1419,7 @@ const deviceManagerDeclaratify = (deviceManager, context, internalContext) => {
1376
1419
  };
1377
1420
 
1378
1421
  // Copyright (c) Microsoft Corporation.
1422
+ // Licensed under the MIT license.
1379
1423
  /**
1380
1424
  * Error thrown from failed stateful API methods.
1381
1425
  *
@@ -1648,6 +1692,15 @@ function convertFromSDKToDeclarativeVideoStreamVideoEffects(videoEffects) {
1648
1692
  activeEffects: videoEffects
1649
1693
  };
1650
1694
  }
1695
+ /* @conditional-compile-remove(raise-hand) */
1696
+ /**
1697
+ * @private
1698
+ */
1699
+ function convertFromSDKToRaisedHandState(raisedHand) {
1700
+ return {
1701
+ raisedHandOrderPosition: raisedHand.order
1702
+ };
1703
+ }
1651
1704
 
1652
1705
  // Copyright (c) Microsoft Corporation.
1653
1706
  // Licensed under the MIT license.
@@ -1934,8 +1987,16 @@ class CallContext$2 {
1934
1987
  this.modifyState((draft) => {
1935
1988
  const call = draft.calls[this._callIdHistory.latestCallId(callId)];
1936
1989
  if (call) {
1937
- call.raiseHand.raisedHands = raisedHands;
1938
- call.raiseHand.localParticipantRaisedHand = raisedHands.find((raisedHand) => toFlatCommunicationIdentifier(raisedHand.identifier) === toFlatCommunicationIdentifier(this._state.userId));
1990
+ call.raiseHand.raisedHands = raisedHands.map((raisedHand) => {
1991
+ return convertFromSDKToRaisedHandState(raisedHand);
1992
+ });
1993
+ const raisedHand = raisedHands.find((raisedHand) => toFlatCommunicationIdentifier(raisedHand.identifier) === toFlatCommunicationIdentifier(this._state.userId));
1994
+ if (raisedHand) {
1995
+ call.raiseHand.localParticipantRaisedHand = convertFromSDKToRaisedHandState(raisedHand);
1996
+ }
1997
+ else {
1998
+ call.raiseHand.localParticipantRaisedHand = undefined;
1999
+ }
1939
2000
  }
1940
2001
  });
1941
2002
  }
@@ -1946,7 +2007,7 @@ class CallContext$2 {
1946
2007
  if (call) {
1947
2008
  const participant = call.remoteParticipants[participantKey];
1948
2009
  if (participant) {
1949
- participant.raisedHand = raisedHand;
2010
+ participant.raisedHand = raisedHand ? convertFromSDKToRaisedHandState(raisedHand) : raisedHand;
1950
2011
  }
1951
2012
  }
1952
2013
  });
@@ -6082,6 +6143,10 @@ const DEFAULT_COMPONENT_ICONS = {
6082
6143
  ControlButtonRaiseHand: React__default['default'].createElement(reactIcons.HandRight20Filled, null),
6083
6144
  /* @conditional-compile-remove(raise-hand) */
6084
6145
  ControlButtonLowerHand: React__default['default'].createElement(reactIcons.HandRightOff20Filled, null),
6146
+ /* @conditional-compile-remove(raise-hand) */
6147
+ RaiseHandContextualMenuItem: React__default['default'].createElement(reactIcons.HandRight20Regular, null),
6148
+ /* @conditional-compile-remove(raise-hand) */
6149
+ LowerHandContextualMenuItem: React__default['default'].createElement(reactIcons.HandRightOff20Regular, null),
6085
6150
  /* @conditional-compile-remove(file-sharing) */
6086
6151
  CancelFileUpload: React__default['default'].createElement(reactIcons.Dismiss16Regular, null),
6087
6152
  /* @conditional-compile-remove(file-sharing) */
@@ -11295,25 +11360,56 @@ const onRenderParticipantDefault = (participant, strings, myUserId, onRenderAvat
11295
11360
  (callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.isMuted) ||
11296
11361
  (
11297
11362
  /* @conditional-compile-remove(raise-hand) */ callingParticipant === null || callingParticipant === void 0 ? void 0 : callingParticipant.raisedHand)
11298
- ? () => (React__default['default'].createElement(react.Stack, { horizontal: true, tokens: { childrenGap: '0.5rem' } },
11299
- /* @conditional-compile-remove(raise-hand) */ callingParticipant.raisedHand && (React__default['default'].createElement(react.Stack, { horizontal: true, tokens: { childrenGap: '0.2rem' }, style: {
11300
- alignItems: 'center',
11301
- padding: '0.2rem',
11302
- backgroundColor: theme === null || theme === void 0 ? void 0 : theme.palette.neutralLighter,
11303
- borderRadius: '1rem'
11304
- } },
11305
- callingParticipant.raisedHand.order && (React__default['default'].createElement(react.Stack.Item, null,
11306
- React__default['default'].createElement(react.Text, null, callingParticipant.raisedHand.order))),
11307
- React__default['default'].createElement(react.Stack.Item, null,
11308
- React__default['default'].createElement(RaisedHandIcon, null)))),
11309
- callingParticipant.isScreenSharing && (React__default['default'].createElement(react.Icon, { iconName: "ParticipantItemScreenShareStart", className: iconStyles$2, ariaLabel: strings.sharingIconLabel })),
11310
- callingParticipant.isMuted && (React__default['default'].createElement(react.Icon, { iconName: "ParticipantItemMicOff", className: iconStyles$2, ariaLabel: strings.mutedIconLabel }))))
11363
+ ? () => {
11364
+ var _a;
11365
+ return (React__default['default'].createElement(react.Stack, { horizontal: true, tokens: { childrenGap: '0.5rem' } },
11366
+ /* @conditional-compile-remove(raise-hand) */ callingParticipant.raisedHand && (React__default['default'].createElement(react.Stack, { horizontal: true, tokens: { childrenGap: '0.2rem' }, style: {
11367
+ alignItems: 'center',
11368
+ padding: '0.2rem',
11369
+ backgroundColor: theme === null || theme === void 0 ? void 0 : theme.palette.neutralLighter,
11370
+ borderRadius: '1rem'
11371
+ } },
11372
+ callingParticipant.raisedHand.raisedHandOrderPosition && (React__default['default'].createElement(react.Stack.Item, null,
11373
+ React__default['default'].createElement(react.Text, null, (_a = callingParticipant.raisedHand) === null || _a === void 0 ? void 0 : _a.raisedHandOrderPosition))),
11374
+ React__default['default'].createElement(react.Stack.Item, null,
11375
+ React__default['default'].createElement(RaisedHandIcon, null)))),
11376
+ callingParticipant.isScreenSharing && (React__default['default'].createElement(react.Icon, { iconName: "ParticipantItemScreenShareStart", className: iconStyles$2, ariaLabel: strings.sharingIconLabel })),
11377
+ callingParticipant.isMuted && (React__default['default'].createElement(react.Icon, { iconName: "ParticipantItemMicOff", className: iconStyles$2, ariaLabel: strings.mutedIconLabel }))));
11378
+ }
11311
11379
  : () => null;
11312
11380
  return (React__default['default'].createElement(ParticipantItem, { styles: styles, key: participant.userId, userId: participant.userId, displayName: participant.displayName, me: myUserId ? participant.userId === myUserId : false, menuItems: menuItems, presence: presence, onRenderIcon: onRenderIcon, onRenderAvatar: onRenderAvatar, onClick: () => onParticipantClick === null || onParticipantClick === void 0 ? void 0 : onParticipantClick(participant), showParticipantOverflowTooltip: showParticipantOverflowTooltip,
11313
11381
  /* @conditional-compile-remove(one-to-n-calling) */
11314
11382
  /* @conditional-compile-remove(PSTN-calls) */
11315
11383
  participantState: callingParticipant.state, ariaLabelledBy: participantAriaLabelledBy }));
11316
11384
  };
11385
+ /**
11386
+ * Sort participants by raised hand order position
11387
+ */
11388
+ const sortParticipants = (participants) => {
11389
+ /* @conditional-compile-remove(raise-hand) */
11390
+ const isParticipantListCallParticipant = function (participant) {
11391
+ return 'raisedHand' in participant;
11392
+ };
11393
+ /* @conditional-compile-remove(raise-hand) */
11394
+ participants.sort((a, b) => {
11395
+ if (!isParticipantListCallParticipant(a) || !isParticipantListCallParticipant(b)) {
11396
+ return 0;
11397
+ }
11398
+ const callA = a;
11399
+ const callB = b;
11400
+ if (callA.raisedHand && callB.raisedHand) {
11401
+ return callA.raisedHand.raisedHandOrderPosition - callB.raisedHand.raisedHandOrderPosition;
11402
+ }
11403
+ else if (callA.raisedHand) {
11404
+ return -1;
11405
+ }
11406
+ else if (callB.raisedHand) {
11407
+ return 1;
11408
+ }
11409
+ return 0;
11410
+ });
11411
+ return participants;
11412
+ };
11317
11413
  const getParticipantsForDefaultRender = (participants, excludeMe, myUserId) => {
11318
11414
  if (!excludeMe || !myUserId) {
11319
11415
  return [...participants];
@@ -11349,6 +11445,7 @@ const ParticipantList = (props) => {
11349
11445
  const displayedParticipants = React.useMemo(() => {
11350
11446
  return onRenderParticipant ? participants : getParticipantsForDefaultRender(participants, excludeMe, myUserId);
11351
11447
  }, [participants, excludeMe, myUserId, onRenderParticipant]);
11448
+ sortParticipants(displayedParticipants);
11352
11449
  const createParticipantMenuItems = React.useCallback((participant) => {
11353
11450
  var _a, _b;
11354
11451
  let menuItems = [];
@@ -12220,7 +12317,7 @@ const VideoTile = (props) => {
12220
12317
  isPinned && (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
12221
12318
  React__default['default'].createElement(react.Icon, { iconName: "VideoTilePinned", className: react.mergeStyles(pinIconStyle) })))))),
12222
12319
  children && (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(overlayContainerStyles, styles === null || styles === void 0 ? void 0 : styles.overlayContainer) }, children)),
12223
- /* @conditional-compile-remove(raise-hand) */ raisedHand && (React__default['default'].createElement(react.Stack, { horizontal: true, tokens: { childrenGap: '0.2rem' }, style: {
12320
+ /* @conditional-compile-remove(raise-hand) */ raisedHand && canShowLabel && (React__default['default'].createElement(react.Stack, { horizontal: true, tokens: { childrenGap: '0.2rem' }, style: {
12224
12321
  alignItems: 'center',
12225
12322
  padding: '0.2rem',
12226
12323
  backgroundColor: theme.palette.white,
@@ -12231,7 +12328,7 @@ const VideoTile = (props) => {
12231
12328
  position: 'absolute'
12232
12329
  } },
12233
12330
  React__default['default'].createElement(react.Stack.Item, null,
12234
- React__default['default'].createElement(react.Text, null, raisedHand.order)),
12331
+ React__default['default'].createElement(react.Text, null, raisedHand.raisedHandOrderPosition)),
12235
12332
  React__default['default'].createElement(react.Stack.Item, null,
12236
12333
  React__default['default'].createElement(RaisedHandIcon, null)))))));
12237
12334
  };
@@ -12658,6 +12755,10 @@ const smartDominantSpeakerParticipants = (args) => {
12658
12755
  newVisibleParticipants = newVisibleParticipants.concat(remainingParticipants);
12659
12756
  return newVisibleParticipants;
12660
12757
  };
12758
+ /**
12759
+ * maps the participants array to an object with userId as key
12760
+ * @private
12761
+ */
12661
12762
  const participantsById = (participants) => {
12662
12763
  const response = {};
12663
12764
  participants.forEach((p) => (response[p.userId] = p));
@@ -12669,17 +12770,33 @@ const DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS = 6;
12669
12770
  const _useOrganizedParticipants = (props) => {
12670
12771
  const visibleGridParticipants = React.useRef([]);
12671
12772
  const visibleOverflowGalleryParticipants = React.useRef([]);
12672
- const { remoteParticipants = [], localParticipant, dominantSpeakers = [], maxRemoteVideoStreams, maxOverflowGalleryDominantSpeakers = DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS, isScreenShareActive = false, pinnedParticipantUserIds = [] } = props;
12773
+ const { remoteParticipants = [], localParticipant, dominantSpeakers = [], maxRemoteVideoStreams, maxOverflowGalleryDominantSpeakers = DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS, isScreenShareActive = false, pinnedParticipantUserIds = [],
12774
+ /* @conditional-compile-remove(gallery-layouts) */
12775
+ layout } = props;
12673
12776
  const videoParticipants = remoteParticipants.filter((p) => { var _a; return (_a = p.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable; });
12777
+ const participantsToSortTrampoline = () => {
12778
+ /* @conditional-compile-remove(gallery-layouts) */
12779
+ return layout !== 'speaker' ? videoParticipants : remoteParticipants;
12780
+ };
12674
12781
  visibleGridParticipants.current =
12675
12782
  pinnedParticipantUserIds.length > 0 || isScreenShareActive
12676
12783
  ? []
12677
12784
  : smartDominantSpeakerParticipants({
12678
- participants: videoParticipants,
12785
+ participants: participantsToSortTrampoline(),
12679
12786
  dominantSpeakers,
12680
12787
  lastVisibleParticipants: visibleGridParticipants.current,
12681
12788
  maxDominantSpeakers: maxRemoteVideoStreams
12682
12789
  }).slice(0, maxRemoteVideoStreams);
12790
+ /* @conditional-compile-remove(gallery-layouts) */
12791
+ const dominantSpeakerToGrid = layout === 'speaker'
12792
+ ? dominantSpeakers && dominantSpeakers[0]
12793
+ ? visibleGridParticipants.current.filter((p) => p.userId === dominantSpeakers[0])
12794
+ : [visibleGridParticipants.current[0]]
12795
+ : [];
12796
+ /* @conditional-compile-remove(gallery-layouts) */
12797
+ if (dominantSpeakerToGrid[0]) {
12798
+ visibleGridParticipants.current = dominantSpeakerToGrid;
12799
+ }
12683
12800
  const visibleGridParticipantsSet = new Set(visibleGridParticipants.current.map((p) => p.userId));
12684
12801
  const remoteParticipantsOrdered = putVideoParticipantsFirst(remoteParticipants);
12685
12802
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
@@ -13575,7 +13692,8 @@ const DefaultLayout = (props) => {
13575
13692
  maxOverflowGalleryDominantSpeakers: screenShareComponent
13576
13693
  ? childrenPerPage.current - ((pinnedParticipantUserIds.length + 1) % childrenPerPage.current)
13577
13694
  : childrenPerPage.current,
13578
- /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds
13695
+ /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds,
13696
+ /* @conditional-compile-remove(gallery-layouts) */ layout: 'default'
13579
13697
  });
13580
13698
  let activeVideoStreams = 0;
13581
13699
  const gridTiles = gridParticipants.map((p) => {
@@ -13628,8 +13746,14 @@ const DefaultLayout = (props) => {
13628
13746
  , {
13629
13747
  /* @conditional-compile-remove(vertical-gallery) */
13630
13748
  horizontal: overflowGalleryPosition === 'VerticalRight', styles: rootLayoutStyle$1, tokens: videoGalleryLayoutGap },
13749
+ /* @conditional-compile-remove(gallery-layouts) */ props.overflowGalleryPosition === 'HorizontalTop' ? (overflowGallery) : (React__default['default'].createElement(React__default['default'].Fragment, null)),
13631
13750
  screenShareComponent ? (screenShareComponent) : (React__default['default'].createElement(GridLayout, { key: "grid-layout", styles: styles === null || styles === void 0 ? void 0 : styles.gridLayout }, gridTiles)),
13632
- overflowGallery));
13751
+ overflowGalleryTrampoline$2(overflowGallery,
13752
+ /* @conditional-compile-remove(gallery-layouts) */ props.overflowGalleryPosition)));
13753
+ };
13754
+ const overflowGalleryTrampoline$2 = (gallery, galleryPosition) => {
13755
+ /* @conditional-compile-remove(gallery-layouts) */
13756
+ return galleryPosition !== 'HorizontalTop' ? gallery : React__default['default'].createElement(React__default['default'].Fragment, null);
13633
13757
  };
13634
13758
 
13635
13759
  // Copyright (c) Microsoft Corporation.
@@ -14394,7 +14518,8 @@ const FloatingLocalVideoLayout = (props) => {
14394
14518
  maxOverflowGalleryDominantSpeakers: screenShareComponent
14395
14519
  ? childrenPerPage.current - (pinnedParticipantUserIds.length % childrenPerPage.current)
14396
14520
  : childrenPerPage.current,
14397
- /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds
14521
+ /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds,
14522
+ /* @conditional-compile-remove(gallery-layouts) */ layout: 'floatingLocalVideo'
14398
14523
  });
14399
14524
  let activeVideoStreams = 0;
14400
14525
  const gridTiles = gridParticipants.map((p) => {
@@ -14482,6 +14607,134 @@ const FloatingLocalVideoLayout = (props) => {
14482
14607
  setIndexesToRender,
14483
14608
  /* @conditional-compile-remove(vertical-gallery) */ styles === null || styles === void 0 ? void 0 : styles.verticalGallery
14484
14609
  ]);
14610
+ return (React__default['default'].createElement(react.Stack, { styles: rootLayoutStyle },
14611
+ wrappedLocalVideoComponent,
14612
+ React__default['default'].createElement(react.LayerHost, { id: layerHostId, className: react.mergeStyles(layerHostStyle) }),
14613
+ React__default['default'].createElement(react.Stack
14614
+ /* @conditional-compile-remove(vertical-gallery) */
14615
+ , {
14616
+ /* @conditional-compile-remove(vertical-gallery) */
14617
+ horizontal: overflowGalleryPosition === 'VerticalRight', styles: innerLayoutStyle, tokens: videoGalleryLayoutGap },
14618
+ /* @conditional-compile-remove(gallery-layouts) */ props.overflowGalleryPosition === 'HorizontalTop' ? (overflowGallery) : (React__default['default'].createElement(React__default['default'].Fragment, null)),
14619
+ screenShareComponent ? (screenShareComponent) : (React__default['default'].createElement(GridLayout, { key: "grid-layout", styles: styles === null || styles === void 0 ? void 0 : styles.gridLayout }, gridTiles)),
14620
+ overflowGalleryTrampoline$1(overflowGallery,
14621
+ /* @conditional-compile-remove(gallery-layouts) */ props.overflowGalleryPosition))));
14622
+ };
14623
+ const overflowGalleryTrampoline$1 = (gallery, galleryPosition) => {
14624
+ /* @conditional-compile-remove(gallery-layouts) */
14625
+ return galleryPosition !== 'HorizontalTop' ? gallery : React__default['default'].createElement(React__default['default'].Fragment, null);
14626
+ };
14627
+
14628
+ // Copyright (c) Microsoft Corporation.
14629
+ /**
14630
+ * Layout for the gallery mode to highlight the current dominant speaker
14631
+ *
14632
+ * @private
14633
+ */
14634
+ const SpeakerVideoLayout = (props) => {
14635
+ const { remoteParticipants = [], dominantSpeakers, localVideoComponent, screenShareComponent, onRenderRemoteParticipant, styles, maxRemoteVideoStreams, parentWidth,
14636
+ /* @conditional-compile-remove(vertical-gallery) */ parentHeight,
14637
+ /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition = 'HorizontalBottom', pinnedParticipantUserIds = [],
14638
+ /* @conditional-compile-remove(click-to-call) */ localVideoTileSize } = props;
14639
+ const theme = react.useTheme();
14640
+ const isNarrow = parentWidth ? isNarrowWidth(parentWidth) : false;
14641
+ /* @conditional-compile-remove(vertical-gallery) */
14642
+ const isShort = parentHeight ? isShortHeight(parentHeight) : false;
14643
+ // This is for tracking the number of children in the first page of overflow gallery.
14644
+ // This number will be used for the maxOverflowGalleryDominantSpeakers when organizing the remote participants.
14645
+ const childrenPerPage = React.useRef(4);
14646
+ const { gridParticipants, overflowGalleryParticipants } = useOrganizedParticipants({
14647
+ remoteParticipants,
14648
+ dominantSpeakers,
14649
+ maxRemoteVideoStreams,
14650
+ isScreenShareActive: !!screenShareComponent,
14651
+ maxOverflowGalleryDominantSpeakers: screenShareComponent
14652
+ ? childrenPerPage.current - (pinnedParticipantUserIds.length % childrenPerPage.current)
14653
+ : childrenPerPage.current,
14654
+ /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds,
14655
+ /* @conditional-compile-remove(gallery-layouts) */ layout: 'speaker'
14656
+ });
14657
+ let activeVideoStreams = 0;
14658
+ const gridTiles = gridParticipants.map((p) => {
14659
+ var _a, _b;
14660
+ return onRenderRemoteParticipant(p, maxRemoteVideoStreams && maxRemoteVideoStreams >= 0
14661
+ ? ((_a = p.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable) && activeVideoStreams++ < maxRemoteVideoStreams
14662
+ : (_b = p.videoStream) === null || _b === void 0 ? void 0 : _b.isAvailable);
14663
+ });
14664
+ const shouldFloatLocalVideo = remoteParticipants.length > 0;
14665
+ if (!shouldFloatLocalVideo && localVideoComponent) {
14666
+ gridTiles.push(localVideoComponent);
14667
+ }
14668
+ /**
14669
+ * instantiate indexes available to render with indexes available that would be on first page
14670
+ *
14671
+ * For some components which do not strictly follow the order of the array, we might
14672
+ * re-render the initial tiles -> dispose them -> create new tiles, we need to take care of
14673
+ * this case when those components are here
14674
+ */
14675
+ const [indexesToRender, setIndexesToRender] = React.useState([]);
14676
+ const overflowGalleryTiles = overflowGalleryParticipants.map((p, i) => {
14677
+ var _a, _b;
14678
+ return onRenderRemoteParticipant(p, maxRemoteVideoStreams && maxRemoteVideoStreams >= 0
14679
+ ? ((_a = p.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable) &&
14680
+ indexesToRender &&
14681
+ indexesToRender.includes(i) &&
14682
+ activeVideoStreams++ < maxRemoteVideoStreams
14683
+ : (_b = p.videoStream) === null || _b === void 0 ? void 0 : _b.isAvailable);
14684
+ });
14685
+ const layerHostId = reactHooks.useId('layerhost');
14686
+ const localVideoSizeRem = React.useMemo(() => {
14687
+ if (isNarrow || /*@conditional-compile-remove(click-to-call) */ localVideoTileSize === '9:16') {
14688
+ return SMALL_FLOATING_MODAL_SIZE_REM;
14689
+ }
14690
+ /* @conditional-compile-remove(vertical-gallery) */
14691
+ if ((overflowGalleryTiles.length > 0 || screenShareComponent) && overflowGalleryPosition === 'VerticalRight') {
14692
+ return isNarrow
14693
+ ? SMALL_FLOATING_MODAL_SIZE_REM
14694
+ : isShort
14695
+ ? SHORT_VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM
14696
+ : VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM;
14697
+ }
14698
+ /*@conditional-compile-remove(click-to-call) */
14699
+ if ((overflowGalleryTiles.length > 0 || screenShareComponent) && overflowGalleryPosition === 'HorizontalBottom') {
14700
+ return localVideoTileSize === '16:9' || !isNarrow ? LARGE_FLOATING_MODAL_SIZE_REM : SMALL_FLOATING_MODAL_SIZE_REM;
14701
+ }
14702
+ return LARGE_FLOATING_MODAL_SIZE_REM;
14703
+ }, [
14704
+ overflowGalleryTiles.length,
14705
+ isNarrow,
14706
+ screenShareComponent,
14707
+ /* @conditional-compile-remove(vertical-gallery) */ isShort,
14708
+ /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,
14709
+ /* @conditional-compile-remove(click-to-call) */ localVideoTileSize
14710
+ ]);
14711
+ const wrappedLocalVideoComponent = localVideoComponent || (screenShareComponent && localVideoComponent) ? (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(localVideoTileContainerStyle(theme, localVideoSizeRem, !!screenShareComponent,
14712
+ /* @conditional-compile-remove(gallery-layouts) */ overflowGalleryPosition)) }, localVideoComponent)) : undefined;
14713
+ const overflowGallery = React.useMemo(() => {
14714
+ if (overflowGalleryTiles.length === 0 && !screenShareComponent) {
14715
+ return null;
14716
+ }
14717
+ return (React__default['default'].createElement(OverflowGallery
14718
+ /* @conditional-compile-remove(vertical-gallery) */
14719
+ , {
14720
+ /* @conditional-compile-remove(vertical-gallery) */
14721
+ isShort: isShort, onFetchTilesToRender: setIndexesToRender, isNarrow: isNarrow, shouldFloatLocalVideo: true, overflowGalleryElements: overflowGalleryTiles, horizontalGalleryStyles: styles === null || styles === void 0 ? void 0 : styles.horizontalGallery,
14722
+ /* @conditional-compile-remove(vertical-gallery) */
14723
+ verticalGalleryStyles: styles === null || styles === void 0 ? void 0 : styles.verticalGallery,
14724
+ /* @conditional-compile-remove(vertical-gallery) */
14725
+ overflowGalleryPosition: overflowGalleryPosition, onChildrenPerPageChange: (n) => {
14726
+ childrenPerPage.current = n;
14727
+ } }));
14728
+ }, [
14729
+ isNarrow,
14730
+ /* @conditional-compile-remove(vertical-gallery) */ isShort,
14731
+ screenShareComponent,
14732
+ overflowGalleryTiles,
14733
+ styles === null || styles === void 0 ? void 0 : styles.horizontalGallery,
14734
+ /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,
14735
+ setIndexesToRender,
14736
+ /* @conditional-compile-remove(vertical-gallery) */ styles === null || styles === void 0 ? void 0 : styles.verticalGallery
14737
+ ]);
14485
14738
  return (React__default['default'].createElement(react.Stack, { styles: rootLayoutStyle },
14486
14739
  wrappedLocalVideoComponent,
14487
14740
  React__default['default'].createElement(react.LayerHost, { id: layerHostId, className: react.mergeStyles(layerHostStyle) }),
@@ -14559,7 +14812,8 @@ const VideoGallery = (props) => {
14559
14812
  : undefined;
14560
14813
  /* @conditional-compile-remove(pinned-participants) */
14561
14814
  const drawerMenuHostId = reactHooks.useId('drawerMenuHost', drawerMenuHostIdFromProp);
14562
- const shouldFloatLocalVideo = !!(layout === 'floatingLocalVideo' && remoteParticipants.length > 0);
14815
+ const localTileNotInGrid = !!((layout === 'floatingLocalVideo' || /* @conditional-compile-remove(gallery-layouts) */ layout === 'speaker') &&
14816
+ remoteParticipants.length > 0);
14563
14817
  const containerRef = React.useRef(null);
14564
14818
  const containerWidth = _useContainerWidth(containerRef);
14565
14819
  const containerHeight = _useContainerHeight(containerRef);
@@ -14592,14 +14846,16 @@ const VideoGallery = (props) => {
14592
14846
  if (onRenderLocalVideoTile) {
14593
14847
  return onRenderLocalVideoTile(localParticipant);
14594
14848
  }
14595
- const localVideoTileStyles = react.concatStyleSets(shouldFloatLocalVideo ? floatingLocalVideoTileStyle : {}, {
14849
+ const localVideoTileStyles = react.concatStyleSets(localTileNotInGrid ? floatingLocalVideoTileStyle : {}, {
14596
14850
  root: { borderRadius: theme.effects.roundedCorner4 }
14597
14851
  }, styles === null || styles === void 0 ? void 0 : styles.localVideo);
14598
14852
  const initialsName = !localParticipant.displayName ? '' : localParticipant.displayName;
14599
14853
  return (React__default['default'].createElement(react.Stack, { styles: localVideoTileContainerStyles, key: "local-video-tile-key", tabIndex: 0, "aria-label": strings.localVideoMovementLabel, role: 'dialog' },
14600
- React__default['default'].createElement(_LocalVideoTile, { 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: isNarrow ? '' : strings.localVideoLabel, initialsName: initialsName, localVideoViewOptions: localVideoViewOptions, onRenderAvatar: onRenderAvatar, showLabel: !((shouldFloatLocalVideo && isNarrow) ||
14854
+ React__default['default'].createElement(_LocalVideoTile, { 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: isNarrow ? '' : strings.localVideoLabel, initialsName: initialsName, localVideoViewOptions: localVideoViewOptions, onRenderAvatar: onRenderAvatar, showLabel: !((localTileNotInGrid && isNarrow) ||
14601
14855
  /*@conditional-compile-remove(click-to-call) */ /* @conditional-compile-remove(rooms) */ localVideoTileSize ===
14602
- '9:16'), showMuteIndicator: showMuteIndicator, showCameraSwitcherInLocalPreview: showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps: localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel: strings.localVideoCameraSwitcherLabel, localVideoSelectedDescription: strings.localVideoSelectedDescription, styles: localVideoTileStyles })));
14856
+ '9:16'), showMuteIndicator: showMuteIndicator, showCameraSwitcherInLocalPreview: showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps: localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel: strings.localVideoCameraSwitcherLabel, localVideoSelectedDescription: strings.localVideoSelectedDescription, styles: localVideoTileStyles,
14857
+ /* @conditional-compile-remove(raise-hand) */
14858
+ raisedHand: localParticipant.raisedHand })));
14603
14859
  }, [
14604
14860
  isNarrow,
14605
14861
  localParticipant,
@@ -14609,7 +14865,7 @@ const VideoGallery = (props) => {
14609
14865
  onDisposeLocalStreamView,
14610
14866
  onRenderAvatar,
14611
14867
  onRenderLocalVideoTile,
14612
- shouldFloatLocalVideo,
14868
+ localTileNotInGrid,
14613
14869
  showCameraSwitcherInLocalPreview,
14614
14870
  showMuteIndicator,
14615
14871
  strings.localVideoCameraSwitcherLabel,
@@ -14737,6 +14993,10 @@ const VideoGallery = (props) => {
14737
14993
  if (layout === 'floatingLocalVideo') {
14738
14994
  return React__default['default'].createElement(FloatingLocalVideoLayout, Object.assign({}, layoutProps));
14739
14995
  }
14996
+ /* @conditional-compile-remove(gallery-layouts) */
14997
+ if (layout === 'speaker') {
14998
+ return React__default['default'].createElement(SpeakerVideoLayout, Object.assign({}, layoutProps));
14999
+ }
14740
15000
  return React__default['default'].createElement(DefaultLayout, Object.assign({}, layoutProps));
14741
15001
  }, [layout, layoutProps]);
14742
15002
  return (React__default['default'].createElement("div", {
@@ -15862,6 +16122,40 @@ const screenshareButtonStyles = (theme) => ({
15862
16122
  labelChecked: { color: react.DefaultPalette.white }
15863
16123
  });
15864
16124
 
16125
+ // Copyright (c) Microsoft Corporation.
16126
+ /* @conditional-compile-remove(raise-hand) */
16127
+ /**
16128
+ * A button to start / stop screen sharing.
16129
+ *
16130
+ * Can be used with {@link ControlBar}.
16131
+ *
16132
+ * @public
16133
+ */
16134
+ const RaiseHandButton = (props) => {
16135
+ var _a, _b, _c, _d;
16136
+ const localeStrings = useLocale$1().strings.raiseHandButton;
16137
+ const strings = Object.assign(Object.assign({}, localeStrings), props.strings);
16138
+ const theme = react.useTheme();
16139
+ const styles = raiseHandButtonStyles(theme);
16140
+ const onRenderRaiseHandIcon = () => (React__default['default'].createElement(_HighContrastAwareIcon, { disabled: props.disabled, iconName: "ControlButtonRaiseHand" }));
16141
+ const onRenderLowerHandIcon = () => (React__default['default'].createElement(_HighContrastAwareIcon, { disabled: props.disabled, iconName: "ControlButtonLowerHand" }));
16142
+ return (React__default['default'].createElement(ControlBarButton, Object.assign({}, props, { className: react.mergeStyles(styles, props.styles), onClick: (_a = props.onToggleRaiseHand) !== null && _a !== void 0 ? _a : props.onClick, onRenderOnIcon: (_b = props.onRenderOnIcon) !== null && _b !== void 0 ? _b : onRenderLowerHandIcon, onRenderOffIcon: (_c = props.onRenderOffIcon) !== null && _c !== void 0 ? _c : onRenderRaiseHandIcon, strings: strings, labelKey: (_d = props.labelKey) !== null && _d !== void 0 ? _d : 'raiseHandButtonLabel', disabled: props.disabled })));
16143
+ };
16144
+ /* @conditional-compile-remove(raise-hand) */
16145
+ const raiseHandButtonStyles = (theme) => ({
16146
+ rootChecked: {
16147
+ background: theme.palette.themePrimary,
16148
+ color: react.DefaultPalette.white,
16149
+ ':focus::after': { outlineColor: `${react.DefaultPalette.white}` }
16150
+ },
16151
+ rootCheckedHovered: {
16152
+ background: theme.palette.themePrimary,
16153
+ color: react.DefaultPalette.white,
16154
+ ':focus::after': { outlineColor: `${react.DefaultPalette.white}` }
16155
+ },
16156
+ labelChecked: { color: react.DefaultPalette.white }
16157
+ });
16158
+
15865
16159
  // Copyright (c) Microsoft Corporation.
15866
16160
  /** @private */
15867
16161
  const PictureInPictureInPicturePrimaryTile = (props) => {
@@ -17238,15 +17532,25 @@ const _videoGalleryRemoteParticipantsMemo = (remoteParticipants) => {
17238
17532
  })
17239
17533
  .map((participant) => {
17240
17534
  const state = _isRingingPSTNParticipant(participant);
17241
- return memoizedFn(toFlatCommunicationIdentifier(participant.identifier), participant.isMuted, checkIsSpeaking(participant), participant.videoStreams, state, participant.displayName);
17535
+ return memoizedFn(toFlatCommunicationIdentifier(participant.identifier), participant.isMuted, checkIsSpeaking(participant), participant.videoStreams, state, participant.displayName,
17536
+ /* @conditional-compile-remove(raise-hand) */
17537
+ participant.raisedHand);
17242
17538
  }));
17243
17539
  });
17244
17540
  };
17245
- const memoizedAllConvertRemoteParticipant = memoizeFnAll((userId, isMuted, isSpeaking, videoStreams, state, displayName) => {
17246
- return convertRemoteParticipantToVideoGalleryRemoteParticipant(userId, isMuted, isSpeaking, videoStreams, state, displayName);
17541
+ const memoizedAllConvertRemoteParticipant = memoizeFnAll((userId, isMuted, isSpeaking, videoStreams, state, displayName,
17542
+ /* @conditional-compile-remove(raise-hand) */
17543
+ raisedHand // temp unknown type to build stable
17544
+ ) => {
17545
+ return convertRemoteParticipantToVideoGalleryRemoteParticipant(userId, isMuted, isSpeaking, videoStreams, state, displayName,
17546
+ /* @conditional-compile-remove(raise-hand) */
17547
+ raisedHand);
17247
17548
  });
17248
17549
  /** @private */
17249
- const convertRemoteParticipantToVideoGalleryRemoteParticipant = (userId, isMuted, isSpeaking, videoStreams, state, displayName) => {
17550
+ const convertRemoteParticipantToVideoGalleryRemoteParticipant = (userId, isMuted, isSpeaking, videoStreams, state, displayName,
17551
+ /* @conditional-compile-remove(raise-hand) */
17552
+ raisedHand // temp unknown type to build stable
17553
+ ) => {
17250
17554
  const rawVideoStreamsArray = Object.values(videoStreams);
17251
17555
  let videoStream = undefined;
17252
17556
  let screenShareStream = undefined;
@@ -17270,7 +17574,9 @@ const convertRemoteParticipantToVideoGalleryRemoteParticipant = (userId, isMuted
17270
17574
  isScreenSharingOn: screenShareStream !== undefined && screenShareStream.isAvailable,
17271
17575
  /* @conditional-compile-remove(one-to-n-calling) */
17272
17576
  /* @conditional-compile-remove(PSTN-calls) */
17273
- state
17577
+ state,
17578
+ /* @conditional-compile-remove(raise-hand) */
17579
+ raisedHand: raisedHand
17274
17580
  };
17275
17581
  };
17276
17582
  const convertRemoteVideoStreamToVideoGalleryStream = (stream) => {
@@ -17288,7 +17594,8 @@ const convertRemoteVideoStreamToVideoGalleryStream = (stream) => {
17288
17594
  };
17289
17595
  /** @private */
17290
17596
  const memoizeLocalParticipant = memoizeOne__default['default']((identifier, displayName, isMuted, isScreenSharingOn, localVideoStream,
17291
- /* @conditional-compile-remove(rooms) */ role) => {
17597
+ /* @conditional-compile-remove(rooms) */ role,
17598
+ /* @conditional-compile-remove(raise-hand) */ raisedHand) => {
17292
17599
  var _a, _b;
17293
17600
  return ({
17294
17601
  userId: identifier,
@@ -17301,7 +17608,9 @@ const memoizeLocalParticipant = memoizeOne__default['default']((identifier, disp
17301
17608
  renderElement: (_b = localVideoStream === null || localVideoStream === void 0 ? void 0 : localVideoStream.view) === null || _b === void 0 ? void 0 : _b.target
17302
17609
  },
17303
17610
  /* @conditional-compile-remove(rooms) */
17304
- role
17611
+ role,
17612
+ /* @conditional-compile-remove(raise-hand) */
17613
+ raisedHand: raisedHand
17305
17614
  });
17306
17615
  });
17307
17616
 
@@ -17322,12 +17631,16 @@ const videoGallerySelector = reselect.createSelector([
17322
17631
  /* @conditional-compile-remove(optimal-video-count) */
17323
17632
  getOptimalVideoCount,
17324
17633
  /* @conditional-compile-remove(rooms) */
17325
- getRole
17634
+ getRole,
17635
+ /* @conditional-compile-remove(raise-hand) */
17636
+ getLocalParticipantRaisedHand$1
17326
17637
  ], (screenShareRemoteParticipantId, remoteParticipants, localVideoStreams, isMuted, isScreenSharingOn, displayName, identifier, dominantSpeakers,
17327
17638
  /* @conditional-compile-remove(optimal-video-count) */
17328
17639
  optimalVideoCount,
17329
17640
  /* @conditional-compile-remove(rooms) */
17330
- role) => {
17641
+ role,
17642
+ /* @conditional-compile-remove(raise-hand) */
17643
+ raisedHand) => {
17331
17644
  const screenShareRemoteParticipant = screenShareRemoteParticipantId && remoteParticipants
17332
17645
  ? remoteParticipants[screenShareRemoteParticipantId]
17333
17646
  : undefined;
@@ -17337,11 +17650,15 @@ role) => {
17337
17650
  const noRemoteParticipants = [];
17338
17651
  return {
17339
17652
  screenShareParticipant: screenShareRemoteParticipant
17340
- ? convertRemoteParticipantToVideoGalleryRemoteParticipant(toFlatCommunicationIdentifier(screenShareRemoteParticipant.identifier), screenShareRemoteParticipant.isMuted, checkIsSpeaking(screenShareRemoteParticipant), screenShareRemoteParticipant.videoStreams, screenShareRemoteParticipant.state, screenShareRemoteParticipant.displayName)
17653
+ ? convertRemoteParticipantToVideoGalleryRemoteParticipant(toFlatCommunicationIdentifier(screenShareRemoteParticipant.identifier), screenShareRemoteParticipant.isMuted, checkIsSpeaking(screenShareRemoteParticipant), screenShareRemoteParticipant.videoStreams, screenShareRemoteParticipant.state, screenShareRemoteParticipant.displayName,
17654
+ /* @conditional-compile-remove(raise-hand) */
17655
+ screenShareRemoteParticipant.raisedHand)
17341
17656
  : undefined,
17342
17657
  localParticipant: memoizeLocalParticipant(identifier, displayName, isMuted, isScreenSharingOn, localVideoStream,
17343
17658
  /* @conditional-compile-remove(rooms) */
17344
- role),
17659
+ role,
17660
+ /* @conditional-compile-remove(raise-hand) */
17661
+ raisedHand),
17345
17662
  remoteParticipants: _videoGalleryRemoteParticipantsMemo(updateUserDisplayNamesTrampoline$2(remoteParticipants ? Object.values(remoteParticipants) : noRemoteParticipants)),
17346
17663
  dominantSpeakers: dominantSpeakerIds,
17347
17664
  /* @conditional-compile-remove(optimal-video-count) */
@@ -17374,18 +17691,12 @@ const convertRemoteParticipantToParticipantListParticipant = (userId, displayNam
17374
17691
  /**
17375
17692
  * @private
17376
17693
  */
17377
- const memoizedConvertAllremoteParticipantsBeta = memoizeFnAll((userId, displayName, state, isMuted, isScreenSharing, isSpeaking,
17378
- /* @conditional-compile-remove(raise-hand) */
17379
- raisedHand, localUserCanRemoveOthers) => {
17380
- return convertRemoteParticipantToParticipantListParticipantBeta(userId, displayName, state, isMuted, isScreenSharing, isSpeaking,
17381
- /* @conditional-compile-remove(raise-hand) */ raisedHand, localUserCanRemoveOthers);
17694
+ const memoizedConvertAllremoteParticipantsBeta = memoizeFnAll((userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers) => {
17695
+ return convertRemoteParticipantToParticipantListParticipantBeta(userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers);
17382
17696
  });
17383
17697
  /* @conditional-compile-remove(raise-hand) */
17384
- const convertRemoteParticipantToParticipantListParticipantBeta = (userId, displayName, state, isMuted, isScreenSharing, isSpeaking,
17385
- /* @conditional-compile-remove(raise-hand) */
17386
- raisedHand, localUserCanRemoveOthers) => {
17387
- return Object.assign(Object.assign({}, convertRemoteParticipantToParticipantListParticipant(userId, displayName, state, isMuted, isScreenSharing, isSpeaking, localUserCanRemoveOthers)), {
17388
- /* @conditional-compile-remove(raise-hand) */ raisedHand });
17698
+ const convertRemoteParticipantToParticipantListParticipantBeta = (userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers) => {
17699
+ return Object.assign(Object.assign({}, convertRemoteParticipantToParticipantListParticipant(userId, displayName, state, isMuted, isScreenSharing, isSpeaking, localUserCanRemoveOthers)), { raisedHand });
17389
17700
  };
17390
17701
 
17391
17702
  // Copyright (c) Microsoft Corporation.
@@ -17446,9 +17757,12 @@ const participantListSelector = reselect.createSelector([
17446
17757
  getRemoteParticipants$1,
17447
17758
  getIsScreenSharingOn,
17448
17759
  getIsMuted,
17760
+ /* @conditional-compile-remove(raise-hand) */ getLocalParticipantRaisedHand$1,
17449
17761
  getRole,
17450
17762
  getParticipantCount
17451
- ], (userId, displayName, remoteParticipants, isScreenSharingOn, isMuted, role, partitipantCount) => {
17763
+ ], (userId, displayName, remoteParticipants, isScreenSharingOn, isMuted,
17764
+ /* @conditional-compile-remove(raise-hand) */
17765
+ raisedHand, role, partitipantCount) => {
17452
17766
  const localUserCanRemoveOthers = localUserCanRemoveOthersTrampoline(role);
17453
17767
  const participants = remoteParticipants
17454
17768
  ? convertRemoteParticipantsToParticipantListParticipants(updateUserDisplayNamesTrampoline$1(Object.values(remoteParticipants)), localUserCanRemoveOthers)
@@ -17458,6 +17772,8 @@ const participantListSelector = reselect.createSelector([
17458
17772
  displayName: displayName,
17459
17773
  isScreenSharing: isScreenSharingOn,
17460
17774
  isMuted: isMuted,
17775
+ /* @conditional-compile-remove(raise-hand) */
17776
+ raisedHand: raisedHand,
17461
17777
  state: 'Connected',
17462
17778
  // Local participant can never remove themselves.
17463
17779
  isRemovable: false
@@ -17756,6 +18072,10 @@ const getSelector$1 = (component) => {
17756
18072
  if (component === HoldButton) {
17757
18073
  return findConditionalCompiledSelector(component);
17758
18074
  }
18075
+ /* @conditional-compile-remove(raise-hand) */
18076
+ if (component === RaiseHandButton) {
18077
+ return findConditionalCompiledSelector(component);
18078
+ }
17759
18079
  return findSelector$1(component);
17760
18080
  };
17761
18081
  const findSelector$1 = (component) => {
@@ -17786,11 +18106,15 @@ const findSelector$1 = (component) => {
17786
18106
  }
17787
18107
  return undefined;
17788
18108
  };
17789
- /* @conditional-compile-remove(PSTN-calls) */
18109
+ /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(raise-hand) */
17790
18110
  const findConditionalCompiledSelector = (component) => {
17791
18111
  switch (component) {
17792
18112
  case HoldButton:
17793
18113
  return holdButtonSelector;
18114
+ /* @conditional-compile-remove(raise-hand) */
18115
+ case RaiseHandButton:
18116
+ /* @conditional-compile-remove(raise-hand) */
18117
+ return raiseHandButtonSelector;
17794
18118
  }
17795
18119
  };
17796
18120
 
@@ -19782,7 +20106,15 @@ const COMPOSITE_ONLY_ICONS = {
19782
20106
  /* @conditional-compile-remove(video-background-effects) */
19783
20107
  RemoveVideoBackgroundEffect: React__default['default'].createElement(reactIcons.VideoPerson20Filled, null),
19784
20108
  /* @conditional-compile-remove(gallery-layouts) */
19785
- GalleryOptions: React__default['default'].createElement(reactIcons.Grid20Regular, null)
20109
+ GalleryOptions: React__default['default'].createElement(reactIcons.Grid20Regular, null),
20110
+ /* @conditional-compile-remove(gallery-layouts) */
20111
+ OverflowGalleryTop: React__default['default'].createElement(reactIcons.WindowHeaderHorizontal20Regular, null),
20112
+ /* @conditional-compile-remove(gallery-layouts) */
20113
+ SpeakerGalleryLayout: React__default['default'].createElement(reactIcons.PersonCircle20Regular, null),
20114
+ /* @conditional-compile-remove(gallery-layouts) */
20115
+ DefaultGalleryLayout: React__default['default'].createElement(reactIcons.TableSimple20Regular, null),
20116
+ /* @conditional-compile-remove(gallery-layouts) */
20117
+ FloatingLocalVideoGalleryLayout: React__default['default'].createElement(reactIcons.PictureInPicture20Regular, null)
19786
20118
  };
19787
20119
  /**
19788
20120
  * The default set of icons that are available to used in the Composites.
@@ -19815,7 +20147,7 @@ const CallCompositeIcon = (props) => (React__default['default'].createElement(re
19815
20147
  */
19816
20148
  const CallWithChatCompositeIcon = (props) => (React__default['default'].createElement(react.FontIcon, Object.assign({}, props)));
19817
20149
 
19818
- var call$k={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call {numberOfPeople}",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"What language is being spoken?",captionsSettingsDropdownLabel:"Spoken language",captionsSettingsDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",captionsAvailableLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"Gallery options",moreButtonGalleryPositionToggleLabel:"Move gallery to top"};var chat$k={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$k={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_US = {call:call$k,chat:chat$k,callWithChat:callWithChat$k};
20150
+ var call$k={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call {numberOfPeople}",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"What language is being spoken?",captionsSettingsDropdownLabel:"Spoken language",captionsSettingsDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",captionsAvailableLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"Gallery options",moreButtonGalleryPositionToggleLabel:"Move gallery to top",moreButtonGallerySpeakerLayoutLabel:"Speaker layout",moreButtonGalleryFloatingLocalLayoutLabel:"Dynamic layout",moreButtonGalleryDefaultLayoutLabel:"Gallery layout"};var chat$k={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$k={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_US = {call:call$k,chat:chat$k,callWithChat:callWithChat$k};
19819
20151
 
19820
20152
  var call$j={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call {numberOfPeople}",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"What language is being spoken?",captionsSettingsDropdownLabel:"Spoken language",captionsSettingsDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",captionsAvailableLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"Gallery options",moreButtonGalleryPositionToggleLabel:"Move gallery to top"};var chat$j={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$j={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_GB = {call:call$j,chat:chat$j,callWithChat:callWithChat$j};
19821
20153
 
@@ -21530,10 +21862,16 @@ const ChatScreen = (props) => {
21530
21862
  }
21531
21863
  }), [adapter, fullSizeAttachments]);
21532
21864
  /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
21533
- const handleOnDownloadImage = (blobUrl, filename) => {
21534
- // Place holder function for download handler
21535
- console.log(blobUrl, filename);
21536
- };
21865
+ const onImageDownloadButtonClicked = React.useCallback((imageUrl, saveAsName) => {
21866
+ // Create a new anchor element
21867
+ const a = document.createElement('a');
21868
+ // Set the href and download attributes for the anchor element
21869
+ a.href = imageUrl;
21870
+ a.download = saveAsName || 'download';
21871
+ // Programmatically click the anchor element to trigger the download
21872
+ a.click();
21873
+ a.remove();
21874
+ }, []);
21537
21875
  const AttachFileButton = React.useCallback(() => {
21538
21876
  if (!(fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.uploadHandler)) {
21539
21877
  return null;
@@ -21571,7 +21909,7 @@ const ChatScreen = (props) => {
21571
21909
  /* @conditional-compile-remove(chat-composite-participant-pane) */
21572
21910
  (options === null || options === void 0 ? void 0 : options.participantPane) === true && (React__default['default'].createElement(ChatScreenPeoplePane, { onFetchAvatarPersonaData: onFetchAvatarPersonaData, onFetchParticipantMenuItems: props.onFetchParticipantMenuItems, isMobile: formFactor === 'mobile' }))),
21573
21911
  /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
21574
- galleryImages && galleryImages.length > 0 && (React__default['default'].createElement(ImageGallery, { images: galleryImages, onDismiss: () => setGalleryImages(undefined), onImageDownloadButtonClicked: handleOnDownloadImage }))));
21912
+ galleryImages && galleryImages.length > 0 && (React__default['default'].createElement(ImageGallery, { images: galleryImages, onDismiss: () => setGalleryImages(undefined), onImageDownloadButtonClicked: onImageDownloadButtonClicked }))));
21575
21913
  };
21576
21914
 
21577
21915
  // Copyright (c) Microsoft Corporation.
@@ -21986,7 +22324,7 @@ const disableCallControls = (callControlOptions, disabledControls) => {
21986
22324
  * @returns whether a button is disabled
21987
22325
  * @private
21988
22326
  */
21989
- const isDisabled$2 = (option) => {
22327
+ const isDisabled$3 = (option) => {
21990
22328
  if (option === undefined || typeof option === 'boolean') {
21991
22329
  return false;
21992
22330
  }
@@ -22148,6 +22486,21 @@ const createCompositeHandlers = memoizeOne__default['default']((adapter) => ({
22148
22486
  onRemoveParticipant: (userId) => __awaiter$g(void 0, void 0, void 0, function* () {
22149
22487
  yield adapter.removeParticipant(userId);
22150
22488
  }),
22489
+ /* @conditional-compile-remove(raise-hand) */
22490
+ onRaiseHand: () => __awaiter$g(void 0, void 0, void 0, function* () {
22491
+ yield adapter.raiseHand();
22492
+ }),
22493
+ /* @conditional-compile-remove(raise-hand) */
22494
+ onLowerHand: () => __awaiter$g(void 0, void 0, void 0, function* () {
22495
+ yield adapter.lowerHand();
22496
+ }),
22497
+ /* @conditional-compile-remove(raise-hand) */
22498
+ onToggleRaiseHand: () => __awaiter$g(void 0, void 0, void 0, function* () {
22499
+ var _b;
22500
+ ((_b = adapter.getState().call) === null || _b === void 0 ? void 0 : _b.raiseHand.localParticipantRaisedHand)
22501
+ ? yield adapter.lowerHand()
22502
+ : yield adapter.raiseHand();
22503
+ }),
22151
22504
  onSelectCamera: (deviceInfo, options) => __awaiter$g(void 0, void 0, void 0, function* () {
22152
22505
  yield adapter.setCamera(deviceInfo, options);
22153
22506
  }),
@@ -22171,12 +22524,12 @@ const createCompositeHandlers = memoizeOne__default['default']((adapter) => ({
22171
22524
  isCameraOn(adapter.getState()) ? yield adapter.stopCamera() : yield adapter.startCamera(options);
22172
22525
  }),
22173
22526
  onToggleMicrophone: () => __awaiter$g(void 0, void 0, void 0, function* () {
22174
- var _b;
22175
- return ((_b = adapter.getState().call) === null || _b === void 0 ? void 0 : _b.isMuted) ? yield adapter.unmute() : yield adapter.mute();
22527
+ var _c;
22528
+ return ((_c = adapter.getState().call) === null || _c === void 0 ? void 0 : _c.isMuted) ? yield adapter.unmute() : yield adapter.mute();
22176
22529
  }),
22177
22530
  onToggleScreenShare: () => __awaiter$g(void 0, void 0, void 0, function* () {
22178
- var _c;
22179
- return ((_c = adapter.getState().call) === null || _c === void 0 ? void 0 : _c.isScreenSharingOn)
22531
+ var _d;
22532
+ return ((_d = adapter.getState().call) === null || _d === void 0 ? void 0 : _d.isScreenSharingOn)
22180
22533
  ? yield adapter.stopScreenShare()
22181
22534
  : yield adapter.startScreenShare();
22182
22535
  }),
@@ -22656,6 +23009,11 @@ const getDeviceManager = (state) => state.devices;
22656
23009
  * @private
22657
23010
  */
22658
23011
  const getIsScreenShareOn = (state) => { var _a, _b; return (_b = (_a = state.call) === null || _a === void 0 ? void 0 : _a.isScreenSharingOn) !== null && _b !== void 0 ? _b : false; };
23012
+ /* @conditional-compile-remove(raise-hand) */
23013
+ /**
23014
+ * @private
23015
+ */
23016
+ const getLocalParticipantRaisedHand = (state) => { var _a; return (_a = state.call) === null || _a === void 0 ? void 0 : _a.raiseHand.localParticipantRaisedHand; };
22659
23017
  /**
22660
23018
  * @private
22661
23019
  */
@@ -22763,9 +23121,9 @@ const Participants = (props) => {
22763
23121
  var _a;
22764
23122
  return concatButtonBaseStyles(props.increaseFlyoutItemSize ? participantButtonWithIncreasedTouchTargets : {}, (_a = props.styles) !== null && _a !== void 0 ? _a : {});
22765
23123
  }, [props.increaseFlyoutItemSize, props.styles]);
22766
- return (React__default['default'].createElement(ParticipantsButton, Object.assign({ "data-ui-id": "call-composite-participants-button" }, participantsButtonProps, { showLabel: props.displayType !== 'compact', callInvitationURL: props.callInvitationURL, onFetchParticipantMenuItems: props.onFetchParticipantMenuItems, disabled: isDisabled$1(props.option) || props.disabled, styles: participantsButtonStyles, showParticipantOverflowTooltip: !props.isMobile })));
23124
+ return (React__default['default'].createElement(ParticipantsButton, Object.assign({ "data-ui-id": "call-composite-participants-button" }, participantsButtonProps, { showLabel: props.displayType !== 'compact', callInvitationURL: props.callInvitationURL, onFetchParticipantMenuItems: props.onFetchParticipantMenuItems, disabled: isDisabled$2(props.option) || props.disabled, styles: participantsButtonStyles, showParticipantOverflowTooltip: !props.isMobile })));
22767
23125
  };
22768
- const isDisabled$1 = (option) => {
23126
+ const isDisabled$2 = (option) => {
22769
23127
  if (option === undefined || option === true || option === false) {
22770
23128
  return false;
22771
23129
  }
@@ -22785,13 +23143,13 @@ const ScreenShare = (props) => {
22785
23143
  const screenShareButtonDisabled = () => {
22786
23144
  var _a;
22787
23145
  /* @conditional-compile-remove(capabilities) */ /* @conditional-compile-remove(PSTN-calls) */
22788
- return (_a = screenShareButtonProps === null || screenShareButtonProps === void 0 ? void 0 : screenShareButtonProps.disabled) !== null && _a !== void 0 ? _a : isDisabled(props.option);
23146
+ return (_a = screenShareButtonProps === null || screenShareButtonProps === void 0 ? void 0 : screenShareButtonProps.disabled) !== null && _a !== void 0 ? _a : isDisabled$1(props.option);
22789
23147
  };
22790
23148
  return (React__default['default'].createElement(ScreenShareButton, Object.assign({ "data-ui-id": "call-composite-screenshare-button" }, screenShareButtonProps, { showLabel: props.displayType !== 'compact', disabled: screenShareButtonDisabled() ||
22791
23149
  props.disabled ||
22792
23150
  /* @conditional-compile-remove(rooms) */ (isRoomsCall && ((_a = adapter.getState().call) === null || _a === void 0 ? void 0 : _a.role) === 'Unknown'), styles: styles })));
22793
23151
  };
22794
- const isDisabled = (option) => {
23152
+ const isDisabled$1 = (option) => {
22795
23153
  if (option === undefined || option === true || option === false) {
22796
23154
  return false;
22797
23155
  }
@@ -23026,6 +23384,23 @@ const callArrangementContainerStyles = (verticalControlBar) => {
23026
23384
  };
23027
23385
  };
23028
23386
 
23387
+ // Copyright (c) Microsoft Corporation.
23388
+ /* @conditional-compile-remove(raise-hand) */
23389
+ /** @private */
23390
+ const RaiseHand = (props) => {
23391
+ const raiseHandButtonProps = usePropsFor$1(RaiseHandButton);
23392
+ const styles = React.useMemo(() => { var _a; return concatButtonBaseStyles((_a = props.styles) !== null && _a !== void 0 ? _a : {}); }, [props.styles]);
23393
+ const raiseHandButtonDisabled = isDisabled(props.option);
23394
+ return (React__default['default'].createElement(RaiseHandButton, Object.assign({ "data-ui-id": "call-composite-raisehand-button" }, raiseHandButtonProps, { showLabel: props.displayType !== 'compact', disabled: raiseHandButtonDisabled || props.disabled, styles: styles })));
23395
+ };
23396
+ /* @conditional-compile-remove(raise-hand) */
23397
+ const isDisabled = (option) => {
23398
+ if (option === undefined || option === true || option === false) {
23399
+ return false;
23400
+ }
23401
+ return option.disabled;
23402
+ };
23403
+
23029
23404
  // Copyright (c) Microsoft Corporation.
23030
23405
  // Enforce a background color on control bar to ensure it matches the composite background color.
23031
23406
  const controlBarStyles = react.memoizeFunction((background) => ({ root: { background: background } }));
@@ -23057,6 +23432,8 @@ const CallControls = (props) => {
23057
23432
  }), [localeStrings]);
23058
23433
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
23059
23434
  const holdButtonProps = usePropsFor$1(HoldButton);
23435
+ /* @conditional-compile-remove(raise-hand) */
23436
+ const raiseHandButtonProps = usePropsFor$1(RaiseHandButton);
23060
23437
  /* @conditional-compile-remove(PSTN-calls) */
23061
23438
  const alternateCallerId = useAdapter().getState().alternateCallerId;
23062
23439
  /* @conditional-compile-remove(new-call-control-bar) */
@@ -23075,7 +23452,7 @@ const CallControls = (props) => {
23075
23452
  itemProps: {
23076
23453
  styles: buttonFlyoutIncreasedSizeStyles
23077
23454
  },
23078
- disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.participantsButton),
23455
+ disabled: isDisabled$3(options === null || options === void 0 ? void 0 : options.participantsButton),
23079
23456
  ['data-ui-id']: 'call-composite-more-menu-people-button'
23080
23457
  });
23081
23458
  }
@@ -23091,7 +23468,7 @@ const CallControls = (props) => {
23091
23468
  itemProps: {
23092
23469
  styles: buttonFlyoutIncreasedSizeStyles
23093
23470
  },
23094
- disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.holdButton),
23471
+ disabled: isDisabled$3(options === null || options === void 0 ? void 0 : options.holdButton),
23095
23472
  ['data-ui-id']: 'hold-button'
23096
23473
  });
23097
23474
  }
@@ -23110,6 +23487,26 @@ const CallControls = (props) => {
23110
23487
  }
23111
23488
  });
23112
23489
  }
23490
+ /* @conditional-compile-remove(raise-hand) */
23491
+ if (raiseHandButtonIsEnabled) {
23492
+ items.push({
23493
+ key: 'raiseHandButtonKey',
23494
+ text: raiseHandButtonProps.checked
23495
+ ? localeStrings.component.strings.raiseHandButton.onLabel
23496
+ : localeStrings.component.strings.raiseHandButton.offLabel,
23497
+ onClick: () => {
23498
+ if (raiseHandButtonProps.onToggleRaiseHand) {
23499
+ raiseHandButtonProps.onToggleRaiseHand();
23500
+ }
23501
+ },
23502
+ iconProps: { iconName: 'RaiseHandContextualMenuItem', styles: { root: { lineHeight: 0 } } },
23503
+ itemProps: {
23504
+ styles: buttonFlyoutIncreasedSizeStyles
23505
+ },
23506
+ disabled: isDisabled$3(options === null || options === void 0 ? void 0 : options.raiseHandButton),
23507
+ ['data-ui-id']: 'raise-hand-button'
23508
+ });
23509
+ }
23113
23510
  return items;
23114
23511
  };
23115
23512
  /* @conditional-compile-remove(PSTN-calls) */
@@ -23127,20 +23524,23 @@ const CallControls = (props) => {
23127
23524
  const screenShareButtonIsEnabled = isEnabled$2(options === null || options === void 0 ? void 0 : options.screenShareButton);
23128
23525
  const microphoneButtonIsEnabled = isEnabled$2(options === null || options === void 0 ? void 0 : options.microphoneButton);
23129
23526
  const cameraButtonIsEnabled = isEnabled$2(options === null || options === void 0 ? void 0 : options.cameraButton);
23527
+ /* @conditional-compile-remove(raise-hand) */
23528
+ const raiseHandButtonIsEnabled = isEnabled$2(options === null || options === void 0 ? void 0 : options.raiseHandButton);
23130
23529
  return (React__default['default'].createElement(react.Stack, { horizontalAlign: "center", className: callControlsContainerStyles },
23131
23530
  /* @conditional-compile-remove(PSTN-calls) */
23132
23531
  React__default['default'].createElement(SendDtmfDialpad, { isMobile: !!props.isMobile, strings: dialpadStrings, showDialpad: showDialpad, onDismissDialpad: onDismissDialpad }),
23133
23532
  React__default['default'].createElement(react.Stack.Item, null,
23134
23533
  React__default['default'].createElement(ControlBar, { layout: props.displayVertical ? 'vertical' : 'horizontal', styles: controlBarStyles(theme.semanticColors.bodyBackground) },
23135
- microphoneButtonIsEnabled && (React__default['default'].createElement(Microphone, { displayType: options === null || options === void 0 ? void 0 : options.displayType, disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.microphoneButton) })),
23136
- cameraButtonIsEnabled && (React__default['default'].createElement(Camera, { displayType: options === null || options === void 0 ? void 0 : options.displayType, disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.cameraButton) })),
23137
- screenShareButtonIsEnabled && (React__default['default'].createElement(ScreenShare, { option: options === null || options === void 0 ? void 0 : options.screenShareButton, displayType: options === null || options === void 0 ? void 0 : options.displayType, disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.screenShareButton) })),
23534
+ microphoneButtonIsEnabled && (React__default['default'].createElement(Microphone, { displayType: options === null || options === void 0 ? void 0 : options.displayType, disabled: isDisabled$3(options === null || options === void 0 ? void 0 : options.microphoneButton) })),
23535
+ cameraButtonIsEnabled && (React__default['default'].createElement(Camera, { displayType: options === null || options === void 0 ? void 0 : options.displayType, disabled: isDisabled$3(options === null || options === void 0 ? void 0 : options.cameraButton) })),
23536
+ /* @conditional-compile-remove(raise-hand) */ raiseHandButtonIsEnabled && !props.isMobile && (React__default['default'].createElement(RaiseHand, { displayType: options === null || options === void 0 ? void 0 : options.displayType })),
23537
+ screenShareButtonIsEnabled && (React__default['default'].createElement(ScreenShare, { option: options === null || options === void 0 ? void 0 : options.screenShareButton, displayType: options === null || options === void 0 ? void 0 : options.displayType, disabled: isDisabled$3(options === null || options === void 0 ? void 0 : options.screenShareButton) })),
23138
23538
  isEnabled$2(options === null || options === void 0 ? void 0 : options.participantsButton) &&
23139
23539
  /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(PSTN-calls) */
23140
- !props.isMobile && (React__default['default'].createElement(Participants, { option: options === null || options === void 0 ? void 0 : options.participantsButton, callInvitationURL: props.callInvitationURL, onFetchParticipantMenuItems: props.onFetchParticipantMenuItems, displayType: options === null || options === void 0 ? void 0 : options.displayType, increaseFlyoutItemSize: props.increaseFlyoutItemSize, isMobile: props.isMobile, disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.participantsButton) })) && (
23540
+ !props.isMobile && (React__default['default'].createElement(Participants, { option: options === null || options === void 0 ? void 0 : options.participantsButton, callInvitationURL: props.callInvitationURL, onFetchParticipantMenuItems: props.onFetchParticipantMenuItems, displayType: options === null || options === void 0 ? void 0 : options.displayType, increaseFlyoutItemSize: props.increaseFlyoutItemSize, isMobile: props.isMobile, disabled: isDisabled$3(options === null || options === void 0 ? void 0 : options.participantsButton) })) && (
23141
23541
  /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(PSTN-calls) */
23142
- React__default['default'].createElement(People, { checked: props.peopleButtonChecked, ariaLabel: peopleButtonStrings === null || peopleButtonStrings === void 0 ? void 0 : peopleButtonStrings.label, showLabel: (options === null || options === void 0 ? void 0 : options.displayType) !== 'compact', onClick: props.onPeopleButtonClicked, "data-ui-id": "call-composite-people-button", strings: peopleButtonStrings, disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.participantsButton) })),
23143
- isEnabled$2(options === null || options === void 0 ? void 0 : options.devicesButton) && (React__default['default'].createElement(Devices, { displayType: options === null || options === void 0 ? void 0 : options.displayType, increaseFlyoutItemSize: props.increaseFlyoutItemSize, disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.devicesButton) })),
23542
+ React__default['default'].createElement(People, { checked: props.peopleButtonChecked, ariaLabel: peopleButtonStrings === null || peopleButtonStrings === void 0 ? void 0 : peopleButtonStrings.label, showLabel: (options === null || options === void 0 ? void 0 : options.displayType) !== 'compact', onClick: props.onPeopleButtonClicked, "data-ui-id": "call-composite-people-button", strings: peopleButtonStrings, disabled: isDisabled$3(options === null || options === void 0 ? void 0 : options.participantsButton) })),
23543
+ isEnabled$2(options === null || options === void 0 ? void 0 : options.devicesButton) && (React__default['default'].createElement(Devices, { displayType: options === null || options === void 0 ? void 0 : options.displayType, increaseFlyoutItemSize: props.increaseFlyoutItemSize, disabled: isDisabled$3(options === null || options === void 0 ? void 0 : options.devicesButton) })),
23144
23544
  /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(PSTN-calls) */
23145
23545
  isEnabled$2(options === null || options === void 0 ? void 0 : options.moreButton) && moreButtonContextualMenuItems().length > 0 && (React__default['default'].createElement(MoreButton, { "data-ui-id": "common-call-composite-more-button", strings: moreButtonStrings, menuIconProps: { hidden: true }, menuProps: { items: moreButtonContextualMenuItems() }, showLabel: (options === null || options === void 0 ? void 0 : options.displayType) !== 'compact' })),
23146
23546
  customButtons['primary'],
@@ -23419,13 +23819,67 @@ const DesktopMoreButton = (props) => {
23419
23819
  text: localeStrings.strings.call.moreButtonGalleryControlLabel,
23420
23820
  subMenuProps: {
23421
23821
  items: [
23822
+ {
23823
+ key: 'speakerSelectionKey',
23824
+ text: localeStrings.strings.call.moreButtonGallerySpeakerLayoutLabel,
23825
+ canCheck: true,
23826
+ itemProps: {
23827
+ styles: buttonFlyoutIncreasedSizeStyles
23828
+ },
23829
+ isChecked: props.userSetGalleryLayout === 'speaker',
23830
+ onClick: () => {
23831
+ props.onUserSetGalleryLayout && props.onUserSetGalleryLayout('speaker');
23832
+ },
23833
+ iconProps: {
23834
+ iconName: 'SpeakerGalleryLayout',
23835
+ styles: { root: { lineHeight: 0 } }
23836
+ }
23837
+ },
23838
+ {
23839
+ key: 'dynamicSelectionKey',
23840
+ text: localeStrings.strings.call.moreButtonGalleryFloatingLocalLayoutLabel,
23841
+ canCheck: true,
23842
+ itemProps: {
23843
+ styles: buttonFlyoutIncreasedSizeStyles
23844
+ },
23845
+ isChecked: props.userSetGalleryLayout === 'floatingLocalVideo',
23846
+ onClick: () => {
23847
+ props.onUserSetGalleryLayout && props.onUserSetGalleryLayout('floatingLocalVideo');
23848
+ },
23849
+ iconProps: {
23850
+ iconName: 'FloatingLocalVideoGalleryLayout',
23851
+ styles: { root: { lineHeight: 0 } }
23852
+ }
23853
+ },
23854
+ {
23855
+ key: 'defaultSelectionKey',
23856
+ text: localeStrings.strings.call.moreButtonGalleryDefaultLayoutLabel,
23857
+ canCheck: true,
23858
+ itemProps: {
23859
+ styles: buttonFlyoutIncreasedSizeStyles
23860
+ },
23861
+ isChecked: props.userSetGalleryLayout === 'default',
23862
+ onClick: () => {
23863
+ props.onUserSetGalleryLayout && props.onUserSetGalleryLayout('default');
23864
+ },
23865
+ iconProps: {
23866
+ iconName: 'DefaultGalleryLayout',
23867
+ styles: { root: { lineHeight: 0 } }
23868
+ }
23869
+ },
23870
+ { key: 'dividerLayoutsKey', itemType: react.ContextualMenuItemType.Divider },
23422
23871
  {
23423
23872
  key: 'topKey',
23424
23873
  text: localeStrings.strings.call.moreButtonGalleryPositionToggleLabel,
23425
23874
  canCheck: true,
23875
+ topDivider: true,
23426
23876
  itemProps: {
23427
23877
  styles: buttonFlyoutIncreasedSizeStyles
23428
23878
  },
23879
+ iconProps: {
23880
+ iconName: 'OverflowGalleryTop',
23881
+ styles: { root: { lineHeight: 0 } }
23882
+ },
23429
23883
  isChecked: galleryPositionTop,
23430
23884
  onClick: () => {
23431
23885
  if (galleryPositionTop === false) {
@@ -23630,15 +24084,19 @@ const CommonCallControlBar = (props) => {
23630
24084
  React__default['default'].createElement(ControlBar, { layout: props.displayVertical ? 'vertical' : 'horizontal', styles: centerContainerStyles },
23631
24085
  microphoneButtonIsEnabled && (React__default['default'].createElement(Microphone, { displayType: options.displayType, styles: commonButtonStyles, splitButtonsForDeviceSelection: !props.mobileView,
23632
24086
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
23633
- disabled: props.disableButtonsForHoldScreen || isDisabled$2(options.microphoneButton) })),
24087
+ disabled: props.disableButtonsForHoldScreen || isDisabled$3(options.microphoneButton) })),
23634
24088
  cameraButtonIsEnabled && (React__default['default'].createElement(Camera, { displayType: options.displayType, styles: commonButtonStyles, splitButtonsForDeviceSelection: !props.mobileView,
23635
24089
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
23636
- disabled: props.disableButtonsForHoldScreen || isDisabled$2(options.cameraButton),
24090
+ disabled: props.disableButtonsForHoldScreen || isDisabled$3(options.cameraButton),
23637
24091
  /* @conditional-compile-remove(video-background-effects) */
23638
24092
  onShowVideoEffectsPicker: props.onShowVideoEffectsPicker, componentRef: props.cameraButtonRef })),
24093
+ /* @conditional-compile-remove(raise-hand) */ !props.mobileView &&
24094
+ isEnabled$1(options.raiseHandButton) && (React__default['default'].createElement(RaiseHand, { displayType: options.displayType, styles: commonButtonStyles,
24095
+ /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
24096
+ disabled: props.disableButtonsForHoldScreen || isDisabled$3(options.microphoneButton) })),
23639
24097
  screenShareButtonIsEnabled && (React__default['default'].createElement(ScreenShare, { option: options.screenShareButton, displayType: options.displayType, styles: screenShareButtonStyles,
23640
24098
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
23641
- disabled: props.disableButtonsForHoldScreen || isDisabled$2(options.screenShareButton) })), (_a = customButtons['primary']) === null || _a === void 0 ? void 0 :
24099
+ disabled: props.disableButtonsForHoldScreen || isDisabled$3(options.screenShareButton) })), (_a = customButtons['primary']) === null || _a === void 0 ? void 0 :
23642
24100
  _a.slice(0, props.mobileView
23643
24101
  ? CUSTOM_BUTTON_OPTIONS.MAX_PRIMARY_MOBILE_CUSTOM_BUTTONS
23644
24102
  : CUSTOM_BUTTON_OPTIONS.MAX_PRIMARY_DESKTOP_CUSTOM_BUTTONS).map((CustomButton, i) => {
@@ -23653,14 +24111,20 @@ const CommonCallControlBar = (props) => {
23653
24111
  /* @conditional-compile-remove(close-captions) */
23654
24112
  isCaptionsSupported: props.isCaptionsSupported,
23655
24113
  /* @conditional-compile-remove(close-captions) */
23656
- onCaptionsSettingsClick: openCaptionsSettingsModal, onUserSetOverflowGalleryPositionChange: props.onUserSetOverflowGalleryPositionChange })),
24114
+ onCaptionsSettingsClick: openCaptionsSettingsModal,
24115
+ /* @conditional-compile-remove(gallery-layouts) */
24116
+ onUserSetOverflowGalleryPositionChange: props.onUserSetOverflowGalleryPositionChange,
24117
+ /* @conditional-compile-remove(gallery-layouts) */
24118
+ onUserSetGalleryLayout: props.onUserSetGalleryLayout,
24119
+ /* @conditional-compile-remove(gallery-layouts) */
24120
+ userSetGalleryLayout: props.userSetGalleryLayout })),
23657
24121
  React__default['default'].createElement(EndCall, { displayType: "compact", styles: endCallButtonStyles }))))))),
23658
24122
  !props.mobileView && sideButtonsPresent && (React__default['default'].createElement(react.Stack.Item, null,
23659
24123
  React__default['default'].createElement("div", { ref: sidepaneControlsRef },
23660
24124
  React__default['default'].createElement(react.Stack, { horizontal: true, className: !props.mobileView ? react.mergeStyles(desktopButtonContainerStyle) : undefined },
23661
24125
  isEnabled$1(options === null || options === void 0 ? void 0 : options.peopleButton) && (React__default['default'].createElement(PeopleButton, { checked: props.peopleButtonChecked, ariaLabel: peopleButtonStrings === null || peopleButtonStrings === void 0 ? void 0 : peopleButtonStrings.label, showLabel: options.displayType !== 'compact', onClick: props.onPeopleButtonClicked, "data-ui-id": "common-call-composite-people-button", disabled: props.disableButtonsForLobbyPage ||
23662
24126
  props.disableButtonsForHoldScreen ||
23663
- isDisabled$2(options.peopleButton), strings: peopleButtonStrings, styles: commonButtonStyles, componentRef: props.peopleButtonRef })), (_b = customButtons['secondary']) === null || _b === void 0 ? void 0 :
24127
+ isDisabled$3(options.peopleButton), strings: peopleButtonStrings, styles: commonButtonStyles, componentRef: props.peopleButtonRef })), (_b = customButtons['secondary']) === null || _b === void 0 ? void 0 :
23664
24128
  _b.slice(0, CUSTOM_BUTTON_OPTIONS.MAX_SECONDARY_DESKTOP_CUSTOM_BUTTONS).map((CustomButton, i) => {
23665
24129
  return (React__default['default'].createElement(CustomButton, { key: `secondary-custom-button-${i}`, styles: commonButtonStyles, showLabel: options.displayType !== 'compact' }));
23666
24130
  }))))))));
@@ -23925,6 +24389,8 @@ const MoreDrawer = (props) => {
23925
24389
  const localeStrings = useLocale();
23926
24390
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
23927
24391
  const holdButtonProps = usePropsFor$1(HoldButton);
24392
+ /* @conditional-compile-remove(raise-hand) */
24393
+ const raiseHandButtonProps = usePropsFor$1(RaiseHandButton);
23928
24394
  const onSpeakerItemClick = React.useCallback((_ev, itemKey) => {
23929
24395
  const selected = speakers === null || speakers === void 0 ? void 0 : speakers.find((speaker) => speaker.id === itemKey);
23930
24396
  if (selected) {
@@ -23985,7 +24451,7 @@ const MoreDrawer = (props) => {
23985
24451
  text: mic.name,
23986
24452
  onItemClick: onMicrophoneItemClick,
23987
24453
  secondaryIconProps: isDeviceSelected(mic, props.selectedMicrophone) ? { iconName: 'Accept' } : undefined,
23988
- disabled: drawerSelectionOptions !== false ? isDisabled$2(drawerSelectionOptions.microphoneButton) : undefined
24454
+ disabled: drawerSelectionOptions !== false ? isDisabled$3(drawerSelectionOptions.microphoneButton) : undefined
23989
24455
  })),
23990
24456
  secondaryText: (_b = props.selectedMicrophone) === null || _b === void 0 ? void 0 : _b.name
23991
24457
  });
@@ -23997,14 +24463,14 @@ const MoreDrawer = (props) => {
23997
24463
  text: props.strings.peopleButtonLabel,
23998
24464
  iconProps: { iconName: 'MoreDrawerPeople' },
23999
24465
  onItemClick: props.onPeopleButtonClicked,
24000
- disabled: isDisabled$2(drawerSelectionOptions.peopleButton) || props.disableButtonsForHoldScreen
24466
+ disabled: isDisabled$3(drawerSelectionOptions.peopleButton) || props.disableButtonsForHoldScreen
24001
24467
  });
24002
24468
  }
24003
24469
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
24004
24470
  if (drawerSelectionOptions !== false && isEnabled(drawerSelectionOptions === null || drawerSelectionOptions === void 0 ? void 0 : drawerSelectionOptions.holdButton)) {
24005
24471
  drawerMenuItems.push({
24006
24472
  itemKey: 'holdButtonKey',
24007
- disabled: props.disableButtonsForHoldScreen || isDisabled$2(drawerSelectionOptions.holdButton),
24473
+ disabled: props.disableButtonsForHoldScreen || isDisabled$3(drawerSelectionOptions.holdButton),
24008
24474
  text: localeStrings.component.strings.holdButton.tooltipOffContent,
24009
24475
  onItemClick: () => {
24010
24476
  holdButtonProps.onToggleHold();
@@ -24013,6 +24479,27 @@ const MoreDrawer = (props) => {
24013
24479
  iconProps: { iconName: 'HoldCallContextualMenuItem', styles: { root: { lineHeight: 0 } } }
24014
24480
  });
24015
24481
  }
24482
+ /* @conditional-compile-remove(raise-hand) */
24483
+ if (drawerSelectionOptions !== false && isEnabled(drawerSelectionOptions === null || drawerSelectionOptions === void 0 ? void 0 : drawerSelectionOptions.raiseHandButton)) {
24484
+ const raiseHandIcon = raiseHandButtonProps.checked ? 'LowerHandContextualMenuItem' : 'RaiseHandContextualMenuItem';
24485
+ drawerMenuItems.push({
24486
+ itemKey: 'raiseHandButtonKey',
24487
+ disabled: props.disableButtonsForHoldScreen || isDisabled$3(drawerSelectionOptions.raiseHandButton),
24488
+ text: raiseHandButtonProps.checked
24489
+ ? localeStrings.component.strings.raiseHandButton.onLabel
24490
+ : localeStrings.component.strings.raiseHandButton.offLabel,
24491
+ onItemClick: () => {
24492
+ if (raiseHandButtonProps.onToggleRaiseHand) {
24493
+ raiseHandButtonProps.onToggleRaiseHand();
24494
+ }
24495
+ onLightDismiss();
24496
+ },
24497
+ iconProps: {
24498
+ iconName: raiseHandIcon,
24499
+ styles: { root: { lineHeight: 0 } }
24500
+ }
24501
+ });
24502
+ }
24016
24503
  /*@conditional-compile-remove(PSTN-calls) */
24017
24504
  // dtmf tone sending only works for 1:1 PSTN call
24018
24505
  if (drawerSelectionOptions !== false && props.onClickShowDialpad) {
@@ -25152,14 +25639,18 @@ const LocalAndRemotePIP = (props) => {
25152
25639
  showMuteIndicator: false,
25153
25640
  showCameraSwitcherInLocalPreview: false,
25154
25641
  isAvailable: (_a = localParticipant.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable,
25155
- renderElement: (_b = localParticipant.videoStream) === null || _b === void 0 ? void 0 : _b.renderElement
25642
+ renderElement: (_b = localParticipant.videoStream) === null || _b === void 0 ? void 0 : _b.renderElement,
25643
+ /* @conditional-compile-remove(raise-hand) */
25644
+ raisedHand: localParticipant.raisedHand
25156
25645
  });
25157
25646
  }, [
25158
25647
  localParticipant.displayName,
25159
25648
  (_a = localParticipant.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable,
25160
25649
  (_b = localParticipant.videoStream) === null || _b === void 0 ? void 0 : _b.renderElement,
25161
25650
  onCreateLocalStreamView,
25162
- onDisposeLocalStreamView
25651
+ onDisposeLocalStreamView,
25652
+ /* @conditional-compile-remove(raise-hand) */
25653
+ localParticipant.raisedHand
25163
25654
  ]);
25164
25655
  const remoteVideoTileProps = React.useMemo(() => {
25165
25656
  var _a, _b, _c;
@@ -25246,11 +25737,19 @@ const updateUserDisplayNamesTrampoline = (remoteParticipants) => {
25246
25737
  * Picture in picture in picture needs to display the most-dominant remote speaker, as well as the local participant video.
25247
25738
  * @private
25248
25739
  */
25249
- const localAndRemotePIPSelector = reselect__namespace.createSelector([getDisplayName, dominantRemoteParticipantSelector, localVideoSelector], (displayName, dominantRemoteParticipant, localVideoStreamInfo) => {
25740
+ const localAndRemotePIPSelector = reselect__namespace.createSelector([
25741
+ getDisplayName,
25742
+ dominantRemoteParticipantSelector,
25743
+ localVideoSelector,
25744
+ /* @conditional-compile-remove(raise-hand) */ getLocalParticipantRaisedHand
25745
+ ], (displayName, dominantRemoteParticipant, localVideoStreamInfo,
25746
+ /* @conditional-compile-remove(raise-hand) */ raisedHand) => {
25250
25747
  return {
25251
25748
  localParticipant: {
25252
25749
  displayName,
25253
- videoStream: localVideoStreamInfo
25750
+ videoStream: localVideoStreamInfo,
25751
+ /* @conditional-compile-remove(raise-hand) */
25752
+ raisedHand: raisedHand
25254
25753
  },
25255
25754
  dominantRemoteParticipant
25256
25755
  };
@@ -25551,7 +26050,11 @@ const CallArrangement = (props) => {
25551
26050
  /* @conditional-compile-remove(PSTN-calls) */
25552
26051
  onClickShowDialpad: alternateCallerId ? onClickShowDialpad : undefined, displayVertical: verticalControlBar,
25553
26052
  /* @conditional-compile-remove(gallery-layouts) */
25554
- onUserSetOverflowGalleryPositionChange: props.onUserSetOverflowGalleryPositionChange, peopleButtonRef: peopleButtonRef, cameraButtonRef: cameraButtonRef }))))),
26053
+ onUserSetOverflowGalleryPositionChange: props.onUserSetOverflowGalleryPositionChange,
26054
+ /* @conditional-compile-remove(gallery-layouts) */
26055
+ onUserSetGalleryLayout: props.onUserSetGalleryLayoutChange,
26056
+ /* @conditional-compile-remove(gallery-layouts) */
26057
+ userSetGalleryLayout: props.userSetGalleryLayout, peopleButtonRef: peopleButtonRef, cameraButtonRef: cameraButtonRef }))))),
25555
26058
  ((_e = props.callControlProps) === null || _e === void 0 ? void 0 : _e.options) !== false && showDrawer && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStylesValue },
25556
26059
  React__default['default'].createElement(PreparedMoreDrawer, { callControls: props.callControlProps.options, onLightDismiss: closeDrawer, onPeopleButtonClicked: onMoreDrawerPeopleClicked,
25557
26060
  /* @conditional-compile-remove(PSTN-calls) */
@@ -25581,7 +26084,7 @@ const CallArrangement = (props) => {
25581
26084
  maxWidth: isVideoPaneOpen ? `${VIDEO_EFFECTS_SIDE_PANE_WIDTH_REM}rem` : undefined, updateSidePaneRenderer: props.updateSidePaneRenderer, onPeopleButtonClicked: props.mobileView && !shouldShowPeopleTabHeaderButton(props.callControlProps.options)
25582
26085
  ? undefined
25583
26086
  : togglePeoplePane, disablePeopleButton: typeof props.callControlProps.options !== 'boolean' &&
25584
- isDisabled$2((_g = props.callControlProps.options) === null || _g === void 0 ? void 0 : _g.participantsButton), onChatButtonClicked: (_h = props.mobileChatTabHeader) === null || _h === void 0 ? void 0 : _h.onClick, disableChatButton: (_j = props.mobileChatTabHeader) === null || _j === void 0 ? void 0 : _j.disabled }),
26087
+ isDisabled$3((_g = props.callControlProps.options) === null || _g === void 0 ? void 0 : _g.participantsButton), onChatButtonClicked: (_h = props.mobileChatTabHeader) === null || _h === void 0 ? void 0 : _h.onClick, disableChatButton: (_j = props.mobileChatTabHeader) === null || _j === void 0 ? void 0 : _j.disabled }),
25585
26088
  props.mobileView && (React__default['default'].createElement(ModalLocalAndRemotePIP, { modalLayerHostId: props.modalLayerHostId, hidden: !isSidePaneOpen, styles: pipStyles, minDragPosition: minMaxDragPosition.minDragPosition, maxDragPosition: minMaxDragPosition.maxDragPosition })),
25586
26089
  drawerMenuItems.length > 0 && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStyles() },
25587
26090
  React__default['default'].createElement(_DrawerMenu, { onLightDismiss: () => setDrawerMenuItems([]), items: drawerMenuItems }))))))));
@@ -25802,20 +26305,27 @@ const MediaGallery = (props) => {
25802
26305
  ? { kind: 'drawer', hostId: props.drawerMenuHostId }
25803
26306
  : { kind: 'contextual' };
25804
26307
  }, [(_c = props.remoteVideoTileMenuOptions) === null || _c === void 0 ? void 0 : _c.isHidden, props.isMobile, props.drawerMenuHostId]);
25805
- /* @conditional-compile-remove(vertical-gallery) */ /* @conditional-compile-remove(gallery-layouts) */
26308
+ /* @conditional-compile-remove(vertical-gallery) */
25806
26309
  const overflowGalleryPosition = React.useMemo(() => {
25807
- if (props.userSetOverflowGalleryPosition === 'Responsive') {
25808
- return containerWidth && containerHeight && containerWidth / containerHeight >= 16 / 9
25809
- ? 'VerticalRight'
25810
- : 'HorizontalBottom';
25811
- }
25812
- else {
26310
+ /* @conditional-compile-remove(gallery-layouts) */
26311
+ if (props.userSetOverflowGalleryPosition === 'HorizontalTop') {
25813
26312
  return props.userSetOverflowGalleryPosition;
25814
26313
  }
25815
- }, [props.userSetOverflowGalleryPosition, containerWidth, containerHeight]);
26314
+ return containerWidth && containerHeight && containerWidth / containerHeight >= 16 / 9
26315
+ ? 'VerticalRight'
26316
+ : 'HorizontalBottom';
26317
+ }, [
26318
+ /* @conditional-compile-remove(gallery-layouts) */ props.userSetOverflowGalleryPosition,
26319
+ containerWidth,
26320
+ containerHeight
26321
+ ]);
25816
26322
  const VideoGalleryMemoized = React.useMemo(() => {
25817
26323
  var _a;
25818
- return (React__default['default'].createElement(VideoGallery, Object.assign({}, videoGalleryProps, { localVideoViewOptions: localVideoViewOptions$2, remoteVideoViewOptions: remoteVideoViewOptions, styles: VideoGalleryStyles, layout: layoutBasedOnTilePosition, showCameraSwitcherInLocalPreview: props.isMobile, localVideoCameraCycleButtonProps: cameraSwitcherProps, onRenderAvatar: (_a = props.onRenderAvatar) !== null && _a !== void 0 ? _a : onRenderAvatar,
26324
+ const layoutBasedOnUserSelection = () => {
26325
+ /* @conditional-compile-remove(gallery-layouts) */
26326
+ return props.localVideoTileOptions ? layoutBasedOnTilePosition : props.userSetGalleryLayout;
26327
+ };
26328
+ return (React__default['default'].createElement(VideoGallery, Object.assign({}, videoGalleryProps, { localVideoViewOptions: localVideoViewOptions$2, remoteVideoViewOptions: remoteVideoViewOptions, styles: VideoGalleryStyles, layout: layoutBasedOnUserSelection(), showCameraSwitcherInLocalPreview: props.isMobile, localVideoCameraCycleButtonProps: cameraSwitcherProps, onRenderAvatar: (_a = props.onRenderAvatar) !== null && _a !== void 0 ? _a : onRenderAvatar,
25819
26329
  /* @conditional-compile-remove(pinned-participants) */
25820
26330
  remoteVideoTileMenuOptions: remoteVideoTileMenuOptions,
25821
26331
  /* @conditional-compile-remove(vertical-gallery) */
@@ -25828,7 +26338,6 @@ const MediaGallery = (props) => {
25828
26338
  : '16:9' })));
25829
26339
  }, [
25830
26340
  videoGalleryProps,
25831
- layoutBasedOnTilePosition,
25832
26341
  props.isMobile,
25833
26342
  props.onRenderAvatar,
25834
26343
  /* @conditional-compile-remove(rooms) */
@@ -25844,7 +26353,10 @@ const MediaGallery = (props) => {
25844
26353
  /* @conditional-compile-remove(rooms) */
25845
26354
  isRoomsCall,
25846
26355
  /* @conditional-compile-remove(vertical-gallery) */
25847
- containerAspectRatio
26356
+ containerAspectRatio,
26357
+ /* @conditional-compile-remove(gallery-layouts) */
26358
+ props.userSetGalleryLayout,
26359
+ layoutBasedOnTilePosition
25848
26360
  ]);
25849
26361
  return (React__default['default'].createElement("div", { ref: containerRef, style: mediaGalleryContainerStyles },
25850
26362
  React__default['default'].createElement(Announcer$1, { announcementString: announcerString, ariaLive: 'polite' }),
@@ -26057,7 +26569,9 @@ const networkReconnectTileSelector = reselect__namespace.createSelector([getUser
26057
26569
  * @private
26058
26570
  */
26059
26571
  const CallPage = (props) => {
26060
- const { callInvitationURL, onRenderAvatar, onFetchAvatarPersonaData, onFetchParticipantMenuItems, options, mobileView } = props;
26572
+ const { callInvitationURL, onRenderAvatar, onFetchAvatarPersonaData, onFetchParticipantMenuItems, options, mobileView,
26573
+ /* @conditional-compile-remove(gallery-layouts) */
26574
+ galleryLayout = 'floatingLocalVideo' } = props;
26061
26575
  // To use useProps to get these states, we need to create another file wrapping Call,
26062
26576
  // It seems unnecessary in this case, so we get the updated states using this approach.
26063
26577
  const { callStatus } = useSelector$1(callStatusSelector);
@@ -26073,6 +26587,8 @@ const CallPage = (props) => {
26073
26587
  const drawerMenuHostId = reactHooks.useId('drawerMenuHost');
26074
26588
  /* @conditional-compile-remove(gallery-layouts) */
26075
26589
  const [userSetOverflowGalleryPosition, setUserSetOverflowGalleryPosition] = React.useState('Responsive');
26590
+ /* @conditional-compile-remove(gallery-layouts) */
26591
+ const [userSetGalleryLayout, setUserSetGalleryLayout] = React.useState(galleryLayout);
26076
26592
  return (React__default['default'].createElement(CallArrangement, { id: drawerMenuHostId, complianceBannerProps: Object.assign(Object.assign({}, complianceBannerProps), { strings }), errorBarProps: (options === null || options === void 0 ? void 0 : options.errorBar) !== false && errorBarProps, mutedNotificationProps: mutedNotificationProps, callControlProps: {
26077
26593
  callInvitationURL: callInvitationURL,
26078
26594
  onFetchParticipantMenuItems: onFetchParticipantMenuItems,
@@ -26086,9 +26602,15 @@ const CallPage = (props) => {
26086
26602
  /* @conditional-compile-remove(click-to-call) */
26087
26603
  localVideoTileOptions: options === null || options === void 0 ? void 0 : options.localVideoTile,
26088
26604
  /* @conditional-compile-remove(gallery-layouts) */
26089
- userSetOverflowGalleryPosition: userSetOverflowGalleryPosition }))) : (React__default['default'].createElement(NetworkReconnectTile, Object.assign({}, networkReconnectTileProps)))) : (React__default['default'].createElement(React__default['default'].Fragment, null)), updateSidePaneRenderer: props.updateSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, dataUiId: 'call-page', latestErrors: props.latestErrors, onDismissError: props.onDismissError,
26605
+ userSetOverflowGalleryPosition: userSetOverflowGalleryPosition,
26606
+ /* @conditional-compile-remove(gallery-layouts) */
26607
+ userSetGalleryLayout: userSetGalleryLayout }))) : (React__default['default'].createElement(NetworkReconnectTile, Object.assign({}, networkReconnectTileProps)))) : (React__default['default'].createElement(React__default['default'].Fragment, null)), updateSidePaneRenderer: props.updateSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, dataUiId: 'call-page', latestErrors: props.latestErrors, onDismissError: props.onDismissError,
26608
+ /* @conditional-compile-remove(gallery-layouts) */
26609
+ onUserSetOverflowGalleryPositionChange: setUserSetOverflowGalleryPosition,
26610
+ /* @conditional-compile-remove(gallery-layouts) */
26611
+ onUserSetGalleryLayoutChange: setUserSetGalleryLayout,
26090
26612
  /* @conditional-compile-remove(gallery-layouts) */
26091
- onUserSetOverflowGalleryPositionChange: setUserSetOverflowGalleryPosition }));
26613
+ userSetGalleryLayout: userSetGalleryLayout }));
26092
26614
  };
26093
26615
  /**
26094
26616
  * @private
@@ -27663,7 +28185,7 @@ const isShowing = (overrideSidePane) => {
27663
28185
  return !!(overrideSidePane === null || overrideSidePane === void 0 ? void 0 : overrideSidePane.isActive);
27664
28186
  };
27665
28187
  const MainScreen = (props) => {
27666
- var _a, _b, _c, _d, _e;
28188
+ var _a, _b, _c, _d, _e, _f, _g;
27667
28189
  const adapter = useAdapter();
27668
28190
  const { camerasCount, microphonesCount } = useSelector$1(deviceCountSelector);
27669
28191
  const hasCameras = camerasCount > 0;
@@ -27767,7 +28289,9 @@ const MainScreen = (props) => {
27767
28289
  pageElement = (React__default['default'].createElement(TransferPage, { mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, onRenderAvatar: onRenderAvatar, onFetchAvatarPersonaData: onFetchAvatarPersonaData, latestErrors: latestErrors, onDismissError: onDismissError }));
27768
28290
  break;
27769
28291
  case 'call':
27770
- pageElement = (React__default['default'].createElement(CallPage, { onRenderAvatar: onRenderAvatar, callInvitationURL: callInvitationUrl, onFetchAvatarPersonaData: onFetchAvatarPersonaData, onFetchParticipantMenuItems: onFetchParticipantMenuItems, mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, latestErrors: latestErrors, onDismissError: onDismissError }));
28292
+ pageElement = (React__default['default'].createElement(CallPage, { onRenderAvatar: onRenderAvatar, callInvitationURL: callInvitationUrl, onFetchAvatarPersonaData: onFetchAvatarPersonaData, onFetchParticipantMenuItems: onFetchParticipantMenuItems, mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, latestErrors: latestErrors, onDismissError: onDismissError,
28293
+ /* @conditional-compile-remove(gallery-layouts) */
28294
+ galleryLayout: ((_f = (_e = props.options) === null || _e === void 0 ? void 0 : _e.galleryOptions) === null || _f === void 0 ? void 0 : _f.layout) ? props.options.galleryOptions.layout : 'floatingLocalVideo' }));
27771
28295
  break;
27772
28296
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
27773
28297
  case 'hold':
@@ -27779,7 +28303,7 @@ const MainScreen = (props) => {
27779
28303
  case 'unsupportedEnvironment':
27780
28304
  pageElement = (React__default['default'].createElement(React__default['default'].Fragment, null,
27781
28305
  /* @conditional-compile-remove(unsupported-browser) */
27782
- React__default['default'].createElement(UnsupportedBrowserPage, { onTroubleshootingClick: (_e = props.options) === null || _e === void 0 ? void 0 : _e.onEnvironmentInfoTroubleshootingClick, environmentInfo: adapter.getState().environmentInfo })));
28306
+ React__default['default'].createElement(UnsupportedBrowserPage, { onTroubleshootingClick: (_g = props.options) === null || _g === void 0 ? void 0 : _g.onEnvironmentInfoTroubleshootingClick, environmentInfo: adapter.getState().environmentInfo })));
27783
28307
  break;
27784
28308
  }
27785
28309
  if (!pageElement) {
@@ -28323,6 +28847,10 @@ class AzureCommunicationCallAdapter {
28323
28847
  this.startCall.bind(this);
28324
28848
  this.startScreenShare.bind(this);
28325
28849
  this.stopScreenShare.bind(this);
28850
+ /* @conditional-compile-remove(raise-hand) */
28851
+ this.raiseHand.bind(this);
28852
+ /* @conditional-compile-remove(raise-hand) */
28853
+ this.lowerHand.bind(this);
28326
28854
  this.removeParticipant.bind(this);
28327
28855
  this.createStreamView.bind(this);
28328
28856
  this.disposeStreamView.bind(this);
@@ -28635,6 +29163,22 @@ class AzureCommunicationCallAdapter {
28635
29163
  }));
28636
29164
  });
28637
29165
  }
29166
+ /* @conditional-compile-remove(raise-hand) */
29167
+ raiseHand() {
29168
+ return __awaiter$5(this, void 0, void 0, function* () {
29169
+ return yield this.asyncTeeErrorToEventEmitter(() => __awaiter$5(this, void 0, void 0, function* () {
29170
+ yield this.handlers.onToggleRaiseHand();
29171
+ }));
29172
+ });
29173
+ }
29174
+ /* @conditional-compile-remove(raise-hand) */
29175
+ lowerHand() {
29176
+ return __awaiter$5(this, void 0, void 0, function* () {
29177
+ return yield this.asyncTeeErrorToEventEmitter(() => __awaiter$5(this, void 0, void 0, function* () {
29178
+ yield this.handlers.onToggleRaiseHand();
29179
+ }));
29180
+ });
29181
+ }
28638
29182
  /* @conditional-compile-remove(unsupported-browser) */
28639
29183
  allowUnsupportedBrowserVersion() {
28640
29184
  this.context.setAllowedUnsupportedBrowser();
@@ -29315,6 +29859,10 @@ class CallWithChatBackedCallAdapter {
29315
29859
  this.unmute = () => __awaiter$4(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.unmute(); });
29316
29860
  this.startScreenShare = () => __awaiter$4(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.startScreenShare(); });
29317
29861
  this.stopScreenShare = () => __awaiter$4(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.stopScreenShare(); });
29862
+ /* @conditional-compile-remove(raise-hand) */
29863
+ this.raiseHand = () => __awaiter$4(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.raiseHand(); });
29864
+ /* @conditional-compile-remove(raise-hand) */
29865
+ this.lowerHand = () => __awaiter$4(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.lowerHand(); });
29318
29866
  this.removeParticipant = (userId) => __awaiter$4(this, void 0, void 0, function* () {
29319
29867
  let participant = userId;
29320
29868
  /* @conditional-compile-remove(PSTN-calls) */
@@ -29800,7 +30348,9 @@ const CallWithChatScreen = (props) => {
29800
30348
  /* @conditional-compile-remove(call-readiness) */
29801
30349
  onPermissionsTroubleshootingClick: props.onPermissionsTroubleshootingClick,
29802
30350
  /* @conditional-compile-remove(unsupported-browser) */
29803
- onEnvironmentInfoTroubleshootingClick: props.onEnvironmentInfoTroubleshootingClick
30351
+ onEnvironmentInfoTroubleshootingClick: props.onEnvironmentInfoTroubleshootingClick,
30352
+ /* @conditional-compile-remove(gallery-layouts) */
30353
+ galleryOptions: props.galleryOptions
29804
30354
  }), [
29805
30355
  props.callControls,
29806
30356
  callControlOptionsFromProps,
@@ -29814,7 +30364,9 @@ const CallWithChatScreen = (props) => {
29814
30364
  /* @conditional-compile-remove(call-readiness) */
29815
30365
  props.onNetworkingTroubleShootingClick,
29816
30366
  /* @conditional-compile-remove(call-readiness) */
29817
- props.onPermissionsTroubleshootingClick
30367
+ props.onPermissionsTroubleshootingClick,
30368
+ /* @conditional-compile-remove(gallery-layouts) */
30369
+ props.galleryOptions
29818
30370
  ]);
29819
30371
  const onRenderChatContent = React.useCallback(() => (React__default['default'].createElement(ChatComposite, Object.assign({}, chatProps, { fluentTheme: theme, options: {
29820
30372
  topic: false,
@@ -29885,7 +30437,7 @@ const checkShowChatButton = (callControls) => {
29885
30437
  return callControls.chatButton !== false;
29886
30438
  };
29887
30439
  const checkChatButtonIsDisabled = (callControls) => {
29888
- return typeof callControls === 'object' && isDisabled$2(callControls === null || callControls === void 0 ? void 0 : callControls.chatButton);
30440
+ return typeof callControls === 'object' && isDisabled$3(callControls === null || callControls === void 0 ? void 0 : callControls.chatButton);
29889
30441
  };
29890
30442
  const isOnHoldTrampoline = (page) => {
29891
30443
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
@@ -30093,6 +30645,10 @@ class AzureCommunicationCallWithChatAdapter {
30093
30645
  this.unmute.bind(this);
30094
30646
  this.startScreenShare.bind(this);
30095
30647
  this.stopScreenShare.bind(this);
30648
+ /* @conditional-compile-remove(raise-hand) */
30649
+ this.raiseHand.bind(this);
30650
+ /* @conditional-compile-remove(raise-hand) */
30651
+ this.lowerHand.bind(this);
30096
30652
  this.removeParticipant.bind(this);
30097
30653
  this.createStreamView.bind(this);
30098
30654
  this.disposeStreamView.bind(this);
@@ -30278,6 +30834,20 @@ class AzureCommunicationCallWithChatAdapter {
30278
30834
  yield this.callAdapter.stopScreenShare();
30279
30835
  });
30280
30836
  }
30837
+ /* @conditional-compile-remove(raise-hand) */
30838
+ /** Raise hand for local user. */
30839
+ raiseHand() {
30840
+ return __awaiter$2(this, void 0, void 0, function* () {
30841
+ yield this.callAdapter.raiseHand();
30842
+ });
30843
+ }
30844
+ /* @conditional-compile-remove(raise-hand) */
30845
+ /** Lower hand for local user. */
30846
+ lowerHand() {
30847
+ return __awaiter$2(this, void 0, void 0, function* () {
30848
+ yield this.callAdapter.lowerHand();
30849
+ });
30850
+ }
30281
30851
  /** Create a stream view for a remote participants video feed. */
30282
30852
  createStreamView(remoteUserId, options) {
30283
30853
  return __awaiter$2(this, void 0, void 0, function* () {
@@ -30936,6 +31506,7 @@ exports.MicrophoneSitePermissions = MicrophoneSitePermissions;
30936
31506
  exports.ParticipantItem = ParticipantItem;
30937
31507
  exports.ParticipantList = ParticipantList;
30938
31508
  exports.ParticipantsButton = ParticipantsButton;
31509
+ exports.RaiseHandButton = RaiseHandButton;
30939
31510
  exports.ScreenShareButton = ScreenShareButton;
30940
31511
  exports.SendBox = SendBox;
30941
31512
  exports.StreamMedia = StreamMedia;