@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
@@ -18,6 +18,12 @@ var _LazyLoadHandler;
18
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
19
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
20
20
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
21
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
22
+ 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."); }
23
+ 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; } }
24
+ 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; }
25
+ 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; } }
26
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
21
27
  function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
22
28
  function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
23
29
  function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
@@ -48,10 +54,6 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
48
54
  * 4. Performs controlled scroll to maintain user position
49
55
  * 5. Resets observer for next lazy load cycle
50
56
  */
51
- /*
52
- * Interface defining the state of a scroll operation
53
- * Used to track and verify scroll actions for reliability
54
- */
55
57
  /**
56
58
  * LazyLoadHandler - Static class managing all lazy loading functionality
57
59
  *
@@ -113,6 +115,7 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
113
115
  key: "directReset",
114
116
  value: function directReset() {
115
117
  LazyLoadHandler.resetPending = true;
118
+ LazyLoadHandler.initialLoadComplete = false; // New session — next batch is an initial load
116
119
  LazyLoadHandler.setHasMoreHistoryAvailable(true);
117
120
  LazyLoadHandler.unmount();
118
121
  }
@@ -188,9 +191,8 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
188
191
  */
189
192
  const setupObserver = () => {
190
193
  // Find the scroll container using multiple strategies
191
- const {
192
- container: scrollContainer
193
- } = LazyLoadHandler.findScrollContainer();
194
+ const _LazyLoadHandler$find = LazyLoadHandler.findScrollContainer(),
195
+ scrollContainer = _LazyLoadHandler$find.container;
194
196
  if (!scrollContainer) {
195
197
  // Schedule retry with faster timeout for better responsiveness
196
198
  const timeoutId = window.setTimeout(() => {
@@ -312,10 +314,9 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
312
314
  key: "executeImmediateScrollFeedback",
313
315
  value: function executeImmediateScrollFeedback() {
314
316
  // Find container and validate scrollability
315
- const {
316
- container,
317
- isScrollable
318
- } = LazyLoadHandler.findScrollContainer();
317
+ const _LazyLoadHandler$find2 = LazyLoadHandler.findScrollContainer(),
318
+ container = _LazyLoadHandler$find2.container,
319
+ isScrollable = _LazyLoadHandler$find2.isScrollable;
319
320
  if (container && isScrollable) {
320
321
  const currentScrollTop = container.scrollTop;
321
322
  const immediateScrollTarget = currentScrollTop + 20; // Small immediate scroll for feedback
@@ -387,9 +388,8 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
387
388
  if (!targetElement) {
388
389
  return;
389
390
  }
390
- const {
391
- container
392
- } = LazyLoadHandler.findScrollContainer();
391
+ const _LazyLoadHandler$find3 = LazyLoadHandler.findScrollContainer(),
392
+ container = _LazyLoadHandler$find3.container;
393
393
  if (!container) {
394
394
  return;
395
395
  }
@@ -406,7 +406,7 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
406
406
  targetRect.left < containerRect.right &&
407
407
  // Target left is before container right
408
408
  targetRect.right > containerRect.left // Target right is after container left
409
- ;
409
+ ;
410
410
  if (isVisible) {
411
411
  LazyLoadHandler.handleImmediateScrollRequest();
412
412
  }
@@ -414,16 +414,15 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
414
414
 
415
415
  /**
416
416
  * Main lazy load trigger handler
417
- *
417
+ *
418
418
  * This is the core method that executes when the trigger element becomes visible.
419
419
  * It coordinates the entire lazy loading process:
420
- *
420
+ *
421
421
  * 1. Sets flags to prevent concurrent operations
422
- * 2. Dispatches event to fetch more chat history
423
- * 3. Waits for content to load
424
- * 4. Executes scroll adjustment to maintain user position
425
- *
426
- * Timing: Uses 300ms delay to allow content loading before scroll adjustment
422
+ * 2. Captures scroll state BEFORE content loads (for height-delta anchoring)
423
+ * 3. Dispatches event to fetch more chat history
424
+ *
425
+ * Scroll anchoring is triggered by HISTORY_BATCH_LOADED event (not a blind timeout).
427
426
  */
428
427
  }, {
429
428
  key: "handleLazyLoadTrigger",
@@ -437,138 +436,58 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
437
436
  LazyLoadHandler.pendingScrollAction = true; // Block new scroll actions
438
437
  LazyLoadHandler.paused = true; // Pause intersection observer
439
438
 
439
+ // Capture scroll geometry BEFORE new content loads — used for height-delta anchoring
440
+ const _LazyLoadHandler$find4 = LazyLoadHandler.findScrollContainer(),
441
+ container = _LazyLoadHandler$find4.container,
442
+ isScrollable = _LazyLoadHandler$find4.isScrollable;
443
+ if (container && isScrollable) {
444
+ LazyLoadHandler.preLoadScrollHeight = container.scrollHeight;
445
+ LazyLoadHandler.preLoadScrollTop = container.scrollTop;
446
+ }
447
+ LazyLoadHandler.logLifecycleEvent(_TelemetryConstants.TelemetryEvent.LCWLazyLoadTriggerFired, "Lazy load trigger fired — fetching history");
448
+
440
449
  // Dispatch custom event to trigger chat history fetching
441
- // This event is handled by other parts of the chat system
442
450
  (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.FETCH_PERSISTENT_CHAT_HISTORY);
443
-
444
- // Wait for content to load before performing scroll adjustment
445
- // 200ms provides good balance between responsiveness and content loading
446
- const timeoutId = window.setTimeout(() => {
447
- LazyLoadHandler.retryTimeouts.delete(timeoutId);
448
- LazyLoadHandler.executeReliableScroll();
449
- }, 200); // Reduced from 300ms to 200ms for faster response
450
- LazyLoadHandler.retryTimeouts.add(timeoutId);
451
451
  }
452
452
 
453
453
  /**
454
- * Executes reliable scroll with validation and retry logic
455
- *
456
- * This method implements a robust scroll system that:
457
- * 1. Finds and validates the scroll container
458
- * 2. Calculates target scroll position (current + 35px)
459
- * 3. Sets up scroll state for tracking and retries
460
- * 4. Initiates the scroll attempt process
461
- *
462
- * If no suitable container is found, schedules a retry.
454
+ * Applies height-delta scroll anchoring after new history content is prepended.
455
+ *
456
+ * When content is added above the viewport, the browser keeps scrollTop constant
457
+ * but the content shifts down — making the viewport drift upward.
458
+ * Fix: scrollTop = savedScrollTop + (newScrollHeight - savedScrollHeight)
459
+ * This keeps the user looking at the same content they had before.
463
460
  */
464
461
  }, {
465
- key: "executeReliableScroll",
466
- value: function executeReliableScroll() {
467
- // Guard: Don't execute scroll if no more history is available
468
- if (!LazyLoadHandler.hasMoreHistoryAvailable) {
469
- LazyLoadHandler.finishScrollAction();
470
- return;
471
- }
472
-
473
- // Find container using multiple fallback strategies
474
- const {
475
- container,
476
- isScrollable
477
- } = LazyLoadHandler.findScrollContainer();
462
+ key: "applyScrollAnchor",
463
+ value: function applyScrollAnchor() {
464
+ const _LazyLoadHandler$find5 = LazyLoadHandler.findScrollContainer(),
465
+ container = _LazyLoadHandler$find5.container,
466
+ isScrollable = _LazyLoadHandler$find5.isScrollable;
478
467
  if (!container || !isScrollable) {
479
- LazyLoadHandler.scheduleScrollRetry();
480
- return;
481
- }
482
-
483
- // Calculate scroll positions
484
- const initialScrollTop = container.scrollTop;
485
- const targetScrollTop = initialScrollTop + 35; // 35px down to maintain position
486
-
487
- // Set up scroll state for tracking and retries
488
- LazyLoadHandler.scrollState = {
489
- container,
490
- initialScrollTop,
491
- targetScrollTop,
492
- attemptCount: 0,
493
- maxAttempts: 5 // Allow up to 5 retry attempts
494
- };
495
-
496
- // Begin the scroll attempt process
497
- LazyLoadHandler.attemptScroll();
498
- }
499
-
500
- /**
501
- * Attempts to perform scroll with verification and retry logic
502
- *
503
- * This method implements a sophisticated scroll system:
504
- *
505
- * 1. Uses requestAnimationFrame for smooth execution
506
- * 2. Performs the scroll operation
507
- * 3. Verifies scroll actually occurred (5px tolerance)
508
- * 4. Retries with exponential backoff if failed
509
- * 5. Continues operation after max attempts
510
- *
511
- * The two-frame approach ensures scroll is applied and then verified
512
- * after the browser has had time to process the scroll change.
513
- */
514
- }, {
515
- key: "attemptScroll",
516
- value: function attemptScroll() {
517
- // Guard: Don't attempt scroll if no more history is available
518
- if (!LazyLoadHandler.hasMoreHistoryAvailable) {
519
468
  LazyLoadHandler.finishScrollAction();
520
469
  return;
521
470
  }
522
- if (!LazyLoadHandler.scrollState) {
523
- LazyLoadHandler.finishScrollAction();
524
- return;
471
+ const newScrollHeight = container.scrollHeight;
472
+ const heightDelta = newScrollHeight - LazyLoadHandler.preLoadScrollHeight;
473
+ if (heightDelta > 0) {
474
+ container.scrollTop = LazyLoadHandler.preLoadScrollTop + heightDelta;
525
475
  }
526
-
527
- // Extract current scroll state
528
- const {
529
- container,
530
- targetScrollTop,
531
- attemptCount,
532
- maxAttempts
533
- } = LazyLoadHandler.scrollState;
534
- LazyLoadHandler.scrollState.attemptCount++;
535
-
536
- // Perform scroll using requestAnimationFrame for smooth execution
537
- // Frame 1: Apply the scroll
538
- requestAnimationFrame(() => {
539
- // Double-check history availability before applying scroll
540
- if (!LazyLoadHandler.hasMoreHistoryAvailable) {
541
- LazyLoadHandler.finishScrollAction();
542
- return;
543
- }
544
- if (container) {
545
- container.scrollTop = targetScrollTop;
546
- }
547
-
548
- // Frame 2: Verify scroll occurred after browser has processed the change
549
- requestAnimationFrame(() => {
550
- // Triple-check history availability before verification
551
- if (!LazyLoadHandler.hasMoreHistoryAvailable) {
552
- LazyLoadHandler.finishScrollAction();
553
- return;
554
- }
555
- const actualScrollTop = container ? container.scrollTop : 0;
556
- const scrollSucceeded = Math.abs(actualScrollTop - targetScrollTop) < 5; // 5px tolerance for success
557
-
558
- if (scrollSucceeded) {
559
- LazyLoadHandler.finishScrollAction();
560
- } else if (attemptCount < maxAttempts) {
561
- // Retry with exponential backoff (100ms * attempt number)
562
- const timeoutId = window.setTimeout(() => {
563
- LazyLoadHandler.retryTimeouts.delete(timeoutId);
564
- LazyLoadHandler.attemptScroll();
565
- }, 100 * attemptCount); // Exponential backoff
566
- LazyLoadHandler.retryTimeouts.add(timeoutId);
567
- } else {
568
- LazyLoadHandler.finishScrollAction();
476
+ try {
477
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
478
+ Event: _TelemetryConstants.TelemetryEvent.LCWLazyLoadScrollAnchorApplied,
479
+ Description: "Scroll anchor applied after history batch",
480
+ CustomProperties: {
481
+ heightDelta,
482
+ preLoadScrollHeight: LazyLoadHandler.preLoadScrollHeight,
483
+ newScrollHeight,
484
+ newScrollTop: container.scrollTop
569
485
  }
570
486
  });
571
- });
487
+ } catch {
488
+ // Silent fail — don't break scroll anchoring for telemetry issues
489
+ }
490
+ LazyLoadHandler.finishScrollAction();
572
491
  }
573
492
 
574
493
  /**
@@ -582,7 +501,6 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
582
501
  key: "finishScrollAction",
583
502
  value: function finishScrollAction() {
584
503
  // Clean up scroll tracking state
585
- LazyLoadHandler.scrollState = null;
586
504
  LazyLoadHandler.pendingScrollAction = false;
587
505
 
588
506
  // Schedule unpause and reset with delay for content stabilization
@@ -594,33 +512,9 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
594
512
  LazyLoadHandler.retryTimeouts.add(timeoutId);
595
513
  }
596
514
 
597
- /**
598
- * Schedules retry for failed scroll operations
599
- *
600
- * Used when scroll container is not available or scrollable.
601
- * Provides a longer delay to allow container to become ready.
602
- */
603
- }, {
604
- key: "scheduleScrollRetry",
605
- value: function scheduleScrollRetry() {
606
- // Don't schedule retry if no more history is available
607
- if (!LazyLoadHandler.hasMoreHistoryAvailable) {
608
- LazyLoadHandler.finishScrollAction();
609
- return;
610
- }
611
- const timeoutId = window.setTimeout(() => {
612
- LazyLoadHandler.retryTimeouts.delete(timeoutId);
613
- // Only retry if we're still in a pending scroll action state and have more history
614
- if (LazyLoadHandler.pendingScrollAction && LazyLoadHandler.hasMoreHistoryAvailable) {
615
- LazyLoadHandler.executeReliableScroll();
616
- }
617
- }, 1000); // 1 second delay for container readiness
618
- LazyLoadHandler.retryTimeouts.add(timeoutId);
619
- }
620
-
621
515
  /**
622
516
  * Schedules observer reset for next lazy load cycle
623
- *
517
+ *
624
518
  * After a lazy load operation completes, the observer needs to be reset
625
519
  * to detect the next time the user scrolls to the top.
626
520
  */
@@ -738,7 +632,7 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
738
632
  }, {
739
633
  key: "moveScrollDown",
740
634
  value: function moveScrollDown() {
741
- LazyLoadHandler.executeReliableScroll();
635
+ LazyLoadHandler.applyScrollAnchor();
742
636
  }
743
637
 
744
638
  /**
@@ -778,6 +672,9 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
778
672
  }, {
779
673
  key: "handleNoMoreHistoryAvailable",
780
674
  value: function handleNoMoreHistoryAvailable() {
675
+ if (!LazyLoadHandler.initialLoadComplete) {
676
+ LazyLoadHandler.initialLoadComplete = true;
677
+ }
781
678
  LazyLoadHandler.setHasMoreHistoryAvailable(false);
782
679
  LazyLoadHandler.paused = true;
783
680
  LazyLoadHandler.pendingScrollAction = false; // Reset this to prevent stuck states
@@ -795,9 +692,6 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
795
692
  LazyLoadHandler.observer.disconnect();
796
693
  LazyLoadHandler.observer = null;
797
694
  }
798
-
799
- // Clear scroll state
800
- LazyLoadHandler.scrollState = null;
801
695
  }
802
696
 
803
697
  /**
@@ -819,6 +713,8 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
819
713
  LazyLoadHandler.setHasMoreHistoryAvailable(true); // Reset history availability flag
820
714
  LazyLoadHandler.initializationQueue = []; // Clear action queue
821
715
  LazyLoadHandler.resetPending = false; // Clear pending reset flag
716
+ // Note: initialLoadComplete is NOT reset here — it persists across observer cycles.
717
+ // It's only reset on new chat sessions (directReset / PersistentConversationReset).
822
718
 
823
719
  // Reinitialize with faster timing for better responsiveness
824
720
  const timeoutId = window.setTimeout(() => {
@@ -858,8 +754,9 @@ let LazyLoadHandler = exports.LazyLoadHandler = /*#__PURE__*/function () {
858
754
  LazyLoadHandler.initialized = false;
859
755
  LazyLoadHandler.paused = false;
860
756
  LazyLoadHandler.pendingScrollAction = false;
861
- LazyLoadHandler.scrollState = null;
862
757
  LazyLoadHandler.isReady = false;
758
+ LazyLoadHandler.preLoadScrollHeight = 0;
759
+ LazyLoadHandler.preLoadScrollTop = 0;
863
760
  LazyLoadHandler.initializationQueue = [];
864
761
  // Note: Don't reset resetPending here as it needs to persist across unmount/mount cycles
865
762
  }
@@ -915,9 +812,13 @@ _defineProperty(LazyLoadHandler, "paused", false);
915
812
  // Temporary disable flag
916
813
  _defineProperty(LazyLoadHandler, "observer", null);
917
814
  // The intersection observer instance
918
- // Scroll operation state
919
- _defineProperty(LazyLoadHandler, "scrollState", null);
920
- // Current scroll operation tracking
815
+ // Scroll anchoring state (height-delta approach)
816
+ _defineProperty(LazyLoadHandler, "preLoadScrollHeight", 0);
817
+ // scrollHeight before content loads
818
+ _defineProperty(LazyLoadHandler, "preLoadScrollTop", 0);
819
+ // scrollTop before content loads
820
+ _defineProperty(LazyLoadHandler, "initialLoadComplete", false);
821
+ // Tracks if the first batch has loaded
921
822
  _defineProperty(LazyLoadHandler, "pendingScrollAction", false);
922
823
  // Prevents concurrent scroll operations (public for event handlers)
923
824
  // Timeout and queue management
@@ -930,6 +831,7 @@ _defineProperty(LazyLoadHandler, "initTimer", (0, _utils.createTimer)());
930
831
  _defineProperty(LazyLoadHandler, "resetEventListener", _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.PersistentConversationReset).subscribe(() => {
931
832
  _LazyLoadHandler.logLifecycleEvent(_TelemetryConstants.TelemetryEvent.LCWLazyLoadReset, "LazyLoad reset triggered");
932
833
  _LazyLoadHandler.resetPending = true;
834
+ _LazyLoadHandler.initialLoadComplete = false; // New session — next batch is an initial load
933
835
  _LazyLoadHandler.setHasMoreHistoryAvailable(true); // Reset this immediately so activityMiddleware doesn't block rendering
934
836
  _LazyLoadHandler.unmount(); // Clean up current state immediately
935
837
  }));
@@ -941,7 +843,10 @@ _defineProperty(LazyLoadHandler, "initializationQueue", []);
941
843
  // History availability state
942
844
  _defineProperty(LazyLoadHandler, "hasMoreHistoryAvailable", true);
943
845
  const LazyLoadActivity = props => {
944
- const [hasMoreHistory, setHasMoreHistory] = (0, _react.useState)(LazyLoadHandler.hasMoreHistoryAvailable);
846
+ const _useState = (0, _react.useState)(LazyLoadHandler.hasMoreHistoryAvailable),
847
+ _useState2 = _slicedToArray(_useState, 2),
848
+ hasMoreHistory = _useState2[0],
849
+ setHasMoreHistory = _useState2[1];
945
850
  (0, _react.useEffect)(() => {
946
851
  LazyLoadHandler.logLifecycleEvent(_TelemetryConstants.TelemetryEvent.LCWLazyLoadActivityMounted, "LazyLoadActivity component mounted");
947
852
 
@@ -953,19 +858,11 @@ const LazyLoadActivity = props => {
953
858
  setHasMoreHistory(false);
954
859
  };
955
860
 
956
- // Event listener for HISTORY_LOAD_ERROR - hides banner temporarily without disabling future loads
861
+ // Event listener for HISTORY_LOAD_ERROR dismiss banner on any error
957
862
  const handleHistoryLoadError = () => {
958
- // Temporarily hide the banner by pausing, but keep hasMoreHistory true to allow retry
959
- LazyLoadHandler.paused = true;
960
- LazyLoadHandler.pendingScrollAction = false;
961
-
962
- // Re-enable after a delay to allow retry on next scroll
963
- // Note: This timeout is intentionally not tracked as it's scoped to the component lifecycle
964
- window.setTimeout(() => {
965
- LazyLoadHandler.paused = false;
966
- }, 2000); // 2 second delay before allowing retry
967
-
968
- LazyLoadHandler.logLifecycleEvent(_TelemetryConstants.TelemetryEvent.LCWLazyLoadHistoryError, "History load error - will retry on next scroll");
863
+ LazyLoadHandler.logLifecycleEvent(_TelemetryConstants.TelemetryEvent.LCWLazyLoadHistoryError, `History load error - dismissing banner. initialLoadComplete: ${LazyLoadHandler.initialLoadComplete}`);
864
+ LazyLoadHandler.handleNoMoreHistoryAvailable();
865
+ setHasMoreHistory(false);
969
866
  };
970
867
 
971
868
  // Event listener for PersistentConversationReset to sync React state
@@ -976,6 +873,95 @@ const LazyLoadActivity = props => {
976
873
  setHasMoreHistory(true);
977
874
  };
978
875
 
876
+ // Event listener for HISTORY_BATCH_LOADED — applies scroll anchoring after batch is processed
877
+ const handleBatchLoaded = () => {
878
+ LazyLoadHandler.logLifecycleEvent(_TelemetryConstants.TelemetryEvent.LCWLazyLoadBatchReceived, `Batch received — initialLoadComplete: ${LazyLoadHandler.initialLoadComplete}`);
879
+ if (!LazyLoadHandler.initialLoadComplete) {
880
+ // Initial load: use the same height-delta scroll anchoring as subsequent loads.
881
+ // This keeps the user at their current position while history is prepended above.
882
+ LazyLoadHandler.initialLoadComplete = true;
883
+ LazyLoadHandler.pendingScrollAction = false;
884
+ try {
885
+ const _LazyLoadHandler$find6 = LazyLoadHandler.findScrollContainer(),
886
+ container = _LazyLoadHandler$find6.container;
887
+ if (container) {
888
+ const savedScrollTop = container.scrollTop;
889
+ const savedScrollHeight = container.scrollHeight;
890
+
891
+ // Freeze viewport while React renders new content above
892
+ container.style.overflow = "hidden";
893
+ let framesRemaining = 6;
894
+ const anchorScroll = () => {
895
+ const newScrollHeight = container.scrollHeight;
896
+ const heightDelta = newScrollHeight - savedScrollHeight;
897
+ if (heightDelta > 0) {
898
+ container.scrollTop = savedScrollTop + heightDelta;
899
+ }
900
+ framesRemaining--;
901
+ if (framesRemaining > 0) {
902
+ requestAnimationFrame(anchorScroll);
903
+ } else {
904
+ container.style.overflow = "";
905
+ LazyLoadHandler.paused = false;
906
+ LazyLoadHandler.scheduleReset();
907
+ }
908
+ };
909
+ requestAnimationFrame(anchorScroll);
910
+ } else {
911
+ LazyLoadHandler.paused = false;
912
+ LazyLoadHandler.scheduleReset();
913
+ }
914
+ } catch {
915
+ LazyLoadHandler.paused = false;
916
+ LazyLoadHandler.scheduleReset();
917
+ }
918
+ LazyLoadHandler.logLifecycleEvent(_TelemetryConstants.TelemetryEvent.LCWLazyLoadInitialLoadComplete, "Initial history load complete — scroll anchored to current position");
919
+ return;
920
+ }
921
+ // Pagination: apply height-delta scroll anchoring repeatedly across frames.
922
+ //
923
+ // react-scroll-to-bottom uses useEffect + rAF to auto-scroll to bottom when new content
924
+ // arrives. This fires at unpredictable timing relative to our callbacks, so a single
925
+ // scrollTop assignment gets overridden intermittently.
926
+ //
927
+ // Fix: re-apply the correct scrollTop across several animation frames. After a few frames,
928
+ // react-scroll-to-bottom detects the user is NOT at the bottom (sticky=false) and stops
929
+ // auto-scrolling. We also temporarily freeze overflow to prevent visible flicker.
930
+ try {
931
+ const _LazyLoadHandler$find7 = LazyLoadHandler.findScrollContainer(),
932
+ container = _LazyLoadHandler$find7.container;
933
+ if (container) {
934
+ // Re-capture scrollTop — user may have scrolled during the API fetch
935
+ const savedScrollTop = container.scrollTop;
936
+ const savedScrollHeight = LazyLoadHandler.preLoadScrollHeight;
937
+
938
+ // Freeze viewport to prevent visible flicker between competing scroll positions
939
+ container.style.overflow = "hidden";
940
+ let framesRemaining = 6; // ~100ms at 60fps — enough for react-scroll-to-bottom to settle
941
+ const anchorScroll = () => {
942
+ const newScrollHeight = container.scrollHeight;
943
+ const heightDelta = newScrollHeight - savedScrollHeight;
944
+ if (heightDelta > 0) {
945
+ container.scrollTop = savedScrollTop + heightDelta;
946
+ }
947
+ framesRemaining--;
948
+ if (framesRemaining > 0) {
949
+ requestAnimationFrame(anchorScroll);
950
+ } else {
951
+ // All frames applied — restore overflow and finish
952
+ container.style.overflow = "";
953
+ LazyLoadHandler.finishScrollAction();
954
+ }
955
+ };
956
+ requestAnimationFrame(anchorScroll);
957
+ } else {
958
+ LazyLoadHandler.finishScrollAction();
959
+ }
960
+ } catch {
961
+ LazyLoadHandler.finishScrollAction();
962
+ }
963
+ };
964
+
979
965
  // Add secure event listener for no more history signal
980
966
  const eventBus = _SecureEventBus.default.getInstance();
981
967
  const unsubscribeNoMoreHistory = eventBus.subscribe(_ChatWidgetEvents.default.NO_MORE_HISTORY_AVAILABLE, handleNoMoreHistory);
@@ -983,6 +969,9 @@ const LazyLoadActivity = props => {
983
969
  // Add event listener for history load errors
984
970
  const unsubscribeHistoryError = eventBus.subscribe(_ChatWidgetEvents.default.HISTORY_LOAD_ERROR, handleHistoryLoadError);
985
971
 
972
+ // Add event listener for history batch loaded
973
+ const unsubscribeBatchLoaded = eventBus.subscribe(_ChatWidgetEvents.default.HISTORY_BATCH_LOADED, handleBatchLoaded);
974
+
986
975
  // Add event listener for persistent conversation reset
987
976
  const resetSubscription = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.PersistentConversationReset).subscribe(handlePersistentConversationReset);
988
977
 
@@ -1000,6 +989,7 @@ const LazyLoadActivity = props => {
1000
989
  return () => {
1001
990
  unsubscribeNoMoreHistory();
1002
991
  unsubscribeHistoryError();
992
+ unsubscribeBatchLoaded();
1003
993
  resetSubscription.unsubscribe();
1004
994
  };
1005
995
  }
@@ -1037,9 +1027,8 @@ const LazyLoadActivity = props => {
1037
1027
  };
1038
1028
 
1039
1029
  // Find container and attach scroll listener
1040
- const {
1041
- container
1042
- } = LazyLoadHandler.findScrollContainer();
1030
+ const _LazyLoadHandler$find8 = LazyLoadHandler.findScrollContainer(),
1031
+ container = _LazyLoadHandler$find8.container;
1043
1032
  if (container) {
1044
1033
  container.addEventListener("scroll", handleScroll, {
1045
1034
  passive: true
@@ -1053,6 +1042,7 @@ const LazyLoadActivity = props => {
1053
1042
  // Remove event listeners
1054
1043
  unsubscribeNoMoreHistory();
1055
1044
  unsubscribeHistoryError();
1045
+ unsubscribeBatchLoaded();
1056
1046
  resetSubscription.unsubscribe();
1057
1047
  if (container) {
1058
1048
  container.removeEventListener("scroll", handleScroll);
@@ -10,11 +10,9 @@ var _defaultMiddlewareLocalizedTexts = require("../../../../common/defaultProps/
10
10
  var _mergeStyles = require("@fluentui/merge-styles");
11
11
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
12
  const LoadInlineBannerActivity = _ref => {
13
- let {
14
- webChatContainerProps,
15
- persistentChatHistory,
16
- id
17
- } = _ref;
13
+ let webChatContainerProps = _ref.webChatContainerProps,
14
+ persistentChatHistory = _ref.persistentChatHistory,
15
+ id = _ref.id;
18
16
  const localizedTexts = (0, _react.useMemo)(() => ({
19
17
  ..._defaultMiddlewareLocalizedTexts.defaultMiddlewareLocalizedTexts,
20
18
  ...(webChatContainerProps === null || webChatContainerProps === void 0 ? void 0 : webChatContainerProps.localizedTexts)
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.createActivityMiddleware = void 0;
6
+ exports.resetActivityMiddlewareCache = exports.createActivityMiddleware = void 0;
7
7
  var _LazyLoadActivity = _interopRequireWildcard(require("./activities/LazyLoadActivity"));
8
8
  var _TelemetryConstants = require("../../../../../common/telemetry/TelemetryConstants");
9
9
  var _Constants = require("../../../../../common/Constants");
@@ -55,7 +55,16 @@ const handleSystemMessage = (next, args, card, renderMarkdown, systemMessageStyl
55
55
  if ((_card$activity5 = card.activity) !== null && _card$activity5 !== void 0 && (_card$activity5 = _card$activity5.channelData) !== null && _card$activity5 !== void 0 && _card$activity5.clientmessageid && ((_card$nextVisibleActi = card.nextVisibleActivity) === null || _card$nextVisibleActi === void 0 || (_card$nextVisibleActi = _card$nextVisibleActi.channelData) === null || _card$nextVisibleActi === void 0 ? void 0 : _card$nextVisibleActi.clientmessageid) === ((_card$activity6 = card.activity) === null || _card$activity6 === void 0 || (_card$activity6 = _card$activity6.channelData) === null || _card$activity6 === void 0 ? void 0 : _card$activity6.clientmessageid) || (_card$activity7 = card.activity) !== null && _card$activity7 !== void 0 && _card$activity7.messageid && ((_card$nextVisibleActi2 = card.nextVisibleActivity) === null || _card$nextVisibleActi2 === void 0 ? void 0 : _card$nextVisibleActi2.messageid) === ((_card$activity8 = card.activity) === null || _card$activity8 === void 0 ? void 0 : _card$activity8.messageid)) {
56
56
  return () => false;
57
57
  }
58
- card.activity.text = renderMarkdown(card.activity.text);
58
+
59
+ // Render latest text on every pass. We deliberately do NOT cache the pre-render text
60
+ // (removed post-PR #895), because:
61
+ // 1. card.activity.text is no longer mutated (renderedHtml is a local variable), so
62
+ // exponential <br> growth from repeated markdown rendering is not possible.
63
+ // 2. Caching the first-seen text prevents edited system messages (same id, updated
64
+ // text/version) from ever re-rendering with the latest content.
65
+ // renderMarkdown sanitizes the HTML using DOMPurify with allowlist-based configuration
66
+ // See initWebChatComposer.ts for sanitization details
67
+ const renderedHtml = renderMarkdown(card.activity.text);
59
68
  // eslint-disable-next-line react/display-name
60
69
  return () => /*#__PURE__*/_react.default.createElement("div", {
61
70
  key: card.activity.id,
@@ -63,7 +72,7 @@ const handleSystemMessage = (next, args, card, renderMarkdown, systemMessageStyl
63
72
  "aria-hidden": "false",
64
73
  className: _Constants.Constants.markDownSystemMessageClass,
65
74
  dangerouslySetInnerHTML: {
66
- __html: card.activity.text
75
+ __html: renderedHtml
67
76
  }
68
77
  });
69
78
  };
@@ -83,7 +92,7 @@ const createActivityMiddleware = (renderMarkdown, systemMessageStyleProps, userM
83
92
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
84
93
  args[_key] = arguments[_key];
85
94
  }
86
- const [card] = args;
95
+ const card = args[0];
87
96
  if (card.activity) {
88
97
  var _card$activity$from;
89
98
  if (((_card$activity$from = card.activity.from) === null || _card$activity$from === void 0 ? void 0 : _card$activity$from.role) === _DirectLineSenderRole.DirectLineSenderRole.Channel) {
@@ -132,7 +141,7 @@ const createActivityMiddleware = (renderMarkdown, systemMessageStyleProps, userM
132
141
  if (isTagIncluded(card, _Constants.Constants.conversationDividerTag)) {
133
142
  const conversationDividerLabel = (localizedTexts === null || localizedTexts === void 0 ? void 0 : localizedTexts.CONVERSATION_DIVIDER_ARIA_LABEL) || _defaultMiddlewareLocalizedTexts.defaultMiddlewareLocalizedTexts.CONVERSATION_DIVIDER_ARIA_LABEL;
134
143
  // Pass the computed localized text to the divider component
135
- return /*#__PURE__*/_react.default.createElement(_ConversationDividerActivity.default, {
144
+ return () => /*#__PURE__*/_react.default.createElement(_ConversationDividerActivity.default, {
136
145
  dividerActivityAriaLabel: conversationDividerLabel
137
146
  });
138
147
  }
@@ -156,4 +165,11 @@ const createActivityMiddleware = (renderMarkdown, systemMessageStyleProps, userM
156
165
  }
157
166
  return next(...args);
158
167
  };
159
- exports.createActivityMiddleware = createActivityMiddleware;
168
+
169
+ /** Clear module-level caches. Call on conversation end / chat close. */
170
+ exports.createActivityMiddleware = createActivityMiddleware;
171
+ const resetActivityMiddlewareCache = () => {
172
+ loggedSystemMessages.length = 0;
173
+ lastRenderedAt = 0;
174
+ };
175
+ exports.resetActivityMiddlewareCache = resetActivityMiddlewareCache;