@azure/communication-react 1.13.0-alpha-202402220012 → 1.13.0-alpha-202402240011

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 (130) hide show
  1. package/dist/communication-react.d.ts +67 -11
  2. package/dist/dist-cjs/communication-react/index.js +426 -110
  3. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  4. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  5. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  6. package/dist/dist-esm/calling-component-bindings/src/baseSelectors.d.ts +5 -4
  7. package/dist/dist-esm/calling-component-bindings/src/baseSelectors.js.map +1 -1
  8. package/dist/dist-esm/calling-component-bindings/src/captionsSelector.d.ts +5 -5
  9. package/dist/dist-esm/calling-component-bindings/src/captionsSelector.js +1 -1
  10. package/dist/dist-esm/calling-component-bindings/src/captionsSelector.js.map +1 -1
  11. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.d.ts +1 -1
  12. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js +2 -2
  13. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js.map +1 -1
  14. package/dist/dist-esm/calling-component-bindings/src/index.d.ts +1 -0
  15. package/dist/dist-esm/calling-component-bindings/src/index.js.map +1 -1
  16. package/dist/dist-esm/calling-component-bindings/src/utils/participantListSelectorUtils.js +1 -1
  17. package/dist/dist-esm/calling-component-bindings/src/utils/participantListSelectorUtils.js.map +1 -1
  18. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.d.ts +3 -1
  19. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js +5 -4
  20. package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js.map +1 -1
  21. package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +4 -4
  22. package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
  23. package/dist/dist-esm/calling-stateful-client/src/CallContext.js +1 -1
  24. package/dist/dist-esm/calling-stateful-client/src/CallContext.js.map +1 -1
  25. package/dist/dist-esm/chat-stateful-client/src/ResourceDownloadQueue.js +1 -1
  26. package/dist/dist-esm/chat-stateful-client/src/ResourceDownloadQueue.js.map +1 -1
  27. package/dist/dist-esm/communication-react/src/index.d.ts +1 -0
  28. package/dist/dist-esm/communication-react/src/index.js.map +1 -1
  29. package/dist/dist-esm/react-components/src/components/CaptionsSettingsModal.d.ts +7 -7
  30. package/dist/dist-esm/react-components/src/components/CaptionsSettingsModal.js +11 -17
  31. package/dist/dist-esm/react-components/src/components/CaptionsSettingsModal.js.map +1 -1
  32. package/dist/dist-esm/react-components/src/components/Dialpad/DTMFToneGenerator.d.ts +7 -0
  33. package/dist/dist-esm/react-components/src/components/Dialpad/DTMFToneGenerator.js.map +1 -1
  34. package/dist/dist-esm/react-components/src/components/Dialpad/Dialpad.js.map +1 -1
  35. package/dist/dist-esm/react-components/src/components/LocalVideoTile.js +3 -3
  36. package/dist/dist-esm/react-components/src/components/LocalVideoTile.js.map +1 -1
  37. package/dist/dist-esm/react-components/src/components/MessageStatusIcon.d.ts +19 -0
  38. package/dist/dist-esm/react-components/src/components/MessageStatusIcon.js +20 -0
  39. package/dist/dist-esm/react-components/src/components/MessageStatusIcon.js.map +1 -0
  40. package/dist/dist-esm/react-components/src/components/MessageStatusIndicator.js +4 -64
  41. package/dist/dist-esm/react-components/src/components/MessageStatusIndicator.js.map +1 -1
  42. package/dist/dist-esm/react-components/src/components/MessageStatusIndicatorInternal.d.ts +42 -0
  43. package/dist/dist-esm/react-components/src/components/MessageStatusIndicatorInternal.js +73 -0
  44. package/dist/dist-esm/react-components/src/components/MessageStatusIndicatorInternal.js.map +1 -0
  45. package/dist/dist-esm/react-components/src/components/MessageThread.js +36 -4
  46. package/dist/dist-esm/react-components/src/components/MessageThread.js.map +1 -1
  47. package/dist/dist-esm/react-components/src/components/ModalClone/ModalClone.js.map +1 -1
  48. package/dist/dist-esm/react-components/src/components/ParticipantItem.d.ts +2 -0
  49. package/dist/dist-esm/react-components/src/components/ParticipantItem.js.map +1 -1
  50. package/dist/dist-esm/react-components/src/components/ParticipantList.js +4 -8
  51. package/dist/dist-esm/react-components/src/components/ParticipantList.js.map +1 -1
  52. package/dist/dist-esm/react-components/src/components/RTE/RTEInputBoxComponent.d.ts +2 -0
  53. package/dist/dist-esm/react-components/src/components/RTE/RTEInputBoxComponent.js +1 -1
  54. package/dist/dist-esm/react-components/src/components/RTE/RTEInputBoxComponent.js.map +1 -1
  55. package/dist/dist-esm/react-components/src/components/RTE/RTERibbonButtons.d.ts +12 -0
  56. package/dist/dist-esm/react-components/src/components/RTE/RTERibbonButtons.js +86 -0
  57. package/dist/dist-esm/react-components/src/components/RTE/RTERibbonButtons.js.map +1 -0
  58. package/dist/dist-esm/react-components/src/components/RTE/RTESendBox.d.ts +39 -4
  59. package/dist/dist-esm/react-components/src/components/RTE/RTESendBox.js +10 -5
  60. package/dist/dist-esm/react-components/src/components/RTE/RTESendBox.js.map +1 -1
  61. package/dist/dist-esm/react-components/src/components/RTE/RichTextEditor.d.ts +2 -0
  62. package/dist/dist-esm/react-components/src/components/RTE/RichTextEditor.js +52 -20
  63. package/dist/dist-esm/react-components/src/components/RTE/RichTextEditor.js.map +1 -1
  64. package/dist/dist-esm/react-components/src/components/ReactionButton.d.ts +1 -1
  65. package/dist/dist-esm/react-components/src/components/ReactionButton.js +1 -1
  66. package/dist/dist-esm/react-components/src/components/ReactionButton.js.map +1 -1
  67. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.d.ts +1 -1
  68. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js +4 -6
  69. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js.map +1 -1
  70. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.d.ts +4 -6
  71. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.js +21 -11
  72. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.js.map +1 -1
  73. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js.map +1 -1
  74. package/dist/dist-esm/react-components/src/components/VideoGallery.d.ts +2 -0
  75. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  76. package/dist/dist-esm/react-components/src/components/VideoTile.js +1 -1
  77. package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
  78. package/dist/dist-esm/react-components/src/components/index.d.ts +2 -2
  79. package/dist/dist-esm/react-components/src/components/index.js +1 -1
  80. package/dist/dist-esm/react-components/src/components/index.js.map +1 -1
  81. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.d.ts +13 -0
  82. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.js +112 -0
  83. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.js.map +1 -1
  84. package/dist/dist-esm/react-components/src/components/utils/videoTileStylesUtils.d.ts +2 -2
  85. package/dist/dist-esm/react-components/src/components/utils/videoTileStylesUtils.js.map +1 -1
  86. package/dist/dist-esm/react-components/src/components/utils.d.ts +8 -1
  87. package/dist/dist-esm/react-components/src/components/utils.js +8 -0
  88. package/dist/dist-esm/react-components/src/components/utils.js.map +1 -1
  89. package/dist/dist-esm/react-components/src/index.d.ts +1 -1
  90. package/dist/dist-esm/react-components/src/index.js.map +1 -1
  91. package/dist/dist-esm/react-components/src/localization/LocalizationProvider.d.ts +3 -2
  92. package/dist/dist-esm/react-components/src/localization/LocalizationProvider.js.map +1 -1
  93. package/dist/dist-esm/react-components/src/localization/locales/en-US/strings.json +21 -4
  94. package/dist/dist-esm/react-components/src/localization/locales/utils.js +5 -1
  95. package/dist/dist-esm/react-components/src/localization/locales/utils.js.map +1 -1
  96. package/dist/dist-esm/react-components/src/theming/icons.d.ts +8 -0
  97. package/dist/dist-esm/react-components/src/theming/icons.js +19 -1
  98. package/dist/dist-esm/react-components/src/theming/icons.js.map +1 -1
  99. package/dist/dist-esm/react-components/src/types/CaptionsAvailableLanguageStrings.d.ts +21 -0
  100. package/dist/dist-esm/react-components/src/types/CaptionsAvailableLanguageStrings.js.map +1 -1
  101. package/dist/dist-esm/react-components/src/types/ParticipantListParticipant.d.ts +1 -1
  102. package/dist/dist-esm/react-components/src/types/ParticipantListParticipant.js.map +1 -1
  103. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.d.ts +1 -1
  104. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +7 -3
  105. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
  106. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.d.ts +1 -1
  107. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
  108. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalAndRemotePIP.js +2 -2
  109. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalAndRemotePIP.js.map +1 -1
  110. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js +2 -2
  111. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js.map +1 -1
  112. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.js +1 -1
  113. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.js.map +1 -1
  114. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.d.ts +1 -1
  115. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js +3 -3
  116. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js.map +1 -1
  117. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.d.ts +1 -1
  118. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.js.map +1 -1
  119. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.d.ts +1 -1
  120. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js +1 -1
  121. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js.map +1 -1
  122. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js +1 -1
  123. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js.map +1 -1
  124. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js +3 -5
  125. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js.map +1 -1
  126. package/dist/dist-esm/react-composites/src/composites/common/ModalLocalAndRemotePIP.js +5 -2
  127. package/dist/dist-esm/react-composites/src/composites/common/ModalLocalAndRemotePIP.js.map +1 -1
  128. package/dist/dist-esm/react-composites/src/composites/common/icons.d.ts +8 -0
  129. package/dist/tsdoc-metadata.json +1 -1
  130. package/package.json +7 -7
@@ -173,7 +173,7 @@ function getDefaultExportFromCjs (x) {
173
173
  // Copyright (c) Microsoft Corporation.
174
174
  // Licensed under the MIT License.
175
175
  // GENERATED FILE. DO NOT EDIT MANUALLY.
176
- var telemetryVersion = '1.13.0-alpha-202402220012';
176
+ var telemetryVersion = '1.13.0-alpha-202402240011';
177
177
 
178
178
 
179
179
  var telemetryVersion$1 = /*@__PURE__*/getDefaultExportFromCjs(telemetryVersion);
@@ -938,7 +938,7 @@ const createDefaultCommonCallingHandlers = memoizeOne((callClient, deviceManager
938
938
  }
939
939
  });
940
940
  /* @conditional-compile-remove(reaction) */
941
- const onReactionClicked = (reaction) => __awaiter$P(void 0, void 0, void 0, function* () {
941
+ const onReactionClick = (reaction) => __awaiter$P(void 0, void 0, void 0, function* () {
942
942
  var _c;
943
943
  if (reaction === 'like' ||
944
944
  reaction === 'applause' ||
@@ -1214,7 +1214,7 @@ const createDefaultCommonCallingHandlers = memoizeOne((callClient, deviceManager
1214
1214
  /* @conditional-compile-remove(raise-hand) */
1215
1215
  onToggleRaiseHand,
1216
1216
  /* @conditional-compile-remove(reaction) */
1217
- onReactionClicked,
1217
+ onReactionClick: onReactionClick,
1218
1218
  /* @conditional-compile-remove(PSTN-calls) */
1219
1219
  onAddParticipant: notImplemented,
1220
1220
  onRemoveParticipant: notImplemented,
@@ -1391,7 +1391,7 @@ const _captionSettingsSelector = reselect__namespace.createSelector([
1391
1391
  ], (supportedCaptionLanguages, currentCaptionLanguage, supportedSpokenLanguages, currentSpokenLanguage, isCaptionsFeatureActive) => {
1392
1392
  return {
1393
1393
  supportedCaptionLanguages: supportedCaptionLanguages !== null && supportedCaptionLanguages !== void 0 ? supportedCaptionLanguages : [],
1394
- currentCaptionLanguage: currentCaptionLanguage !== null && currentCaptionLanguage !== void 0 ? currentCaptionLanguage : '',
1394
+ currentCaptionLanguage: currentCaptionLanguage !== null && currentCaptionLanguage !== void 0 ? currentCaptionLanguage : 'en',
1395
1395
  supportedSpokenLanguages: supportedSpokenLanguages !== null && supportedSpokenLanguages !== void 0 ? supportedSpokenLanguages : ['en-us'],
1396
1396
  currentSpokenLanguage: currentSpokenLanguage !== null && currentSpokenLanguage !== void 0 ? currentSpokenLanguage : 'en-us',
1397
1397
  isCaptionsFeatureActive: isCaptionsFeatureActive !== null && isCaptionsFeatureActive !== void 0 ? isCaptionsFeatureActive : false
@@ -2227,7 +2227,7 @@ let CallContext$2 = class CallContext {
2227
2227
  clearTimeout(this._timeOutId[participantKey]);
2228
2228
  const participant = call.remoteParticipants[participantKey];
2229
2229
  const newReactionState = reactionMessage
2230
- ? { reactionMessage: reactionMessage, receivedAt: new Date() }
2230
+ ? { reactionMessage: reactionMessage, receivedOn: new Date() }
2231
2231
  : undefined;
2232
2232
  if (participantKey === toFlatCommunicationIdentifier(this._state.userId)) {
2233
2233
  call.localParticipantReaction = newReactionState;
@@ -5383,7 +5383,7 @@ const typingIndicatorStringStyle = react.mergeStyles({
5383
5383
  wordBreak: 'break-word'
5384
5384
  });
5385
5385
 
5386
- 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 imageOverlay$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 reactionButton$k={label:"React",tooltipDisabledContent:"Reaction action is disabled",tooltipContent:"Send a reaction",likeReactionTooltipContent:"Like",heartReactionTooltipContent:"Love",laughReactionTooltipContent:"Laugh",applauseReactionTooltipContent:"Applause",surprisedReactionTooltipContent:"Surprised"};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.",startSpotlightWhileMaxParticipantsAreSpotlighted:"Cannot start spotlight on participant(s) because the maximum number of participants are already spotlighted."};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}",startSpotlightVideoTileMenuLabel:"Spotlight for everyone",addSpotlightVideoTileMenuLabel:"Add spotlight",spotlightLimitReachedMenuTitle:"Spotlight limit reached",stopSpotlightVideoTileMenuLabel:"Stop spotlighting",stopSpotlightOnSelfVideoTileMenuLabel:"Exit spotlight"};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,imageOverlay:imageOverlay$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,reactionButton:reactionButton$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};
5386
+ var participantItem$k={isMeText:"(you)",menuTitle:"More Options",removeButtonLabel:"Remove",sharingIconLabel:"Sharing",mutedIconLabel:"Muted",displayNamePlaceholder:"Unnamed participant",participantStateRinging:"Calling...",participantStateHold:"On hold",attendeeRole:"Attendee"};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 richTextSendBox={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",boldTooltip:"Bold",italicTooltip:"Italic",underlineTooltip:"Underline",bulletListTooltip:"Bulleted list",numberListTooltip:"Numbered list",increaseIndentTooltip:"Increase indent",decreaseIndentTooltip:"Decrease indent"};var mentionPopover$k={mentionPopoverHeader:"Suggestions"};var imageOverlay$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 reactionButton$k={label:"React",tooltipDisabledContent:"Reaction action is disabled",tooltipContent:"Send a reaction",likeReactionTooltipContent:"Like",heartReactionTooltipContent:"Love",laughReactionTooltipContent:"Laugh",applauseReactionTooltipContent:"Applause",surprisedReactionTooltipContent:"Surprised"};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.",startSpotlightWhileMaxParticipantsAreSpotlighted:"Cannot start spotlight on participant(s) because the maximum number of participants are already spotlighted."};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}",startSpotlightVideoTileMenuLabel:"Spotlight for everyone",addSpotlightVideoTileMenuLabel:"Add spotlight",spotlightLimitReachedMenuTitle:"Spotlight limit reached",stopSpotlightVideoTileMenuLabel:"Stop spotlighting",stopSpotlightOnSelfVideoTileMenuLabel:"Exit spotlight",attendeeRole:"Attendee"};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 en_US$1 = {participantItem:participantItem$k,ParticipantList:ParticipantList$l,typingIndicator:typingIndicator$k,sendBox:sendBox$k,richTextSendBox:richTextSendBox,mentionPopover:mentionPopover$k,imageOverlay:imageOverlay$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,reactionButton:reactionButton$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};
5387
5387
 
5388
5388
  // Copyright (c) Microsoft Corporation.
5389
5389
  // Licensed under the MIT License.
@@ -5840,6 +5840,14 @@ e.nativeEvent.isComposing ||
5840
5840
  * @private
5841
5841
  */
5842
5842
  const nullToUndefined = (value) => (value === null ? undefined : value);
5843
+ /**
5844
+ * Helper function to get the keys of an object
5845
+ *
5846
+ * @private
5847
+ */
5848
+ function getKeys(obj) {
5849
+ return Object.keys(obj);
5850
+ }
5843
5851
 
5844
5852
  // Copyright (c) Microsoft Corporation.
5845
5853
  // Licensed under the MIT License.
@@ -6560,7 +6568,23 @@ const DEFAULT_COMPONENT_ICONS = {
6560
6568
  /* @conditional-compile-remove(spotlight) */
6561
6569
  StopSpotlightContextualMenuItem: React.createElement(reactIcons.VideoPersonStarOff20Filled, null),
6562
6570
  /* @conditional-compile-remove(spotlight) */
6563
- VideoSpotlighted: React.createElement(reactIcons.VideoPersonStar20Filled, { style: { height: '16px', width: '16px' } })
6571
+ VideoSpotlighted: React.createElement(reactIcons.VideoPersonStar20Filled, { style: { height: '16px', width: '16px' } }),
6572
+ /* @conditional-compile-remove(rich-text-editor) */
6573
+ RTEBoldButtonIcon: React.createElement(reactIcons.TextBold20Regular, null),
6574
+ /* @conditional-compile-remove(rich-text-editor) */
6575
+ RTEItalicButtonIcon: React.createElement(reactIcons.TextItalic20Regular, null),
6576
+ /* @conditional-compile-remove(rich-text-editor) */
6577
+ RTEUnderlineButtonIcon: React.createElement(reactIcons.TextUnderlineCharacterU20Regular, null),
6578
+ /* @conditional-compile-remove(rich-text-editor) */
6579
+ RTEBulletListButtonIcon: React.createElement(reactIcons.TextBulletList20Regular, null),
6580
+ /* @conditional-compile-remove(rich-text-editor) */
6581
+ RTEtNumberListButtonIcon: React.createElement(reactIcons.TextNumberListLtr20Regular, null),
6582
+ /* @conditional-compile-remove(rich-text-editor) */
6583
+ RTEIndentDecreaseButtonIcon: React.createElement(reactIcons.TextIndentDecrease20Regular, null),
6584
+ /* @conditional-compile-remove(rich-text-editor) */
6585
+ RTEIndentIncreaseButtonIcon: React.createElement(reactIcons.TextIndentIncrease20Regular, null),
6586
+ /* @conditional-compile-remove(rich-text-editor) */
6587
+ RTEDividerIcon: React.createElement(reactIcons.DividerTall24Regular, null)
6564
6588
  };
6565
6589
 
6566
6590
  // Copyright (c) Microsoft Corporation.
@@ -9074,6 +9098,202 @@ const richTextEditorStyle = react.mergeStyles({
9074
9098
  minHeight: '2.25rem',
9075
9099
  maxHeight: '8.25rem'
9076
9100
  });
9101
+ /**
9102
+ * @private
9103
+ */
9104
+ const ribbonButtonStyle = (theme) => {
9105
+ return {
9106
+ icon: { color: theme.palette.neutralPrimary, height: 'auto' },
9107
+ menuIcon: { color: theme.palette.neutralPrimary, height: 'auto' },
9108
+ root: { minWidth: 'auto', backgroundColor: 'transparent' },
9109
+ rootChecked: {
9110
+ backgroundColor: 'transparent',
9111
+ selectors: {
9112
+ // Icon's color doesn't work here because of the specificity
9113
+ '.ms-Button-icon': {
9114
+ color: theme.palette.themePrimary
9115
+ },
9116
+ '.ms-Button-menuIcon': {
9117
+ color: theme.palette.themePrimary
9118
+ }
9119
+ }
9120
+ },
9121
+ rootHovered: {
9122
+ backgroundColor: 'transparent',
9123
+ selectors: {
9124
+ // Icon's color doesn't work here because of the specificity
9125
+ '.ms-Button-icon': {
9126
+ color: theme.palette.themePrimary
9127
+ },
9128
+ '.ms-Button-menuIcon': {
9129
+ color: theme.palette.themePrimary
9130
+ }
9131
+ }
9132
+ },
9133
+ rootCheckedHovered: {
9134
+ backgroundColor: 'transparent',
9135
+ selectors: {
9136
+ // Icon's color doesn't work here because of the specificity
9137
+ '.ms-Button-icon': {
9138
+ color: theme.palette.themePrimary
9139
+ },
9140
+ '.ms-Button-menuIcon': {
9141
+ color: theme.palette.themePrimary
9142
+ }
9143
+ }
9144
+ },
9145
+ rootCheckedPressed: {
9146
+ backgroundColor: 'transparent',
9147
+ selectors: {
9148
+ // Icon's color doesn't work here because of the specificity
9149
+ '.ms-Button-icon': {
9150
+ color: theme.palette.themePrimary
9151
+ },
9152
+ '.ms-Button-menuIcon': {
9153
+ color: theme.palette.themePrimary
9154
+ }
9155
+ }
9156
+ },
9157
+ rootPressed: {
9158
+ backgroundColor: 'transparent',
9159
+ selectors: {
9160
+ // Icon's color doesn't work here because of the specificity
9161
+ '.ms-Button-icon': {
9162
+ color: theme.palette.themePrimary
9163
+ },
9164
+ '.ms-Button-menuIcon': {
9165
+ color: theme.palette.themePrimary
9166
+ }
9167
+ }
9168
+ },
9169
+ rootExpanded: {
9170
+ backgroundColor: 'transparent',
9171
+ selectors: {
9172
+ // Icon's color doesn't work here because of the specificity
9173
+ '.ms-Button-icon': {
9174
+ color: theme.palette.themePrimary
9175
+ },
9176
+ '.ms-Button-menuIcon': {
9177
+ color: theme.palette.themePrimary
9178
+ }
9179
+ }
9180
+ },
9181
+ rootExpandedHovered: {
9182
+ backgroundColor: 'transparent',
9183
+ selectors: {
9184
+ //icon color is not working here because of the specificity
9185
+ '.ms-Button-icon': {
9186
+ color: theme.palette.themePrimary
9187
+ },
9188
+ '.ms-Button-menuIcon': {
9189
+ color: theme.palette.themePrimary
9190
+ }
9191
+ }
9192
+ }
9193
+ };
9194
+ };
9195
+ /**
9196
+ * @private
9197
+ */
9198
+ const ribbonDividerStyle = (theme) => {
9199
+ return {
9200
+ icon: { color: theme.palette.neutralQuaternaryAlt, margin: '0 -0.5rem', height: 'auto' },
9201
+ root: { margin: '0', padding: '0', minWidth: 'auto' }
9202
+ };
9203
+ };
9204
+ /**
9205
+ * @private
9206
+ */
9207
+ const ribbonStyle = () => {
9208
+ return {
9209
+ // Override for the default white color of the Ribbon component
9210
+ root: { backgroundColor: 'transparent' }
9211
+ };
9212
+ };
9213
+
9214
+ // Copyright (c) Microsoft Corporation.
9215
+ // Licensed under the MIT License.
9216
+ const dividerRibbonButton = (theme) => {
9217
+ return {
9218
+ key: 'Divider',
9219
+ iconName: 'RTEDividerIcon',
9220
+ unlocalizedText: '',
9221
+ onClick: () => { },
9222
+ isDisabled: () => true,
9223
+ commandBarProperties: {
9224
+ buttonStyles: ribbonDividerStyle(theme)
9225
+ }
9226
+ };
9227
+ };
9228
+ const boldButton = (theme) => {
9229
+ return createKnownRibbonButton(roosterjsReact.KnownRibbonButtonKey.Bold, theme, 'RTEBoldButtonIcon');
9230
+ };
9231
+ const italicButton = (theme) => {
9232
+ return createKnownRibbonButton(roosterjsReact.KnownRibbonButtonKey.Italic, theme, 'RTEItalicButtonIcon');
9233
+ };
9234
+ const underlineButton = (theme) => {
9235
+ return createKnownRibbonButton(roosterjsReact.KnownRibbonButtonKey.Underline, theme, 'RTEUnderlineButtonIcon');
9236
+ };
9237
+ const bulletListButton = (theme) => {
9238
+ return createKnownRibbonButton(roosterjsReact.KnownRibbonButtonKey.BulletedList, theme, 'RTEBulletListButtonIcon');
9239
+ };
9240
+ const numberListButton = (theme) => {
9241
+ return createKnownRibbonButton(roosterjsReact.KnownRibbonButtonKey.NumberedList, theme, 'RTEtNumberListButtonIcon');
9242
+ };
9243
+ const indentIncreaseButton = (theme) => {
9244
+ return createKnownRibbonButton(roosterjsReact.KnownRibbonButtonKey.IncreaseIndent, theme, 'RTEIndentIncreaseButtonIcon');
9245
+ };
9246
+ const indentDecreaseButton = (theme) => {
9247
+ return createKnownRibbonButton(roosterjsReact.KnownRibbonButtonKey.DecreaseIndent, theme, 'RTEIndentDecreaseButtonIcon');
9248
+ };
9249
+ const createKnownRibbonButton = (key, theme, icon) => {
9250
+ var _a;
9251
+ const buttons = roosterjsReact.getButtons([key]);
9252
+ if (buttons.length > 0) {
9253
+ const button = buttons[0];
9254
+ // AllButtonStringKeys is a union of all the string keys of all the buttons
9255
+ const result = buttons[0];
9256
+ button.iconName = icon;
9257
+ button.commandBarProperties = Object.assign(Object.assign({}, button.commandBarProperties), { buttonStyles: Object.assign(Object.assign({}, (_a = button.commandBarProperties) === null || _a === void 0 ? void 0 : _a.buttonStyles), ribbonButtonStyle(theme)) });
9258
+ return result;
9259
+ }
9260
+ return undefined;
9261
+ };
9262
+ /**
9263
+ * @private
9264
+ */
9265
+ const ribbonButtons = (theme) => {
9266
+ const buttons = [];
9267
+ [
9268
+ boldButton(theme),
9269
+ italicButton(theme),
9270
+ underlineButton(theme),
9271
+ dividerRibbonButton(theme),
9272
+ bulletListButton(theme),
9273
+ numberListButton(theme),
9274
+ indentIncreaseButton(theme),
9275
+ indentDecreaseButton(theme)
9276
+ ].forEach((item) => {
9277
+ if (item !== undefined) {
9278
+ buttons.push(item);
9279
+ }
9280
+ });
9281
+ return buttons;
9282
+ };
9283
+ /**
9284
+ * @private
9285
+ */
9286
+ const ribbonButtonsStrings = (strings) => {
9287
+ return {
9288
+ buttonNameBold: strings.boldTooltip,
9289
+ buttonNameItalic: strings.italicTooltip,
9290
+ buttonNameUnderline: strings.underlineTooltip,
9291
+ buttonNameBulletedList: strings.bulletListTooltip,
9292
+ buttonNameNumberedList: strings.numberListTooltip,
9293
+ buttonNameIncreaseIndent: strings.increaseIndentTooltip,
9294
+ buttonNameDecreaseIndent: strings.decreaseIndentTooltip
9295
+ };
9296
+ };
9077
9297
 
9078
9298
  // Copyright (c) Microsoft Corporation.
9079
9299
  // Licensed under the MIT License.
@@ -9083,8 +9303,10 @@ const richTextEditorStyle = react.mergeStyles({
9083
9303
  * @beta
9084
9304
  */
9085
9305
  React.forwardRef((props, ref) => {
9086
- const { content, onChange, placeholderText } = props;
9306
+ const { content, onChange, placeholderText, strings } = props;
9087
9307
  const editor = React.useRef(null);
9308
+ const [divComponent, setDivComponent] = React.useState(null);
9309
+ const theme = react.useTheme();
9088
9310
  React.useImperativeHandle(ref, () => {
9089
9311
  return {
9090
9312
  focus() {
@@ -9100,23 +9322,50 @@ React.forwardRef((props, ref) => {
9100
9322
  (_b = editor.current) === null || _b === void 0 ? void 0 : _b.setContent(content || '');
9101
9323
  }
9102
9324
  }, [content]);
9103
- const editorCreator = React.useMemo(() => {
9104
- return (div) => {
9105
- const contentEdit = new roosterjsEditorPlugins.ContentEdit();
9106
- const placeholderPlugin = new roosterjsEditorPlugins.Watermark(placeholderText || '');
9107
- const updateContentPlugin = roosterjsReact.createUpdateContentPlugin(roosterjsReact.UpdateMode.OnContentChangedEvent | roosterjsReact.UpdateMode.OnUserInput, (content) => {
9108
- onChange && onChange(content);
9109
- });
9110
- const options = {
9111
- plugins: [placeholderPlugin, contentEdit, updateContentPlugin],
9112
- imageSelectionBorderColor: 'blue'
9113
- };
9114
- editor.current = new roosterjsEditorCore.Editor(div, options);
9115
- return editor.current;
9116
- };
9117
- }, [onChange, placeholderText]);
9325
+ React.useEffect(() => {
9326
+ if (divComponent !== null && theme.palette.neutralPrimary !== undefined) {
9327
+ // Adjust color prop for the div component when theme is updated
9328
+ // because doNotAdjustEditorColor is set for Rooster
9329
+ divComponent.style.color = theme.palette.neutralPrimary;
9330
+ }
9331
+ }, [divComponent, theme]);
9332
+ const ribbonPlugin = React.useMemo(() => {
9333
+ return roosterjsReact.createRibbonPlugin();
9334
+ }, []);
9335
+ const editorCreator = React.useCallback((div, options) => {
9336
+ editor.current = new roosterjsEditorCore.Editor(div, options);
9337
+ setDivComponent(div);
9338
+ // Remove the background color of the editor
9339
+ div.style.backgroundColor = 'transparent';
9340
+ return editor.current;
9341
+ }, []);
9342
+ const plugins = React.useMemo(() => {
9343
+ const contentEdit = new roosterjsEditorPlugins.ContentEdit();
9344
+ const placeholderPlugin = new roosterjsEditorPlugins.Watermark(placeholderText || '');
9345
+ const updateContentPlugin = roosterjsReact.createUpdateContentPlugin(roosterjsReact.UpdateMode.OnContentChangedEvent | roosterjsReact.UpdateMode.OnUserInput, (content) => {
9346
+ onChange && onChange(content);
9347
+ });
9348
+ return [contentEdit, placeholderPlugin, updateContentPlugin, ribbonPlugin];
9349
+ }, [onChange, placeholderText, ribbonPlugin]);
9350
+ const ribbon = React.useMemo(() => {
9351
+ const buttons = ribbonButtons(theme);
9352
+ return (
9353
+ //TODO: Add localization for watermark plugin https://github.com/microsoft/roosterjs/issues/2430
9354
+ React.createElement(roosterjsReact.Ribbon, { styles: ribbonStyle(), buttons: buttons, plugin: ribbonPlugin, overflowButtonProps: {
9355
+ styles: ribbonButtonStyle(theme),
9356
+ menuProps: {
9357
+ items: [], // CommandBar will determine items rendered in overflow
9358
+ isBeakVisible: false
9359
+ }
9360
+ }, strings: ribbonButtonsStrings(strings) }));
9361
+ }, [strings, ribbonPlugin, theme]);
9118
9362
  return (React.createElement("div", null,
9119
- React.createElement(roosterjsReact.Rooster, { className: richTextEditorStyle, editorCreator: editorCreator })));
9363
+ ribbon,
9364
+ React.createElement(roosterjsReact.Rooster, { inDarkMode: isDarkThemed(theme), plugins: plugins, className: richTextEditorStyle, editorCreator: editorCreator,
9365
+ // TODO: confirm the color during inline images implementation
9366
+ imageSelectionBorderColor: 'blue',
9367
+ // doNotAdjustEditorColor is used to fix the default background color for Rooster component
9368
+ doNotAdjustEditorColor: true })));
9120
9369
  });
9121
9370
 
9122
9371
  // Copyright (c) Microsoft Corporation.
@@ -9185,6 +9434,23 @@ const AnnouncerMessage = (props) => {
9185
9434
  /** @private */
9186
9435
  const LiveMessage = (props) => (React.createElement(AnnouncerContext.Consumer, null, (contextProps) => React.createElement(AnnouncerMessage, Object.assign({}, contextProps, props))));
9187
9436
 
9437
+ // Copyright (c) Microsoft Corporation.
9438
+ // Licensed under the MIT License.
9439
+ /**
9440
+ * Component to display message status icon
9441
+ *
9442
+ * @internal
9443
+ */
9444
+ const MessageStatusIcon = (props) => {
9445
+ const { shouldAnnounce, iconName, iconClassName, ariaLabel } = props;
9446
+ return (React.createElement(React.Fragment, null,
9447
+ ariaLabel && React.createElement(LiveMessage, { message: ariaLabel, ariaLive: "polite" }),
9448
+ React.createElement("div", {
9449
+ // make icon accessible
9450
+ tabIndex: 0 },
9451
+ React.createElement(react.Icon, { role: 'status', "aria-live": shouldAnnounce ? 'polite' : 'off', "data-ui-id": 'chat-composite-message-status-icon', "aria-label": ariaLabel, iconName: iconName, className: iconClassName }))));
9452
+ };
9453
+
9188
9454
  // Copyright (c) Microsoft Corporation.
9189
9455
  // Licensed under the MIT License.
9190
9456
  /**
@@ -9192,10 +9458,10 @@ const LiveMessage = (props) => (React.createElement(AnnouncerContext.Consumer, n
9192
9458
  *
9193
9459
  * Adds an icon and tooltip corresponding to the message status.
9194
9460
  *
9195
- * @public
9461
+ * @internal
9196
9462
  */
9197
- const MessageStatusIndicator = (props) => {
9198
- const { status, styles, remoteParticipantsCount, onToggleToolTip, readCount } = props;
9463
+ const MessageStatusIndicatorInternal = (props) => {
9464
+ const { status, styles, remoteParticipantsCount, onToggleToolTip, readCount, shouldAnnounce } = props;
9199
9465
  const localeStrings = useLocale$1().strings.messageStatusIndicator;
9200
9466
  const [isTooltipToggled, setIsTooltipToggled] = React.useState(false);
9201
9467
  const strings = Object.assign(Object.assign({}, localeStrings), props.strings);
@@ -9210,18 +9476,14 @@ const MessageStatusIndicator = (props) => {
9210
9476
  switch (status) {
9211
9477
  case 'failed':
9212
9478
  return (React.createElement(react.TooltipHost, { content: strings.failedToSendTooltipText, "data-ui-id": "chat-composite-message-tooltip", calloutProps: Object.assign({}, calloutProps), styles: hostStyles$1 },
9213
- strings.failedToSendAriaLabel && (
9214
- // live message is used here and in the following tooltips so that aria labels are announced on mobile
9215
- React.createElement(LiveMessage, { message: strings.failedToSendAriaLabel, ariaLive: "polite" })),
9216
- React.createElement(react.Icon, { role: "status", "data-ui-id": "chat-composite-message-status-icon", "aria-label": strings.failedToSendAriaLabel, iconName: "MessageFailed", className: react.mergeStyles(MessageStatusIndicatorErrorIconStyle, { color: theme.palette.redDark }, styles === null || styles === void 0 ? void 0 : styles.root) })));
9479
+ React.createElement(MemoMessageStatusIcon, { shouldAnnounce: shouldAnnounce, iconName: "MessageFailed", iconClassName: react.mergeStyles(MessageStatusIndicatorErrorIconStyle, { color: theme.palette.redDark }, styles === null || styles === void 0 ? void 0 : styles.root), ariaLabel: strings.failedToSendAriaLabel })));
9217
9480
  case 'sending':
9218
9481
  return (React.createElement(react.TooltipHost, { content: strings.sendingTooltipText, "data-ui-id": "chat-composite-message-tooltip", calloutProps: Object.assign({}, calloutProps), styles: hostStyles$1 },
9219
- strings.sendingAriaLabel && React.createElement(LiveMessage, { message: strings.sendingAriaLabel, ariaLive: "polite" }),
9220
- React.createElement(react.Icon, { role: "status", "data-ui-id": "chat-composite-message-status-icon", "aria-label": strings.sendingAriaLabel, iconName: "MessageSending", className: react.mergeStyles(MessageStatusIndicatorIconStyle, { color: theme.palette.themePrimary }, styles === null || styles === void 0 ? void 0 : styles.root) })));
9482
+ React.createElement(MemoMessageStatusIcon, { shouldAnnounce: shouldAnnounce, iconName: "MessageSending", iconClassName: react.mergeStyles(MessageStatusIndicatorIconStyle, { color: theme.palette.themePrimary }, styles === null || styles === void 0 ? void 0 : styles.root), ariaLabel: strings.sendingAriaLabel })));
9221
9483
  case 'seen':
9222
9484
  return (React.createElement(react.TooltipHost, { calloutProps: Object.assign({}, calloutProps), "data-ui-id": "chat-composite-message-tooltip", styles: hostStyles$1, content:
9223
9485
  // when it's just 1 to 1 texting, we don't need to know who has read the message, just show message as 'seen'
9224
- // when readcount is 0, we have a bug, show 'seen' to cover up as a fall back
9486
+ // when readCount is 0, we have a bug, show 'seen' to cover up as a fall back
9225
9487
  // when participant count is 0, we have a bug, show 'seen' to cover up as a fall back
9226
9488
  readCount === 0 ||
9227
9489
  (remoteParticipantsCount && remoteParticipantsCount <= 1) ||
@@ -9238,12 +9500,10 @@ const MessageStatusIndicator = (props) => {
9238
9500
  setIsTooltipToggled(!isTooltipToggled);
9239
9501
  }
9240
9502
  } },
9241
- strings.seenAriaLabel && React.createElement(LiveMessage, { message: strings.seenAriaLabel, ariaLive: "polite" }),
9242
- React.createElement(react.Icon, { "data-ui-id": "chat-composite-message-status-icon", role: "status", "aria-label": strings.seenAriaLabel, iconName: "MessageSeen", className: react.mergeStyles({ color: theme.palette.themePrimary }, styles === null || styles === void 0 ? void 0 : styles.root) })));
9503
+ React.createElement(MemoMessageStatusIcon, { shouldAnnounce: shouldAnnounce, iconName: "MessageSeen", iconClassName: react.mergeStyles({ color: theme.palette.themePrimary }, styles === null || styles === void 0 ? void 0 : styles.root), ariaLabel: strings.seenAriaLabel })));
9243
9504
  case 'delivered':
9244
9505
  return (React.createElement(react.TooltipHost, { calloutProps: Object.assign({}, calloutProps), content: strings.deliveredTooltipText, "data-ui-id": "chat-composite-message-tooltip", styles: hostStyles$1 },
9245
- strings.deliveredAriaLabel && React.createElement(LiveMessage, { message: strings.deliveredAriaLabel, ariaLive: "polite" }),
9246
- React.createElement(react.Icon, { role: "status", "data-ui-id": "chat-composite-message-status-icon", "aria-label": strings.deliveredAriaLabel, iconName: "MessageDelivered", className: react.mergeStyles(MessageStatusIndicatorIconStyle, { color: theme.palette.themePrimary }, styles === null || styles === void 0 ? void 0 : styles.root) })));
9506
+ React.createElement(MemoMessageStatusIcon, { shouldAnnounce: shouldAnnounce, iconName: "MessageDelivered", iconClassName: react.mergeStyles(MessageStatusIndicatorIconStyle, { color: theme.palette.themePrimary }, styles === null || styles === void 0 ? void 0 : styles.root), ariaLabel: strings.deliveredAriaLabel })));
9247
9507
  default:
9248
9508
  return React.createElement(React.Fragment, null);
9249
9509
  }
@@ -9252,6 +9512,23 @@ const MessageStatusIndicator = (props) => {
9252
9512
  // To prevent sizing issues or tooltip positioning issues, we override to inline-block.
9253
9513
  // For more details see "Icon Button with Tooltip" on https://developer.microsoft.com/en-us/fluentui#/controls/web/button
9254
9514
  const hostStyles$1 = { root: { display: 'inline-block' } };
9515
+ const MemoMessageStatusIcon = React.memo((obj) => {
9516
+ return React.createElement(MessageStatusIcon, Object.assign({}, obj));
9517
+ });
9518
+
9519
+ // Copyright (c) Microsoft Corporation.
9520
+ // Licensed under the MIT License.
9521
+ /**
9522
+ * Component to display the status of a sent message.
9523
+ *
9524
+ * Adds an icon and tooltip corresponding to the message status.
9525
+ *
9526
+ * @public
9527
+ */
9528
+ const MessageStatusIndicator = (props) => {
9529
+ const internalProps = Object.assign(Object.assign({}, props), { shouldAnnounce: true });
9530
+ return React.createElement(MessageStatusIndicatorInternal, Object.assign({}, internalProps));
9531
+ };
9255
9532
 
9256
9533
  // Copyright (c) Microsoft Corporation.
9257
9534
  // Licensed under the MIT License.
@@ -11526,6 +11803,15 @@ const getLastChatMessageIdWithStatus = (messages, status) => {
11526
11803
  }
11527
11804
  return undefined;
11528
11805
  };
11806
+ const getLastChatMessageForCurrentUser = (messages) => {
11807
+ for (let i = messages.length - 1; i >= 0; i--) {
11808
+ const message = messages[i];
11809
+ if (message.messageType === 'chat' && message.mine) {
11810
+ return message;
11811
+ }
11812
+ }
11813
+ return undefined;
11814
+ };
11529
11815
  /**
11530
11816
  * `MessageThread` allows you to easily create a component for rendering chat messages, handling scrolling behavior of new/old messages and customizing icons & controls inside the chat thread.
11531
11817
  * @param props - of type MessageThreadProps
@@ -11593,6 +11879,7 @@ const MessageThreadWrapper = (props) => {
11593
11879
  // reset deleted message label in case if there was a value already (messages are deleted 1 after another)
11594
11880
  setDeletedMessageAriaLabel(undefined);
11595
11881
  setLatestDeletedMessageId(messageId);
11882
+ lastChatMessageStatus.current = 'deleted';
11596
11883
  // we should set up latestDeletedMessageId before the onDeleteMessage call
11597
11884
  // as otherwise in very rare cases the messages array can be updated before latestDeletedMessageId
11598
11885
  yield onDeleteMessage(messageId);
@@ -11787,6 +12074,23 @@ const MessageThreadWrapper = (props) => {
11787
12074
  // Only scroll to bottom if isAtBottomOfScrollRef is true
11788
12075
  isAtBottomOfScrollRef.current && scrollToBottom();
11789
12076
  }, [clientHeight, forceUpdate, scrollToBottom, chatMessagesInitialized]);
12077
+ React.useEffect(() => {
12078
+ var _a;
12079
+ const newStatus = (_a = getLastChatMessageForCurrentUser(newMessages)) === null || _a === void 0 ? void 0 : _a.status;
12080
+ if (newStatus !== undefined) {
12081
+ if (lastChatMessageStatus.current === 'deleted' && newStatus === 'sending') {
12082
+ // enforce message life cycle
12083
+ // message status should always be [ sending -> delivered -> seen (optional) -> deleted ] or [sending -> failed -> deleted]
12084
+ // not any other way around
12085
+ // therefore, if current message status is deleted, we should only update it if newStatus is sending
12086
+ lastChatMessageStatus.current = newStatus;
12087
+ }
12088
+ else if (lastChatMessageStatus.current !== 'deleted') {
12089
+ lastChatMessageStatus.current = newStatus;
12090
+ }
12091
+ }
12092
+ // The hook should depend on newMessages not on messages as otherwise it will skip the sending status for a first message
12093
+ }, [newMessages]);
11790
12094
  /**
11791
12095
  * This needs to run to update latestPreviousChatMessage & latestCurrentChatMessage.
11792
12096
  * These two states are used to manipulate scrollbar
@@ -11815,6 +12119,7 @@ const MessageThreadWrapper = (props) => {
11815
12119
  }
11816
12120
  // eslint-disable-next-line react-hooks/exhaustive-deps
11817
12121
  }, [messages]);
12122
+ const lastChatMessageStatus = React.useRef(undefined);
11818
12123
  const participantCountRef = React.useRef(participantCount);
11819
12124
  const readReceiptsBySenderIdRef = React.useRef(readReceiptsBySenderId);
11820
12125
  participantCountRef.current = participantCount;
@@ -11825,6 +12130,10 @@ const MessageThreadWrapper = (props) => {
11825
12130
  }
11826
12131
  }, []);
11827
12132
  const defaultStatusRenderer = React.useCallback((message, participantCount, readCount, status) => {
12133
+ // we should only announce label if the message status isn't deleted
12134
+ // because after message is deleted, we now need to render statusIndicator for previous messages
12135
+ // and their status has been announced already and we should not announce them again
12136
+ const shouldAnnounce = lastChatMessageStatus.current !== 'deleted';
11828
12137
  const onToggleToolTip = (isToggled) => {
11829
12138
  if (isToggled && readReceiptsBySenderIdRef.current) {
11830
12139
  setReadCountForHoveredIndicator(getParticipantsWhoHaveReadMessage(message, readReceiptsBySenderIdRef.current).length);
@@ -11833,9 +12142,9 @@ const MessageThreadWrapper = (props) => {
11833
12142
  setReadCountForHoveredIndicator(undefined);
11834
12143
  }
11835
12144
  };
11836
- return (React.createElement(MessageStatusIndicator, { status: status, readCount: readCount, onToggleToolTip: onToggleToolTip,
12145
+ return (React.createElement(MessageStatusIndicatorInternal, { status: status, readCount: readCount, onToggleToolTip: onToggleToolTip,
11837
12146
  // -1 because participant count does not include myself
11838
- remoteParticipantsCount: participantCount ? participantCount - 1 : 0 }));
12147
+ remoteParticipantsCount: participantCount ? participantCount - 1 : 0, shouldAnnounce: shouldAnnounce }));
11839
12148
  }, []);
11840
12149
  const theme = useTheme();
11841
12150
  const messagesToDisplay = React.useMemo(() => {
@@ -11863,7 +12172,7 @@ const MessageThreadWrapper = (props) => {
11863
12172
  existsNewChatMessage && !disableJumpToNewMessageButton && (React.createElement("div", { className: react.mergeStyles(newMessageButtonContainerStyle, styles === null || styles === void 0 ? void 0 : styles.newMessageButtonContainer) }, onRenderJumpToNewMessageButton ? (onRenderJumpToNewMessageButton({ text: strings.newMessagesIndicator, onClick: scrollToBottom })) : (React.createElement(DefaultJumpToNewMessageButton, { text: strings.newMessagesIndicator, onClick: scrollToBottom })))),
11864
12173
  React.createElement(LiveAnnouncer, null,
11865
12174
  React.createElement(FluentV9ThemeProvider, { v8Theme: theme },
11866
- React.createElement(Announcer$1, { announcementString: deletedMessageAriaLabel, ariaLive: 'assertive' }),
12175
+ latestDeletedMessageId && (React.createElement(Announcer$1, { key: latestDeletedMessageId, announcementString: deletedMessageAriaLabel, ariaLive: 'assertive' })),
11867
12176
  React.createElement(reactChat.Chat
11868
12177
  // styles?.chatContainer used in className and style prop as style prop can't handle CSS selectors
11869
12178
  , {
@@ -12396,7 +12705,7 @@ const iconStyles$2 = react.mergeStyles({
12396
12705
 
12397
12706
  // Copyright (c) Microsoft Corporation.
12398
12707
  // Licensed under the MIT License.
12399
- const onRenderParticipantDefault = (participant, strings, myUserId, onRenderAvatar, createParticipantMenuItems, styles, onParticipantClick, showParticipantOverflowTooltip, participantAriaLabelledBy, theme, attendeeRoleString) => {
12708
+ const onRenderParticipantDefault = (participant, strings, myUserId, onRenderAvatar, createParticipantMenuItems, styles, onParticipantClick, showParticipantOverflowTooltip, participantAriaLabelledBy, theme) => {
12400
12709
  const callingParticipant = participant;
12401
12710
  let presence = undefined;
12402
12711
  if (callingParticipant) {
@@ -12406,8 +12715,8 @@ const onRenderParticipantDefault = (participant, strings, myUserId, onRenderAvat
12406
12715
  let displayName = participant.displayName;
12407
12716
  /* @conditional-compile-remove(hide-attendee-name) */
12408
12717
  const formatDisplayName = () => {
12409
- if (displayName && attendeeRoleString) {
12410
- return _formatString(displayName, { AttendeeRole: attendeeRoleString });
12718
+ if (displayName && strings.attendeeRole) {
12719
+ return _formatString(displayName, { AttendeeRole: strings.attendeeRole });
12411
12720
  }
12412
12721
  return displayName;
12413
12722
  };
@@ -12506,8 +12815,6 @@ const ParticipantList$k = (props) => {
12506
12815
  const participantItemStrings = useLocale$1().strings.participantItem;
12507
12816
  /* @conditional-compile-remove(total-participant-count) */
12508
12817
  const participantListStrings = useLocale$1().strings.ParticipantList;
12509
- /* @conditional-compile-remove(hide-attendee-name) */
12510
- const attendeeRoleString = useLocale$1().strings.AttendeeRole;
12511
12818
  const displayedParticipants = React.useMemo(() => {
12512
12819
  return onRenderParticipant ? participants : getParticipantsForDefaultRender(participants, excludeMe, myUserId);
12513
12820
  }, [participants, excludeMe, myUserId, onRenderParticipant]);
@@ -12548,9 +12855,7 @@ const ParticipantList$k = (props) => {
12548
12855
  ? onRenderParticipant(participant)
12549
12856
  : onRenderParticipantDefault(participant, participantItemStrings, myUserId, onRenderAvatar, createParticipantMenuItems, participantItemStyles, props.onParticipantClick, showParticipantOverflowTooltip, participantAriaLabelledBy,
12550
12857
  /* @conditional-compile-remove(raise-hand) */
12551
- theme,
12552
- /* @conditional-compile-remove(hide-attendee-name) */
12553
- attendeeRoleString)),
12858
+ theme)),
12554
12859
  /* @conditional-compile-remove(total-participant-count) */ overflowParticipantCountString &&
12555
12860
  totalParticipantCount &&
12556
12861
  totalParticipantCount > displayedParticipants.length && (React.createElement(react.Text, { style: { fontWeight: 400, margin: '0.5rem' } }, _formatString(overflowParticipantCountString, {
@@ -13705,7 +14010,7 @@ const VideoTile = (props) => {
13705
14010
  /* @conditional-compile-remove(reaction) */
13706
14011
  const currentUnixTimeStamp = Math.floor(currentTimestamp.getTime() / 1000);
13707
14012
  /* @conditional-compile-remove(reaction) */
13708
- const receivedUnixTimestamp = reaction ? Math.floor(reaction.receivedAt.getTime() / 1000) : undefined;
14013
+ const receivedUnixTimestamp = reaction ? Math.floor(reaction.receivedOn.getTime() / 1000) : undefined;
13709
14014
  /* @conditional-compile-remove(reaction) */
13710
14015
  const canRenderReaction = (receivedUnixTimestamp ? currentUnixTimeStamp - receivedUnixTimestamp < 3000 : false) &&
13711
14016
  backgroundImageUrl !== undefined;
@@ -13807,7 +14112,7 @@ const bracketedParticipantString = (participantString, withBrackets) => {
13807
14112
  * @internal
13808
14113
  */
13809
14114
  const _RemoteVideoTile = React.memo((props) => {
13810
- var _a;
14115
+ var _a, _b;
13811
14116
  const { isAvailable, isReceiving = true, // default to true to prevent any breaking change
13812
14117
  isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind, isPinned, onPinParticipant, onUnpinParticipant,
13813
14118
  /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds,
@@ -13879,9 +14184,9 @@ const _RemoteVideoTile = React.memo((props) => {
13879
14184
  setDrawerMenuItemProps(convertContextualMenuItemsToDrawerMenuItemProps$1(contextualMenuProps, () => setDrawerMenuItemProps([])));
13880
14185
  }
13881
14186
  }, [setDrawerMenuItemProps, contextualMenuProps]);
13882
- let displayName = remoteParticipant.displayName || (strings === null || strings === void 0 ? void 0 : strings.displayNamePlaceholder);
14187
+ let displayName = remoteParticipant.displayName || strings.displayNamePlaceholder;
13883
14188
  /* @conditional-compile-remove(hide-attendee-name) */
13884
- const attendeeRoleString = useLocale$1().strings.AttendeeRole;
14189
+ const attendeeRoleString = (_a = props.strings) === null || _a === void 0 ? void 0 : _a.attendeeRole;
13885
14190
  /* @conditional-compile-remove(hide-attendee-name) */
13886
14191
  const formatDisplayName = () => {
13887
14192
  if (displayName && attendeeRoleString) {
@@ -13892,7 +14197,7 @@ const _RemoteVideoTile = React.memo((props) => {
13892
14197
  /* @conditional-compile-remove(hide-attendee-name) */
13893
14198
  displayName = formatDisplayName();
13894
14199
  return (React.createElement(react.Stack, { tabIndex: menuKind === 'drawer' ? 0 : undefined, onKeyDown: menuKind === 'drawer' ? onKeyDown : undefined, style: remoteVideoTileWrapperStyle },
13895
- React.createElement(VideoTile, Object.assign({ key: userId, userId: userId, initialsName: (_a = remoteParticipant.displayName) !== null && _a !== void 0 ? _a : '', renderElement: renderVideoStreamElement, displayName: displayName, onRenderPlaceholder: onRenderAvatar, isMuted: remoteParticipant.isMuted,
14200
+ React.createElement(VideoTile, Object.assign({ key: userId, userId: userId, initialsName: (_b = remoteParticipant.displayName) !== null && _b !== void 0 ? _b : '', renderElement: renderVideoStreamElement, displayName: displayName, onRenderPlaceholder: onRenderAvatar, isMuted: remoteParticipant.isMuted,
13896
14201
  /* @conditional-compile-remove(raise-hand) */
13897
14202
  raisedHand: remoteParticipant.raisedHand,
13898
14203
  /* @conditional-compile-remove(reaction) */
@@ -17975,7 +18280,7 @@ const ReactionButton = (props) => {
17975
18280
  const resourceUrl = emojiResource.get(emoji);
17976
18281
  return (React.createElement(react.TooltipHost, { key: index, "data-ui-id": index, hidden: props.disableTooltip, content: emojiButtonTooltip.get(emoji), styles: reactionToolTipHostStyle(), calloutProps: Object.assign({}, calloutProps) },
17977
18282
  React.createElement(react.IconButton, { key: index, onClick: () => {
17978
- props.onReactionClicked(emoji);
18283
+ props.onReactionClick(emoji);
17979
18284
  setIsHoveredMap((prevMap) => {
17980
18285
  return new Map(prevMap).set(emoji, false);
17981
18286
  });
@@ -18920,20 +19225,26 @@ const _TagsSurvey = (props) => {
18920
19225
  const [selectedTextResponse, setSelectedTextResponse] = React.useState({});
18921
19226
  const [checkedTextFields, setCheckedTextFields] = React.useState([]);
18922
19227
  const tags = React.useMemo(() => {
18923
- const tags = [];
18924
- Object.keys(callIssuesToTag).forEach((issueCategory) => {
18925
- Object.keys(callIssuesToTag[issueCategory]).map((issue) => {
18926
- const issueCapitalized = (issue === null || issue === void 0 ? void 0 : issue.charAt(0).toUpperCase()) + (issue === null || issue === void 0 ? void 0 : issue.slice(1));
19228
+ const tags = {
19229
+ overallRating: [],
19230
+ audioRating: [],
19231
+ videoRating: [],
19232
+ screenshareRating: []
19233
+ };
19234
+ getKeys(callIssuesToTag).forEach((issueCategory) => {
19235
+ getKeys(callIssuesToTag[issueCategory]).map((issue) => {
19236
+ const issueCapitalized = ((issue === null || issue === void 0 ? void 0 : issue.charAt(0).toUpperCase()) + (issue === null || issue === void 0 ? void 0 : issue.slice(1)));
19237
+ const issueMessages = callIssuesToTag[issueCategory];
18927
19238
  if (tags[issueCategory]) {
18928
19239
  tags[issueCategory].push({
18929
- message: callIssuesToTag[issueCategory][issue],
19240
+ message: issueMessages[issue],
18930
19241
  issue: issueCapitalized
18931
19242
  });
18932
19243
  }
18933
19244
  else {
18934
19245
  tags[issueCategory] = [
18935
19246
  {
18936
- message: callIssuesToTag[issueCategory][issue],
19247
+ message: issueMessages[issue],
18937
19248
  issue: issueCapitalized
18938
19249
  }
18939
19250
  ];
@@ -18946,11 +19257,13 @@ const _TagsSurvey = (props) => {
18946
19257
  if (checked) {
18947
19258
  if (issue) {
18948
19259
  setSelectedTags((prevState) => {
18949
- if (prevState[issueCategory]) {
18950
- prevState[issueCategory].issues.push(issue);
19260
+ var _a;
19261
+ const existingIssues = (_a = prevState === null || prevState === void 0 ? void 0 : prevState[issueCategory]) === null || _a === void 0 ? void 0 : _a.issues;
19262
+ if (existingIssues) {
19263
+ prevState[issueCategory].issues = [...existingIssues, issue];
18951
19264
  }
18952
19265
  else {
18953
- prevState[issueCategory] = { score: 1, issues: [issue] };
19266
+ prevState[issueCategory] = { issues: [issue] };
18954
19267
  }
18955
19268
  return prevState;
18956
19269
  });
@@ -18966,7 +19279,8 @@ const _TagsSurvey = (props) => {
18966
19279
  else {
18967
19280
  if (issue) {
18968
19281
  setSelectedTags((prevState) => {
18969
- if (prevState[issueCategory]) {
19282
+ var _a;
19283
+ if ((_a = prevState[issueCategory]) === null || _a === void 0 ? void 0 : _a.issues) {
18970
19284
  prevState[issueCategory].issues = prevState[issueCategory].issues.filter(function (value) {
18971
19285
  return value !== issue;
18972
19286
  });
@@ -19010,7 +19324,7 @@ const _TagsSurvey = (props) => {
19010
19324
  return (React.createElement(React.Fragment, null,
19011
19325
  React.createElement(react.Stack, { verticalAlign: "center" },
19012
19326
  React.createElement(react.Text, { className: questionTextStyle$1(theme) }, strings === null || strings === void 0 ? void 0 : strings.tagsSurveyQuestion)),
19013
- React.createElement(react.Pivot, null, Object.keys(tags).map((key, i) => {
19327
+ React.createElement(react.Pivot, null, getKeys(tags).map((key, i) => {
19014
19328
  return (React.createElement(react.PivotItem, { key: `key-${i}`, headerText: categoryHeadings[key], headerButtonProps: {
19015
19329
  'data-order': i,
19016
19330
  'data-title': key
@@ -19765,22 +20079,18 @@ const _CaptionsSettingsModal = (props) => {
19765
20079
  const theme = react.useTheme();
19766
20080
  const [hasSetSpokenLanguage, setHasSetSpokenLanguage] = React.useState(false);
19767
20081
  const [selectedSpokenLanguage, setSelectedSpokenLanguage] = React.useState({
19768
- key: currentSpokenLanguage !== '' ? currentSpokenLanguage : defaultSpokenLanguage,
19769
- text: currentSpokenLanguage !== '' ? currentSpokenLanguage : defaultSpokenLanguage
20082
+ key: currentSpokenLanguage !== null && currentSpokenLanguage !== void 0 ? currentSpokenLanguage : defaultSpokenLanguage,
20083
+ text: currentSpokenLanguage !== null && currentSpokenLanguage !== void 0 ? currentSpokenLanguage : defaultSpokenLanguage
19770
20084
  });
19771
20085
  const [selectedCaptionLanguage, setSelectedCaptionLanguage] = React.useState({
19772
- key: currentCaptionLanguage !== ''
19773
- ? currentCaptionLanguage
19774
- : _spokenLanguageToCaptionLanguage[selectedSpokenLanguage.key],
19775
- text: currentCaptionLanguage !== ''
19776
- ? currentCaptionLanguage
19777
- : _spokenLanguageToCaptionLanguage[selectedSpokenLanguage.key]
20086
+ key: currentCaptionLanguage !== null && currentCaptionLanguage !== void 0 ? currentCaptionLanguage : _spokenLanguageToCaptionLanguage[selectedSpokenLanguage.key],
20087
+ text: currentCaptionLanguage !== null && currentCaptionLanguage !== void 0 ? currentCaptionLanguage : _spokenLanguageToCaptionLanguage[selectedSpokenLanguage.key]
19778
20088
  });
19779
20089
  React.useEffect(() => {
19780
20090
  // set spoken language when start captions with a spoken language specified.
19781
20091
  // this is to fix the bug when a second user starts captions with a new spoken language, captions bot ignore that spoken language
19782
20092
  if (isCaptionsFeatureActive && !hasSetSpokenLanguage) {
19783
- onSetSpokenLanguage(selectedSpokenLanguage.key.toString());
20093
+ onSetSpokenLanguage(selectedSpokenLanguage.key);
19784
20094
  // we only need to call set spoken language once when first starting captions
19785
20095
  setHasSetSpokenLanguage(true);
19786
20096
  }
@@ -19791,8 +20101,8 @@ const _CaptionsSettingsModal = (props) => {
19791
20101
  }
19792
20102
  }, [onDismissCaptionsSettings]);
19793
20103
  const onConfirm = React.useCallback(() => __awaiter$v(void 0, void 0, void 0, function* () {
19794
- const spokenLanguageCode = selectedSpokenLanguage.key.toString();
19795
- const captionLanguageCode = selectedCaptionLanguage.key.toString();
20104
+ const spokenLanguageCode = selectedSpokenLanguage.key;
20105
+ const captionLanguageCode = selectedCaptionLanguage.key;
19796
20106
  if (isCaptionsFeatureActive) {
19797
20107
  onSetSpokenLanguage(spokenLanguageCode);
19798
20108
  onSetCaptionLanguage(captionLanguageCode);
@@ -19848,15 +20158,13 @@ const _CaptionsSettingsModal = (props) => {
19848
20158
  preventDismissOnEvent: _preventDismissOnEvent
19849
20159
  }), []);
19850
20160
  const CaptionsSettingsComponent = React.useCallback(() => {
19851
- const placeholderSpokenLanguage = currentSpokenLanguage !== '' ? currentSpokenLanguage : defaultSpokenLanguage;
19852
- const placeholderCaptionLanguage = currentCaptionLanguage !== ''
19853
- ? currentCaptionLanguage
19854
- : _spokenLanguageToCaptionLanguage[placeholderSpokenLanguage];
20161
+ const placeholderSpokenLanguage = currentSpokenLanguage !== null && currentSpokenLanguage !== void 0 ? currentSpokenLanguage : defaultSpokenLanguage;
20162
+ const placeholderCaptionLanguage = currentCaptionLanguage !== null && currentCaptionLanguage !== void 0 ? currentCaptionLanguage : _spokenLanguageToCaptionLanguage[placeholderSpokenLanguage];
19855
20163
  return (React.createElement(react.Stack, null,
19856
- React.createElement(react.Dropdown, { label: strings === null || strings === void 0 ? void 0 : strings.captionsSettingsSpokenLanguageDropdownLabel, selectedKey: selectedSpokenLanguage ? selectedSpokenLanguage.key : undefined, onChange: onSpokenLanguageChange, calloutProps: calloutProps, placeholder: placeholderSpokenLanguage, options: sortedSpokenLanguageDropdownOptions, styles: dropdownStyles }),
20164
+ React.createElement(react.Dropdown, { label: strings === null || strings === void 0 ? void 0 : strings.captionsSettingsSpokenLanguageDropdownLabel, selectedKey: selectedSpokenLanguage ? selectedSpokenLanguage.key : undefined, onChange: (ev, option) => onSpokenLanguageChange(ev, option), calloutProps: calloutProps, placeholder: placeholderSpokenLanguage, options: sortedSpokenLanguageDropdownOptions, styles: dropdownStyles }),
19857
20165
  React.createElement(react.Text, { className: dropdownInfoTextStyle(theme) }, strings === null || strings === void 0 ? void 0 : strings.captionsSettingsSpokenLanguageDropdownInfoText),
19858
20166
  changeCaptionLanguage && (React.createElement(React.Fragment, null,
19859
- React.createElement(react.Dropdown, { label: strings === null || strings === void 0 ? void 0 : strings.captionsSettingsCaptionLanguageDropdownLabel, selectedKey: selectedCaptionLanguage ? selectedCaptionLanguage.key : undefined, onChange: onCaptionLanguageChange, calloutProps: calloutProps, placeholder: placeholderCaptionLanguage, options: sortedCaptionLanguageDropdownOptions, styles: dropdownStyles }),
20167
+ React.createElement(react.Dropdown, { label: strings === null || strings === void 0 ? void 0 : strings.captionsSettingsCaptionLanguageDropdownLabel, selectedKey: selectedCaptionLanguage ? selectedCaptionLanguage.key : undefined, onChange: (ev, option) => onCaptionLanguageChange(ev, option), calloutProps: calloutProps, placeholder: placeholderCaptionLanguage, options: sortedCaptionLanguageDropdownOptions, styles: dropdownStyles }),
19860
20168
  React.createElement(react.Text, { className: dropdownInfoTextStyle(theme) }, strings === null || strings === void 0 ? void 0 : strings.captionsSettingsCaptionLanguageDropdownInfoText)))));
19861
20169
  }, [
19862
20170
  calloutProps,
@@ -19894,7 +20202,10 @@ const _CaptionsSettingsModal = (props) => {
19894
20202
  */
19895
20203
  const createComponentStrings = (localizedStrings) => {
19896
20204
  const strings = Object.assign({}, en_US$1);
19897
- Object.keys(localizedStrings).forEach((key) => {
20205
+ getKeys(localizedStrings).forEach((key) => {
20206
+ // mark the value as unknown because the type changes based on the key.
20207
+ // this is unsafe at runtime as we could assign the wrong type based on the key here.
20208
+ // but typescript isn't smart enough to know that the key used across each access will result in the same type
19898
20209
  strings[key] = Object.assign(Object.assign({}, strings[key]), localizedStrings[key]);
19899
20210
  });
19900
20211
  return strings;
@@ -20160,7 +20471,7 @@ const memoizedConvertToVideoTileReaction = memoizeOne((reactionState) => {
20160
20471
  return reactionState && reactionState.reactionMessage
20161
20472
  ? {
20162
20473
  reactionType: reactionState.reactionMessage.reactionType,
20163
- receivedAt: reactionState.receivedAt
20474
+ receivedOn: reactionState.receivedOn
20164
20475
  }
20165
20476
  : undefined;
20166
20477
  });
@@ -20186,7 +20497,8 @@ const _dominantSpeakersWithFlatId = (dominantSpeakers) => {
20186
20497
  return (_a = dominantSpeakers === null || dominantSpeakers === void 0 ? void 0 : dominantSpeakers.speakersList) === null || _a === void 0 ? void 0 : _a.map(toFlatCommunicationIdentifier);
20187
20498
  };
20188
20499
  /** @internal */
20189
- const _videoGalleryRemoteParticipantsMemo = (remoteParticipants, isHideAttendeeNamesEnabled, localUserRole) => {
20500
+ const _videoGalleryRemoteParticipantsMemo = (remoteParticipants, isHideAttendeeNamesEnabled,
20501
+ /* @conditional-compile-remove(hide-attendee-name) */ localUserRole) => {
20190
20502
  if (!remoteParticipants) {
20191
20503
  return [];
20192
20504
  }
@@ -20222,7 +20534,7 @@ const memoizedAllConvertRemoteParticipant = memoizeFnAll((userId, isMuted, isSpe
20222
20534
  raisedHand, // temp unknown type to build stable
20223
20535
  /* @conditional-compile-remove(reaction) */
20224
20536
  reaction, // temp unknown type to build stable
20225
- /* @conditional-compile-remove(reaction) */
20537
+ /* @conditional-compile-remove(spotlight) */
20226
20538
  spotlight // temp unknown type to build stable
20227
20539
  ) => {
20228
20540
  return convertRemoteParticipantToVideoGalleryRemoteParticipant(userId, isMuted, isSpeaking, videoStreams, state, displayName,
@@ -20230,7 +20542,7 @@ spotlight // temp unknown type to build stable
20230
20542
  raisedHand,
20231
20543
  /* @conditional-compile-remove(reaction) */
20232
20544
  reaction,
20233
- /* @conditional-compile-remove(reaction) */
20545
+ /* @conditional-compile-remove(spotlight) */
20234
20546
  spotlight);
20235
20547
  });
20236
20548
  /** @private */
@@ -20239,7 +20551,7 @@ const convertRemoteParticipantToVideoGalleryRemoteParticipant = (userId, isMuted
20239
20551
  raisedHand, // temp unknown type to build stable
20240
20552
  /* @conditional-compile-remove(reaction) */
20241
20553
  reaction, // temp unknown type to build stable
20242
- /* @conditional-compile-remove(reaction) */
20554
+ /* @conditional-compile-remove(spotlight) */
20243
20555
  spotlight // temp unknown type to build stable
20244
20556
  ) => {
20245
20557
  const rawVideoStreamsArray = Object.values(videoStreams);
@@ -21981,7 +22293,7 @@ class ResourceDownloadQueue {
21981
22293
  message.resourceCache = {};
21982
22294
  }
21983
22295
  for (const attachment of attachments) {
21984
- if (attachment.previewUrl) {
22296
+ if (attachment.previewUrl && attachment.attachmentType === 'image') {
21985
22297
  const blobUrl = yield operation(attachment.previewUrl, this._credential);
21986
22298
  message.resourceCache[attachment.previewUrl] = blobUrl;
21987
22299
  }
@@ -24851,7 +25163,7 @@ const ChatScreen = (props) => {
24851
25163
  if (e.key === 'Enter') {
24852
25164
  onInlineImageClicked(inlineImage.imgAttrs.id || '', inlineImage.messageId);
24853
25165
  }
24854
- } }, defaultOnRender(inlineImage)));
25166
+ }, style: { cursor: 'pointer' } }, defaultOnRender(inlineImage)));
24855
25167
  }
24856
25168
  };
24857
25169
  /* @conditional-compile-remove(image-overlay) */
@@ -25326,7 +25638,7 @@ const getEndedCallPageProps = (locale, endedCall) => {
25326
25638
  */
25327
25639
  const getCallCompositePage = (call, previousCall, transferCall, unsupportedBrowserInfo) => {
25328
25640
  /* @conditional-compile-remove(unsupported-browser) */
25329
- if (isUnsupportedEnvironment(unsupportedBrowserInfo.environmentInfo, unsupportedBrowserInfo.unsupportedBrowserVersionOptedIn)) {
25641
+ if (isUnsupportedEnvironment(unsupportedBrowserInfo === null || unsupportedBrowserInfo === void 0 ? void 0 : unsupportedBrowserInfo.environmentInfo, unsupportedBrowserInfo === null || unsupportedBrowserInfo === void 0 ? void 0 : unsupportedBrowserInfo.unsupportedBrowserVersionOptedIn)) {
25330
25642
  return 'unsupportedEnvironment';
25331
25643
  }
25332
25644
  /* @conditional-compile-remove(call-transfer) */
@@ -25624,8 +25936,8 @@ const createCompositeHandlers = memoizeOne((adapter) => {
25624
25936
  : yield adapter.raiseHand();
25625
25937
  }),
25626
25938
  /* @conditional-compile-remove(reaction) */
25627
- onReactionClicked: (reaction) => __awaiter$j(void 0, void 0, void 0, function* () {
25628
- yield adapter.onReactionClicked(reaction);
25939
+ onReactionClick: (reaction) => __awaiter$j(void 0, void 0, void 0, function* () {
25940
+ yield adapter.onReactionClick(reaction);
25629
25941
  }),
25630
25942
  onSelectCamera: (deviceInfo, options) => __awaiter$j(void 0, void 0, void 0, function* () {
25631
25943
  yield adapter.setCamera(deviceInfo, options);
@@ -27926,7 +28238,7 @@ const inferCallWithChatControlOptions = (callWithChatControls) => {
27926
28238
  };
27927
28239
  /** @private */
27928
28240
  const MoreDrawer = (props) => {
27929
- var _a, _b, _c, _d, _e;
28241
+ var _a, _b, _c, _d, _e, _f, _g;
27930
28242
  /* @conditional-compile-remove(close-captions) */
27931
28243
  const theme = react.useTheme();
27932
28244
  /* @conditional-compile-remove(rooms) */
@@ -28158,11 +28470,9 @@ const MoreDrawer = (props) => {
28158
28470
  /* @conditional-compile-remove(close-captions) */
28159
28471
  const [isCaptionLanguageDrawerOpen, setIsCaptionLanguageDrawerOpen] = React.useState(false);
28160
28472
  /* @conditional-compile-remove(close-captions) */
28161
- const [currentSpokenLanguage, setCurrentSpokenLanguage] = React.useState(captionSettingsProp.currentSpokenLanguage !== '' ? captionSettingsProp.currentSpokenLanguage : 'en-us');
28473
+ const [currentSpokenLanguage, setCurrentSpokenLanguage] = React.useState((_f = captionSettingsProp.currentSpokenLanguage) !== null && _f !== void 0 ? _f : 'en-us');
28162
28474
  /* @conditional-compile-remove(close-captions) */
28163
- const [currentCaptionLanguage, setCurrentCaptionLanguage] = React.useState(captionSettingsProp.currentCaptionLanguage !== ''
28164
- ? captionSettingsProp.currentCaptionLanguage
28165
- : _spokenLanguageToCaptionLanguage[currentSpokenLanguage]);
28475
+ const [currentCaptionLanguage, setCurrentCaptionLanguage] = React.useState((_g = captionSettingsProp.currentCaptionLanguage) !== null && _g !== void 0 ? _g : _spokenLanguageToCaptionLanguage[currentSpokenLanguage]);
28166
28476
  /* @conditional-compile-remove(close-captions) */
28167
28477
  const onToggleChange = React.useCallback(() => __awaiter$g(void 0, void 0, void 0, function* () {
28168
28478
  if (!captionSettingsProp.isCaptionsFeatureActive) {
@@ -29505,10 +29815,10 @@ const LocalAndRemotePIP = (props) => {
29505
29815
  }), [ariaLabel]);
29506
29816
  // If there are no remote participants, show the local participant as the primary tile
29507
29817
  const primaryTileProps = React.useMemo(() => ({
29508
- children: remoteVideoTileProps ? (React.createElement(_RemoteVideoTile, Object.assign({}, remoteVideoTileProps))) : (React.createElement(_LocalVideoTile, Object.assign({}, localVideoTileProps))),
29818
+ children: remoteVideoTileProps ? (React.createElement(_RemoteVideoTile, Object.assign({}, remoteVideoTileProps, { strings: locale.component.strings.videoGallery }))) : (React.createElement(_LocalVideoTile, Object.assign({}, localVideoTileProps))),
29509
29819
  // TODO: when the calling SDK provides height/width stream information - update this to reflect the stream orientation.
29510
29820
  orientation: 'portrait'
29511
- }), [localVideoTileProps, remoteVideoTileProps]);
29821
+ }), [localVideoTileProps, remoteVideoTileProps, locale.component.strings.videoGallery]);
29512
29822
  // If we are showing the local participant as the primary tile, show nothing for the secondary tile
29513
29823
  const secondaryTileProps = React.useMemo(() => remoteVideoTileProps
29514
29824
  ? {
@@ -29691,6 +30001,7 @@ const ModalLocalAndRemotePIP = (props) => {
29691
30001
  const adapter = useAdapter();
29692
30002
  /* @conditional-compile-remove(rooms) */
29693
30003
  const role = (_a = adapter.getState().call) === null || _a === void 0 ? void 0 : _a.role;
30004
+ const locale = useLocale();
29694
30005
  const pictureInPictureProps = useSelector$1(localAndRemotePIPSelector);
29695
30006
  const [touchStartTouches, setTouchStartTouches] = React.useState(null);
29696
30007
  const onTouchEnd = React.useCallback((event) => {
@@ -29719,7 +30030,7 @@ const ModalLocalAndRemotePIP = (props) => {
29719
30030
  /* @conditional-compile-remove(rooms) */
29720
30031
  if (role === 'Consumer' && ((_a = pictureInPictureProps.dominantRemoteParticipant) === null || _a === void 0 ? void 0 : _a.userId)) {
29721
30032
  return (React.createElement(react.Stack, { tabIndex: 0, "aria-label": (_c = (_b = props.strings) === null || _b === void 0 ? void 0 : _b.dismissModalAriaLabel) !== null && _c !== void 0 ? _c : '', onKeyDown: onKeyDown },
29722
- React.createElement(_RemoteVideoTile, Object.assign({}, pictureInPictureProps.dominantRemoteParticipant, { remoteParticipant: pictureInPictureProps.dominantRemoteParticipant }))));
30033
+ React.createElement(_RemoteVideoTile, Object.assign({ strings: locale.component.strings.videoGallery }, pictureInPictureProps.dominantRemoteParticipant, { remoteParticipant: pictureInPictureProps.dominantRemoteParticipant }))));
29723
30034
  }
29724
30035
  return (React.createElement(react.Stack, { tabIndex: 0, "aria-label": (_e = (_d = props.strings) === null || _d === void 0 ? void 0 : _d.dismissModalAriaLabel) !== null && _e !== void 0 ? _e : '', onKeyDown: onKeyDown },
29725
30036
  React.createElement(LocalAndRemotePIP, Object.assign({}, pictureInPictureProps, pictureInPictureHandlers))));
@@ -29728,7 +30039,8 @@ const ModalLocalAndRemotePIP = (props) => {
29728
30039
  onKeyDown,
29729
30040
  pictureInPictureProps,
29730
30041
  props,
29731
- pictureInPictureHandlers
30042
+ pictureInPictureHandlers,
30043
+ locale.component.strings.videoGallery
29732
30044
  ]);
29733
30045
  /* @conditional-compile-remove(rooms) */
29734
30046
  if (role === 'Consumer' && !pictureInPictureProps.dominantRemoteParticipant) {
@@ -33830,7 +34142,7 @@ class AzureCommunicationCallAdapter {
33830
34142
  /* @conditional-compile-remove(raise-hand) */
33831
34143
  this.raiseHand.bind(this);
33832
34144
  /* @conditional-compile-remove(reaction) */
33833
- this.onReactionClicked.bind(this);
34145
+ this.onReactionClick.bind(this);
33834
34146
  this.lowerHand.bind(this);
33835
34147
  this.removeParticipant.bind(this);
33836
34148
  this.createStreamView.bind(this);
@@ -34024,6 +34336,10 @@ class AzureCommunicationCallAdapter {
34024
34336
  }
34025
34337
  leaveCall(forEveryone) {
34026
34338
  return __awaiter$5(this, void 0, void 0, function* () {
34339
+ if (this.getState().page === 'transferring') {
34340
+ const transferCall = this.callAgent.calls.filter((call) => { var _a; return call.id === ((_a = this.getState().acceptedTransferCallState) === null || _a === void 0 ? void 0 : _a.id); })[0];
34341
+ transferCall === null || transferCall === void 0 ? void 0 : transferCall.hangUp();
34342
+ }
34027
34343
  yield this.handlers.onHangUp(forEveryone);
34028
34344
  this.unsubscribeCallEvents();
34029
34345
  this.handlers = createHandlers(this.callClient, this.callAgent, this.deviceManager, this.call,
@@ -34152,10 +34468,10 @@ class AzureCommunicationCallAdapter {
34152
34468
  });
34153
34469
  }
34154
34470
  /* @conditional-compile-remove(reaction) */
34155
- onReactionClicked(reaction) {
34471
+ onReactionClick(reaction) {
34156
34472
  return __awaiter$5(this, void 0, void 0, function* () {
34157
34473
  return yield this.asyncTeeErrorToEventEmitter(() => __awaiter$5(this, void 0, void 0, function* () {
34158
- yield this.handlers.onReactionClicked(reaction);
34474
+ yield this.handlers.onReactionClick(reaction);
34159
34475
  }));
34160
34476
  });
34161
34477
  }
@@ -34998,7 +35314,7 @@ class CallWithChatBackedCallAdapter {
34998
35314
  /* @conditional-compile-remove(raise-hand) */
34999
35315
  this.lowerHand = () => __awaiter$4(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.lowerHand(); });
35000
35316
  /* @conditional-compile-remove(reaction) */
35001
- this.onReactionClicked = (reaction) => __awaiter$4(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.onReactionClicked(reaction); });
35317
+ this.onReactionClick = (reaction) => __awaiter$4(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.onReactionClick(reaction); });
35002
35318
  this.removeParticipant = (userId) => __awaiter$4(this, void 0, void 0, function* () {
35003
35319
  let participant = userId;
35004
35320
  /* @conditional-compile-remove(PSTN-calls) */
@@ -35864,7 +36180,7 @@ class AzureCommunicationCallWithChatAdapter {
35864
36180
  /* @conditional-compile-remove(raise-hand) */
35865
36181
  this.lowerHand.bind(this);
35866
36182
  /* @conditional-compile-remove(reaction) */
35867
- this.onReactionClicked.bind(this);
36183
+ this.onReactionClick.bind(this);
35868
36184
  this.removeParticipant.bind(this);
35869
36185
  this.createStreamView.bind(this);
35870
36186
  this.disposeStreamView.bind(this);
@@ -36072,9 +36388,9 @@ class AzureCommunicationCallWithChatAdapter {
36072
36388
  });
36073
36389
  }
36074
36390
  /* @conditional-compile-remove(reaction) */
36075
- onReactionClicked(reaction) {
36391
+ onReactionClick(reaction) {
36076
36392
  return __awaiter$2(this, void 0, void 0, function* () {
36077
- yield this.callAdapter.onReactionClicked(reaction);
36393
+ yield this.callAdapter.onReactionClick(reaction);
36078
36394
  });
36079
36395
  }
36080
36396
  /** Create a stream view for a remote participants video feed. */