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

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 (36) hide show
  1. package/dist/communication-react.d.ts +10 -0
  2. package/dist/dist-cjs/communication-react/index.js +111 -51
  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/react-components/src/components/LocalVideoTile.d.ts +1 -0
  7. package/dist/dist-esm/react-components/src/components/LocalVideoTile.js +31 -8
  8. package/dist/dist-esm/react-components/src/components/LocalVideoTile.js.map +1 -1
  9. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.d.ts +1 -0
  10. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js +5 -2
  11. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js.map +1 -1
  12. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.js +14 -10
  13. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.js.map +1 -1
  14. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js +4 -2
  15. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js.map +1 -1
  16. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js +4 -2
  17. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js.map +1 -1
  18. package/dist/dist-esm/react-components/src/components/VideoGallery/Layout.d.ts +4 -0
  19. package/dist/dist-esm/react-components/src/components/VideoGallery/Layout.js.map +1 -1
  20. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.d.ts +1 -0
  21. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js +20 -14
  22. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js.map +1 -1
  23. package/dist/dist-esm/react-components/src/components/VideoGallery.d.ts +4 -0
  24. package/dist/dist-esm/react-components/src/components/VideoGallery.js +25 -8
  25. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  26. package/dist/dist-esm/react-components/src/components/VideoTile.d.ts +4 -0
  27. package/dist/dist-esm/react-components/src/components/VideoTile.js +8 -3
  28. package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
  29. package/dist/dist-esm/react-components/src/theming/icons.d.ts +1 -0
  30. package/dist/dist-esm/react-components/src/theming/icons.js +5 -1
  31. package/dist/dist-esm/react-components/src/theming/icons.js.map +1 -1
  32. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/Reaction.js +1 -1
  33. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/Reaction.js.map +1 -1
  34. package/dist/dist-esm/react-composites/src/composites/common/icons.d.ts +1 -0
  35. package/dist/tsdoc-metadata.json +1 -1
  36. package/package.json +10 -10
@@ -6085,6 +6085,7 @@ export declare const DEFAULT_COMPONENT_ICONS: {
6085
6085
  ContextMenuSpeakerIcon: React_2.JSX.Element;
6086
6086
  SurveyStarIcon: React_2.JSX.Element;
6087
6087
  SurveyStarIconFilled: React_2.JSX.Element;
6088
+ VideoSpotlighted: React_2.JSX.Element;
6088
6089
  };
6089
6090
 
6090
6091
  /**
@@ -6228,6 +6229,7 @@ export declare const DEFAULT_COMPOSITE_ICONS: {
6228
6229
  ContextMenuSpeakerIcon: React_2.JSX.Element;
6229
6230
  SurveyStarIcon: React_2.JSX.Element;
6230
6231
  SurveyStarIconFilled: React_2.JSX.Element;
6232
+ VideoSpotlighted: React_2.JSX.Element;
6231
6233
  };
6232
6234
 
6233
6235
  /**
@@ -10758,6 +10760,10 @@ export declare interface VideoGalleryProps {
10758
10760
  * This callback will be called when a participant video tile is un-pinned.
10759
10761
  */
10760
10762
  onUnpinParticipant?: (userId: string) => void;
10763
+ /**
10764
+ * List of spotlighted participant userIds.
10765
+ */
10766
+ spotlightedParticipants?: string[];
10761
10767
  /**
10762
10768
  * Options for showing the remote video tile menu.
10763
10769
  *
@@ -11057,6 +11063,10 @@ export declare interface VideoTileProps {
11057
11063
  * Callback triggered by video tile on touch and hold.
11058
11064
  */
11059
11065
  onLongTouch?: () => void;
11066
+ /**
11067
+ * If true, the video tile will show the spotlighted icon.
11068
+ */
11069
+ isSpotlighted?: boolean;
11060
11070
  }
11061
11071
 
11062
11072
  /**
@@ -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-202401200012';
174
174
 
175
175
 
176
176
  var telemetryVersion$1 = /*@__PURE__*/getDefaultExportFromCjs(telemetryVersion);
@@ -6473,7 +6473,9 @@ const DEFAULT_COMPONENT_ICONS = {
6473
6473
  /* @conditional-compile-remove(end-of-call-survey) */
6474
6474
  SurveyStarIcon: React.createElement(reactIcons.Star28Regular, null),
6475
6475
  /* @conditional-compile-remove(end-of-call-survey) */
6476
- SurveyStarIconFilled: React.createElement(reactIcons.Star28Filled, null)
6476
+ SurveyStarIconFilled: React.createElement(reactIcons.Star28Filled, null),
6477
+ /* @conditional-compile-remove(spotlight) */
6478
+ VideoSpotlighted: React.createElement(reactIcons.VideoPersonStar20Filled, { style: { height: '16px', width: '16px' } })
6477
6479
  };
6478
6480
 
6479
6481
  // Copyright (c) Microsoft Corporation.
@@ -13262,6 +13264,8 @@ const VideoTileMoreOptionsButton = (props) => {
13262
13264
  */
13263
13265
  const VideoTile = (props) => {
13264
13266
  const { children, displayName, initialsName, isMirrored, isMuted,
13267
+ /* @conditional-compile-remove(spotlight) */
13268
+ isSpotlighted,
13265
13269
  /* @conditional-compile-remove(pinned-participants) */
13266
13270
  isPinned, onRenderPlaceholder, renderElement, showLabel = true, showMuteIndicator = true, styles, userId, noVideoAvailableAriaLabel, isSpeaking,
13267
13271
  /* @conditional-compile-remove(raise-hand) */
@@ -13396,11 +13400,14 @@ const VideoTile = (props) => {
13396
13400
  participantStateString && (React.createElement(react.Text, { className: react.mergeStyles(participantStateStringStyles(theme)) }, bracketedParticipantString(participantStateString, !!canShowLabel))),
13397
13401
  showMuteIndicator && isMuted && (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
13398
13402
  React.createElement(react.Icon, { iconName: "VideoTileMicOff" }))),
13399
- /* @conditional-compile-remove(pinned-participants) */
13400
- React.createElement(VideoTileMoreOptionsButton, { contextualMenu: contextualMenu, canShowContextMenuButton: canShowContextMenuButton }),
13403
+ /* @conditional-compile-remove(spotlight) */
13404
+ isSpotlighted && (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
13405
+ React.createElement(react.Icon, { iconName: "VideoSpotlighted" }))),
13401
13406
  /* @conditional-compile-remove(pinned-participants) */
13402
13407
  isPinned && (React.createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
13403
- React.createElement(react.Icon, { iconName: "VideoTilePinned", className: react.mergeStyles(pinIconStyle) })))))),
13408
+ React.createElement(react.Icon, { iconName: "VideoTilePinned", className: react.mergeStyles(pinIconStyle) }))),
13409
+ /* @conditional-compile-remove(pinned-participants) */
13410
+ React.createElement(VideoTileMoreOptionsButton, { contextualMenu: contextualMenu, canShowContextMenuButton: canShowContextMenuButton })))),
13404
13411
  children && (React.createElement(react.Stack, { className: react.mergeStyles(overlayContainerStyles, styles === null || styles === void 0 ? void 0 : styles.overlayContainer) }, children)),
13405
13412
  /* @conditional-compile-remove(raise-hand) */ raisedHand && (React.createElement(react.Stack, { horizontal: true, tokens: { childrenGap: '0.2rem' }, className: raiseHandContainerStyles(theme, !canShowLabel) },
13406
13413
  React.createElement(react.Stack.Item, null,
@@ -13441,7 +13448,8 @@ const bracketedParticipantString = (participantString, withBrackets) => {
13441
13448
  const _RemoteVideoTile = React.memo((props) => {
13442
13449
  var _a;
13443
13450
  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;
13451
+ isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind, isPinned, onPinParticipant, onUnpinParticipant,
13452
+ /* @conditional-compile-remove(spotlight) */ isSpotlighted, onUpdateScalingMode, disablePinMenuItem, toggleAnnouncerString, strings } = props;
13445
13453
  const remoteVideoStreamProps = React.useMemo(() => ({
13446
13454
  isMirrored: remoteVideoViewOptions === null || remoteVideoViewOptions === void 0 ? void 0 : remoteVideoViewOptions.isMirrored,
13447
13455
  isScreenSharingOn,
@@ -13530,7 +13538,9 @@ const _RemoteVideoTile = React.memo((props) => {
13530
13538
  /* @conditional-compile-remove(pinned-participants) */
13531
13539
  isPinned: props.isPinned,
13532
13540
  /* @conditional-compile-remove(pinned-participants) */
13533
- onLongTouch: () => setDrawerMenuItemProps(convertContextualMenuItemsToDrawerMenuItemProps(contextualMenuProps, () => setDrawerMenuItemProps([]))) })),
13541
+ onLongTouch: () => setDrawerMenuItemProps(convertContextualMenuItemsToDrawerMenuItemProps(contextualMenuProps, () => setDrawerMenuItemProps([]))),
13542
+ /* @conditional-compile-remove(spotlight) */
13543
+ isSpotlighted: isSpotlighted })),
13534
13544
  drawerMenuItemProps.length > 0 && (React.createElement(react.Layer, { hostId: props.drawerMenuHostId },
13535
13545
  React.createElement(react.Stack, { styles: drawerMenuWrapperStyles },
13536
13546
  React.createElement(_DrawerMenu, { onLightDismiss: () => setDrawerMenuItemProps([]), items: drawerMenuItemProps, heading: remoteParticipant.displayName }))))));
@@ -13784,7 +13794,11 @@ const _LocalVideoTile = React.memo((props) => {
13784
13794
  /* @conditional-compile-remove(raise-hand) */
13785
13795
  raisedHand,
13786
13796
  /* @conditional-compile-remove(reaction) */
13787
- reaction } = props;
13797
+ reaction,
13798
+ /* @conditional-compile-remove(spotlight) */
13799
+ isSpotlighted } = props;
13800
+ /* @conditional-compile-remove(spotlight) */
13801
+ const theme = useTheme();
13788
13802
  const localVideoStreamProps = React.useMemo(() => ({
13789
13803
  isMirrored: localVideoViewOptions === null || localVideoViewOptions === void 0 ? void 0 : localVideoViewOptions.isMirrored,
13790
13804
  isStreamAvailable: isAvailable,
@@ -13802,6 +13816,14 @@ const _LocalVideoTile = React.memo((props) => {
13802
13816
  ]);
13803
13817
  // Handle creating, destroying and updating the video stream as necessary
13804
13818
  useLocalVideoStreamLifecycleMaintainer(localVideoStreamProps);
13819
+ /* @conditional-compile-remove(spotlight) */
13820
+ const spotlightBorder = React.useMemo(() => (React.createElement(react.Stack, { className: react.mergeStyles({
13821
+ position: 'absolute',
13822
+ height: '100%',
13823
+ width: '100%',
13824
+ zIndex: 100,
13825
+ border: `0.25rem solid ${theme.palette.black}`
13826
+ }) })), [theme.palette.black]);
13805
13827
  const renderVideoStreamElement = React.useMemo(() => {
13806
13828
  // Checking if renderElement is well defined or not as calling SDK has a number of video streams limitation which
13807
13829
  // implies that, after their threshold, all streams have no child (blank video)
@@ -13811,19 +13833,26 @@ const _LocalVideoTile = React.memo((props) => {
13811
13833
  }
13812
13834
  return (React.createElement(React.Fragment, null,
13813
13835
  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 })));
13836
+ React.createElement(StreamMedia, { videoStreamElement: renderElement, isMirrored: true }), /* @conditional-compile-remove(spotlight) */
13837
+ isSpotlighted && spotlightBorder));
13815
13838
  }, [
13816
13839
  localVideoCameraCycleButtonProps,
13817
13840
  localVideoCameraSwitcherLabel,
13818
13841
  localVideoSelectedDescription,
13819
13842
  renderElement,
13820
- showCameraSwitcherInLocalPreview
13843
+ showCameraSwitcherInLocalPreview,
13844
+ /* @conditional-compile-remove(spotlight) */ isSpotlighted,
13845
+ /* @conditional-compile-remove(spotlight) */ spotlightBorder
13821
13846
  ]);
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 }));
13847
+ return (React.createElement(React.Fragment, null,
13848
+ 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,
13849
+ /* @conditional-compile-remove(raise-hand) */
13850
+ raisedHand: raisedHand,
13851
+ /* @conditional-compile-remove(reaction) */
13852
+ reaction: reaction,
13853
+ /* @conditional-compile-remove(spotlight) */
13854
+ isSpotlighted: isSpotlighted }), /* @conditional-compile-remove(spotlight) */
13855
+ isSpotlighted && spotlightBorder));
13827
13856
  });
13828
13857
  const FloatingLocalCameraCycleButton = (props) => {
13829
13858
  const { showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel, localVideoSelectedDescription } = props;
@@ -14016,35 +14045,41 @@ const _useOrganizedParticipants = (props) => {
14016
14045
  return { gridParticipants, overflowGalleryParticipants: overflowGalleryParticipants };
14017
14046
  };
14018
14047
  /* @conditional-compile-remove(pinned-participants) */
14019
- const _useOrganizedParticipantsWithPinnedParticipants = (props) => {
14020
- var _a;
14048
+ const _useOrganizedParticipantsWithFocusedParticipants = (props) => {
14049
+ var _a, _b;
14021
14050
  // map remote participants by userId
14022
14051
  const remoteParticipantMap = props.remoteParticipants.reduce((map, remoteParticipant) => {
14023
14052
  map[remoteParticipant.userId] = remoteParticipant;
14024
14053
  return map;
14025
14054
  }, {});
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) => {
14055
+ const spotlightedParticipantUserIds = (_a = props.spotlightedParticipantUserIds) !== null && _a !== void 0 ? _a : [];
14056
+ // declare focused participant user ids as spotlighted participants user ids followed by
14057
+ // pinned participants user ids
14058
+ const focusedParticipantUserIds = [
14059
+ ...new Set(spotlightedParticipantUserIds.concat((_b = props.pinnedParticipantUserIds) !== null && _b !== void 0 ? _b : []))
14060
+ ];
14061
+ // get focused participants from map of remote participants in the order of the user ids
14062
+ const focusedParticipants = [];
14063
+ focusedParticipantUserIds.forEach((id) => {
14029
14064
  const pinnedParticipant = remoteParticipantMap[id];
14030
14065
  if (pinnedParticipant) {
14031
- pinnedParticipants.push(pinnedParticipant);
14066
+ focusedParticipants.push(pinnedParticipant);
14032
14067
  }
14033
14068
  });
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));
14069
+ // get unfocused participants by filtering out set of focused participant user ids from all remote participants
14070
+ const focusedParticipantUserIdSet = new Set(focusedParticipantUserIds);
14071
+ const unfocusedParticipants = props.remoteParticipants.filter((p) => !focusedParticipantUserIdSet.has(p.userId));
14037
14072
  const useOrganizedParticipantsProps = Object.assign(Object.assign({}, props), {
14038
14073
  // if there are pinned participants then we should only consider unpinned participants
14039
- remoteParticipants: unpinnedParticipants });
14074
+ remoteParticipants: unfocusedParticipants });
14040
14075
  const useOrganizedParticipantsResult = _useOrganizedParticipants(useOrganizedParticipantsProps);
14041
- if (pinnedParticipants.length === 0) {
14076
+ if (focusedParticipants.length === 0) {
14042
14077
  return useOrganizedParticipantsResult;
14043
14078
  }
14044
14079
  return {
14045
- gridParticipants: props.isScreenShareActive ? [] : pinnedParticipants,
14080
+ gridParticipants: props.isScreenShareActive ? [] : focusedParticipants,
14046
14081
  overflowGalleryParticipants: props.isScreenShareActive
14047
- ? pinnedParticipants.concat(useOrganizedParticipantsResult.overflowGalleryParticipants)
14082
+ ? focusedParticipants.concat(useOrganizedParticipantsResult.overflowGalleryParticipants)
14048
14083
  : useOrganizedParticipantsResult.gridParticipants.concat(useOrganizedParticipantsResult.overflowGalleryParticipants)
14049
14084
  };
14050
14085
  };
@@ -14069,7 +14104,7 @@ const putVideoParticipantsFirst = (remoteParticipants) => {
14069
14104
  */
14070
14105
  const useOrganizedParticipants = (args) => {
14071
14106
  /* @conditional-compile-remove(pinned-participants) */
14072
- return _useOrganizedParticipantsWithPinnedParticipants(args);
14107
+ return _useOrganizedParticipantsWithFocusedParticipants(args);
14073
14108
  };
14074
14109
 
14075
14110
  // Copyright (c) Microsoft Corporation.
@@ -14869,7 +14904,8 @@ const DefaultLayout = (props) => {
14869
14904
  const { remoteParticipants = [], localParticipant, dominantSpeakers, localVideoComponent, screenShareComponent, onRenderRemoteParticipant, styles, maxRemoteVideoStreams, parentWidth,
14870
14905
  /* @conditional-compile-remove(vertical-gallery) */
14871
14906
  parentHeight, pinnedParticipantUserIds = [],
14872
- /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition = 'horizontalBottom' } = props;
14907
+ /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition = 'horizontalBottom',
14908
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds } = props;
14873
14909
  const isNarrow = parentWidth ? isNarrowWidth(parentWidth) : false;
14874
14910
  /* @conditional-compile-remove(vertical-gallery) */
14875
14911
  const isShort = parentHeight ? isShortHeight(parentHeight) : false;
@@ -14887,7 +14923,8 @@ const DefaultLayout = (props) => {
14887
14923
  ? childrenPerPage.current - ((pinnedParticipantUserIds.length + 1) % childrenPerPage.current)
14888
14924
  : childrenPerPage.current,
14889
14925
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds,
14890
- /* @conditional-compile-remove(gallery-layouts) */ layout: 'default'
14926
+ /* @conditional-compile-remove(gallery-layouts) */ layout: 'default',
14927
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds
14891
14928
  });
14892
14929
  let activeVideoStreams = 0;
14893
14930
  const gridTiles = gridParticipants.map((p) => {
@@ -15709,7 +15746,8 @@ const layerHostStyle = {
15709
15746
  const FloatingLocalVideoLayout = (props) => {
15710
15747
  const { remoteParticipants = [], dominantSpeakers, localVideoComponent, screenShareComponent, onRenderRemoteParticipant, styles, maxRemoteVideoStreams, showCameraSwitcherInLocalPreview, parentWidth, parentHeight,
15711
15748
  /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition = 'horizontalBottom', pinnedParticipantUserIds = [],
15712
- /* @conditional-compile-remove(click-to-call) */ localVideoTileSize } = props;
15749
+ /* @conditional-compile-remove(click-to-call) */ localVideoTileSize,
15750
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds } = props;
15713
15751
  const theme = useTheme();
15714
15752
  const isNarrow = parentWidth ? isNarrowWidth(parentWidth) : false;
15715
15753
  /* @conditional-compile-remove(vertical-gallery) */
@@ -15726,7 +15764,8 @@ const FloatingLocalVideoLayout = (props) => {
15726
15764
  ? childrenPerPage.current - (pinnedParticipantUserIds.length % childrenPerPage.current)
15727
15765
  : childrenPerPage.current,
15728
15766
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds,
15729
- /* @conditional-compile-remove(gallery-layouts) */ layout: 'floatingLocalVideo'
15767
+ /* @conditional-compile-remove(gallery-layouts) */ layout: 'floatingLocalVideo',
15768
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds
15730
15769
  });
15731
15770
  let activeVideoStreams = 0;
15732
15771
  const gridTiles = gridParticipants.map((p) => {
@@ -16140,7 +16179,9 @@ const VideoGallery = (props) => {
16140
16179
  /* @conditional-compile-remove(vertical-gallery) */
16141
16180
  overflowGalleryPosition = 'horizontalBottom',
16142
16181
  /* @conditional-compile-remove(rooms) */
16143
- localVideoTileSize = 'followDeviceOrientation' } = props;
16182
+ localVideoTileSize = 'followDeviceOrientation',
16183
+ /* @conditional-compile-remove(spotlight) */
16184
+ spotlightedParticipants } = props;
16144
16185
  const ids = useIdentifiers();
16145
16186
  const theme = useTheme();
16146
16187
  const localeStrings = useLocale$1().strings.videoGallery;
@@ -16197,6 +16238,8 @@ const VideoGallery = (props) => {
16197
16238
  if (onRenderLocalVideoTile) {
16198
16239
  return onRenderLocalVideoTile(localParticipant);
16199
16240
  }
16241
+ /* @conditional-compile-remove(spotlight) */
16242
+ const isSpotlighted = spotlightedParticipants === null || spotlightedParticipants === void 0 ? void 0 : spotlightedParticipants.includes(localParticipant.userId);
16200
16243
  const localVideoTileStyles = react.concatStyleSets(localTileNotInGrid ? floatingLocalVideoTileStyle : {}, {
16201
16244
  root: { borderRadius: theme.effects.roundedCorner4 }
16202
16245
  }, styles === null || styles === void 0 ? void 0 : styles.localVideo);
@@ -16210,7 +16253,9 @@ const VideoGallery = (props) => {
16210
16253
  /* @conditional-compile-remove(raise-hand) */
16211
16254
  raisedHand: localParticipant.raisedHand,
16212
16255
  /* @conditional-compile-remove(reaction) */
16213
- reaction: localParticipant.reaction })));
16256
+ reaction: localParticipant.reaction,
16257
+ /* @conditional-compile-remove(spotlight) */
16258
+ isSpotlighted: isSpotlighted })));
16214
16259
  }, [
16215
16260
  isNarrow,
16216
16261
  localParticipant,
@@ -16233,7 +16278,9 @@ const VideoGallery = (props) => {
16233
16278
  localVideoTileSize,
16234
16279
  /* @conditional-compile-remove(gallery-layouts) */
16235
16280
  layout,
16236
- showLocalVideoTileLabel
16281
+ showLocalVideoTileLabel,
16282
+ /* @conditional-compile-remove(spotlight) */
16283
+ spotlightedParticipants
16237
16284
  ]);
16238
16285
  /* @conditional-compile-remove(pinned-participants) */
16239
16286
  const onPinParticipant = React.useCallback((userId) => {
@@ -16270,7 +16317,11 @@ const VideoGallery = (props) => {
16270
16317
  /* @conditional-compile-remove(pinned-participants) */
16271
16318
  const selectedScalingMode = remoteVideoStream ? selectedScalingModeState[participant.userId] : undefined;
16272
16319
  /* @conditional-compile-remove(pinned-participants) */
16273
- const isPinned = pinnedParticipants === null || pinnedParticipants === void 0 ? void 0 : pinnedParticipants.includes(participant.userId);
16320
+ let isPinned = pinnedParticipants === null || pinnedParticipants === void 0 ? void 0 : pinnedParticipants.includes(participant.userId);
16321
+ /* @conditional-compile-remove(spotlight) */
16322
+ const isSpotlighted = spotlightedParticipants === null || spotlightedParticipants === void 0 ? void 0 : spotlightedParticipants.includes(participant.userId);
16323
+ /* @conditional-compile-remove(spotlight) */
16324
+ isPinned = isSpotlighted ? false : isPinned;
16274
16325
  const createViewOptions = () => {
16275
16326
  var _a, _b;
16276
16327
  /* @conditional-compile-remove(pinned-participants) */
@@ -16310,7 +16361,9 @@ const VideoGallery = (props) => {
16310
16361
  /* @conditional-compile-remove(pinned-participants) */
16311
16362
  disablePinMenuItem: pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES,
16312
16363
  /* @conditional-compile-remove(pinned-participants) */
16313
- toggleAnnouncerString: toggleAnnouncerString }));
16364
+ toggleAnnouncerString: toggleAnnouncerString,
16365
+ /* @conditional-compile-remove(spotlight) */
16366
+ isSpotlighted: isSpotlighted }));
16314
16367
  }, [
16315
16368
  onCreateRemoteStreamView,
16316
16369
  onDisposeRemoteVideoStreamView,
@@ -16326,7 +16379,8 @@ const VideoGallery = (props) => {
16326
16379
  /* @conditional-compile-remove(pinned-participants) */ onPinParticipant,
16327
16380
  /* @conditional-compile-remove(pinned-participants) */ onUnpinParticipant,
16328
16381
  /* @conditional-compile-remove(pinned-participants) */ toggleAnnouncerString,
16329
- /* @conditional-compile-remove(pinned-participants) */ onUpdateScalingMode
16382
+ /* @conditional-compile-remove(pinned-participants) */ onUpdateScalingMode,
16383
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipants
16330
16384
  ]);
16331
16385
  const screenShareParticipant = remoteParticipants.find((participant) => { var _a; return (_a = participant.screenShareStream) === null || _a === void 0 ? void 0 : _a.isAvailable; });
16332
16386
  const localScreenShareStreamComponent = React.createElement(LocalScreenShare, { localParticipant: localParticipant });
@@ -16350,7 +16404,8 @@ const VideoGallery = (props) => {
16350
16404
  parentHeight: containerHeight,
16351
16405
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds: pinnedParticipants,
16352
16406
  /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,
16353
- /* @conditional-compile-remove(click-to-call) */ localVideoTileSize
16407
+ /* @conditional-compile-remove(click-to-call) */ localVideoTileSize,
16408
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds: spotlightedParticipants
16354
16409
  }), [
16355
16410
  remoteParticipants,
16356
16411
  localParticipant,
@@ -16366,7 +16421,8 @@ const VideoGallery = (props) => {
16366
16421
  defaultOnRenderVideoTile,
16367
16422
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipants,
16368
16423
  /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,
16369
- /* @conditional-compile-remove(click-to-call) */ localVideoTileSize
16424
+ /* @conditional-compile-remove(click-to-call) */ localVideoTileSize,
16425
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipants
16370
16426
  ]);
16371
16427
  const videoGalleryLayout = React.useMemo(() => {
16372
16428
  /* @conditional-compile-remove(gallery-layouts) */
@@ -18615,6 +18671,7 @@ const _TagsSurvey = (props) => {
18615
18671
  const [selectedTags, setSelectedTags] = React.useState({});
18616
18672
  const [textResponse, setTextResponse] = React.useState({});
18617
18673
  const [selectedTextResponse, setSelectedTextResponse] = React.useState({});
18674
+ const [checkedTextFields, setCheckedTextFields] = React.useState([]);
18618
18675
  const tags = React.useMemo(() => {
18619
18676
  const tags = [];
18620
18677
  Object.keys(callIssuesToTag).forEach((issueCategory) => {
@@ -18652,6 +18709,7 @@ const _TagsSurvey = (props) => {
18652
18709
  });
18653
18710
  }
18654
18711
  else {
18712
+ setCheckedTextFields([...checkedTextFields, issueCategory]);
18655
18713
  setSelectedTextResponse((prevState) => {
18656
18714
  prevState[issueCategory] = textResponse[issueCategory];
18657
18715
  return prevState;
@@ -18673,33 +18731,35 @@ const _TagsSurvey = (props) => {
18673
18731
  });
18674
18732
  }
18675
18733
  else {
18734
+ setCheckedTextFields(checkedTextFields.filter((id) => id !== issueCategory));
18676
18735
  setSelectedTextResponse((prevState) => {
18677
18736
  delete prevState[issueCategory];
18678
18737
  return prevState;
18679
18738
  });
18680
18739
  }
18681
18740
  }
18682
- if (onConfirm) {
18683
- onConfirm(selectedTags, selectedTextResponse);
18684
- }
18685
- }, [onConfirm, selectedTags, selectedTextResponse, textResponse]);
18741
+ }, [textResponse, checkedTextFields]);
18686
18742
  const theme = react.useTheme();
18687
18743
  const onRenderLabel = React.useCallback((issueCategory) => {
18688
18744
  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
18745
  if (v) {
18746
+ setCheckedTextFields([...checkedTextFields, issueCategory]);
18690
18747
  setTextResponse((prevState) => {
18691
18748
  prevState[issueCategory] = v;
18692
18749
  return prevState;
18693
18750
  });
18694
18751
  setSelectedTextResponse((prevState) => {
18695
- if (Object.keys(prevState).includes(issueCategory)) {
18696
- prevState[issueCategory] = v;
18697
- }
18752
+ prevState[issueCategory] = v;
18698
18753
  return prevState;
18699
18754
  });
18700
18755
  }
18701
18756
  } }));
18702
- }, [strings === null || strings === void 0 ? void 0 : strings.tagsSurveyTextFieldDefaultText]);
18757
+ }, [strings === null || strings === void 0 ? void 0 : strings.tagsSurveyTextFieldDefaultText, checkedTextFields]);
18758
+ React.useEffect(() => {
18759
+ if (onConfirm) {
18760
+ onConfirm(selectedTags, selectedTextResponse);
18761
+ }
18762
+ }, [selectedTags, selectedTextResponse, onConfirm]);
18703
18763
  return (React.createElement(React.Fragment, null,
18704
18764
  React.createElement(react.Stack, { verticalAlign: "center" },
18705
18765
  React.createElement(react.Text, { className: questionTextStyle(theme) }, strings === null || strings === void 0 ? void 0 : strings.tagsSurveyQuestion)),
@@ -18711,7 +18771,7 @@ const _TagsSurvey = (props) => {
18711
18771
  tags[key].map((t, i) => {
18712
18772
  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
18773
  }),
18714
- showFreeFormTextField && (React.createElement(react.Checkbox, { styles: freeFormTextCheckboxStyles, onChange: (ev, checked) => onChange(key, checked !== null && checked !== void 0 ? checked : false), onRenderLabel: () => {
18774
+ 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
18775
  return onRenderLabel(key);
18716
18776
  } }))));
18717
18777
  })),
@@ -26061,7 +26121,7 @@ const Reaction = (props) => {
26061
26121
  const reactionButtonProps = usePropsFor$1(ReactionButton);
26062
26122
  const styles = React.useMemo(() => { var _a; return concatButtonBaseStyles((_a = props.styles) !== null && _a !== void 0 ? _a : {}); }, [props.styles]);
26063
26123
  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 })));
26124
+ 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
26125
  };
26066
26126
  /* @conditional-compile-remove(reaction) */
26067
26127
  const isDisabled = (option) => {