@azure/communication-react 1.4.3-alpha-202301060015.0 → 1.4.3-alpha-202301080014.0

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 (34) hide show
  1. package/dist/communication-react.d.ts +59 -9
  2. package/dist/dist-cjs/communication-react/index.js +57 -65
  3. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  4. package/dist/dist-esm/acs-ui-common/src/identifier.js +3 -47
  5. package/dist/dist-esm/acs-ui-common/src/identifier.js.map +1 -1
  6. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  7. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  8. package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +2 -1
  9. package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
  10. package/dist/dist-esm/calling-stateful-client/src/Converter.js +1 -1
  11. package/dist/dist-esm/calling-stateful-client/src/Converter.js.map +1 -1
  12. package/dist/dist-esm/communication-react/src/index.d.ts +1 -0
  13. package/dist/dist-esm/communication-react/src/index.js.map +1 -1
  14. package/dist/dist-esm/react-components/src/components/ParticipantItem.js +4 -2
  15. package/dist/dist-esm/react-components/src/components/ParticipantItem.js.map +1 -1
  16. package/dist/dist-esm/react-components/src/components/VideoGallery.d.ts +44 -8
  17. package/dist/dist-esm/react-components/src/components/VideoGallery.js +27 -10
  18. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  19. package/dist/dist-esm/react-components/src/components/VideoTile.js +1 -1
  20. package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
  21. package/dist/dist-esm/react-components/src/components/index.d.ts +1 -0
  22. package/dist/dist-esm/react-components/src/components/index.js.map +1 -1
  23. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.d.ts +17 -0
  24. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js.map +1 -1
  25. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.d.ts +2 -0
  26. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.js +18 -2
  27. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.js.map +1 -1
  28. package/dist/dist-esm/react-composites/src/composites/CallComposite/index.d.ts +1 -0
  29. package/dist/dist-esm/react-composites/src/composites/CallComposite/index.js.map +1 -1
  30. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js +3 -1
  31. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js.map +1 -1
  32. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/MediaGalleryUtils.js +1 -1
  33. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/MediaGalleryUtils.js.map +1 -1
  34. package/package.json +9 -9
@@ -26,6 +26,7 @@ import { CallClientOptions } from '@azure/communication-calling';
26
26
  import { CallDirection } from '@azure/communication-calling';
27
27
  import { CallEndReason } from '@azure/communication-calling';
28
28
  import { CallerInfo } from '@azure/communication-calling';
29
+ import { CallKind } from '@azure/communication-calling';
29
30
  import { CallState as CallState_2 } from '@azure/communication-calling';
30
31
  import { ChatClient } from '@azure/communication-chat';
31
32
  import { ChatClientOptions } from '@azure/communication-chat';
@@ -1237,6 +1238,10 @@ export declare type CallCompositeOptions = {
1237
1238
  * if this is not supplied, the composite will not show a unsupported browser page.
1238
1239
  */
1239
1240
  onEnvironmentInfoTroubleshootingClick?: () => void;
1241
+ /**
1242
+ * Remote participant video tile menu options
1243
+ */
1244
+ remoteVideoTileMenu?: RemoteVideoTileMenuOptions;
1240
1245
  };
1241
1246
 
1242
1247
  /**
@@ -1887,7 +1892,7 @@ export declare interface CallState {
1887
1892
  /**
1888
1893
  * Type of the call.
1889
1894
  */
1890
- type: 'Teams' | 'ACS';
1895
+ kind: CallKind;
1891
1896
  /**
1892
1897
  * Proxy of {@link @azure/communication-calling#Call.callerInfo}.
1893
1898
  */
@@ -7041,6 +7046,20 @@ export declare interface RemoteVideoStreamState {
7041
7046
  view?: VideoStreamRendererViewState;
7042
7047
  }
7043
7048
 
7049
+ /**
7050
+ * Menu options for remote video tiles in {@link VideoGallery}.
7051
+ *
7052
+ * @beta
7053
+ */
7054
+ export declare interface RemoteVideoTileMenuOptions {
7055
+ /**
7056
+ * If set to true, remote video tiles in the VideoGallery will not have menu options
7057
+ *
7058
+ * @defaultValue false
7059
+ */
7060
+ isHidden?: boolean;
7061
+ }
7062
+
7044
7063
  /**
7045
7064
  * @beta
7046
7065
  * The role of a call participant.
@@ -8225,22 +8244,23 @@ export declare interface VideoGalleryProps {
8225
8244
  */
8226
8245
  localVideoCameraCycleButtonProps?: LocalVideoCameraCycleButtonProps;
8227
8246
  /**
8228
- * List of pinned participant userIds
8247
+ * List of pinned participant userIds.
8229
8248
  */
8230
8249
  pinnedParticipants?: string[];
8231
8250
  /**
8232
- * Whether to show the remote video tile contextual menu.
8233
- * @defaultValue `true`
8234
- */
8235
- showRemoteVideoTileContextualMenu?: boolean;
8236
- /**
8237
- * This callback will be called when a participant video tile is pinned
8251
+ * This callback will be called when a participant video tile is pinned.
8238
8252
  */
8239
8253
  onPinParticipant?: (userId: string) => void;
8240
8254
  /**
8241
- * This callback will be called when a participant video tile is un-pinned
8255
+ * This callback will be called when a participant video tile is un-pinned.
8242
8256
  */
8243
8257
  onUnpinParticipant?: (userId: string) => void;
8258
+ /**
8259
+ * Options for showing the remote video tile menu.
8260
+ *
8261
+ * @defaultValue \{ kind: 'contextual' \}
8262
+ */
8263
+ remoteVideoTileMenuOptions?: false | VideoTileContextualMenuProps | VideoTileDrawerMenuProps;
8244
8264
  }
8245
8265
 
8246
8266
  /**
@@ -8377,6 +8397,36 @@ export declare interface VideoStreamRendererViewState {
8377
8397
  */
8378
8398
  export declare const VideoTile: (props: VideoTileProps) => JSX.Element;
8379
8399
 
8400
+ /**
8401
+ * Properties for showing contextual menu for remote {@link VideoTile} components in {@link VideoGallery}.
8402
+ *
8403
+ * @beta
8404
+ */
8405
+ export declare interface VideoTileContextualMenuProps {
8406
+ /**
8407
+ * The menu property kind
8408
+ */
8409
+ kind: 'contextual';
8410
+ }
8411
+
8412
+ /**
8413
+ * Properties for showing drawer menu on remote {@link VideoTile} long touch in {@link VideoGallery}.
8414
+ *
8415
+ * @beta
8416
+ */
8417
+ export declare interface VideoTileDrawerMenuProps {
8418
+ /**
8419
+ * The menu property kind
8420
+ */
8421
+ kind: 'drawer';
8422
+ /**
8423
+ * The optional id property provided on an element that the drawer menu should render within when a
8424
+ * remote participant video tile Drawer is shown. If an id is not provided, then a drawer menu will
8425
+ * render within the VideoGallery component.
8426
+ */
8427
+ hostId?: string;
8428
+ }
8429
+
8380
8430
  /**
8381
8431
  * Props for {@link VideoTile}.
8382
8432
  *
@@ -123,12 +123,6 @@ const memoizeFnAll = (fnToMemoize, shouldCacheUpdate = Object.is) => {
123
123
  };
124
124
 
125
125
  // Copyright (c) Microsoft Corporation.
126
- const COMMUNICATION_USER_PREFIX = '8:acs:';
127
- const PHONE_NUMBER_PREFIX = '4:';
128
- const TEAMS_DOD_PREFIX = '8:dod:';
129
- const TEAMS_GCCH_PREFIX = '8:gcch:';
130
- const TEAMS_USER_PREFIX = '8:orgid:';
131
- const TEAMS_VISITOR_PREFIX = '8:teamsvisitor:';
132
126
  /**
133
127
  * A string representation of a {@link @azure/communication-common#CommunicationIdentifier}.
134
128
  *
@@ -140,25 +134,7 @@ const TEAMS_VISITOR_PREFIX = '8:teamsvisitor:';
140
134
  * @public
141
135
  */
142
136
  const toFlatCommunicationIdentifier = (identifier) => {
143
- if (communicationCommon.isCommunicationUserIdentifier(identifier)) {
144
- return identifier.communicationUserId;
145
- }
146
- if (communicationCommon.isMicrosoftTeamsUserIdentifier(identifier)) {
147
- if (identifier.isAnonymous) {
148
- return TEAMS_VISITOR_PREFIX + identifier.microsoftTeamsUserId;
149
- }
150
- if (identifier.cloud === 'dod') {
151
- return TEAMS_DOD_PREFIX + identifier.microsoftTeamsUserId;
152
- }
153
- if (identifier.cloud === 'gcch') {
154
- return TEAMS_GCCH_PREFIX + identifier.microsoftTeamsUserId;
155
- }
156
- return TEAMS_USER_PREFIX + identifier.microsoftTeamsUserId;
157
- }
158
- if (communicationCommon.isPhoneNumberIdentifier(identifier)) {
159
- return PHONE_NUMBER_PREFIX + identifier.phoneNumber;
160
- }
161
- return identifier.id;
137
+ return communicationCommon.getIdentifierRawId(identifier);
162
138
  };
163
139
  /**
164
140
  * Reverse operation of {@link toFlatCommunicationIdentifier}.
@@ -166,27 +142,7 @@ const toFlatCommunicationIdentifier = (identifier) => {
166
142
  * @public
167
143
  */
168
144
  const fromFlatCommunicationIdentifier = (id) => {
169
- if (id.startsWith(COMMUNICATION_USER_PREFIX)) {
170
- // The prefix is preserved for this variant of the identifier.
171
- return { communicationUserId: id };
172
- }
173
- if (id.startsWith(PHONE_NUMBER_PREFIX) || id.startsWith('+')) {
174
- const isPhoneNumber = id.startsWith(PHONE_NUMBER_PREFIX) ? id.replace(PHONE_NUMBER_PREFIX, '') : id;
175
- return { phoneNumber: isPhoneNumber };
176
- }
177
- if (id.startsWith(TEAMS_USER_PREFIX)) {
178
- return { microsoftTeamsUserId: id.replace(TEAMS_USER_PREFIX, '') };
179
- }
180
- if (id.startsWith(TEAMS_DOD_PREFIX)) {
181
- return { microsoftTeamsUserId: id.replace(TEAMS_DOD_PREFIX, ''), cloud: 'dod' };
182
- }
183
- if (id.startsWith(TEAMS_GCCH_PREFIX)) {
184
- return { microsoftTeamsUserId: id.replace(TEAMS_GCCH_PREFIX, ''), cloud: 'gcch' };
185
- }
186
- if (id.startsWith(TEAMS_VISITOR_PREFIX)) {
187
- return { microsoftTeamsUserId: id.replace(TEAMS_VISITOR_PREFIX, ''), isAnonymous: true };
188
- }
189
- return { id };
145
+ return communicationCommon.createIdentifierFromRawId(id);
190
146
  };
191
147
  /**
192
148
  * Returns a CommunicationIdentifier.
@@ -202,7 +158,7 @@ const _toCommunicationIdentifier = (id) => {
202
158
  // Copyright (c) Microsoft Corporation.
203
159
  // Licensed under the MIT license.
204
160
  // GENERATED FILE. DO NOT EDIT MANUALLY.
205
- var telemetryVersion = '1.4.3-alpha-202301060015.0';
161
+ var telemetryVersion = '1.4.3-alpha-202301080014.0';
206
162
 
207
163
  // Copyright (c) Microsoft Corporation.
208
164
  /**
@@ -1886,7 +1842,7 @@ function convertSdkCallToDeclarativeCall(call) {
1886
1842
  return {
1887
1843
  id: call.id,
1888
1844
  /* @conditional-compile-remove(teams-identity-support) */
1889
- type: _isACSCall(call) ? 'ACS' : 'Teams',
1845
+ kind: _isACSCall(call) ? 'Call' : 'TeamsCall',
1890
1846
  callerInfo: call.callerInfo,
1891
1847
  state: call.state,
1892
1848
  callEndReason: call.callEndReason,
@@ -7609,13 +7565,15 @@ const ParticipantItem = (props) => {
7609
7565
  const localeStrings = useLocale$1().strings.participantItem;
7610
7566
  const ids = useIdentifiers();
7611
7567
  const strings = Object.assign(Object.assign({}, localeStrings), props.strings);
7568
+ // For 'me' show empty name so avatar will get 'Person' icon, when there is no name
7569
+ const meAvatarText = (displayName === null || displayName === void 0 ? void 0 : displayName.trim()) || '';
7612
7570
  const avatarOptions = {
7613
- text: (displayName === null || displayName === void 0 ? void 0 : displayName.trim()) || strings.displayNamePlaceholder,
7571
+ text: me ? meAvatarText : (displayName === null || displayName === void 0 ? void 0 : displayName.trim()) || strings.displayNamePlaceholder,
7614
7572
  size: react.PersonaSize.size32,
7615
7573
  presence: presence,
7616
7574
  initialsTextColor: 'white',
7617
7575
  showOverflowTooltip: showParticipantOverflowTooltip,
7618
- showUnknownPersonaCoin: !(displayName === null || displayName === void 0 ? void 0 : displayName.trim()) || displayName === strings.displayNamePlaceholder
7576
+ showUnknownPersonaCoin: !me && (!(displayName === null || displayName === void 0 ? void 0 : displayName.trim()) || displayName === strings.displayNamePlaceholder)
7619
7577
  };
7620
7578
  const avatar = onRenderAvatar ? (onRenderAvatar(userId !== null && userId !== void 0 ? userId : '', avatarOptions)) : (React__default['default'].createElement(react.Persona, Object.assign({ className: react.mergeStyles({
7621
7579
  // Prevents persona text from being vertically truncated if a global line height is less than 1.15.
@@ -8519,7 +8477,7 @@ const VideoTile = (props) => {
8519
8477
  ]);
8520
8478
  const placeholderOptions = {
8521
8479
  userId,
8522
- text: initialsName || displayName,
8480
+ text: initialsName !== null && initialsName !== void 0 ? initialsName : displayName,
8523
8481
  noVideoAvailableAriaLabel,
8524
8482
  coinSize: personaSize,
8525
8483
  styles: defaultPersonaStyles,
@@ -10241,6 +10199,13 @@ const PinnedParticipantsLayout = (props) => {
10241
10199
  * Currently the Calling JS SDK supports up to 4 remote video streams
10242
10200
  */
10243
10201
  const DEFAULT_MAX_REMOTE_VIDEO_STREAMS = 4;
10202
+ /**
10203
+ * @private
10204
+ * Default remote video tile menu options
10205
+ */
10206
+ const DEFAULT_REMOTE_VIDEO_TILE_MENU_OPTIONS = {
10207
+ kind: 'contextual'
10208
+ };
10244
10209
  /**
10245
10210
  * VideoGallery represents a layout of video tiles for a specific call.
10246
10211
  * It displays a {@link VideoTile} for the local user as well as for each remote participant who has joined the call.
@@ -10253,14 +10218,19 @@ const VideoGallery = (props) => {
10253
10218
  /* @conditional-compile-remove(pinned-participants) */
10254
10219
  onPinParticipant: onPinParticipantHandler,
10255
10220
  /* @conditional-compile-remove(pinned-participants) */
10256
- onUnpinParticipant: onUnpinParticipantHandler } = props;
10221
+ onUnpinParticipant: onUnpinParticipantHandler,
10222
+ /* @conditional-compile-remove(pinned-participants) */
10223
+ remoteVideoTileMenuOptions = DEFAULT_REMOTE_VIDEO_TILE_MENU_OPTIONS } = props;
10257
10224
  const ids = useIdentifiers();
10258
10225
  const theme = useTheme();
10259
10226
  const localeStrings = useLocale$1().strings.videoGallery;
10260
10227
  const strings = React.useMemo(() => (Object.assign(Object.assign({}, localeStrings), props.strings)), [localeStrings, props.strings]);
10261
- // @TODO: Provide a default value to this hook using the `drawerMenuHostId` value in the props when VideoGallery props have been updated.
10262
- // Example: `const drawerMenuHostId = useId('drawerMenuHost', props.drawerMenuHostId);`
10263
- const drawerMenuHostId = reactHooks.useId('drawerMenuHost');
10228
+ /* @conditional-compile-remove(pinned-participants) */
10229
+ const drawerMenuHostIdFromProp = remoteVideoTileMenuOptions && remoteVideoTileMenuOptions.kind === 'drawer'
10230
+ ? remoteVideoTileMenuOptions.hostId
10231
+ : undefined;
10232
+ /* @conditional-compile-remove(pinned-participants) */
10233
+ const drawerMenuHostId = reactHooks.useId('drawerMenuHost', drawerMenuHostIdFromProp);
10264
10234
  const shouldFloatLocalVideo = !!(layout === 'floatingLocalVideo' && remoteParticipants.length > 0);
10265
10235
  const containerRef = React.useRef(null);
10266
10236
  const containerWidth = _useContainerWidth(containerRef);
@@ -10288,7 +10258,7 @@ const VideoGallery = (props) => {
10288
10258
  const localVideoTileStyles = react.concatStyleSets(shouldFloatLocalVideo ? floatingLocalVideoTileStyle : {}, {
10289
10259
  root: { borderRadius: theme.effects.roundedCorner4 }
10290
10260
  }, styles === null || styles === void 0 ? void 0 : styles.localVideo);
10291
- const initialsName = !localParticipant.displayName ? strings.displayNamePlaceholder : localParticipant.displayName;
10261
+ const initialsName = !localParticipant.displayName ? '' : localParticipant.displayName;
10292
10262
  return (React__default['default'].createElement(react.Stack, { key: "local-video-tile-key", tabIndex: 0, "aria-label": strings.localVideoMovementLabel, role: 'dialog' },
10293
10263
  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), showMuteIndicator: showMuteIndicator, showCameraSwitcherInLocalPreview: showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps: localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel: strings.localVideoCameraSwitcherLabel, localVideoSelectedDescription: strings.localVideoSelectedDescription, styles: localVideoTileStyles })));
10294
10264
  }, [
@@ -10307,7 +10277,6 @@ const VideoGallery = (props) => {
10307
10277
  strings.localVideoLabel,
10308
10278
  strings.localVideoMovementLabel,
10309
10279
  strings.localVideoSelectedDescription,
10310
- strings.displayNamePlaceholder,
10311
10280
  styles === null || styles === void 0 ? void 0 : styles.localVideo,
10312
10281
  theme.effects.roundedCorner4,
10313
10282
  /* @conditional-compile-remove(rooms) */ permissions.cameraButton
@@ -10332,7 +10301,9 @@ const VideoGallery = (props) => {
10332
10301
  /* @conditional-compile-remove(PSTN-calls) */
10333
10302
  participantState: participant.state,
10334
10303
  /* @conditional-compile-remove(pinned-participants) */
10335
- showRemoteVideoTileContextualMenu: props.showRemoteVideoTileContextualMenu, drawerMenuHostId: drawerMenuHostId,
10304
+ showRemoteVideoTileContextualMenu: remoteVideoTileMenuOptions && remoteVideoTileMenuOptions.kind === 'contextual',
10305
+ /* @conditional-compile-remove(pinned-participants) */
10306
+ drawerMenuHostId: drawerMenuHostId,
10336
10307
  /* @conditional-compile-remove(pinned-participants) */
10337
10308
  onPinParticipant: onPinParticipant,
10338
10309
  /* @conditional-compile-remove(pinned-participants) */
@@ -10346,8 +10317,8 @@ const VideoGallery = (props) => {
10346
10317
  onRenderAvatar,
10347
10318
  showMuteIndicator,
10348
10319
  strings,
10349
- drawerMenuHostId,
10350
- /* @conditional-compile-remove(pinned-participants) */ props.showRemoteVideoTileContextualMenu,
10320
+ /* @conditional-compile-remove(pinned-participants) */ drawerMenuHostId,
10321
+ /* @conditional-compile-remove(pinned-participants) */ remoteVideoTileMenuOptions,
10351
10322
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipants,
10352
10323
  /* @conditional-compile-remove(pinned-participants) */ onPinParticipant,
10353
10324
  /* @conditional-compile-remove(pinned-participants) */ onUnpinParticipant
@@ -10398,7 +10369,10 @@ const VideoGallery = (props) => {
10398
10369
  }
10399
10370
  return React__default['default'].createElement(DefaultLayout, Object.assign({}, layoutProps));
10400
10371
  }, [layout, layoutProps]);
10401
- return (React__default['default'].createElement("div", { id: drawerMenuHostId, "data-ui-id": ids.videoGallery, ref: containerRef, className: react.mergeStyles(videoGalleryOuterDivStyle, styles === null || styles === void 0 ? void 0 : styles.root) }, videoGalleryLayout));
10372
+ return (React__default['default'].createElement("div", {
10373
+ /* @conditional-compile-remove(pinned-participants) */
10374
+ // We don't assign an drawer menu host id to the VideoGallery when a drawerMenuHostId is assigned from props
10375
+ id: drawerMenuHostIdFromProp ? undefined : drawerMenuHostId, "data-ui-id": ids.videoGallery, ref: containerRef, className: react.mergeStyles(videoGalleryOuterDivStyle, styles === null || styles === void 0 ? void 0 : styles.root) }, videoGalleryLayout));
10402
10376
  };
10403
10377
 
10404
10378
  // Copyright (c) Microsoft Corporation.
@@ -18589,7 +18563,7 @@ const createAnnouncmentString = (direction, participants, strings) => {
18589
18563
  * Filter participants into two arrays to put all the unnamed participants at the back of the
18590
18564
  * names being announced.
18591
18565
  */
18592
- const unnamedParticipants = participants.filter((p) => p.displayName === undefined);
18566
+ const unnamedParticipants = participants.filter((p) => !p.displayName);
18593
18567
  const namedParicipants = participants.filter((p) => p.displayName);
18594
18568
  const sortedParticipants = namedParicipants.concat(unnamedParticipants);
18595
18569
  /**
@@ -18652,6 +18626,7 @@ const remoteVideoViewOptions = {
18652
18626
  * @private
18653
18627
  */
18654
18628
  const MediaGallery = (props) => {
18629
+ var _a;
18655
18630
  const videoGalleryProps = usePropsFor$1(VideoGallery);
18656
18631
  const cameraSwitcherCameras = useSelector$1(localVideoCameraCycleButtonSelector);
18657
18632
  const cameraSwitcherCallback = useHandlers();
@@ -18665,11 +18640,26 @@ const MediaGallery = (props) => {
18665
18640
  React__default['default'].createElement(AvatarPersona, Object.assign({ userId: userId }, options, { dataProvider: props.onFetchAvatarPersonaData })))));
18666
18641
  }, [props.onFetchAvatarPersonaData]);
18667
18642
  useLocalVideoStartTrigger(!!props.isVideoStreamOn);
18643
+ /* @conditional-compile-remove(pinned-participants) */
18644
+ const remoteVideoTileMenuOptions = React.useMemo(() => {
18645
+ var _a;
18646
+ return ((_a = props.remoteVideoTileMenuOptions) === null || _a === void 0 ? void 0 : _a.isHidden)
18647
+ ? false
18648
+ : props.isMobile
18649
+ ? { kind: 'drawer', hostId: props.drawerMenuHostId }
18650
+ : { kind: 'contextual' };
18651
+ }, [(_a = props.remoteVideoTileMenuOptions) === null || _a === void 0 ? void 0 : _a.isHidden, props.isMobile, props.drawerMenuHostId]);
18668
18652
  const VideoGalleryMemoized = React.useMemo(() => {
18669
18653
  return (React__default['default'].createElement(VideoGallery, Object.assign({}, videoGalleryProps, { localVideoViewOptions: localVideoViewOptions$2, remoteVideoViewOptions: remoteVideoViewOptions, styles: VideoGalleryStyles, layout: "floatingLocalVideo", showCameraSwitcherInLocalPreview: props.isMobile, localVideoCameraCycleButtonProps: cameraSwitcherProps, onRenderAvatar: onRenderAvatar,
18670
18654
  /* @conditional-compile-remove(pinned-participants) */
18671
- showRemoteVideoTileContextualMenu: !props.isMobile })));
18672
- }, [videoGalleryProps, props.isMobile, cameraSwitcherProps, onRenderAvatar]);
18655
+ remoteVideoTileMenuOptions: remoteVideoTileMenuOptions })));
18656
+ }, [
18657
+ videoGalleryProps,
18658
+ props.isMobile,
18659
+ onRenderAvatar,
18660
+ cameraSwitcherProps,
18661
+ /* @conditional-compile-remove(pinned-participants) */ remoteVideoTileMenuOptions
18662
+ ]);
18673
18663
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
18674
18664
  React__default['default'].createElement(Announcer, { announcementString: announcerString, ariaLive: 'polite' }),
18675
18665
  VideoGalleryMemoized));
@@ -18900,7 +18890,9 @@ const CallPage = (props) => {
18900
18890
  /* @conditional-compile-remove(one-to-n-calling) */
18901
18891
  onFetchAvatarPersonaData: onFetchAvatarPersonaData, mobileView: mobileView,
18902
18892
  /* @conditional-compile-remove(one-to-n-calling) */
18903
- modalLayerHostId: props.modalLayerHostId, onRenderGalleryContent: () => _isInCall(callStatus) ? (isNetworkHealthy(networkReconnectTileProps.networkReconnectValue) ? (React__default['default'].createElement(MediaGallery, Object.assign({ isMobile: mobileView }, mediaGalleryProps, mediaGalleryHandlers, { onRenderAvatar: onRenderAvatar, onFetchAvatarPersonaData: onFetchAvatarPersonaData, drawerMenuHostId: drawerMenuHostId }))) : (React__default['default'].createElement(NetworkReconnectTile, Object.assign({}, networkReconnectTileProps)))) : (React__default['default'].createElement(React__default['default'].Fragment, null)), dataUiId: 'call-page' }));
18893
+ modalLayerHostId: props.modalLayerHostId, onRenderGalleryContent: () => _isInCall(callStatus) ? (isNetworkHealthy(networkReconnectTileProps.networkReconnectValue) ? (React__default['default'].createElement(MediaGallery, Object.assign({ isMobile: mobileView }, mediaGalleryProps, mediaGalleryHandlers, { onRenderAvatar: onRenderAvatar, onFetchAvatarPersonaData: onFetchAvatarPersonaData,
18894
+ /* @conditional-compile-remove(pinned-participants) */
18895
+ remoteVideoTileMenuOptions: options === null || options === void 0 ? void 0 : options.remoteVideoTileMenu, drawerMenuHostId: drawerMenuHostId }))) : (React__default['default'].createElement(NetworkReconnectTile, Object.assign({}, networkReconnectTileProps)))) : (React__default['default'].createElement(React__default['default'].Fragment, null)), dataUiId: 'call-page' }));
18904
18896
  };
18905
18897
  /**
18906
18898
  * @private