@azure/communication-react 1.11.0-alpha-202312030013 → 1.11.0-alpha-202312060012

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 (26) hide show
  1. package/dist/communication-react.d.ts +2 -0
  2. package/dist/dist-cjs/communication-react/index.js +184 -38
  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/chat-stateful-client/src/ChatContext.js +1 -1
  7. package/dist/dist-esm/chat-stateful-client/src/ChatContext.js.map +1 -1
  8. package/dist/dist-esm/react-components/src/components/MessageThread.d.ts +2 -0
  9. package/dist/dist-esm/react-components/src/components/MessageThread.js +49 -4
  10. package/dist/dist-esm/react-components/src/components/MessageThread.js.map +1 -1
  11. package/dist/dist-esm/react-components/src/components/styles/ParticipantItem.styles.js +1 -2
  12. package/dist/dist-esm/react-components/src/components/styles/ParticipantItem.styles.js.map +1 -1
  13. package/dist/dist-esm/react-components/src/localization/locales/en-US/strings.json +2 -1
  14. package/dist/dist-esm/react-components/src/theming/themes.js +4 -2
  15. package/dist/dist-esm/react-components/src/theming/themes.js.map +1 -1
  16. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SvgWithWordWrapping.d.ts +12 -0
  17. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SvgWithWordWrapping.js +85 -0
  18. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SvgWithWordWrapping.js.map +1 -0
  19. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/ConfigurationPage.js +5 -3
  20. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/ConfigurationPage.js.map +1 -1
  21. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallConfiguration.styles.d.ts +6 -2
  22. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallConfiguration.styles.js +33 -14
  23. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallConfiguration.styles.js.map +1 -1
  24. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationFileUploadAdapter.js +1 -1
  25. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationFileUploadAdapter.js.map +1 -1
  26. package/package.json +4 -4
@@ -7856,6 +7856,8 @@ export declare interface MessageThreadStrings {
7856
7856
  editBoxSubmitButton: string;
7857
7857
  /** String for action menu indicating there are more options */
7858
7858
  actionMenuMoreOptions?: string;
7859
+ /** Aria label to announce when a message is deleted */
7860
+ messageDeletedAnnouncementAriaLabel: string;
7859
7861
  /** String for download file button in file card */
7860
7862
  downloadFile: string;
7861
7863
  /** String for policy violation message removal */
@@ -8,7 +8,7 @@ var communicationCalling = require('@azure/communication-calling');
8
8
  var memoizeOne = require('memoize-one');
9
9
  var logger = require('@azure/logger');
10
10
  var EventEmitter = require('events');
11
- var produce = require('immer');
11
+ var immer = require('immer');
12
12
  var React = require('react');
13
13
  var react = require('@fluentui/react');
14
14
  var reactIcons = require('@fluentui/react-icons');
@@ -53,7 +53,6 @@ function _interopNamespace(e) {
53
53
  var reselect__namespace = /*#__PURE__*/_interopNamespace(reselect);
54
54
  var memoizeOne__default = /*#__PURE__*/_interopDefaultLegacy(memoizeOne);
55
55
  var EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter);
56
- var produce__default = /*#__PURE__*/_interopDefaultLegacy(produce);
57
56
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
58
57
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
59
58
  var Linkify__default = /*#__PURE__*/_interopDefaultLegacy(Linkify);
@@ -177,7 +176,7 @@ const _isValidIdentifier = (identifier) => {
177
176
  // Copyright (c) Microsoft Corporation.
178
177
  // Licensed under the MIT License.
179
178
  // GENERATED FILE. DO NOT EDIT MANUALLY.
180
- var telemetryVersion = '1.11.0-alpha-202312030013';
179
+ var telemetryVersion = '1.11.0-alpha-202312060012';
181
180
 
182
181
  // Copyright (c) Microsoft Corporation.
183
182
  /**
@@ -1778,9 +1777,9 @@ var __awaiter$H = (window && window.__awaiter) || function (thisArg, _arguments,
1778
1777
  step((generator = generator.apply(thisArg, _arguments || [])).next());
1779
1778
  });
1780
1779
  };
1781
- produce.enableMapSet();
1780
+ immer.enableMapSet();
1782
1781
  // Needed to generate state diff for verbose logging.
1783
- produce.enablePatches();
1782
+ immer.enablePatches();
1784
1783
  // TODO: How can we make this configurable?
1785
1784
  /**
1786
1785
  * @private
@@ -1835,7 +1834,7 @@ class CallContext$2 {
1835
1834
  }
1836
1835
  modifyState(modifier) {
1837
1836
  const priorState = this._state;
1838
- this._state = produce.produce(this._state, modifier, (patches) => {
1837
+ this._state = immer.produce(this._state, modifier, (patches) => {
1839
1838
  if (logger.getLogLevel() === 'verbose') {
1840
1839
  // Log to `info` because AzureLogger.verbose() doesn't show up in console.
1841
1840
  this._logger.info(`State change: ${_safeJSONStringify(patches)}`);
@@ -5066,7 +5065,7 @@ const typingIndicatorStringStyle = react.mergeStyles({
5066
5065
  wordBreak: 'break-word'
5067
5066
  });
5068
5067
 
5069
- var participantItem$k={isMeText:"(you)",menuTitle:"More Options",removeButtonLabel:"Remove",sharingIconLabel:"Sharing",mutedIconLabel:"Muted",displayNamePlaceholder:"Unnamed participant",participantStateRinging:"Calling...",participantStateHold:"On hold"};var ParticipantList$l={overflowParticipantCount:"+{overflowCount} more"};var typingIndicator$k={singleUser:"{user} is typing ...",multipleUsers:"{users} are typing ...",multipleUsersAbbreviateOne:"{users} and 1 other are typing ...",multipleUsersAbbreviateMany:"{users} and {numOthers} others are typing ...",delimiter:", "};var sendBox$k={placeholderText:"Enter a message",textTooLong:"Your message length is over the maximum limit.",sendButtonAriaLabel:"Send message",fileUploadsPendingError:"Uploading... Please wait.",removeFile:"Remove file",uploading:"Uploading",uploadCompleted:"Upload completed"};var mentionPopover$k={mentionPopoverHeader:"Suggestions"};var imageGallery$k={downloadButtonLabel:"Download",dismissButtonAriaLabel:"Close"};var messageStatusIndicator$k={deliveredAriaLabel:"Message sent",deliveredTooltipText:"Sent",seenAriaLabel:"Message seen by others",seenTooltipText:"Seen",readByTooltipText:"Read by {messageThreadReadCount} of {remoteParticipantsCount}",sendingAriaLabel:"Message sending",sendingTooltipText:"Sending",failedToSendAriaLabel:"Message failed to send",failedToSendTooltipText:"Failed to send"};var endCallButton$k={label:"Leave",tooltipContent:"Leave call"};var cameraButton$k={onLabel:"Camera",offLabel:"Camera",tooltipDisabledContent:"Camera is disabled",tooltipOnContent:"Turn off camera",tooltipOffContent:"Turn on camera",tooltipVideoLoadingContent:"Video is loading",cameraMenuTitle:"Camera",cameraMenuTooltip:"Choose camera",cameraButtonSplitRoleDescription:"Split button",onSplitButtonAriaLabel:"Turn off camera and camera options",offSplitButtonAriaLabel:"Turn on camera and camera options",cameraActionTurnedOnAnnouncement:"Your camera has been turned on",cameraActionTurnedOffAnnouncement:"Your camera has been turned off",onSplitButtonPrimaryActionCamera:"Turn off camera",offSplitButtonPrimaryActionCamera:"Turn on camera",cameraPrimaryActionSplitButtonTitle:"Use camera",videoEffectsMenuItemTitle:"Effects"};var microphoneButton$k={onLabel:"Mic",offLabel:"Mic",tooltipDisabledContent:"Microphone is disabled",tooltipOnContent:"Mute microphone",tooltipOffContent:"Unmute microphone",microphoneMenuTitle:"Microphone",microphoneMenuTooltip:"Choose microphone",speakerMenuTitle:"Speaker",speakerMenuTooltip:"Choose speaker",microphoneButtonSplitRoleDescription:"Split button",onSplitButtonAriaLabel:"Mute microphone and audio options",offSplitButtonAriaLabel:"Unmute microphone and audio options",microphoneActionTurnedOnAnnouncement:"Your microphone has been turned on",microphoneActionTurnedOffAnnouncement:"Your microphone has been turned off",offSplitButtonMicrophonePrimaryAction:"Unmute microphone",onSplitButtonMicrophonePrimaryAction:"Mute microphone",microphonePrimaryActionSplitButtonTitle:"Use microphone"};var devicesButton$k={label:"Devices",tooltipContent:"Manage devices",cameraMenuTitle:"Camera",cameraMenuTooltip:"Choose camera",audioDeviceMenuTitle:"Audio Device",audioDeviceMenuTooltip:"Choose audio device",microphoneMenuTitle:"Microphone",microphoneMenuTooltip:"Choose microphone",speakerMenuTitle:"Speaker",speakerMenuTooltip:"Choose speaker"};var participantsButton$k={label:"People",tooltipContent:"Show participants",menuHeader:"In this call",participantsListButtonLabel:"{numParticipants} people",muteAllButtonLabel:"Mute all",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied"};var screenShareButton$k={onLabel:"Stop presenting",offLabel:"Present",tooltipDisabledContent:"Presenting is disabled",tooltipOnContent:"Presenting your screen",tooltipOffContent:"Present your screen"};var raiseHandButton$k={offLabel:"Raise",onLabel:"Lower",tooltipDisabledContent:"Raise Hand action is disabled",tooltipOnContent:"Lower Hand",tooltipOffContent:"Raise Hand"};var messageThread$k={yesterday:"Yesterday",sunday:"Sunday",monday:"Monday",tuesday:"Tuesday",wednesday:"Wednesday",thursday:"Thursday",friday:"Friday",saturday:"Saturday",participantJoined:"joined the chat.",participantLeft:"left the chat.",editMessage:"Edit",removeMessage:"Delete",resendMessage:"Try sending again",failToSendTag:"Failed to send",editedTag:"Edited",liveAuthorIntro:"{author} says",messageContentAriaText:"{author} said {message}",messageContentMineAriaText:"You said {message}",editBoxTextLimit:"Your message is over the limit of {limitNumber} characters",editBoxPlaceholderText:"Edit your message",newMessagesIndicator:"New messages",noDisplayNameSub:"No name",editBoxCancelButton:"Cancel",editBoxSubmitButton:"Done",messageReadCount:"Read by {messageReadByCount} of {remoteParticipantsCount}",actionMenuMoreOptions:"More Options",downloadFile:"Download file",blockedWarningText:"This message was deleted due to organizational policy.",blockedWarningLinkText:"Details",fileCardGroupMessage:"The message has {fileCount} attachment"};var errorBar$k={unableToReachChatService:"You are offline",accessDenied:"Unable to access chat services - please check the user credentials provided",userNotInChatThread:"You are no longer in this chat thread",sendMessageNotInChatThread:"Failed to send message because you are no longer in this chat thread",sendMessageGeneric:"Failed to send message",callingNetworkFailure:"Troubling connecting call - you seem to be offline",startVideoGeneric:"Failed to start video",stopVideoGeneric:"Failed to stop video",muteGeneric:"Failed to mute microphone",unmuteGeneric:"Failed to unmute microphone",speakingWhileMuted:"Your microphone is muted",startScreenShareGeneric:"There was an issue starting screen share.",stopScreenShareGeneric:"Failed to stop screen sharing",callNetworkQualityLow:"Network quality is low.",callNoSpeakerFound:"No speakers or headphones found. Connect an audio device to hear the call.",callNoMicrophoneFound:"No microphones found. Connect an audio input device.",callMicrophoneAccessDenied:"Unable to access microphone. Click the lock in the address bar to grant permission to this webpage.",callMicrophoneAccessDeniedSafari:"Unable to access microphone. Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",callMicrophoneMutedBySystem:"You are muted by your system.",callMicrophoneUnmutedBySystem:"Your microphone recovered and you were unmuted by your system.",callMacOsMicrophoneAccessDenied:"Unable to access microphone. Grant microphone permission in your macOS privacy settings.",callLocalVideoFreeze:"Network bandwidth is poor. Your video may appear paused for others on the call.",callCameraAccessDenied:"Unable to access camera. Click the lock in the address bar to grant permission to this webpage.",callCameraAccessDeniedSafari:"Unable to access camera. Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",callCameraAlreadyInUse:"Unable to access camera. It may already be in use by another application.",callVideoStoppedBySystem:"Your video has been stopped by your system.",callVideoRecoveredBySystem:"Your video has resumed.",callMacOsCameraAccessDenied:"MacOS is blocking access to your camera. Update your privacy settings to allow this browser to access your camera.",callMacOsScreenShareAccessDenied:"MacOS is blocking screen sharing. Update your privacy settings to allow this browser to record your screen.",dismissButtonAriaLabel:"Close",failedToJoinCallGeneric:"Failed to join call.",failedToJoinCallInvalidMeetingLink:"Unable to join Meeting. Invalid Link.",cameraFrozenForRemoteParticipants:"Users in the call are having issues seeing your video. Please check your devices and network.",unableToStartVideoEffect:"Unable to apply video effect."};var videoGallery$k={screenIsBeingSharedMessage:"You are sharing your screen",screenShareLoadingMessage:"Loading {participant}'s screen",localVideoLabel:"You",localVideoCameraSwitcherLabel:"Switch camera",localVideoMovementLabel:"Movable Local Video Tile",localVideoSelectedDescription:"{cameraName} selected",displayNamePlaceholder:"Unnamed participant",fitRemoteParticipantToFrame:"Fit to frame",fillRemoteParticipantFrame:"Fill frame",pinParticipantForMe:"Pin for me",pinParticipantForMeLimitReached:"Pin (limit reached)",unpinParticipantForMe:"Unpin",pinParticipantMenuItemAriaLabel:"Pin {participantName}",unpinParticipantMenuItemAriaLabel:"Unpin {participantName}",pinnedParticipantAnnouncementAriaLabel:"Pinned {participantName}",unpinnedParticipantAnnouncementAriaLabel:"Unpinned {participantName}"};var dialpad$k={placeholderText:"Enter phone number",deleteButtonAriaLabel:"Delete"};var holdButton$k={onLabel:"Resume",offLabel:"Hold",tooltipOnContent:"Resume call",tooltipOffContent:"Hold call"};var videoTile$k={participantStateRinging:"Calling...",participantStateHold:"On hold"};var CameraAndMicrophoneSitePermissionsRequest$k={primaryText:"Allow {appName} to use your camera and microphone",secondaryText:"This is so participants can see and hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera and microphone",ariaLabel:"Allow camera and microphone access"};var CameraSitePermissionsRequest$k={primaryText:"Allow {appName} to use your camera",secondaryText:"This is so participants can see you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera",ariaLabel:"Allow camera access"};var MicrophoneSitePermissionsRequest$k={primaryText:"Allow {appName} to use your microphone",secondaryText:"This is so participants can hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without microphone",ariaLabel:"Allow microphone access"};var CameraAndMicrophoneSitePermissionsCheck$k={primaryText:"Checking for camera and microphone access",secondaryText:"Allow access if prompted. This is so participants can see and hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera and microphone",ariaLabel:"Checking for camera and microphone access. Allow access if prompted."};var CameraSitePermissionsCheck$k={primaryText:"Checking for camera access",secondaryText:"Allow access if prompted. This is so participants can see you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera",ariaLabel:"Checking for camera access. Allow access if prompted."};var MicrophoneSitePermissionsCheck$k={primaryText:"Checking for microphone access",secondaryText:"Allow access if prompted. This is so participants can hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without microphone",ariaLabel:"Checking for microphone access. Allow access if prompted."};var CameraAndMicrophoneSitePermissionsDenied$k={primaryText:"Unable to access camera and microphone",secondaryText:"Click the lock icon in the address bar to grant microphone permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without camera and microphone",linkText:"Need help? Get troubleshooting help"};var CameraAndMicrophoneSitePermissionsDeniedSafari$k={primaryText:"Unable to access camera and microphone",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without camera and microphone",linkText:"Need help? Get troubleshooting help"};var CameraSitePermissionsDenied$k={primaryText:"Unable to access camera",secondaryText:"Click the lock icon in the address bar to grant camera permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without camera",linkText:"Need help? Get troubleshooting help"};var MicrophoneSitePermissionsDenied$k={primaryText:"Unable to access microphone",secondaryText:"Click the lock icon in the address bar to grant microphone permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without microphone",linkText:"Need help? Get troubleshooting help"};var CameraSitePermissionsDeniedSafari$k={primaryText:"Unable to access camera",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without camera",linkText:"Need help? Get troubleshooting help"};var MicrophoneSitePermissionsDeniedSafari$k={primaryText:"Unable to access microphone",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without microphone",linkText:"Need help? Get troubleshooting help"};var UnsupportedBrowser$l={primaryText:"Browser not supported",secondaryText:"Please join this call using a compatible browser.",moreHelpLinkText:"See compatibility requirements"};var UnsupportedBrowserVersion$l={primaryText:"Browser update needed",secondaryText:"To ensure the best call possible, please update your browser and then try joining the call again.",moreHelpLinkText:"See compatibility requirements",continueAnywayButtonText:"Start call without updating"};var UnsupportedOperatingSystem$l={primaryText:"Operating system not supported",secondaryText:"Please join this call using a device with a compatible operating system.",moreHelpLinkText:"See compatibility requirements"};var BrowserPermissionDenied$k={primaryText:"Can't use your camera or microphone",secondaryText:"Your browser might not have access to your camera or microphone. To fix this, open System Preferences.",primaryButtonText:"Try again",linkText:"Need help? Get troubleshooting help"};var BrowserPermissionDeniedIOS$k={primaryText:"Allow microphone access to continue",secondaryText:"So other participants can hear you.",primaryButtonText:"Try again",imageAltText:"Microphone and camera device permission location for iOS",linkText:"Need help? Get troubleshooting help",step1Text:"Go to the Settings app",step2Text:"Scroll down to settings for this browser",step3Text:"Turn on Microphone (Camera optional)",step4Text:"Try joining the call again",step1DigitText:"1",step2DigitText:"2",step3DigitText:"3",step4DigitText:"4"};var verticalGallery$k={leftNavButtonAriaLabel:"previous page",rightNavButtonAriaLabel:"next page"};var AttendeeRole$k="Attendee";var en_US$1 = {participantItem:participantItem$k,ParticipantList:ParticipantList$l,typingIndicator:typingIndicator$k,sendBox:sendBox$k,mentionPopover:mentionPopover$k,imageGallery:imageGallery$k,messageStatusIndicator:messageStatusIndicator$k,endCallButton:endCallButton$k,cameraButton:cameraButton$k,microphoneButton:microphoneButton$k,devicesButton:devicesButton$k,participantsButton:participantsButton$k,screenShareButton:screenShareButton$k,raiseHandButton:raiseHandButton$k,messageThread:messageThread$k,errorBar:errorBar$k,videoGallery:videoGallery$k,dialpad:dialpad$k,holdButton:holdButton$k,videoTile:videoTile$k,CameraAndMicrophoneSitePermissionsRequest:CameraAndMicrophoneSitePermissionsRequest$k,CameraSitePermissionsRequest:CameraSitePermissionsRequest$k,MicrophoneSitePermissionsRequest:MicrophoneSitePermissionsRequest$k,CameraAndMicrophoneSitePermissionsCheck:CameraAndMicrophoneSitePermissionsCheck$k,CameraSitePermissionsCheck:CameraSitePermissionsCheck$k,MicrophoneSitePermissionsCheck:MicrophoneSitePermissionsCheck$k,CameraAndMicrophoneSitePermissionsDenied:CameraAndMicrophoneSitePermissionsDenied$k,CameraAndMicrophoneSitePermissionsDeniedSafari:CameraAndMicrophoneSitePermissionsDeniedSafari$k,CameraSitePermissionsDenied:CameraSitePermissionsDenied$k,MicrophoneSitePermissionsDenied:MicrophoneSitePermissionsDenied$k,CameraSitePermissionsDeniedSafari:CameraSitePermissionsDeniedSafari$k,MicrophoneSitePermissionsDeniedSafari:MicrophoneSitePermissionsDeniedSafari$k,UnsupportedBrowser:UnsupportedBrowser$l,UnsupportedBrowserVersion:UnsupportedBrowserVersion$l,UnsupportedOperatingSystem:UnsupportedOperatingSystem$l,BrowserPermissionDenied:BrowserPermissionDenied$k,BrowserPermissionDeniedIOS:BrowserPermissionDeniedIOS$k,verticalGallery:verticalGallery$k,AttendeeRole:AttendeeRole$k};
5068
+ var participantItem$k={isMeText:"(you)",menuTitle:"More Options",removeButtonLabel:"Remove",sharingIconLabel:"Sharing",mutedIconLabel:"Muted",displayNamePlaceholder:"Unnamed participant",participantStateRinging:"Calling...",participantStateHold:"On hold"};var ParticipantList$l={overflowParticipantCount:"+{overflowCount} more"};var typingIndicator$k={singleUser:"{user} is typing ...",multipleUsers:"{users} are typing ...",multipleUsersAbbreviateOne:"{users} and 1 other are typing ...",multipleUsersAbbreviateMany:"{users} and {numOthers} others are typing ...",delimiter:", "};var sendBox$k={placeholderText:"Enter a message",textTooLong:"Your message length is over the maximum limit.",sendButtonAriaLabel:"Send message",fileUploadsPendingError:"Uploading... Please wait.",removeFile:"Remove file",uploading:"Uploading",uploadCompleted:"Upload completed"};var mentionPopover$k={mentionPopoverHeader:"Suggestions"};var imageGallery$k={downloadButtonLabel:"Download",dismissButtonAriaLabel:"Close"};var messageStatusIndicator$k={deliveredAriaLabel:"Message sent",deliveredTooltipText:"Sent",seenAriaLabel:"Message seen by others",seenTooltipText:"Seen",readByTooltipText:"Read by {messageThreadReadCount} of {remoteParticipantsCount}",sendingAriaLabel:"Message sending",sendingTooltipText:"Sending",failedToSendAriaLabel:"Message failed to send",failedToSendTooltipText:"Failed to send"};var endCallButton$k={label:"Leave",tooltipContent:"Leave call"};var cameraButton$k={onLabel:"Camera",offLabel:"Camera",tooltipDisabledContent:"Camera is disabled",tooltipOnContent:"Turn off camera",tooltipOffContent:"Turn on camera",tooltipVideoLoadingContent:"Video is loading",cameraMenuTitle:"Camera",cameraMenuTooltip:"Choose camera",cameraButtonSplitRoleDescription:"Split button",onSplitButtonAriaLabel:"Turn off camera and camera options",offSplitButtonAriaLabel:"Turn on camera and camera options",cameraActionTurnedOnAnnouncement:"Your camera has been turned on",cameraActionTurnedOffAnnouncement:"Your camera has been turned off",onSplitButtonPrimaryActionCamera:"Turn off camera",offSplitButtonPrimaryActionCamera:"Turn on camera",cameraPrimaryActionSplitButtonTitle:"Use camera",videoEffectsMenuItemTitle:"Effects"};var microphoneButton$k={onLabel:"Mic",offLabel:"Mic",tooltipDisabledContent:"Microphone is disabled",tooltipOnContent:"Mute microphone",tooltipOffContent:"Unmute microphone",microphoneMenuTitle:"Microphone",microphoneMenuTooltip:"Choose microphone",speakerMenuTitle:"Speaker",speakerMenuTooltip:"Choose speaker",microphoneButtonSplitRoleDescription:"Split button",onSplitButtonAriaLabel:"Mute microphone and audio options",offSplitButtonAriaLabel:"Unmute microphone and audio options",microphoneActionTurnedOnAnnouncement:"Your microphone has been turned on",microphoneActionTurnedOffAnnouncement:"Your microphone has been turned off",offSplitButtonMicrophonePrimaryAction:"Unmute microphone",onSplitButtonMicrophonePrimaryAction:"Mute microphone",microphonePrimaryActionSplitButtonTitle:"Use microphone"};var devicesButton$k={label:"Devices",tooltipContent:"Manage devices",cameraMenuTitle:"Camera",cameraMenuTooltip:"Choose camera",audioDeviceMenuTitle:"Audio Device",audioDeviceMenuTooltip:"Choose audio device",microphoneMenuTitle:"Microphone",microphoneMenuTooltip:"Choose microphone",speakerMenuTitle:"Speaker",speakerMenuTooltip:"Choose speaker"};var participantsButton$k={label:"People",tooltipContent:"Show participants",menuHeader:"In this call",participantsListButtonLabel:"{numParticipants} people",muteAllButtonLabel:"Mute all",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied"};var screenShareButton$k={onLabel:"Stop presenting",offLabel:"Present",tooltipDisabledContent:"Presenting is disabled",tooltipOnContent:"Presenting your screen",tooltipOffContent:"Present your screen"};var raiseHandButton$k={offLabel:"Raise",onLabel:"Lower",tooltipDisabledContent:"Raise Hand action is disabled",tooltipOnContent:"Lower Hand",tooltipOffContent:"Raise Hand"};var messageThread$k={yesterday:"Yesterday",sunday:"Sunday",monday:"Monday",tuesday:"Tuesday",wednesday:"Wednesday",thursday:"Thursday",friday:"Friday",saturday:"Saturday",participantJoined:"joined the chat.",participantLeft:"left the chat.",editMessage:"Edit",removeMessage:"Delete",resendMessage:"Try sending again",failToSendTag:"Failed to send",editedTag:"Edited",liveAuthorIntro:"{author} says",messageContentAriaText:"{author} said {message}",messageContentMineAriaText:"You said {message}",editBoxTextLimit:"Your message is over the limit of {limitNumber} characters",editBoxPlaceholderText:"Edit your message",newMessagesIndicator:"New messages",noDisplayNameSub:"No name",editBoxCancelButton:"Cancel",editBoxSubmitButton:"Done",messageReadCount:"Read by {messageReadByCount} of {remoteParticipantsCount}",actionMenuMoreOptions:"More Options",downloadFile:"Download file",blockedWarningText:"This message was deleted due to organizational policy.",blockedWarningLinkText:"Details",fileCardGroupMessage:"The message has {fileCount} attachment",messageDeletedAnnouncementAriaLabel:"The message is deleted"};var errorBar$k={unableToReachChatService:"You are offline",accessDenied:"Unable to access chat services - please check the user credentials provided",userNotInChatThread:"You are no longer in this chat thread",sendMessageNotInChatThread:"Failed to send message because you are no longer in this chat thread",sendMessageGeneric:"Failed to send message",callingNetworkFailure:"Troubling connecting call - you seem to be offline",startVideoGeneric:"Failed to start video",stopVideoGeneric:"Failed to stop video",muteGeneric:"Failed to mute microphone",unmuteGeneric:"Failed to unmute microphone",speakingWhileMuted:"Your microphone is muted",startScreenShareGeneric:"There was an issue starting screen share.",stopScreenShareGeneric:"Failed to stop screen sharing",callNetworkQualityLow:"Network quality is low.",callNoSpeakerFound:"No speakers or headphones found. Connect an audio device to hear the call.",callNoMicrophoneFound:"No microphones found. Connect an audio input device.",callMicrophoneAccessDenied:"Unable to access microphone. Click the lock in the address bar to grant permission to this webpage.",callMicrophoneAccessDeniedSafari:"Unable to access microphone. Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",callMicrophoneMutedBySystem:"You are muted by your system.",callMicrophoneUnmutedBySystem:"Your microphone recovered and you were unmuted by your system.",callMacOsMicrophoneAccessDenied:"Unable to access microphone. Grant microphone permission in your macOS privacy settings.",callLocalVideoFreeze:"Network bandwidth is poor. Your video may appear paused for others on the call.",callCameraAccessDenied:"Unable to access camera. Click the lock in the address bar to grant permission to this webpage.",callCameraAccessDeniedSafari:"Unable to access camera. Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",callCameraAlreadyInUse:"Unable to access camera. It may already be in use by another application.",callVideoStoppedBySystem:"Your video has been stopped by your system.",callVideoRecoveredBySystem:"Your video has resumed.",callMacOsCameraAccessDenied:"MacOS is blocking access to your camera. Update your privacy settings to allow this browser to access your camera.",callMacOsScreenShareAccessDenied:"MacOS is blocking screen sharing. Update your privacy settings to allow this browser to record your screen.",dismissButtonAriaLabel:"Close",failedToJoinCallGeneric:"Failed to join call.",failedToJoinCallInvalidMeetingLink:"Unable to join Meeting. Invalid Link.",cameraFrozenForRemoteParticipants:"Users in the call are having issues seeing your video. Please check your devices and network.",unableToStartVideoEffect:"Unable to apply video effect."};var videoGallery$k={screenIsBeingSharedMessage:"You are sharing your screen",screenShareLoadingMessage:"Loading {participant}'s screen",localVideoLabel:"You",localVideoCameraSwitcherLabel:"Switch camera",localVideoMovementLabel:"Movable Local Video Tile",localVideoSelectedDescription:"{cameraName} selected",displayNamePlaceholder:"Unnamed participant",fitRemoteParticipantToFrame:"Fit to frame",fillRemoteParticipantFrame:"Fill frame",pinParticipantForMe:"Pin for me",pinParticipantForMeLimitReached:"Pin (limit reached)",unpinParticipantForMe:"Unpin",pinParticipantMenuItemAriaLabel:"Pin {participantName}",unpinParticipantMenuItemAriaLabel:"Unpin {participantName}",pinnedParticipantAnnouncementAriaLabel:"Pinned {participantName}",unpinnedParticipantAnnouncementAriaLabel:"Unpinned {participantName}"};var dialpad$k={placeholderText:"Enter phone number",deleteButtonAriaLabel:"Delete"};var holdButton$k={onLabel:"Resume",offLabel:"Hold",tooltipOnContent:"Resume call",tooltipOffContent:"Hold call"};var videoTile$k={participantStateRinging:"Calling...",participantStateHold:"On hold"};var CameraAndMicrophoneSitePermissionsRequest$k={primaryText:"Allow {appName} to use your camera and microphone",secondaryText:"This is so participants can see and hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera and microphone",ariaLabel:"Allow camera and microphone access"};var CameraSitePermissionsRequest$k={primaryText:"Allow {appName} to use your camera",secondaryText:"This is so participants can see you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera",ariaLabel:"Allow camera access"};var MicrophoneSitePermissionsRequest$k={primaryText:"Allow {appName} to use your microphone",secondaryText:"This is so participants can hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without microphone",ariaLabel:"Allow microphone access"};var CameraAndMicrophoneSitePermissionsCheck$k={primaryText:"Checking for camera and microphone access",secondaryText:"Allow access if prompted. This is so participants can see and hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera and microphone",ariaLabel:"Checking for camera and microphone access. Allow access if prompted."};var CameraSitePermissionsCheck$k={primaryText:"Checking for camera access",secondaryText:"Allow access if prompted. This is so participants can see you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera",ariaLabel:"Checking for camera access. Allow access if prompted."};var MicrophoneSitePermissionsCheck$k={primaryText:"Checking for microphone access",secondaryText:"Allow access if prompted. This is so participants can hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without microphone",ariaLabel:"Checking for microphone access. Allow access if prompted."};var CameraAndMicrophoneSitePermissionsDenied$k={primaryText:"Unable to access camera and microphone",secondaryText:"Click the lock icon in the address bar to grant microphone permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without camera and microphone",linkText:"Need help? Get troubleshooting help"};var CameraAndMicrophoneSitePermissionsDeniedSafari$k={primaryText:"Unable to access camera and microphone",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without camera and microphone",linkText:"Need help? Get troubleshooting help"};var CameraSitePermissionsDenied$k={primaryText:"Unable to access camera",secondaryText:"Click the lock icon in the address bar to grant camera permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without camera",linkText:"Need help? Get troubleshooting help"};var MicrophoneSitePermissionsDenied$k={primaryText:"Unable to access microphone",secondaryText:"Click the lock icon in the address bar to grant microphone permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without microphone",linkText:"Need help? Get troubleshooting help"};var CameraSitePermissionsDeniedSafari$k={primaryText:"Unable to access camera",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without camera",linkText:"Need help? Get troubleshooting help"};var MicrophoneSitePermissionsDeniedSafari$k={primaryText:"Unable to access microphone",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without microphone",linkText:"Need help? Get troubleshooting help"};var UnsupportedBrowser$l={primaryText:"Browser not supported",secondaryText:"Please join this call using a compatible browser.",moreHelpLinkText:"See compatibility requirements"};var UnsupportedBrowserVersion$l={primaryText:"Browser update needed",secondaryText:"To ensure the best call possible, please update your browser and then try joining the call again.",moreHelpLinkText:"See compatibility requirements",continueAnywayButtonText:"Start call without updating"};var UnsupportedOperatingSystem$l={primaryText:"Operating system not supported",secondaryText:"Please join this call using a device with a compatible operating system.",moreHelpLinkText:"See compatibility requirements"};var BrowserPermissionDenied$k={primaryText:"Can't use your camera or microphone",secondaryText:"Your browser might not have access to your camera or microphone. To fix this, open System Preferences.",primaryButtonText:"Try again",linkText:"Need help? Get troubleshooting help"};var BrowserPermissionDeniedIOS$k={primaryText:"Allow microphone access to continue",secondaryText:"So other participants can hear you.",primaryButtonText:"Try again",imageAltText:"Microphone and camera device permission location for iOS",linkText:"Need help? Get troubleshooting help",step1Text:"Go to the Settings app",step2Text:"Scroll down to settings for this browser",step3Text:"Turn on Microphone (Camera optional)",step4Text:"Try joining the call again",step1DigitText:"1",step2DigitText:"2",step3DigitText:"3",step4DigitText:"4"};var verticalGallery$k={leftNavButtonAriaLabel:"previous page",rightNavButtonAriaLabel:"next page"};var AttendeeRole$k="Attendee";var en_US$1 = {participantItem:participantItem$k,ParticipantList:ParticipantList$l,typingIndicator:typingIndicator$k,sendBox:sendBox$k,mentionPopover:mentionPopover$k,imageGallery:imageGallery$k,messageStatusIndicator:messageStatusIndicator$k,endCallButton:endCallButton$k,cameraButton:cameraButton$k,microphoneButton:microphoneButton$k,devicesButton:devicesButton$k,participantsButton:participantsButton$k,screenShareButton:screenShareButton$k,raiseHandButton:raiseHandButton$k,messageThread:messageThread$k,errorBar:errorBar$k,videoGallery:videoGallery$k,dialpad:dialpad$k,holdButton:holdButton$k,videoTile:videoTile$k,CameraAndMicrophoneSitePermissionsRequest:CameraAndMicrophoneSitePermissionsRequest$k,CameraSitePermissionsRequest:CameraSitePermissionsRequest$k,MicrophoneSitePermissionsRequest:MicrophoneSitePermissionsRequest$k,CameraAndMicrophoneSitePermissionsCheck:CameraAndMicrophoneSitePermissionsCheck$k,CameraSitePermissionsCheck:CameraSitePermissionsCheck$k,MicrophoneSitePermissionsCheck:MicrophoneSitePermissionsCheck$k,CameraAndMicrophoneSitePermissionsDenied:CameraAndMicrophoneSitePermissionsDenied$k,CameraAndMicrophoneSitePermissionsDeniedSafari:CameraAndMicrophoneSitePermissionsDeniedSafari$k,CameraSitePermissionsDenied:CameraSitePermissionsDenied$k,MicrophoneSitePermissionsDenied:MicrophoneSitePermissionsDenied$k,CameraSitePermissionsDeniedSafari:CameraSitePermissionsDeniedSafari$k,MicrophoneSitePermissionsDeniedSafari:MicrophoneSitePermissionsDeniedSafari$k,UnsupportedBrowser:UnsupportedBrowser$l,UnsupportedBrowserVersion:UnsupportedBrowserVersion$l,UnsupportedOperatingSystem:UnsupportedOperatingSystem$l,BrowserPermissionDenied:BrowserPermissionDenied$k,BrowserPermissionDeniedIOS:BrowserPermissionDeniedIOS$k,verticalGallery:verticalGallery$k,AttendeeRole:AttendeeRole$k};
5070
5069
 
5071
5070
  // Copyright (c) Microsoft Corporation.
5072
5071
  /**
@@ -5867,7 +5866,8 @@ const lightTheme = {
5867
5866
  neutralPrimary: '#323130',
5868
5867
  neutralDark: '#201f1e',
5869
5868
  black: '#000000',
5870
- white: '#ffffff'
5869
+ white: '#ffffff',
5870
+ whiteTranslucent40: 'rgba(255, 255, 255, 0.4)'
5871
5871
  },
5872
5872
  callingPalette: {
5873
5873
  callRed: '#a42e43',
@@ -5917,7 +5917,8 @@ const darkTheme = {
5917
5917
  neutralPrimary: '#ffffff',
5918
5918
  neutralDark: '#f4f4f4',
5919
5919
  black: '#f8f8f8',
5920
- white: '#252423'
5920
+ white: '#252423',
5921
+ whiteTranslucent40: 'rgba(0, 0, 0, 0.4)'
5921
5922
  },
5922
5923
  callingPalette: {
5923
5924
  callRed: '#c4314b',
@@ -11128,6 +11129,28 @@ const MessageThreadWrapper = (props) => {
11128
11129
  });
11129
11130
  }
11130
11131
  }), [onFetchAttachments]);
11132
+ const localeStrings = useLocale$1().strings.messageThread;
11133
+ const strings = React.useMemo(() => (Object.assign(Object.assign({}, localeStrings), props.strings)), [localeStrings, props.strings]);
11134
+ // id for the latest deleted message
11135
+ const [latestDeletedMessageId, setLatestDeletedMessageId] = React.useState(undefined);
11136
+ // this value is used to check if a message is deleted for the previous value of messages array
11137
+ const previousMessagesRef = React.useRef([]);
11138
+ // an aria label for Narrator to notify when a message is deleted
11139
+ const [deletedMessageAriaLabel, setDeletedMessageAriaLabel] = React.useState(undefined);
11140
+ const onDeleteMessageCallback = React.useCallback((messageId) => __awaiter$v(void 0, void 0, void 0, function* () {
11141
+ if (!onDeleteMessage) {
11142
+ return;
11143
+ }
11144
+ try {
11145
+ yield onDeleteMessage(messageId);
11146
+ // reset deleted message label in case if there was a value already (messages are deleted 1 after another)
11147
+ setDeletedMessageAriaLabel(undefined);
11148
+ setLatestDeletedMessageId(messageId);
11149
+ }
11150
+ catch (e) {
11151
+ console.log('onDeleteMessage failed: messageId', messageId, 'error', e);
11152
+ }
11153
+ }), [onDeleteMessage]);
11131
11154
  const isAllChatMessagesLoadedRef = React.useRef(false);
11132
11155
  // isAllChatMessagesLoadedRef needs to be updated every time when a new adapter is set in order to display correct data
11133
11156
  // onLoadPreviousChatMessages is updated when a new adapter is set
@@ -11148,6 +11171,29 @@ const MessageThreadWrapper = (props) => {
11148
11171
  const messages = React.useMemo(() => {
11149
11172
  return newMessages;
11150
11173
  }, [newMessages]);
11174
+ React.useEffect(() => {
11175
+ if (latestDeletedMessageId === undefined) {
11176
+ setDeletedMessageAriaLabel(undefined);
11177
+ }
11178
+ else {
11179
+ if (!previousMessagesRef.current.find((message) => message.messageId === latestDeletedMessageId)) {
11180
+ // the message is deleted in previousMessagesRef
11181
+ // no need to update deletedMessageAriaLabel
11182
+ setDeletedMessageAriaLabel(undefined);
11183
+ }
11184
+ else if (!messages.find((message) => message.messageId === latestDeletedMessageId)) {
11185
+ // the message is deleted in messages array but still exists in previousMessagesRef
11186
+ // update deletedMessageAriaLabel
11187
+ setDeletedMessageAriaLabel(strings.messageDeletedAnnouncementAriaLabel);
11188
+ }
11189
+ else {
11190
+ // the message exists in both arrays
11191
+ // no need to update deletedMessageAriaLabel
11192
+ setDeletedMessageAriaLabel(undefined);
11193
+ }
11194
+ }
11195
+ previousMessagesRef.current = messages;
11196
+ }, [latestDeletedMessageId, messages, strings.messageDeletedAnnouncementAriaLabel]);
11151
11197
  const messagesRef = React.useRef(messages);
11152
11198
  const setMessagesRef = (messagesWithAttachedValue) => {
11153
11199
  messagesRef.current = messagesWithAttachedValue;
@@ -11334,8 +11380,6 @@ const MessageThreadWrapper = (props) => {
11334
11380
  setMessageReadBy(getParticipantsWhoHaveReadMessage(message, readReceiptsBySenderIdRef.current));
11335
11381
  }
11336
11382
  }, []);
11337
- const localeStrings = useLocale$1().strings.messageThread;
11338
- const strings = React.useMemo(() => (Object.assign(Object.assign({}, localeStrings), props.strings)), [localeStrings, props.strings]);
11339
11383
  const defaultStatusRenderer = React.useCallback((message, participantCount, readCount, status) => {
11340
11384
  const onToggleToolTip = (isToggled) => {
11341
11385
  if (isToggled && readReceiptsBySenderIdRef.current) {
@@ -11353,7 +11397,7 @@ const MessageThreadWrapper = (props) => {
11353
11397
  const messagesToDisplay = React.useMemo(() => {
11354
11398
  return memoizeAllMessages((memoizedMessageFn) => {
11355
11399
  return messages.map((message, index) => {
11356
- return memoizedMessageFn(message, showMessageDate, showMessageStatus, strings, index, onUpdateMessage, onCancelEditMessage, onDeleteMessage, onSendMessage, props.disableEditing, lastDeliveredChatMessage, lastSeenChatMessage, lastSendingChatMessage);
11400
+ return memoizedMessageFn(message, showMessageDate, showMessageStatus, strings, index, onUpdateMessage, onCancelEditMessage, onDeleteMessageCallback, onSendMessage, props.disableEditing, lastDeliveredChatMessage, lastSeenChatMessage, lastSendingChatMessage);
11357
11401
  });
11358
11402
  });
11359
11403
  }, [
@@ -11362,7 +11406,7 @@ const MessageThreadWrapper = (props) => {
11362
11406
  lastSendingChatMessage,
11363
11407
  messages,
11364
11408
  onCancelEditMessage,
11365
- onDeleteMessage,
11409
+ onDeleteMessageCallback,
11366
11410
  onSendMessage,
11367
11411
  onUpdateMessage,
11368
11412
  props.disableEditing,
@@ -11375,6 +11419,7 @@ const MessageThreadWrapper = (props) => {
11375
11419
  existsNewChatMessage && !disableJumpToNewMessageButton && (React__default["default"].createElement("div", { className: react.mergeStyles(newMessageButtonContainerStyle, styles === null || styles === void 0 ? void 0 : styles.newMessageButtonContainer) }, onRenderJumpToNewMessageButton ? (onRenderJumpToNewMessageButton({ text: strings.newMessagesIndicator, onClick: scrollToBottom })) : (React__default["default"].createElement(DefaultJumpToNewMessageButton, { text: strings.newMessagesIndicator, onClick: scrollToBottom })))),
11376
11420
  React__default["default"].createElement(LiveAnnouncer, null,
11377
11421
  React__default["default"].createElement(FluentV9ThemeProvider, { v8Theme: theme },
11422
+ React__default["default"].createElement(Announcer$1, { announcementString: deletedMessageAriaLabel, ariaLive: 'assertive' }),
11378
11423
  React__default["default"].createElement(reactChat.Chat
11379
11424
  // styles?.chatContainer used in className and style prop as style prop can't handle CSS selectors
11380
11425
  , {
@@ -11544,8 +11589,7 @@ const participantStateStringStyles$1 = {
11544
11589
  textOverflow: 'ellipsis',
11545
11590
  whiteSpace: 'nowrap',
11546
11591
  lineHeight: 'normal',
11547
- paddingLeft: '1rem',
11548
- marginLeft: 'auto',
11592
+ marginLeft: '0.5rem',
11549
11593
  marginRight: 0
11550
11594
  };
11551
11595
  /**
@@ -20244,9 +20288,9 @@ var __awaiter$p = (window && window.__awaiter) || function (thisArg, _arguments,
20244
20288
  step((generator = generator.apply(thisArg, _arguments || [])).next());
20245
20289
  });
20246
20290
  };
20247
- produce.enableMapSet();
20291
+ immer.enableMapSet();
20248
20292
  // Needed to generate state diff for verbose logging.
20249
- produce.enablePatches();
20293
+ immer.enablePatches();
20250
20294
  /**
20251
20295
  * @private
20252
20296
  */
@@ -20271,7 +20315,7 @@ class ChatContext$1 {
20271
20315
  }
20272
20316
  modifyState(modifier) {
20273
20317
  const priorState = this._state;
20274
- this._state = produce__default["default"](this._state, modifier, (patches) => {
20318
+ this._state = immer.produce(this._state, modifier, (patches) => {
20275
20319
  if (logger.getLogLevel() === 'verbose') {
20276
20320
  // Log to `info` because AzureLogger.verbose() doesn't show up in console.
20277
20321
  this._logger.info(`State change: ${_safeJSONStringify(patches)}`);
@@ -21482,18 +21526,18 @@ class FileUploadContext {
21482
21526
  }
21483
21527
  addFileUploads(fileUploads) {
21484
21528
  const fileUploadsMap = convertObservableFileUploadToFileUploadsUiState(fileUploads);
21485
- this.chatContext.setState(produce__default["default"](this.chatContext.getState(), (draft) => {
21529
+ this.chatContext.setState(immer.produce(this.chatContext.getState(), (draft) => {
21486
21530
  draft.fileUploads = draft.fileUploads || {};
21487
21531
  draft.fileUploads = Object.assign(Object.assign({}, draft.fileUploads), fileUploadsMap);
21488
21532
  }));
21489
21533
  }
21490
21534
  clearFileUploads() {
21491
- this.chatContext.setState(produce__default["default"](this.chatContext.getState(), (draft) => {
21535
+ this.chatContext.setState(immer.produce(this.chatContext.getState(), (draft) => {
21492
21536
  draft.fileUploads = {};
21493
21537
  }));
21494
21538
  }
21495
21539
  updateFileUpload(id, data) {
21496
- this.chatContext.setState(produce__default["default"](this.chatContext.getState(), (draft) => {
21540
+ this.chatContext.setState(immer.produce(this.chatContext.getState(), (draft) => {
21497
21541
  var _a, _b;
21498
21542
  if ((_a = draft.fileUploads) === null || _a === void 0 ? void 0 : _a[id]) {
21499
21543
  draft.fileUploads[id] = Object.assign(Object.assign({}, (_b = draft.fileUploads) === null || _b === void 0 ? void 0 : _b[id]), data);
@@ -21501,7 +21545,7 @@ class FileUploadContext {
21501
21545
  }));
21502
21546
  }
21503
21547
  deleteFileUploads(ids) {
21504
- this.chatContext.setState(produce__default["default"](this.chatContext.getState(), (draft) => {
21548
+ this.chatContext.setState(immer.produce(this.chatContext.getState(), (draft) => {
21505
21549
  ids.forEach((id) => {
21506
21550
  var _a;
21507
21551
  (_a = draft === null || draft === void 0 ? void 0 : draft.fileUploads) === null || _a === void 0 ? true : delete _a[id];
@@ -28285,7 +28329,6 @@ const CONFIGURATION_PAGE_SECTION_MAX_WIDTH_REM = 20.625;
28285
28329
  /** @private */
28286
28330
  const CONFIGURATION_PAGE_SECTION_HEIGHT_REM = 13.625;
28287
28331
  const LOGO_HEIGHT_REM = 3;
28288
- const LOGO_MARGIN_BOTTOM_REM = 1;
28289
28332
  /**
28290
28333
  * @private
28291
28334
  */
@@ -28296,6 +28339,12 @@ const configurationStackTokensDesktop = {
28296
28339
  * @private
28297
28340
  */
28298
28341
  const configurationStackTokensMobile = {
28342
+ childrenGap: '0.5rem'
28343
+ };
28344
+ /**
28345
+ * @private
28346
+ */
28347
+ const deviceConfigurationStackTokens = {
28299
28348
  childrenGap: '1.5rem'
28300
28349
  };
28301
28350
  /** @private */
@@ -28303,7 +28352,7 @@ const configurationContainerStyle = (desktop, backgroundImageUrl) => ({
28303
28352
  root: {
28304
28353
  height: '100%',
28305
28354
  width: '100%',
28306
- padding: '2rem 1rem 2rem 1rem',
28355
+ padding: desktop ? '2rem 1rem 2rem 1rem' : '1rem 1rem 2rem 1rem',
28307
28356
  minWidth: desktop
28308
28357
  ? '25rem' // sum of min-width from children + ChildrenGap * (nb of children - 1) + padding * 2 = (11 + 11) + (2 * 1) + 0.5 * 2
28309
28358
  : '16rem',
@@ -28356,20 +28405,36 @@ const selectionContainerStyle = (theme) => react.mergeStyles({
28356
28405
  /**
28357
28406
  * @private
28358
28407
  */
28359
- const titleContainerStyleDesktop = react.mergeStyles({
28360
- fontSize: '1.25rem',
28361
- lineHeight: '1.75rem',
28408
+ const titleContainerStyleDesktop = (theme) => react.mergeStyles({
28409
+ fontSize: '1.2rem',
28410
+ lineHeight: '1rem',
28362
28411
  fontWeight: 600
28363
- });
28412
+ }, configurationPageTextDecoration(theme));
28364
28413
  /**
28365
28414
  * @private
28366
28415
  */
28367
- const titleContainerStyleMobile = react.mergeStyles({
28416
+ const titleContainerStyleMobile = (theme) => react.mergeStyles({
28368
28417
  fontSize: '1.0625rem',
28369
28418
  lineHeight: '1.375rem',
28370
28419
  fontWeight: 600,
28371
28420
  textAlign: 'center'
28372
- });
28421
+ }, configurationPageTextDecoration(theme));
28422
+ /**
28423
+ * Ensure configuration page text is legible on top of a background image.
28424
+ * @private
28425
+ */
28426
+ const configurationPageTextDecoration = (theme) => {
28427
+ return {
28428
+ textShadow: `0px 0px 8px ${theme.palette.whiteTranslucent40}`,
28429
+ fill: theme.semanticColors.bodyText,
28430
+ stroke: theme.palette.whiteTranslucent40,
28431
+ paintOrder: 'stroke fill',
28432
+ strokeWidth: _pxToRem(1.5),
28433
+ text: {
28434
+ letterSpacing: '-0.02rem' // cope with extra width due to stroke width
28435
+ }
28436
+ };
28437
+ };
28373
28438
  /**
28374
28439
  * @private
28375
28440
  */
@@ -28382,8 +28447,7 @@ const callDetailsContainerStyles = {
28382
28447
  };
28383
28448
  const callDetailsStyle = {
28384
28449
  fontSize: '0.9375',
28385
- lineHeight: '1.25rem',
28386
- marginTop: '0.25rem'
28450
+ lineHeight: '1.25rem'
28387
28451
  };
28388
28452
  /**
28389
28453
  * @private
@@ -28392,7 +28456,7 @@ const callDetailsStyleDesktop = react.mergeStyles(Object.assign({}, callDetailsS
28392
28456
  /**
28393
28457
  * @private
28394
28458
  */
28395
- const callDetailsStyleMobile = react.mergeStyles(Object.assign(Object.assign({}, callDetailsStyle), { textAlign: 'center' }));
28459
+ const callDetailsStyleMobile = react.mergeStyles(Object.assign(Object.assign({}, callDetailsStyle), { marginBottom: '0.5rem', textAlign: 'center' }));
28396
28460
  /**
28397
28461
  * @private
28398
28462
  */
@@ -28478,7 +28542,7 @@ const configurationCenteredContent = (fillsHeight, hasLogo) => react.mergeStyles
28478
28542
  // in and not shift the content. To exclude the logo, we subtract the logo height
28479
28543
  // and margin from the actual height. This allows the flex box's natural centering
28480
28544
  // to appropriately center the content.
28481
- height: `calc(100% - ${!fillsHeight && hasLogo ? `${LOGO_HEIGHT_REM + LOGO_MARGIN_BOTTOM_REM}rem` : '0rem'})`
28545
+ height: `calc(100% - ${!fillsHeight && hasLogo ? `${LOGO_HEIGHT_REM}rem` : '0rem'})`
28482
28546
  });
28483
28547
  /** @private */
28484
28548
  const panelStyles = {
@@ -28508,8 +28572,7 @@ const logoStyles = (shape) => ({
28508
28572
  root: {
28509
28573
  overflow: 'initial',
28510
28574
  display: 'flex',
28511
- justifyContent: 'center',
28512
- marginBottom: `${LOGO_MARGIN_BOTTOM_REM}rem`
28575
+ justifyContent: 'center'
28513
28576
  },
28514
28577
  image: {
28515
28578
  borderRadius: shape === 'circle' ? '100%' : undefined,
@@ -29054,6 +29117,88 @@ const CallReadinessModalFallBack = (props) => {
29054
29117
  }
29055
29118
  };
29056
29119
 
29120
+ // Copyright (c) Microsoft Corporation.
29121
+ /**
29122
+ * An SVG element component that wraps inner text to fit the width of the SVG.
29123
+ * @private
29124
+ */
29125
+ const SvgWithWordWrapping = (props) => {
29126
+ const { width, text, lineHeightPx, bufferHeightPx } = props;
29127
+ const svgRef = React.useRef(null);
29128
+ const calculationTextElement = React.useRef(null);
29129
+ const visibleTextElement = React.useRef(null);
29130
+ const [height, setHeight] = React.useState(0);
29131
+ // useLayoutEffect ensures that the calculationTextElement is rendered before being used for calculations.
29132
+ // Using useLayoutEffect over useEffect ensures we do not get a layout shift when the visibleTextElement is rendered
29133
+ // and the height is updated. This is because useLayoutEffect runs synchronously after DOM mutations but
29134
+ // before the browser has a chance to paint. See https://reactjs.org/docs/hooks-reference.html#uselayouteffect
29135
+ // for more details.
29136
+ React.useLayoutEffect(() => {
29137
+ if (text && calculationTextElement.current && visibleTextElement.current) {
29138
+ const numLines = convertTextToWrappedText(calculationTextElement.current, visibleTextElement.current, width, lineHeightPx);
29139
+ setHeight(numLines * lineHeightPx);
29140
+ }
29141
+ }, [width, lineHeightPx, text]);
29142
+ return (React__default["default"].createElement("svg", { width: width, height: height + bufferHeightPx, ref: svgRef, xmlns: "http://www.w3.org/2000/svg" },
29143
+ React__default["default"].createElement("text", { height: 0, ref: calculationTextElement, style: { visibility: 'hidden' } }, text),
29144
+ React__default["default"].createElement("text", { ref: visibleTextElement, x: "0", y: bufferHeightPx / 4, role: "heading", "aria-level": 1 })));
29145
+ };
29146
+ /**
29147
+ * Wrap text in tspan elements to fit the width of the SVG
29148
+ * @param baseTextElement The text element to create the wrapped text from.
29149
+ * @param outputTextElement The text element to insert the wrapped text into.
29150
+ * @param maxWidth The maximum width of the text element.
29151
+ * @param lineHeightPx The height of each line in pixels.
29152
+ * @returns The number of lines of text.
29153
+ */
29154
+ const convertTextToWrappedText = (inputTextElement, outputTextElement, maxWidth, lineHeightPx) => {
29155
+ var _a, _b;
29156
+ const words = (_b = (_a = inputTextElement.textContent) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : [];
29157
+ if (words.length === 0 || words[0] === '') {
29158
+ throw new Error('Text element must contain text');
29159
+ }
29160
+ // The current line being built.
29161
+ let line = '';
29162
+ // Running total of the number of lines.
29163
+ let numLines = 0;
29164
+ // First, clear the output text element.
29165
+ outputTextElement.textContent = '';
29166
+ // Iterate through each word and create a tspan element for each line.
29167
+ for (let i = 0; i < words.length; i++) {
29168
+ const testLine = line + words[i] + ' ';
29169
+ const testWidth = inputTextElement.getSubStringLength(0, testLine.length);
29170
+ if (testWidth > maxWidth && i > 0) {
29171
+ const newLine = constructTSpanLine(line, lineHeightPx);
29172
+ outputTextElement.appendChild(newLine);
29173
+ line = words[i] + ' ';
29174
+ numLines++;
29175
+ }
29176
+ else {
29177
+ line = testLine;
29178
+ }
29179
+ }
29180
+ // Add the last line.
29181
+ const newLine = constructTSpanLine(line, lineHeightPx);
29182
+ outputTextElement.appendChild(newLine);
29183
+ numLines++;
29184
+ // Return the number of lines to calculate the height of the SVG.
29185
+ return numLines;
29186
+ };
29187
+ /**
29188
+ * Create a tspan element for a line of text, with text set to be centered.
29189
+ * @param line The line of text.
29190
+ * @param lineHeightPx The height of each line in pixels.
29191
+ * @returns The tspan element.
29192
+ */
29193
+ const constructTSpanLine = (line, lineHeightPx) => {
29194
+ const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
29195
+ tspan.textContent = line;
29196
+ tspan.setAttribute('x', '50%');
29197
+ tspan.setAttribute('dy', _pxToRem(lineHeightPx));
29198
+ tspan.setAttribute('text-anchor', 'middle');
29199
+ return tspan;
29200
+ };
29201
+
29057
29202
  // Copyright (c) Microsoft Corporation.
29058
29203
  // Licensed under the MIT License.
29059
29204
  var __awaiter$9 = (window && window.__awaiter) || function (thisArg, _arguments, P, generator) {
@@ -29123,7 +29268,8 @@ const ConfigurationPage = (props) => {
29123
29268
  }
29124
29269
  }
29125
29270
  const locale = useLocale();
29126
- const title = (React__default["default"].createElement(react.Stack.Item, { className: mobileView ? titleContainerStyleMobile : titleContainerStyleDesktop, role: "heading", "aria-level": 1 }, locale.strings.call.configurationPageTitle));
29271
+ const title = locale.strings.call.configurationPageTitle.length > 0 ? (React__default["default"].createElement(react.Stack.Item, { className: mobileView ? titleContainerStyleMobile(theme) : titleContainerStyleDesktop(theme) },
29272
+ React__default["default"].createElement(SvgWithWordWrapping, { width: mobileView ? 325 : 445, lineHeightPx: 16 * 1.5, bufferHeightPx: 16, text: locale.strings.call.configurationPageTitle }))) : (React__default["default"].createElement(React__default["default"].Fragment, null));
29127
29273
  const callDescription = locale.strings.call.configurationPageCallDetails && (React__default["default"].createElement(react.Stack.Item, { className: mobileView ? callDetailsStyleMobile : callDetailsStyleDesktop }, locale.strings.call.configurationPageCallDetails));
29128
29274
  let mobileWithPreview = mobileView;
29129
29275
  /* @conditional-compile-remove(rooms) */
@@ -29222,7 +29368,7 @@ const ConfigurationPage = (props) => {
29222
29368
  logo: props.logo }),
29223
29369
  title,
29224
29370
  callDescription),
29225
- React__default["default"].createElement(react.Stack, { horizontal: !mobileWithPreview, horizontalAlign: mobileWithPreview ? 'stretch' : 'center', verticalFill: mobileWithPreview, tokens: configurationStackTokensMobile },
29371
+ React__default["default"].createElement(react.Stack, { horizontal: !mobileWithPreview, horizontalAlign: mobileWithPreview ? 'stretch' : 'center', verticalFill: mobileWithPreview, tokens: deviceConfigurationStackTokens },
29226
29372
  localPreviewTrampoline(mobileWithPreview,
29227
29373
  /* @conditional-compile-remove(rooms) */ !!(role === 'Consumer')),
29228
29374
  React__default["default"].createElement(react.Stack, { styles: mobileView ? undefined : configurationSectionStyle },