@microsoft/omnichannel-chat-widget 1.8.7 → 2.0.0-main.5ebd4eb

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 (251) hide show
  1. package/README.md +52 -5
  2. package/lib/cjs/common/Constants.js +5 -0
  3. package/lib/cjs/common/facades/FacadeChatSDK.js +234 -9
  4. package/lib/cjs/common/telemetry/TelemetryConstants.js +19 -0
  5. package/lib/cjs/common/telemetry/TelemetryManager.js +6 -1
  6. package/lib/cjs/common/telemetry/loggers/appInsightsLogger.js +2 -3
  7. package/lib/cjs/common/telemetry/sanitizeSasInPayload.js +91 -0
  8. package/lib/cjs/common/utils.js +93 -17
  9. package/lib/cjs/components/callingcontainerstateful/CallingContainerStateful.js +16 -6
  10. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +20 -10
  11. package/lib/cjs/components/citationpanestateful/CitationDim.js +2 -3
  12. package/lib/cjs/components/citationpanestateful/CitationPaneStateful.js +27 -5
  13. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +23 -3
  14. package/lib/cjs/components/dimlayer/DimLayer.js +1 -3
  15. package/lib/cjs/components/draggable/DraggableChatWidget.js +35 -15
  16. package/lib/cjs/components/draggable/DraggableEventEmitter.js +10 -1
  17. package/lib/cjs/components/draggable/DraggableEventReceiver.js +1 -3
  18. package/lib/cjs/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +54 -17
  19. package/lib/cjs/components/errorboundary/ErrorBoundary.js +4 -12
  20. package/lib/cjs/components/footerstateful/FooterStateful.js +18 -9
  21. package/lib/cjs/components/footerstateful/audionotificationstateful/AudioNotificationStateful.js +2 -4
  22. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +4 -6
  23. package/lib/cjs/components/headerstateful/HeaderStateful.js +24 -12
  24. package/lib/cjs/components/livechatwidget/LiveChatWidget.js +27 -4
  25. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/HiddenAdaptiveCardActivitySubscriber.js +5 -11
  26. package/lib/cjs/components/livechatwidget/common/ChatWidgetEvents.js +1 -0
  27. package/lib/cjs/components/livechatwidget/common/PersistentConversationHandler.js +11 -4
  28. package/lib/cjs/components/livechatwidget/common/authHelper.js +44 -4
  29. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +98 -5
  30. package/lib/cjs/components/livechatwidget/common/endChat.js +12 -9
  31. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +182 -1
  32. package/lib/cjs/components/livechatwidget/common/recoveryEligibilityTelemetry.js +60 -0
  33. package/lib/cjs/components/livechatwidget/common/startChat.js +31 -14
  34. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +160 -21
  35. package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +16 -11
  36. package/lib/cjs/components/notificationpanestateful/NotificationPaneStateful.js +19 -12
  37. package/lib/cjs/components/ooohpanestateful/OOOHPaneStateful.js +13 -6
  38. package/lib/cjs/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +28 -5
  39. package/lib/cjs/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +12 -5
  40. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +105 -11
  41. package/lib/cjs/components/prechatsurveypanestateful/common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps.js +12 -1
  42. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +17 -7
  43. package/lib/cjs/components/reconnectchatpanestateful/ReconnectChatPaneStateful.js +16 -7
  44. package/lib/cjs/components/startchaterrorpanestateful/StartChatErrorPaneStateful.js +10 -2
  45. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +154 -29
  46. package/lib/cjs/components/webchatcontainerstateful/common/DesignerChatAdapter.js +10 -0
  47. package/lib/cjs/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.js +115 -10
  48. package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts.js +3 -0
  49. package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps.js +2 -1
  50. package/lib/cjs/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +3 -1
  51. package/lib/cjs/components/webchatcontainerstateful/common/defaultStyles/defaultWebChatStyles.js +2 -2
  52. package/lib/cjs/components/webchatcontainerstateful/common/utils/chatAdapterUtils.js +3 -1
  53. package/lib/cjs/components/webchatcontainerstateful/common/utils/citationA11y.js +195 -0
  54. package/lib/cjs/components/webchatcontainerstateful/interfaces/IWebChatAction.js +17 -1
  55. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.js +27 -4
  56. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsEgressMiddleware.js +1 -3
  57. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsIngressMiddleware.js +1 -3
  58. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.js +180 -190
  59. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LoadInlineBannerActivity.js +3 -5
  60. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +22 -6
  61. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +12 -23
  62. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +27 -35
  63. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/AdaptiveCardAccessibilityWrapper.js +199 -0
  64. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/Attachment.js +29 -15
  65. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware.js +5 -12
  66. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +1 -1
  67. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultAvatarTextStyles.js +1 -1
  68. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageStyles.js +8 -3
  69. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultTimestampRetryStyles.js +8 -1
  70. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/groupActivitiesMiddleware.js +5 -8
  71. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware.js +6 -4
  72. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +6 -4
  73. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +14 -12
  74. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/HistoryMessageTimestamp.js +16 -14
  75. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +18 -30
  76. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +10 -2
  77. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/toastMiddleware.js +1 -3
  78. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +16 -12
  79. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.js +6 -6
  80. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware.js +83 -0
  81. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.js +36 -8
  82. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.js +5 -1
  83. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.js +10 -7
  84. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +4 -0
  85. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -4
  86. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.js +5 -1
  87. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware.js +7 -7
  88. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/gifUploadMiddleware.js +10 -14
  89. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlPlayerMiddleware.js +6 -4
  90. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware.js +13 -10
  91. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +57 -11
  92. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator.js +6 -4
  93. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware.js +25 -30
  94. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +10 -7
  95. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware.js +6 -4
  96. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.js +55 -1
  97. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +2 -4
  98. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +5 -0
  99. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +17 -1
  100. package/lib/cjs/contexts/createReducer.js +15 -0
  101. package/lib/cjs/controller/componentController.js +13 -1
  102. package/lib/cjs/hooks/useWindowDimensions.js +13 -5
  103. package/lib/cjs/package.json +1 -0
  104. package/lib/cjs/plugins/createChatTranscript.js +3 -4
  105. package/lib/cjs/plugins/newMessageEventHandler.js +20 -3
  106. package/lib/esm/common/Constants.js +5 -0
  107. package/lib/esm/common/facades/FacadeChatSDK.js +235 -10
  108. package/lib/esm/common/telemetry/TelemetryConstants.js +19 -0
  109. package/lib/esm/common/telemetry/TelemetryManager.js +6 -1
  110. package/lib/esm/common/telemetry/loggers/appInsightsLogger.js +2 -3
  111. package/lib/esm/common/telemetry/sanitizeSasInPayload.js +84 -0
  112. package/lib/esm/common/utils.js +88 -14
  113. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +15 -5
  114. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +19 -9
  115. package/lib/esm/components/citationpanestateful/CitationDim.js +2 -3
  116. package/lib/esm/components/citationpanestateful/CitationPaneStateful.js +26 -4
  117. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +22 -2
  118. package/lib/esm/components/dimlayer/DimLayer.js +1 -3
  119. package/lib/esm/components/draggable/DraggableChatWidget.js +34 -14
  120. package/lib/esm/components/draggable/DraggableEventEmitter.js +10 -1
  121. package/lib/esm/components/draggable/DraggableEventReceiver.js +1 -3
  122. package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +54 -17
  123. package/lib/esm/components/errorboundary/ErrorBoundary.js +4 -12
  124. package/lib/esm/components/footerstateful/FooterStateful.js +17 -8
  125. package/lib/esm/components/footerstateful/audionotificationstateful/AudioNotificationStateful.js +2 -4
  126. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +4 -6
  127. package/lib/esm/components/headerstateful/HeaderStateful.js +22 -10
  128. package/lib/esm/components/livechatwidget/LiveChatWidget.js +27 -4
  129. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/HiddenAdaptiveCardActivitySubscriber.js +5 -11
  130. package/lib/esm/components/livechatwidget/common/ChatWidgetEvents.js +1 -0
  131. package/lib/esm/components/livechatwidget/common/PersistentConversationHandler.js +11 -4
  132. package/lib/esm/components/livechatwidget/common/authHelper.js +44 -4
  133. package/lib/esm/components/livechatwidget/common/createMarkdown.js +98 -5
  134. package/lib/esm/components/livechatwidget/common/endChat.js +12 -9
  135. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +182 -1
  136. package/lib/esm/components/livechatwidget/common/recoveryEligibilityTelemetry.js +52 -0
  137. package/lib/esm/components/livechatwidget/common/startChat.js +31 -14
  138. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +159 -20
  139. package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +14 -9
  140. package/lib/esm/components/notificationpanestateful/NotificationPaneStateful.js +17 -10
  141. package/lib/esm/components/ooohpanestateful/OOOHPaneStateful.js +12 -5
  142. package/lib/esm/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +28 -5
  143. package/lib/esm/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +11 -4
  144. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +105 -11
  145. package/lib/esm/components/prechatsurveypanestateful/common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps.js +12 -1
  146. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +16 -6
  147. package/lib/esm/components/reconnectchatpanestateful/ReconnectChatPaneStateful.js +15 -6
  148. package/lib/esm/components/startchaterrorpanestateful/StartChatErrorPaneStateful.js +9 -1
  149. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +154 -29
  150. package/lib/esm/components/webchatcontainerstateful/common/DesignerChatAdapter.js +10 -0
  151. package/lib/esm/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.js +115 -10
  152. package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts.js +3 -0
  153. package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps.js +2 -1
  154. package/lib/esm/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +3 -1
  155. package/lib/esm/components/webchatcontainerstateful/common/defaultStyles/defaultWebChatStyles.js +2 -2
  156. package/lib/esm/components/webchatcontainerstateful/common/utils/chatAdapterUtils.js +3 -1
  157. package/lib/esm/components/webchatcontainerstateful/common/utils/citationA11y.js +188 -0
  158. package/lib/esm/components/webchatcontainerstateful/interfaces/IWebChatAction.js +10 -1
  159. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.js +27 -4
  160. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsEgressMiddleware.js +1 -3
  161. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsIngressMiddleware.js +1 -3
  162. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.js +180 -190
  163. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LoadInlineBannerActivity.js +3 -5
  164. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +19 -4
  165. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +12 -23
  166. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +27 -32
  167. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/AdaptiveCardAccessibilityWrapper.js +193 -0
  168. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/Attachment.js +28 -14
  169. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware.js +5 -12
  170. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +1 -1
  171. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultAvatarTextStyles.js +1 -1
  172. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageStyles.js +8 -3
  173. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultTimestampRetryStyles.js +8 -1
  174. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/groupActivitiesMiddleware.js +5 -8
  175. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware.js +6 -4
  176. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +6 -4
  177. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +13 -11
  178. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/HistoryMessageTimestamp.js +15 -13
  179. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +17 -27
  180. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +9 -1
  181. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/toastMiddleware.js +1 -3
  182. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +16 -10
  183. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.js +6 -6
  184. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware.js +77 -0
  185. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.js +36 -8
  186. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.js +5 -2
  187. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.js +10 -7
  188. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +4 -0
  189. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -4
  190. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.js +5 -1
  191. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware.js +7 -7
  192. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/gifUploadMiddleware.js +10 -14
  193. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlPlayerMiddleware.js +6 -4
  194. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware.js +13 -10
  195. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +57 -11
  196. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator.js +6 -4
  197. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware.js +25 -31
  198. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +10 -7
  199. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware.js +6 -4
  200. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.js +55 -1
  201. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +2 -4
  202. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +5 -0
  203. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +17 -1
  204. package/lib/esm/contexts/createReducer.js +15 -0
  205. package/lib/esm/controller/componentController.js +13 -1
  206. package/lib/esm/hooks/useWindowDimensions.js +13 -5
  207. package/lib/esm/plugins/createChatTranscript.js +3 -4
  208. package/lib/esm/plugins/newMessageEventHandler.js +20 -3
  209. package/lib/types/common/Constants.d.ts +4 -0
  210. package/lib/types/common/facades/FacadeChatSDK.d.ts +29 -0
  211. package/lib/types/common/facades/types/IFacadeChatSDKInput.d.ts +3 -1
  212. package/lib/types/common/telemetry/TelemetryConstants.d.ts +15 -2
  213. package/lib/types/common/telemetry/sanitizeSasInPayload.d.ts +24 -0
  214. package/lib/types/common/utils.d.ts +3 -1
  215. package/lib/types/components/livechatwidget/common/ChatWidgetEvents.d.ts +2 -1
  216. package/lib/types/components/livechatwidget/common/authHelper.d.ts +9 -2
  217. package/lib/types/components/livechatwidget/common/recoveryEligibilityTelemetry.d.ts +17 -0
  218. package/lib/types/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.d.ts +6 -0
  219. package/lib/types/components/webchatcontainerstateful/common/utils/chatAdapterUtils.d.ts +1 -1
  220. package/lib/types/components/webchatcontainerstateful/common/utils/citationA11y.d.ts +1 -0
  221. package/lib/types/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.d.ts +1 -0
  222. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatAction.d.ts +16 -1
  223. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +7 -0
  224. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.d.ts +14 -38
  225. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.d.ts +2 -0
  226. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/AdaptiveCardAccessibilityWrapper.d.ts +18 -0
  227. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageStyles.d.ts +3 -0
  228. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware.d.ts +2 -4
  229. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.d.ts +2 -4
  230. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.d.ts +2 -4
  231. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware.d.ts +10 -0
  232. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.d.ts +2 -4
  233. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.d.ts +2 -2
  234. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.d.ts +2 -4
  235. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.d.ts +2 -2
  236. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.d.ts +2 -4
  237. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.d.ts +2 -2
  238. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware.d.ts +2 -4
  239. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/gifUploadMiddleware.d.ts +2 -4
  240. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlPlayerMiddleware.d.ts +2 -4
  241. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware.d.ts +2 -4
  242. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.d.ts +2 -4
  243. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator.d.ts +2 -4
  244. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware.d.ts +2 -4
  245. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.d.ts +2 -2
  246. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware.d.ts +2 -4
  247. package/lib/types/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.d.ts +7 -0
  248. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
  249. package/lib/types/contexts/common/ILiveChatWidgetLocalizedTexts.d.ts +17 -0
  250. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +2 -1
  251. package/package.json +71 -57
@@ -70,26 +70,66 @@ export const findAllFocusableElement = parent => {
70
70
  export const preventFocusToMoveOutOfElement = elementId => {
71
71
  const container = document.getElementById(elementId);
72
72
  if (!container) {
73
- return;
73
+ return () => {/* no-op */};
74
74
  }
75
75
  const focusableElements = findAllFocusableElement(container);
76
76
  if (!focusableElements) {
77
- return;
77
+ return () => {/* no-op */};
78
78
  }
79
79
  const firstFocusableElement = focusableElements[0];
80
80
  const lastFocusableElement = focusableElements[focusableElements.length - 1];
81
- firstFocusableElement.onkeydown = e => {
82
- if (e.shiftKey && e.key === KeyCodes.TAB) {
83
- e.preventDefault();
84
- lastFocusableElement === null || lastFocusableElement === void 0 || lastFocusableElement.focus();
85
- }
86
- };
87
- lastFocusableElement.onkeydown = e => {
88
- if (!e.shiftKey && e.key === KeyCodes.TAB) {
89
- e.preventDefault();
90
- firstFocusableElement === null || firstFocusableElement === void 0 || firstFocusableElement.focus();
81
+ const cleanups = [];
82
+ if (firstFocusableElement === lastFocusableElement) {
83
+ const handler = e => {
84
+ if (e.key === KeyCodes.TAB && !e.shiftKey) {
85
+ e.preventDefault();
86
+ firstFocusableElement.focus();
87
+ } else if (e.key === KeyCodes.TAB && e.shiftKey) {
88
+ e.preventDefault();
89
+ firstFocusableElement.focus();
90
+ }
91
+ };
92
+ firstFocusableElement.addEventListener("keydown", handler);
93
+ cleanups.push(() => firstFocusableElement.removeEventListener("keydown", handler));
94
+ } else {
95
+ const firstHandler = e => {
96
+ if (e.shiftKey && e.key === KeyCodes.TAB) {
97
+ e.preventDefault();
98
+ lastFocusableElement === null || lastFocusableElement === void 0 || lastFocusableElement.focus();
99
+ }
100
+ };
101
+ firstFocusableElement.addEventListener("keydown", firstHandler);
102
+ cleanups.push(() => firstFocusableElement.removeEventListener("keydown", firstHandler));
103
+ const lastHandler = e => {
104
+ if (!e.shiftKey && e.key === KeyCodes.TAB) {
105
+ e.preventDefault();
106
+ firstFocusableElement === null || firstFocusableElement === void 0 || firstFocusableElement.focus();
107
+ }
108
+ };
109
+ lastFocusableElement.addEventListener("keydown", lastHandler);
110
+ cleanups.push(() => lastFocusableElement.removeEventListener("keydown", lastHandler));
111
+ }
112
+ return () => cleanups.forEach(fn => fn());
113
+ };
114
+ export const setAriaHiddenForSiblings = (elementId, shouldHide, stateMap) => {
115
+ const element = document.getElementById(elementId);
116
+ if (!(element !== null && element !== void 0 && element.parentElement)) return;
117
+ Array.from(element.parentElement.children).forEach(sibling => {
118
+ if (sibling !== element) {
119
+ if (shouldHide) {
120
+ stateMap.set(sibling, sibling.getAttribute("aria-hidden"));
121
+ sibling.setAttribute("aria-hidden", "true");
122
+ } else if (stateMap.has(sibling)) {
123
+ const original = stateMap.get(sibling);
124
+ if (original === null) {
125
+ sibling.removeAttribute("aria-hidden");
126
+ } else {
127
+ sibling.setAttribute("aria-hidden", original);
128
+ }
129
+ stateMap.delete(sibling);
130
+ }
91
131
  }
92
- };
132
+ });
93
133
  };
94
134
  export const setFocusOnSendBox = () => {
95
135
  const sendBoxSelector = "textarea[data-id=\"webchat-sendbox-input\"]";
@@ -99,6 +139,40 @@ export const setFocusOnElement = selector => {
99
139
  const element = getElementBySelector(selector);
100
140
  element === null || element === void 0 || element.focus();
101
141
  };
142
+ const IMMEDIATE_ANNOUNCEMENT_REGION_ID = "oc-lcw-immediate-announcement";
143
+
144
+ // Announces a message to screen readers via an aria-live="assertive" region
145
+ // attached to document.body — outside the chat widget's DOM subtree — so the
146
+ // screen reader does not have to traverse chat content to reach it.
147
+ export const announceMessageImmediately = message => {
148
+ if (!message || typeof document === "undefined") {
149
+ return;
150
+ }
151
+ let region = document.getElementById(IMMEDIATE_ANNOUNCEMENT_REGION_ID);
152
+ if (!region) {
153
+ region = document.createElement("div");
154
+ region.id = IMMEDIATE_ANNOUNCEMENT_REGION_ID;
155
+ region.setAttribute("aria-live", "assertive");
156
+ region.setAttribute("role", "alert");
157
+ region.setAttribute("aria-atomic", "true");
158
+ region.style.position = "absolute";
159
+ region.style.width = "1px";
160
+ region.style.height = "1px";
161
+ region.style.overflow = "hidden";
162
+ region.style.clip = "rect(0 0 0 0)";
163
+ region.style.clipPath = "inset(50%)";
164
+ region.style.whiteSpace = "nowrap";
165
+ document.body.appendChild(region);
166
+ }
167
+ region.textContent = "";
168
+ // Re-set on the next tick so screen readers detect the change even when
169
+ // the same message is announced twice in a row.
170
+ setTimeout(() => {
171
+ if (region) {
172
+ region.textContent = message;
173
+ }
174
+ }, 50);
175
+ };
102
176
  export const escapeHtml = inputString => {
103
177
  const entityMap = {
104
178
  "<": "&lt;",
@@ -435,7 +509,7 @@ export const setOcUserAgent = chatSDK => {
435
509
  // eslint-disable-line @typescript-eslint/no-explicit-any
436
510
  if ((_chatSDK$OCClient = chatSDK.OCClient) !== null && _chatSDK$OCClient !== void 0 && _chatSDK$OCClient.ocUserAgent && !((_chatSDK$OCClient2 = chatSDK.OCClient) !== null && _chatSDK$OCClient2 !== void 0 && _chatSDK$OCClient2.ocUserAgent.join(" ").includes("omnichannel-chat-widget/"))) {
437
511
  try {
438
- const version = require("../../../package.json").version; // eslint-disable-line @typescript-eslint/no-var-requires
512
+ const version = require("../../package.json").version; // eslint-disable-line @typescript-eslint/no-var-requires
439
513
  const userAgent = `omnichannel-chat-widget/${version}`;
440
514
  chatSDK.OCClient.ocUserAgent = [userAgent, ...chatSDK.OCClient.ocUserAgent];
441
515
  } catch (error) {
@@ -1,3 +1,9 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
7
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
8
  import React, { useCallback, useEffect } from "react";
3
9
  import { CallingContainer } from "@microsoft/omnichannel-chat-components";
@@ -7,12 +13,16 @@ import useChatContextStore from "../../hooks/useChatContextStore";
7
13
  import useFacadeSDKStore from "../../hooks/useFacadeChatSDKStore";
8
14
  export const CallingContainerStateful = props => {
9
15
  var _props$controlProps, _props$controlProps2, _props$controlProps3, _props$controlProps4, _props$controlProps5;
10
- const [state, dispatch] = useChatContextStore();
11
- const [facadeChatSDK] = useFacadeSDKStore();
16
+ const _useChatContextStore = useChatContextStore(),
17
+ _useChatContextStore2 = _slicedToArray(_useChatContextStore, 2),
18
+ state = _useChatContextStore2[0],
19
+ dispatch = _useChatContextStore2[1];
20
+ const _useFacadeSDKStore = useFacadeSDKStore(),
21
+ _useFacadeSDKStore2 = _slicedToArray(_useFacadeSDKStore, 1),
22
+ facadeChatSDK = _useFacadeSDKStore2[0];
12
23
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- const {
14
- voiceVideoCallingSdk
15
- } = props;
24
+ const _ref = props,
25
+ voiceVideoCallingSdk = _ref.voiceVideoCallingSdk;
16
26
  let callId;
17
27
  const resetCallingStates = reset => {
18
28
  if (reset) {
@@ -1,3 +1,9 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
7
  import { ConversationStage, LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
8
  import React, { useEffect, useRef, useState } from "react";
3
9
  import { createTimer, setFocusOnElement } from "../../common/utils";
@@ -25,18 +31,22 @@ export const ChatButtonStateful = props => {
25
31
  }, []);
26
32
 
27
33
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
- const [state, dispatch] = useChatContextStore();
29
- const {
30
- buttonProps,
31
- outOfOfficeButtonProps,
32
- startChat
33
- } = props;
34
+ const _useChatContextStore = useChatContextStore(),
35
+ _useChatContextStore2 = _slicedToArray(_useChatContextStore, 2),
36
+ state = _useChatContextStore2[0],
37
+ dispatch = _useChatContextStore2[1];
38
+ const buttonProps = props.buttonProps,
39
+ outOfOfficeButtonProps = props.outOfOfficeButtonProps,
40
+ startChat = props.startChat;
34
41
  //Setting OutOfOperatingHours Flag
35
42
  //Setting OutOfOperatingHours Flag - to string conversion to normalize the value (could be boolean from other states or string directly from config)
36
43
  // Initialize with the current state value to prevent visual flicker
37
- const [outOfOperatingHours, setOutOfOperatingHours] = useState(() => {
38
- return state.appStates.conversationState === ConversationState.Closed && state.appStates.outsideOperatingHours;
39
- });
44
+ const _useState = useState(() => {
45
+ return state.appStates.conversationState === ConversationState.Closed && state.appStates.outsideOperatingHours;
46
+ }),
47
+ _useState2 = _slicedToArray(_useState, 2),
48
+ outOfOperatingHours = _useState2[0],
49
+ setOutOfOperatingHours = _useState2[1];
40
50
  const ref = useRef(() => {
41
51
  return;
42
52
  });
@@ -3,9 +3,8 @@ import ReactDOM from "react-dom";
3
3
  import { DimLayer } from "../dimlayer/DimLayer";
4
4
  const CONTAINER_SELECTOR = ".webchat__stacked-layout_container";
5
5
  export const CitationDim = _ref => {
6
- let {
7
- brightness = "0.2"
8
- } = _ref;
6
+ let _ref$brightness = _ref.brightness,
7
+ brightness = _ref$brightness === void 0 ? "0.2" : _ref$brightness;
9
8
  const container = document.querySelector(CONTAINER_SELECTOR);
10
9
  if (!container) return null;
11
10
  return /*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div", {
@@ -1,3 +1,9 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
7
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
8
  import React, { useEffect, useState } from "react";
3
9
  import { createTimer, findAllFocusableElement, findParentFocusableElementsWithoutChildContainer, preventFocusToMoveOutOfElement, setTabIndices } from "../../common/utils";
@@ -21,7 +27,10 @@ export const CitationPaneStateful = props => {
21
27
  let elements = [];
22
28
 
23
29
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
24
- const [state, dispatch] = useChatContextStore();
30
+ const _useChatContextStore = useChatContextStore(),
31
+ _useChatContextStore2 = _slicedToArray(_useChatContextStore, 2),
32
+ state = _useChatContextStore2[0],
33
+ dispatch = _useChatContextStore2[1];
25
34
 
26
35
  // Use props.id if provided, otherwise fall back to default
27
36
  const controlId = props.id || HtmlAttributeNames.ocwCitationPaneClassName;
@@ -30,12 +39,18 @@ export const CitationPaneStateful = props => {
30
39
  // stays within the widget and scrolls only vertically. We also track an
31
40
  // "isReady" flag so we don't render the pane contents until the style is
32
41
  // computed — this prevents a transient render that can appear as a flicker.
33
- const [paneStyle, setPaneStyle] = useState(null);
34
- const [isReady, setIsReady] = useState(false);
42
+ const _useState = useState(null),
43
+ _useState2 = _slicedToArray(_useState, 2),
44
+ paneStyle = _useState2[0],
45
+ setPaneStyle = _useState2[1];
46
+ const _useState3 = useState(false),
47
+ _useState4 = _slicedToArray(_useState3, 2),
48
+ isReady = _useState4[0],
49
+ setIsReady = _useState4[1];
35
50
 
36
51
  // Initial focus pattern (mirrors ConfirmationPaneStateful): focus first focusable element (will re-attempt after visibility becomes true)
37
52
  useEffect(() => {
38
- preventFocusToMoveOutOfElement(controlId);
53
+ const cleanup = preventFocusToMoveOutOfElement(controlId);
39
54
  const focusableElements = findAllFocusableElement(`#${controlId}`);
40
55
  requestAnimationFrame(() => {
41
56
  if (focusableElements && focusableElements.length > 0 && focusableElements[0]) {
@@ -53,6 +68,13 @@ export const CitationPaneStateful = props => {
53
68
  Event: TelemetryEvent.UXCitationPaneCompleted,
54
69
  ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
55
70
  });
71
+ return () => {
72
+ // internal tracking: restore parent tab indices on unmount so focus
73
+ // can escape the widget even if the pane is dismissed by an
74
+ // external state change rather than a user button click.
75
+ setTabIndices(elements, initialTabIndexMap, true);
76
+ cleanup();
77
+ };
56
78
  }, []);
57
79
 
58
80
  // Retry focus once pane is actually visible (isReady) in case initial attempt occurred while wrapper was visibility:hidden
@@ -1,3 +1,9 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
7
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
8
  import React, { useEffect } from "react";
3
9
  import { createTimer, findAllFocusableElement, findParentFocusableElementsWithoutChildContainer, preventFocusToMoveOutOfElement, setFocusOnElement, setFocusOnSendBox, setTabIndices } from "../../common/utils";
@@ -19,7 +25,10 @@ export const ConfirmationPaneStateful = props => {
19
25
  }, []);
20
26
  const initialTabIndexMap = new Map();
21
27
  let elements = [];
22
- const [state, dispatch] = useChatContextStore();
28
+ const _useChatContextStore = useChatContextStore(),
29
+ _useChatContextStore2 = _slicedToArray(_useChatContextStore, 2),
30
+ state = _useChatContextStore2[0],
31
+ dispatch = _useChatContextStore2[1];
23
32
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
24
33
  const controlProps = {
25
34
  id: "oc-lcw-confirmation-pane",
@@ -73,7 +82,7 @@ export const ConfirmationPaneStateful = props => {
73
82
 
74
83
  // Move focus to the first button
75
84
  useEffect(() => {
76
- preventFocusToMoveOutOfElement(controlProps.id);
85
+ const cleanup = preventFocusToMoveOutOfElement(controlProps.id);
77
86
  const focusableElements = findAllFocusableElement(`#${controlProps.id}`);
78
87
  requestAnimationFrame(() => {
79
88
  if (focusableElements && focusableElements.length > 0 && focusableElements[0]) {
@@ -91,6 +100,17 @@ export const ConfirmationPaneStateful = props => {
91
100
  Event: TelemetryEvent.UXConfirmationPaneCompleted,
92
101
  ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
93
102
  });
103
+ return () => {
104
+ // internal tracking: when the confirmation pane unmounts (page reload,
105
+ // parent state change, or any path that bypasses onConfirm /
106
+ // onCancel) the tab indices that were forced to -1 on sibling
107
+ // focusable elements must be restored, otherwise Tab order
108
+ // remains broken and focus can be trapped inside the widget.
109
+ // setTabIndices is a no-op when initialTabIndexMap is already
110
+ // empty (onConfirm / onCancel already restored).
111
+ setTabIndices(elements, initialTabIndexMap, true);
112
+ cleanup();
113
+ };
94
114
  }, []);
95
115
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DimLayer, {
96
116
  brightness: (controlProps === null || controlProps === void 0 ? void 0 : controlProps.brightnessValueOnDim) ?? "0.2"
@@ -1,8 +1,6 @@
1
1
  import React from "react";
2
2
  export const DimLayer = _ref => {
3
- let {
4
- brightness
5
- } = _ref;
3
+ let brightness = _ref.brightness;
6
4
  const color = "rgba(0, 0, 0, " + brightness + ")";
7
5
  const defaultDimLayerStyles = {
8
6
  position: "absolute",
@@ -1,3 +1,9 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
7
  import React, { useCallback, useEffect, useState } from "react";
2
8
  import DraggableEventReceiver from "./DraggableEventReceiver";
3
9
  import DraggableEventNames from "./DraggableEventNames";
@@ -5,20 +11,34 @@ import useChatContextStore from "../../hooks/useChatContextStore";
5
11
  import { ConversationState } from "../../contexts/common/ConversationState";
6
12
  import { isNullOrUndefined } from "../../common/utils";
7
13
  const DraggableChatWidget = props => {
8
- const [state] = useChatContextStore();
9
- const [initialPosition, setInitialPosition] = useState({
10
- offsetLeft: 0,
11
- offsetTop: 0
12
- });
13
- const [cachedPosition, setCachedPosition] = useState(undefined);
14
- const [position, setPosition] = useState({
15
- offsetLeft: 0,
16
- offsetTop: 0
17
- });
18
- const [delta, setDelta] = useState({
19
- left: 0,
20
- top: 0
21
- });
14
+ const _useChatContextStore = useChatContextStore(),
15
+ _useChatContextStore2 = _slicedToArray(_useChatContextStore, 1),
16
+ state = _useChatContextStore2[0];
17
+ const _useState = useState({
18
+ offsetLeft: 0,
19
+ offsetTop: 0
20
+ }),
21
+ _useState2 = _slicedToArray(_useState, 2),
22
+ initialPosition = _useState2[0],
23
+ setInitialPosition = _useState2[1];
24
+ const _useState3 = useState(undefined),
25
+ _useState4 = _slicedToArray(_useState3, 2),
26
+ cachedPosition = _useState4[0],
27
+ setCachedPosition = _useState4[1];
28
+ const _useState5 = useState({
29
+ offsetLeft: 0,
30
+ offsetTop: 0
31
+ }),
32
+ _useState6 = _slicedToArray(_useState5, 2),
33
+ position = _useState6[0],
34
+ setPosition = _useState6[1];
35
+ const _useState7 = useState({
36
+ left: 0,
37
+ top: 0
38
+ }),
39
+ _useState8 = _slicedToArray(_useState7, 2),
40
+ delta = _useState8[0],
41
+ setDelta = _useState8[1];
22
42
  const repositionElement = (draggableElement, offsetLeft, offsetTop) => {
23
43
  draggableElement.style.left = `${offsetLeft}px`;
24
44
  draggableElement.style.top = `${offsetTop}px`;
@@ -1,3 +1,9 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
7
  import React, { useCallback, useEffect, useState } from "react";
2
8
  import DraggableEventNames from "./DraggableEventNames";
3
9
  /**
@@ -7,7 +13,10 @@ import DraggableEventNames from "./DraggableEventNames";
7
13
  * @returns
8
14
  */
9
15
  const DraggableEventEmitter = props => {
10
- const [initialized, setInitialized] = useState(false);
16
+ const _useState = useState(false),
17
+ _useState2 = _slicedToArray(_useState, 2),
18
+ initialized = _useState2[0],
19
+ setInitialized = _useState2[1];
11
20
  const postMessage = useCallback(data => {
12
21
  const targetWindow = props.targetWindow ?? window;
13
22
  targetWindow.postMessage(data, "*");
@@ -8,9 +8,7 @@ import React, { useEffect } from "react";
8
8
  const DraggableEventReceiver = props => {
9
9
  useEffect(() => {
10
10
  const listener = event => {
11
- const {
12
- data
13
- } = event;
11
+ const data = event.data;
14
12
  if (data.channel && props.channel && data.channel === props.channel) {
15
13
  props.onEvent(data);
16
14
  }
@@ -1,6 +1,12 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
7
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
8
  import React, { useCallback, useEffect, useState } from "react";
3
- import { createTimer, findAllFocusableElement, findParentFocusableElementsWithoutChildContainer, formatTemplateString, preventFocusToMoveOutOfElement, setFocusOnElement, setFocusOnSendBox, setTabIndices } from "../../common/utils";
9
+ import { announceMessageImmediately, createTimer, findAllFocusableElement, findParentFocusableElementsWithoutChildContainer, formatTemplateString, preventFocusToMoveOutOfElement, setFocusOnElement, setFocusOnSendBox, setTabIndices } from "../../common/utils";
4
10
  import { DimLayer } from "../dimlayer/DimLayer";
5
11
  import { InputValidationPane } from "@microsoft/omnichannel-chat-components";
6
12
  import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
@@ -23,19 +29,34 @@ export const EmailTranscriptPaneStateful = props => {
23
29
  }, []);
24
30
  const initialTabIndexMap = new Map();
25
31
  let elements = [];
26
- const [state, dispatch] = useChatContextStore();
27
- const [facadeChatSDK] = useFacadeSDKStore();
28
- const [initialEmail, setInitialEmail] = useState("");
29
- const closeEmailTranscriptPane = () => {
32
+ const _useChatContextStore = useChatContextStore(),
33
+ _useChatContextStore2 = _slicedToArray(_useChatContextStore, 2),
34
+ state = _useChatContextStore2[0],
35
+ dispatch = _useChatContextStore2[1];
36
+ const _useFacadeSDKStore = useFacadeSDKStore(),
37
+ _useFacadeSDKStore2 = _slicedToArray(_useFacadeSDKStore, 1),
38
+ facadeChatSDK = _useFacadeSDKStore2[0];
39
+ const _useState = useState(""),
40
+ _useState2 = _slicedToArray(_useState, 2),
41
+ initialEmail = _useState2[0],
42
+ setInitialEmail = _useState2[1];
43
+ // restoreFocus=false is used on the submit path: the notification banner
44
+ // (success or error) takes focus via NotificationHandler.setFocusOnNotificationCloseButton,
45
+ // so an intermediate restore to the chat-widget shell would otherwise cause SRs to
46
+ // announce "Enter <widget>" in between the dialog and the banner.
47
+ const closeEmailTranscriptPane = function () {
48
+ let restoreFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
30
49
  dispatch({
31
50
  type: LiveChatWidgetActionType.SET_SHOW_EMAIL_TRANSCRIPT_PANE,
32
51
  payload: false
33
52
  });
34
- const previousFocusedElementId = state.appStates.previousElementIdOnFocusBeforeModalOpen;
35
- if (previousFocusedElementId) {
36
- setFocusOnElement("#" + previousFocusedElementId);
37
- } else {
38
- setFocusOnSendBox();
53
+ if (restoreFocus) {
54
+ const previousFocusedElementId = state.appStates.previousElementIdOnFocusBeforeModalOpen;
55
+ if (previousFocusedElementId) {
56
+ setFocusOnElement("#" + previousFocusedElementId);
57
+ } else {
58
+ setFocusOnSendBox();
59
+ }
39
60
  }
40
61
  dispatch({
41
62
  type: LiveChatWidgetActionType.SET_PREVIOUS_FOCUSED_ELEMENT_ID,
@@ -46,23 +67,31 @@ export const EmailTranscriptPaneStateful = props => {
46
67
  const onSend = useCallback(async email => {
47
68
  var _state$domainStates;
48
69
  const liveChatContext = state === null || state === void 0 || (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.liveChatContext;
49
- closeEmailTranscriptPane();
70
+ closeEmailTranscriptPane(false);
50
71
  const chatTranscriptBody = {
51
72
  emailAddress: email,
52
73
  attachmentMessage: (props === null || props === void 0 ? void 0 : props.attachmentMessage) ?? "The following attachment was uploaded during the conversation:"
53
74
  };
54
75
  try {
55
- var _state$domainStates2;
76
+ var _state$domainStates2, _state$domainStates3;
56
77
  await (facadeChatSDK === null || facadeChatSDK === void 0 ? void 0 : facadeChatSDK.emailLiveChatTranscript(chatTranscriptBody, {
57
78
  liveChatContext
58
79
  }));
59
- NotificationHandler.notifySuccess(NotificationScenarios.EmailAddressSaved, (state === null || state === void 0 || (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 || (_state$domainStates2 = _state$domainStates2.middlewareLocalizedTexts) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_SUCCESS) ?? (defaultMiddlewareLocalizedTexts === null || defaultMiddlewareLocalizedTexts === void 0 ? void 0 : defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_SUCCESS));
80
+ const successMessage = (state === null || state === void 0 || (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 || (_state$domainStates2 = _state$domainStates2.middlewareLocalizedTexts) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_SUCCESS) ?? (defaultMiddlewareLocalizedTexts === null || defaultMiddlewareLocalizedTexts === void 0 ? void 0 : defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_SUCCESS);
81
+ // Announce from a live region at document.body level so the
82
+ // screen reader speaks the confirmation immediately, without
83
+ // traversing the chat transcript on the way to the banner.
84
+ // Prefix with the explicit state word so SR users hear the outcome
85
+ // (visual users already see a success icon on the banner).
86
+ const successSrPrefix = (state === null || state === void 0 || (_state$domainStates3 = state.domainStates) === null || _state$domainStates3 === void 0 || (_state$domainStates3 = _state$domainStates3.middlewareLocalizedTexts) === null || _state$domainStates3 === void 0 ? void 0 : _state$domainStates3.MIDDLEWARE_SR_PREFIX_SUCCESS) ?? defaultMiddlewareLocalizedTexts.MIDDLEWARE_SR_PREFIX_SUCCESS;
87
+ announceMessageImmediately(`${successSrPrefix}${successMessage}`);
88
+ NotificationHandler.notifySuccess(NotificationScenarios.EmailAddressSaved, successMessage);
60
89
  TelemetryHelper.logActionEventToAllTelemetry(LogLevel.INFO, {
61
90
  Event: TelemetryEvent.EmailTranscriptSent,
62
91
  Description: "Transcript sent to email successfully."
63
92
  });
64
93
  } catch (ex) {
65
- var _state$domainStates3;
94
+ var _state$domainStates4, _state$domainStates5;
66
95
  TelemetryHelper.logActionEventToAllTelemetry(LogLevel.ERROR, {
67
96
  Event: TelemetryEvent.EmailTranscriptFailed,
68
97
  Description: "Email transcript failed.",
@@ -70,8 +99,11 @@ export const EmailTranscriptPaneStateful = props => {
70
99
  exception: ex
71
100
  }
72
101
  });
73
- const message = formatTemplateString((state === null || state === void 0 || (_state$domainStates3 = state.domainStates) === null || _state$domainStates3 === void 0 || (_state$domainStates3 = _state$domainStates3.middlewareLocalizedTexts) === null || _state$domainStates3 === void 0 ? void 0 : _state$domainStates3.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_ERROR) ?? defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_ERROR, [email]);
74
- NotificationHandler.notifyError(NotificationScenarios.EmailTranscriptError, (props === null || props === void 0 ? void 0 : props.bannerMessageOnError) ?? message);
102
+ const message = formatTemplateString((state === null || state === void 0 || (_state$domainStates4 = state.domainStates) === null || _state$domainStates4 === void 0 || (_state$domainStates4 = _state$domainStates4.middlewareLocalizedTexts) === null || _state$domainStates4 === void 0 ? void 0 : _state$domainStates4.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_ERROR) ?? defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_ERROR, [email]);
103
+ const bannerMessage = (props === null || props === void 0 ? void 0 : props.bannerMessageOnError) ?? message;
104
+ const errorSrPrefix = (state === null || state === void 0 || (_state$domainStates5 = state.domainStates) === null || _state$domainStates5 === void 0 || (_state$domainStates5 = _state$domainStates5.middlewareLocalizedTexts) === null || _state$domainStates5 === void 0 ? void 0 : _state$domainStates5.MIDDLEWARE_SR_PREFIX_ERROR) ?? defaultMiddlewareLocalizedTexts.MIDDLEWARE_SR_PREFIX_ERROR;
105
+ announceMessageImmediately(`${errorSrPrefix}${bannerMessage}`);
106
+ NotificationHandler.notifyError(NotificationScenarios.EmailTranscriptError, bannerMessage);
75
107
  }
76
108
  }, [props.attachmentMessage, props.bannerMessageOnError, facadeChatSDK, state.domainStates.liveChatContext]);
77
109
  const controlProps = {
@@ -94,7 +126,7 @@ export const EmailTranscriptPaneStateful = props => {
94
126
 
95
127
  // Move focus to the first button
96
128
  useEffect(() => {
97
- preventFocusToMoveOutOfElement(controlProps.id);
129
+ const cleanup = preventFocusToMoveOutOfElement(controlProps.id);
98
130
  const focusableElements = findAllFocusableElement(`#${controlProps.id}`);
99
131
  if (focusableElements) {
100
132
  focusableElements[0].focus();
@@ -109,6 +141,11 @@ export const EmailTranscriptPaneStateful = props => {
109
141
  Event: TelemetryEvent.UXEmailTranscriptPaneCompleted,
110
142
  ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
111
143
  });
144
+ return () => {
145
+ // internal tracking: restore parent tab indices on unmount.
146
+ setTabIndices(elements, initialTabIndexMap, true);
147
+ cleanup();
148
+ };
112
149
  }, [initialEmail]);
113
150
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DimLayer, {
114
151
  brightness: (controlProps === null || controlProps === void 0 ? void 0 : controlProps.brightnessValueOnDim) ?? "0.2"
@@ -14,9 +14,7 @@ import React, { Component } from "react";
14
14
 
15
15
  // eslint-disable-next-line @typescript-eslint/ban-types
16
16
  const RenderChildrenFunction = _ref => {
17
- let {
18
- children
19
- } = _ref;
17
+ let children = _ref.children;
20
18
  return typeof children === "function" ? children() : children;
21
19
  };
22
20
  let ErrorBoundary = /*#__PURE__*/function (_Component) {
@@ -33,9 +31,7 @@ let ErrorBoundary = /*#__PURE__*/function (_Component) {
33
31
  return _createClass(ErrorBoundary, [{
34
32
  key: "componentDidCatch",
35
33
  value: function componentDidCatch(error) {
36
- const {
37
- onError
38
- } = this.props;
34
+ const onError = this.props.onError;
39
35
  this.setState({
40
36
  hasError: true
41
37
  });
@@ -46,12 +42,8 @@ let ErrorBoundary = /*#__PURE__*/function (_Component) {
46
42
  }, {
47
43
  key: "render",
48
44
  value: function render() {
49
- const {
50
- children
51
- } = this.props;
52
- const {
53
- hasError
54
- } = this.state;
45
+ const children = this.props.children;
46
+ const hasError = this.state.hasError;
55
47
  return !hasError && /*#__PURE__*/React.createElement(RenderChildrenFunction, null, children);
56
48
  }
57
49
  }]);