@azure/communication-react 1.14.1-alpha-202403270012 → 1.14.1-alpha-202403290012

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 (155) hide show
  1. package/dist/communication-react.d.ts +203 -63
  2. package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-Yty3fOoA.js → RichTextSendBoxWrapper-CH6WvEGZ.js} +7 -4
  3. package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-Yty3fOoA.js.map → RichTextSendBoxWrapper-CH6WvEGZ.js.map} +1 -1
  4. package/dist/dist-cjs/communication-react/{index-BEomNZbT.js → index-qxnuqL7s.js} +1017 -321
  5. package/dist/dist-cjs/communication-react/index-qxnuqL7s.js.map +1 -0
  6. package/dist/dist-cjs/communication-react/index.js +6 -3
  7. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  8. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  9. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  10. package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +5 -0
  11. package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
  12. package/dist/dist-esm/calling-stateful-client/src/CallContext.js +2 -0
  13. package/dist/dist-esm/calling-stateful-client/src/CallContext.js.map +1 -1
  14. package/dist/dist-esm/calling-stateful-client/src/Converter.js +6 -2
  15. package/dist/dist-esm/calling-stateful-client/src/Converter.js.map +1 -1
  16. package/dist/dist-esm/chat-component-bindings/src/messageThreadSelector.js +1 -2
  17. package/dist/dist-esm/chat-component-bindings/src/messageThreadSelector.js.map +1 -1
  18. package/dist/dist-esm/communication-react/src/index.d.ts +1 -1
  19. package/dist/dist-esm/communication-react/src/index.js.map +1 -1
  20. package/dist/dist-esm/react-components/src/components/AttachmentCard.d.ts +11 -15
  21. package/dist/dist-esm/react-components/src/components/AttachmentCard.js +25 -41
  22. package/dist/dist-esm/react-components/src/components/AttachmentCard.js.map +1 -1
  23. package/dist/dist-esm/react-components/src/components/AttachmentDownloadCards.d.ts +18 -11
  24. package/dist/dist-esm/react-components/src/components/AttachmentDownloadCards.js +74 -62
  25. package/dist/dist-esm/react-components/src/components/AttachmentDownloadCards.js.map +1 -1
  26. package/dist/dist-esm/react-components/src/components/AttachmentUploadCards.js +37 -4
  27. package/dist/dist-esm/react-components/src/components/AttachmentUploadCards.js.map +1 -1
  28. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentWrapper.d.ts +6 -3
  29. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentWrapper.js.map +1 -1
  30. package/dist/dist-esm/react-components/src/components/ChatMessage/MessageComponents/ChatMessageComponentAsMessageBubble.d.ts +5 -5
  31. package/dist/dist-esm/react-components/src/components/ChatMessage/MessageComponents/ChatMessageComponentAsMessageBubble.js +7 -7
  32. package/dist/dist-esm/react-components/src/components/ChatMessage/MessageComponents/ChatMessageComponentAsMessageBubble.js.map +1 -1
  33. package/dist/dist-esm/react-components/src/components/ChatMessage/MessageComponents/FluentChatMessageComponent.js +13 -18
  34. package/dist/dist-esm/react-components/src/components/ChatMessage/MessageComponents/FluentChatMessageComponent.js.map +1 -1
  35. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.d.ts +9 -9
  36. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.js.map +1 -1
  37. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponentAsMessageBubble.d.ts +9 -9
  38. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponentAsMessageBubble.js +10 -10
  39. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponentAsMessageBubble.js.map +1 -1
  40. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/FluentChatMyMessageComponent.js +12 -10
  41. package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/FluentChatMyMessageComponent.js.map +1 -1
  42. package/dist/dist-esm/react-components/src/components/Dialpad/Dialpad.d.ts +4 -0
  43. package/dist/dist-esm/react-components/src/components/Dialpad/Dialpad.js +2 -2
  44. package/dist/dist-esm/react-components/src/components/Dialpad/Dialpad.js.map +1 -1
  45. package/dist/dist-esm/react-components/src/components/MessageStatusIcon.js +1 -1
  46. package/dist/dist-esm/react-components/src/components/MessageStatusIcon.js.map +1 -1
  47. package/dist/dist-esm/react-components/src/components/MessageThread.d.ts +10 -9
  48. package/dist/dist-esm/react-components/src/components/MessageThread.js +17 -13
  49. package/dist/dist-esm/react-components/src/components/MessageThread.js.map +1 -1
  50. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/RichTextRibbonButtons.d.ts +7 -0
  51. package/dist/dist-esm/react-components/src/components/RichTextEditor/{RichTextRibbonButtons.js → Buttons/RichTextRibbonButtons.js} +16 -20
  52. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/RichTextRibbonButtons.js.map +1 -0
  53. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/RichTextInsertTableButton.d.ts +7 -0
  54. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/RichTextInsertTableButton.js +56 -0
  55. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/RichTextInsertTableButton.js.map +1 -0
  56. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/RichTextInsertTablePane.d.ts +16 -0
  57. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/RichTextInsertTablePane.js +62 -0
  58. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/RichTextInsertTablePane.js.map +1 -0
  59. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/RichTextTableContextMenu.d.ts +8 -0
  60. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/RichTextTableContextMenu.js +57 -0
  61. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/RichTextTableContextMenu.js.map +1 -0
  62. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/insertTableAction.d.ts +9 -0
  63. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/insertTableAction.js +34 -0
  64. package/dist/dist-esm/react-components/src/components/RichTextEditor/Buttons/Table/insertTableAction.js.map +1 -0
  65. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextEditor.js +23 -11
  66. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextEditor.js.map +1 -1
  67. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextSendBox.d.ts +44 -0
  68. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextSendBox.js +16 -6
  69. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextSendBox.js.map +1 -1
  70. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js +2 -2
  71. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js.map +1 -1
  72. package/dist/dist-esm/react-components/src/components/VideoGallery/LargeGalleryLayout.js +5 -3
  73. package/dist/dist-esm/react-components/src/components/VideoGallery/LargeGalleryLayout.js.map +1 -1
  74. package/dist/dist-esm/react-components/src/components/index.d.ts +2 -2
  75. package/dist/dist-esm/react-components/src/components/index.js.map +1 -1
  76. package/dist/dist-esm/react-components/src/components/styles/AttachmentCard.styles.d.ts +1 -1
  77. package/dist/dist-esm/react-components/src/components/styles/AttachmentCard.styles.js +1 -1
  78. package/dist/dist-esm/react-components/src/components/styles/AttachmentCard.styles.js.map +1 -1
  79. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.d.ts +25 -1
  80. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.js +132 -2
  81. package/dist/dist-esm/react-components/src/components/styles/RichTextEditor.styles.js.map +1 -1
  82. package/dist/dist-esm/react-components/src/components/utils/ChatMessageComponentUtils.d.ts +10 -2
  83. package/dist/dist-esm/react-components/src/components/utils/ChatMessageComponentUtils.js +20 -14
  84. package/dist/dist-esm/react-components/src/components/utils/ChatMessageComponentUtils.js.map +1 -1
  85. package/dist/dist-esm/react-components/src/components/utils/RichTextEditorStringsUtils.d.ts +15 -0
  86. package/dist/dist-esm/react-components/src/components/utils/RichTextEditorStringsUtils.js +39 -0
  87. package/dist/dist-esm/react-components/src/components/utils/RichTextEditorStringsUtils.js.map +1 -0
  88. package/dist/dist-esm/react-components/src/components/utils/RichTextTableUtils.d.ts +22 -0
  89. package/dist/dist-esm/react-components/src/components/utils/RichTextTableUtils.js +29 -0
  90. package/dist/dist-esm/react-components/src/components/utils/RichTextTableUtils.js.map +1 -0
  91. package/dist/dist-esm/react-components/src/localization/locales/en-US/strings.json +13 -1
  92. package/dist/dist-esm/react-components/src/theming/icons.d.ts +7 -2
  93. package/dist/dist-esm/react-components/src/theming/icons.js +15 -5
  94. package/dist/dist-esm/react-components/src/theming/icons.js.map +1 -1
  95. package/dist/dist-esm/react-components/src/types/Attachment.d.ts +97 -37
  96. package/dist/dist-esm/react-components/src/types/Attachment.js.map +1 -1
  97. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js +2 -1
  98. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js.map +1 -1
  99. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.d.ts +4 -0
  100. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.js.map +1 -1
  101. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.d.ts +2 -1
  102. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +22 -4
  103. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
  104. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalDeviceSettings.js +3 -3
  105. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalDeviceSettings.js.map +1 -1
  106. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalPreview.js +2 -2
  107. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalPreview.js.map +1 -1
  108. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.d.ts +1 -0
  109. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js +2 -2
  110. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js.map +1 -1
  111. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/DtmfDialpadPage.d.ts +1 -0
  112. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/DtmfDialpadPage.js +2 -2
  113. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/DtmfDialpadPage.js.map +1 -1
  114. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallConfiguration.styles.d.ts +1 -1
  115. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallConfiguration.styles.js +32 -17
  116. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallConfiguration.styles.js.map +1 -1
  117. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/LocalDeviceSettings.styles.d.ts +5 -1
  118. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/LocalDeviceSettings.styles.js +12 -0
  119. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/LocalDeviceSettings.styles.js.map +1 -1
  120. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/LocalPreview.styles.d.ts +2 -14
  121. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/LocalPreview.styles.js +14 -10
  122. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/LocalPreview.styles.js.map +1 -1
  123. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.js +13 -1
  124. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.js.map +1 -1
  125. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.d.ts +53 -3
  126. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js +196 -57
  127. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js.map +1 -1
  128. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.d.ts +2 -2
  129. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.js +4 -5
  130. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.js.map +1 -1
  131. package/dist/dist-esm/react-composites/src/composites/ChatComposite/AttachmentDownloadErrorBar.d.ts +15 -0
  132. package/dist/dist-esm/react-composites/src/composites/ChatComposite/{FileDownloadErrorBar.js → AttachmentDownloadErrorBar.js} +5 -5
  133. package/dist/dist-esm/react-composites/src/composites/ChatComposite/AttachmentDownloadErrorBar.js.map +1 -0
  134. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.d.ts +4 -5
  135. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js +10 -7
  136. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js.map +1 -1
  137. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.d.ts +6 -0
  138. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.js +22 -0
  139. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.js.map +1 -1
  140. package/dist/dist-esm/react-composites/src/composites/ChatComposite/file-sharing/FileUploadButton.js +1 -1
  141. package/dist/dist-esm/react-composites/src/composites/ChatComposite/file-sharing/FileUploadButton.js.map +1 -1
  142. package/dist/dist-esm/react-composites/src/composites/ChatComposite/file-sharing/index.d.ts +2 -0
  143. package/dist/dist-esm/react-composites/src/composites/ChatComposite/file-sharing/index.js.map +1 -1
  144. package/dist/dist-esm/react-composites/src/composites/ChatComposite/index.d.ts +1 -1
  145. package/dist/dist-esm/react-composites/src/composites/ChatComposite/index.js.map +1 -1
  146. package/dist/dist-esm/react-composites/src/composites/common/PeoplePaneContent.js +11 -2
  147. package/dist/dist-esm/react-composites/src/composites/common/PeoplePaneContent.js.map +1 -1
  148. package/dist/dist-esm/react-composites/src/composites/common/icons.d.ts +7 -2
  149. package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +2 -1
  150. package/package.json +2 -1
  151. package/dist/dist-cjs/communication-react/index-BEomNZbT.js.map +0 -1
  152. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextRibbonButtons.d.ts +0 -12
  153. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextRibbonButtons.js.map +0 -1
  154. package/dist/dist-esm/react-composites/src/composites/ChatComposite/FileDownloadErrorBar.d.ts +0 -15
  155. package/dist/dist-esm/react-composites/src/composites/ChatComposite/FileDownloadErrorBar.js.map +0 -1
@@ -18,6 +18,9 @@ var react$1 = require('@griffel/react');
18
18
  var roosterjsEditorPlugins = require('roosterjs-editor-plugins');
19
19
  var roosterjsEditorCore = require('roosterjs-editor-core');
20
20
  var roosterjsReact = require('roosterjs-react');
21
+ var roosterjsEditorDom = require('roosterjs-editor-dom');
22
+ var roosterjsEditorTypesCompatible = require('roosterjs-editor-types-compatible');
23
+ var roosterjsEditorApi = require('roosterjs-editor-api');
21
24
  var reactChat = require('@fluentui-contrib/react-chat');
22
25
  var uuid = require('uuid');
23
26
  var parse = require('html-react-parser');
@@ -173,7 +176,7 @@ function getDefaultExportFromCjs (x) {
173
176
  // Copyright (c) Microsoft Corporation.
174
177
  // Licensed under the MIT License.
175
178
  // GENERATED FILE. DO NOT EDIT MANUALLY.
176
- var telemetryVersion = '1.14.1-alpha-202403270012';
179
+ var telemetryVersion = '1.14.1-alpha-202403290012';
177
180
 
178
181
 
179
182
  var telemetryVersion$1 = /*@__PURE__*/getDefaultExportFromCjs(telemetryVersion);
@@ -1841,7 +1844,9 @@ function convertSdkCallToDeclarativeCall(call) {
1841
1844
  },
1842
1845
  /* @conditional-compile-remove(hide-attendee-name) */
1843
1846
  // TODO: Replace this once the SDK supports hide attendee name
1844
- hideAttendeeNames: false
1847
+ hideAttendeeNames: false,
1848
+ /* @conditional-compile-remove(meeting-id) */
1849
+ info: _isACSCall(call) ? call.info : _isTeamsCall(call) ? call.info : undefined
1845
1850
  };
1846
1851
  }
1847
1852
  /**
@@ -2024,6 +2029,8 @@ let CallContext$2 = class CallContext {
2024
2029
  existingCall.captionsFeature.currentSpokenLanguage = call.captionsFeature.currentSpokenLanguage;
2025
2030
  /* @conditional-compile-remove(close-captions) */
2026
2031
  existingCall.captionsFeature.currentCaptionLanguage = call.captionsFeature.currentCaptionLanguage;
2032
+ /* @conditional-compile-remove(meeting-id) */
2033
+ existingCall.info = call.info;
2027
2034
  }
2028
2035
  else {
2029
2036
  draft.calls[latestCallId] = call;
@@ -5624,7 +5631,7 @@ const typingIndicatorStringStyle = react.mergeStyles({
5624
5631
  wordBreak: 'break-word'
5625
5632
  });
5626
5633
 
5627
- 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",attachmentUploadsPendingError:"Uploading... Please wait.",removeAttachment:"Remove file",uploading:"Uploading",uploadCompleted:"Upload completed"};var richTextSendBox$k={placeholderText:"Enter a message",textTooLong:"Your message length is over the maximum limit.",sendButtonAriaLabel:"Send message",attachmentUploadsPendingError:"Uploading... Please wait.",removeAttachment:"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",richTextFormatButtonTooltip:"Format"};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",ariaLabel:"React Button, Send a reaction",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",downloadAttachment:"Download file",blockedWarningText:"This message was deleted due to organizational policy.",blockedWarningLinkText:"Details",attachmentCardGroupMessage:"The message has {attachmentCount} 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$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};
5634
+ 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",attachmentUploadsPendingError:"Uploading... Please wait.",removeAttachment:"Remove file",uploading:"Uploading",uploadCompleted:"Upload completed"};var richTextSendBox$k={placeholderText:"Enter a message",textTooLong:"Your message length is over the maximum limit.",sendButtonAriaLabel:"Send message",attachmentUploadsPendingError:"Uploading... Please wait.",removeAttachment:"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",insertTableTooltip:"Insert table",richTextFormatButtonTooltip:"Format",insertRowOrColumnMenu:"Insert",insertTableMenuTitle:"Insert {column} x {row} table",insertRowAboveMenu:"Insert above",insertRowBelowMenu:"Insert below",insertColumnLeftMenu:"Insert left",insertColumnRightMenu:"Insert right",deleteRowOrColumnMenu:"Delete",deleteColumnMenu:"Delete column",deleteRowMenu:"Delete row",deleteTableMenu:"Delete table"};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",ariaLabel:"React Button, Send a reaction",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",downloadAttachment:"Download file",openAttachment:"Open file",blockedWarningText:"This message was deleted due to organizational policy.",blockedWarningLinkText:"Details",attachmentCardGroupMessage:"The message has {attachmentCount} 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$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};
5628
5635
 
5629
5636
  // Copyright (c) Microsoft Corporation.
5630
5637
  // Licensed under the MIT License.
@@ -6701,9 +6708,11 @@ const DEFAULT_COMPONENT_ICONS = {
6701
6708
  /* @conditional-compile-remove(reaction) */
6702
6709
  ReactionButtonIcon: React.createElement(reactIcons.Emoji20Regular, null),
6703
6710
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
6704
- CancelFileUpload: React.createElement(reactIcons.Dismiss16Regular, null),
6711
+ CancelAttachmentUpload: React.createElement(reactIcons.Dismiss16Regular, null),
6705
6712
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
6706
- DownloadFile: React.createElement(reactIcons.ArrowDownload16Regular, null),
6713
+ DownloadAttachment: React.createElement(reactIcons.ArrowDownload20Regular, null),
6714
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
6715
+ OpenAttachment: React.createElement(reactIcons.Open20Regular, null),
6707
6716
  /* @conditional-compile-remove(data-loss-prevention) */
6708
6717
  DataLossPreventionProhibited: React.createElement(DataLossPreventionProhibited16Regular, null),
6709
6718
  EditBoxCancel: React.createElement(reactIcons.Dismiss20Regular, null),
@@ -6820,7 +6829,15 @@ const DEFAULT_COMPONENT_ICONS = {
6820
6829
  /* @conditional-compile-remove(rich-text-editor) */
6821
6830
  RichTextEditorButtonIcon: React.createElement(reactIcons.TextEditStyle20Regular, null),
6822
6831
  /* @conditional-compile-remove(rich-text-editor) */
6823
- RichTextEditorButtonIconFilled: React.createElement(reactIcons.TextEditStyle20Filled, null)
6832
+ RichTextEditorButtonIconFilled: React.createElement(reactIcons.TextEditStyle20Filled, null),
6833
+ /* @conditional-compile-remove(rich-text-editor) */
6834
+ RichTextInsertTableRegularIcon: React.createElement(reactIcons.Table20Regular, null),
6835
+ /* @conditional-compile-remove(rich-text-editor) */
6836
+ RichTextInsertTableFilledIcon: React.createElement(reactIcons.Table20Filled, null),
6837
+ /* @conditional-compile-remove(rich-text-editor) */
6838
+ RichTextTableInsertMenuIcon: React.createElement(reactIcons.TableAdd20Regular, null),
6839
+ /* @conditional-compile-remove(rich-text-editor) */
6840
+ RichTextTableDeleteMenuIcon: React.createElement(reactIcons.TableDismiss20Regular, null)
6824
6841
  };
6825
6842
 
6826
6843
  // Copyright (c) Microsoft Corporation.
@@ -8774,7 +8791,7 @@ const useAttachmentCardStyles = reactComponents.makeStyles({
8774
8791
  /**
8775
8792
  * @private
8776
8793
  */
8777
- const fileNameContainerClassName = react.mergeStyles({
8794
+ const attachmentNameContainerClassName = react.mergeStyles({
8778
8795
  marginTop: _pxToRem(5),
8779
8796
  width: '5.75rem',
8780
8797
  overflow: 'hidden',
@@ -8786,6 +8803,15 @@ const fileNameContainerClassName = react.mergeStyles({
8786
8803
 
8787
8804
  // Copyright (c) Microsoft Corporation.
8788
8805
  // Licensed under the MIT License.
8806
+ var __awaiter$C = (window && window.__awaiter) || function (thisArg, _arguments, P, generator) {
8807
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8808
+ return new (P || (P = Promise))(function (resolve, reject) {
8809
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8810
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8811
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8812
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8813
+ });
8814
+ };
8789
8815
  /**
8790
8816
  * @internal
8791
8817
  * A component for displaying an attachment card with attachment icon and progress bar.
@@ -8794,36 +8820,8 @@ const fileNameContainerClassName = react.mergeStyles({
8794
8820
  */
8795
8821
  const _AttachmentCard = (props) => {
8796
8822
  var _a, _b, _c, _d;
8797
- const { attachmentName, attachmentExtension, progress, actionIcon, actionHandler } = props;
8823
+ const { attachment, progress, menuActions, onActionHandlerFailed } = props;
8798
8824
  const attachmentCardStyles = useAttachmentCardStyles();
8799
- // default/placeholder before actual code implemented
8800
- const menuActions = React.useMemo(() => {
8801
- return [
8802
- {
8803
- name: actionIcon && (actionIcon === null || actionIcon === void 0 ? void 0 : actionIcon.props.ariaLabel),
8804
- icon: actionIcon !== null && actionIcon !== void 0 ? actionIcon : React.createElement(React.Fragment, null),
8805
- onClick: (attachment) => {
8806
- if (attachment) {
8807
- actionHandler === null || actionHandler === void 0 ? void 0 : actionHandler();
8808
- }
8809
- }
8810
- }
8811
- ];
8812
- }, [actionIcon, actionHandler]);
8813
- // placeholder before refactoring the props
8814
- const attachment = React.useMemo(() => {
8815
- return {
8816
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
8817
- id: 'attachmentId',
8818
- extension: attachmentExtension,
8819
- name: attachmentName,
8820
- url: 'https://localhost' // placeholder not used
8821
- };
8822
- }, [attachmentExtension, attachmentName]);
8823
- // placeholder before refactoring the props
8824
- const onDownloadErrorMessage = React.useCallback((errorMessage) => {
8825
- console.log(errorMessage);
8826
- }, []);
8827
8825
  const isUploadComplete = React.useMemo(() => {
8828
8826
  return progress !== undefined && progress > 0 && progress < 1;
8829
8827
  }, [progress]);
@@ -8834,24 +8832,27 @@ const _AttachmentCard = (props) => {
8834
8832
  const showProgressIndicator = progress !== undefined && progress > 0 && progress < 1;
8835
8833
  React.useEffect(() => {
8836
8834
  if (showProgressIndicator) {
8837
- setAnnouncerString(`${uploadStartedString} ${attachmentName}`);
8835
+ setAnnouncerString(`${uploadStartedString} ${attachment.name}`);
8838
8836
  }
8839
8837
  else if (progress === 1) {
8840
- setAnnouncerString(`${attachmentName} ${uploadCompletedString}`);
8838
+ setAnnouncerString(`${attachment.name} ${uploadCompletedString}`);
8841
8839
  }
8842
8840
  else {
8843
8841
  setAnnouncerString(undefined);
8844
8842
  }
8845
- }, [progress, showProgressIndicator, attachmentName, uploadStartedString, uploadCompletedString]);
8843
+ }, [progress, showProgressIndicator, attachment.name, uploadStartedString, uploadCompletedString]);
8846
8844
  return (React.createElement("div", { "data-is-focusable": true },
8847
8845
  React.createElement(Announcer$1, { announcementString: announcerString, ariaLive: 'polite' }),
8848
8846
  React.createElement(reactComponents.Card, { className: attachmentCardStyles.root, size: "small", role: "listitem" },
8849
- React.createElement(reactComponents.CardHeader, { image: React.createElement(react.Icon, { "data-ui-id": 'filetype-icon', iconName: reactFileTypeIcons.getFileTypeIconProps({
8850
- extension: attachmentExtension,
8847
+ React.createElement(reactComponents.CardHeader, { image: React.createElement(react.Icon, { "data-ui-id": 'attachmenttype-icon', iconName: reactFileTypeIcons.getFileTypeIconProps({
8848
+ extension: React.useMemo(() => {
8849
+ var _a, _b;
8850
+ return (_b = (_a = attachment.extension) !== null && _a !== void 0 ? _a : attachment.name.split('.').pop()) !== null && _b !== void 0 ? _b : '';
8851
+ }, [attachment]),
8851
8852
  size: 24,
8852
8853
  imageFileType: 'svg'
8853
- }).iconName }), header: React.createElement("div", { className: fileNameContainerClassName },
8854
- React.createElement(reactComponents.Text, { title: attachmentName }, attachmentName)), action: getMenuItems(menuActions, attachment, onDownloadErrorMessage) })),
8854
+ }).iconName }), header: React.createElement("div", { className: attachmentNameContainerClassName },
8855
+ React.createElement(reactComponents.Text, { title: attachment.name }, attachment.name)), action: getMenuItems(menuActions, attachment, onActionHandlerFailed) })),
8855
8856
  isUploadComplete ? (React.createElement(reactComponents.CardFooter, null,
8856
8857
  React.createElement(reactComponents.ProgressBar, { thickness: "medium", value: progress, shape: "rounded" }))) : (React.createElement(React.Fragment, null, " "))));
8857
8858
  };
@@ -8871,14 +8872,14 @@ const getMenuItems = (menuActions, attachment, handleOnClickError) => {
8871
8872
  React.createElement(reactComponents.MenuTrigger, null,
8872
8873
  React.createElement(reactComponents.ToolbarButton, { "aria-label": "More", icon: React.createElement(reactIcons.MoreHorizontal24Filled, null) })),
8873
8874
  React.createElement(reactComponents.MenuPopover, null,
8874
- React.createElement(reactComponents.MenuList, null, menuActions.map((menuItem, index) => (React.createElement(reactComponents.MenuItem, { key: index, icon: menuItem.icon, onClick: () => {
8875
+ React.createElement(reactComponents.MenuList, null, menuActions.map((menuItem, index) => (React.createElement(reactComponents.MenuItem, { key: index, icon: menuItem.icon, onClick: () => __awaiter$C(void 0, void 0, void 0, function* () {
8875
8876
  try {
8876
- menuItem.onClick(attachment);
8877
+ yield menuItem.onClick(attachment);
8877
8878
  }
8878
8879
  catch (e) {
8879
8880
  handleOnClickError === null || handleOnClickError === void 0 ? void 0 : handleOnClickError(e.message);
8880
8881
  }
8881
- } }, menuItem.name))))))));
8882
+ }) }, menuItem.name))))))));
8882
8883
  };
8883
8884
 
8884
8885
  // Copyright (c) Microsoft Corporation.
@@ -8920,16 +8921,48 @@ const actionIconStyle = { height: '1rem' };
8920
8921
  * @internal
8921
8922
  */
8922
8923
  const _AttachmentUploadCards = (props) => {
8924
+ var _a;
8923
8925
  const attachments = props.activeFileUploads;
8926
+ const localeStrings = useLocaleAttachmentCardStringsTrampoline();
8927
+ const removeFileButtonString = React.useMemo(() => () => {
8928
+ var _a, _b;
8929
+ return (_b = (_a = props.strings) === null || _a === void 0 ? void 0 : _a.removeAttachment) !== null && _b !== void 0 ? _b : localeStrings.removeAttachment;
8930
+ }, [(_a = props.strings) === null || _a === void 0 ? void 0 : _a.removeAttachment, localeStrings.removeAttachment]);
8924
8931
  if (!attachments || attachments.length === 0) {
8925
8932
  return React.createElement(React.Fragment, null);
8926
8933
  }
8927
8934
  return (React.createElement(_AttachmentCardGroup, null, attachments &&
8928
8935
  attachments
8929
8936
  .filter((attachment) => !attachment.error)
8930
- .map((attachment) => (React.createElement(_AttachmentCard, { attachmentName: attachment.filename, progress: attachment.progress, key: attachment.id, attachmentExtension: extension(attachment.filename), actionIcon: React.createElement(react.Icon, { iconName: "CancelFileUpload", className: react.mergeStyles(actionIconStyle) }), actionHandler: () => {
8931
- props.onCancelFileUpload && props.onCancelFileUpload(attachment.id);
8932
- }, strings: props.strings })))));
8937
+ .map((attachment) => {
8938
+ var _a, _b, _c, _d;
8939
+ return (React.createElement(_AttachmentCard
8940
+ // temp converter before upload is refactored
8941
+ , {
8942
+ // temp converter before upload is refactored
8943
+ attachment: {
8944
+ id: attachment.id,
8945
+ name: attachment.filename,
8946
+ extension: extension(attachment.filename),
8947
+ progress: attachment.progress,
8948
+ uploadStatus: attachment.error
8949
+ ? {
8950
+ message: (_a = attachment.error) === null || _a === void 0 ? void 0 : _a.message,
8951
+ timestamp: (_b = attachment.error) === null || _b === void 0 ? void 0 : _b.timestamp
8952
+ }
8953
+ : undefined
8954
+ }, progress: attachment.progress, key: attachment.id, menuActions: [
8955
+ {
8956
+ name: (_d = (_c = props.strings) === null || _c === void 0 ? void 0 : _c.removeAttachment) !== null && _d !== void 0 ? _d : 'Remove',
8957
+ icon: (React.createElement("div", { "aria-label": removeFileButtonString() },
8958
+ React.createElement(react.Icon, { iconName: "CancelAttachmentUpload", className: react.mergeStyles(actionIconStyle) }))),
8959
+ onClick: () => {
8960
+ props.onCancelFileUpload && props.onCancelFileUpload(attachment.id);
8961
+ return Promise.resolve();
8962
+ }
8963
+ }
8964
+ ], strings: props.strings }));
8965
+ })));
8933
8966
  };
8934
8967
 
8935
8968
  // Copyright (c) Microsoft Corporation.
@@ -9725,7 +9758,26 @@ const richTextEditorWrapperStyle = (theme, addTopOffset) => {
9725
9758
  paddingInlineEnd: `0.75rem`,
9726
9759
  lineHeight: '1.25rem',
9727
9760
  maxWidth: '100%',
9728
- color: theme.palette.neutralPrimary
9761
+ color: theme.palette.neutralPrimary,
9762
+ '& table': {
9763
+ background: 'transparent',
9764
+ borderCollapse: 'collapse',
9765
+ width: '100%',
9766
+ borderSpacing: '0',
9767
+ // don't shrink/expand cells during the input to the table
9768
+ tableLayout: 'fixed',
9769
+ '& tr': {
9770
+ background: 'transparent',
9771
+ border: `1px solid ${theme.palette.neutralLight}`,
9772
+ '& td': {
9773
+ background: 'transparent',
9774
+ border: `1px solid ${theme.palette.neutralLight}`,
9775
+ wordBreak: 'normal',
9776
+ padding: '0.125rem 0.25rem',
9777
+ verticalAlign: 'top'
9778
+ }
9779
+ }
9780
+ }
9729
9781
  });
9730
9782
  };
9731
9783
  /**
@@ -9776,6 +9828,15 @@ const ribbonOverflowButtonRootStyles = (theme) => {
9776
9828
  color: theme.palette.neutralPrimary
9777
9829
  }
9778
9830
  }
9831
+ },
9832
+ '.ribbon-table-button-regular-icon': {
9833
+ display: 'inline-block',
9834
+ margin: '-0.25rem 0.25rem 0 0.25rem',
9835
+ width: '1.25rem',
9836
+ height: '1.25rem'
9837
+ },
9838
+ '.ribbon-table-button-filled-icon': {
9839
+ display: 'none'
9779
9840
  }
9780
9841
  }
9781
9842
  };
@@ -9811,13 +9872,67 @@ const ribbonButtonStyle = (theme) => {
9811
9872
  rootExpandedHovered: ribbonButtonRootStyles(theme)
9812
9873
  };
9813
9874
  };
9875
+ const rootRibbonTableButtonStyle = (theme) => {
9876
+ // merge IStyles props
9877
+ return Object.assign({ minWidth: 'auto' }, ribbonTableButtonRootStyles(theme, false));
9878
+ };
9879
+ /**
9880
+ * @private
9881
+ */
9882
+ const ribbonTableButtonStyle = (theme) => {
9883
+ return {
9884
+ icon: { height: 'auto' },
9885
+ menuIcon: { height: 'auto' },
9886
+ root: rootRibbonTableButtonStyle(theme),
9887
+ rootChecked: ribbonTableButtonRootStyles(theme, true),
9888
+ rootHovered: ribbonTableButtonRootStyles(theme, true),
9889
+ rootCheckedHovered: ribbonTableButtonRootStyles(theme, true),
9890
+ rootCheckedPressed: ribbonTableButtonRootStyles(theme, true),
9891
+ rootPressed: ribbonTableButtonRootStyles(theme, true),
9892
+ rootExpanded: ribbonTableButtonRootStyles(theme, true),
9893
+ rootExpandedHovered: ribbonTableButtonRootStyles(theme, true)
9894
+ };
9895
+ };
9896
+ const ribbonTableButtonRootStyles = (theme, isSelected) => {
9897
+ return {
9898
+ backgroundColor: 'transparent',
9899
+ selectors: {
9900
+ '.ribbon-table-button-regular-icon': {
9901
+ width: '1.25rem',
9902
+ height: '1.25rem',
9903
+ marginTop: '-0.25rem',
9904
+ color: theme.palette.neutralPrimary,
9905
+ display: isSelected ? 'none' : 'inline-block'
9906
+ },
9907
+ '.ribbon-table-button-filled-icon': {
9908
+ width: '1.25rem',
9909
+ height: '1.25rem',
9910
+ marginTop: '-0.25rem',
9911
+ color: theme.palette.themePrimary,
9912
+ display: isSelected ? 'inline-block' : 'none'
9913
+ }
9914
+ }
9915
+ };
9916
+ };
9814
9917
  /**
9815
9918
  * @private
9816
9919
  */
9817
9920
  const ribbonDividerStyle = (theme) => {
9818
9921
  return {
9819
9922
  icon: { color: theme.palette.neutralQuaternaryAlt, margin: '0 -0.5rem', height: 'auto' },
9820
- root: { margin: '0', padding: '0', minWidth: 'auto' }
9923
+ root: { margin: '0', padding: '0', minWidth: 'auto' },
9924
+ rootHovered: {
9925
+ backgroundColor: 'transparent',
9926
+ selectors: {
9927
+ // Icon's color doesn't work here because of the specificity
9928
+ '.ms-Button-icon': {
9929
+ color: theme.palette.neutralQuaternaryAlt
9930
+ },
9931
+ '.ms-Button-menuIcon': {
9932
+ color: theme.palette.neutralQuaternaryAlt
9933
+ }
9934
+ }
9935
+ }
9821
9936
  };
9822
9937
  };
9823
9938
  /**
@@ -9844,18 +9959,241 @@ const sendBoxRichTextEditorStyle = (isExpanded) => {
9844
9959
  maxHeight: '5rem'
9845
9960
  };
9846
9961
  };
9962
+ /**
9963
+ * @private
9964
+ */
9965
+ const insertTableMenuCellButtonStyles = (theme) => {
9966
+ return {
9967
+ width: '1rem',
9968
+ height: '1rem',
9969
+ border: `solid 0.0625rem ${theme.palette.neutralTertiaryAlt}`,
9970
+ display: 'inline-block',
9971
+ cursor: 'pointer',
9972
+ background: 'transparent'
9973
+ };
9974
+ };
9975
+ /**
9976
+ * @private
9977
+ */
9978
+ const insertTableMenuCellButtonSelectedStyles = (theme) => {
9979
+ return {
9980
+ background: theme.palette.themePrimary
9981
+ };
9982
+ };
9983
+ /**
9984
+ * @private
9985
+ */
9986
+ const insertTableMenuTablePane = react.mergeStyles({
9987
+ padding: '0.5rem 0.625rem 0.75rem 0.625rem',
9988
+ boxSizing: 'content-box',
9989
+ minWidth: 'auto'
9990
+ });
9991
+ /**
9992
+ * @private
9993
+ */
9994
+ const insertTableMenuFocusZone = (theme) => {
9995
+ return react.mergeStyles({
9996
+ lineHeight: '12px',
9997
+ width: '5rem',
9998
+ border: `solid 0.0625rem ${theme.palette.neutralTertiaryAlt}`
9999
+ });
10000
+ };
10001
+ /**
10002
+ * @private
10003
+ */
10004
+ const insertTableMenuTitleStyles = react.mergeStyles({
10005
+ width: '100%',
10006
+ height: '1rem',
10007
+ fontSize: '0.75rem',
10008
+ marginBottom: '0.5rem'
10009
+ });
10010
+
10011
+ // Copyright (c) Microsoft Corporation.
10012
+ // Licensed under the MIT License.
10013
+ // This file uses RoosterJS React package implementation with updates to change table's size and remove styles
10014
+ /**
10015
+ * Insert table into editor at current selection
10016
+ * @param editor The editor instance
10017
+ * @param columns Number of columns in table
10018
+ * @param rows Number of rows in table
10019
+ */
10020
+ const insertTable = (editor, columns, rows) => {
10021
+ const document = editor.getDocument();
10022
+ const table = document.createElement('table');
10023
+ for (let i = 0; i < rows; i++) {
10024
+ const tr = document.createElement('tr');
10025
+ table.appendChild(tr);
10026
+ for (let j = 0; j < columns; j++) {
10027
+ const td = document.createElement('td');
10028
+ tr.appendChild(td);
10029
+ td.appendChild(document.createElement('br'));
10030
+ }
10031
+ }
10032
+ editor.focus();
10033
+ editor.addUndoSnapshot(() => {
10034
+ const vTable = new roosterjsEditorDom.VTable(table);
10035
+ vTable.writeBack();
10036
+ editor.insertNode(table);
10037
+ editor.runAsync((editor) => editor.select(new roosterjsEditorDom.Position(table, roosterjsEditorTypesCompatible.CompatiblePositionType.Begin).normalize()));
10038
+ }, roosterjsEditorTypesCompatible.CompatibleChangeSource.Format, undefined /* canUndoByBackspace */, {
10039
+ formatApiName: 'insertTable'
10040
+ });
10041
+ };
10042
+
10043
+ // Copyright (c) Microsoft Corporation.
10044
+ // Licensed under the MIT License.
10045
+ /**
10046
+ * @private
10047
+ *
10048
+ * String to be replaces by actual values of row and column.
10049
+ */
10050
+ const ColumnRowReplaceString = '{column} x {row}';
10051
+ /**
10052
+ * @private
10053
+ *
10054
+ * Function to create key pair for the selected table size.
10055
+ */
10056
+ function createKey(row, column) {
10057
+ return `${row},${column}`;
10058
+ }
10059
+ /**
10060
+ * @private
10061
+ *
10062
+ * Function to parse key to the selected table size valules.
10063
+ */
10064
+ function parseKey(key) {
10065
+ const [row, column] = key.split(',');
10066
+ return {
10067
+ row: parseInt(row),
10068
+ column: parseInt(column)
10069
+ };
10070
+ }
10071
+
10072
+ // Copyright (c) Microsoft Corporation.
10073
+ // Licensed under the MIT License.
10074
+ // This file uses RoosterJS React package implementation with updates to UI components and styles.
10075
+ const RowColumnInitialValue = 0;
10076
+ /**
10077
+ * @private
10078
+ * Component for the insert table pane
10079
+ */
10080
+ const RichTextInsertTablePane = (props) => {
10081
+ const { item, onClick, theme, maxColumnsNumber, maxRowsNumber } = props;
10082
+ const [column, setColumn] = React.useState(RowColumnInitialValue);
10083
+ const [row, setRow] = React.useState(RowColumnInitialValue);
10084
+ const updateSize = React.useCallback((target) => {
10085
+ if (target !== undefined && target.dataset.column !== undefined && target.dataset.row !== undefined) {
10086
+ const column = parseInt(target.dataset.column);
10087
+ const row = parseInt(target.dataset.row);
10088
+ if (column >= RowColumnInitialValue &&
10089
+ column < maxColumnsNumber &&
10090
+ row >= RowColumnInitialValue &&
10091
+ row < maxRowsNumber) {
10092
+ setColumn(column);
10093
+ setRow(row);
10094
+ }
10095
+ }
10096
+ }, [maxColumnsNumber, maxRowsNumber]);
10097
+ const onMouseEnter = React.useCallback((e) => {
10098
+ updateSize(e.target);
10099
+ }, [updateSize]);
10100
+ const onClickButton = React.useCallback((e) => {
10101
+ onClick(e, Object.assign(Object.assign({}, item), { key: createKey(formatRowColumnText(row), formatRowColumnText(column)) }));
10102
+ }, [row, column, onClick, item]);
10103
+ const items = React.useMemo(() => {
10104
+ var _a;
10105
+ const items = [];
10106
+ for (let i = 0; i < maxRowsNumber; i++) {
10107
+ for (let j = 0; j < maxColumnsNumber; j++) {
10108
+ const key = `cell_${i}_${j}`;
10109
+ const isSelected = j <= column && i <= row;
10110
+ items.push(React.createElement("button", { className: react.mergeStyles(insertTableMenuCellButtonStyles(theme), isSelected ? insertTableMenuCellButtonSelectedStyles(theme) : undefined), onClick: onClickButton, key: key, id: key, "data-column": j, "data-row": i, "data-is-focusable": true, onMouseEnter: onMouseEnter, "aria-label": formatText((_a = item.text) !== null && _a !== void 0 ? _a : '', i, j) }));
10111
+ }
10112
+ }
10113
+ return items;
10114
+ }, [maxRowsNumber, maxColumnsNumber, column, row, theme, onClickButton, onMouseEnter, item.text]);
10115
+ const text = React.useMemo(() => {
10116
+ var _a;
10117
+ return formatText((_a = item.text) !== null && _a !== void 0 ? _a : '', formatRowColumnText(row), formatRowColumnText(column));
10118
+ }, [column, item.text, row]);
10119
+ return (React.createElement("div", null,
10120
+ React.createElement("div", { className: insertTableMenuTitleStyles }, text),
10121
+ React.createElement(react.FocusZone, { defaultTabbableElement: `cell_${RowColumnInitialValue}_${RowColumnInitialValue}`, direction: react.FocusZoneDirection.bidirectional, onActiveElementChanged: updateSize, className: insertTableMenuFocusZone(theme) }, items)));
10122
+ };
10123
+ const formatText = (text, row, column) => {
10124
+ return text.replace(`${ColumnRowReplaceString}`, `${column.toString()} x ${row.toString()}`);
10125
+ };
10126
+ const formatRowColumnText = (value) => {
10127
+ return value + 1;
10128
+ };
9847
10129
 
9848
10130
  // Copyright (c) Microsoft Corporation.
9849
10131
  // Licensed under the MIT License.
9850
- const dividerRibbonButton = (theme) => {
10132
+ // This file uses RoosterJS React package implementation with updates to UI components and styles.
10133
+ /**
10134
+ * "Insert table" button for the RoosterJS ribbon
10135
+ */
10136
+ const insertTableButton = (theme, maxRowsNumber, maxColumnsNumber) => {
9851
10137
  return {
9852
- key: 'Divider',
10138
+ key: 'buttonNameInsertTable',
10139
+ unlocalizedText: 'Insert table',
10140
+ // Icon will be set in onRenderIcon callback
10141
+ iconName: '',
10142
+ onClick: (editor, key) => {
10143
+ const { row, column } = parseKey(key);
10144
+ insertTable(editor, column, row);
10145
+ },
10146
+ dropDownMenu: {
10147
+ items: {
10148
+ // the key of the item is also used as a key for localization
10149
+ insertTablePane: `Insert ${ColumnRowReplaceString} table`
10150
+ },
10151
+ itemRender: (item, onClick) => {
10152
+ return (React.createElement(RichTextInsertTablePane, { item: item, onClick: onClick, theme: theme, maxColumnsNumber: maxColumnsNumber, maxRowsNumber: maxRowsNumber }));
10153
+ },
10154
+ commandBarSubMenuProperties: {
10155
+ className: insertTableMenuTablePane
10156
+ }
10157
+ },
10158
+ commandBarProperties: {
10159
+ // hide the chevron icon
10160
+ menuIconProps: {
10161
+ hidden: true
10162
+ },
10163
+ onRenderIcon: (item) => {
10164
+ console.log('onRenderIcon', item);
10165
+ return React.createElement(TableIcon, null);
10166
+ },
10167
+ buttonStyles: ribbonTableButtonStyle(theme),
10168
+ canCheck: false
10169
+ }
10170
+ };
10171
+ };
10172
+ const TableIcon = () => {
10173
+ return (
10174
+ // update the visibility of the Table Icon with css classes that are triggered by command bar's state
10175
+ React.createElement(react.Stack, null,
10176
+ React.createElement(react.Icon, { iconName: "RichTextInsertTableFilledIcon", className: 'ribbon-table-button-filled-icon' }),
10177
+ React.createElement(react.Icon, { iconName: "RichTextInsertTableRegularIcon", className: 'ribbon-table-button-regular-icon' })));
10178
+ };
10179
+
10180
+ // Copyright (c) Microsoft Corporation.
10181
+ // Licensed under the MIT License.
10182
+ const MaxRowsNumber = 5;
10183
+ const MaxColumnsNumber = 5;
10184
+ const dividerRibbonButton = (theme, key) => {
10185
+ return {
10186
+ key: key,
9853
10187
  iconName: 'RichTextDividerIcon',
9854
10188
  unlocalizedText: '',
9855
10189
  onClick: () => { },
9856
10190
  isDisabled: () => true,
9857
10191
  commandBarProperties: {
9858
- buttonStyles: ribbonDividerStyle(theme)
10192
+ // show the item correctly for the overflow menu
10193
+ itemType: react.ContextualMenuItemType.Divider,
10194
+ buttonStyles: ribbonDividerStyle(theme),
10195
+ // this is still needed to remove checkmark icon space even though it is a divider
10196
+ canCheck: false
9859
10197
  }
9860
10198
  };
9861
10199
  };
@@ -9902,11 +10240,13 @@ const ribbonButtons = (theme) => {
9902
10240
  boldButton(theme),
9903
10241
  italicButton(theme),
9904
10242
  underlineButton(theme),
9905
- dividerRibbonButton(theme),
10243
+ dividerRibbonButton(theme, 'RichTextRibbonTextFormatDivider'),
9906
10244
  bulletListButton(theme),
9907
10245
  numberListButton(theme),
9908
10246
  indentIncreaseButton(theme),
9909
- indentDecreaseButton(theme)
10247
+ indentDecreaseButton(theme),
10248
+ dividerRibbonButton(theme, 'RichTextRibbonTableDivider'),
10249
+ insertTableButton(theme, MaxRowsNumber, MaxColumnsNumber)
9910
10250
  ].forEach((item) => {
9911
10251
  if (item !== undefined) {
9912
10252
  buttons.push(item);
@@ -9914,8 +10254,13 @@ const ribbonButtons = (theme) => {
9914
10254
  });
9915
10255
  return buttons;
9916
10256
  };
10257
+
10258
+ // Copyright (c) Microsoft Corporation.
10259
+ // Licensed under the MIT License.
9917
10260
  /**
9918
10261
  * @private
10262
+ *
10263
+ * Strings for the ribbon buttons where key should match `key` prop if any or the name of the item.
9919
10264
  */
9920
10265
  const ribbonButtonsStrings = (strings) => {
9921
10266
  return {
@@ -9925,10 +10270,83 @@ const ribbonButtonsStrings = (strings) => {
9925
10270
  buttonNameBulletedList: strings.bulletListTooltip,
9926
10271
  buttonNameNumberedList: strings.numberListTooltip,
9927
10272
  buttonNameIncreaseIndent: strings.increaseIndentTooltip,
9928
- buttonNameDecreaseIndent: strings.decreaseIndentTooltip
10273
+ buttonNameDecreaseIndent: strings.decreaseIndentTooltip,
10274
+ buttonNameInsertTable: strings.insertTableTooltip,
10275
+ insertTablePane: strings.insertTableMenuTitle
10276
+ };
10277
+ };
10278
+ /**
10279
+ * @private
10280
+ *
10281
+ * Strings for the table context menu where key should match `key` prop if any or the name of the item.
10282
+ */
10283
+ const tableContextMenuStrings = (strings) => {
10284
+ return {
10285
+ menuNameTableInsert: strings.insertRowOrColumnMenu,
10286
+ menuNameTableInsertAbove: strings.insertRowAboveMenu,
10287
+ menuNameTableInsertBelow: strings.insertRowBelowMenu,
10288
+ menuNameTableInsertLeft: strings.insertColumnLeftMenu,
10289
+ menuNameTableInsertRight: strings.insertColumnRightMenu,
10290
+ menuNameTableDelete: strings.deleteRowOrColumnMenu,
10291
+ menuNameTableDeleteColumn: strings.deleteColumnMenu,
10292
+ menuNameTableDeleteRow: strings.deleteRowMenu,
10293
+ menuNameTableDeleteTable: strings.deleteTableMenu
9929
10294
  };
9930
10295
  };
9931
10296
 
10297
+ // Copyright (c) Microsoft Corporation.
10298
+ // Licensed under the MIT License.
10299
+ const onClick = (key, editor) => {
10300
+ editor.focus();
10301
+ const operation = TableEditOperationMap[key];
10302
+ if (typeof operation === 'number') {
10303
+ roosterjsEditorApi.editTable(editor, operation);
10304
+ }
10305
+ };
10306
+ const TableEditOperationMap = {
10307
+ menuNameTableInsertAbove: roosterjsEditorTypesCompatible.CompatibleTableOperation.InsertAbove,
10308
+ menuNameTableInsertBelow: roosterjsEditorTypesCompatible.CompatibleTableOperation.InsertBelow,
10309
+ menuNameTableInsertLeft: roosterjsEditorTypesCompatible.CompatibleTableOperation.InsertLeft,
10310
+ menuNameTableInsertRight: roosterjsEditorTypesCompatible.CompatibleTableOperation.InsertRight,
10311
+ menuNameTableDeleteTable: roosterjsEditorTypesCompatible.CompatibleTableOperation.DeleteTable,
10312
+ menuNameTableDeleteColumn: roosterjsEditorTypesCompatible.CompatibleTableOperation.DeleteColumn,
10313
+ menuNameTableDeleteRow: roosterjsEditorTypesCompatible.CompatibleTableOperation.DeleteRow
10314
+ };
10315
+ const tableEditInsertMenuItem = {
10316
+ key: 'menuNameTableInsert',
10317
+ unlocalizedText: 'Insert123',
10318
+ subItems: {
10319
+ menuNameTableInsertAbove: 'Insert above121312 ',
10320
+ menuNameTableInsertBelow: 'Insert below',
10321
+ menuNameTableInsertLeft: 'Insert left123 ',
10322
+ menuNameTableInsertRight: 'Insert right'
10323
+ },
10324
+ onClick
10325
+ };
10326
+ const tableEditDeleteMenuItem = {
10327
+ key: 'menuNameTableDelete',
10328
+ unlocalizedText: 'Delete',
10329
+ subItems: {
10330
+ menuNameTableDeleteColumn: 'Delete column',
10331
+ menuNameTableDeleteRow: 'Delete row',
10332
+ menuNameTableDeleteTable: 'Delete table'
10333
+ },
10334
+ onClick
10335
+ };
10336
+ const tableActions = [tableEditInsertMenuItem, tableEditDeleteMenuItem];
10337
+ /**
10338
+ * Create a new instance of ContextMenuProvider to support table editing functionalities in context menu
10339
+ * @returns A new ContextMenuProvider
10340
+ */
10341
+ const createTableEditMenuProvider = (strings) => {
10342
+ return roosterjsReact.createContextMenuProvider('tableEdit', tableActions, tableContextMenuStrings(strings !== null && strings !== void 0 ? strings : {}), (editor, node) => !!getEditingTable(editor, node));
10343
+ };
10344
+ const getEditingTable = (editor, node) => {
10345
+ const td = editor.getElementAtCursor('TD,TH', node);
10346
+ const table = td && editor.getElementAtCursor('table', td);
10347
+ return (table === null || table === void 0 ? void 0 : table.isContentEditable) ? { table, td } : null;
10348
+ };
10349
+
9932
10350
  // Copyright (c) Microsoft Corporation.
9933
10351
  // Licensed under the MIT License.
9934
10352
  /**
@@ -9959,13 +10377,12 @@ const RichTextEditor = React.forwardRef((props, ref) => {
9959
10377
  }, []);
9960
10378
  const editorCreator = React.useCallback((div, options) => {
9961
10379
  editor.current = new roosterjsEditorCore.Editor(div, options);
9962
- // Remove default values for background color and color
9963
- // setBackgroundColor and setTextColor can't be used here as they cause the editor to be focused
9964
- // color will be set in richTextEditorWrapperStyle instead of inline styles
9965
- div.style.backgroundColor = '';
9966
- div.style.color = '';
9967
10380
  return editor.current;
9968
- }, []);
10381
+ },
10382
+ // trigger force editor reset when strings are changed to update context menu strings
10383
+ // see RosterJS documentation for 'editorCreator' for more details
10384
+ // eslint-disable-next-line react-hooks/exhaustive-deps
10385
+ [strings]);
9969
10386
  const placeholderPlugin = React.useMemo(() => {
9970
10387
  return new roosterjsEditorPlugins.Watermark('');
9971
10388
  }, []);
@@ -9975,12 +10392,15 @@ const RichTextEditor = React.forwardRef((props, ref) => {
9975
10392
  }
9976
10393
  }, [placeholderPlugin, placeholderText]);
9977
10394
  const plugins = React.useMemo(() => {
10395
+ // contextPlugin and tableEditMenuProvider allow to show insert/delete menu for the table
10396
+ const contextPlugin = roosterjsReact.createContextMenuPlugin();
10397
+ const tableEditMenuProvider = createTableEditMenuProvider(strings);
9978
10398
  const contentEdit = new roosterjsEditorPlugins.ContentEdit();
9979
10399
  const updateContentPlugin = roosterjsReact.createUpdateContentPlugin(roosterjsReact.UpdateMode.OnContentChangedEvent | roosterjsReact.UpdateMode.OnUserInput, (content) => {
9980
10400
  onChange && onChange(content);
9981
10401
  });
9982
- return [contentEdit, placeholderPlugin, updateContentPlugin, ribbonPlugin];
9983
- }, [onChange, placeholderPlugin, ribbonPlugin]);
10402
+ return [contentEdit, placeholderPlugin, updateContentPlugin, ribbonPlugin, contextPlugin, tableEditMenuProvider];
10403
+ }, [onChange, placeholderPlugin, ribbonPlugin, strings]);
9984
10404
  const ribbon = React.useMemo(() => {
9985
10405
  const buttons = ribbonButtons(theme);
9986
10406
  return (React.createElement(roosterjsReact.Ribbon, { styles: ribbonStyle, buttons: buttons, plugin: ribbonPlugin, overflowButtonProps: {
@@ -9992,10 +10412,18 @@ const RichTextEditor = React.forwardRef((props, ref) => {
9992
10412
  }
9993
10413
  }, strings: ribbonButtonsStrings(strings), "data-testid": 'rich-text-editor-ribbon' }));
9994
10414
  }, [strings, ribbonPlugin, theme]);
10415
+ const defaultFormat = React.useMemo(() => {
10416
+ // without setting any styles, text input is not handled properly for tables (when insert or paste one in the editor)
10417
+ // because of https://github.com/microsoft/roosterjs/blob/14dbb947e3ae94580109cbd05e48ceb05327c4dc/packages/roosterjs-editor-core/lib/corePlugins/TypeInContainerPlugin.ts#L75
10418
+ // this issue is fixed for content model package
10419
+ return {
10420
+ backgroundColor: 'transparent'
10421
+ };
10422
+ }, []);
9995
10423
  return (React.createElement("div", { "data-testid": 'rich-text-editor-wrapper' },
9996
10424
  showRichTextEditorFormatting && ribbon,
9997
10425
  React.createElement("div", { className: richTextEditorWrapperStyle(theme, !showRichTextEditorFormatting) },
9998
- React.createElement(roosterjsReact.Rooster, { initialContent: initialContent, inDarkMode: isDarkThemed(theme), plugins: plugins, className: richTextEditorStyle(props.styles), editorCreator: editorCreator,
10426
+ React.createElement(roosterjsReact.Rooster, { defaultFormat: defaultFormat, initialContent: initialContent, inDarkMode: isDarkThemed(theme), plugins: plugins, className: richTextEditorStyle(props.styles), editorCreator: editorCreator,
9999
10427
  // TODO: confirm the color during inline images implementation
10000
10428
  imageSelectionBorderColor: 'blue',
10001
10429
  // doNotAdjustEditorColor is used to fix the default background color for Rooster component
@@ -10281,12 +10709,20 @@ const RichTextSendBox = (props) => {
10281
10709
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
10282
10710
  const onRenderFileUploads = React.useCallback(() => {
10283
10711
  return (React.createElement(react.Stack, { className: attachmentUploadCardsStyles },
10284
- React.createElement(_AttachmentUploadCards, { activeFileUploads: activeFileUploads, onCancelFileUpload: onCancelFileUpload, strings: {
10285
- removeAttachment: strings.removeAttachment,
10286
- uploading: strings.uploading,
10287
- uploadCompleted: strings.uploadCompleted
10288
- } })));
10289
- }, [activeFileUploads, onCancelFileUpload, strings.removeAttachment, strings.uploadCompleted, strings.uploading]);
10712
+ React.createElement(FluentV9ThemeProvider, { v8Theme: theme },
10713
+ React.createElement(_AttachmentUploadCards, { activeFileUploads: activeFileUploads, onCancelFileUpload: onCancelFileUpload, strings: {
10714
+ removeAttachment: strings.removeAttachment,
10715
+ uploading: strings.uploading,
10716
+ uploadCompleted: strings.uploadCompleted
10717
+ } }))));
10718
+ }, [
10719
+ activeFileUploads,
10720
+ onCancelFileUpload,
10721
+ strings.removeAttachment,
10722
+ strings.uploadCompleted,
10723
+ strings.uploading,
10724
+ theme
10725
+ ]);
10290
10726
  const sendButton = React.useMemo(() => {
10291
10727
  return (React.createElement(InputBoxButton, { onRenderIcon: onRenderSendIcon, onClick: (e) => {
10292
10728
  sendMessageOnClick();
@@ -10872,7 +11308,7 @@ const LiveMessage = (props) => (React.createElement(AnnouncerContext.Consumer, n
10872
11308
  const MessageStatusIcon = (props) => {
10873
11309
  const { shouldAnnounce, iconName, iconClassName, ariaLabel } = props;
10874
11310
  return (React.createElement(React.Fragment, null,
10875
- ariaLabel && React.createElement(LiveMessage, { message: ariaLabel, ariaLive: "polite" }),
11311
+ ariaLabel && shouldAnnounce && React.createElement(LiveMessage, { message: ariaLabel, ariaLive: "polite" }),
10876
11312
  React.createElement("div", {
10877
11313
  // make icon accessible
10878
11314
  tabIndex: 0 },
@@ -11663,15 +12099,6 @@ const processHtmlToReact = (props) => {
11663
12099
 
11664
12100
  // Copyright (c) Microsoft Corporation.
11665
12101
  // Licensed under the MIT License.
11666
- var __awaiter$C = (window && window.__awaiter) || function (thisArg, _arguments, P, generator) {
11667
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
11668
- return new (P || (P = Promise))(function (resolve, reject) {
11669
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11670
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11671
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
11672
- step((generator = generator.apply(thisArg, _arguments || [])).next());
11673
- });
11674
- };
11675
12102
  const attachmentDownloadCardsStyle = {
11676
12103
  marginTop: '0.25rem'
11677
12104
  };
@@ -11680,66 +12107,94 @@ const attachmentDownloadCardsStyle = {
11680
12107
  */
11681
12108
  const _AttachmentDownloadCards = (props) => {
11682
12109
  var _a, _b;
11683
- const { userId, fileMetadata } = props;
11684
- const [showSpinner, setShowSpinner] = React.useState(false);
12110
+ const { attachments, message } = props;
11685
12111
  const localeStrings = useLocaleStringsTrampoline();
12112
+ const getMenuActions = React.useCallback((attachment, localeStrings, message, action) => {
12113
+ const defaultMenuActions = getDefaultMenuActions(localeStrings, message);
12114
+ try {
12115
+ const actions = action === null || action === void 0 ? void 0 : action(attachment, message);
12116
+ if (actions && actions.length > 0) {
12117
+ return actions;
12118
+ }
12119
+ else {
12120
+ return defaultMenuActions;
12121
+ }
12122
+ }
12123
+ catch (error) {
12124
+ return defaultMenuActions;
12125
+ }
12126
+ }, []);
11686
12127
  const downloadAttachmentButtonString = React.useMemo(() => () => {
11687
12128
  var _a, _b;
11688
12129
  return (_b = (_a = props.strings) === null || _a === void 0 ? void 0 : _a.downloadAttachment) !== null && _b !== void 0 ? _b : localeStrings.downloadAttachment;
11689
12130
  }, [(_a = props.strings) === null || _a === void 0 ? void 0 : _a.downloadAttachment, localeStrings.downloadAttachment]);
11690
- const isShowDownloadIcon = React.useCallback((attachment) => {
11691
- var _a;
11692
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11693
- return ((_a = attachment.payload) === null || _a === void 0 ? void 0 : _a.teamsFileAttachment) !== 'true';
11694
- }, []);
11695
12131
  const attachmentCardGroupDescription = React.useMemo(() => () => {
11696
12132
  var _a, _b, _c;
11697
- const fileGroupLocaleString = (_b = (_a = props.strings) === null || _a === void 0 ? void 0 : _a.attachmentCardGroupMessage) !== null && _b !== void 0 ? _b : localeStrings.attachmentCardGroupMessage;
12133
+ const attachmentGroupLocaleString = (_b = (_a = props.strings) === null || _a === void 0 ? void 0 : _a.attachmentCardGroupMessage) !== null && _b !== void 0 ? _b : localeStrings.attachmentCardGroupMessage;
11698
12134
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11699
- return _formatString(fileGroupLocaleString, {
11700
- attachmentCount: `${(_c = fileMetadata === null || fileMetadata === void 0 ? void 0 : fileMetadata.length) !== null && _c !== void 0 ? _c : 0}`
12135
+ return _formatString(attachmentGroupLocaleString, {
12136
+ attachmentCount: `${(_c = attachments === null || attachments === void 0 ? void 0 : attachments.length) !== null && _c !== void 0 ? _c : 0}`
11701
12137
  });
11702
- }, [(_b = props.strings) === null || _b === void 0 ? void 0 : _b.attachmentCardGroupMessage, localeStrings.attachmentCardGroupMessage, fileMetadata]);
11703
- const fileDownloadHandler = React.useCallback((userId, file) => __awaiter$C(void 0, void 0, void 0, function* () {
11704
- if (!props.downloadHandler) {
11705
- window.open(file.url, '_blank', 'noopener,noreferrer');
11706
- }
11707
- else {
11708
- setShowSpinner(true);
11709
- try {
11710
- const response = yield props.downloadHandler(userId, file);
11711
- setShowSpinner(false);
11712
- if (response instanceof URL) {
11713
- window.open(response.toString(), '_blank', 'noopener,noreferrer');
11714
- }
11715
- else {
11716
- props.onDownloadErrorMessage && props.onDownloadErrorMessage(response.errorMessage);
11717
- }
11718
- }
11719
- finally {
11720
- setShowSpinner(false);
11721
- }
11722
- }
11723
- }), [props]);
11724
- if (!fileMetadata || fileMetadata.length === 0 || !fileMetadata) {
12138
+ }, [(_b = props.strings) === null || _b === void 0 ? void 0 : _b.attachmentCardGroupMessage, localeStrings.attachmentCardGroupMessage, attachments]);
12139
+ if (!attachments || attachments.length === 0 || !attachments) {
11725
12140
  return React.createElement(React.Fragment, null);
11726
12141
  }
11727
- return (React.createElement("div", { style: attachmentDownloadCardsStyle, "data-ui-id": "file-download-card-group" },
11728
- React.createElement(_AttachmentCardGroup, { ariaLabel: attachmentCardGroupDescription() }, fileMetadata &&
11729
- fileMetadata.map((attachment) => (React.createElement(react.TooltipHost, { content: downloadAttachmentButtonString(), key: attachment.name },
11730
- React.createElement(_AttachmentCard, { attachmentName: attachment.name, key: attachment.name, attachmentExtension: attachment.extension, actionIcon: showSpinner ? (React.createElement(react.Spinner, { size: react.SpinnerSize.medium, "aria-live": 'polite', role: 'status' })) : isShowDownloadIcon(attachment) ? (React.createElement(DownloadIconTrampoline, null)) : (React.createElement(reactIcons.Open20Regular, null)), actionHandler: () => fileDownloadHandler(userId, attachment) })))))));
12142
+ return (React.createElement("div", { style: attachmentDownloadCardsStyle, "data-ui-id": "attachment-download-card-group" },
12143
+ React.createElement(_AttachmentCardGroup, { ariaLabel: attachmentCardGroupDescription() }, attachments &&
12144
+ attachments.map((attachment) => (React.createElement(react.TooltipHost, { content: downloadAttachmentButtonString(), key: attachment.name },
12145
+ React.createElement(_AttachmentCard, { attachment: attachment, key: attachment.id, menuActions: getMenuActions(attachment, localeStrings, message, props.actionsForAttachment), onActionHandlerFailed: props.onActionHandlerFailed })))))));
11731
12146
  };
11732
12147
  /**
11733
12148
  * @private
11734
12149
  */
11735
- const DownloadIconTrampoline = () => {
11736
- // @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload)
11737
- return React.createElement(reactIcons.ArrowDownload20Regular, { "data-ui-id": 'file-download-card-download-icon' });
11738
- };
11739
12150
  const useLocaleStringsTrampoline = () => {
11740
12151
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11741
12152
  return useLocale$1().strings.messageThread;
11742
12153
  };
12154
+ /**
12155
+ * @private
12156
+ */
12157
+ const getDefaultMenuActions = (locale, chatMessage) => {
12158
+ var _a;
12159
+ // if message is sent by a Teams user, we need to use a different icon ("open")
12160
+ if ((_a = chatMessage === null || chatMessage === void 0 ? void 0 : chatMessage.senderId) === null || _a === void 0 ? void 0 : _a.includes('8:orgid:')) {
12161
+ return [
12162
+ Object.assign(Object.assign({}, defaultAttachmentMenuAction), { name: locale.openAttachment, icon: React.createElement(react.Icon, { iconName: "OpenAttachment" }) })
12163
+ ];
12164
+ }
12165
+ // otherwise, use the default icon ("download")
12166
+ return [
12167
+ Object.assign(Object.assign({}, defaultAttachmentMenuAction), { name: locale.downloadAttachment })
12168
+ ];
12169
+ };
12170
+ /**
12171
+ * @beta
12172
+ *
12173
+ * The default menu action for downloading attachments. This action will open the attachment's URL in a new tab.
12174
+ */
12175
+ const defaultAttachmentMenuAction = {
12176
+ /**
12177
+ *
12178
+ * name is used for aria-label only when there's one button. For multiple buttons, it's used as a label.
12179
+ * by default it's an unlocalized string when this is used as a imported constant,
12180
+ * but you can overwrite it with your own localized string.
12181
+ *
12182
+ * i.e. defaultAttachmentMenuAction.name = localize('Download');
12183
+ *
12184
+ * when no action is provided, the UI library will overwrite this name
12185
+ * with a localized string this string when it's used in the UI.
12186
+ */
12187
+ name: 'Download',
12188
+ // this is the icon shown on the right of the attachment card
12189
+ icon: React.createElement(react.Icon, { iconName: "DownloadAttachment", "data-ui-id": "attachment-download-card-download-icon" }),
12190
+ // this is the action that runs when the icon is clicked
12191
+ onClick: (attachment) => {
12192
+ return new Promise((resolve) => {
12193
+ window.open(attachment.url, '_blank', 'noopener,noreferrer');
12194
+ resolve();
12195
+ });
12196
+ }
12197
+ };
11743
12198
 
11744
12199
  // Copyright (c) Microsoft Corporation.
11745
12200
  // Licensed under the MIT License.
@@ -11834,12 +12289,18 @@ const getFluentUIAttachedValue = (messageAttachedStatus) => {
11834
12289
  * Get the message bubble content for the message.
11835
12290
  */
11836
12291
  function getMessageBubbleContent(message, strings, userId, inlineImageOptions,
11837
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11838
- onRenderFileDownloads,
11839
12292
  /* @conditional-compile-remove(mention) */
11840
12293
  mentionDisplayOptions,
11841
12294
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11842
- fileDownloadHandler) {
12295
+ /**
12296
+ * Optional callback to render message attachments in the message component.
12297
+ */
12298
+ onRenderAttachmentDownloads,
12299
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12300
+ /**
12301
+ * Optional callback to define custom actions for attachments.
12302
+ */
12303
+ actionsForAttachment) {
11843
12304
  /* @conditional-compile-remove(data-loss-prevention) */
11844
12305
  if (message.messageType === 'blocked') {
11845
12306
  return (React.createElement("div", { tabIndex: 0 },
@@ -11849,27 +12310,27 @@ fileDownloadHandler) {
11849
12310
  React.createElement(ChatMessageContent, { message: message, strings: strings,
11850
12311
  /* @conditional-compile-remove(mention) */
11851
12312
  mentionDisplayOptions: mentionDisplayOptions, inlineImageOptions: inlineImageOptions }),
11852
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ onRenderFileDownloads
11853
- ? onRenderFileDownloads(userId, message)
11854
- : defaultOnRenderFileDownloads(userId, message, strings,
11855
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ fileDownloadHandler)));
12313
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ onRenderAttachmentDownloads
12314
+ ? onRenderAttachmentDownloads(userId, message)
12315
+ : defaultOnRenderAttachmentDownloads(message, strings,
12316
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12317
+ actionsForAttachment)));
11856
12318
  }
11857
12319
  /**
11858
- * Default component for rendering file downloads.
12320
+ * Default component for rendering attachment downloads.
11859
12321
  */
11860
12322
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11861
- const defaultOnRenderFileDownloads = (userId, message, strings,
11862
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11863
- fileDownloadHandler) => {
12323
+ const defaultOnRenderAttachmentDownloads = (message, strings, actionsForAttachment) => {
11864
12324
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11865
- return (React.createElement(_AttachmentDownloadCards, { userId: userId,
12325
+ return (React.createElement(_AttachmentDownloadCards, { message: message,
11866
12326
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11867
- fileMetadata: message.files || [],
12327
+ attachments: message.files || [],
11868
12328
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11869
- downloadHandler: fileDownloadHandler,
12329
+ actionsForAttachment: actionsForAttachment,
11870
12330
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11871
12331
  strings: {
11872
12332
  downloadAttachment: strings.downloadAttachment,
12333
+ openAttachment: strings.openAttachment,
11873
12334
  attachmentCardGroupMessage: strings.attachmentCardGroupMessage
11874
12335
  } }));
11875
12336
  };
@@ -11910,13 +12371,13 @@ const MessageBubble$1 = (props) => {
11910
12371
  const ids = useIdentifiers();
11911
12372
  const theme = useTheme();
11912
12373
  const locale = useLocale$1();
11913
- const { userId, message, onRemoveClick, onResendClick, disableEditing, showDate, messageContainerStyle, strings, onEditClick, remoteParticipantsCount = 0, onRenderAvatar, showMessageStatus, messageStatus,
12374
+ const { userId, message, onRemoveClick, onResendClick, disableEditing, showDate, messageContainerStyle, strings, onEditClick, remoteParticipantsCount = 0, onRenderAvatar, showMessageStatus, messageStatus, inlineImageOptions,
12375
+ /* @conditional-compile-remove(mention) */
12376
+ mentionDisplayOptions, onDisplayDateTimeString,
11914
12377
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11915
- fileDownloadHandler, inlineImageOptions,
12378
+ onRenderAttachmentDownloads,
11916
12379
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11917
- onRenderFileDownloads,
11918
- /* @conditional-compile-remove(mention) */
11919
- mentionDisplayOptions, onDisplayDateTimeString } = props;
12380
+ actionsForAttachment } = props;
11920
12381
  const formattedTimestamp = React.useMemo(() => {
11921
12382
  const defaultTimeStamp = message.createdOn
11922
12383
  ? generateDefaultTimestamp(message.createdOn, showDate, strings)
@@ -11969,18 +12430,18 @@ const MessageBubble$1 = (props) => {
11969
12430
  }, [message, messageStatus, strings.editedTag, strings.failToSendTag, theme]);
11970
12431
  const getContent = React.useCallback(() => {
11971
12432
  return getMessageBubbleContent(message, strings, userId, inlineImageOptions,
11972
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11973
- onRenderFileDownloads,
11974
12433
  /* @conditional-compile-remove(mention) */
11975
12434
  mentionDisplayOptions,
11976
12435
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
11977
- fileDownloadHandler);
12436
+ onRenderAttachmentDownloads,
12437
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12438
+ actionsForAttachment);
11978
12439
  }, [
11979
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ fileDownloadHandler,
12440
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ actionsForAttachment,
11980
12441
  inlineImageOptions,
11981
12442
  /* @conditional-compile-remove(mention) */ mentionDisplayOptions,
11982
12443
  message,
11983
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ onRenderFileDownloads,
12444
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ onRenderAttachmentDownloads,
11984
12445
  strings,
11985
12446
  userId
11986
12447
  ]);
@@ -12118,17 +12579,18 @@ const FluentChatMyMessageComponent = (props) => {
12118
12579
  /* @conditional-compile-remove(date-time-customization) */
12119
12580
  onDisplayDateTimeString, inlineImageOptions,
12120
12581
  /* @conditional-compile-remove(mention) */
12121
- mentionOptions,
12582
+ mentionOptions, userId, defaultStatusRenderer, statusToRender,
12122
12583
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12123
- fileDownloadHandler, userId,
12584
+ actionsForAttachment,
12124
12585
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12125
- onRenderFileDownloads, defaultStatusRenderer, statusToRender } = props;
12586
+ onRenderAttachmentDownloads } = props;
12126
12587
  const chatMessageRenderStyles = useChatMessageRenderStyles();
12127
- const onRenderFileDownloadsMemo = React.useMemo(() => {
12588
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12589
+ const onRenderAttachmentDownloadsMemo = React.useMemo(() => {
12128
12590
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12129
- return onRenderFileDownloads;
12591
+ return onRenderAttachmentDownloads;
12130
12592
  }, [
12131
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ onRenderFileDownloads
12593
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ onRenderAttachmentDownloads
12132
12594
  ]);
12133
12595
  // To rerender the defaultChatMessageRenderer if app running across days(every new day chat time stamp
12134
12596
  // needs to be regenerated), the dependency on "new Date().toDateString()"" is added.
@@ -12137,7 +12599,7 @@ const FluentChatMyMessageComponent = (props) => {
12137
12599
  /* @conditional-compile-remove(data-loss-prevention) */ messageProps.message.messageType === 'blocked') {
12138
12600
  return (React.createElement(ChatMyMessageComponent, Object.assign({}, messageProps, {
12139
12601
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12140
- onRenderFileDownloads: onRenderFileDownloadsMemo,
12602
+ onRenderAttachmentDownloads: onRenderAttachmentDownloadsMemo,
12141
12603
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12142
12604
  strings: messageProps.strings, message: messageProps.message, userId: userId, remoteParticipantsCount: participantCount ? participantCount - 1 : 0, shouldOverlapAvatarAndMessage: shouldOverlapAvatarAndMessage, onRenderAvatar: onRenderAvatar, showMessageStatus: showMessageStatus, messageStatus: messageProps.message.status, onActionButtonClick: onActionButtonClick,
12143
12605
  /* @conditional-compile-remove(date-time-customization) */
@@ -12145,13 +12607,12 @@ const FluentChatMyMessageComponent = (props) => {
12145
12607
  /* @conditional-compile-remove(mention) */
12146
12608
  mentionOptions: mentionOptions,
12147
12609
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12148
- fileDownloadHandler: fileDownloadHandler })));
12610
+ actionsForAttachment: actionsForAttachment })));
12149
12611
  }
12150
12612
  return React.createElement(React.Fragment, null);
12151
12613
  }, [
12152
12614
  onActionButtonClick,
12153
12615
  onRenderAvatar,
12154
- onRenderFileDownloadsMemo,
12155
12616
  participantCount,
12156
12617
  shouldOverlapAvatarAndMessage,
12157
12618
  showMessageStatus,
@@ -12162,7 +12623,9 @@ const FluentChatMyMessageComponent = (props) => {
12162
12623
  /* @conditional-compile-remove(mention) */
12163
12624
  mentionOptions,
12164
12625
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12165
- fileDownloadHandler,
12626
+ onRenderAttachmentDownloadsMemo,
12627
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12628
+ actionsForAttachment,
12166
12629
  // eslint-disable-next-line react-hooks/exhaustive-deps
12167
12630
  new Date().toDateString()
12168
12631
  ]);
@@ -12228,9 +12691,9 @@ const MessageBubble = (props) => {
12228
12691
  const locale = useLocale$1();
12229
12692
  const { userId, message, showDate, messageContainerStyle, strings,
12230
12693
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12231
- fileDownloadHandler, inlineImageOptions, shouldOverlapAvatarAndMessage,
12694
+ onRenderAttachmentDownloads, inlineImageOptions, shouldOverlapAvatarAndMessage,
12232
12695
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12233
- onRenderFileDownloads,
12696
+ actionsForAttachment,
12234
12697
  /* @conditional-compile-remove(mention) */
12235
12698
  mentionDisplayOptions, onDisplayDateTimeString } = props;
12236
12699
  const formattedTimestamp = React.useMemo(() => {
@@ -12247,18 +12710,18 @@ const MessageBubble = (props) => {
12247
12710
  }, [strings.editedTag, theme, message]);
12248
12711
  const getContent = React.useCallback(() => {
12249
12712
  return getMessageBubbleContent(message, strings, userId, inlineImageOptions,
12250
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12251
- onRenderFileDownloads,
12252
12713
  /* @conditional-compile-remove(mention) */
12253
12714
  mentionDisplayOptions,
12254
12715
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12255
- fileDownloadHandler);
12716
+ onRenderAttachmentDownloads,
12717
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12718
+ actionsForAttachment);
12256
12719
  }, [
12257
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ fileDownloadHandler,
12720
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ actionsForAttachment,
12258
12721
  inlineImageOptions,
12259
12722
  /* @conditional-compile-remove(mention) */ mentionDisplayOptions,
12260
12723
  message,
12261
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ onRenderFileDownloads,
12724
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ onRenderAttachmentDownloads,
12262
12725
  strings,
12263
12726
  userId
12264
12727
  ]);
@@ -12309,18 +12772,16 @@ const FluentChatMessageComponent = (props) => {
12309
12772
  /* @conditional-compile-remove(date-time-customization) */
12310
12773
  onDisplayDateTimeString, inlineImageOptions,
12311
12774
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12312
- fileDownloadHandler, userId,
12775
+ actionsForAttachment, userId,
12313
12776
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12314
- onRenderFileDownloads,
12777
+ onRenderAttachmentDownloads,
12315
12778
  /* @conditional-compile-remove(mention) */
12316
12779
  mentionOptions } = props;
12317
12780
  const chatMessageRenderStyles = useChatMessageRenderStyles();
12318
- const onRenderFileDownloadsMemo = React.useMemo(() => {
12319
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12320
- return onRenderFileDownloads;
12321
- }, [
12322
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ onRenderFileDownloads
12323
- ]);
12781
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12782
+ const onRenderAttachmentDownloadsMemo = React.useMemo(() => {
12783
+ return onRenderAttachmentDownloads;
12784
+ }, [onRenderAttachmentDownloads]);
12324
12785
  // To rerender the defaultChatMessageRenderer if app running across days(every new day chat time stamp
12325
12786
  // needs to be regenerated), the dependency on "new Date().toDateString()"" is added.
12326
12787
  const defaultChatMessageRenderer = React.useCallback((messageProps) => {
@@ -12328,30 +12789,27 @@ const FluentChatMessageComponent = (props) => {
12328
12789
  /* @conditional-compile-remove(data-loss-prevention) */ messageProps.message.messageType === 'blocked') {
12329
12790
  return (React.createElement(ChatMessageComponentAsMessageBubble, Object.assign({}, messageProps, {
12330
12791
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12331
- onRenderFileDownloads: onRenderFileDownloadsMemo,
12332
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12333
- strings: messageProps.strings, message: messageProps.message, userId: userId, shouldOverlapAvatarAndMessage: shouldOverlapAvatarAndMessage,
12792
+ onRenderAttachmentDownloads: onRenderAttachmentDownloadsMemo, strings: messageProps.strings, message: messageProps.message, userId: userId, shouldOverlapAvatarAndMessage: shouldOverlapAvatarAndMessage,
12334
12793
  /* @conditional-compile-remove(date-time-customization) */
12335
12794
  onDisplayDateTimeString: onDisplayDateTimeString, inlineImageOptions: inlineImageOptions,
12336
12795
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12337
- fileDownloadHandler: fileDownloadHandler,
12796
+ actionsForAttachment: actionsForAttachment,
12338
12797
  /* @conditional-compile-remove(mention) */
12339
12798
  mentionDisplayOptions: mentionOptions === null || mentionOptions === void 0 ? void 0 : mentionOptions.displayOptions })));
12340
12799
  }
12341
12800
  return React.createElement(React.Fragment, null);
12342
12801
  }, [
12343
- onRenderFileDownloadsMemo,
12344
- shouldOverlapAvatarAndMessage,
12802
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12803
+ onRenderAttachmentDownloadsMemo,
12345
12804
  userId,
12805
+ shouldOverlapAvatarAndMessage,
12346
12806
  /* @conditional-compile-remove(date-time-customization) */
12347
12807
  onDisplayDateTimeString,
12348
12808
  inlineImageOptions,
12349
12809
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12350
- fileDownloadHandler,
12810
+ actionsForAttachment,
12351
12811
  /* @conditional-compile-remove(mention) */
12352
- mentionOptions,
12353
- // eslint-disable-next-line react-hooks/exhaustive-deps
12354
- new Date().toDateString()
12812
+ mentionOptions === null || mentionOptions === void 0 ? void 0 : mentionOptions.displayOptions
12355
12813
  ]);
12356
12814
  const messageRenderer = React.useCallback((messageProps) => {
12357
12815
  return onRenderMessage === undefined
@@ -12621,7 +13079,9 @@ const MessageThreadWrapper = (props) => {
12621
13079
  /* @conditional-compile-remove(mention) */
12622
13080
  mentionOptions, inlineImageOptions,
12623
13081
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12624
- onRenderFileDownloads } = props;
13082
+ attachmentOptions,
13083
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
13084
+ onRenderAttachmentDownloads } = props;
12625
13085
  // We need this state to wait for one tick and scroll to bottom after messages have been initialized.
12626
13086
  // Otherwise chatScrollDivRef.current.clientHeight is wrong if we scroll to bottom before messages are initialized.
12627
13087
  const [chatMessagesInitialized, setChatMessagesInitialized] = React.useState(false);
@@ -12948,22 +13408,24 @@ const MessageThreadWrapper = (props) => {
12948
13408
  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 })))),
12949
13409
  React.createElement(LiveAnnouncer, null,
12950
13410
  React.createElement(FluentV9ThemeProvider, { v8Theme: theme },
12951
- latestDeletedMessageId && (React.createElement(Announcer$1, { key: latestDeletedMessageId, announcementString: deletedMessageAriaLabel, ariaLive: 'assertive' })),
12952
13411
  React.createElement(reactChat.Chat
12953
13412
  // styles?.chatContainer used in className and style prop as style prop can't handle CSS selectors
12954
13413
  , {
12955
13414
  // styles?.chatContainer used in className and style prop as style prop can't handle CSS selectors
12956
- className: reactComponents.mergeClasses(classes.root, react.mergeStyles(styles === null || styles === void 0 ? void 0 : styles.chatContainer)), ref: chatScrollDivRef, style: Object.assign({}, createStyleFromV8Style(styles === null || styles === void 0 ? void 0 : styles.chatContainer)) }, messagesToDisplay.map((message) => {
12957
- return (React.createElement(MemoChatMessageComponentWrapper, Object.assign({}, message, { userId: userId, key: message.key, styles: styles, shouldOverlapAvatarAndMessage: isNarrow, strings: strings, onRenderAvatar: onRenderAvatar, onRenderMessage: onRenderMessage, onRenderMessageStatus: onRenderMessageStatus, defaultStatusRenderer: defaultStatusRenderer, onActionButtonClick: onActionButtonClickMemo, readCount: readCountForHoveredIndicator, participantCount: participantCount,
12958
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12959
- fileDownloadHandler: props.fileDownloadHandler, inlineImageOptions: inlineImageOptions,
12960
- /* @conditional-compile-remove(date-time-customization) */
12961
- onDisplayDateTimeString: onDisplayDateTimeString,
12962
- /* @conditional-compile-remove(mention) */
12963
- mentionOptions: mentionOptions,
12964
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
12965
- onRenderFileDownloads: onRenderFileDownloads })));
12966
- }))))));
13415
+ className: reactComponents.mergeClasses(classes.root, react.mergeStyles(styles === null || styles === void 0 ? void 0 : styles.chatContainer)), ref: chatScrollDivRef, style: Object.assign({}, createStyleFromV8Style(styles === null || styles === void 0 ? void 0 : styles.chatContainer)) },
13416
+ latestDeletedMessageId && (React.createElement(Announcer$1, { key: latestDeletedMessageId, announcementString: deletedMessageAriaLabel, ariaLive: 'polite' })),
13417
+ messagesToDisplay.map((message) => {
13418
+ var _a;
13419
+ return (React.createElement(MemoChatMessageComponentWrapper, Object.assign({}, message, { userId: userId, key: message.key, styles: styles, shouldOverlapAvatarAndMessage: isNarrow, strings: strings, onRenderAvatar: onRenderAvatar, onRenderMessage: onRenderMessage, onRenderMessageStatus: onRenderMessageStatus, defaultStatusRenderer: defaultStatusRenderer, onActionButtonClick: onActionButtonClickMemo, readCount: readCountForHoveredIndicator, participantCount: participantCount,
13420
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
13421
+ actionsForAttachment: (_a = attachmentOptions === null || attachmentOptions === void 0 ? void 0 : attachmentOptions.downloadOptions) === null || _a === void 0 ? void 0 : _a.actionsForAttachment, inlineImageOptions: inlineImageOptions,
13422
+ /* @conditional-compile-remove(date-time-customization) */
13423
+ onDisplayDateTimeString: onDisplayDateTimeString,
13424
+ /* @conditional-compile-remove(mention) */
13425
+ mentionOptions: mentionOptions,
13426
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
13427
+ onRenderAttachmentDownloads: onRenderAttachmentDownloads })));
13428
+ }))))));
12967
13429
  };
12968
13430
  const MemoChatMessageComponentWrapper = React.memo((obj) => {
12969
13431
  return React.createElement(ChatMessageComponentWrapper, Object.assign({}, obj));
@@ -16779,7 +17241,7 @@ const OverflowGallery = (props) => {
16779
17241
  */
16780
17242
  const DefaultLayout = (props) => {
16781
17243
  const { remoteParticipants = [], localParticipant, dominantSpeakers, localVideoComponent, screenShareComponent, onRenderRemoteParticipant, styles, maxRemoteVideoStreams, parentWidth, parentHeight, pinnedParticipantUserIds = [], overflowGalleryPosition = 'horizontalBottom',
16782
- /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds } = props;
17244
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds = [] } = props;
16783
17245
  const isNarrow = parentWidth ? isNarrowWidth(parentWidth) : false;
16784
17246
  const isShort = parentHeight ? isShortHeight(parentHeight) : false;
16785
17247
  // This is for tracking the number of children in the first page of overflow gallery.
@@ -16821,7 +17283,7 @@ const DefaultLayout = (props) => {
16821
17283
  : (_b = p.videoStream) === null || _b === void 0 ? void 0 : _b.isAvailable);
16822
17284
  });
16823
17285
  if (localVideoComponent) {
16824
- if (screenShareComponent) {
17286
+ if (screenShareComponent || /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds.length > 0) {
16825
17287
  overflowGalleryTiles = [localVideoComponent].concat(overflowGalleryTiles);
16826
17288
  }
16827
17289
  else {
@@ -17855,7 +18317,8 @@ const LARGE_GALLERY_PARTICIPANT_CAP = 48;
17855
18317
  * @private
17856
18318
  */
17857
18319
  const LargeGalleryLayout = (props) => {
17858
- const { remoteParticipants = [], localParticipant, dominantSpeakers, localVideoComponent, screenShareComponent, onRenderRemoteParticipant, styles, maxRemoteVideoStreams, parentWidth, parentHeight, pinnedParticipantUserIds = [], overflowGalleryPosition = 'horizontalBottom' } = props;
18320
+ const { remoteParticipants = [], localParticipant, dominantSpeakers, localVideoComponent, screenShareComponent, onRenderRemoteParticipant, styles, maxRemoteVideoStreams, parentWidth, parentHeight, pinnedParticipantUserIds = [], overflowGalleryPosition = 'horizontalBottom',
18321
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds = [] } = props;
17859
18322
  const isNarrow = parentWidth ? isNarrowWidth(parentWidth) : false;
17860
18323
  const isShort = parentHeight ? isShortHeight(parentHeight) : false;
17861
18324
  const maxStreamsTrampoline = () => {
@@ -17877,7 +18340,8 @@ const LargeGalleryLayout = (props) => {
17877
18340
  ? childrenPerPage.current - ((pinnedParticipantUserIds.length + 1) % childrenPerPage.current)
17878
18341
  : childrenPerPage.current,
17879
18342
  pinnedParticipantUserIds,
17880
- /* @conditional-compile-remove(large-gallery) */ layout: 'largeGallery'
18343
+ /* @conditional-compile-remove(large-gallery) */ layout: 'largeGallery',
18344
+ /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds
17881
18345
  });
17882
18346
  let activeVideoStreams = 0;
17883
18347
  let gridTiles = gridParticipants.map((p) => {
@@ -17901,7 +18365,7 @@ const LargeGalleryLayout = (props) => {
17901
18365
  : (_b = p.videoStream) === null || _b === void 0 ? void 0 : _b.isAvailable);
17902
18366
  });
17903
18367
  if (localVideoComponent) {
17904
- if (screenShareComponent) {
18368
+ if (screenShareComponent || /* @conditional-compile-remove(spotlight) */ spotlightedParticipantUserIds.length > 0) {
17905
18369
  overflowGalleryTiles = [localVideoComponent].concat(overflowGalleryTiles);
17906
18370
  }
17907
18371
  else {
@@ -20157,8 +20621,8 @@ const DialpadButton = (props) => {
20157
20621
  const DialpadContainer = (props) => {
20158
20622
  var _a, _b;
20159
20623
  const theme = react.useTheme();
20160
- const { onSendDtmfTone, onClickDialpadButton, textFieldValue, onChange, showDeleteButton = true, longPressTrigger = 'mouseAndTouch', disableDtmfPlayback, dialpadMode = 'dialer' } = props;
20161
- const dtmfToneAudioContext = React.useRef(new AudioContext());
20624
+ const { onSendDtmfTone, onClickDialpadButton, textFieldValue, onChange, showDeleteButton = true, longPressTrigger = 'mouseAndTouch', disableDtmfPlayback, dialpadMode = 'dialer', dtmfAudioContext } = props;
20625
+ const dtmfToneAudioContext = React.useRef(dtmfAudioContext ? dtmfAudioContext : new AudioContext());
20162
20626
  const [plainTextValue, setPlainTextValue] = React.useState(textFieldValue !== null && textFieldValue !== void 0 ? textFieldValue : '');
20163
20627
  const plainTextValuePreviousRenderValue = React.useRef(plainTextValue);
20164
20628
  React.useEffect(() => {
@@ -22840,8 +23304,7 @@ const extractTeamsAttachmentsMetadata = (attachments) => {
22840
23304
  id: attachment.id,
22841
23305
  name: (_a = attachment.name) !== null && _a !== void 0 ? _a : '',
22842
23306
  extension: contentType !== null && contentType !== void 0 ? contentType : '',
22843
- url: extractAttachmentUrl(attachment),
22844
- payload: { teamsFileAttachment: 'true' }
23307
+ url: extractAttachmentUrl(attachment)
22845
23308
  });
22846
23309
  }
22847
23310
  });
@@ -24767,7 +25230,7 @@ const CallCompositeIcon = (props) => (React.createElement(react.FontIcon, Object
24767
25230
  */
24768
25231
  const CallWithChatCompositeIcon = (props) => (React.createElement(react.FontIcon, Object.assign({}, props)));
24769
25232
 
24770
- var call$k={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",notInvitedToRoomDetails:"You are not able to join this room because you do not have an invite.",notInvitedToRoomTitle:"Not invited to room",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",peoplePaneTitle:"People",peoplePaneMoreButtonAriaLabel:"More",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call {numberOfPeople}",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",startSpotlightMenuLabel:"Spotlight for everyone",addSpotlightMenuLabel:"Add spotlight",stopSpotlightMenuLabel:"Stop spotlighting",stopSpotlightOnSelfMenuLabel:"Exit spotlight",spotlightLimitReachedMenuTitle:"Spotlight limit reached",stopAllSpotlightMenuLabel:"Stop all spotlights",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"The room ID provided could not be found.",roomNotFoundTitle:"Room not found",roomNotValidDetails:"This room is not valid at this current time.",roomNotValidTitle:"Room not valid",inviteToRoomRemovedDetails:"Your invite to join this room was removed.",inviteToRoomRemovedTitle:"Invite to room removed",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"Captions Settings",captionsSettingsSpokenLanguageDropdownLabel:"Spoken language",captionsSettingsCaptionLanguageDropdownLabel:"Captions language",captionsSettingsSpokenLanguageDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsCaptionLanguageDropdownInfoText:"Captions will appear in this langugage.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",dismissModalAriaLabel:"Local and remote picture and picture, press enter to return to call",callRejectedTitle:"The call could not be completed",callRejectedMoreDetails:"The person you are trying to reach is unavailable. Please try again later.",callTimeoutTitle:"The call could not be completed",callTimeoutDetails:"The person you are trying to reach is unavailable. Please try again later.",callTimeoutBotTitle:"The call could not be completed",callTimeoutBotDetails:"The service that you are trying to reach is unavailable. Please try again later.",dtmfDialerButtonLabel:"Dialpad",dtmfDialerButtonTooltipOn:"Show dialpad",dtmfDialerButtonTooltipOff:"Hide dialpad",dtmfDialerMoreButtonLabelOn:"Show dialpad",dtmfDialerMoreButtonLabelOff:"Hide dialpad",spokenLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionLanguageStrings:{ar:"Arabic",da:"Danish",de:"German",en:"English",es:"Spanish",fi:"Finnish","fr-ca":"French - Canada",fr:"French - France",hi:"Hindi",it:"Italian",ja:"Japanese",ko:"Korean",nb:"Norwegian (Bokmål)",nl:"Dutch",pl:"Polish",pt:"Portuguese - Brazil",ru:"Russian",sv:"Swedish","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)",cs:"Czech","pt-pt":"Portuguese - Portugal",tr:"Turkish",vi:"Vietnamese",th:"Thai",he:"Hebrew",cy:"Welsh",uk:"Ukrainian",el:"Greek",hu:"Hungarian",ro:"Romanian",sk:"Slovak"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"View",moreButtonGalleryPositionToggleLabel:"Move gallery to top",moreButtonGallerySpeakerLayoutLabel:"Speaker",moreButtonGalleryFloatingLocalLayoutLabel:"Dynamic",moreButtonGalleryDefaultLayoutLabel:"Gallery view",moreButtonGalleryFocusedContentLayoutLabel:"Focus on content",moreButtonLargeGalleryDefaultLayoutLabel:"Large Gallery",capabilityChangedNotification:{turnVideoOn:{lostDueToMeetingOption:"Your camera has been disabled. You can no longer share video.",grantedDueToMeetingOption:"Your camera has been enabled. Turn it on if you'd like to share video."},unmuteMic:{lostDueToMeetingOption:"Your mic has been disabled. You can no longer unmute.",grantedDueToMeetingOption:"Your mic has been enabled. Unmute if you'd like to speak."},shareScreen:{lostDueToRoleChangeToAttendee:"Your role has been changed. Some actions, like sharing content, won't be available to you.",grantedDueToRoleChangeToPresenter:"You're a presenter. You can share content and facilitate the meeting."}},surveyTitle:"Help us improve",starSurveyHelperText:"How was the quality of the call?",starSurveyOneStarText:"The quality was bad.",starSurveyTwoStarText:"The quality was poor.",starSurveyThreeStarText:"The quality was good.",starSurveyFourStarText:"The quality was great.",starSurveyFiveStarText:"The quality was excellent.",surveyConfirmButtonLabel:"Send Feedback",starRatingAriaLabel:"Select {0} of {1} stars",surveySkipButtonLabel:"Skip",tagsSurveyQuestion:"What could have been better?",tagsSurveyTextFieldDefaultText:"Other, please specify",tagsSurveyHelperText:"Check any issues you experienced",surveyTextboxDefaultText:"Other, please specify",endOfSurveyText:"Thank you for your feedback!",surveyIssues:{overallRating:{callCannotJoin:"I could not join call",callCannotInvite:"I could not invite others into the call",hadToRejoin:"I had to rejoin the call",callEndedUnexpectedly:"Call ended for me unexpectedly",otherIssues:"I was having other issues with the call"},audioRating:{noLocalAudio:"The other side could not hear any sound",noRemoteAudio:"I could not hear any sound",echo:"I heard echos on the call",audioNoise:"I heard noise on the call",lowVolume:"Volume was low",audioStoppedUnexpectedly:"Audio stopped unexpectedly",distortedSpeech:"Audio was distorted",audioInterruption:"Audio was interrupted",otherIssues:"I was having other audio issues in this call"},videoRating:{noVideoReceived:"I could not see any video",noVideoSent:"Others could not see me",lowQuality:"Video quality was low",freezes:"Video frozen",stoppedUnexpectedly:"Video stopped unexpectedly",darkVideoReceived:"I can only see dark screens when others turn on their camera",audioVideoOutOfSync:"Audio and Video was out of sync",otherIssues:"I was having other video issues in this call"},screenshareRating:{noContentLocal:"Other people could not see my screenshare",noContentRemote:"I could not see other people's screenshare",cannotPresent:"I could not present my screen",lowQuality:"Screen share quality was low",freezes:"Screen share frozen",stoppedUnexpectedly:"Screen share stopped unexpectedly",largeDelay:"Screen share has a large delay",otherIssues:"I was having other screen share issues in this call"}},SurveyIssuesHeadingStrings:{overallRating:"Overall",audioRating:"Audio",videoRating:"Video",screenshareRating:"Presenting"},spotlightPrompt:{startSpotlightHeading:"Spotlight for everyone?",startSpotlightText:"You'll highlight this video for everyone in the meeting.",startSpotlightOnSelfText:"You'll highlight your video for everyone in the meeting.",startSpotlightConfirmButtonLabel:"Spotlight for everyone",startSpotlightCancelButtonLabel:"Cancel",stopSpotlightHeading:"Stop spotlighting this video?",stopSpotlightOnSelfHeading:"Exit spotlight?",stopAllSpotlightHeading:"Stop spotlighting all videos?",stopSpotlightText:"This video will no longer be highlighted for everyone in the meeting.",stopSpotlightOnSelfText:"Your video will no longer be highlighted for everyone in the meeting.",stopAllSpotlightText:"The videos will no longer be highlighted for everyone in the meeting.",stopSpotlightConfirmButtonLabel:"Stop spotlighting",stopSpotlightOnSelfConfirmButtonLabel:"Exit spotlight",stopSpotlightCancelButtonLabel:"Cancel"},exitSpotlightButtonLabel:"Exit spotlight",exitSpotlightButtonTooltip:"Exit spotlight"};var chat$k={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$k={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",moreDrawerCaptionLanguageMenuTitle:"Caption language",moreDrawerGalleryOptionsMenuTitle:"Gallery options",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_US = {call:call$k,chat:chat$k,callWithChat:callWithChat$k};
25233
+ var call$k={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",notInvitedToRoomDetails:"You are not able to join this room because you do not have an invite.",notInvitedToRoomTitle:"Not invited to room",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",peoplePaneTitle:"People",peoplePaneMoreButtonAriaLabel:"More",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call {numberOfPeople}",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",startSpotlightMenuLabel:"Spotlight for everyone",addSpotlightMenuLabel:"Add spotlight",stopSpotlightMenuLabel:"Stop spotlighting",stopSpotlightOnSelfMenuLabel:"Exit spotlight",spotlightLimitReachedMenuTitle:"Spotlight limit reached",stopAllSpotlightMenuLabel:"Stop all spotlights",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"The room ID provided could not be found.",roomNotFoundTitle:"Room not found",roomNotValidDetails:"This room is not valid at this current time.",roomNotValidTitle:"Room not valid",inviteToRoomRemovedDetails:"Your invite to join this room was removed.",inviteToRoomRemovedTitle:"Invite to room removed",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"Captions Settings",captionsSettingsSpokenLanguageDropdownLabel:"Spoken language",captionsSettingsCaptionLanguageDropdownLabel:"Captions language",captionsSettingsSpokenLanguageDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsCaptionLanguageDropdownInfoText:"Captions will appear in this langugage.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",dismissModalAriaLabel:"Local and remote picture and picture, press enter to return to call",callRejectedTitle:"The call could not be completed",callRejectedMoreDetails:"The person you are trying to reach is unavailable. Please try again later.",callTimeoutTitle:"The call could not be completed",callTimeoutDetails:"The person you are trying to reach is unavailable. Please try again later.",callTimeoutBotTitle:"The call could not be completed",callTimeoutBotDetails:"The service that you are trying to reach is unavailable. Please try again later.",dtmfDialerButtonLabel:"Dialpad",dtmfDialerButtonTooltipOn:"Show dialpad",dtmfDialerButtonTooltipOff:"Hide dialpad",dtmfDialerMoreButtonLabelOn:"Show dialpad",dtmfDialerMoreButtonLabelOff:"Hide dialpad",spokenLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionLanguageStrings:{ar:"Arabic",da:"Danish",de:"German",en:"English",es:"Spanish",fi:"Finnish","fr-ca":"French - Canada",fr:"French - France",hi:"Hindi",it:"Italian",ja:"Japanese",ko:"Korean",nb:"Norwegian (Bokmål)",nl:"Dutch",pl:"Polish",pt:"Portuguese - Brazil",ru:"Russian",sv:"Swedish","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)",cs:"Czech","pt-pt":"Portuguese - Portugal",tr:"Turkish",vi:"Vietnamese",th:"Thai",he:"Hebrew",cy:"Welsh",uk:"Ukrainian",el:"Greek",hu:"Hungarian",ro:"Romanian",sk:"Slovak"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"View",moreButtonGalleryPositionToggleLabel:"Move gallery to top",moreButtonGallerySpeakerLayoutLabel:"Speaker",moreButtonGalleryFloatingLocalLayoutLabel:"Dynamic",moreButtonGalleryDefaultLayoutLabel:"Gallery view",moreButtonGalleryFocusedContentLayoutLabel:"Focus on content",moreButtonLargeGalleryDefaultLayoutLabel:"Large Gallery",capabilityChangedNotification:{turnVideoOn:{lostDueToMeetingOption:"Your camera has been disabled. You can no longer share video.",grantedDueToMeetingOption:"Your camera has been enabled. Turn it on if you'd like to share video."},unmuteMic:{lostDueToMeetingOption:"Your mic has been disabled. You can no longer unmute.",grantedDueToMeetingOption:"Your mic has been enabled. Unmute if you'd like to speak."},shareScreen:{lostDueToRoleChangeToAttendee:"Your role has been changed. Some actions, like sharing content, won't be available to you.",grantedDueToRoleChangeToPresenter:"You're a presenter. You can share content and facilitate the meeting."}},surveyTitle:"Help us improve",starSurveyHelperText:"How was the quality of the call?",starSurveyOneStarText:"The quality was bad.",starSurveyTwoStarText:"The quality was poor.",starSurveyThreeStarText:"The quality was good.",starSurveyFourStarText:"The quality was great.",starSurveyFiveStarText:"The quality was excellent.",surveyConfirmButtonLabel:"Send Feedback",starRatingAriaLabel:"Select {0} of {1} stars",surveySkipButtonLabel:"Skip",tagsSurveyQuestion:"What could have been better?",tagsSurveyTextFieldDefaultText:"Other, please specify",tagsSurveyHelperText:"Check any issues you experienced",surveyTextboxDefaultText:"Other, please specify",endOfSurveyText:"Thank you for your feedback!",surveyIssues:{overallRating:{callCannotJoin:"I could not join call",callCannotInvite:"I could not invite others into the call",hadToRejoin:"I had to rejoin the call",callEndedUnexpectedly:"Call ended for me unexpectedly",otherIssues:"I was having other issues with the call"},audioRating:{noLocalAudio:"The other side could not hear any sound",noRemoteAudio:"I could not hear any sound",echo:"I heard echos on the call",audioNoise:"I heard noise on the call",lowVolume:"Volume was low",audioStoppedUnexpectedly:"Audio stopped unexpectedly",distortedSpeech:"Audio was distorted",audioInterruption:"Audio was interrupted",otherIssues:"I was having other audio issues in this call"},videoRating:{noVideoReceived:"I could not see any video",noVideoSent:"Others could not see me",lowQuality:"Video quality was low",freezes:"Video frozen",stoppedUnexpectedly:"Video stopped unexpectedly",darkVideoReceived:"I can only see dark screens when others turn on their camera",audioVideoOutOfSync:"Audio and Video was out of sync",otherIssues:"I was having other video issues in this call"},screenshareRating:{noContentLocal:"Other people could not see my screenshare",noContentRemote:"I could not see other people's screenshare",cannotPresent:"I could not present my screen",lowQuality:"Screen share quality was low",freezes:"Screen share frozen",stoppedUnexpectedly:"Screen share stopped unexpectedly",largeDelay:"Screen share has a large delay",otherIssues:"I was having other screen share issues in this call"}},SurveyIssuesHeadingStrings:{overallRating:"Overall",audioRating:"Audio",videoRating:"Video",screenshareRating:"Presenting"},spotlightPrompt:{startSpotlightHeading:"Spotlight for everyone?",startSpotlightText:"You'll highlight this video for everyone in the meeting.",startSpotlightOnSelfText:"You'll highlight your video for everyone in the meeting.",startSpotlightConfirmButtonLabel:"Spotlight for everyone",startSpotlightCancelButtonLabel:"Cancel",stopSpotlightHeading:"Stop spotlighting this video?",stopSpotlightOnSelfHeading:"Exit spotlight?",stopAllSpotlightHeading:"Stop spotlighting all videos?",stopSpotlightText:"This video will no longer be highlighted for everyone in the meeting.",stopSpotlightOnSelfText:"Your video will no longer be highlighted for everyone in the meeting.",stopAllSpotlightText:"The videos will no longer be highlighted for everyone in the meeting.",stopSpotlightConfirmButtonLabel:"Stop spotlighting",stopSpotlightOnSelfConfirmButtonLabel:"Exit spotlight",stopSpotlightCancelButtonLabel:"Cancel"},exitSpotlightButtonLabel:"Exit spotlight",exitSpotlightButtonTooltip:"Exit spotlight",invalidMeetingIdentifier:"Invalid meeting ID or passcode"};var chat$k={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$k={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",moreDrawerCaptionLanguageMenuTitle:"Caption language",moreDrawerGalleryOptionsMenuTitle:"Gallery options",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_US = {call:call$k,chat:chat$k,callWithChat:callWithChat$k};
24771
25234
 
24772
25235
  // Copyright (c) Microsoft Corporation.
24773
25236
  // Licensed under the MIT License.
@@ -24838,7 +25301,7 @@ const FileUploadButton = (props) => {
24838
25301
  } },
24839
25302
  React.createElement(react.IconButton, { className: iconButtonClassName, ariaLabel: uploadFileButtonStringTrampoline() },
24840
25303
  React.createElement(SendBoxAttachFileIconTrampoline, null))),
24841
- React.createElement("input", { ref: inputRef, hidden: true, multiple: multiple, accept: accept, type: "file", onClick: (e) => {
25304
+ React.createElement("input", { ref: inputRef, hidden: true, multiple: multiple !== null && multiple !== void 0 ? multiple : true, accept: accept !== null && accept !== void 0 ? accept : '*', type: "file", onClick: (e) => {
24842
25305
  // To ensure that `onChange` is fired even if the same file is picked again.
24843
25306
  e.currentTarget.value = '';
24844
25307
  }, onChange: (e) => {
@@ -25444,6 +25907,28 @@ const _createAzureCommunicationChatAdapterInner = (endpoint_1, userId_1, display
25444
25907
  const adapter = yield createAzureCommunicationChatAdapterFromClient(chatClient, chatThreadClient);
25445
25908
  return adapter;
25446
25909
  });
25910
+ /**
25911
+ * This inner function to create ChatAdapterPromise in case when threadID is not avaialble.
25912
+ * ThreadId is a promise to allow for lazy initialization of the adapter.
25913
+ * @internal
25914
+ */
25915
+ const _createLazyAzureCommunicationChatAdapterInner = (endpoint_2, userId_2, displayName_2, credential_2, threadId_2, ...args_2) => __awaiter$n(void 0, [endpoint_2, userId_2, displayName_2, credential_2, threadId_2, ...args_2], void 0, function* (endpoint, userId, displayName, credential, threadId, telemetryImplementationHint = 'Chat') {
25916
+ if (!_isValidIdentifier(userId)) {
25917
+ throw new Error('Provided userId is invalid. Please provide valid identifier object.');
25918
+ }
25919
+ const chatClient = _createStatefulChatClientInner({
25920
+ userId,
25921
+ displayName,
25922
+ endpoint,
25923
+ credential
25924
+ }, undefined, telemetryImplementationHint);
25925
+ return threadId.then((threadId) => __awaiter$n(void 0, void 0, void 0, function* () {
25926
+ const chatThreadClient = yield chatClient.getChatThreadClient(threadId);
25927
+ yield chatClient.startRealtimeNotifications();
25928
+ const adapter = yield createAzureCommunicationChatAdapterFromClient(chatClient, chatThreadClient);
25929
+ return adapter;
25930
+ }));
25931
+ });
25447
25932
  /**
25448
25933
  * A custom React hook to simplify the creation of {@link ChatAdapter}.
25449
25934
  *
@@ -26203,14 +26688,14 @@ const ChatScreenPeoplePane = (props) => {
26203
26688
  /**
26204
26689
  * @private
26205
26690
  */
26206
- const FileDownloadErrorBar = (props) => {
26207
- const { fileDownloadErrorMessage, onDismissDownloadErrorMessage } = props;
26691
+ const AttachmentDownloadErrorBar = (props) => {
26692
+ const { attachmentDownloadErrorMessage, onDismissDownloadErrorMessage } = props;
26208
26693
  const messageBarIconProps = { iconName: 'ProtectedDocument' };
26209
- if (fileDownloadErrorMessage !== '') {
26694
+ if (attachmentDownloadErrorMessage !== '') {
26210
26695
  return (React.createElement(react.Stack, { horizontal: true, horizontalAlign: "space-between", verticalAlign: "center" },
26211
26696
  React.createElement(react.MessageBar, { messageBarType: react.MessageBarType.warning, onDismiss: () => {
26212
26697
  onDismissDownloadErrorMessage();
26213
- }, messageBarIconProps: messageBarIconProps }, fileDownloadErrorMessage)));
26698
+ }, messageBarIconProps: messageBarIconProps }, attachmentDownloadErrorMessage)));
26214
26699
  }
26215
26700
  else {
26216
26701
  return React.createElement(React.Fragment, null);
@@ -26253,7 +26738,7 @@ const useSelector$2 = (selector, selectorProps) => {
26253
26738
  // Copyright (c) Microsoft Corporation.
26254
26739
  // Licensed under the MIT License.
26255
26740
  /* @conditional-compile-remove(rich-text-editor) */
26256
- const RichTextSendBoxWrapper = React.lazy(() => Promise.resolve().then(function () { return require('./RichTextSendBoxWrapper-Yty3fOoA.js'); }).then((module) => ({ default: module.RichTextSendBoxWrapper })));
26741
+ const RichTextSendBoxWrapper = React.lazy(() => Promise.resolve().then(function () { return require('./RichTextSendBoxWrapper-CH6WvEGZ.js'); }).then((module) => ({ default: module.RichTextSendBoxWrapper })));
26257
26742
  /**
26258
26743
  * @private
26259
26744
  */
@@ -26372,9 +26857,11 @@ const ChatScreen = (props) => {
26372
26857
  fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.uploadHandler(userId, fileUploads);
26373
26858
  }, [adapter, fileSharing, userId]);
26374
26859
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
26375
- const onRenderFileDownloads = React.useCallback((userId, message) => (React.createElement(_AttachmentDownloadCards, { userId: userId, fileMetadata: message.files || [], downloadHandler: fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.downloadHandler, onDownloadErrorMessage: (errorMessage) => {
26860
+ const onRenderAttachmentDownloads = React.useCallback((userId, message) => (React.createElement(_AttachmentDownloadCards, { attachments: message.files, message: message,
26861
+ // temp walkaround until upload is refactored
26862
+ actionsForAttachment: fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.actionsForAttachment, onActionHandlerFailed: (errorMessage) => {
26376
26863
  setDownloadErrorMessage(errorMessage);
26377
- } })), [fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.downloadHandler]);
26864
+ } })), [fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.actionsForAttachment]);
26378
26865
  const onInlineImageClicked = React.useCallback((attachmentId, messageId) => {
26379
26866
  var _a, _b;
26380
26867
  const message = adapter.getState().thread.chatMessages[messageId];
@@ -26463,10 +26950,11 @@ const ChatScreen = (props) => {
26463
26950
  }
26464
26951
  }, [overlayImageItem === null || overlayImageItem === void 0 ? void 0 : overlayImageItem.attachmentId]);
26465
26952
  const AttachFileButton = React.useCallback(() => {
26953
+ var _a, _b;
26466
26954
  if (!(fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.uploadHandler)) {
26467
26955
  return null;
26468
26956
  }
26469
- return (React.createElement(FileUploadButtonWrapper, { accept: fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.accept, multiple: fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.multiple, onChange: fileUploadButtonOnChange }));
26957
+ return (React.createElement(FileUploadButtonWrapper, { accept: (_a = fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.accept) !== null && _a !== void 0 ? _a : '*', multiple: (_b = fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.multiple) !== null && _b !== void 0 ? _b : true, onChange: fileUploadButtonOnChange }));
26470
26958
  }, [fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.accept, fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.multiple, fileSharing === null || fileSharing === void 0 ? void 0 : fileSharing.uploadHandler, fileUploadButtonOnChange]);
26471
26959
  return (React.createElement(react.Stack, { className: chatContainer, grow: true },
26472
26960
  (options === null || options === void 0 ? void 0 : options.topic) !== false && React.createElement(ChatHeader, Object.assign({}, headerProps)),
@@ -26474,12 +26962,12 @@ const ChatScreen = (props) => {
26474
26962
  React.createElement(react.Stack, { className: chatWrapper, grow: true },
26475
26963
  (options === null || options === void 0 ? void 0 : options.errorBar) !== false && React.createElement(ErrorBar, Object.assign({}, errorBarProps)),
26476
26964
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
26477
- React.createElement(FileDownloadErrorBar, { onDismissDownloadErrorMessage: React.useCallback(() => {
26965
+ React.createElement(AttachmentDownloadErrorBar, { onDismissDownloadErrorMessage: React.useCallback(() => {
26478
26966
  setDownloadErrorMessage('');
26479
- }, []), fileDownloadErrorMessage: downloadErrorMessage || '' }),
26967
+ }, []), attachmentDownloadErrorMessage: downloadErrorMessage || '' }),
26480
26968
  React.createElement(MessageThread, Object.assign({}, messageThreadProps, { onRenderAvatar: onRenderAvatarCallback, onRenderMessage: onRenderMessage,
26481
26969
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
26482
- onRenderFileDownloads: onRenderFileDownloads, inlineImageOptions: inlineImageOptions, numberOfChatMessagesToReload: defaultNumberOfChatMessagesToReload, styles: messageThreadStyles })),
26970
+ onRenderAttachmentDownloads: onRenderAttachmentDownloads, inlineImageOptions: inlineImageOptions, numberOfChatMessagesToReload: defaultNumberOfChatMessagesToReload, styles: messageThreadStyles })),
26483
26971
  React.createElement(react.Stack, { className: react.mergeStyles(sendboxContainerStyles) },
26484
26972
  React.createElement("div", { className: react.mergeStyles(typingIndicatorContainerStyles) }, onRenderTypingIndicator ? (onRenderTypingIndicator(typingIndicatorProps.typingUsers)) : (React.createElement(TypingIndicator, Object.assign({}, typingIndicatorProps, { styles: typingIndicatorStyles })))),
26485
26973
  React.createElement(react.Stack, { horizontal: formFactor === 'mobile' },
@@ -26706,6 +27194,8 @@ const ACCESS_DENIED_TEAMS_MEETING_SUB_CODE = 5854;
26706
27194
  const REMOTE_PSTN_USER_HUNG_UP = 560000;
26707
27195
  const REMOVED_FROM_CALL_SUB_CODES = [5000, 5300, REMOTE_PSTN_USER_HUNG_UP];
26708
27196
  const CALL_REJECTED_CODE$1 = 603;
27197
+ /* @conditional-compile-remove(meeting-id) */
27198
+ const INVALID_MEETING_IDENTIFIER = 5751;
26709
27199
  /** @private */
26710
27200
  const ROOM_NOT_FOUND_SUB_CODE = 5732;
26711
27201
  /** @private */
@@ -26797,7 +27287,7 @@ const getCallEndReason = (call) => {
26797
27287
  * @private
26798
27288
  */
26799
27289
  const getEndedCallPageProps = (locale, endedCall) => {
26800
- var _a, _b, _c, _d, _e;
27290
+ var _a, _b, _c, _d, _e, _f;
26801
27291
  let title = locale.strings.call.leftCallTitle;
26802
27292
  let moreDetails = locale.strings.call.leftCallMoreDetails;
26803
27293
  let disableStartCallButton = false;
@@ -26893,6 +27383,16 @@ const getEndedCallPageProps = (locale, endedCall) => {
26893
27383
  }
26894
27384
  break;
26895
27385
  }
27386
+ /* @conditional-compile-remove(meeting-id) */
27387
+ switch ((_f = endedCall === null || endedCall === void 0 ? void 0 : endedCall.callEndReason) === null || _f === void 0 ? void 0 : _f.subCode) {
27388
+ case INVALID_MEETING_IDENTIFIER:
27389
+ if (locale.strings.call.callRejectedTitle) {
27390
+ title = locale.strings.call.callRejectedTitle;
27391
+ moreDetails = locale.strings.call.invalidMeetingIdentifier;
27392
+ disableStartCallButton = true;
27393
+ }
27394
+ break;
27395
+ }
26896
27396
  return { title, moreDetails, disableStartCallButton, iconName };
26897
27397
  };
26898
27398
  /**
@@ -30505,7 +31005,6 @@ var __awaiter$f = (window && window.__awaiter) || function (thisArg, _arguments,
30505
31005
  * @private
30506
31006
  */
30507
31007
  const PeoplePaneContent = (props) => {
30508
- var _a, _b;
30509
31008
  const { inviteLink, onFetchParticipantMenuItems, setDrawerMenuItems,
30510
31009
  /* @conditional-compile-remove(spotlight) */ participantListHeadingMoreButtonProps } = props;
30511
31010
  const adapter = useAdapter();
@@ -30526,7 +31025,7 @@ const PeoplePaneContent = (props) => {
30526
31025
  /* @conditional-compile-remove(PSTN-calls) */
30527
31026
  const alternateCallerId = adapter.getState().alternateCallerId;
30528
31027
  const participantListDefaultProps = usePropsFor$1(ParticipantList$k);
30529
- const removeButtonAllowed = (_b = (_a = adapter.getState().call) === null || _a === void 0 ? void 0 : _a.capabilitiesFeature) === null || _b === void 0 ? void 0 : _b.capabilities.removeParticipant.isPresent;
31028
+ const removeButtonAllowed = canRemoveParticipants(adapter);
30530
31029
  const setDrawerMenuItemsForParticipant = React.useMemo(() => {
30531
31030
  return (participant) => {
30532
31031
  if (participant) {
@@ -30608,6 +31107,16 @@ const createDefaultContextualMenuItems = (participant, strings, onRemoveParticip
30608
31107
  }
30609
31108
  return menuItems;
30610
31109
  };
31110
+ const canRemoveParticipants = (adapter) => {
31111
+ var _a;
31112
+ // TODO: We should be using the removeParticipant capability here but there is an SDK bug for Rooms where a
31113
+ // Presenter's removeParticipant capability is {isPresent: false, reason: 'CapabilityNotApplicableForTheCallType'}.
31114
+ // But a Presenter in Rooms should be able to remove participants according to the following documentation
31115
+ // https://learn.microsoft.com/en-us/azure/communication-services/concepts/rooms/room-concept#predefined-participant-roles-and-permissions
31116
+ const role = (_a = adapter.getState().call) === null || _a === void 0 ? void 0 : _a.role;
31117
+ const canRemove = role === 'Presenter' || role === 'Unknown' || role === undefined;
31118
+ return canRemove;
31119
+ };
30611
31120
 
30612
31121
  // Copyright (c) Microsoft Corporation.
30613
31122
  // Licensed under the MIT License.
@@ -32249,7 +32758,7 @@ const DtmfDialpadPageContent = (props) => {
32249
32758
  React.createElement(react.Text, { style: { margin: 'auto' } }, calleeName && calleeName !== 'Unnamed participant' ? calleeName === null || calleeName === void 0 ? void 0 : calleeName.toString() : ''),
32250
32759
  React.createElement(Dialpad, { onSendDtmfTone: (tone) => __awaiter$c(void 0, void 0, void 0, function* () {
32251
32760
  yield adapter.sendDtmfTone(tone);
32252
- }), longPressTrigger: props.mobileView ? 'touch' : 'mouseAndTouch', dialpadMode: 'dtmf' }))));
32761
+ }), longPressTrigger: props.mobileView ? 'touch' : 'mouseAndTouch', dialpadMode: 'dtmf', dtmfAudioContext: props.compositeAudioContext }))));
32253
32762
  };
32254
32763
  const DtmfDialerContentTimer = () => {
32255
32764
  const [time, setTime] = React.useState(0);
@@ -32274,7 +32783,7 @@ const DtmfDialerContentTimer = () => {
32274
32783
  */
32275
32784
  const DtmfDialpadPage = (props) => {
32276
32785
  const adapter = useAdapter();
32277
- return React.createElement(DtmfDialpadPageContent, { adapter: adapter, mobileView: props.mobileView });
32786
+ return React.createElement(DtmfDialpadPageContent, Object.assign({ adapter: adapter }, props, { mobileView: props.mobileView }));
32278
32787
  };
32279
32788
 
32280
32789
  // Copyright (c) Microsoft Corporation.
@@ -32320,7 +32829,7 @@ const buttonTextStyles = { label: { fontSize: '0.875rem' } };
32320
32829
  */
32321
32830
  const CallPage = (props) => {
32322
32831
  var _a;
32323
- const { callInvitationURL, onFetchAvatarPersonaData, onFetchParticipantMenuItems, options, mobileView, galleryLayout = 'floatingLocalVideo', onUserSetGalleryLayoutChange, userSetOverflowGalleryPosition = 'Responsive', onSetUserSetOverflowGalleryPosition, onCloseChatPane, pinnedParticipants, setPinnedParticipants } = props;
32832
+ const { callInvitationURL, onFetchAvatarPersonaData, onFetchParticipantMenuItems, options, mobileView, galleryLayout = 'floatingLocalVideo', onUserSetGalleryLayoutChange, userSetOverflowGalleryPosition = 'Responsive', onSetUserSetOverflowGalleryPosition, onCloseChatPane, pinnedParticipants, setPinnedParticipants, compositeAudioContext } = props;
32324
32833
  // To use useProps to get these states, we need to create another file wrapping Call,
32325
32834
  // It seems unnecessary in this case, so we get the updated states using this approach.
32326
32835
  const { callStatus } = useSelector$1(callStatusSelector);
@@ -32347,7 +32856,7 @@ const CallPage = (props) => {
32347
32856
  if (dtmfDialerPresent) {
32348
32857
  return (React.createElement(DtmfDialpadPage, { mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: props.updateSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, latestErrors: props.latestErrors, onDismissError: props.onDismissError,
32349
32858
  /* @conditional-compile-remove(capabilities) */
32350
- capabilitiesChangedNotificationBarProps: props.capabilitiesChangedNotificationBarProps, onSetDialpadPage: () => setDtmfDialerPresent(!dtmfDialerPresent), dtmfDialerPresent: dtmfDialerPresent }));
32859
+ capabilitiesChangedNotificationBarProps: props.capabilitiesChangedNotificationBarProps, onSetDialpadPage: () => setDtmfDialerPresent(!dtmfDialerPresent), dtmfDialerPresent: dtmfDialerPresent, compositeAudioContext: compositeAudioContext }));
32351
32860
  }
32352
32861
  else {
32353
32862
  return (React.createElement(MediaGallery, Object.assign({ isMobile: mobileView }, mediaGalleryProps, mediaGalleryHandlers, { onFetchAvatarPersonaData: onFetchAvatarPersonaData, remoteVideoTileMenuOptions: options === null || options === void 0 ? void 0 : options.remoteVideoTileMenuOptions, drawerMenuHostId: drawerMenuHostId, localVideoTileOptions: options === null || options === void 0 ? void 0 : options.localVideoTile, userSetOverflowGalleryPosition: userSetOverflowGalleryPosition, userSetGalleryLayout: galleryLayout, pinnedParticipants: pinnedParticipants, setPinnedParticipants: setPinnedParticipants,
@@ -32459,6 +32968,18 @@ const optionIconStyles = react.mergeStyles({
32459
32968
  marginRight: '8px',
32460
32969
  verticalAlign: 'text-top'
32461
32970
  });
32971
+ /**
32972
+ * @private
32973
+ */
32974
+ const deviceSelectionContainerStyles = {
32975
+ root: {
32976
+ /**
32977
+ * this is to move the device selection container above the larger border
32978
+ * container that is occluding messages
32979
+ */
32980
+ zIndex: 1
32981
+ }
32982
+ };
32462
32983
 
32463
32984
  // Copyright (c) Microsoft Corporation.
32464
32985
  // Licensed under the MIT License.
@@ -32559,7 +33080,7 @@ const configurationSectionStyle = {
32559
33080
  */
32560
33081
  const selectionContainerStyle = (theme, noSpeakerDropdownShown) => react.mergeStyles({
32561
33082
  width: '100%',
32562
- height: noSpeakerDropdownShown ? 'auto' : `${CONFIGURATION_PAGE_SECTION_HEIGHT_REM}rem`,
33083
+ minHeight: noSpeakerDropdownShown ? 'auto' : `${CONFIGURATION_PAGE_SECTION_HEIGHT_REM}rem`,
32563
33084
  padding: '1rem',
32564
33085
  borderRadius: theme.effects.roundedCorner6,
32565
33086
  border: `0.0625rem solid ${theme.palette.neutralLight}`,
@@ -32689,7 +33210,7 @@ const cameraAndVideoEffectsContainerStyleDesktop = {
32689
33210
  /**
32690
33211
  * @private
32691
33212
  */
32692
- const effectsButtonStyles = (theme) => {
33213
+ const effectsButtonStyles = (theme, disabled) => {
32693
33214
  return {
32694
33215
  root: {
32695
33216
  background: 'transparent',
@@ -32697,26 +33218,41 @@ const effectsButtonStyles = (theme) => {
32697
33218
  color: theme.palette.themePrimary,
32698
33219
  // Top and bottom padding needs to be 5px to match the label padding
32699
33220
  padding: '5px 0.25rem',
32700
- ':hover, :focus': {
32701
- color: theme.palette.themePrimary
32702
- },
33221
+ ':hover, :focus': disabled
33222
+ ? {}
33223
+ : {
33224
+ color: theme.palette.themePrimary
33225
+ },
32703
33226
  svg: {
32704
33227
  height: '1rem',
32705
33228
  width: '1rem'
32706
33229
  }
32707
33230
  },
32708
- rootChecked: {
32709
- color: theme.palette.themePrimary
32710
- },
32711
- rootHovered: {
32712
- color: theme.palette.themePrimary
32713
- },
32714
- rootPressed: {
32715
- color: theme.palette.themePrimary
32716
- },
32717
- rootFocused: {
32718
- color: theme.palette.themePrimary
32719
- }
33231
+ labelHovered: disabled
33232
+ ? {}
33233
+ : {
33234
+ color: theme.palette.themePrimary
33235
+ },
33236
+ rootChecked: disabled
33237
+ ? {}
33238
+ : {
33239
+ color: theme.palette.themePrimary
33240
+ },
33241
+ rootHovered: disabled
33242
+ ? {}
33243
+ : {
33244
+ color: theme.palette.themePrimary
33245
+ },
33246
+ rootPressed: disabled
33247
+ ? {}
33248
+ : {
33249
+ color: theme.palette.themePrimary
33250
+ },
33251
+ rootFocused: disabled
33252
+ ? {}
33253
+ : {
33254
+ color: theme.palette.themePrimary
33255
+ }
32720
33256
  };
32721
33257
  };
32722
33258
  /** @private */
@@ -32886,11 +33422,11 @@ const LocalDeviceSettings = (props) => {
32886
33422
  }
32887
33423
  return speakerDropdown;
32888
33424
  };
32889
- return (React.createElement(react.Stack, { "data-ui-id": "call-composite-device-settings", tokens: mainStackTokens },
33425
+ return (React.createElement(react.Stack, { "data-ui-id": "call-composite-device-settings", tokens: mainStackTokens, styles: deviceSelectionContainerStyles },
32890
33426
  roleCanUseCamera && (React.createElement(react.Stack, null,
32891
33427
  React.createElement(react.Stack, { horizontal: true, horizontalAlign: "space-between", styles: cameraAndVideoEffectsContainerStyleDesktop },
32892
33428
  React.createElement(react.Label, { id: 'call-composite-local-camera-settings-label', className: react.mergeStyles(dropDownStyles(theme).label), disabled: !cameraPermissionGranted }, cameraLabel),
32893
- onResolveVideoEffectDependency && (React.createElement(react.DefaultButton, { iconProps: { iconName: 'ConfigurationScreenVideoEffectsButton' }, styles: effectsButtonStyles(theme), onClick: props.onClickVideoEffects, "data-ui-id": 'call-config-video-effects-button' }, locale.strings.call.configurationPageVideoEffectsButtonLabel))),
33429
+ onResolveVideoEffectDependency && (React.createElement(react.DefaultButton, { iconProps: { iconName: 'ConfigurationScreenVideoEffectsButton' }, styles: effectsButtonStyles(theme, !cameraPermissionGranted), onClick: props.onClickVideoEffects, disabled: !cameraPermissionGranted, "data-ui-id": 'call-config-video-effects-button' }, locale.strings.call.configurationPageVideoEffectsButtonLabel))),
32894
33430
  React.createElement(ConfigurationPageCameraDropdown, { cameraGrantedDropdown: cameraGrantedDropdown, cameraPermissionGranted: cameraPermissionGranted !== null && cameraPermissionGranted !== void 0 ? cameraPermissionGranted : false,
32895
33431
  /* @conditional-compile-remove(call-readiness) */
32896
33432
  dropdownProps: dropdownProps,
@@ -33029,18 +33565,21 @@ const localPreviewTileStyle = {
33029
33565
  /**
33030
33566
  * @private
33031
33567
  */
33032
- const localPreviewButtonStyle = {
33033
- root: {
33034
- '@media (forced-colors: active)': {
33035
- ':focus': {
33036
- border: '1px solid !important' // we need bang important to override fluents colours
33037
- },
33038
- ':focus::after': {
33039
- border: 'unset !important', // we need bang important to override fluents colours
33040
- outline: 'unset !important'
33568
+ const localPreviewButtonStyle = (isMobile) => {
33569
+ return {
33570
+ root: {
33571
+ minWidth: !isMobile ? _pxToRem(75) : 'unset', // we only want to enforce this for desktop views
33572
+ '@media (forced-colors: active)': {
33573
+ ':focus': {
33574
+ border: '1px solid !important' // we need bang important to override fluents colours
33575
+ },
33576
+ ':focus::after': {
33577
+ border: 'unset !important', // we need bang important to override fluents colours
33578
+ outline: 'unset !important'
33579
+ }
33041
33580
  }
33042
33581
  }
33043
- }
33582
+ };
33044
33583
  };
33045
33584
 
33046
33585
  // Copyright (c) Microsoft Corporation.
@@ -33101,7 +33640,7 @@ const LocalPreview = (props) => {
33101
33640
  React.createElement(ControlBar, { layout: "floatingBottom" },
33102
33641
  React.createElement(MicrophoneButton, { "data-ui-id": "call-composite-local-device-settings-microphone-button", checked: isLocalMicrophoneEnabled, onToggleMicrophone: onToggleMic, disabled: !microphonePermissionGranted || !hasMicrophones, showLabel: true,
33103
33642
  // disable tooltip as it obscures list of devices on mobile
33104
- strings: props.mobileView ? { tooltipOnContent: '', tooltipOffContent: '', tooltipDisabledContent: '' } : {}, styles: localPreviewButtonStyle }),
33643
+ strings: props.mobileView ? { tooltipOnContent: '', tooltipOffContent: '', tooltipDisabledContent: '' } : {}, styles: localPreviewButtonStyle(props.mobileView) }),
33105
33644
  React.createElement(CameraButton, Object.assign({ "data-ui-id": "call-composite-local-device-settings-camera-button" }, cameraButtonProps, { showLabel: true, disabled: !cameraPermissionGranted || !hasCameras,
33106
33645
  // disable tooltip as it obscures list of devices on mobile
33107
33646
  strings: props.mobileView
@@ -33111,7 +33650,7 @@ const LocalPreview = (props) => {
33111
33650
  tooltipDisabledContent: '',
33112
33651
  tooltipVideoLoadingContent: ''
33113
33652
  }
33114
- : {}, styles: localPreviewButtonStyle })),
33653
+ : {}, styles: localPreviewButtonStyle(props.mobileView) })),
33115
33654
  props.showDevicesButton && (React.createElement(DevicesButton, Object.assign({ "data-ui-id": "call-composite-local-device-settings-options-button" }, devicesButtonProps, {
33116
33655
  // disable button whilst all other buttons are disabled
33117
33656
  disabled: (!microphonePermissionGranted && !cameraPermissionGranted && hasNoSpeakers) || hasNoDevices, showLabel: true,
@@ -34676,6 +35215,7 @@ const MainScreen = (props) => {
34676
35215
  adapter.off('callEnded', closeSidePane);
34677
35216
  };
34678
35217
  }, [adapter]);
35218
+ const compositeAudioContext = React.useRef(new AudioContext());
34679
35219
  /* @conditional-compile-remove(capabilities) */
34680
35220
  const capabilitiesChangedInfoAndRole = useSelector$1(capabilitiesChangedInfoAndRoleSelector);
34681
35221
  /* @conditional-compile-remove(capabilities) */
@@ -34765,7 +35305,7 @@ const MainScreen = (props) => {
34765
35305
  case 'call':
34766
35306
  pageElement = (React.createElement(CallPage, { callInvitationURL: callInvitationUrl, onFetchAvatarPersonaData: onFetchAvatarPersonaData, onFetchParticipantMenuItems: onFetchParticipantMenuItems, mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, onCloseChatPane: props.onCloseChatPane, latestErrors: latestErrors, onDismissError: onDismissError, galleryLayout: userSetGalleryLayout, onUserSetGalleryLayoutChange: setUserSetGalleryLayout, onSetUserSetOverflowGalleryPosition: setUserSetOverflowGalleryPosition, userSetOverflowGalleryPosition: userSetOverflowGalleryPosition,
34767
35307
  /* @conditional-compile-remove(capabilities) */
34768
- capabilitiesChangedNotificationBarProps: capabilitiesChangedNotificationBarProps, pinnedParticipants: pinnedParticipants, setPinnedParticipants: setPinnedParticipants }));
35308
+ capabilitiesChangedNotificationBarProps: capabilitiesChangedNotificationBarProps, pinnedParticipants: pinnedParticipants, setPinnedParticipants: setPinnedParticipants, compositeAudioContext: compositeAudioContext.current }));
34769
35309
  break;
34770
35310
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
34771
35311
  case 'hold':
@@ -35261,7 +35801,9 @@ class AzureCommunicationCallAdapter {
35261
35801
  ? locatorOrTargetCalless
35262
35802
  : undefined;
35263
35803
  this.deviceManager = deviceManager;
35264
- const isTeamsMeeting = this.locator ? 'meetingLink' in this.locator : false;
35804
+ const isTeamsMeeting = this.locator
35805
+ ? 'meetingLink' in this.locator || /* @conditional-compile-remove(meeting-id) */ 'meetingId' in this.locator
35806
+ : false;
35265
35807
  const isRoomsCall = this.locator ? 'roomId' in this.locator : false;
35266
35808
  this.onResolveVideoBackgroundEffectsDependency = (_a = options === null || options === void 0 ? void 0 : options.videoBackgroundOptions) === null || _a === void 0 ? void 0 : _a.onResolveDependency;
35267
35809
  this.context = new CallContext(callClient.getState(), isTeamsMeeting, isRoomsCall, options, this.targetCallees);
@@ -35492,18 +36034,34 @@ class AzureCommunicationCallAdapter {
35492
36034
  }
35493
36035
  _joinCall(audioOptions, videoOptions) {
35494
36036
  const isTeamsMeeting = this.locator ? 'meetingLink' in this.locator : false;
36037
+ /* @conditional-compile-remove(meeting-id) */
36038
+ const isTeamsMeetingId = this.locator ? 'meetingId' in this.locator : false;
35495
36039
  const isRoomsCall = this.locator ? 'roomId' in this.locator : false;
35496
36040
  /* @conditional-compile-remove(teams-identity-support) */
35497
36041
  if (_isTeamsCallAgent(this.callAgent)) {
35498
- if (!isTeamsMeeting) {
35499
- throw new Error('Locator not supported by TeamsCallAgent');
36042
+ if (isTeamsMeeting) {
36043
+ return this.callAgent.join(this.locator, {
36044
+ audioOptions,
36045
+ videoOptions
36046
+ });
36047
+ }
36048
+ /* @conditional-compile-remove(meeting-id) */
36049
+ if (isTeamsMeetingId) {
36050
+ return this.callAgent.join(this.locator, {
36051
+ audioOptions,
36052
+ videoOptions
36053
+ });
35500
36054
  }
36055
+ throw new Error('Locator not supported by TeamsCallAgent');
36056
+ }
36057
+ if (isTeamsMeeting) {
35501
36058
  return this.callAgent.join(this.locator, {
35502
36059
  audioOptions,
35503
36060
  videoOptions
35504
36061
  });
35505
36062
  }
35506
- if (isTeamsMeeting) {
36063
+ /* @conditional-compile-remove(meeting-id) */
36064
+ if (isTeamsMeetingId) {
35507
36065
  return this.callAgent.join(this.locator, {
35508
36066
  audioOptions,
35509
36067
  videoOptions
@@ -37200,12 +37758,11 @@ const isOnHoldTrampoline = (page) => {
37200
37758
  /**
37201
37759
  * @private
37202
37760
  */
37203
- function callWithChatAdapterStateFromBackingStates(callAdapter, chatAdapter) {
37761
+ function callWithChatAdapterStateFromBackingStates(callAdapter) {
37204
37762
  const callAdapterState = callAdapter.getState();
37205
- const chatAdapterState = chatAdapter.getState();
37206
37763
  return {
37207
37764
  call: callAdapterState.call,
37208
- chat: chatAdapterState.thread,
37765
+ chat: undefined,
37209
37766
  userId: callAdapterState.userId,
37210
37767
  page: callAdapterState.page,
37211
37768
  displayName: callAdapterState.displayName,
@@ -37213,9 +37770,9 @@ function callWithChatAdapterStateFromBackingStates(callAdapter, chatAdapter) {
37213
37770
  isLocalPreviewMicrophoneEnabled: callAdapterState.isLocalPreviewMicrophoneEnabled,
37214
37771
  isTeamsCall: callAdapterState.isTeamsCall,
37215
37772
  latestCallErrors: callAdapterState.latestErrors,
37216
- latestChatErrors: chatAdapterState.latestErrors,
37773
+ latestChatErrors: {},
37217
37774
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
37218
- fileUploads: chatAdapterState.fileUploads,
37775
+ fileUploads: {},
37219
37776
  /* @conditional-compile-remove(PSTN-calls) */
37220
37777
  alternateCallerId: callAdapterState.alternateCallerId,
37221
37778
  /* @conditional-compile-remove(unsupported-browser) */
@@ -37315,44 +37872,61 @@ class CallWithChatContext {
37315
37872
  * Created for easy use with the {@link CallWithChatComposite}.
37316
37873
  */
37317
37874
  class AzureCommunicationCallWithChatAdapter {
37318
- constructor(callAdapter, chatAdapter) {
37875
+ constructor(callAdapter, chatAdapterPromise) {
37319
37876
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
37320
37877
  this.registerActiveFileUploads = (files) => {
37321
- return this.chatAdapter.registerActiveFileUploads(files);
37878
+ var _a, _b;
37879
+ return (_b = (_a = this.chatAdapter) === null || _a === void 0 ? void 0 : _a.registerActiveFileUploads(files)) !== null && _b !== void 0 ? _b : [];
37322
37880
  };
37323
37881
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
37324
37882
  this.registerCompletedFileUploads = (metadata) => {
37325
- return this.chatAdapter.registerCompletedFileUploads(metadata);
37883
+ var _a, _b;
37884
+ return (_b = (_a = this.chatAdapter) === null || _a === void 0 ? void 0 : _a.registerCompletedFileUploads(metadata)) !== null && _b !== void 0 ? _b : [];
37326
37885
  };
37327
37886
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
37328
37887
  this.clearFileUploads = () => {
37329
- this.chatAdapter.clearFileUploads();
37888
+ this.chatAdapterPromise.then((adapter) => {
37889
+ adapter.clearFileUploads();
37890
+ });
37330
37891
  };
37331
37892
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
37332
37893
  this.cancelFileUpload = (id) => {
37333
- this.chatAdapter.cancelFileUpload(id);
37894
+ this.chatAdapterPromise.then((adapter) => {
37895
+ adapter.cancelFileUpload(id);
37896
+ });
37334
37897
  };
37335
37898
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
37336
37899
  this.updateFileUploadProgress = (id, progress) => {
37337
- this.chatAdapter.updateFileUploadProgress(id, progress);
37900
+ this.chatAdapterPromise.then((adapter) => {
37901
+ adapter.updateFileUploadProgress(id, progress);
37902
+ });
37338
37903
  };
37339
37904
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
37340
37905
  this.updateFileUploadErrorMessage = (id, errorMessage) => {
37341
- this.chatAdapter.updateFileUploadErrorMessage(id, errorMessage);
37906
+ this.chatAdapterPromise.then((adapter) => {
37907
+ adapter.updateFileUploadErrorMessage(id, errorMessage);
37908
+ });
37342
37909
  };
37343
37910
  /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
37344
37911
  this.updateFileUploadMetadata = (id, metadata) => {
37345
- this.chatAdapter.updateFileUploadMetadata(id, metadata);
37912
+ this.chatAdapterPromise.then((adapter) => {
37913
+ adapter.updateFileUploadMetadata(id, metadata);
37914
+ });
37346
37915
  };
37347
37916
  this.bindPublicMethods();
37348
37917
  this.callAdapter = callAdapter;
37349
- this.chatAdapter = chatAdapter;
37350
- this.context = new CallWithChatContext(callWithChatAdapterStateFromBackingStates(callAdapter, chatAdapter));
37918
+ this.context = new CallWithChatContext(callWithChatAdapterStateFromBackingStates(callAdapter));
37351
37919
  const onChatStateChange = (newChatAdapterState) => {
37352
37920
  this.context.updateClientStateWithChatState(newChatAdapterState);
37353
37921
  };
37354
- this.chatAdapter.onStateChange(onChatStateChange);
37355
37922
  this.onChatStateChange = onChatStateChange;
37923
+ this.chatAdapterPromise = chatAdapterPromise;
37924
+ this.chatAdapterPromise.then((chatAdapter) => {
37925
+ chatAdapter.onStateChange(this.onChatStateChange);
37926
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */
37927
+ this.chatAdapter = chatAdapter;
37928
+ this.context.updateClientStateWithChatState(chatAdapter.getState());
37929
+ });
37356
37930
  const onCallStateChange = (newCallAdapterState) => {
37357
37931
  this.context.updateClientStateWithCallState(newCallAdapterState);
37358
37932
  };
@@ -37480,10 +38054,16 @@ class AzureCommunicationCallWithChatAdapter {
37480
38054
  }
37481
38055
  /** Dispose of the current CallWithChatAdapter. */
37482
38056
  dispose() {
37483
- this.chatAdapter.offStateChange(this.onChatStateChange);
37484
- this.callAdapter.offStateChange(this.onCallStateChange);
37485
- this.chatAdapter.dispose();
37486
- this.callAdapter.dispose();
38057
+ return __awaiter$2(this, void 0, void 0, function* () {
38058
+ this.chatAdapterPromise.then((adapter) => {
38059
+ adapter.offStateChange(this.onChatStateChange);
38060
+ });
38061
+ this.callAdapter.offStateChange(this.onCallStateChange);
38062
+ yield this.chatAdapterPromise.then((adapter) => {
38063
+ adapter.dispose();
38064
+ });
38065
+ this.callAdapter.dispose();
38066
+ });
37487
38067
  }
37488
38068
  /** Remove a participant from the Call only. */
37489
38069
  removeParticipant(userId) {
@@ -37621,53 +38201,71 @@ class AzureCommunicationCallWithChatAdapter {
37621
38201
  /** Fetch initial Call and Chat data such as chat messages. */
37622
38202
  fetchInitialData() {
37623
38203
  return __awaiter$2(this, void 0, void 0, function* () {
37624
- yield this.chatAdapter.fetchInitialData();
38204
+ return yield this.chatAdapterPromise.then((adapter) => {
38205
+ return adapter.fetchInitialData();
38206
+ });
37625
38207
  });
37626
38208
  }
37627
38209
  /** Send a chat message. */
37628
38210
  sendMessage(content) {
37629
38211
  return __awaiter$2(this, void 0, void 0, function* () {
37630
- yield this.chatAdapter.sendMessage(content);
38212
+ return yield this.chatAdapterPromise.then((adapter) => {
38213
+ return adapter.sendMessage(content);
38214
+ });
37631
38215
  });
37632
38216
  }
37633
38217
  /** Send a chat read receipt. */
37634
38218
  sendReadReceipt(chatMessageId) {
37635
38219
  return __awaiter$2(this, void 0, void 0, function* () {
37636
- yield this.chatAdapter.sendReadReceipt(chatMessageId);
38220
+ return yield this.chatAdapterPromise.then((adapter) => {
38221
+ return adapter.sendReadReceipt(chatMessageId);
38222
+ });
37637
38223
  });
37638
38224
  }
37639
38225
  /** Send an isTyping indicator. */
37640
38226
  sendTypingIndicator() {
37641
38227
  return __awaiter$2(this, void 0, void 0, function* () {
37642
- yield this.chatAdapter.sendTypingIndicator();
38228
+ return yield this.chatAdapterPromise.then((adapter) => {
38229
+ return adapter.sendTypingIndicator();
38230
+ });
37643
38231
  });
37644
38232
  }
37645
38233
  /** Load previous Chat messages. */
37646
38234
  loadPreviousChatMessages(messagesToLoad) {
37647
38235
  return __awaiter$2(this, void 0, void 0, function* () {
37648
- return yield this.chatAdapter.loadPreviousChatMessages(messagesToLoad);
38236
+ return yield this.chatAdapterPromise.then((adapter) => {
38237
+ return adapter.loadPreviousChatMessages(messagesToLoad);
38238
+ });
37649
38239
  });
37650
38240
  }
37651
38241
  /** Update an existing message. */
37652
38242
  updateMessage(messageId, content, metadata, options) {
37653
38243
  return __awaiter$2(this, void 0, void 0, function* () {
37654
- return yield this.chatAdapter.updateMessage(messageId, content, metadata,
37655
- /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ options);
38244
+ return this.chatAdapterPromise.then((adapter) => {
38245
+ return adapter.updateMessage(messageId, content, metadata,
38246
+ /* @conditional-compile-remove(attachment-download) @conditional-compile-remove(attachment-upload) */ options);
38247
+ });
37656
38248
  });
37657
38249
  }
37658
38250
  /** Delete an existing message. */
37659
38251
  deleteMessage(messageId) {
37660
38252
  return __awaiter$2(this, void 0, void 0, function* () {
37661
- return yield this.chatAdapter.deleteMessage(messageId);
38253
+ return yield this.chatAdapterPromise.then((adapter) => {
38254
+ return adapter.deleteMessage(messageId);
38255
+ });
37662
38256
  });
37663
38257
  }
37664
38258
  downloadResourceToCache(resourceDetails) {
37665
38259
  return __awaiter$2(this, void 0, void 0, function* () {
37666
- this.chatAdapter.downloadResourceToCache(resourceDetails);
38260
+ this.chatAdapterPromise.then((adapter) => {
38261
+ adapter.downloadResourceToCache(resourceDetails);
38262
+ });
37667
38263
  });
37668
38264
  }
37669
38265
  removeResourceFromCache(resourceDetails) {
37670
- this.chatAdapter.removeResourceFromCache(resourceDetails);
38266
+ this.chatAdapterPromise.then((adapter) => {
38267
+ adapter.removeResourceFromCache(resourceDetails);
38268
+ });
37671
38269
  }
37672
38270
  /* @conditional-compile-remove(PSTN-calls) */
37673
38271
  holdCall() {
@@ -37815,31 +38413,47 @@ class AzureCommunicationCallWithChatAdapter {
37815
38413
  this.callAdapter.on('isSpokenLanguageChanged', listener);
37816
38414
  break;
37817
38415
  case 'messageReceived':
37818
- this.chatAdapter.on('messageReceived', listener);
38416
+ this.chatAdapterPromise.then((adapter) => {
38417
+ adapter.on('messageReceived', listener);
38418
+ });
37819
38419
  break;
37820
38420
  case 'messageEdited':
37821
- this.chatAdapter.on('messageEdited', listener);
38421
+ this.chatAdapterPromise.then((adapter) => {
38422
+ adapter.on('messageEdited', listener);
38423
+ });
37822
38424
  break;
37823
38425
  case 'messageDeleted':
37824
- this.chatAdapter.on('messageDeleted', listener);
38426
+ this.chatAdapterPromise.then((adapter) => {
38427
+ adapter.on('messageDeleted', listener);
38428
+ });
37825
38429
  break;
37826
38430
  case 'messageSent':
37827
- this.chatAdapter.on('messageSent', listener);
38431
+ this.chatAdapterPromise.then((adapter) => {
38432
+ adapter.on('messageSent', listener);
38433
+ });
37828
38434
  break;
37829
38435
  case 'messageRead':
37830
- this.chatAdapter.on('messageRead', listener);
38436
+ this.chatAdapterPromise.then((adapter) => {
38437
+ adapter.on('messageRead', listener);
38438
+ });
37831
38439
  break;
37832
38440
  case 'chatParticipantsAdded':
37833
- this.chatAdapter.on('participantsAdded', listener);
38441
+ this.chatAdapterPromise.then((adapter) => {
38442
+ adapter.on('participantsAdded', listener);
38443
+ });
37834
38444
  break;
37835
38445
  case 'chatParticipantsRemoved':
37836
- this.chatAdapter.on('participantsRemoved', listener);
38446
+ this.chatAdapterPromise.then((adapter) => {
38447
+ adapter.on('participantsRemoved', listener);
38448
+ });
37837
38449
  break;
37838
38450
  case 'callError':
37839
38451
  this.callAdapter.on('error', listener);
37840
38452
  break;
37841
38453
  case 'chatError':
37842
- this.chatAdapter.on('error', listener);
38454
+ this.chatAdapterPromise.then((adapter) => {
38455
+ adapter.on('error', listener);
38456
+ });
37843
38457
  break;
37844
38458
  default:
37845
38459
  throw `Unknown AzureCommunicationCallWithChatAdapter Event: ${event}`;
@@ -37895,37 +38509,113 @@ class AzureCommunicationCallWithChatAdapter {
37895
38509
  this.callAdapter.off('isSpokenLanguageChanged', listener);
37896
38510
  break;
37897
38511
  case 'messageReceived':
37898
- this.chatAdapter.off('messageReceived', listener);
38512
+ this.chatAdapterPromise.then((adapter) => {
38513
+ adapter.off('messageReceived', listener);
38514
+ });
37899
38515
  break;
37900
38516
  case 'messageEdited':
37901
- this.chatAdapter.off('messageEdited', listener);
38517
+ this.chatAdapterPromise.then((adapter) => {
38518
+ adapter.off('messageEdited', listener);
38519
+ });
37902
38520
  break;
37903
38521
  case 'messageDeleted':
37904
- this.chatAdapter.off('messageDeleted', listener);
38522
+ this.chatAdapterPromise.then((adapter) => {
38523
+ adapter.off('messageDeleted', listener);
38524
+ });
37905
38525
  break;
37906
38526
  case 'messageSent':
37907
- this.chatAdapter.off('messageSent', listener);
38527
+ this.chatAdapterPromise.then((adapter) => {
38528
+ adapter.off('messageSent', listener);
38529
+ });
37908
38530
  break;
37909
38531
  case 'messageRead':
37910
- this.chatAdapter.off('messageRead', listener);
38532
+ this.chatAdapterPromise.then((adapter) => {
38533
+ adapter.off('messageRead', listener);
38534
+ });
37911
38535
  break;
37912
38536
  case 'chatParticipantsAdded':
37913
- this.chatAdapter.off('participantsAdded', listener);
38537
+ this.chatAdapterPromise.then((adapter) => {
38538
+ adapter.off('participantsAdded', listener);
38539
+ });
37914
38540
  break;
37915
38541
  case 'chatParticipantsRemoved':
37916
- this.chatAdapter.off('participantsRemoved', listener);
38542
+ this.chatAdapterPromise.then((adapter) => {
38543
+ adapter.off('participantsRemoved', listener);
38544
+ });
37917
38545
  break;
37918
38546
  case 'callError':
37919
38547
  this.callAdapter.off('error', listener);
37920
38548
  break;
37921
38549
  case 'chatError':
37922
- this.chatAdapter.off('error', listener);
38550
+ this.chatAdapterPromise.then((adapter) => {
38551
+ adapter.off('error', listener);
38552
+ });
37923
38553
  break;
37924
38554
  default:
37925
38555
  throw `Unknown AzureCommunicationCallWithChatAdapter Event: ${event}`;
37926
38556
  }
37927
38557
  }
37928
38558
  }
38559
+ /**
38560
+ * Arguments for use in {@link createAzureCommunicationCallWithChatAdapter} to join a Group Call with an associated Chat thread.
38561
+ * @public
38562
+ */
38563
+ class CallAndChatProvider {
38564
+ constructor(locator) {
38565
+ this.locator = locator;
38566
+ }
38567
+ getChatThread() {
38568
+ return __awaiter$2(this, void 0, void 0, function* () {
38569
+ return this.locator.chatThreadId;
38570
+ });
38571
+ }
38572
+ }
38573
+ /**
38574
+ * Arguments for use in {@link createAzureCommunicationCallWithChatAdapter} to join a Teams meeting with an associated Chat thread.
38575
+ *
38576
+ * @public
38577
+ */
38578
+ class TeamsMeetingLinkProvider {
38579
+ constructor(locator) {
38580
+ this.locator = locator;
38581
+ }
38582
+ getChatThread() {
38583
+ return __awaiter$2(this, void 0, void 0, function* () {
38584
+ return getChatThreadFromTeamsLink(this.locator.meetingLink);
38585
+ });
38586
+ }
38587
+ }
38588
+ /** @conditional-compile-remove(meeting-id) */
38589
+ /**
38590
+ * Arguments for use in {@link createAzureCommunicationCallWithChatAdapter} to join a Teams meeting using meeting id.
38591
+ *
38592
+ * @public
38593
+ */
38594
+ class TeamsMeetingIdProvider {
38595
+ constructor(locator, callAdapter) {
38596
+ this.locator = locator;
38597
+ this.callAdapter = callAdapter;
38598
+ }
38599
+ /**
38600
+ * Wait call to be connected to get thread ID.
38601
+ * @returns the chat thread ID for the given meeting ID.
38602
+ */
38603
+ getChatThread() {
38604
+ return __awaiter$2(this, void 0, void 0, function* () {
38605
+ return new Promise((resolve) => {
38606
+ const stateChangeListener = (state) => {
38607
+ var _a, _b, _c;
38608
+ if (((_a = state.call) === null || _a === void 0 ? void 0 : _a.state) === 'Connected' && ((_b = state.call.info) === null || _b === void 0 ? void 0 : _b.threadId)) {
38609
+ resolve((_c = state.call.info) === null || _c === void 0 ? void 0 : _c.threadId);
38610
+ }
38611
+ };
38612
+ this.callAdapter.then((adapter) => {
38613
+ adapter.onStateChange(stateChangeListener);
38614
+ });
38615
+ });
38616
+ });
38617
+ }
38618
+ }
37929
38619
  /**
37930
38620
  * Create a CallWithChatAdapter backed by Azure Communication services
37931
38621
  * to plug into the {@link CallWithChatComposite}.
@@ -37934,8 +38624,8 @@ class AzureCommunicationCallWithChatAdapter {
37934
38624
  */
37935
38625
  const createAzureCommunicationCallWithChatAdapter = (_a) => __awaiter$2(void 0, [_a], void 0, function* ({ userId, displayName, credential, endpoint, locator,
37936
38626
  /* @conditional-compile-remove(PSTN-calls) */ alternateCallerId, callAdapterOptions }) {
37937
- const callAdapterLocator = isTeamsMeetingLinkLocator(locator) ? locator : locator.callLocator;
37938
- const createCallAdapterPromise = _createAzureCommunicationCallAdapterInner({
38627
+ const callAdapterLocator = isTeamsMeetingLocator(locator) ? locator : locator.callLocator;
38628
+ const callAdapter = _createAzureCommunicationCallAdapterInner({
37939
38629
  userId,
37940
38630
  displayName,
37941
38631
  credential,
@@ -37944,12 +38634,9 @@ const createAzureCommunicationCallWithChatAdapter = (_a) => __awaiter$2(void 0,
37944
38634
  options: callAdapterOptions,
37945
38635
  telemetryImplementationHint: 'CallWithChat'
37946
38636
  });
37947
- const threadId = isTeamsMeetingLinkLocator(locator)
37948
- ? getChatThreadFromTeamsLink(locator.meetingLink)
37949
- : locator.chatThreadId;
37950
- const createChatAdapterPromise = _createAzureCommunicationChatAdapterInner(endpoint, userId, displayName, credential, threadId, 'CallWithChat');
37951
- const [callAdapter, chatAdapter] = yield Promise.all([createCallAdapterPromise, createChatAdapterPromise]);
37952
- return new AzureCommunicationCallWithChatAdapter(callAdapter, chatAdapter);
38637
+ const chatThreadAdapter = _createChatThreadAdapterInner(locator, callAdapter);
38638
+ const chatAdapter = _createLazyAzureCommunicationChatAdapterInner(endpoint, userId, displayName, credential, chatThreadAdapter.getChatThread(), 'CallWithChat');
38639
+ return new AzureCommunicationCallWithChatAdapter(yield callAdapter, chatAdapter);
37953
38640
  });
37954
38641
  /**
37955
38642
  * A custom React hook to simplify the creation of {@link CallWithChatAdapter}.
@@ -38077,13 +38764,22 @@ beforeDispose) => {
38077
38764
  * @public
38078
38765
  */
38079
38766
  const createAzureCommunicationCallWithChatAdapterFromClients = (_b) => __awaiter$2(void 0, [_b], void 0, function* ({ callClient, callAgent, callLocator, chatClient, chatThreadClient, callAdapterOptions }) {
38080
- const createCallAdapterPromise = createAzureCommunicationCallAdapterFromClient(callClient, callAgent, callLocator, callAdapterOptions);
38081
- const createChatAdapterPromise = createAzureCommunicationChatAdapterFromClient(chatClient, chatThreadClient);
38082
- const [callAdapter, chatAdapter] = yield Promise.all([createCallAdapterPromise, createChatAdapterPromise]);
38083
- return new AzureCommunicationCallWithChatAdapter(callAdapter, chatAdapter);
38767
+ const callAdapter = yield createAzureCommunicationCallAdapterFromClient(callClient, callAgent, callLocator, callAdapterOptions);
38768
+ const chatAdapterPromise = createAzureCommunicationChatAdapterFromClient(chatClient, chatThreadClient);
38769
+ return new AzureCommunicationCallWithChatAdapter(callAdapter, chatAdapterPromise);
38084
38770
  });
38085
- const isTeamsMeetingLinkLocator = (locator) => {
38086
- return 'meetingLink' in locator;
38771
+ const isTeamsMeetingLocator = (locator) => {
38772
+ return 'meetingLink' in locator || 'meetingId' in locator;
38773
+ };
38774
+ const _createChatThreadAdapterInner = (locator, adapter) => {
38775
+ if ('meetingLink' in locator) {
38776
+ return new TeamsMeetingLinkProvider(locator);
38777
+ }
38778
+ /** @conditional-compile-remove(meeting-id) */
38779
+ if ('meetingId' in locator) {
38780
+ return new TeamsMeetingIdProvider(locator, adapter);
38781
+ }
38782
+ return new CallAndChatProvider(locator);
38087
38783
  };
38088
38784
 
38089
38785
  var call$j={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",notInvitedToRoomDetails:"You are not able to join this room because you do not have an invite.",notInvitedToRoomTitle:"Not invited to room",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",peoplePaneTitle:"People",peoplePaneMoreButtonAriaLabel:"More",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call {numberOfPeople}",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",startSpotlightMenuLabel:"Spotlight for everyone",addSpotlightMenuLabel:"Add spotlight",stopSpotlightMenuLabel:"Stop spotlighting",stopSpotlightOnSelfMenuLabel:"Exit spotlight",spotlightLimitReachedMenuTitle:"Spotlight limit reached",stopAllSpotlightMenuLabel:"Stop all spotlights",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"The room ID provided could not be found.",roomNotFoundTitle:"Room not found",roomNotValidDetails:"This room is not valid at this current time.",roomNotValidTitle:"Room not valid",inviteToRoomRemovedDetails:"Your invite to join this room was removed.",inviteToRoomRemovedTitle:"Invite to room removed",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"Captions Settings",captionsSettingsSpokenLanguageDropdownLabel:"Spoken language",captionsSettingsCaptionLanguageDropdownLabel:"Captions language",captionsSettingsSpokenLanguageDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsCaptionLanguageDropdownInfoText:"Captions will appear in this langugage.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",dismissModalAriaLabel:"Local and remote picture and picture, press enter to return to call",callRejectedTitle:"The call could not be completed",callRejectedMoreDetails:"The person you are trying to reach is unavailable. Please try again later.",callTimeoutTitle:"The call could not be completed",callTimeoutDetails:"The person you are trying to reach is unavailable. Please try again later.",callTimeoutBotTitle:"The call could not be completed",callTimeoutBotDetails:"The service that you are trying to reach is unavailable. Please try again later.",dtmfDialerButtonLabel:"Dialpad",dtmfDialerButtonTooltipOn:"Show dialpad",dtmfDialerButtonTooltipOff:"Hide dialpad",dtmfDialerMoreButtonLabelOn:"Show dialpad",dtmfDialerMoreButtonLabelOff:"Hide dialpad",spokenLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionLanguageStrings:{ar:"Arabic",da:"Danish",de:"German",en:"English",es:"Spanish",fi:"Finnish","fr-ca":"French - Canada",fr:"French - France",hi:"Hindi",it:"Italian",ja:"Japanese",ko:"Korean",nb:"Norwegian (Bokmål)",nl:"Dutch",pl:"Polish",pt:"Portuguese - Brazil",ru:"Russian",sv:"Swedish","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)",cs:"Czech","pt-pt":"Portuguese - Portugal",tr:"Turkish",vi:"Vietnamese",th:"Thai",he:"Hebrew",cy:"Welsh",uk:"Ukrainian",el:"Greek",hu:"Hungarian",ro:"Romanian",sk:"Slovak"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"View",moreButtonGalleryPositionToggleLabel:"Move gallery to top",moreButtonGallerySpeakerLayoutLabel:"Speaker",moreButtonGalleryFloatingLocalLayoutLabel:"Dynamic",moreButtonGalleryDefaultLayoutLabel:"Gallery view",moreButtonGalleryFocusedContentLayoutLabel:"Focus on content",moreButtonLargeGalleryDefaultLayoutLabel:"Large Gallery",capabilityChangedNotification:{turnVideoOn:{lostDueToMeetingOption:"Your camera has been disabled. You can no longer share video.",grantedDueToMeetingOption:"Your camera has been enabled. Turn it on if you'd like to share video."},unmuteMic:{lostDueToMeetingOption:"Your mic has been disabled. You can no longer unmute.",grantedDueToMeetingOption:"Your mic has been enabled. Unmute if you'd like to speak."},shareScreen:{lostDueToRoleChangeToAttendee:"Your role has been changed. Some actions, like sharing content, won't be available to you.",grantedDueToRoleChangeToPresenter:"You're a presenter. You can share content and facilitate the meeting."}},surveyTitle:"Help us improve",starSurveyHelperText:"How was the quality of the call?",starSurveyOneStarText:"The quality was bad.",starSurveyTwoStarText:"The quality was poor.",starSurveyThreeStarText:"The quality was good.",starSurveyFourStarText:"The quality was great.",starSurveyFiveStarText:"The quality was excellent.",surveyConfirmButtonLabel:"Send Feedback",starRatingAriaLabel:"Select {0} of {1} stars",surveySkipButtonLabel:"Skip",tagsSurveyQuestion:"What could have been better?",tagsSurveyTextFieldDefaultText:"Other, please specify",tagsSurveyHelperText:"Check any issues you experienced",surveyTextboxDefaultText:"Other, please specify",endOfSurveyText:"Thank you for your feedback!",surveyIssues:{overallRating:{callCannotJoin:"I could not join call",callCannotInvite:"I could not invite others into the call",hadToRejoin:"I had to rejoin the call",callEndedUnexpectedly:"Call ended for me unexpectedly",otherIssues:"I was having other issues with the call"},audioRating:{noLocalAudio:"The other side could not hear any sound",noRemoteAudio:"I could not hear any sound",echo:"I heard echos on the call",audioNoise:"I heard noise on the call",lowVolume:"Volume was low",audioStoppedUnexpectedly:"Audio stopped unexpectedly",distortedSpeech:"Audio was distorted",audioInterruption:"Audio was interrupted",otherIssues:"I was having other audio issues in this call"},videoRating:{noVideoReceived:"I could not see any video",noVideoSent:"Others could not see me",lowQuality:"Video quality was low",freezes:"Video frozen",stoppedUnexpectedly:"Video stopped unexpectedly",darkVideoReceived:"I can only see dark screens when others turn on their camera",audioVideoOutOfSync:"Audio and Video was out of sync",otherIssues:"I was having other video issues in this call"},screenshareRating:{noContentLocal:"Other people could not see my screenshare",noContentRemote:"I could not see other people's screenshare",cannotPresent:"I could not present my screen",lowQuality:"Screen share quality was low",freezes:"Screen share frozen",stoppedUnexpectedly:"Screen share stopped unexpectedly",largeDelay:"Screen share has a large delay",otherIssues:"I was having other screen share issues in this call"}},SurveyIssuesHeadingStrings:{overallRating:"Overall",audioRating:"Audio",videoRating:"Video",screenshareRating:"Presenting"},spotlightPrompt:{startSpotlightHeading:"Spotlight for everyone?",startSpotlightText:"You'll highlight this video for everyone in the meeting.",startSpotlightOnSelfText:"You'll highlight your video for everyone in the meeting.",startSpotlightConfirmButtonLabel:"Spotlight for everyone",startSpotlightCancelButtonLabel:"Cancel",stopSpotlightHeading:"Stop spotlighting this video?",stopSpotlightOnSelfHeading:"Exit spotlight?",stopAllSpotlightHeading:"Stop spotlighting all videos?",stopSpotlightText:"This video will no longer be highlighted for everyone in the meeting.",stopSpotlightOnSelfText:"Your video will no longer be highlighted for everyone in the meeting.",stopAllSpotlightText:"The videos will no longer be highlighted for everyone in the meeting.",stopSpotlightConfirmButtonLabel:"Stop spotlighting",stopSpotlightOnSelfConfirmButtonLabel:"Exit spotlight",stopSpotlightCancelButtonLabel:"Cancel"},exitSpotlightButtonLabel:"Exit spotlight",exitSpotlightButtonTooltip:"Exit spotlight"};var chat$j={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$j={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",moreDrawerCaptionLanguageMenuTitle:"Caption language",moreDrawerGalleryOptionsMenuTitle:"Gallery options",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_GB = {call:call$j,chat:chat$j,callWithChat:callWithChat$j};
@@ -38639,4 +39335,4 @@ exports.useTeamsCall = useTeamsCall;
38639
39335
  exports.useTeamsCallAdapter = useTeamsCallAdapter;
38640
39336
  exports.useTeamsCallAgent = useTeamsCallAgent;
38641
39337
  exports.useTheme = useTheme;
38642
- //# sourceMappingURL=index-BEomNZbT.js.map
39338
+ //# sourceMappingURL=index-qxnuqL7s.js.map