@microsoft/omnichannel-chat-widget 1.8.6 → 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 (258) 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/BotAuthActivitySubscriber.js +23 -6
  26. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/HiddenAdaptiveCardActivitySubscriber.js +5 -11
  27. package/lib/cjs/components/livechatwidget/common/ChatWidgetEvents.js +1 -0
  28. package/lib/cjs/components/livechatwidget/common/PersistentConversationHandler.js +11 -4
  29. package/lib/cjs/components/livechatwidget/common/authHelper.js +44 -4
  30. package/lib/cjs/components/livechatwidget/common/createAdapter.js +3 -2
  31. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +98 -5
  32. package/lib/cjs/components/livechatwidget/common/endChat.js +12 -9
  33. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +182 -1
  34. package/lib/cjs/components/livechatwidget/common/recoveryEligibilityTelemetry.js +60 -0
  35. package/lib/cjs/components/livechatwidget/common/startChat.js +31 -14
  36. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +160 -21
  37. package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +16 -11
  38. package/lib/cjs/components/notificationpanestateful/NotificationPaneStateful.js +19 -12
  39. package/lib/cjs/components/ooohpanestateful/OOOHPaneStateful.js +13 -6
  40. package/lib/cjs/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +28 -5
  41. package/lib/cjs/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +12 -5
  42. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +105 -11
  43. package/lib/cjs/components/prechatsurveypanestateful/common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps.js +12 -1
  44. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +17 -7
  45. package/lib/cjs/components/reconnectchatpanestateful/ReconnectChatPaneStateful.js +16 -7
  46. package/lib/cjs/components/startchaterrorpanestateful/StartChatErrorPaneStateful.js +10 -2
  47. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +154 -29
  48. package/lib/cjs/components/webchatcontainerstateful/common/DesignerChatAdapter.js +10 -0
  49. package/lib/cjs/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.js +115 -10
  50. package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts.js +3 -0
  51. package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps.js +2 -1
  52. package/lib/cjs/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +3 -1
  53. package/lib/cjs/components/webchatcontainerstateful/common/defaultStyles/defaultWebChatStyles.js +2 -2
  54. package/lib/cjs/components/webchatcontainerstateful/common/utils/chatAdapterUtils.js +3 -1
  55. package/lib/cjs/components/webchatcontainerstateful/common/utils/citationA11y.js +195 -0
  56. package/lib/cjs/components/webchatcontainerstateful/interfaces/IWebChatAction.js +17 -1
  57. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.js +27 -4
  58. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsEgressMiddleware.js +1 -3
  59. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsIngressMiddleware.js +1 -3
  60. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.js +180 -190
  61. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LoadInlineBannerActivity.js +3 -5
  62. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +22 -6
  63. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +12 -23
  64. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +27 -35
  65. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/AdaptiveCardAccessibilityWrapper.js +199 -0
  66. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/Attachment.js +29 -15
  67. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware.js +5 -12
  68. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +1 -1
  69. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultAvatarTextStyles.js +1 -1
  70. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageStyles.js +8 -3
  71. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultTimestampRetryStyles.js +8 -1
  72. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/groupActivitiesMiddleware.js +5 -8
  73. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware.js +6 -4
  74. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +6 -4
  75. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +14 -12
  76. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/HistoryMessageTimestamp.js +16 -14
  77. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +18 -30
  78. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +10 -2
  79. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/toastMiddleware.js +1 -3
  80. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +16 -12
  81. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.js +6 -6
  82. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware.js +83 -0
  83. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.js +36 -8
  84. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.js +5 -1
  85. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.js +10 -7
  86. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +4 -0
  87. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -4
  88. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.js +5 -1
  89. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware.js +7 -7
  90. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/gifUploadMiddleware.js +10 -14
  91. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlPlayerMiddleware.js +6 -4
  92. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware.js +13 -10
  93. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +57 -11
  94. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator.js +6 -4
  95. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware.js +25 -30
  96. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +10 -7
  97. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware.js +6 -4
  98. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.js +55 -1
  99. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +2 -4
  100. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +5 -0
  101. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +17 -1
  102. package/lib/cjs/contexts/createReducer.js +15 -0
  103. package/lib/cjs/controller/componentController.js +13 -1
  104. package/lib/cjs/hooks/useWindowDimensions.js +13 -5
  105. package/lib/cjs/package.json +1 -0
  106. package/lib/cjs/plugins/createChatTranscript.js +3 -4
  107. package/lib/cjs/plugins/newMessageEventHandler.js +20 -3
  108. package/lib/esm/common/Constants.js +5 -0
  109. package/lib/esm/common/facades/FacadeChatSDK.js +235 -10
  110. package/lib/esm/common/telemetry/TelemetryConstants.js +19 -0
  111. package/lib/esm/common/telemetry/TelemetryManager.js +6 -1
  112. package/lib/esm/common/telemetry/loggers/appInsightsLogger.js +2 -3
  113. package/lib/esm/common/telemetry/sanitizeSasInPayload.js +84 -0
  114. package/lib/esm/common/utils.js +88 -14
  115. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +15 -5
  116. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +19 -9
  117. package/lib/esm/components/citationpanestateful/CitationDim.js +2 -3
  118. package/lib/esm/components/citationpanestateful/CitationPaneStateful.js +26 -4
  119. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +22 -2
  120. package/lib/esm/components/dimlayer/DimLayer.js +1 -3
  121. package/lib/esm/components/draggable/DraggableChatWidget.js +34 -14
  122. package/lib/esm/components/draggable/DraggableEventEmitter.js +10 -1
  123. package/lib/esm/components/draggable/DraggableEventReceiver.js +1 -3
  124. package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +54 -17
  125. package/lib/esm/components/errorboundary/ErrorBoundary.js +4 -12
  126. package/lib/esm/components/footerstateful/FooterStateful.js +17 -8
  127. package/lib/esm/components/footerstateful/audionotificationstateful/AudioNotificationStateful.js +2 -4
  128. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +4 -6
  129. package/lib/esm/components/headerstateful/HeaderStateful.js +22 -10
  130. package/lib/esm/components/livechatwidget/LiveChatWidget.js +27 -4
  131. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +23 -6
  132. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/HiddenAdaptiveCardActivitySubscriber.js +5 -11
  133. package/lib/esm/components/livechatwidget/common/ChatWidgetEvents.js +1 -0
  134. package/lib/esm/components/livechatwidget/common/PersistentConversationHandler.js +11 -4
  135. package/lib/esm/components/livechatwidget/common/authHelper.js +44 -4
  136. package/lib/esm/components/livechatwidget/common/createAdapter.js +3 -2
  137. package/lib/esm/components/livechatwidget/common/createMarkdown.js +98 -5
  138. package/lib/esm/components/livechatwidget/common/endChat.js +12 -9
  139. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +182 -1
  140. package/lib/esm/components/livechatwidget/common/recoveryEligibilityTelemetry.js +52 -0
  141. package/lib/esm/components/livechatwidget/common/startChat.js +31 -14
  142. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +159 -20
  143. package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +14 -9
  144. package/lib/esm/components/notificationpanestateful/NotificationPaneStateful.js +17 -10
  145. package/lib/esm/components/ooohpanestateful/OOOHPaneStateful.js +12 -5
  146. package/lib/esm/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +28 -5
  147. package/lib/esm/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +11 -4
  148. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +105 -11
  149. package/lib/esm/components/prechatsurveypanestateful/common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps.js +12 -1
  150. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +16 -6
  151. package/lib/esm/components/reconnectchatpanestateful/ReconnectChatPaneStateful.js +15 -6
  152. package/lib/esm/components/startchaterrorpanestateful/StartChatErrorPaneStateful.js +9 -1
  153. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +154 -29
  154. package/lib/esm/components/webchatcontainerstateful/common/DesignerChatAdapter.js +10 -0
  155. package/lib/esm/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.js +115 -10
  156. package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts.js +3 -0
  157. package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps.js +2 -1
  158. package/lib/esm/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +3 -1
  159. package/lib/esm/components/webchatcontainerstateful/common/defaultStyles/defaultWebChatStyles.js +2 -2
  160. package/lib/esm/components/webchatcontainerstateful/common/utils/chatAdapterUtils.js +3 -1
  161. package/lib/esm/components/webchatcontainerstateful/common/utils/citationA11y.js +188 -0
  162. package/lib/esm/components/webchatcontainerstateful/interfaces/IWebChatAction.js +10 -1
  163. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.js +27 -4
  164. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsEgressMiddleware.js +1 -3
  165. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsIngressMiddleware.js +1 -3
  166. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.js +180 -190
  167. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LoadInlineBannerActivity.js +3 -5
  168. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +19 -4
  169. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +12 -23
  170. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +27 -32
  171. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/AdaptiveCardAccessibilityWrapper.js +193 -0
  172. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/Attachment.js +28 -14
  173. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware.js +5 -12
  174. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +1 -1
  175. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultAvatarTextStyles.js +1 -1
  176. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageStyles.js +8 -3
  177. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultTimestampRetryStyles.js +8 -1
  178. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/groupActivitiesMiddleware.js +5 -8
  179. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware.js +6 -4
  180. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +6 -4
  181. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +13 -11
  182. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/HistoryMessageTimestamp.js +15 -13
  183. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +17 -27
  184. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +9 -1
  185. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/toastMiddleware.js +1 -3
  186. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +16 -10
  187. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.js +6 -6
  188. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware.js +77 -0
  189. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.js +36 -8
  190. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.js +5 -2
  191. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.js +10 -7
  192. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +4 -0
  193. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -4
  194. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.js +5 -1
  195. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware.js +7 -7
  196. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/gifUploadMiddleware.js +10 -14
  197. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlPlayerMiddleware.js +6 -4
  198. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware.js +13 -10
  199. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +57 -11
  200. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator.js +6 -4
  201. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware.js +25 -31
  202. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +10 -7
  203. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware.js +6 -4
  204. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.js +55 -1
  205. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +2 -4
  206. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +5 -0
  207. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +17 -1
  208. package/lib/esm/contexts/createReducer.js +15 -0
  209. package/lib/esm/controller/componentController.js +13 -1
  210. package/lib/esm/hooks/useWindowDimensions.js +13 -5
  211. package/lib/esm/plugins/createChatTranscript.js +3 -4
  212. package/lib/esm/plugins/newMessageEventHandler.js +20 -3
  213. package/lib/types/common/Constants.d.ts +4 -0
  214. package/lib/types/common/facades/FacadeChatSDK.d.ts +29 -0
  215. package/lib/types/common/facades/types/IFacadeChatSDKInput.d.ts +3 -1
  216. package/lib/types/common/telemetry/TelemetryConstants.d.ts +15 -2
  217. package/lib/types/common/telemetry/sanitizeSasInPayload.d.ts +24 -0
  218. package/lib/types/common/utils.d.ts +3 -1
  219. package/lib/types/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.d.ts +1 -0
  220. package/lib/types/components/livechatwidget/common/ChatWidgetEvents.d.ts +2 -1
  221. package/lib/types/components/livechatwidget/common/authHelper.d.ts +9 -2
  222. package/lib/types/components/livechatwidget/common/recoveryEligibilityTelemetry.d.ts +17 -0
  223. package/lib/types/components/livechatwidget/interfaces/IBotAuthActivitySubscriberOptionalParams.d.ts +1 -0
  224. package/lib/types/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.d.ts +6 -0
  225. package/lib/types/components/webchatcontainerstateful/common/utils/chatAdapterUtils.d.ts +1 -1
  226. package/lib/types/components/webchatcontainerstateful/common/utils/citationA11y.d.ts +1 -0
  227. package/lib/types/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.d.ts +1 -0
  228. package/lib/types/components/webchatcontainerstateful/interfaces/IBotAuthConfig.d.ts +7 -0
  229. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatAction.d.ts +16 -1
  230. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +7 -0
  231. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.d.ts +14 -38
  232. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.d.ts +2 -0
  233. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/AdaptiveCardAccessibilityWrapper.d.ts +18 -0
  234. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageStyles.d.ts +3 -0
  235. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware.d.ts +2 -4
  236. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.d.ts +2 -4
  237. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.d.ts +2 -4
  238. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware.d.ts +10 -0
  239. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.d.ts +2 -4
  240. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.d.ts +2 -2
  241. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.d.ts +2 -4
  242. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.d.ts +2 -2
  243. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.d.ts +2 -4
  244. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.d.ts +2 -2
  245. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware.d.ts +2 -4
  246. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/gifUploadMiddleware.d.ts +2 -4
  247. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlPlayerMiddleware.d.ts +2 -4
  248. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware.d.ts +2 -4
  249. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.d.ts +2 -4
  250. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator.d.ts +2 -4
  251. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware.d.ts +2 -4
  252. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.d.ts +2 -2
  253. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware.d.ts +2 -4
  254. package/lib/types/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.d.ts +7 -0
  255. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
  256. package/lib/types/contexts/common/ILiveChatWidgetLocalizedTexts.d.ts +17 -0
  257. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +2 -1
  258. package/package.json +71 -57
@@ -45,10 +45,11 @@ const createAdapter = async (facadeChatSDK, props) => {
45
45
  //so far, there is no need to convert to the shim adapter when using visual tests
46
46
  const isMocked = facadeChatSDK.getChatSDK() instanceof _mockchatsdk.MockChatSDK;
47
47
  if (isMocked !== true) {
48
- var _props$webChatContain, _props$webChatContain2;
48
+ var _props$webChatContain, _props$webChatContain2, _props$webChatContain3;
49
49
  const botAuthActivitySubscriberOptionalParams = {
50
50
  fetchBotAuthConfigRetries: (props === null || props === void 0 || (_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 || (_props$webChatContain = _props$webChatContain.botAuthConfig) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.fetchBotAuthConfigRetries) || defaultBotAuthConfig.fetchBotAuthConfigRetries,
51
- fetchBotAuthConfigRetryInterval: (props === null || props === void 0 || (_props$webChatContain2 = props.webChatContainerProps) === null || _props$webChatContain2 === void 0 || (_props$webChatContain2 = _props$webChatContain2.botAuthConfig) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.fetchBotAuthConfigRetryInterval) || defaultBotAuthConfig.fetchBotAuthConfigRetryInterval
51
+ fetchBotAuthConfigRetryInterval: (props === null || props === void 0 || (_props$webChatContain2 = props.webChatContainerProps) === null || _props$webChatContain2 === void 0 || (_props$webChatContain2 = _props$webChatContain2.botAuthConfig) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.fetchBotAuthConfigRetryInterval) || defaultBotAuthConfig.fetchBotAuthConfigRetryInterval,
52
+ fallbackShowSignInCard: props === null || props === void 0 || (_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 || (_props$webChatContain3 = _props$webChatContain3.botAuthConfig) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.fallbackShowSignInCard
52
53
  };
53
54
  adapter = new _ChatAdapterShim.ChatAdapterShim(adapter);
54
55
  adapter.addSubscriber(new _AddActivitySubscriber.AddActivitySubscriber());
@@ -41,10 +41,8 @@ const createMarkdown = (disableMarkdownMessageFormatting, disableNewLineMarkdown
41
41
  }
42
42
  markdown.disable(["strikethrough"]);
43
43
 
44
- // Custom plugin to fix numbered list continuity
44
+ // Custom plugin to fix numbered list continuity and merge adjacent markdown links with the same href.
45
45
  markdown.use(function (md) {
46
- const originalRender = md.render.bind(md);
47
- const originalRenderInline = md.renderInline.bind(md);
48
46
  function preprocessText(text) {
49
47
  // Handle numbered lists that come with double line breaks (knowledge article format)
50
48
  // This ensures proper continuous numbering instead of separate lists
@@ -79,16 +77,111 @@ const createMarkdown = (disableMarkdownMessageFormatting, disableNewLineMarkdown
79
77
  return result;
80
78
  }
81
79
 
80
+ // Accessibility fix: when a bot emits content like "[1.](url) [View details](url)",
81
+ // markdown-it renders two sibling links that screen readers announce as two separate
82
+ // focusable links. Merge consecutive markdown link tokens with identical attributes so
83
+ // the number and label form one combined focusable link without discarding metadata.
84
+ md.core.ruler.after("inline", "merge_adjacent_same_href_links", function (state) {
85
+ const sortedAttrs = token => (token.attrs || []).map(attr => `${attr[0]}=${attr[1]}`).sort();
86
+ const hasSameAttributes = (first, second) => {
87
+ const firstAttrs = sortedAttrs(first);
88
+ const secondAttrs = sortedAttrs(second);
89
+ return firstAttrs.length === secondAttrs.length && firstAttrs.every((attr, index) => attr === secondAttrs[index]);
90
+ };
91
+ const collectLink = (children, index) => {
92
+ var _open$attrGet;
93
+ const open = children[index];
94
+ if (!open || open.type !== "link_open") {
95
+ return undefined;
96
+ }
97
+ const href = (_open$attrGet = open.attrGet) === null || _open$attrGet === void 0 ? void 0 : _open$attrGet.call(open, "href");
98
+ if (!href) {
99
+ return undefined;
100
+ }
101
+ let depth = 0;
102
+ for (let currentIndex = index; currentIndex < children.length; currentIndex++) {
103
+ const token = children[currentIndex];
104
+ if (token.type === "link_open") {
105
+ depth++;
106
+ } else if (token.type === "link_close") {
107
+ depth--;
108
+ if (depth === 0) {
109
+ return {
110
+ closeIndex: currentIndex,
111
+ href,
112
+ open
113
+ };
114
+ }
115
+ }
116
+ }
117
+ return undefined;
118
+ };
119
+ const getNextAdjacentLink = (children, startIndex) => {
120
+ const separatorTokens = [];
121
+ let index = startIndex;
122
+ while (index < children.length && children[index].type === "text" && /^\s*$/.test(children[index].content || "")) {
123
+ separatorTokens.push(children[index]);
124
+ index++;
125
+ }
126
+ const link = collectLink(children, index);
127
+ if (!link) {
128
+ return undefined;
129
+ }
130
+ return {
131
+ ...link,
132
+ openIndex: index,
133
+ separatorTokens
134
+ };
135
+ };
136
+ state.tokens.forEach(blockToken => {
137
+ if (blockToken.type !== "inline" || !blockToken.children) {
138
+ return;
139
+ }
140
+ const mergedChildren = [];
141
+ const children = blockToken.children;
142
+ let index = 0;
143
+ while (index < children.length) {
144
+ const firstLink = collectLink(children, index);
145
+ if (!firstLink) {
146
+ mergedChildren.push(children[index]);
147
+ index++;
148
+ continue;
149
+ }
150
+ const linkTokens = [firstLink.open, ...children.slice(index + 1, firstLink.closeIndex)];
151
+ let nextIndex = firstLink.closeIndex + 1;
152
+ let mergedAnyLink = false;
153
+ let nextLink = getNextAdjacentLink(children, nextIndex);
154
+ while (nextLink && nextLink.href === firstLink.href && hasSameAttributes(firstLink.open, nextLink.open)) {
155
+ linkTokens.push(...nextLink.separatorTokens);
156
+ linkTokens.push(...children.slice(nextLink.openIndex + 1, nextLink.closeIndex));
157
+ nextIndex = nextLink.closeIndex + 1;
158
+ mergedAnyLink = true;
159
+ nextLink = getNextAdjacentLink(children, nextIndex);
160
+ }
161
+ if (mergedAnyLink) {
162
+ mergedChildren.push(...linkTokens, children[firstLink.closeIndex]);
163
+ index = nextIndex;
164
+ } else {
165
+ mergedChildren.push(children[index]);
166
+ index++;
167
+ }
168
+ }
169
+ blockToken.children = mergedChildren;
170
+ });
171
+ });
172
+
82
173
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
174
  md.render = function (text, env) {
175
+ const safeEnv = env ?? {};
84
176
  const processedText = preprocessText(text);
85
- return originalRender(processedText, env);
177
+ return md.renderer.render(md.parse(processedText, safeEnv), md.options, safeEnv);
86
178
  };
87
179
 
88
180
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
181
  md.renderInline = function (text, env) {
182
+ const safeEnv = env ?? {};
90
183
  const processedText = preprocessText(text);
91
- return originalRenderInline(processedText, env);
184
+ return md.renderer.render(md.parseInline(processedText, safeEnv), md.options, safeEnv);
92
185
  };
93
186
  });
94
187
 
@@ -11,6 +11,7 @@ var _renderSurveyHelpers = require("./renderSurveyHelpers");
11
11
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
12
12
  var _ConversationState = require("../../../contexts/common/ConversationState");
13
13
  var _LazyLoadActivity = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity");
14
+ var _activityMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware");
14
15
  var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
15
16
  var _NotificationHandler = require("../../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler");
16
17
  var _NotificationScenarios = require("../../webchatcontainerstateful/webchatcontroller/enums/NotificationScenarios");
@@ -25,9 +26,7 @@ var _omnichannelChatSdk = require("@microsoft/omnichannel-chat-sdk");
25
26
  const prepareEndChat = async (props, facadeChatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter) => {
26
27
  try {
27
28
  var _conversationDetails$, _state$domainStates, _state$appStates5;
28
- const {
29
- chatConfig
30
- } = props;
29
+ const chatConfig = props.chatConfig;
31
30
 
32
31
  // Use Case: If call is ongoing, end the call by simulating end call button click
33
32
  endVoiceVideoCallIfOngoing(facadeChatSDK, dispatch);
@@ -104,12 +103,11 @@ const prepareEndChat = async (props, facadeChatSDK, state, dispatch, setAdapter,
104
103
  });
105
104
  }
106
105
  const persistentEnabled = (0, _reconnectChatHelper.isPersistentEnabled)(chatConfig);
107
- const {
108
- appStates
109
- } = (0, _createReducer.executeReducer)(state, {
110
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
111
- payload: undefined
112
- });
106
+ const _executeReducer = (0, _createReducer.executeReducer)(state, {
107
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
108
+ payload: undefined
109
+ }),
110
+ appStates = _executeReducer.appStates;
113
111
  const endedByCustomer = (appStates === null || appStates === void 0 ? void 0 : appStates.conversationEndedBy) === "Customer";
114
112
 
115
113
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -249,6 +247,7 @@ const endChat = async (props, facadeChatSDK, state, dispatch, setAdapter, setWeb
249
247
 
250
248
  // Call direct reset to ensure LazyLoadHandler gets reset regardless of broadcast timing
251
249
  _LazyLoadActivity.LazyLoadHandler.directReset();
250
+ (0, _activityMiddleware.resetActivityMiddlewareCache)();
252
251
  _omnichannelChatComponents.BroadcastService.postMessage({
253
252
  eventName: _TelemetryConstants.BroadcastEvent.PersistentConversationReset
254
253
  });
@@ -344,6 +343,10 @@ const closeChatStateCleanUp = dispatch => {
344
343
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CITATIONS,
345
344
  payload: {}
346
345
  });
346
+ dispatch({
347
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_SHOW_EMAIL_TRANSCRIPT_PANE,
348
+ payload: false
349
+ });
347
350
 
348
351
  // Dismiss the chat disconnect notification banner if it was shown
349
352
  _NotificationHandler.NotificationHandler.dismissNotification(_NotificationScenarios.NotificationScenarios.ChatDisconnect);
@@ -16,6 +16,7 @@ var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidget
16
16
  var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
17
17
  var _WebChatStoreLoader = require("../../webchatcontainerstateful/webchatcontroller/WebChatStoreLoader");
18
18
  var _attachmentProcessingMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware"));
19
+ var _attachmentSentAnnouncementMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware"));
19
20
  var _channelDataMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware"));
20
21
  var _activityMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware");
21
22
  var _activityStatusMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware");
@@ -125,7 +126,7 @@ const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endChat) =>
125
126
  };
126
127
  webChatStore = (0, _botframeworkWebchat.createStore)({},
127
128
  //initial state
128
- _preProcessingMiddleware.default, _attachmentProcessingMiddleware.default, (0, _attachmentUploadValidatorMiddleware.default)((_state$domainStates$l = state.domainStates.liveChatConfig) === null || _state$domainStates$l === void 0 ? void 0 : _state$domainStates$l.allowedFileExtensions, (_state$domainStates$l2 = state.domainStates.liveChatConfig) === null || _state$domainStates$l2 === void 0 ? void 0 : _state$domainStates$l2.maxUploadFileSize, localizedTexts), (0, _customEventMiddleware.default)(_omnichannelChatComponents.BroadcastService), (0, _queueOverflowHandlerMiddleware.createQueueOverflowMiddleware)(state, dispatch), (0, _channelDataMiddleware.default)(addConversationalSurveyTagsCallback), (0, _conversationEndMiddleware.default)(conversationEndCallback, startConversationalSurveyCallback, endConversationalSurveyCallback), (0, _dataMaskingMiddleware.default)((_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : _state$domainStates$l3.DataMaskingInfo), _messageTimestampMiddleware.createMessageTimeStampMiddleware, _messageSequenceIdOverrideMiddleware.createMessageSequenceIdOverrideMiddleware, (0, _citationsMiddleware.createCitationsMiddleware)(state, dispatch), _gifUploadMiddleware.default, _htmlPlayerMiddleware.default, (0, _htmlTextMiddleware.default)(honorsTargetInHTMLLinks), (0, _maxMessageSizeValidator.default)(localizedTexts), _sanitizationMiddleware.default, (0, _callActionMiddleware.default)(),
129
+ _preProcessingMiddleware.default, _attachmentProcessingMiddleware.default, (0, _attachmentUploadValidatorMiddleware.default)((_state$domainStates$l = state.domainStates.liveChatConfig) === null || _state$domainStates$l === void 0 ? void 0 : _state$domainStates$l.allowedFileExtensions, (_state$domainStates$l2 = state.domainStates.liveChatConfig) === null || _state$domainStates$l2 === void 0 ? void 0 : _state$domainStates$l2.maxUploadFileSize, localizedTexts), _attachmentSentAnnouncementMiddleware.default, (0, _customEventMiddleware.default)(_omnichannelChatComponents.BroadcastService), (0, _queueOverflowHandlerMiddleware.createQueueOverflowMiddleware)(state, dispatch), (0, _channelDataMiddleware.default)(addConversationalSurveyTagsCallback), (0, _conversationEndMiddleware.default)(conversationEndCallback, startConversationalSurveyCallback, endConversationalSurveyCallback), (0, _dataMaskingMiddleware.default)((_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : _state$domainStates$l3.DataMaskingInfo), _messageTimestampMiddleware.createMessageTimeStampMiddleware, _messageSequenceIdOverrideMiddleware.createMessageSequenceIdOverrideMiddleware, (0, _citationsMiddleware.createCitationsMiddleware)(state, dispatch), _gifUploadMiddleware.default, _htmlPlayerMiddleware.default, (0, _htmlTextMiddleware.default)(honorsTargetInHTMLLinks), (0, _maxMessageSizeValidator.default)(localizedTexts), _sanitizationMiddleware.default, (0, _callActionMiddleware.default)(),
129
130
  // Pass a callback so middleware can push initials into React context for reactivity
130
131
  (0, _localizedStringsBotInitialsMiddleware.localizedStringsBotInitialsMiddleware)(initials => {
131
132
  dispatch({
@@ -151,14 +152,194 @@ const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endChat) =>
151
152
  markdownRenderers.forEach(renderer => {
152
153
  text = renderer.render(text);
153
154
  });
155
+
156
+ // EXISTING sanitization (continues to work as before)
154
157
  const config = {
155
158
  FORBID_TAGS: ["form", "button", "script", "div", "input"],
156
159
  FORBID_ATTR: ["action"],
157
160
  ADD_ATTR: ["target"]
158
161
  };
159
162
  text = _dompurify.default.sanitize(text, config);
163
+
164
+ // MONITOR-ONLY: Test what the stricter allowlist would remove (Phase 1)
165
+ // This does NOT modify the text, only logs telemetry
166
+ // Run during browser idle time to avoid blocking message flow and adding latency
167
+ const textToMonitor = text; // Capture current text value
168
+
169
+ // Schedule monitoring to run during browser idle time
170
+ const scheduleMonitoring = () => {
171
+ try {
172
+ monitorStrictSanitization(textToMonitor, state);
173
+ } catch (error) {
174
+ // Silently catch errors to prevent blocking message flow
175
+ if (process.env.NODE_ENV === "development") {
176
+ console.error("[Monitor] HTML sanitization monitoring failed:", error);
177
+ }
178
+ }
179
+ };
180
+
181
+ // Use requestIdleCallback for truly idle execution, fallback to setTimeout for older browsers
182
+ if (typeof window !== "undefined" && "requestIdleCallback" in window) {
183
+ window.requestIdleCallback(scheduleMonitoring);
184
+ } else {
185
+ setTimeout(scheduleMonitoring, 0);
186
+ }
160
187
  return text;
161
188
  };
189
+
190
+ /**
191
+ * Monitor-only sanitization (Phase 1: Gather telemetry)
192
+ * Tests what a stricter allowlist-based sanitization would remove
193
+ * WITHOUT actually removing it. Logs telemetry for analysis.
194
+ *
195
+ * IMPORTANT: This function is wrapped in try-catch and runs asynchronously
196
+ * to ensure failures don't block message flow or add latency.
197
+ *
198
+ * ISOLATION: Uses a separate DOMPurify instance to completely isolate
199
+ * monitoring hooks from other sanitization paths (e.g., postDomPurifyActivities).
200
+ * The instance is garbage collected after use, no cleanup needed.
201
+ *
202
+ * @param html - The HTML text that was already sanitized with existing config
203
+ * @param state - Widget state containing orgId and chatId
204
+ */
205
+ const monitorStrictSanitization = (html, state) => {
206
+ // Early exit for empty content
207
+ if (!html) return;
208
+
209
+ // Track execution time for performance monitoring
210
+ const startTime = performance.now();
211
+ try {
212
+ // Create a separate DOMPurify instance for monitoring
213
+ // This completely isolates monitoring from other sanitization paths
214
+ const monitorDOMPurify = (0, _dompurify.default)(window);
215
+
216
+ // Strict allowlist configuration (proposed new rules)
217
+ // Note: DOMPurify blocks event handlers (onclick, onerror, etc.) by default
218
+ const strictConfig = {
219
+ ALLOWED_TAGS: ["b", "strong",
220
+ // Bold text
221
+ "i", "em", "u",
222
+ // Italic, emphasis, underline
223
+ "br", "p",
224
+ // Line breaks and paragraphs
225
+ "ul", "ol", "li",
226
+ // Lists
227
+ "a" // Links (with restricted attributes)
228
+ ],
229
+ ALLOWED_ATTR: ["href",
230
+ // For links (will be restricted to http/https)
231
+ "target",
232
+ // For link behavior
233
+ "rel" // For security (noopener, noreferrer)
234
+ ],
235
+ FORBID_TAGS: ["img", "video", "audio",
236
+ // Media (tracking beacons)
237
+ "iframe", "object", "embed",
238
+ // Embedded content
239
+ "script", "style",
240
+ // Script and styling
241
+ "form", "input", "textarea", "button",
242
+ // Form elements
243
+ "link", "meta", "base",
244
+ // Document metadata
245
+ "div", "span" // Layout elements
246
+ ],
247
+ FORBID_ATTR: ["style",
248
+ // Inline CSS
249
+ "action" // Form action attribute (event handlers blocked by default)
250
+ ],
251
+ ALLOWED_URI_REGEXP: /^https?:/i,
252
+ ALLOW_DATA_ATTR: false,
253
+ ALLOW_UNKNOWN_PROTOCOLS: false
254
+ };
255
+
256
+ // Track what would be removed
257
+ const removedTags = [];
258
+ const removedAttributes = [];
259
+
260
+ // Add hooks to the isolated monitoring instance
261
+ monitorDOMPurify.addHook("uponSanitizeElement", (node, data) => {
262
+ try {
263
+ const tagName = data.tagName.toLowerCase();
264
+ // Filter out "body" tag which is DOMPurify's internal wrapper
265
+ if (node.nodeType === 1 && !strictConfig.ALLOWED_TAGS.includes(tagName) && tagName !== "body") {
266
+ removedTags.push(tagName);
267
+ }
268
+ } catch (hookError) {
269
+ // Silently ignore hook errors
270
+ }
271
+ });
272
+ monitorDOMPurify.addHook("uponSanitizeAttribute", (node, data) => {
273
+ try {
274
+ const attrName = data.attrName.toLowerCase();
275
+ if (!strictConfig.ALLOWED_ATTR.includes(attrName) && attrName !== "class" && attrName !== "id") {
276
+ removedAttributes.push(attrName);
277
+ }
278
+ } catch (hookError) {
279
+ // Silently ignore hook errors
280
+ }
281
+ });
282
+
283
+ // Run sanitization on the isolated instance (we discard the result)
284
+ // No cleanup needed - the instance will be garbage collected with its hooks
285
+ monitorDOMPurify.sanitize(html, strictConfig);
286
+
287
+ // Log telemetry if content would be affected by strict rules
288
+ if (removedTags.length > 0 || removedAttributes.length > 0) {
289
+ try {
290
+ var _state$domainStates, _state$domainStates2;
291
+ const uniqueTags = [...new Set(removedTags)];
292
+ const uniqueAttrs = [...new Set(removedAttributes)];
293
+
294
+ // Calculate execution time
295
+ const endTime = performance.now();
296
+ const executionTimeMs = Math.round((endTime - startTime) * 100) / 100; // Round to 2 decimal places
297
+
298
+ // Get context for telemetry (with safe fallbacks)
299
+ const orgId = (state === null || state === void 0 || (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 || (_state$domainStates = _state$domainStates.telemetryInternalData) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.orgId) || "unknown";
300
+ const conversationId = (state === null || state === void 0 || (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 || (_state$domainStates2 = _state$domainStates2.chatToken) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.chatId) || "unknown";
301
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
302
+ Event: _TelemetryConstants.TelemetryEvent.HTMLSanitized,
303
+ Description: JSON.stringify({
304
+ message: "HTML content would be sanitized by stricter allowlist (monitor-only)",
305
+ removedTags: uniqueTags,
306
+ removedAttributes: uniqueAttrs,
307
+ phase: "Monitor",
308
+ organizationId: orgId,
309
+ conversationId: conversationId
310
+ }),
311
+ ElapsedTimeInMilliseconds: executionTimeMs
312
+ });
313
+
314
+ // Log to console in development for debugging
315
+ if (process.env.NODE_ENV === "development") {
316
+ console.warn("[Monitor] Stricter HTML sanitization telemetry:", {
317
+ description: JSON.parse(JSON.stringify({
318
+ message: "HTML content would be sanitized by stricter allowlist (monitor-only)",
319
+ removedTags: uniqueTags,
320
+ removedAttributes: uniqueAttrs,
321
+ phase: "Monitor"
322
+ })),
323
+ orgId,
324
+ conversationId,
325
+ executionTimeMs
326
+ });
327
+ }
328
+ } catch (telemetryError) {
329
+ // Silently ignore telemetry errors to prevent blocking
330
+ if (process.env.NODE_ENV === "development") {
331
+ console.error("[Monitor] Telemetry logging failed:", telemetryError);
332
+ }
333
+ }
334
+ }
335
+ } catch (error) {
336
+ // Catch-all for any unexpected errors
337
+ // Silently fail to ensure monitoring never blocks message flow
338
+ if (process.env.NODE_ENV === "development") {
339
+ console.error("[Monitor] Monitoring failed:", error);
340
+ }
341
+ }
342
+ };
162
343
  function postDomPurifyActivities() {
163
344
  _dompurify.default.addHook("afterSanitizeAttributes", function (node) {
164
345
  const target = node.getAttribute(_Constants.Constants.Target);
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.logRecoveryEligibilityTelemetry = exports.getRecoveryEligibilityTelemetryProperties = exports.RecoveryEligibilityReason = void 0;
7
+ var _ConversationState = require("../../../contexts/common/ConversationState");
8
+ var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
9
+ var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
10
+ var _utils = require("../../../common/utils");
11
+ let RecoveryEligibilityReason = exports.RecoveryEligibilityReason = /*#__PURE__*/function (RecoveryEligibilityReason) {
12
+ RecoveryEligibilityReason["ReconnectIdPresent"] = "ReconnectIdPresent";
13
+ RecoveryEligibilityReason["ActiveContextPresent"] = "ActiveContextPresent";
14
+ RecoveryEligibilityReason["MissingContext"] = "MissingContext";
15
+ RecoveryEligibilityReason["CachedContextNonActive"] = "CachedContextNonActive";
16
+ return RecoveryEligibilityReason;
17
+ }({});
18
+ const getConversationStateName = conversationState => {
19
+ if (typeof conversationState !== "number") {
20
+ return "Unknown";
21
+ }
22
+ const stateName = _ConversationState.ConversationState[conversationState];
23
+ return typeof stateName === "string" ? stateName : "Unknown";
24
+ };
25
+ const getRecoveryEligibilityTelemetryProperties = (state, eligible) => {
26
+ var _state$appStates, _state$domainStates, _state$appStates2, _state$appStates3;
27
+ const reconnectId = (_state$appStates = state.appStates) === null || _state$appStates === void 0 ? void 0 : _state$appStates.reconnectId;
28
+ const liveChatContext = (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.liveChatContext;
29
+ const hasReconnectId = !(0, _utils.isUndefinedOrEmpty)(reconnectId);
30
+ const hasLiveChatContext = !(0, _utils.isUndefinedOrEmpty)(liveChatContext);
31
+ const hasRequestId = !(0, _utils.isUndefinedOrEmpty)(liveChatContext === null || liveChatContext === void 0 ? void 0 : liveChatContext.requestId);
32
+ let reason = RecoveryEligibilityReason.ActiveContextPresent;
33
+ if (hasReconnectId) {
34
+ reason = RecoveryEligibilityReason.ReconnectIdPresent;
35
+ } else if (!hasLiveChatContext) {
36
+ reason = RecoveryEligibilityReason.MissingContext;
37
+ } else if (((_state$appStates2 = state.appStates) === null || _state$appStates2 === void 0 ? void 0 : _state$appStates2.conversationState) !== _ConversationState.ConversationState.Active) {
38
+ reason = RecoveryEligibilityReason.CachedContextNonActive;
39
+ }
40
+ return {
41
+ conversationState: getConversationStateName((_state$appStates3 = state.appStates) === null || _state$appStates3 === void 0 ? void 0 : _state$appStates3.conversationState),
42
+ hasReconnectId,
43
+ hasLiveChatContext,
44
+ hasRequestId,
45
+ eligible,
46
+ reason
47
+ };
48
+ };
49
+ exports.getRecoveryEligibilityTelemetryProperties = getRecoveryEligibilityTelemetryProperties;
50
+ const logRecoveryEligibilityTelemetry = (state, eligible) => {
51
+ try {
52
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
53
+ Event: _TelemetryConstants.TelemetryEvent.RecoveryEligibilityEvaluated,
54
+ CustomProperties: getRecoveryEligibilityTelemetryProperties(state, eligible)
55
+ });
56
+ } catch (error) {
57
+ console.warn(error);
58
+ }
59
+ };
60
+ exports.logRecoveryEligibilityTelemetry = logRecoveryEligibilityTelemetry;
@@ -20,6 +20,7 @@ var _createAdapter = require("./createAdapter");
20
20
  var _newMessageEventHandler = require("../../../plugins/newMessageEventHandler");
21
21
  var _FirstMessageTrackerFromBot = require("../../../firstresponselatency/FirstMessageTrackerFromBot");
22
22
  var _liveChatConfigUtils = require("./liveChatConfigUtils");
23
+ var _authHelper = require("./authHelper");
23
24
  var _setPostChatContextAndLoadSurvey = require("./setPostChatContextAndLoadSurvey");
24
25
  var _persistentChatHelper = require("./persistentChatHelper");
25
26
  var _updateSessionDataForTelemetry = require("./updateSessionDataForTelemetry");
@@ -65,7 +66,7 @@ const prepareStartChat = async (props, facadeChatSDK, state, dispatch, setAdapte
65
66
  exports.prepareStartChat = prepareStartChat;
66
67
  const setPreChatAndInitiateChat = async (facadeChatSDK, dispatch, setAdapter, isProactiveChat, proactiveChatEnablePrechatState, state, props) => {
67
68
  var _props$preChatSurveyP, _props$controlProps, _state$domainStates, _state$appStates2;
68
- // This reset needs to be done before to load prechat, because the conversation state changes from close to prechat
69
+ // Reset before loading prechat to avoid starting chat with previous requestId
69
70
  if ((state === null || state === void 0 ? void 0 : state.appStates.conversationState) === _ConversationState.ConversationState.Closed) {
70
71
  // Preventive reset to avoid starting chat with previous requestId which could potentially cause problems
71
72
  (0, _endChat.chatSDKStateCleanUp)(facadeChatSDK.getChatSDK());
@@ -199,7 +200,7 @@ const initStartChat = async (facadeChatSDK, dispatch, setAdapter, state, props,
199
200
  });
200
201
  }
201
202
  try {
202
- var _window$Microsoft;
203
+ var _window$Microsoft, _state$domainStates8;
203
204
  // Set custom context params
204
205
  await setCustomContextParams(state, props);
205
206
  const defaultOptionalParams = {
@@ -208,9 +209,25 @@ const initStartChat = async (facadeChatSDK, dispatch, setAdapter, state, props,
208
209
  portalContactId: (_window$Microsoft = window.Microsoft) === null || _window$Microsoft === void 0 || (_window$Microsoft = _window$Microsoft.Dynamic365) === null || _window$Microsoft === void 0 || (_window$Microsoft = _window$Microsoft.Portal) === null || _window$Microsoft === void 0 || (_window$Microsoft = _window$Microsoft.User) === null || _window$Microsoft === void 0 ? void 0 : _window$Microsoft.contactId
209
210
  };
210
211
  const startChatOptionalParams = Object.assign({}, params, optionalParams, defaultOptionalParams);
212
+
213
+ // MID-AUTH: Add wasAuthenticated flag for reconnect scenarios
214
+ // Tells FacadeChatSDK whether the previous session was authenticated
215
+ // Used to detect auth transitions (Auth->Unauth) and decide whether to call authenticateChat
216
+ const midAuthEnabled = (0, _authHelper.isMidAuthEnabled)(state === null || state === void 0 || (_state$domainStates8 = state.domainStates) === null || _state$domainStates8 === void 0 ? void 0 : _state$domainStates8.liveChatConfig);
217
+ if (midAuthEnabled) {
218
+ var _state$appStates4, _persistedState$appSt;
219
+ const isUserAuthenticated = (state === null || state === void 0 || (_state$appStates4 = state.appStates) === null || _state$appStates4 === void 0 ? void 0 : _state$appStates4.isUserAuthenticated) === true || (persistedState === null || persistedState === void 0 || (_persistedState$appSt = persistedState.appStates) === null || _persistedState$appSt === void 0 ? void 0 : _persistedState$appSt.isUserAuthenticated) === true;
220
+ startChatOptionalParams.wasAuthenticated = isUserAuthenticated;
221
+ }
222
+
211
223
  // startTime is used to determine if a message is history or new, better to be set before creating the adapter to get bandwidth
212
224
  const startTime = new Date().getTime();
213
225
  (0, _FirstMessageTrackerFromBot.createTrackingForFirstMessage)();
226
+
227
+ // FacadeChatSDK.startChat() handles:
228
+ // 1. tokenRing() - checks authentication, calls handleAuthentication() if needed
229
+ // 2. Mid-auth: If no token, sets deferInitialAuth=true for unauthenticated flow
230
+ // 3. Mid-auth: On reconnect with valid token, calls authenticateChat to upgrade conversation
214
231
  await facadeChatSDK.startChat(startChatOptionalParams);
215
232
  (0, _startChatErrorHandler.logStartChatComplete)();
216
233
  isStartChatSuccessful = true;
@@ -298,15 +315,15 @@ const createAdapterAndSubscribe = async (facadeChatSDK, dispatch, setAdapter, st
298
315
  };
299
316
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
300
317
  const canConnectToExistingChat = async (props, facadeChatSDK, state, dispatch, setAdapter) => {
301
- var _state$appStates4, _persistedState$domai3, _persistedState$appSt;
318
+ var _state$appStates5, _persistedState$domai3, _persistedState$appSt2;
302
319
  // By pass this function in case of popout chat
303
- if ((state === null || state === void 0 || (_state$appStates4 = state.appStates) === null || _state$appStates4 === void 0 ? void 0 : _state$appStates4.hideStartChatButton) === true) {
320
+ if ((state === null || state === void 0 || (_state$appStates5 = state.appStates) === null || _state$appStates5 === void 0 ? void 0 : _state$appStates5.hideStartChatButton) === true) {
304
321
  return false;
305
322
  }
306
323
  const persistedState = (0, _utils.getStateFromCache)((0, _utils.getWidgetCacheIdfromProps)(props));
307
324
 
308
325
  //Connect to only active chat session
309
- if (persistedState && !(0, _utils.isUndefinedOrEmpty)(persistedState === null || persistedState === void 0 || (_persistedState$domai3 = persistedState.domainStates) === null || _persistedState$domai3 === void 0 ? void 0 : _persistedState$domai3.liveChatContext) && (persistedState === null || persistedState === void 0 || (_persistedState$appSt = persistedState.appStates) === null || _persistedState$appSt === void 0 ? void 0 : _persistedState$appSt.conversationState) === _ConversationState.ConversationState.Active) {
326
+ if (persistedState && !(0, _utils.isUndefinedOrEmpty)(persistedState === null || persistedState === void 0 || (_persistedState$domai3 = persistedState.domainStates) === null || _persistedState$domai3 === void 0 ? void 0 : _persistedState$domai3.liveChatContext) && (persistedState === null || persistedState === void 0 || (_persistedState$appSt2 = persistedState.appStates) === null || _persistedState$appSt2 === void 0 ? void 0 : _persistedState$appSt2.conversationState) === _ConversationState.ConversationState.Active) {
310
327
  var _persistedState$domai4;
311
328
  dispatch({
312
329
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
@@ -323,11 +340,11 @@ const canConnectToExistingChat = async (props, facadeChatSDK, state, dispatch, s
323
340
 
324
341
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
325
342
  const setCustomContextParams = async (state, props) => {
326
- var _state$domainStates8, _persistedState$domai5;
327
- if (state !== null && state !== void 0 && (_state$domainStates8 = state.domainStates) !== null && _state$domainStates8 !== void 0 && _state$domainStates8.customContext) {
328
- var _state$domainStates9;
343
+ var _state$domainStates9, _persistedState$domai5;
344
+ if (state !== null && state !== void 0 && (_state$domainStates9 = state.domainStates) !== null && _state$domainStates9 !== void 0 && _state$domainStates9.customContext) {
345
+ var _state$domainStates0;
329
346
  optionalParams = Object.assign({}, optionalParams, {
330
- customContext: JSON.parse(JSON.stringify(state === null || state === void 0 || (_state$domainStates9 = state.domainStates) === null || _state$domainStates9 === void 0 ? void 0 : _state$domainStates9.customContext))
347
+ customContext: JSON.parse(JSON.stringify(state === null || state === void 0 || (_state$domainStates0 = state.domainStates) === null || _state$domainStates0 === void 0 ? void 0 : _state$domainStates0.customContext))
331
348
  });
332
349
  return;
333
350
  }
@@ -360,9 +377,9 @@ const canStartPopoutChat = async props => {
360
377
  }
361
378
  popoutWidgetInstanceId = (0, _utils.getWidgetCacheIdfromProps)(props, true);
362
379
  if (!(0, _utils.isNullOrEmptyString)(popoutWidgetInstanceId)) {
363
- var _persistedState$domai6, _persistedState$appSt2;
380
+ var _persistedState$domai6, _persistedState$appSt3;
364
381
  const persistedState = (0, _utils.getStateFromCache)(popoutWidgetInstanceId);
365
- if (persistedState && !(0, _utils.isUndefinedOrEmpty)(persistedState === null || persistedState === void 0 || (_persistedState$domai6 = persistedState.domainStates) === null || _persistedState$domai6 === void 0 ? void 0 : _persistedState$domai6.liveChatContext) && (persistedState === null || persistedState === void 0 || (_persistedState$appSt2 = persistedState.appStates) === null || _persistedState$appSt2 === void 0 ? void 0 : _persistedState$appSt2.conversationState) === _ConversationState.ConversationState.Active) {
382
+ if (persistedState && !(0, _utils.isUndefinedOrEmpty)(persistedState === null || persistedState === void 0 || (_persistedState$domai6 = persistedState.domainStates) === null || _persistedState$domai6 === void 0 ? void 0 : _persistedState$domai6.liveChatContext) && (persistedState === null || persistedState === void 0 || (_persistedState$appSt3 = persistedState.appStates) === null || _persistedState$appSt3 === void 0 ? void 0 : _persistedState$appSt3.conversationState) === _ConversationState.ConversationState.Active) {
366
383
  // Initiate popout chat
367
384
  _omnichannelChatComponents.BroadcastService.postMessage({
368
385
  eventName: _TelemetryConstants.BroadcastEvent.InitiateStartChatInPopoutMode
@@ -375,9 +392,9 @@ const canStartPopoutChat = async props => {
375
392
 
376
393
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
377
394
  const checkIfConversationStillValid = async (facadeChatSDK, dispatch, state) => {
378
- var _state$domainStates0, _state$domainStates1;
379
- const requestIdFromCache = (_state$domainStates0 = state.domainStates) === null || _state$domainStates0 === void 0 || (_state$domainStates0 = _state$domainStates0.liveChatContext) === null || _state$domainStates0 === void 0 ? void 0 : _state$domainStates0.requestId;
380
- const liveChatContext = state === null || state === void 0 || (_state$domainStates1 = state.domainStates) === null || _state$domainStates1 === void 0 ? void 0 : _state$domainStates1.liveChatContext;
395
+ var _state$domainStates1, _state$domainStates10;
396
+ const requestIdFromCache = (_state$domainStates1 = state.domainStates) === null || _state$domainStates1 === void 0 || (_state$domainStates1 = _state$domainStates1.liveChatContext) === null || _state$domainStates1 === void 0 ? void 0 : _state$domainStates1.requestId;
397
+ const liveChatContext = state === null || state === void 0 || (_state$domainStates10 = state.domainStates) === null || _state$domainStates10 === void 0 ? void 0 : _state$domainStates10.liveChatContext;
381
398
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
382
399
  let conversationDetails = undefined;
383
400
  // Preserve current requestId