@azure/communication-react 1.3.3-alpha-202208190016.0 → 1.3.3-alpha-202208240015.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 (56) hide show
  1. package/dist/communication-react.d.ts +13 -5
  2. package/dist/dist-cjs/communication-react/index.js +117 -58
  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/Drawer/DrawerMenu.js +1 -1
  7. package/dist/dist-esm/react-components/src/components/Drawer/DrawerMenu.js.map +1 -1
  8. package/dist/dist-esm/react-components/src/components/ParticipantList.js +13 -6
  9. package/dist/dist-esm/react-components/src/components/ParticipantList.js.map +1 -1
  10. package/dist/dist-esm/react-components/src/components/VideoGallery.js +1 -6
  11. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  12. package/dist/dist-esm/react-components/src/components/VideoTile.js +11 -5
  13. package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
  14. package/dist/dist-esm/react-components/src/components/styles/VideoTile.styles.d.ts +0 -4
  15. package/dist/dist-esm/react-components/src/components/styles/VideoTile.styles.js +0 -13
  16. package/dist/dist-esm/react-components/src/components/styles/VideoTile.styles.js.map +1 -1
  17. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js +9 -1
  18. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js.map +1 -1
  19. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.d.ts +1 -1
  20. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.js.map +1 -1
  21. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +22 -6
  22. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
  23. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.d.ts +16 -4
  24. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js +10 -1
  25. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
  26. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/index.d.ts +1 -1
  27. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/index.js.map +1 -1
  28. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js +17 -5
  29. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js.map +1 -1
  30. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.js +5 -5
  31. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.js.map +1 -1
  32. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/HoldPane.js +1 -1
  33. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/HoldPane.js.map +1 -1
  34. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.d.ts +2 -0
  35. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.js +12 -0
  36. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.js.map +1 -1
  37. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js +1 -1
  38. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js.map +1 -1
  39. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/Strings.d.ts +1 -1
  40. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/Strings.js.map +1 -1
  41. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/components/DesktopMoreButton.js +1 -1
  42. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/components/DesktopMoreButton.js.map +1 -1
  43. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/components/MoreDrawer.js +1 -1
  44. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/components/MoreDrawer.js.map +1 -1
  45. package/dist/dist-esm/react-composites/src/composites/common/CallingDialpad.js +1 -1
  46. package/dist/dist-esm/react-composites/src/composites/common/CallingDialpad.js.map +1 -1
  47. package/dist/dist-esm/react-composites/src/composites/common/CallingDialpad.styles.js +4 -2
  48. package/dist/dist-esm/react-composites/src/composites/common/CallingDialpad.styles.js.map +1 -1
  49. package/dist/dist-esm/react-composites/src/composites/common/PeoplePaneContent.js +1 -1
  50. package/dist/dist-esm/react-composites/src/composites/common/PeoplePaneContent.js.map +1 -1
  51. package/dist/dist-esm/react-composites/src/composites/common/SendDtmfDialpad.js +1 -1
  52. package/dist/dist-esm/react-composites/src/composites/common/SendDtmfDialpad.js.map +1 -1
  53. package/dist/dist-esm/react-composites/src/composites/common/SendDtmfDialpad.styles.js +4 -2
  54. package/dist/dist-esm/react-composites/src/composites/common/SendDtmfDialpad.styles.js.map +1 -1
  55. package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +2 -2
  56. package/package.json +8 -8
@@ -361,6 +361,16 @@ export declare interface BaseCustomStyles {
361
361
  export declare interface CallAdapter extends AdapterState<CallAdapterState>, Disposable, CallAdapterCallManagement, CallAdapterDeviceManagement, CallAdapterSubscribers {
362
362
  }
363
363
 
364
+ /**
365
+ * Payload for {@link CallEndedListener} containing details on the ended call.
366
+ *
367
+ * @public
368
+ */
369
+ export declare type CallAdapterCallEndedEvent = {
370
+ callId?: string;
371
+ callEndReason?: CallEndReason;
372
+ };
373
+
364
374
  /**
365
375
  * Functionality for managing the current call.
366
376
  *
@@ -1246,7 +1256,7 @@ export declare interface CallCompositeStrings {
1246
1256
  /**
1247
1257
  * Label for the button to open dtmf dialpad
1248
1258
  */
1249
- openDtmfDialpad: string;
1259
+ openDtmfDialpadLabel: string;
1250
1260
  }
1251
1261
 
1252
1262
  /**
@@ -1333,9 +1343,7 @@ export declare type CallControlOptions = {
1333
1343
  *
1334
1344
  * @public
1335
1345
  */
1336
- export declare type CallEndedListener = (event: {
1337
- callId: string;
1338
- }) => void;
1346
+ export declare type CallEndedListener = (event: CallAdapterCallEndedEvent) => void;
1339
1347
 
1340
1348
  /**
1341
1349
  * Error thrown from failed stateful API methods.
@@ -2245,7 +2253,7 @@ export declare interface CallWithChatCompositeStrings {
2245
2253
  /**
2246
2254
  * Label for the button to open dtmf dialpad
2247
2255
  */
2248
- openDtmfDialpad: string;
2256
+ openDtmfDialpadLabel: string;
2249
2257
  }
2250
2258
 
2251
2259
  /**
@@ -192,7 +192,7 @@ const fromFlatCommunicationIdentifier = (id) => {
192
192
  // Copyright (c) Microsoft Corporation.
193
193
  // Licensed under the MIT license.
194
194
  // GENERATED FILE. DO NOT EDIT MANUALLY.
195
- var telemetryVersion = '1.3.3-alpha-202208190016.0';
195
+ var telemetryVersion = '1.3.3-alpha-202208240015.0';
196
196
 
197
197
  // Copyright (c) Microsoft Corporation.
198
198
  /**
@@ -4589,14 +4589,14 @@ const getParticipantsForDefaultRender = (participants, excludeMe, myUserId) => {
4589
4589
  * @public
4590
4590
  */
4591
4591
  const ParticipantList = (props) => {
4592
- var _a, _b;
4592
+ var _a, _b, _c, _d;
4593
4593
  const { excludeMe = false, myUserId, participants, onRemoveParticipant, onRenderAvatar, onRenderParticipant, onFetchParticipantMenuItems, showParticipantOverflowTooltip } = props;
4594
4594
  const ids = useIdentifiers();
4595
4595
  const strings = useLocale$1().strings.participantItem;
4596
4596
  const displayedParticipants = React.useMemo(() => {
4597
4597
  return onRenderParticipant ? participants : getParticipantsForDefaultRender(participants, excludeMe, myUserId);
4598
4598
  }, [participants, excludeMe, myUserId, onRenderParticipant]);
4599
- const createParticipantMenuItems = (participant) => {
4599
+ const createParticipantMenuItems = React.useCallback((participant) => {
4600
4600
  var _a, _b;
4601
4601
  let menuItems = [];
4602
4602
  let disabled = !participant.isRemovable;
@@ -4620,9 +4620,16 @@ const ParticipantList = (props) => {
4620
4620
  menuItems = onFetchParticipantMenuItems(participant.userId, myUserId, menuItems);
4621
4621
  }
4622
4622
  return menuItems;
4623
- };
4624
- const participantItemStyles = react.merge(participantListItemStyle, (_a = props.styles) === null || _a === void 0 ? void 0 : _a.participantItemStyles);
4625
- return (React__default['default'].createElement(react.Stack, { "data-ui-id": ids.participantList, className: react.mergeStyles(participantListStyle$1, (_b = props.styles) === null || _b === void 0 ? void 0 : _b.root) }, displayedParticipants.map((participant) => onRenderParticipant
4623
+ }, [
4624
+ ids.participantListRemoveParticipantButton,
4625
+ myUserId,
4626
+ onFetchParticipantMenuItems,
4627
+ onRemoveParticipant,
4628
+ (_b = (_a = props.styles) === null || _a === void 0 ? void 0 : _a.participantItemStyles) === null || _b === void 0 ? void 0 : _b.participantSubMenuItemsStyles,
4629
+ strings.removeButtonLabel
4630
+ ]);
4631
+ const participantItemStyles = React.useMemo(() => { var _a; return react.merge(participantListItemStyle, (_a = props.styles) === null || _a === void 0 ? void 0 : _a.participantItemStyles); }, [(_c = props.styles) === null || _c === void 0 ? void 0 : _c.participantItemStyles]);
4632
+ return (React__default['default'].createElement(react.Stack, { "data-ui-id": ids.participantList, className: react.mergeStyles(participantListStyle$1, (_d = props.styles) === null || _d === void 0 ? void 0 : _d.root) }, displayedParticipants.map((participant) => onRenderParticipant
4626
4633
  ? onRenderParticipant(participant)
4627
4634
  : onRenderParticipantDefault(participant, strings, myUserId, onRenderAvatar, createParticipantMenuItems, participantItemStyles, props.onParticipantClick, showParticipantOverflowTooltip))));
4628
4635
  };
@@ -4849,19 +4856,6 @@ const iconContainerStyle = {
4849
4856
  display: 'block'
4850
4857
  }
4851
4858
  };
4852
- /**
4853
- * @private
4854
- */
4855
- const isSpeakingBorderDiv = {
4856
- zIndex: 1,
4857
- width: '100%',
4858
- height: '100%',
4859
- position: 'absolute',
4860
- top: '0',
4861
- left: '0',
4862
- // Ensure the isSpeaking element does not steal any pointer events such as onClick events
4863
- pointerEvents: 'none'
4864
- };
4865
4859
  /**
4866
4860
  * @private
4867
4861
  */
@@ -4946,11 +4940,17 @@ const VideoTile = (props) => {
4946
4940
  React__default['default'].createElement(react.Stack, { "data-ui-id": ids.videoTile, className: react.mergeStyles(rootStyles, {
4947
4941
  background: theme.palette.neutralLighter,
4948
4942
  borderRadius: theme.effects.roundedCorner4
4949
- }, styles === null || styles === void 0 ? void 0 : styles.root) },
4950
- React__default['default'].createElement("div", { className: react.mergeStyles(isSpeakingBorderDiv, {
4943
+ }, isSpeaking && {
4944
+ '&::before': {
4945
+ content: `''`,
4946
+ position: 'absolute',
4947
+ zIndex: 1,
4948
+ border: `0.25rem solid ${theme.palette.themePrimary}`,
4951
4949
  borderRadius: theme.effects.roundedCorner4,
4952
- border: `0.25rem solid ${isSpeaking ? theme.palette.themePrimary : 'transparent'}`
4953
- }) }),
4950
+ width: '100%',
4951
+ height: '100%'
4952
+ }
4953
+ }, styles === null || styles === void 0 ? void 0 : styles.root) },
4954
4954
  isVideoRendered ? (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(videoContainerStyles, isMirrored && { transform: 'scaleX(-1)' }, styles === null || styles === void 0 ? void 0 : styles.videoContainer) }, renderElement)) : (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(videoContainerStyles) }, onRenderPlaceholder ? (onRenderPlaceholder(userId !== null && userId !== void 0 ? userId : '', placeholderOptions, DefaultPlaceholder)) : (React__default['default'].createElement(DefaultPlaceholder, Object.assign({}, placeholderOptions))))),
4955
4955
  (canShowLabel || participantStateString) && (React__default['default'].createElement(react.Stack, { horizontal: true, className: tileInfoContainerStyle, tokens: tileInfoContainerTokens },
4956
4956
  canShowLabel && (React__default['default'].createElement(react.Stack, { horizontal: true, className: tileInfoStyle },
@@ -6304,12 +6304,7 @@ const VideoGallery = (props) => {
6304
6304
  maxDominantSpeakers: maxRemoteVideoStreams
6305
6305
  }).slice(0, maxRemoteVideoStreams);
6306
6306
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
6307
- visibleCallingParticipants.current = smartDominantSpeakerParticipants({
6308
- participants: (_b = remoteParticipants === null || remoteParticipants === void 0 ? void 0 : remoteParticipants.filter((p) => p.state === ('Connecting' ))) !== null && _b !== void 0 ? _b : [],
6309
- dominantSpeakers,
6310
- lastVisibleParticipants: visibleCallingParticipants.current,
6311
- maxDominantSpeakers: 0
6312
- });
6307
+ visibleCallingParticipants.current = (_b = remoteParticipants === null || remoteParticipants === void 0 ? void 0 : remoteParticipants.filter((p) => p.state === ('Connecting' ))) !== null && _b !== void 0 ? _b : [];
6313
6308
  // This set will be used to filter out participants already in visibleVideoParticipants
6314
6309
  const visibleVideoParticipantsSet = new Set(visibleVideoParticipants.current.map((p) => p.userId));
6315
6310
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
@@ -7444,7 +7439,7 @@ const _DrawerMenu = (props) => {
7444
7439
  }
7445
7440
  }), [firstItemStyle, borderRadius]);
7446
7441
  return (React__default['default'].createElement(_DrawerSurface, { styles: (_b = props.styles) === null || _b === void 0 ? void 0 : _b.drawerSurfaceStyles, onLightDismiss: props.onLightDismiss },
7447
- React__default['default'].createElement(react.Stack, { styles: props.styles, role: "menu" }, menuItemsToRender === null || menuItemsToRender === void 0 ? void 0 :
7442
+ React__default['default'].createElement(react.Stack, { styles: props.styles, role: "menu", "data-ui-id": "drawer-menu" }, menuItemsToRender === null || menuItemsToRender === void 0 ? void 0 :
7448
7443
  menuItemsToRender.slice(0, 1).map((item) => (React__default['default'].createElement(DrawerMenuItem, Object.assign({}, item, { key: '0', styles: modifiedFirstItemStyle, onItemClick: (ev, itemKey) => {
7449
7444
  onItemClick(item, ev, itemKey);
7450
7445
  } })))), menuItemsToRender === null || menuItemsToRender === void 0 ? void 0 :
@@ -12711,7 +12706,7 @@ const CallCompositeIcon = (props) => (React__default['default'].createElement(re
12711
12706
  */
12712
12707
  const CallWithChatCompositeIcon = (props) => (React__default['default'].createElement(react.FontIcon, Object.assign({}, props)));
12713
12708
 
12714
- var call$d={cameraLabel:"Camera",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",peopleButtonLabel:"People",peoplePaneTitle:"People",peoplePaneSubTitle:"In this call",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",soundLabel:"Sound",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close Dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumeCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpad:"Show Dialpad",dtmfDialpadPlaceHolderText:"Enter number"};var chat$d={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$d={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close Dialpad",openDtmfDialpad:"Show Dialpad",dtmfDialpadPlaceHolderText:"Enter number"};var en_US = {call:call$d,chat:chat$d,callWithChat:callWithChat$d};
12709
+ var call$d={cameraLabel:"Camera",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",peopleButtonLabel:"People",peoplePaneTitle:"People",peoplePaneSubTitle:"In this call",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",soundLabel:"Sound",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close Dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumeCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show Dialpad",dtmfDialpadPlaceHolderText:"Enter number"};var chat$d={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$d={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close Dialpad",openDtmfDialpadLabel:"Show Dialpad",dtmfDialpadPlaceHolderText:"Enter number"};var en_US = {call:call$d,chat:chat$d,callWithChat:callWithChat$d};
12715
12710
 
12716
12711
  var call$c={cameraLabel:"Camera",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",defaultPlaceHolder:"Select an option",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",soundLabel:"Sound",startCallButtonLabel:"Start call",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby."};var chat$c={chatListHeader:"In this chat"};var callWithChat$c={peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",chatButtonLabel:"Chat",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipOpen:"Show chat",chatButtonTooltipClose:"Hide chat",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",peoplePaneTitle:"People",peoplePaneSubTitle:"In this call",chatPaneTitle:"Chat",chatButtonNewMessageNotificationLabel:"New Message",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",copyInviteLinkButtonLabel:"Copy invite link",dismissSidePaneButton:"Close",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back"};var en_GB = {call:call$c,chat:chat$c,callWithChat:callWithChat$c};
12717
12712
 
@@ -14359,6 +14354,19 @@ const adaptCompositeState = (compositeState) => {
14359
14354
  compositeState.latestErrors, compositeState.displayName);
14360
14355
  };
14361
14356
 
14357
+ // Copyright (c) Microsoft Corporation.
14358
+ // Licensed under the MIT license.
14359
+ /**
14360
+ * Subset of CallCompositePages that represent an end call state.
14361
+ * @private
14362
+ */
14363
+ const END_CALL_PAGES = [
14364
+ 'accessDeniedTeamsMeeting',
14365
+ 'joinCallFailedDueToNoNetwork',
14366
+ 'leftCall',
14367
+ 'removedFromCall'
14368
+ ];
14369
+
14362
14370
  // Copyright (c) Microsoft Corporation.
14363
14371
  const ACCESS_DENIED_TEAMS_MEETING_SUB_CODE = 5854;
14364
14372
  const REMOVED_FROM_CALL_SUB_CODES = [5000, 5300];
@@ -14474,6 +14482,17 @@ const getCallCompositePage = (call, previousCall) => {
14474
14482
  // No call state - show starting page (configuration)
14475
14483
  return 'configuration';
14476
14484
  };
14485
+ /** @private */
14486
+ const IsCallEndedPage = (
14487
+ /**
14488
+ * Explicitly listing the pages of this function intentionally.
14489
+ * This protects against adding a new composite page that should be marked as an callEndedPage.
14490
+ * EndCallPages are used to trigger onCallEnded events so this could easily be missed.
14491
+ * When you add a new composite page this will throw a compiler error. If this new page is an
14492
+ * EndCallPage ensure you update the END_CALL_PAGES. Afterwards update the `page` parameter
14493
+ * type below to allow your new page, i.e. add `| <your new page>
14494
+ */
14495
+ page) => END_CALL_PAGES.includes(page);
14477
14496
  /**
14478
14497
  * Creates a new call control options object and sets the correct values for disabling
14479
14498
  * the buttons provided in the `disabledControls` array.
@@ -14956,9 +14975,11 @@ const themedDialpadStyle$1 = (isMobile, theme) => ({
14956
14975
  field: {
14957
14976
  backgroundColor: theme.palette.white,
14958
14977
  fontSize: theme.fonts.large.fontSize,
14959
- padding: '1.063rem 0.5rem',
14978
+ padding: '0 0.5rem ',
14960
14979
  textAlign: 'center',
14961
- paddingTop: 0
14980
+ ':active': {
14981
+ padding: '0 0.5rem'
14982
+ }
14962
14983
  }
14963
14984
  },
14964
14985
  primaryContent: {
@@ -15028,7 +15049,7 @@ const SendDtmfDialpad = (props) => {
15028
15049
  return (React__default['default'].createElement(React__default['default'].Fragment, null, React__default['default'].createElement(react.Modal, { titleAriaId: strings.dialpadModalAriaLabel, isOpen: showDialpad, onDismiss: onDismissTriggered, isBlocking: true, styles: dialpadModalStyle },
15029
15050
  React__default['default'].createElement(react.Stack, { horizontal: true, horizontalAlign: "end", verticalAlign: "center" },
15030
15051
  React__default['default'].createElement(react.IconButton, { iconProps: { iconName: 'Cancel' }, ariaLabel: strings.dialpadCloseModalButtonAriaLabel, onClick: onDismissTriggered, style: { color: theme.palette.black } })),
15031
- React__default['default'].createElement(react.Stack, null,
15052
+ React__default['default'].createElement(react.Stack, { style: { overflow: 'hidden' } },
15032
15053
  React__default['default'].createElement(Dialpad, Object.assign({ styles: dialpadStyle }, dialpadProps, { showDeleteButton: false, strings: strings }))))));
15033
15054
  };
15034
15055
 
@@ -15091,12 +15112,12 @@ const CallControls = (props) => {
15091
15112
  styles: buttonFlyoutIncreasedSizeStyles
15092
15113
  },
15093
15114
  disabled: isDisabled(options === null || options === void 0 ? void 0 : options.holdButton),
15094
- ['data-ui-id']: 'call-composite-more-menu-hold-button'
15115
+ ['data-ui-id']: 'hold-button'
15095
15116
  });
15096
15117
  /* @conditional-compile-remove(PSTN-calls) */
15097
15118
  items.push({
15098
15119
  key: 'showDialpadKey',
15099
- text: localeStrings.strings.call.openDtmfDialpad,
15120
+ text: localeStrings.strings.call.openDtmfDialpadLabel,
15100
15121
  onClick: () => {
15101
15122
  setShowDialpad(true);
15102
15123
  },
@@ -15129,12 +15150,12 @@ const CallControls = (props) => {
15129
15150
  isEnabled$2(options === null || options === void 0 ? void 0 : options.cameraButton) && (React__default['default'].createElement(Camera, { displayType: options === null || options === void 0 ? void 0 : options.displayType, disabled: isDisabled(options === null || options === void 0 ? void 0 : options.cameraButton) })),
15130
15151
  isEnabled$2(options === null || options === void 0 ? void 0 : options.screenShareButton) && (React__default['default'].createElement(ScreenShare, { option: options === null || options === void 0 ? void 0 : options.screenShareButton, displayType: options === null || options === void 0 ? void 0 : options.displayType, disabled: isDisabled(options === null || options === void 0 ? void 0 : options.screenShareButton) })),
15131
15152
  isEnabled$2(options === null || options === void 0 ? void 0 : options.participantsButton) &&
15132
- /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(one-to-n-calling) */
15153
+ /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(PSTN-calls) */
15133
15154
  !props.isMobile && (React__default['default'].createElement(Participants, { option: options === null || options === void 0 ? void 0 : options.participantsButton, callInvitationURL: props.callInvitationURL, onFetchParticipantMenuItems: props.onFetchParticipantMenuItems, displayType: options === null || options === void 0 ? void 0 : options.displayType, increaseFlyoutItemSize: props.increaseFlyoutItemSize, isMobile: props.isMobile, disabled: isDisabled(options === null || options === void 0 ? void 0 : options.participantsButton) })) && (
15134
- /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(one-to-n-calling) */
15155
+ /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(PSTN-calls) */
15135
15156
  React__default['default'].createElement(People, { checked: props.peopleButtonChecked, showLabel: (options === null || options === void 0 ? void 0 : options.displayType) !== 'compact', onClick: props.onPeopleButtonClicked, "data-ui-id": "call-composite-people-button", strings: peopleButtonStrings, disabled: isDisabled(options === null || options === void 0 ? void 0 : options.participantsButton) })),
15136
15157
  isEnabled$2(options === null || options === void 0 ? void 0 : options.devicesButton) && (React__default['default'].createElement(Devices, { displayType: options === null || options === void 0 ? void 0 : options.displayType, increaseFlyoutItemSize: props.increaseFlyoutItemSize, disabled: isDisabled(options === null || options === void 0 ? void 0 : options.devicesButton) })),
15137
- /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(one-to-n-calling) */
15158
+ /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(PSTN-calls) */
15138
15159
  isEnabled$2(options === null || options === void 0 ? void 0 : options.moreButton) && (React__default['default'].createElement(MoreButton, { strings: moreButtonStrings, menuIconProps: { hidden: true }, menuProps: { items: moreButtonContextualMenuItems() }, showLabel: !props.isMobile })),
15139
15160
  customButtons['primary'],
15140
15161
  isEnabled$2(options === null || options === void 0 ? void 0 : options.endCallButton) && React__default['default'].createElement(EndCall, { displayType: options === null || options === void 0 ? void 0 : options.displayType })))));
@@ -15628,9 +15649,11 @@ const themedDialpadStyle = (isMobile, theme) => ({
15628
15649
  field: {
15629
15650
  backgroundColor: theme.palette.white,
15630
15651
  fontSize: theme.fonts.large.fontSize,
15631
- padding: '1.063rem 0.5rem',
15652
+ padding: '0 0.5rem',
15632
15653
  textAlign: isMobile ? 'center' : 'left',
15633
- paddingTop: 0
15654
+ ':active': {
15655
+ padding: '0 0.5rem'
15656
+ }
15634
15657
  }
15635
15658
  },
15636
15659
  primaryContent: {
@@ -15692,7 +15715,7 @@ const CallingDialpad = (props) => {
15692
15715
  React__default['default'].createElement(react.Stack, { horizontal: true, horizontalAlign: "space-between", verticalAlign: "center" },
15693
15716
  React__default['default'].createElement(react.Text, null, strings.dialpadModalTitle),
15694
15717
  React__default['default'].createElement(react.IconButton, { iconProps: { iconName: 'Cancel' }, ariaLabel: strings.dialpadCloseModalButtonAriaLabel, onClick: onDismissTriggered, style: { color: theme.palette.black } })),
15695
- React__default['default'].createElement(react.Stack, null, dialpadComponent()))));
15718
+ React__default['default'].createElement(react.Stack, { style: { overflow: 'hidden' } }, dialpadComponent()))));
15696
15719
  };
15697
15720
  function DialpadStartCallIconTrampoline() {
15698
15721
  /* @conditional-compile-remove(PSTN-calls) */
@@ -15866,7 +15889,7 @@ const PeoplePaneContent = (props) => {
15866
15889
  // We want the drawer menu items to appear when participants in ParticipantList are clicked
15867
15890
  onParticipantClick: props.mobileView ? setDrawerMenuItemsForParticipant : undefined });
15868
15891
  }, [participantListDefaultProps, props.mobileView, setDrawerMenuItemsForParticipant, onRemoveParticipant]);
15869
- const participantList = (React__default['default'].createElement(ParticipantListWithHeading, { isMobile: props.mobileView, participantListProps: participantListProps, onFetchAvatarPersonaData: props.onFetchAvatarPersonaData, onFetchParticipantMenuItems: props.onFetchParticipantMenuItems, title: props.strings.peoplePaneSubTitle }));
15892
+ const participantList = (React__default['default'].createElement(ParticipantListWithHeading, { isMobile: props.mobileView, participantListProps: participantListProps, onFetchAvatarPersonaData: props.onFetchAvatarPersonaData, onFetchParticipantMenuItems: props.mobileView ? undefined : props.onFetchParticipantMenuItems, title: props.strings.peoplePaneSubTitle }));
15870
15893
  if (props.mobileView) {
15871
15894
  return (React__default['default'].createElement(react.Stack, { verticalFill: true, styles: peoplePaneContainerStyle, tokens: peoplePaneContainerTokens },
15872
15895
  React__default['default'].createElement(react.Stack.Item, { grow: true, styles: participantListContainerStyles }, participantList),
@@ -16153,7 +16176,7 @@ const textStyle = (theme) => {
16153
16176
  * @private
16154
16177
  */
16155
16178
  const CallArrangement = (props) => {
16156
- var _a;
16179
+ var _a, _b;
16157
16180
  const containerClassName = React.useMemo(() => {
16158
16181
  return props.mobileView ? containerStyleMobile : containerStyleDesktop;
16159
16182
  }, [props.mobileView]);
@@ -16200,13 +16223,25 @@ const CallArrangement = (props) => {
16200
16223
  return callCompositeContainerCSS;
16201
16224
  };
16202
16225
  /* @conditional-compile-remove(one-to-n-calling) */
16203
- const callPaneContent = () => {
16226
+ const callPaneContent = React.useCallback(() => {
16204
16227
  var _a;
16205
- if (adapter && _isInCall(callStatus)) {
16228
+ if (adapter && _isInCall(callStatus) && activePane === 'people') {
16206
16229
  return (React__default['default'].createElement(CallPane, { callAdapter: adapter, onClose: closePane, onFetchAvatarPersonaData: props.onFetchAvatarPersonaData, onFetchParticipantMenuItems: (_a = props.callControlProps) === null || _a === void 0 ? void 0 : _a.onFetchParticipantMenuItems, onPeopleButtonClicked: showShowPeopleTabHeaderButton$1(props.callControlProps.options) ? selectPeople : undefined, modalLayerHostId: props.modalLayerHostId, activePane: activePane, mobileView: props.mobileView, inviteLink: props.callControlProps.callInvitationURL }));
16207
16230
  }
16208
16231
  return React__default['default'].createElement(React__default['default'].Fragment, null);
16209
- };
16232
+ }, [
16233
+ activePane,
16234
+ adapter,
16235
+ callStatus,
16236
+ closePane,
16237
+ props.callControlProps.callInvitationURL,
16238
+ (_a = props.callControlProps) === null || _a === void 0 ? void 0 : _a.onFetchParticipantMenuItems,
16239
+ props.callControlProps.options,
16240
+ props.mobileView,
16241
+ props.modalLayerHostId,
16242
+ props.onFetchAvatarPersonaData,
16243
+ selectPeople
16244
+ ]);
16210
16245
  return (React__default['default'].createElement("div", { ref: containerRef, className: react.mergeStyles(containerDivStyles) },
16211
16246
  React__default['default'].createElement(react.Stack, { verticalFill: true, horizontalAlign: "stretch", className: containerClassName, "data-ui-id": props.dataUiId },
16212
16247
  React__default['default'].createElement(react.Stack, { horizontal: true, grow: true },
@@ -16219,7 +16254,7 @@ const CallArrangement = (props) => {
16219
16254
  React__default['default'].createElement(react.Stack.Item, { grow: true, style: callCompositeContainerFlex() },
16220
16255
  React__default['default'].createElement(react.Stack.Item, { styles: callGalleryStyles, grow: true }, props.onRenderGalleryContent && (React__default['default'].createElement(react.Stack, { verticalFill: true, styles: mediaGalleryContainerStyles }, props.onRenderGalleryContent())))),
16221
16256
  callPaneContent()),
16222
- ((_a = props.callControlProps) === null || _a === void 0 ? void 0 : _a.options) !== false &&
16257
+ ((_b = props.callControlProps) === null || _b === void 0 ? void 0 : _b.options) !== false &&
16223
16258
  /* @conditional-compile-remove(one-to-n-calling) */ !isMobileWithActivePane && (React__default['default'].createElement(react.Stack.Item, { className: callControlsContainerStyles },
16224
16259
  React__default['default'].createElement(CallControls, Object.assign({}, props.callControlProps, { containerWidth: containerWidth, containerHeight: containerHeight, isMobile: props.mobileView,
16225
16260
  /* @conditional-compile-remove(one-to-n-calling) */
@@ -17197,7 +17232,7 @@ const HoldPane = () => {
17197
17232
  React__default['default'].createElement(react.PrimaryButton, { text: strings.resumeCallButtonLabel, ariaLabel: strings.resumeCallButtonAriaLabel, styles: resumeButtonStyles, onClick: () => {
17198
17233
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
17199
17234
  holdButtonProps.onToggleHold();
17200
- } }))));
17235
+ }, "data-ui-id": "hold-page-resume-call-button" }))));
17201
17236
  };
17202
17237
  const getMinutes = (time) => {
17203
17238
  return Math.floor(getSeconds(time) / 60);
@@ -17330,12 +17365,20 @@ const CallComposite = (props) => {
17330
17365
  role } = props;
17331
17366
  React.useEffect(() => {
17332
17367
  (() => __awaiter$5(void 0, void 0, void 0, function* () {
17368
+ /* @conditional-compile-remove(rooms) */
17369
+ if (role === 'Consumer') {
17370
+ // Need to ask for audio devices to get access to speakers. Speaker permission is tied to microphone permission (when you request 'audio' permission using the SDK) its
17371
+ // actually granting access to query both microphone and speaker. TODO: Need some investigation to see if we can get access to speakers without SDK.
17372
+ yield adapter.askDevicePermission({ video: false, audio: true });
17373
+ adapter.querySpeakers();
17374
+ return;
17375
+ }
17333
17376
  yield adapter.askDevicePermission({ video: true, audio: true });
17334
17377
  adapter.queryCameras();
17335
17378
  adapter.queryMicrophones();
17336
17379
  adapter.querySpeakers();
17337
17380
  }))();
17338
- }, [adapter]);
17381
+ }, [adapter, /* @conditional-compile-remove(rooms) */ role]);
17339
17382
  const mobileView = formFactor === 'mobile';
17340
17383
  /* @conditional-compile-remove(one-to-n-calling) */
17341
17384
  const modalLayerHostId = reactHooks.useId('modalLayerhost');
@@ -17485,11 +17528,29 @@ class CallContext {
17485
17528
  setCurrentCallId(callId) {
17486
17529
  this.callId = callId;
17487
17530
  }
17531
+ onCallEnded(handler) {
17532
+ this.emitter.on('callEnded', handler);
17533
+ }
17534
+ offCallEnded(handler) {
17535
+ this.emitter.off('callEnded', handler);
17536
+ }
17488
17537
  updateClientState(clientState) {
17489
- var _a;
17538
+ var _a, _b, _c;
17490
17539
  const call = this.callId ? clientState.calls[this.callId] : undefined;
17491
17540
  const latestEndedCall = findLatestEndedCall(clientState.callsEnded);
17492
- this.setState(Object.assign(Object.assign({}, this.state), { userId: clientState.userId, displayName: (_a = clientState.callAgent) === null || _a === void 0 ? void 0 : _a.displayName, call, page: getCallCompositePage(call, latestEndedCall), endedCall: latestEndedCall, devices: clientState.deviceManager, latestErrors: clientState.latestErrors }));
17541
+ // As the state is transitioning to a new state, trigger appropriate callback events.
17542
+ const oldPage = this.state.page;
17543
+ const newPage = getCallCompositePage(call, latestEndedCall);
17544
+ if (!IsCallEndedPage(oldPage) && IsCallEndedPage(newPage)) {
17545
+ this.emitter.emit('callEnded', {
17546
+ callId: this.callId,
17547
+ callEndedCode: (_a = latestEndedCall === null || latestEndedCall === void 0 ? void 0 : latestEndedCall.callEndReason) === null || _a === void 0 ? void 0 : _a.code,
17548
+ callEndedSubCode: (_b = latestEndedCall === null || latestEndedCall === void 0 ? void 0 : latestEndedCall.callEndReason) === null || _b === void 0 ? void 0 : _b.subCode
17549
+ });
17550
+ }
17551
+ if (this.state.page) {
17552
+ this.setState(Object.assign(Object.assign({}, this.state), { userId: clientState.userId, displayName: (_c = clientState.callAgent) === null || _c === void 0 ? void 0 : _c.displayName, call, page: newPage, endedCall: latestEndedCall, devices: clientState.deviceManager, latestErrors: clientState.latestErrors }));
17553
+ }
17493
17554
  }
17494
17555
  }
17495
17556
  const findLatestEndedCall = (calls) => {
@@ -17527,6 +17588,7 @@ class AzureCommunicationCallAdapter {
17527
17588
  this.deviceManager = deviceManager;
17528
17589
  const isTeamsMeeting = 'meetingLink' in this.locator;
17529
17590
  this.context = new CallContext(callClient.getState(), isTeamsMeeting);
17591
+ this.context.onCallEnded((endCallData) => this.emitter.emit('callEnded', endCallData));
17530
17592
  const onStateChange = (clientState) => {
17531
17593
  var _a;
17532
17594
  // unsubscribe when the instance gets disposed
@@ -17699,9 +17761,7 @@ class AzureCommunicationCallAdapter {
17699
17761
  });
17700
17762
  }
17701
17763
  leaveCall() {
17702
- var _a;
17703
17764
  return __awaiter$4(this, void 0, void 0, function* () {
17704
- const callId = (_a = this.call) === null || _a === void 0 ? void 0 : _a.id;
17705
17765
  yield this.handlers.onHangUp();
17706
17766
  this.unsubscribeCallEvents();
17707
17767
  this.call = undefined;
@@ -17711,7 +17771,6 @@ class AzureCommunicationCallAdapter {
17711
17771
  this.context.updateClientState(this.callClient.getState());
17712
17772
  this.stopCamera();
17713
17773
  this.mute();
17714
- this.emitter.emit('callEnded', { callId });
17715
17774
  });
17716
17775
  }
17717
17776
  setCamera(device, options) {
@@ -18352,7 +18411,7 @@ const DesktopMoreButton = (props) => {
18352
18411
  if (props.onClickShowDialpad) {
18353
18412
  items.push({
18354
18413
  key: 'showDialpadKey',
18355
- text: localeStrings.strings.callWithChat.openDtmfDialpad,
18414
+ text: localeStrings.strings.callWithChat.openDtmfDialpadLabel,
18356
18415
  onClick: () => {
18357
18416
  props.onClickShowDialpad && props.onClickShowDialpad();
18358
18417
  },
@@ -18881,7 +18940,7 @@ const MoreDrawer = (props) => {
18881
18940
  drawerMenuItems.push({
18882
18941
  itemKey: 'showDialpadKey',
18883
18942
  disabled: props.disableButtonsForHoldScreen,
18884
- text: localeStrings.strings.callWithChat.openDtmfDialpad,
18943
+ text: localeStrings.strings.callWithChat.openDtmfDialpadLabel,
18885
18944
  onItemClick: () => {
18886
18945
  props.onClickShowDialpad && props.onClickShowDialpad();
18887
18946
  },
@@ -19126,7 +19185,7 @@ const CallWithChatScreen = (props) => {
19126
19185
  // Perf: Instead of removing the video gallery from DOM, we hide it to prevent re-renders.
19127
19186
  style: callCompositeContainerCSS },
19128
19187
  React__default['default'].createElement(CallComposite, Object.assign({}, props, { formFactor: formFactor, options: { callControls: false }, adapter: callAdapter, fluentTheme: fluentTheme }))),
19129
- chatProps.adapter && callAdapter && hasJoinedCall && (React__default['default'].createElement(CallWithChatPane, { chatCompositeProps: chatProps, inviteLink: props.joinInvitationURL, onClose: closePane, chatAdapter: chatProps.adapter, callAdapter: callAdapter, onFetchAvatarPersonaData: props.onFetchAvatarPersonaData, onChatButtonClicked: showShowChatTabHeaderButton(props.callControls) ? selectChat : undefined, onPeopleButtonClicked: showShowPeopleTabHeaderButton(props.callControls) ? selectPeople : undefined, modalLayerHostId: modalLayerHostId, mobileView: mobileView, activePane: activePane,
19188
+ chatProps.adapter && callAdapter && hasJoinedCall && (React__default['default'].createElement(CallWithChatPane, { chatCompositeProps: chatProps, inviteLink: props.joinInvitationURL, onClose: closePane, chatAdapter: chatProps.adapter, callAdapter: callAdapter, onFetchAvatarPersonaData: props.onFetchAvatarPersonaData, onFetchParticipantMenuItems: props.onFetchParticipantMenuItems, onChatButtonClicked: showShowChatTabHeaderButton(props.callControls) ? selectChat : undefined, onPeopleButtonClicked: showShowPeopleTabHeaderButton(props.callControls) ? selectPeople : undefined, modalLayerHostId: modalLayerHostId, mobileView: mobileView, activePane: activePane,
19130
19189
  /* @conditional-compile-remove(file-sharing) */
19131
19190
  fileSharing: props.fileSharing, rtl: props.rtl }))),
19132
19191
  showControlBar && !isMobileWithActivePane && (React__default['default'].createElement(ChatAdapterProvider, { adapter: chatProps.adapter },