@azure/communication-react 1.12.1-alpha-202401190013 → 1.12.1-alpha-202401230013

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 (49) hide show
  1. package/dist/communication-react.d.ts +30 -0
  2. package/dist/dist-cjs/communication-react/index.js +146 -62
  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/participantListSelector.js +22 -6
  7. package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js.map +1 -1
  8. package/dist/dist-esm/calling-component-bindings/src/utils/participantListSelectorUtils.d.ts +7 -1
  9. package/dist/dist-esm/calling-component-bindings/src/utils/participantListSelectorUtils.js +15 -4
  10. package/dist/dist-esm/calling-component-bindings/src/utils/participantListSelectorUtils.js.map +1 -1
  11. package/dist/dist-esm/communication-react/src/index.d.ts +1 -0
  12. package/dist/dist-esm/communication-react/src/index.js.map +1 -1
  13. package/dist/dist-esm/react-components/src/components/LocalVideoTile.d.ts +1 -0
  14. package/dist/dist-esm/react-components/src/components/LocalVideoTile.js +31 -8
  15. package/dist/dist-esm/react-components/src/components/LocalVideoTile.js.map +1 -1
  16. package/dist/dist-esm/react-components/src/components/ParticipantList.js +2 -1
  17. package/dist/dist-esm/react-components/src/components/ParticipantList.js.map +1 -1
  18. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.d.ts +1 -0
  19. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js +5 -2
  20. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js.map +1 -1
  21. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.js +14 -10
  22. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.js.map +1 -1
  23. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js +4 -2
  24. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js.map +1 -1
  25. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js +4 -2
  26. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js.map +1 -1
  27. package/dist/dist-esm/react-components/src/components/VideoGallery/Layout.d.ts +4 -0
  28. package/dist/dist-esm/react-components/src/components/VideoGallery/Layout.js.map +1 -1
  29. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.d.ts +1 -0
  30. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js +20 -14
  31. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js.map +1 -1
  32. package/dist/dist-esm/react-components/src/components/VideoGallery.d.ts +4 -0
  33. package/dist/dist-esm/react-components/src/components/VideoGallery.js +25 -8
  34. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  35. package/dist/dist-esm/react-components/src/components/VideoTile.d.ts +4 -0
  36. package/dist/dist-esm/react-components/src/components/VideoTile.js +8 -3
  37. package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
  38. package/dist/dist-esm/react-components/src/index.d.ts +1 -0
  39. package/dist/dist-esm/react-components/src/index.js.map +1 -1
  40. package/dist/dist-esm/react-components/src/theming/icons.d.ts +2 -0
  41. package/dist/dist-esm/react-components/src/theming/icons.js +7 -1
  42. package/dist/dist-esm/react-components/src/theming/icons.js.map +1 -1
  43. package/dist/dist-esm/react-components/src/types/ParticipantListParticipant.d.ts +17 -0
  44. package/dist/dist-esm/react-components/src/types/ParticipantListParticipant.js.map +1 -1
  45. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/Reaction.js +1 -1
  46. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/Reaction.js.map +1 -1
  47. package/dist/dist-esm/react-composites/src/composites/common/icons.d.ts +2 -0
  48. package/dist/tsdoc-metadata.json +1 -1
  49. package/package.json +10 -10
@@ -2528,6 +2528,12 @@ export declare type CallParticipantListParticipant = ParticipantListParticipant
2528
2528
  * @beta
2529
2529
  * */
2530
2530
  reaction?: Reaction;
2531
+ /**
2532
+ * Whether calling participant is spotlighted
2533
+ *
2534
+ * @beta
2535
+ * */
2536
+ isSpotlighted?: Spotlight;
2531
2537
  };
2532
2538
 
2533
2539
  /**
@@ -6047,6 +6053,7 @@ export declare const DEFAULT_COMPONENT_ICONS: {
6047
6053
  ParticipantItemOptions: React_2.JSX.Element;
6048
6054
  ParticipantItemOptionsHovered: React_2.JSX.Element;
6049
6055
  ParticipantItemScreenShareStart: React_2.JSX.Element;
6056
+ ParticipantItemSpotlighted: React_2.JSX.Element;
6050
6057
  HoldCallContextualMenuItem: React_2.JSX.Element;
6051
6058
  HoldCallButton: React_2.JSX.Element;
6052
6059
  ResumeCall: React_2.JSX.Element;
@@ -6085,6 +6092,7 @@ export declare const DEFAULT_COMPONENT_ICONS: {
6085
6092
  ContextMenuSpeakerIcon: React_2.JSX.Element;
6086
6093
  SurveyStarIcon: React_2.JSX.Element;
6087
6094
  SurveyStarIconFilled: React_2.JSX.Element;
6095
+ VideoSpotlighted: React_2.JSX.Element;
6088
6096
  };
6089
6097
 
6090
6098
  /**
@@ -6193,6 +6201,7 @@ export declare const DEFAULT_COMPOSITE_ICONS: {
6193
6201
  ErrorBarCallVideoRecoveredBySystem: React_2.JSX.Element;
6194
6202
  ErrorBarCallVideoStoppedBySystem: React_2.JSX.Element;
6195
6203
  MessageResend: React_2.JSX.Element;
6204
+ ParticipantItemSpotlighted: React_2.JSX.Element;
6196
6205
  HoldCallContextualMenuItem: React_2.JSX.Element;
6197
6206
  HoldCallButton: React_2.JSX.Element;
6198
6207
  ResumeCall: React_2.JSX.Element;
@@ -6228,6 +6237,7 @@ export declare const DEFAULT_COMPOSITE_ICONS: {
6228
6237
  ContextMenuSpeakerIcon: React_2.JSX.Element;
6229
6238
  SurveyStarIcon: React_2.JSX.Element;
6230
6239
  SurveyStarIconFilled: React_2.JSX.Element;
6240
+ VideoSpotlighted: React_2.JSX.Element;
6231
6241
  };
6232
6242
 
6233
6243
  /**
@@ -9559,6 +9569,18 @@ export declare interface SpokenLanguageStrings {
9559
9569
  'zh-tw': string;
9560
9570
  }
9561
9571
 
9572
+ /**
9573
+ * Spotlight state with order
9574
+ *
9575
+ * @beta
9576
+ */
9577
+ export declare type Spotlight = {
9578
+ /**
9579
+ * Specifies the order position of the spotlight
9580
+ */
9581
+ spotlightOrderPosition?: number;
9582
+ };
9583
+
9562
9584
  /**
9563
9585
  * State only version of {@link @azure/communication-calling#SpotlightCallFeature}
9564
9586
  *
@@ -10758,6 +10780,10 @@ export declare interface VideoGalleryProps {
10758
10780
  * This callback will be called when a participant video tile is un-pinned.
10759
10781
  */
10760
10782
  onUnpinParticipant?: (userId: string) => void;
10783
+ /**
10784
+ * List of spotlighted participant userIds.
10785
+ */
10786
+ spotlightedParticipants?: string[];
10761
10787
  /**
10762
10788
  * Options for showing the remote video tile menu.
10763
10789
  *
@@ -11057,6 +11083,10 @@ export declare interface VideoTileProps {
11057
11083
  * Callback triggered by video tile on touch and hold.
11058
11084
  */
11059
11085
  onLongTouch?: () => void;
11086
+ /**
11087
+ * If true, the video tile will show the spotlighted icon.
11088
+ */
11089
+ isSpotlighted?: boolean;
11060
11090
  }
11061
11091
 
11062
11092
  /**
@@ -170,7 +170,7 @@ function getDefaultExportFromCjs (x) {
170
170
  // Copyright (c) Microsoft Corporation.
171
171
  // Licensed under the MIT License.
172
172
  // GENERATED FILE. DO NOT EDIT MANUALLY.
173
- var telemetryVersion = '1.12.1-alpha-202401190013';
173
+ var telemetryVersion = '1.12.1-alpha-202401230013';
174
174
 
175
175
 
176
176
  var telemetryVersion$1 = /*@__PURE__*/getDefaultExportFromCjs(telemetryVersion);
@@ -6408,6 +6408,8 @@ const DEFAULT_COMPONENT_ICONS = {
6408
6408
  ParticipantItemOptions: React.createElement(React.Fragment, null),
6409
6409
  ParticipantItemOptionsHovered: React.createElement(reactIcons.MoreHorizontal20Filled, null),
6410
6410
  ParticipantItemScreenShareStart: React.createElement(reactIcons.ShareScreenStart20Filled, null),
6411
+ /* @conditional-compile-remove(spotlight) */
6412
+ ParticipantItemSpotlighted: React.createElement(reactIcons.VideoPersonStar20Filled, null),
6411
6413
  /* @conditional-compile-remove(PSTN-calls) */
6412
6414
  HoldCallContextualMenuItem: React.createElement(reactIcons.CallPause20Regular, null),
6413
6415
  /* @conditional-compile-remove(PSTN-calls) */
@@ -6473,7 +6475,9 @@ const DEFAULT_COMPONENT_ICONS = {
6473
6475
  /* @conditional-compile-remove(end-of-call-survey) */
6474
6476
  SurveyStarIcon: React.createElement(reactIcons.Star28Regular, null),
6475
6477
  /* @conditional-compile-remove(end-of-call-survey) */
6476
- SurveyStarIconFilled: React.createElement(reactIcons.Star28Filled, null)
6478
+ SurveyStarIconFilled: React.createElement(reactIcons.Star28Filled, null),
6479
+ /* @conditional-compile-remove(spotlight) */
6480
+ VideoSpotlighted: React.createElement(reactIcons.VideoPersonStar20Filled, { style: { height: '16px', width: '16px' } })
6477
6481
  };
6478
6482
 
6479
6483
  // Copyright (c) Microsoft Corporation.
@@ -12341,7 +12345,8 @@ const onRenderParticipantDefault = (participant, strings, myUserId, onRenderAvat
12341
12345
  React.createElement(react.Stack.Item, null,
12342
12346
  React.createElement(RaisedHandIcon, null)))),
12343
12347
  callingParticipant.isScreenSharing && (React.createElement(react.Icon, { iconName: "ParticipantItemScreenShareStart", className: iconStyles$2, ariaLabel: strings.sharingIconLabel })),
12344
- callingParticipant.isMuted && (React.createElement(react.Icon, { iconName: "ParticipantItemMicOff", className: iconStyles$2, ariaLabel: strings.mutedIconLabel }))));
12348
+ callingParticipant.isMuted && (React.createElement(react.Icon, { iconName: "ParticipantItemMicOff", className: iconStyles$2, ariaLabel: strings.mutedIconLabel })),
12349
+ /* @conditional-compile-remove(spotlight) */ callingParticipant.isSpotlighted && (React.createElement(react.Icon, { iconName: "ParticipantItemSpotlighted", className: iconStyles$2 }))));
12345
12350
  }
12346
12351
  : () => null;
12347
12352
  /* @conditional-compile-remove(raise-hand) */
@@ -13262,6 +13267,8 @@ const VideoTileMoreOptionsButton = (props) => {
13262
13267
  */
13263
13268
  const VideoTile = (props) => {
13264
13269
  const { children, displayName, initialsName, isMirrored, isMuted,
13270
+ /* @conditional-compile-remove(spotlight) */
13271
+ isSpotlighted,
13265
13272
  /* @conditional-compile-remove(pinned-participants) */
13266
13273
  isPinned, onRenderPlaceholder, renderElement, showLabel = true, showMuteIndicator = true, styles, userId, noVideoAvailableAriaLabel, isSpeaking,
13267
13274
  /* @conditional-compile-remove(raise-hand) */
@@ -13396,11 +13403,14 @@ const VideoTile = (props) => {
13396
13403
  participantStateString && (React.createElement(react.Text, { className: react.mergeStyles(participantStateStringStyles(theme)) }, bracketedParticipantString(participantStateString, !!canShowLabel))),
13397
13404
  showMuteIndicator && isMuted && (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
13398
13405
  React.createElement(react.Icon, { iconName: "VideoTileMicOff" }))),
13399
- /* @conditional-compile-remove(pinned-participants) */
13400
- React.createElement(VideoTileMoreOptionsButton, { contextualMenu: contextualMenu, canShowContextMenuButton: canShowContextMenuButton }),
13406
+ /* @conditional-compile-remove(spotlight) */
13407
+ isSpotlighted && (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
13408
+ React.createElement(react.Icon, { iconName: "VideoSpotlighted" }))),
13401
13409
  /* @conditional-compile-remove(pinned-participants) */
13402
13410
  isPinned && (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
13403
- React.createElement(react.Icon, { iconName: "VideoTilePinned", className: react.mergeStyles(pinIconStyle) })))))),
13411
+ React.createElement(react.Icon, { iconName: "VideoTilePinned", className: react.mergeStyles(pinIconStyle) }))),
13412
+ /* @conditional-compile-remove(pinned-participants) */
13413
+ React.createElement(VideoTileMoreOptionsButton, { contextualMenu: contextualMenu, canShowContextMenuButton: canShowContextMenuButton })))),
13404
13414
  children && (React.createElement(react.Stack, { className: react.mergeStyles(overlayContainerStyles, styles === null || styles === void 0 ? void 0 : styles.overlayContainer) }, children)),
13405
13415
  /* @conditional-compile-remove(raise-hand) */ raisedHand && (React.createElement(react.Stack, { horizontal: true, tokens: { childrenGap: '0.2rem' }, className: raiseHandContainerStyles(theme, !canShowLabel) },
13406
13416
  React.createElement(react.Stack.Item, null,
@@ -13441,7 +13451,8 @@ const bracketedParticipantString = (participantString, withBrackets) => {
13441
13451
  const _RemoteVideoTile = React.memo((props) => {
13442
13452
  var _a;
13443
13453
  const { isAvailable, isReceiving = true, // default to true to prevent any breaking change
13444
- isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind, isPinned, onPinParticipant, onUnpinParticipant, onUpdateScalingMode, disablePinMenuItem, toggleAnnouncerString, strings } = props;
13454
+ isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind, isPinned, onPinParticipant, onUnpinParticipant,
13455
+ /* @conditional-compile-remove(spotlight) */ isSpotlighted, onUpdateScalingMode, disablePinMenuItem, toggleAnnouncerString, strings } = props;
13445
13456
  const remoteVideoStreamProps = React.useMemo(() => ({
13446
13457
  isMirrored: remoteVideoViewOptions === null || remoteVideoViewOptions === void 0 ? void 0 : remoteVideoViewOptions.isMirrored,
13447
13458
  isScreenSharingOn,
@@ -13530,7 +13541,9 @@ const _RemoteVideoTile = React.memo((props) => {
13530
13541
  /* @conditional-compile-remove(pinned-participants) */
13531
13542
  isPinned: props.isPinned,
13532
13543
  /* @conditional-compile-remove(pinned-participants) */
13533
- onLongTouch: () => setDrawerMenuItemProps(convertContextualMenuItemsToDrawerMenuItemProps(contextualMenuProps, () => setDrawerMenuItemProps([]))) })),
13544
+ onLongTouch: () => setDrawerMenuItemProps(convertContextualMenuItemsToDrawerMenuItemProps(contextualMenuProps, () => setDrawerMenuItemProps([]))),
13545
+ /* @conditional-compile-remove(spotlight) */
13546
+ isSpotlighted: isSpotlighted })),
13534
13547
  drawerMenuItemProps.length > 0 && (React.createElement(react.Layer, { hostId: props.drawerMenuHostId },
13535
13548
  React.createElement(react.Stack, { styles: drawerMenuWrapperStyles },
13536
13549
  React.createElement(_DrawerMenu, { onLightDismiss: () => setDrawerMenuItemProps([]), items: drawerMenuItemProps, heading: remoteParticipant.displayName }))))));
@@ -13784,7 +13797,11 @@ const _LocalVideoTile = React.memo((props) => {
13784
13797
  /* @conditional-compile-remove(raise-hand) */
13785
13798
  raisedHand,
13786
13799
  /* @conditional-compile-remove(reaction) */
13787
- reaction } = props;
13800
+ reaction,
13801
+ /* @conditional-compile-remove(spotlight) */
13802
+ isSpotlighted } = props;
13803
+ /* @conditional-compile-remove(spotlight) */
13804
+ const theme = useTheme();
13788
13805
  const localVideoStreamProps = React.useMemo(() => ({
13789
13806
  isMirrored: localVideoViewOptions === null || localVideoViewOptions === void 0 ? void 0 : localVideoViewOptions.isMirrored,
13790
13807
  isStreamAvailable: isAvailable,
@@ -13802,6 +13819,14 @@ const _LocalVideoTile = React.memo((props) => {
13802
13819
  ]);
13803
13820
  // Handle creating, destroying and updating the video stream as necessary
13804
13821
  useLocalVideoStreamLifecycleMaintainer(localVideoStreamProps);
13822
+ /* @conditional-compile-remove(spotlight) */
13823
+ const spotlightBorder = React.useMemo(() => (React.createElement(react.Stack, { className: react.mergeStyles({
13824
+ position: 'absolute',
13825
+ height: '100%',
13826
+ width: '100%',
13827
+ zIndex: 100,
13828
+ border: `0.25rem solid ${theme.palette.black}`
13829
+ }) })), [theme.palette.black]);
13805
13830
  const renderVideoStreamElement = React.useMemo(() => {
13806
13831
  // Checking if renderElement is well defined or not as calling SDK has a number of video streams limitation which
13807
13832
  // implies that, after their threshold, all streams have no child (blank video)
@@ -13811,19 +13836,26 @@ const _LocalVideoTile = React.memo((props) => {
13811
13836
  }
13812
13837
  return (React.createElement(React.Fragment, null,
13813
13838
  React.createElement(FloatingLocalCameraCycleButton, { showCameraSwitcherInLocalPreview: showCameraSwitcherInLocalPreview !== null && showCameraSwitcherInLocalPreview !== void 0 ? showCameraSwitcherInLocalPreview : false, localVideoCameraCycleButtonProps: localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel: localVideoCameraSwitcherLabel, localVideoSelectedDescription: localVideoSelectedDescription }),
13814
- React.createElement(StreamMedia, { videoStreamElement: renderElement, isMirrored: true })));
13839
+ React.createElement(StreamMedia, { videoStreamElement: renderElement, isMirrored: true }), /* @conditional-compile-remove(spotlight) */
13840
+ isSpotlighted && spotlightBorder));
13815
13841
  }, [
13816
13842
  localVideoCameraCycleButtonProps,
13817
13843
  localVideoCameraSwitcherLabel,
13818
13844
  localVideoSelectedDescription,
13819
13845
  renderElement,
13820
- showCameraSwitcherInLocalPreview
13846
+ showCameraSwitcherInLocalPreview,
13847
+ /* @conditional-compile-remove(spotlight) */ isSpotlighted,
13848
+ /* @conditional-compile-remove(spotlight) */ spotlightBorder
13821
13849
  ]);
13822
- return (React.createElement(VideoTile, { key: userId !== null && userId !== void 0 ? userId : 'local-video-tile', userId: userId, renderElement: renderVideoStreamElement, showLabel: showLabel, displayName: displayName, initialsName: initialsName, styles: styles, onRenderPlaceholder: onRenderAvatar, isMuted: isMuted, showMuteIndicator: showMuteIndicator, personaMinSize: props.personaMinSize,
13823
- /* @conditional-compile-remove(raise-hand) */
13824
- raisedHand: raisedHand,
13825
- /* @conditional-compile-remove(reaction) */
13826
- reaction: reaction }));
13850
+ return (React.createElement(React.Fragment, null,
13851
+ React.createElement(VideoTile, { key: userId !== null && userId !== void 0 ? userId : 'local-video-tile', userId: userId, renderElement: renderVideoStreamElement, showLabel: showLabel, displayName: displayName, initialsName: initialsName, styles: styles, onRenderPlaceholder: onRenderAvatar, isMuted: isMuted, showMuteIndicator: showMuteIndicator, personaMinSize: props.personaMinSize,
13852
+ /* @conditional-compile-remove(raise-hand) */
13853
+ raisedHand: raisedHand,
13854
+ /* @conditional-compile-remove(reaction) */
13855
+ reaction: reaction,
13856
+ /* @conditional-compile-remove(spotlight) */
13857
+ isSpotlighted: isSpotlighted }), /* @conditional-compile-remove(spotlight) */
13858
+ isSpotlighted && spotlightBorder));
13827
13859
  });
13828
13860
  const FloatingLocalCameraCycleButton = (props) => {
13829
13861
  const { showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel, localVideoSelectedDescription } = props;
@@ -14016,35 +14048,41 @@ const _useOrganizedParticipants = (props) => {
14016
14048
  return { gridParticipants, overflowGalleryParticipants: overflowGalleryParticipants };
14017
14049
  };
14018
14050
  /* @conditional-compile-remove(pinned-participants) */
14019
- const _useOrganizedParticipantsWithPinnedParticipants = (props) => {
14020
- var _a;
14051
+ const _useOrganizedParticipantsWithFocusedParticipants = (props) => {
14052
+ var _a, _b;
14021
14053
  // map remote participants by userId
14022
14054
  const remoteParticipantMap = props.remoteParticipants.reduce((map, remoteParticipant) => {
14023
14055
  map[remoteParticipant.userId] = remoteParticipant;
14024
14056
  return map;
14025
14057
  }, {});
14026
- // get pinned participants in the same order of pinned participant user ids using remoteParticipantMap
14027
- const pinnedParticipants = [];
14028
- (_a = props.pinnedParticipantUserIds) === null || _a === void 0 ? void 0 : _a.forEach((id) => {
14058
+ const spotlightedParticipantUserIds = (_a = props.spotlightedParticipantUserIds) !== null && _a !== void 0 ? _a : [];
14059
+ // declare focused participant user ids as spotlighted participants user ids followed by
14060
+ // pinned participants user ids
14061
+ const focusedParticipantUserIds = [
14062
+ ...new Set(spotlightedParticipantUserIds.concat((_b = props.pinnedParticipantUserIds) !== null && _b !== void 0 ? _b : []))
14063
+ ];
14064
+ // get focused participants from map of remote participants in the order of the user ids
14065
+ const focusedParticipants = [];
14066
+ focusedParticipantUserIds.forEach((id) => {
14029
14067
  const pinnedParticipant = remoteParticipantMap[id];
14030
14068
  if (pinnedParticipant) {
14031
- pinnedParticipants.push(pinnedParticipant);
14069
+ focusedParticipants.push(pinnedParticipant);
14032
14070
  }
14033
14071
  });
14034
- // get unpinned participants by filtering all remote participants using a set of pinned participant user ids
14035
- const pinnedParticipantUserIdSet = new Set(props.pinnedParticipantUserIds);
14036
- const unpinnedParticipants = props.remoteParticipants.filter((p) => !pinnedParticipantUserIdSet.has(p.userId));
14072
+ // get unfocused participants by filtering out set of focused participant user ids from all remote participants
14073
+ const focusedParticipantUserIdSet = new Set(focusedParticipantUserIds);
14074
+ const unfocusedParticipants = props.remoteParticipants.filter((p) => !focusedParticipantUserIdSet.has(p.userId));
14037
14075
  const useOrganizedParticipantsProps = Object.assign(Object.assign({}, props), {
14038
14076
  // if there are pinned participants then we should only consider unpinned participants
14039
- remoteParticipants: unpinnedParticipants });
14077
+ remoteParticipants: unfocusedParticipants });
14040
14078
  const useOrganizedParticipantsResult = _useOrganizedParticipants(useOrganizedParticipantsProps);
14041
- if (pinnedParticipants.length === 0) {
14079
+ if (focusedParticipants.length === 0) {
14042
14080
  return useOrganizedParticipantsResult;
14043
14081
  }
14044
14082
  return {
14045
- gridParticipants: props.isScreenShareActive ? [] : pinnedParticipants,
14083
+ gridParticipants: props.isScreenShareActive ? [] : focusedParticipants,
14046
14084
  overflowGalleryParticipants: props.isScreenShareActive
14047
- ? pinnedParticipants.concat(useOrganizedParticipantsResult.overflowGalleryParticipants)
14085
+ ? focusedParticipants.concat(useOrganizedParticipantsResult.overflowGalleryParticipants)
14048
14086
  : useOrganizedParticipantsResult.gridParticipants.concat(useOrganizedParticipantsResult.overflowGalleryParticipants)
14049
14087
  };
14050
14088
  };
@@ -14069,7 +14107,7 @@ const putVideoParticipantsFirst = (remoteParticipants) => {
14069
14107
  */
14070
14108
  const useOrganizedParticipants = (args) => {
14071
14109
  /* @conditional-compile-remove(pinned-participants) */
14072
- return _useOrganizedParticipantsWithPinnedParticipants(args);
14110
+ return _useOrganizedParticipantsWithFocusedParticipants(args);
14073
14111
  };
14074
14112
 
14075
14113
  // Copyright (c) Microsoft Corporation.
@@ -14869,7 +14907,8 @@ const DefaultLayout = (props) => {
14869
14907
  const { remoteParticipants = [], localParticipant, dominantSpeakers, localVideoComponent, screenShareComponent, onRenderRemoteParticipant, styles, maxRemoteVideoStreams, parentWidth,
14870
14908
  /* @conditional-compile-remove(vertical-gallery) */
14871
14909
  parentHeight, pinnedParticipantUserIds = [],
14872
- /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition = 'horizontalBottom' } = props;
14910
+ /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition = 'horizontalBottom',
14911
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds } = props;
14873
14912
  const isNarrow = parentWidth ? isNarrowWidth(parentWidth) : false;
14874
14913
  /* @conditional-compile-remove(vertical-gallery) */
14875
14914
  const isShort = parentHeight ? isShortHeight(parentHeight) : false;
@@ -14887,7 +14926,8 @@ const DefaultLayout = (props) => {
14887
14926
  ? childrenPerPage.current - ((pinnedParticipantUserIds.length + 1) % childrenPerPage.current)
14888
14927
  : childrenPerPage.current,
14889
14928
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds,
14890
- /* @conditional-compile-remove(gallery-layouts) */ layout: 'default'
14929
+ /* @conditional-compile-remove(gallery-layouts) */ layout: 'default',
14930
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds
14891
14931
  });
14892
14932
  let activeVideoStreams = 0;
14893
14933
  const gridTiles = gridParticipants.map((p) => {
@@ -15709,7 +15749,8 @@ const layerHostStyle = {
15709
15749
  const FloatingLocalVideoLayout = (props) => {
15710
15750
  const { remoteParticipants = [], dominantSpeakers, localVideoComponent, screenShareComponent, onRenderRemoteParticipant, styles, maxRemoteVideoStreams, showCameraSwitcherInLocalPreview, parentWidth, parentHeight,
15711
15751
  /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition = 'horizontalBottom', pinnedParticipantUserIds = [],
15712
- /* @conditional-compile-remove(click-to-call) */ localVideoTileSize } = props;
15752
+ /* @conditional-compile-remove(click-to-call) */ localVideoTileSize,
15753
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds } = props;
15713
15754
  const theme = useTheme();
15714
15755
  const isNarrow = parentWidth ? isNarrowWidth(parentWidth) : false;
15715
15756
  /* @conditional-compile-remove(vertical-gallery) */
@@ -15726,7 +15767,8 @@ const FloatingLocalVideoLayout = (props) => {
15726
15767
  ? childrenPerPage.current - (pinnedParticipantUserIds.length % childrenPerPage.current)
15727
15768
  : childrenPerPage.current,
15728
15769
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds,
15729
- /* @conditional-compile-remove(gallery-layouts) */ layout: 'floatingLocalVideo'
15770
+ /* @conditional-compile-remove(gallery-layouts) */ layout: 'floatingLocalVideo',
15771
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds
15730
15772
  });
15731
15773
  let activeVideoStreams = 0;
15732
15774
  const gridTiles = gridParticipants.map((p) => {
@@ -16140,7 +16182,9 @@ const VideoGallery = (props) => {
16140
16182
  /* @conditional-compile-remove(vertical-gallery) */
16141
16183
  overflowGalleryPosition = 'horizontalBottom',
16142
16184
  /* @conditional-compile-remove(rooms) */
16143
- localVideoTileSize = 'followDeviceOrientation' } = props;
16185
+ localVideoTileSize = 'followDeviceOrientation',
16186
+ /* @conditional-compile-remove(spotlight) */
16187
+ spotlightedParticipants } = props;
16144
16188
  const ids = useIdentifiers();
16145
16189
  const theme = useTheme();
16146
16190
  const localeStrings = useLocale$1().strings.videoGallery;
@@ -16197,6 +16241,8 @@ const VideoGallery = (props) => {
16197
16241
  if (onRenderLocalVideoTile) {
16198
16242
  return onRenderLocalVideoTile(localParticipant);
16199
16243
  }
16244
+ /* @conditional-compile-remove(spotlight) */
16245
+ const isSpotlighted = spotlightedParticipants === null || spotlightedParticipants === void 0 ? void 0 : spotlightedParticipants.includes(localParticipant.userId);
16200
16246
  const localVideoTileStyles = react.concatStyleSets(localTileNotInGrid ? floatingLocalVideoTileStyle : {}, {
16201
16247
  root: { borderRadius: theme.effects.roundedCorner4 }
16202
16248
  }, styles === null || styles === void 0 ? void 0 : styles.localVideo);
@@ -16210,7 +16256,9 @@ const VideoGallery = (props) => {
16210
16256
  /* @conditional-compile-remove(raise-hand) */
16211
16257
  raisedHand: localParticipant.raisedHand,
16212
16258
  /* @conditional-compile-remove(reaction) */
16213
- reaction: localParticipant.reaction })));
16259
+ reaction: localParticipant.reaction,
16260
+ /* @conditional-compile-remove(spotlight) */
16261
+ isSpotlighted: isSpotlighted })));
16214
16262
  }, [
16215
16263
  isNarrow,
16216
16264
  localParticipant,
@@ -16233,7 +16281,9 @@ const VideoGallery = (props) => {
16233
16281
  localVideoTileSize,
16234
16282
  /* @conditional-compile-remove(gallery-layouts) */
16235
16283
  layout,
16236
- showLocalVideoTileLabel
16284
+ showLocalVideoTileLabel,
16285
+ /* @conditional-compile-remove(spotlight) */
16286
+ spotlightedParticipants
16237
16287
  ]);
16238
16288
  /* @conditional-compile-remove(pinned-participants) */
16239
16289
  const onPinParticipant = React.useCallback((userId) => {
@@ -16270,7 +16320,11 @@ const VideoGallery = (props) => {
16270
16320
  /* @conditional-compile-remove(pinned-participants) */
16271
16321
  const selectedScalingMode = remoteVideoStream ? selectedScalingModeState[participant.userId] : undefined;
16272
16322
  /* @conditional-compile-remove(pinned-participants) */
16273
- const isPinned = pinnedParticipants === null || pinnedParticipants === void 0 ? void 0 : pinnedParticipants.includes(participant.userId);
16323
+ let isPinned = pinnedParticipants === null || pinnedParticipants === void 0 ? void 0 : pinnedParticipants.includes(participant.userId);
16324
+ /* @conditional-compile-remove(spotlight) */
16325
+ const isSpotlighted = spotlightedParticipants === null || spotlightedParticipants === void 0 ? void 0 : spotlightedParticipants.includes(participant.userId);
16326
+ /* @conditional-compile-remove(spotlight) */
16327
+ isPinned = isSpotlighted ? false : isPinned;
16274
16328
  const createViewOptions = () => {
16275
16329
  var _a, _b;
16276
16330
  /* @conditional-compile-remove(pinned-participants) */
@@ -16310,7 +16364,9 @@ const VideoGallery = (props) => {
16310
16364
  /* @conditional-compile-remove(pinned-participants) */
16311
16365
  disablePinMenuItem: pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES,
16312
16366
  /* @conditional-compile-remove(pinned-participants) */
16313
- toggleAnnouncerString: toggleAnnouncerString }));
16367
+ toggleAnnouncerString: toggleAnnouncerString,
16368
+ /* @conditional-compile-remove(spotlight) */
16369
+ isSpotlighted: isSpotlighted }));
16314
16370
  }, [
16315
16371
  onCreateRemoteStreamView,
16316
16372
  onDisposeRemoteVideoStreamView,
@@ -16326,7 +16382,8 @@ const VideoGallery = (props) => {
16326
16382
  /* @conditional-compile-remove(pinned-participants) */ onPinParticipant,
16327
16383
  /* @conditional-compile-remove(pinned-participants) */ onUnpinParticipant,
16328
16384
  /* @conditional-compile-remove(pinned-participants) */ toggleAnnouncerString,
16329
- /* @conditional-compile-remove(pinned-participants) */ onUpdateScalingMode
16385
+ /* @conditional-compile-remove(pinned-participants) */ onUpdateScalingMode,
16386
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipants
16330
16387
  ]);
16331
16388
  const screenShareParticipant = remoteParticipants.find((participant) => { var _a; return (_a = participant.screenShareStream) === null || _a === void 0 ? void 0 : _a.isAvailable; });
16332
16389
  const localScreenShareStreamComponent = React.createElement(LocalScreenShare, { localParticipant: localParticipant });
@@ -16350,7 +16407,8 @@ const VideoGallery = (props) => {
16350
16407
  parentHeight: containerHeight,
16351
16408
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds: pinnedParticipants,
16352
16409
  /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,
16353
- /* @conditional-compile-remove(click-to-call) */ localVideoTileSize
16410
+ /* @conditional-compile-remove(click-to-call) */ localVideoTileSize,
16411
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds: spotlightedParticipants
16354
16412
  }), [
16355
16413
  remoteParticipants,
16356
16414
  localParticipant,
@@ -16366,7 +16424,8 @@ const VideoGallery = (props) => {
16366
16424
  defaultOnRenderVideoTile,
16367
16425
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipants,
16368
16426
  /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,
16369
- /* @conditional-compile-remove(click-to-call) */ localVideoTileSize
16427
+ /* @conditional-compile-remove(click-to-call) */ localVideoTileSize,
16428
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipants
16370
16429
  ]);
16371
16430
  const videoGalleryLayout = React.useMemo(() => {
16372
16431
  /* @conditional-compile-remove(gallery-layouts) */
@@ -18615,6 +18674,7 @@ const _TagsSurvey = (props) => {
18615
18674
  const [selectedTags, setSelectedTags] = React.useState({});
18616
18675
  const [textResponse, setTextResponse] = React.useState({});
18617
18676
  const [selectedTextResponse, setSelectedTextResponse] = React.useState({});
18677
+ const [checkedTextFields, setCheckedTextFields] = React.useState([]);
18618
18678
  const tags = React.useMemo(() => {
18619
18679
  const tags = [];
18620
18680
  Object.keys(callIssuesToTag).forEach((issueCategory) => {
@@ -18652,6 +18712,7 @@ const _TagsSurvey = (props) => {
18652
18712
  });
18653
18713
  }
18654
18714
  else {
18715
+ setCheckedTextFields([...checkedTextFields, issueCategory]);
18655
18716
  setSelectedTextResponse((prevState) => {
18656
18717
  prevState[issueCategory] = textResponse[issueCategory];
18657
18718
  return prevState;
@@ -18673,33 +18734,35 @@ const _TagsSurvey = (props) => {
18673
18734
  });
18674
18735
  }
18675
18736
  else {
18737
+ setCheckedTextFields(checkedTextFields.filter((id) => id !== issueCategory));
18676
18738
  setSelectedTextResponse((prevState) => {
18677
18739
  delete prevState[issueCategory];
18678
18740
  return prevState;
18679
18741
  });
18680
18742
  }
18681
18743
  }
18682
- if (onConfirm) {
18683
- onConfirm(selectedTags, selectedTextResponse);
18684
- }
18685
- }, [onConfirm, selectedTags, selectedTextResponse, textResponse]);
18744
+ }, [textResponse, checkedTextFields]);
18686
18745
  const theme = react.useTheme();
18687
18746
  const onRenderLabel = React.useCallback((issueCategory) => {
18688
18747
  return (React.createElement(react.TextField, { key: issueCategory, className: freeFormTextFieldClassName, underlined: true, placeholder: strings === null || strings === void 0 ? void 0 : strings.tagsSurveyTextFieldDefaultText, onChange: (e, v) => {
18689
18748
  if (v) {
18749
+ setCheckedTextFields([...checkedTextFields, issueCategory]);
18690
18750
  setTextResponse((prevState) => {
18691
18751
  prevState[issueCategory] = v;
18692
18752
  return prevState;
18693
18753
  });
18694
18754
  setSelectedTextResponse((prevState) => {
18695
- if (Object.keys(prevState).includes(issueCategory)) {
18696
- prevState[issueCategory] = v;
18697
- }
18755
+ prevState[issueCategory] = v;
18698
18756
  return prevState;
18699
18757
  });
18700
18758
  }
18701
18759
  } }));
18702
- }, [strings === null || strings === void 0 ? void 0 : strings.tagsSurveyTextFieldDefaultText]);
18760
+ }, [strings === null || strings === void 0 ? void 0 : strings.tagsSurveyTextFieldDefaultText, checkedTextFields]);
18761
+ React.useEffect(() => {
18762
+ if (onConfirm) {
18763
+ onConfirm(selectedTags, selectedTextResponse);
18764
+ }
18765
+ }, [selectedTags, selectedTextResponse, onConfirm]);
18703
18766
  return (React.createElement(React.Fragment, null,
18704
18767
  React.createElement(react.Stack, { verticalAlign: "center" },
18705
18768
  React.createElement(react.Text, { className: questionTextStyle(theme) }, strings === null || strings === void 0 ? void 0 : strings.tagsSurveyQuestion)),
@@ -18711,7 +18774,7 @@ const _TagsSurvey = (props) => {
18711
18774
  tags[key].map((t, i) => {
18712
18775
  return (React.createElement(react.Checkbox, { className: checkboxClassName, key: `checkBox_${i}`, label: t.message, onChange: (ev, checked) => onChange(key, checked !== null && checked !== void 0 ? checked : false, t.issue) }));
18713
18776
  }),
18714
- showFreeFormTextField && (React.createElement(react.Checkbox, { styles: freeFormTextCheckboxStyles, onChange: (ev, checked) => onChange(key, checked !== null && checked !== void 0 ? checked : false), onRenderLabel: () => {
18777
+ showFreeFormTextField && (React.createElement(react.Checkbox, { checked: checkedTextFields.includes(key), styles: freeFormTextCheckboxStyles, onChange: (ev, checked) => onChange(key, checked !== null && checked !== void 0 ? checked : false), onRenderLabel: () => {
18715
18778
  return onRenderLabel(key);
18716
18779
  } }))));
18717
18780
  })),
@@ -19842,8 +19905,8 @@ const convertRemoteParticipantToParticipantListParticipant = (userId, displayNam
19842
19905
  /**
19843
19906
  * @private
19844
19907
  */
19845
- const memoizedConvertAllremoteParticipantsBeta = memoizeFnAll((userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers, reaction) => {
19846
- return convertRemoteParticipantToParticipantListParticipantBeta(userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers, reaction);
19908
+ const memoizedConvertAllremoteParticipantsBeta = memoizeFnAll((userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers, reaction, isSpotlighted) => {
19909
+ return convertRemoteParticipantToParticipantListParticipantBeta(userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers, reaction, isSpotlighted);
19847
19910
  });
19848
19911
  /* @conditional-compile-remove(reaction) */
19849
19912
  /**
@@ -19858,8 +19921,17 @@ const memoizedConvertToVideoTileReaction = memoizeOne((reactionState) => {
19858
19921
  : undefined;
19859
19922
  });
19860
19923
  /* @conditional-compile-remove(reaction) */
19861
- const convertRemoteParticipantToParticipantListParticipantBeta = (userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers, reaction) => {
19862
- return Object.assign(Object.assign({}, convertRemoteParticipantToParticipantListParticipant(userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers)), { reaction });
19924
+ /**
19925
+ * @private
19926
+ */
19927
+ const memoizedSpotlight = memoizeOne((spotlightedParticipants, userId) => {
19928
+ const spotlightOrder = spotlightedParticipants === null || spotlightedParticipants === void 0 ? void 0 : spotlightedParticipants.find((spotlightedParticipant) => toFlatCommunicationIdentifier(spotlightedParticipant.identifier) === userId);
19929
+ return spotlightOrder ? { spotlightOrderPosition: spotlightOrder.order } : undefined;
19930
+ });
19931
+ /* @conditional-compile-remove(reaction) */
19932
+ const convertRemoteParticipantToParticipantListParticipantBeta = (userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers, reaction, isSpotlighted) => {
19933
+ return Object.assign(Object.assign({}, convertRemoteParticipantToParticipantListParticipant(userId, displayName, state, isMuted, isScreenSharing, isSpeaking, raisedHand, localUserCanRemoveOthers)), { reaction,
19934
+ isSpotlighted });
19863
19935
  };
19864
19936
 
19865
19937
  // Copyright (c) Microsoft Corporation.
@@ -20092,7 +20164,7 @@ const updateUserDisplayNamesTrampoline$2 = (remoteParticipants) => {
20092
20164
 
20093
20165
  // Copyright (c) Microsoft Corporation.
20094
20166
  // Licensed under the MIT License.
20095
- const convertRemoteParticipantsToParticipantListParticipants = (remoteParticipants, localUserCanRemoveOthers, isHideAttendeeNamesEnabled, localUserRole) => {
20167
+ const convertRemoteParticipantsToParticipantListParticipants = (remoteParticipants, localUserCanRemoveOthers, isHideAttendeeNamesEnabled, localUserRole, spotlightedParticipants) => {
20096
20168
  const conversionCallback = (memoizeFn) => {
20097
20169
  return (remoteParticipants
20098
20170
  // Filter out MicrosoftBot participants
@@ -20119,11 +20191,15 @@ const convertRemoteParticipantsToParticipantListParticipants = (remoteParticipan
20119
20191
  displayName = maskDisplayNameWithRole(displayName, localUserRole, participant.role, isHideAttendeeNamesEnabled);
20120
20192
  /* @conditional-compile-remove(reaction) */
20121
20193
  const remoteParticipantReaction = memoizedConvertToVideoTileReaction(participant.reactionState);
20194
+ /* @conditional-compile-remove(spotlight) */
20195
+ const spotlight = memoizedSpotlight(spotlightedParticipants, toFlatCommunicationIdentifier(participant.identifier));
20122
20196
  return memoizeFn(toFlatCommunicationIdentifier(participant.identifier), displayName, state, participant.isMuted, isScreenSharing, participant.isSpeaking,
20123
20197
  /* @conditional-compile-remove(raise-hand) */
20124
20198
  participant.raisedHand, localUserCanRemoveOthers,
20125
20199
  /* @conditional-compile-remove(reaction) */
20126
- remoteParticipantReaction);
20200
+ remoteParticipantReaction,
20201
+ /* @conditional-compile-remove(spotlight) */
20202
+ spotlight);
20127
20203
  })
20128
20204
  .sort((a, b) => {
20129
20205
  var _a, _b;
@@ -20160,21 +20236,27 @@ const participantListSelector = reselect.createSelector([
20160
20236
  /* @conditional-compile-remove(hide-attendee-name) */
20161
20237
  isHideAttendeeNamesEnabled,
20162
20238
  /* @conditional-compile-remove(reaction) */
20163
- getLocalParticipantReactionState
20239
+ getLocalParticipantReactionState,
20240
+ /* @conditional-compile-remove(spotlight) */
20241
+ getSpotlightedParticipants
20164
20242
  ], (userId, displayName, remoteParticipants, isScreenSharingOn, isMuted,
20165
20243
  /* @conditional-compile-remove(raise-hand) */
20166
20244
  raisedHand, role, partitipantCount,
20167
20245
  /* @conditional-compile-remove(hide-attendee-name) */
20168
20246
  isHideAttendeeNamesEnabled,
20169
20247
  /* @conditional-compile-remove(reaction) */
20170
- localParticipantReactionState) => {
20248
+ localParticipantReactionState,
20249
+ /* @conditional-compile-remove(spotlight) */
20250
+ spotlightedParticipants) => {
20171
20251
  const localUserCanRemoveOthers = localUserCanRemoveOthersTrampoline(role);
20172
20252
  const participants = remoteParticipants
20173
20253
  ? convertRemoteParticipantsToParticipantListParticipants(updateUserDisplayNamesTrampoline$1(Object.values(remoteParticipants)), localUserCanRemoveOthers,
20174
20254
  /* @conditional-compile-remove(hide-attendee-name) */
20175
20255
  isHideAttendeeNamesEnabled,
20176
20256
  /* @conditional-compile-remove(hide-attendee-name) */
20177
- role)
20257
+ role,
20258
+ /* @conditional-compile-remove(spotlight) */
20259
+ spotlightedParticipants)
20178
20260
  : [];
20179
20261
  /* @conditional-compile-remove(reaction) */
20180
20262
  const localParticipantReaction = memoizedConvertToVideoTileReaction(localParticipantReactionState);
@@ -20189,7 +20271,9 @@ localParticipantReactionState) => {
20189
20271
  // Local participant can never remove themselves.
20190
20272
  isRemovable: false,
20191
20273
  /* @conditional-compile-remove(reaction) */
20192
- reaction: localParticipantReaction
20274
+ reaction: localParticipantReaction,
20275
+ /* @conditional-compile-remove(spotlight) */
20276
+ isSpotlighted: memoizedSpotlight(spotlightedParticipants, userId)
20193
20277
  });
20194
20278
  /* @conditional-compile-remove(total-participant-count) */
20195
20279
  const totalParticipantCount = partitipantCount;
@@ -26061,7 +26145,7 @@ const Reaction = (props) => {
26061
26145
  const reactionButtonProps = usePropsFor$1(ReactionButton);
26062
26146
  const styles = React.useMemo(() => { var _a; return concatButtonBaseStyles((_a = props.styles) !== null && _a !== void 0 ? _a : {}); }, [props.styles]);
26063
26147
  const reactionButtonDisabled = isDisabled(props.option) || reactionButtonProps.disabled;
26064
- return (React.createElement(ReactionButton, Object.assign({ "data-ui-id": "call-composite-reaction-button" }, reactionButtonProps, { showLabel: props.displayType !== 'compact', disabled: reactionButtonDisabled || props.disabled, styles: styles, disableTooltip: props.disableTooltip })));
26148
+ return (React.createElement(ReactionButton, Object.assign({ "data-ui-id": "call-composite-reaction-button" }, reactionButtonProps, { showLabel: props.displayType !== 'compact', disabled: reactionButtonDisabled || props.disabled, styles: styles, disableTooltip: props.disableTooltip, persistMenu: true })));
26065
26149
  };
26066
26150
  /* @conditional-compile-remove(reaction) */
26067
26151
  const isDisabled = (option) => {