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

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 (248) hide show
  1. package/README.md +42 -3
  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 +17 -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/startChat.js +31 -14
  33. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +158 -21
  34. package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +16 -11
  35. package/lib/cjs/components/notificationpanestateful/NotificationPaneStateful.js +19 -12
  36. package/lib/cjs/components/ooohpanestateful/OOOHPaneStateful.js +13 -6
  37. package/lib/cjs/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +28 -5
  38. package/lib/cjs/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +12 -5
  39. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +105 -11
  40. package/lib/cjs/components/prechatsurveypanestateful/common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps.js +12 -1
  41. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +17 -7
  42. package/lib/cjs/components/reconnectchatpanestateful/ReconnectChatPaneStateful.js +16 -7
  43. package/lib/cjs/components/startchaterrorpanestateful/StartChatErrorPaneStateful.js +10 -2
  44. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +154 -29
  45. package/lib/cjs/components/webchatcontainerstateful/common/DesignerChatAdapter.js +10 -0
  46. package/lib/cjs/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.js +115 -10
  47. package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts.js +3 -0
  48. package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps.js +2 -1
  49. package/lib/cjs/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +3 -1
  50. package/lib/cjs/components/webchatcontainerstateful/common/defaultStyles/defaultWebChatStyles.js +2 -2
  51. package/lib/cjs/components/webchatcontainerstateful/common/utils/chatAdapterUtils.js +3 -1
  52. package/lib/cjs/components/webchatcontainerstateful/common/utils/citationA11y.js +195 -0
  53. package/lib/cjs/components/webchatcontainerstateful/interfaces/IWebChatAction.js +17 -1
  54. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.js +27 -4
  55. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsEgressMiddleware.js +1 -3
  56. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsIngressMiddleware.js +1 -3
  57. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.js +180 -190
  58. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LoadInlineBannerActivity.js +3 -5
  59. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +22 -6
  60. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +12 -23
  61. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +27 -35
  62. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/AdaptiveCardAccessibilityWrapper.js +199 -0
  63. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/Attachment.js +29 -15
  64. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware.js +5 -12
  65. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +1 -1
  66. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultAvatarTextStyles.js +1 -1
  67. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageStyles.js +8 -3
  68. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultTimestampRetryStyles.js +8 -1
  69. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/groupActivitiesMiddleware.js +5 -8
  70. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware.js +6 -4
  71. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +6 -4
  72. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +14 -12
  73. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/HistoryMessageTimestamp.js +16 -14
  74. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +18 -30
  75. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +10 -2
  76. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/toastMiddleware.js +1 -3
  77. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +16 -12
  78. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.js +6 -6
  79. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware.js +83 -0
  80. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.js +36 -8
  81. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.js +5 -1
  82. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.js +10 -7
  83. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +4 -0
  84. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -4
  85. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.js +5 -1
  86. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware.js +7 -7
  87. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/gifUploadMiddleware.js +10 -14
  88. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlPlayerMiddleware.js +6 -4
  89. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware.js +13 -10
  90. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +57 -11
  91. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator.js +6 -4
  92. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware.js +25 -30
  93. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +10 -7
  94. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware.js +6 -4
  95. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.js +55 -1
  96. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +2 -4
  97. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +5 -0
  98. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +17 -1
  99. package/lib/cjs/contexts/createReducer.js +15 -0
  100. package/lib/cjs/controller/componentController.js +13 -1
  101. package/lib/cjs/hooks/useWindowDimensions.js +13 -5
  102. package/lib/cjs/package.json +1 -0
  103. package/lib/cjs/plugins/createChatTranscript.js +3 -4
  104. package/lib/cjs/plugins/newMessageEventHandler.js +20 -3
  105. package/lib/esm/common/Constants.js +5 -0
  106. package/lib/esm/common/facades/FacadeChatSDK.js +235 -10
  107. package/lib/esm/common/telemetry/TelemetryConstants.js +17 -0
  108. package/lib/esm/common/telemetry/TelemetryManager.js +6 -1
  109. package/lib/esm/common/telemetry/loggers/appInsightsLogger.js +2 -3
  110. package/lib/esm/common/telemetry/sanitizeSasInPayload.js +84 -0
  111. package/lib/esm/common/utils.js +88 -14
  112. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +15 -5
  113. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +19 -9
  114. package/lib/esm/components/citationpanestateful/CitationDim.js +2 -3
  115. package/lib/esm/components/citationpanestateful/CitationPaneStateful.js +26 -4
  116. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +22 -2
  117. package/lib/esm/components/dimlayer/DimLayer.js +1 -3
  118. package/lib/esm/components/draggable/DraggableChatWidget.js +34 -14
  119. package/lib/esm/components/draggable/DraggableEventEmitter.js +10 -1
  120. package/lib/esm/components/draggable/DraggableEventReceiver.js +1 -3
  121. package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +54 -17
  122. package/lib/esm/components/errorboundary/ErrorBoundary.js +4 -12
  123. package/lib/esm/components/footerstateful/FooterStateful.js +17 -8
  124. package/lib/esm/components/footerstateful/audionotificationstateful/AudioNotificationStateful.js +2 -4
  125. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +4 -6
  126. package/lib/esm/components/headerstateful/HeaderStateful.js +22 -10
  127. package/lib/esm/components/livechatwidget/LiveChatWidget.js +27 -4
  128. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/HiddenAdaptiveCardActivitySubscriber.js +5 -11
  129. package/lib/esm/components/livechatwidget/common/ChatWidgetEvents.js +1 -0
  130. package/lib/esm/components/livechatwidget/common/PersistentConversationHandler.js +11 -4
  131. package/lib/esm/components/livechatwidget/common/authHelper.js +44 -4
  132. package/lib/esm/components/livechatwidget/common/createMarkdown.js +98 -5
  133. package/lib/esm/components/livechatwidget/common/endChat.js +12 -9
  134. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +182 -1
  135. package/lib/esm/components/livechatwidget/common/startChat.js +31 -14
  136. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +157 -20
  137. package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +14 -9
  138. package/lib/esm/components/notificationpanestateful/NotificationPaneStateful.js +17 -10
  139. package/lib/esm/components/ooohpanestateful/OOOHPaneStateful.js +12 -5
  140. package/lib/esm/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +28 -5
  141. package/lib/esm/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +11 -4
  142. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +105 -11
  143. package/lib/esm/components/prechatsurveypanestateful/common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps.js +12 -1
  144. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +16 -6
  145. package/lib/esm/components/reconnectchatpanestateful/ReconnectChatPaneStateful.js +15 -6
  146. package/lib/esm/components/startchaterrorpanestateful/StartChatErrorPaneStateful.js +9 -1
  147. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +154 -29
  148. package/lib/esm/components/webchatcontainerstateful/common/DesignerChatAdapter.js +10 -0
  149. package/lib/esm/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.js +115 -10
  150. package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts.js +3 -0
  151. package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps.js +2 -1
  152. package/lib/esm/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +3 -1
  153. package/lib/esm/components/webchatcontainerstateful/common/defaultStyles/defaultWebChatStyles.js +2 -2
  154. package/lib/esm/components/webchatcontainerstateful/common/utils/chatAdapterUtils.js +3 -1
  155. package/lib/esm/components/webchatcontainerstateful/common/utils/citationA11y.js +188 -0
  156. package/lib/esm/components/webchatcontainerstateful/interfaces/IWebChatAction.js +10 -1
  157. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.js +27 -4
  158. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsEgressMiddleware.js +1 -3
  159. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/adaptermiddlewares/formatTagsIngressMiddleware.js +1 -3
  160. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.js +180 -190
  161. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LoadInlineBannerActivity.js +3 -5
  162. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +19 -4
  163. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +12 -23
  164. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +27 -32
  165. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/AdaptiveCardAccessibilityWrapper.js +193 -0
  166. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/Attachment.js +28 -14
  167. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware.js +5 -12
  168. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +1 -1
  169. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultAvatarTextStyles.js +1 -1
  170. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageStyles.js +8 -3
  171. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultTimestampRetryStyles.js +8 -1
  172. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/groupActivitiesMiddleware.js +5 -8
  173. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware.js +6 -4
  174. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +6 -4
  175. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +13 -11
  176. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/HistoryMessageTimestamp.js +15 -13
  177. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +17 -27
  178. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +9 -1
  179. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/toastMiddleware.js +1 -3
  180. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +16 -10
  181. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.js +6 -6
  182. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware.js +77 -0
  183. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.js +36 -8
  184. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.js +5 -2
  185. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.js +10 -7
  186. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +4 -0
  187. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -4
  188. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.js +5 -1
  189. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware.js +7 -7
  190. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/gifUploadMiddleware.js +10 -14
  191. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlPlayerMiddleware.js +6 -4
  192. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware.js +13 -10
  193. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +57 -11
  194. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator.js +6 -4
  195. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware.js +25 -31
  196. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +10 -7
  197. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware.js +6 -4
  198. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.js +55 -1
  199. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +2 -4
  200. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +5 -0
  201. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +17 -1
  202. package/lib/esm/contexts/createReducer.js +15 -0
  203. package/lib/esm/controller/componentController.js +13 -1
  204. package/lib/esm/hooks/useWindowDimensions.js +13 -5
  205. package/lib/esm/plugins/createChatTranscript.js +3 -4
  206. package/lib/esm/plugins/newMessageEventHandler.js +20 -3
  207. package/lib/types/common/Constants.d.ts +4 -0
  208. package/lib/types/common/facades/FacadeChatSDK.d.ts +29 -0
  209. package/lib/types/common/facades/types/IFacadeChatSDKInput.d.ts +3 -1
  210. package/lib/types/common/telemetry/TelemetryConstants.d.ts +14 -2
  211. package/lib/types/common/telemetry/sanitizeSasInPayload.d.ts +24 -0
  212. package/lib/types/common/utils.d.ts +3 -1
  213. package/lib/types/components/livechatwidget/common/ChatWidgetEvents.d.ts +2 -1
  214. package/lib/types/components/livechatwidget/common/authHelper.d.ts +9 -2
  215. package/lib/types/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.d.ts +6 -0
  216. package/lib/types/components/webchatcontainerstateful/common/utils/chatAdapterUtils.d.ts +1 -1
  217. package/lib/types/components/webchatcontainerstateful/common/utils/citationA11y.d.ts +1 -0
  218. package/lib/types/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.d.ts +1 -0
  219. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatAction.d.ts +16 -1
  220. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +7 -0
  221. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.d.ts +14 -38
  222. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.d.ts +2 -0
  223. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachments/AdaptiveCardAccessibilityWrapper.d.ts +18 -0
  224. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageStyles.d.ts +3 -0
  225. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware.d.ts +2 -4
  226. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.d.ts +2 -4
  227. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.d.ts +2 -4
  228. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware.d.ts +10 -0
  229. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.d.ts +2 -4
  230. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.d.ts +2 -2
  231. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.d.ts +2 -4
  232. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.d.ts +2 -2
  233. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.d.ts +2 -4
  234. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.d.ts +2 -2
  235. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware.d.ts +2 -4
  236. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/gifUploadMiddleware.d.ts +2 -4
  237. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlPlayerMiddleware.d.ts +2 -4
  238. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware.d.ts +2 -4
  239. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.d.ts +2 -4
  240. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator.d.ts +2 -4
  241. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware.d.ts +2 -4
  242. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.d.ts +2 -2
  243. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware.d.ts +2 -4
  244. package/lib/types/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.d.ts +7 -0
  245. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
  246. package/lib/types/contexts/common/ILiveChatWidgetLocalizedTexts.d.ts +17 -0
  247. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +2 -1
  248. package/package.json +69 -56
@@ -11,6 +11,7 @@ import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidge
11
11
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
12
12
  import { WebChatStoreLoader } from "../../webchatcontainerstateful/webchatcontroller/WebChatStoreLoader";
13
13
  import attachmentProcessingMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware";
14
+ import attachmentSentAnnouncementMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentSentAnnouncementMiddleware";
14
15
  import channelDataMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware";
15
16
  import { createActivityMiddleware } from "../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware";
16
17
  import { createActivityStatusMiddleware } from "../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware";
@@ -120,7 +121,7 @@ export const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endCh
120
121
  };
121
122
  webChatStore = createStore({},
122
123
  //initial state
123
- preProcessingMiddleware, attachmentProcessingMiddleware, createAttachmentUploadValidatorMiddleware((_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), createCustomEventMiddleware(BroadcastService), createQueueOverflowMiddleware(state, dispatch), channelDataMiddleware(addConversationalSurveyTagsCallback), createConversationEndMiddleware(conversationEndCallback, startConversationalSurveyCallback, endConversationalSurveyCallback), createDataMaskingMiddleware((_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : _state$domainStates$l3.DataMaskingInfo), createMessageTimeStampMiddleware, createMessageSequenceIdOverrideMiddleware, createCitationsMiddleware(state, dispatch), gifUploadMiddleware, htmlPlayerMiddleware, htmlTextMiddleware(honorsTargetInHTMLLinks), createMaxMessageSizeValidator(localizedTexts), sanitizationMiddleware, createCallActionMiddleware(),
124
+ preProcessingMiddleware, attachmentProcessingMiddleware, createAttachmentUploadValidatorMiddleware((_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, createCustomEventMiddleware(BroadcastService), createQueueOverflowMiddleware(state, dispatch), channelDataMiddleware(addConversationalSurveyTagsCallback), createConversationEndMiddleware(conversationEndCallback, startConversationalSurveyCallback, endConversationalSurveyCallback), createDataMaskingMiddleware((_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : _state$domainStates$l3.DataMaskingInfo), createMessageTimeStampMiddleware, createMessageSequenceIdOverrideMiddleware, createCitationsMiddleware(state, dispatch), gifUploadMiddleware, htmlPlayerMiddleware, htmlTextMiddleware(honorsTargetInHTMLLinks), createMaxMessageSizeValidator(localizedTexts), sanitizationMiddleware, createCallActionMiddleware(),
124
125
  // Pass a callback so middleware can push initials into React context for reactivity
125
126
  localizedStringsBotInitialsMiddleware(initials => {
126
127
  dispatch({
@@ -146,14 +147,194 @@ export const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endCh
146
147
  markdownRenderers.forEach(renderer => {
147
148
  text = renderer.render(text);
148
149
  });
150
+
151
+ // EXISTING sanitization (continues to work as before)
149
152
  const config = {
150
153
  FORBID_TAGS: ["form", "button", "script", "div", "input"],
151
154
  FORBID_ATTR: ["action"],
152
155
  ADD_ATTR: ["target"]
153
156
  };
154
157
  text = DOMPurify.sanitize(text, config);
158
+
159
+ // MONITOR-ONLY: Test what the stricter allowlist would remove (Phase 1)
160
+ // This does NOT modify the text, only logs telemetry
161
+ // Run during browser idle time to avoid blocking message flow and adding latency
162
+ const textToMonitor = text; // Capture current text value
163
+
164
+ // Schedule monitoring to run during browser idle time
165
+ const scheduleMonitoring = () => {
166
+ try {
167
+ monitorStrictSanitization(textToMonitor, state);
168
+ } catch (error) {
169
+ // Silently catch errors to prevent blocking message flow
170
+ if (process.env.NODE_ENV === "development") {
171
+ console.error("[Monitor] HTML sanitization monitoring failed:", error);
172
+ }
173
+ }
174
+ };
175
+
176
+ // Use requestIdleCallback for truly idle execution, fallback to setTimeout for older browsers
177
+ if (typeof window !== "undefined" && "requestIdleCallback" in window) {
178
+ window.requestIdleCallback(scheduleMonitoring);
179
+ } else {
180
+ setTimeout(scheduleMonitoring, 0);
181
+ }
155
182
  return text;
156
183
  };
184
+
185
+ /**
186
+ * Monitor-only sanitization (Phase 1: Gather telemetry)
187
+ * Tests what a stricter allowlist-based sanitization would remove
188
+ * WITHOUT actually removing it. Logs telemetry for analysis.
189
+ *
190
+ * IMPORTANT: This function is wrapped in try-catch and runs asynchronously
191
+ * to ensure failures don't block message flow or add latency.
192
+ *
193
+ * ISOLATION: Uses a separate DOMPurify instance to completely isolate
194
+ * monitoring hooks from other sanitization paths (e.g., postDomPurifyActivities).
195
+ * The instance is garbage collected after use, no cleanup needed.
196
+ *
197
+ * @param html - The HTML text that was already sanitized with existing config
198
+ * @param state - Widget state containing orgId and chatId
199
+ */
200
+ const monitorStrictSanitization = (html, state) => {
201
+ // Early exit for empty content
202
+ if (!html) return;
203
+
204
+ // Track execution time for performance monitoring
205
+ const startTime = performance.now();
206
+ try {
207
+ // Create a separate DOMPurify instance for monitoring
208
+ // This completely isolates monitoring from other sanitization paths
209
+ const monitorDOMPurify = DOMPurify(window);
210
+
211
+ // Strict allowlist configuration (proposed new rules)
212
+ // Note: DOMPurify blocks event handlers (onclick, onerror, etc.) by default
213
+ const strictConfig = {
214
+ ALLOWED_TAGS: ["b", "strong",
215
+ // Bold text
216
+ "i", "em", "u",
217
+ // Italic, emphasis, underline
218
+ "br", "p",
219
+ // Line breaks and paragraphs
220
+ "ul", "ol", "li",
221
+ // Lists
222
+ "a" // Links (with restricted attributes)
223
+ ],
224
+ ALLOWED_ATTR: ["href",
225
+ // For links (will be restricted to http/https)
226
+ "target",
227
+ // For link behavior
228
+ "rel" // For security (noopener, noreferrer)
229
+ ],
230
+ FORBID_TAGS: ["img", "video", "audio",
231
+ // Media (tracking beacons)
232
+ "iframe", "object", "embed",
233
+ // Embedded content
234
+ "script", "style",
235
+ // Script and styling
236
+ "form", "input", "textarea", "button",
237
+ // Form elements
238
+ "link", "meta", "base",
239
+ // Document metadata
240
+ "div", "span" // Layout elements
241
+ ],
242
+ FORBID_ATTR: ["style",
243
+ // Inline CSS
244
+ "action" // Form action attribute (event handlers blocked by default)
245
+ ],
246
+ ALLOWED_URI_REGEXP: /^https?:/i,
247
+ ALLOW_DATA_ATTR: false,
248
+ ALLOW_UNKNOWN_PROTOCOLS: false
249
+ };
250
+
251
+ // Track what would be removed
252
+ const removedTags = [];
253
+ const removedAttributes = [];
254
+
255
+ // Add hooks to the isolated monitoring instance
256
+ monitorDOMPurify.addHook("uponSanitizeElement", (node, data) => {
257
+ try {
258
+ const tagName = data.tagName.toLowerCase();
259
+ // Filter out "body" tag which is DOMPurify's internal wrapper
260
+ if (node.nodeType === 1 && !strictConfig.ALLOWED_TAGS.includes(tagName) && tagName !== "body") {
261
+ removedTags.push(tagName);
262
+ }
263
+ } catch (hookError) {
264
+ // Silently ignore hook errors
265
+ }
266
+ });
267
+ monitorDOMPurify.addHook("uponSanitizeAttribute", (node, data) => {
268
+ try {
269
+ const attrName = data.attrName.toLowerCase();
270
+ if (!strictConfig.ALLOWED_ATTR.includes(attrName) && attrName !== "class" && attrName !== "id") {
271
+ removedAttributes.push(attrName);
272
+ }
273
+ } catch (hookError) {
274
+ // Silently ignore hook errors
275
+ }
276
+ });
277
+
278
+ // Run sanitization on the isolated instance (we discard the result)
279
+ // No cleanup needed - the instance will be garbage collected with its hooks
280
+ monitorDOMPurify.sanitize(html, strictConfig);
281
+
282
+ // Log telemetry if content would be affected by strict rules
283
+ if (removedTags.length > 0 || removedAttributes.length > 0) {
284
+ try {
285
+ var _state$domainStates, _state$domainStates2;
286
+ const uniqueTags = [...new Set(removedTags)];
287
+ const uniqueAttrs = [...new Set(removedAttributes)];
288
+
289
+ // Calculate execution time
290
+ const endTime = performance.now();
291
+ const executionTimeMs = Math.round((endTime - startTime) * 100) / 100; // Round to 2 decimal places
292
+
293
+ // Get context for telemetry (with safe fallbacks)
294
+ 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";
295
+ 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";
296
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
297
+ Event: TelemetryEvent.HTMLSanitized,
298
+ Description: JSON.stringify({
299
+ message: "HTML content would be sanitized by stricter allowlist (monitor-only)",
300
+ removedTags: uniqueTags,
301
+ removedAttributes: uniqueAttrs,
302
+ phase: "Monitor",
303
+ organizationId: orgId,
304
+ conversationId: conversationId
305
+ }),
306
+ ElapsedTimeInMilliseconds: executionTimeMs
307
+ });
308
+
309
+ // Log to console in development for debugging
310
+ if (process.env.NODE_ENV === "development") {
311
+ console.warn("[Monitor] Stricter HTML sanitization telemetry:", {
312
+ description: JSON.parse(JSON.stringify({
313
+ message: "HTML content would be sanitized by stricter allowlist (monitor-only)",
314
+ removedTags: uniqueTags,
315
+ removedAttributes: uniqueAttrs,
316
+ phase: "Monitor"
317
+ })),
318
+ orgId,
319
+ conversationId,
320
+ executionTimeMs
321
+ });
322
+ }
323
+ } catch (telemetryError) {
324
+ // Silently ignore telemetry errors to prevent blocking
325
+ if (process.env.NODE_ENV === "development") {
326
+ console.error("[Monitor] Telemetry logging failed:", telemetryError);
327
+ }
328
+ }
329
+ }
330
+ } catch (error) {
331
+ // Catch-all for any unexpected errors
332
+ // Silently fail to ensure monitoring never blocks message flow
333
+ if (process.env.NODE_ENV === "development") {
334
+ console.error("[Monitor] Monitoring failed:", error);
335
+ }
336
+ }
337
+ };
157
338
  function postDomPurifyActivities() {
158
339
  DOMPurify.addHook("afterSanitizeAttributes", function (node) {
159
340
  const target = node.getAttribute(Constants.Target);
@@ -14,6 +14,7 @@ import { createAdapter } from "./createAdapter";
14
14
  import { createOnNewAdapterActivityHandler } from "../../../plugins/newMessageEventHandler";
15
15
  import { createTrackingForFirstMessage } from "../../../firstresponselatency/FirstMessageTrackerFromBot";
16
16
  import { isPersistentChatEnabled } from "./liveChatConfigUtils";
17
+ import { isMidAuthEnabled } from "./authHelper";
17
18
  import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey";
18
19
  import { shouldSetPreChatIfPersistentChat } from "./persistentChatHelper";
19
20
  import { updateTelemetryData } from "./updateSessionDataForTelemetry";
@@ -59,7 +60,7 @@ const prepareStartChat = async (props, facadeChatSDK, state, dispatch, setAdapte
59
60
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
61
  const setPreChatAndInitiateChat = async (facadeChatSDK, dispatch, setAdapter, isProactiveChat, proactiveChatEnablePrechatState, state, props) => {
61
62
  var _props$preChatSurveyP, _props$controlProps, _state$domainStates, _state$appStates2;
62
- // This reset needs to be done before to load prechat, because the conversation state changes from close to prechat
63
+ // Reset before loading prechat to avoid starting chat with previous requestId
63
64
  if ((state === null || state === void 0 ? void 0 : state.appStates.conversationState) === ConversationState.Closed) {
64
65
  // Preventive reset to avoid starting chat with previous requestId which could potentially cause problems
65
66
  chatSDKStateCleanUp(facadeChatSDK.getChatSDK());
@@ -192,7 +193,7 @@ const initStartChat = async (facadeChatSDK, dispatch, setAdapter, state, props,
192
193
  });
193
194
  }
194
195
  try {
195
- var _window$Microsoft;
196
+ var _window$Microsoft, _state$domainStates8;
196
197
  // Set custom context params
197
198
  await setCustomContextParams(state, props);
198
199
  const defaultOptionalParams = {
@@ -201,9 +202,25 @@ const initStartChat = async (facadeChatSDK, dispatch, setAdapter, state, props,
201
202
  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
202
203
  };
203
204
  const startChatOptionalParams = Object.assign({}, params, optionalParams, defaultOptionalParams);
205
+
206
+ // MID-AUTH: Add wasAuthenticated flag for reconnect scenarios
207
+ // Tells FacadeChatSDK whether the previous session was authenticated
208
+ // Used to detect auth transitions (Auth->Unauth) and decide whether to call authenticateChat
209
+ const midAuthEnabled = isMidAuthEnabled(state === null || state === void 0 || (_state$domainStates8 = state.domainStates) === null || _state$domainStates8 === void 0 ? void 0 : _state$domainStates8.liveChatConfig);
210
+ if (midAuthEnabled) {
211
+ var _state$appStates4, _persistedState$appSt;
212
+ 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;
213
+ startChatOptionalParams.wasAuthenticated = isUserAuthenticated;
214
+ }
215
+
204
216
  // startTime is used to determine if a message is history or new, better to be set before creating the adapter to get bandwidth
205
217
  const startTime = new Date().getTime();
206
218
  createTrackingForFirstMessage();
219
+
220
+ // FacadeChatSDK.startChat() handles:
221
+ // 1. tokenRing() - checks authentication, calls handleAuthentication() if needed
222
+ // 2. Mid-auth: If no token, sets deferInitialAuth=true for unauthenticated flow
223
+ // 3. Mid-auth: On reconnect with valid token, calls authenticateChat to upgrade conversation
207
224
  await facadeChatSDK.startChat(startChatOptionalParams);
208
225
  logStartChatComplete();
209
226
  isStartChatSuccessful = true;
@@ -290,15 +307,15 @@ const createAdapterAndSubscribe = async (facadeChatSDK, dispatch, setAdapter, st
290
307
  };
291
308
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
292
309
  const canConnectToExistingChat = async (props, facadeChatSDK, state, dispatch, setAdapter) => {
293
- var _state$appStates4, _persistedState$domai3, _persistedState$appSt;
310
+ var _state$appStates5, _persistedState$domai3, _persistedState$appSt2;
294
311
  // By pass this function in case of popout chat
295
- if ((state === null || state === void 0 || (_state$appStates4 = state.appStates) === null || _state$appStates4 === void 0 ? void 0 : _state$appStates4.hideStartChatButton) === true) {
312
+ if ((state === null || state === void 0 || (_state$appStates5 = state.appStates) === null || _state$appStates5 === void 0 ? void 0 : _state$appStates5.hideStartChatButton) === true) {
296
313
  return false;
297
314
  }
298
315
  const persistedState = getStateFromCache(getWidgetCacheIdfromProps(props));
299
316
 
300
317
  //Connect to only active chat session
301
- if (persistedState && !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.Active) {
318
+ if (persistedState && !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.Active) {
302
319
  var _persistedState$domai4;
303
320
  dispatch({
304
321
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
@@ -315,11 +332,11 @@ const canConnectToExistingChat = async (props, facadeChatSDK, state, dispatch, s
315
332
 
316
333
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
317
334
  const setCustomContextParams = async (state, props) => {
318
- var _state$domainStates8, _persistedState$domai5;
319
- if (state !== null && state !== void 0 && (_state$domainStates8 = state.domainStates) !== null && _state$domainStates8 !== void 0 && _state$domainStates8.customContext) {
320
- var _state$domainStates9;
335
+ var _state$domainStates9, _persistedState$domai5;
336
+ if (state !== null && state !== void 0 && (_state$domainStates9 = state.domainStates) !== null && _state$domainStates9 !== void 0 && _state$domainStates9.customContext) {
337
+ var _state$domainStates0;
321
338
  optionalParams = Object.assign({}, optionalParams, {
322
- customContext: JSON.parse(JSON.stringify(state === null || state === void 0 || (_state$domainStates9 = state.domainStates) === null || _state$domainStates9 === void 0 ? void 0 : _state$domainStates9.customContext))
339
+ customContext: JSON.parse(JSON.stringify(state === null || state === void 0 || (_state$domainStates0 = state.domainStates) === null || _state$domainStates0 === void 0 ? void 0 : _state$domainStates0.customContext))
323
340
  });
324
341
  return;
325
342
  }
@@ -352,9 +369,9 @@ const canStartPopoutChat = async props => {
352
369
  }
353
370
  popoutWidgetInstanceId = getWidgetCacheIdfromProps(props, true);
354
371
  if (!isNullOrEmptyString(popoutWidgetInstanceId)) {
355
- var _persistedState$domai6, _persistedState$appSt2;
372
+ var _persistedState$domai6, _persistedState$appSt3;
356
373
  const persistedState = getStateFromCache(popoutWidgetInstanceId);
357
- if (persistedState && !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.Active) {
374
+ if (persistedState && !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.Active) {
358
375
  // Initiate popout chat
359
376
  BroadcastService.postMessage({
360
377
  eventName: BroadcastEvent.InitiateStartChatInPopoutMode
@@ -367,9 +384,9 @@ const canStartPopoutChat = async props => {
367
384
 
368
385
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
369
386
  const checkIfConversationStillValid = async (facadeChatSDK, dispatch, state) => {
370
- var _state$domainStates0, _state$domainStates1;
371
- 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;
372
- const liveChatContext = state === null || state === void 0 || (_state$domainStates1 = state.domainStates) === null || _state$domainStates1 === void 0 ? void 0 : _state$domainStates1.liveChatContext;
387
+ var _state$domainStates1, _state$domainStates10;
388
+ 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;
389
+ const liveChatContext = state === null || state === void 0 || (_state$domainStates10 = state.domainStates) === null || _state$domainStates10 === void 0 ? void 0 : _state$domainStates10.liveChatContext;
373
390
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
374
391
  let conversationDetails = undefined;
375
392
  // Preserve current requestId
@@ -1,4 +1,10 @@
1
1
  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); }
2
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
3
+ 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."); }
4
+ 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; } }
5
+ 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; }
6
+ 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; } }
7
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
2
8
  import { BroadcastEvent, ConversationStage, LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
3
9
  import { BroadcastService, BroadcastServiceInitialize, decodeComponentString } from "@microsoft/omnichannel-chat-components";
4
10
  import { Components } from "botframework-webchat";
@@ -8,7 +14,7 @@ import React, { useEffect, useRef, useState } from "react";
8
14
  import { TelemetryManager, TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
9
15
  import { chatSDKStateCleanUp, endChat, endChatStateCleanUp, prepareEndChat } from "../common/endChat";
10
16
  import { checkIfConversationStillValid, initStartChat, prepareStartChat, setPreChatAndInitiateChat } from "../common/startChat";
11
- import { createTimer, getBroadcastChannelName, getConversationDetailsCall, getLocaleDirection, getStateFromCache, getWidgetCacheIdfromProps, getWidgetEndChatEventName, isNullOrEmptyString, isNullOrUndefined, isThisSessionPopout, isUndefinedOrEmpty, setOcUserAgent } from "../../../common/utils";
17
+ import { createTimer, getBroadcastChannelName, getConversationDetailsCall, getLocaleDirection, getStateFromCache, getWidgetCacheIdfromProps, getWidgetEndChatEventName, isNullOrEmptyString, isNullOrUndefined, isThisSessionPopout, isUndefinedOrEmpty, setAriaHiddenForSiblings, setOcUserAgent } from "../../../common/utils";
12
18
  import { customEventCallback, subscribeToSendCustomEvent } from "../common/customEventHandler";
13
19
  import { defaultClientDataStoreProvider, isCookieAllowed } from "../../../common/storage/default/defaultClientDataStoreProvider";
14
20
  import { handleChatReconnect, isPersistentEnabled, isReconnectEnabled } from "../common/reconnectChatHelper";
@@ -50,6 +56,7 @@ import { initConfirmationPropsComposer } from "../common/initConfirmationPropsCo
50
56
  import { initWebChatComposer } from "../common/initWebChatComposer";
51
57
  import { registerBroadcastServiceForStorage } from "../../../common/storage/default/defaultCacheManager";
52
58
  import { setPostChatContextAndLoadSurvey } from "../common/setPostChatContextAndLoadSurvey";
59
+ import { shouldLoadPersistentChatHistory } from "../common/liveChatConfigUtils";
53
60
  import { startProactiveChat } from "../common/startProactiveChat";
54
61
  import useChatAdapterStore from "../../../hooks/useChatAdapterStore";
55
62
  import useChatContextStore from "../../../hooks/useChatContextStore";
@@ -57,7 +64,7 @@ import useFacadeSDKStore from "../../../hooks/useFacadeChatSDKStore";
57
64
  import { getPostChatContext, initiatePostChat } from "../common/renderSurveyHelpers";
58
65
  let uiTimer;
59
66
  export const LiveChatWidgetStateful = props => {
60
- var _props$webChatContain, _props$webChatContain2, _props$webChatContain3, _props$webChatContain4, _props$webChatContain5, _props$styleProps, _props$webChatContain6, _props$controlProps, _props$controlProps3, _state$appStates7, _props$webChatContain9, _state$appStates8, _props$webChatContain1, _props$webChatContain10, _props$controlProps10, _props$draggableChatW, _props$draggableChatW2, _props$draggableChatW3, _props$draggableChatW4, _props$draggableChatW5, _livechatProps$webCha, _livechatProps$styleP, _livechatProps$contro, _livechatProps$contro2, _livechatProps$compon, _livechatProps$contro3, _livechatProps$compon2, _livechatProps$contro4, _livechatProps$compon3, _livechatProps$contro5, _livechatProps$compon4, _livechatProps$contro6, _livechatProps$compon5, _livechatProps$contro7, _livechatProps$compon6, _livechatProps$contro8, _livechatProps$compon7, _livechatProps$contro9, _livechatProps$compon8, _livechatProps$contro0, _livechatProps$contro1, _livechatProps$compon9, _livechatProps$contro10, _livechatProps$compon0, _livechatProps$contro11, _livechatProps$compon1, _livechatProps$compon10, _livechatProps$compon11;
67
+ var _props$webChatContain, _props$webChatContain2, _props$webChatContain3, _props$webChatContain4, _props$webChatContain5, _props$styleProps, _props$webChatContain6, _props$controlProps, _props$controlProps3, _state$appStates7, _props$webChatContain9, _state$appStates8, _props$webChatContain1, _props$webChatContain10, _props$controlProps10, _props$draggableChatW, _props$draggableChatW2, _props$draggableChatW3, _props$draggableChatW4, _props$draggableChatW5, _livechatProps$webCha, _livechatProps$styleP, _props$headerProps, _livechatProps$contro, _livechatProps$contro2, _livechatProps$compon, _livechatProps$contro3, _livechatProps$compon2, _livechatProps$contro4, _livechatProps$compon3, _livechatProps$contro5, _livechatProps$compon4, _livechatProps$contro6, _livechatProps$compon5, _livechatProps$contro7, _livechatProps$compon6, _livechatProps$contro8, _livechatProps$compon7, _livechatProps$contro9, _livechatProps$compon8, _livechatProps$contro0, _livechatProps$contro1, _livechatProps$compon9, _livechatProps$contro10, _livechatProps$compon0, _livechatProps$contro11, _livechatProps$compon1, _livechatProps$compon10, _livechatProps$compon11;
61
68
  useEffect(() => {
62
69
  uiTimer = createTimer();
63
70
  TelemetryHelper.logLoadingEventToAllTelemetry(LogLevel.INFO, {
@@ -68,21 +75,36 @@ export const LiveChatWidgetStateful = props => {
68
75
  }
69
76
  });
70
77
  }, []);
71
- const [state, dispatch] = useChatContextStore();
78
+ const _useChatContextStore = useChatContextStore(),
79
+ _useChatContextStore2 = _slicedToArray(_useChatContextStore, 2),
80
+ state = _useChatContextStore2[0],
81
+ dispatch = _useChatContextStore2[1];
72
82
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
- const [adapter, setAdapter] = useChatAdapterStore();
74
- const [webChatStyles, setWebChatStyles] = useState({
75
- ...defaultWebChatContainerStatefulProps.webChatStyles,
76
- ...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.webChatStyles)
77
- });
83
+ const _useChatAdapterStore = useChatAdapterStore(),
84
+ _useChatAdapterStore2 = _slicedToArray(_useChatAdapterStore, 2),
85
+ adapter = _useChatAdapterStore2[0],
86
+ setAdapter = _useChatAdapterStore2[1];
87
+ const _useState = useState({
88
+ ...defaultWebChatContainerStatefulProps.webChatStyles,
89
+ ...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.webChatStyles)
90
+ }),
91
+ _useState2 = _slicedToArray(_useState, 2),
92
+ webChatStyles = _useState2[0],
93
+ setWebChatStyles = _useState2[1];
78
94
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
- const [facadeChatSDK] = useFacadeSDKStore();
95
+ const _useFacadeSDKStore = useFacadeSDKStore(),
96
+ _useFacadeSDKStore2 = _slicedToArray(_useFacadeSDKStore, 1),
97
+ facadeChatSDK = _useFacadeSDKStore2[0];
80
98
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
- const [voiceVideoCallingSDK, setVoiceVideoCallingSDK] = useState(undefined);
82
- const [conversationId, setConversationId] = useState("");
83
- const {
84
- Composer
85
- } = Components;
99
+ const _useState3 = useState(undefined),
100
+ _useState4 = _slicedToArray(_useState3, 2),
101
+ voiceVideoCallingSDK = _useState4[0],
102
+ setVoiceVideoCallingSDK = _useState4[1];
103
+ const _useState5 = useState(""),
104
+ _useState6 = _slicedToArray(_useState5, 2),
105
+ conversationId = _useState6[0],
106
+ setConversationId = _useState6[1];
107
+ const Composer = Components.Composer;
86
108
  const canStartProactiveChat = useRef(true);
87
109
  const bubbleBackground = ((_props$webChatContain2 = props.webChatContainerProps) === null || _props$webChatContain2 === void 0 || (_props$webChatContain2 = _props$webChatContain2.webChatStyles) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.bubbleBackground) ?? ((_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 || (_props$webChatContain3 = _props$webChatContain3.adaptiveCardStyles) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.background) ?? defaultAdaptiveCardStyles.background;
88
110
  const bubbleTextColor = ((_props$webChatContain4 = props.webChatContainerProps) === null || _props$webChatContain4 === void 0 || (_props$webChatContain4 = _props$webChatContain4.webChatStyles) === null || _props$webChatContain4 === void 0 ? void 0 : _props$webChatContain4.bubbleTextColor) ?? ((_props$webChatContain5 = props.webChatContainerProps) === null || _props$webChatContain5 === void 0 || (_props$webChatContain5 = _props$webChatContain5.adaptiveCardStyles) === null || _props$webChatContain5 === void 0 ? void 0 : _props$webChatContain5.color) ?? defaultAdaptiveCardStyles.color;
@@ -553,9 +575,7 @@ export const LiveChatWidgetStateful = props => {
553
575
  }
554
576
  });
555
577
  const conversationDetails = await getConversationDetailsCall(facadeChatSDK);
556
- const {
557
- chatConfig
558
- } = props;
578
+ const chatConfig = props.chatConfig;
559
579
  const isPersistent = isPersistentEnabled(chatConfig);
560
580
  TelemetryHelper.logSDKEventToAllTelemetry(LogLevel.INFO, {
561
581
  Event: TelemetryEvent.EndChatEventReceived,
@@ -728,7 +748,15 @@ export const LiveChatWidgetStateful = props => {
728
748
  if (state.appStates.isMinimized) {
729
749
  ActivityStreamHandler.cork();
730
750
  } else {
731
- setTimeout(() => ActivityStreamHandler.uncork(), 500);
751
+ var _state$domainStates4;
752
+ const extendedChatConfig = state === null || state === void 0 || (_state$domainStates4 = state.domainStates) === null || _state$domainStates4 === void 0 ? void 0 : _state$domainStates4.liveChatConfig;
753
+ if (shouldLoadPersistentChatHistory(extendedChatConfig)) {
754
+ requestAnimationFrame(() => {
755
+ setTimeout(() => ActivityStreamHandler.uncork(), 500);
756
+ });
757
+ } else {
758
+ setTimeout(() => ActivityStreamHandler.uncork(), 500);
759
+ }
732
760
  }
733
761
  }, [state.appStates.isMinimized]);
734
762
 
@@ -867,6 +895,37 @@ export const LiveChatWidgetStateful = props => {
867
895
  }
868
896
  }, [state.appStates.chatDisconnectEventReceived]);
869
897
 
898
+ // Auth state change listeners (broadcast by FacadeChatSDK.startChat())
899
+ useEffect(() => {
900
+ const authSucceededSub = BroadcastService.getMessageByEventName(BroadcastEvent.MidConversationAuthSucceeded).subscribe(msg => {
901
+ var _msg$payload13;
902
+ if (msg !== null && msg !== void 0 && (_msg$payload13 = msg.payload) !== null && _msg$payload13 !== void 0 && _msg$payload13.isAuthenticated) {
903
+ // Only store boolean flag, NOT the token - token is managed by FacadeChatSDK
904
+ dispatch({
905
+ type: LiveChatWidgetActionType.SET_USER_AUTHENTICATED,
906
+ payload: true
907
+ });
908
+ }
909
+ });
910
+
911
+ // Auth reset: only update the boolean flag here.
912
+ // We do NOT clear widget state/cache/adapter because this fires DURING startChat(),
913
+ // which will handle state transitions. FacadeChatSDK has already cleared SDK internals.
914
+ const authResetSub = BroadcastService.getMessageByEventName(BroadcastEvent.MidConversationAuthReset).subscribe(msg => {
915
+ var _msg$payload14;
916
+ if ((msg === null || msg === void 0 || (_msg$payload14 = msg.payload) === null || _msg$payload14 === void 0 ? void 0 : _msg$payload14.isAuthenticated) === false) {
917
+ dispatch({
918
+ type: LiveChatWidgetActionType.SET_USER_AUTHENTICATED,
919
+ payload: false
920
+ });
921
+ }
922
+ });
923
+ return () => {
924
+ authSucceededSub.unsubscribe();
925
+ authResetSub.unsubscribe();
926
+ };
927
+ }, [dispatch]);
928
+
870
929
  // if props state gets updates we need to update the renderingMiddlewareProps in the state
871
930
  useEffect(() => {
872
931
  var _props$webChatContain0;
@@ -885,6 +944,25 @@ export const LiveChatWidgetStateful = props => {
885
944
  }
886
945
  });
887
946
  }, []);
947
+
948
+ // Reliable browser close detection via visibilitychange + sendBeacon
949
+ // visibilitychange fires while the page is still alive (unlike beforeunload),
950
+ // so telemetry calls complete reliably. False positives (tab switch, minimize)
951
+ // are filtered in Kusto by checking if this is the last event in the session.
952
+ useEffect(() => {
953
+ const handleVisibilityChange = () => {
954
+ if (document.visibilityState === "hidden" && state.appStates.conversationState === ConversationState.Active) {
955
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
956
+ Event: TelemetryEvent.BrowserTabHidden,
957
+ Description: "Browser tab hidden during active conversation"
958
+ });
959
+ }
960
+ };
961
+ document.addEventListener("visibilitychange", handleVisibilityChange);
962
+ return () => {
963
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
964
+ };
965
+ }, [state.appStates.conversationState]);
888
966
  const initiateEndChatOnBrowserUnload = () => {
889
967
  var _DataStoreManager$cli;
890
968
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
@@ -962,6 +1040,15 @@ export const LiveChatWidgetStateful = props => {
962
1040
  }));
963
1041
  }
964
1042
  }, [state.domainStates.botAvatarInitials]);
1043
+ const isWidgetOpen = !state.appStates.isMinimized && state.appStates.conversationState !== ConversationState.Closed;
1044
+ const siblingAriaHiddenMapRef = useRef(new Map());
1045
+ useEffect(() => {
1046
+ const map = siblingAriaHiddenMapRef.current;
1047
+ setAriaHiddenForSiblings(widgetElementId, isWidgetOpen, map);
1048
+ return () => {
1049
+ setAriaHiddenForSiblings(widgetElementId, false, map);
1050
+ };
1051
+ }, [isWidgetOpen]);
965
1052
 
966
1053
  // WebChat's Composer can only be rendered if a directLine object is defined
967
1054
  return directLine && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("style", null, `
@@ -1008,10 +1095,31 @@ export const LiveChatWidgetStateful = props => {
1008
1095
  .webchat__basic-transcript__activity-markdown-body > :last-child {
1009
1096
  margin-bottom: 0px;
1010
1097
  }
1011
-
1098
+
1012
1099
  .webchat__basic-transcript__activity-markdown-body > :first-child {
1013
1100
  margin-top: 0px;
1014
1101
  }
1102
+
1103
+ /* Remove browser-default <p> margins inside system messages.
1104
+ Without this, each markdown paragraph adds ~1em top+bottom gap
1105
+ which causes the oversized line spacing visible on iOS Safari.
1106
+ Also disable iOS Safari's auto font-size scaling (-webkit-text-size-adjust)
1107
+ which inflates font sizes and causes line-height to grow over time
1108
+ when the layout is viewed in a narrow viewport. */
1109
+ .webchat__basic-transcript__activity-markdown-body {
1110
+ -webkit-text-size-adjust: 100%;
1111
+ text-size-adjust: 100%;
1112
+ }
1113
+
1114
+ .webchat__basic-transcript__activity-markdown-body p {
1115
+ margin-top: 0;
1116
+ margin-bottom: 4px;
1117
+ line-height: 1.4;
1118
+ }
1119
+
1120
+ .webchat__basic-transcript__activity-markdown-body p:last-child {
1121
+ margin-bottom: 0;
1122
+ }
1015
1123
 
1016
1124
  .webchat__basic-transcript__activity-markdown-body img.webchat__render-markdown__external-link-icon {
1017
1125
  background-image : url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIzIDMgMTggMTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcuMjUwMSA0LjUwMDE3SDEwLjc0OTVDMTEuMTYzNyA0LjUwMDE3IDExLjQ5OTUgNC44MzU5NiAxMS40OTk1IDUuMjUwMTdDMTEuNDk5NSA1LjYyOTg2IDExLjIxNzMgNS45NDM2NiAxMC44NTEzIDUuOTkzMzJMMTAuNzQ5NSA2LjAwMDE3SDcuMjQ5NzRDNi4wNzA3OSA1Ljk5OTYxIDUuMTAzNDkgNi45MDY1NiA1LjAwNzg2IDguMDYxMTJMNS4wMDAyOCA4LjIyMDAzTDUuMDAzMTIgMTYuNzUwN0M1LjAwMzQzIDE3Ljk0MTUgNS45Mjg4NSAxOC45MTYxIDcuMDk5NjYgMTguOTk0OUw3LjI1MzcxIDE5LjAwMDFMMTUuNzUxOCAxOC45ODg0QzE2Ljk0MTUgMTguOTg2OCAxNy45MTQ1IDE4LjA2MiAxNy45OTM1IDE2Ljg5MjNMMTcuOTk4NyAxNi43Mzg0VjEzLjIzMjFDMTcuOTk4NyAxMi44MTc5IDE4LjMzNDUgMTIuNDgyMSAxOC43NDg3IDEyLjQ4MjFDMTkuMTI4NCAxMi40ODIxIDE5LjQ0MjIgMTIuNzY0MyAxOS40OTE4IDEzLjEzMDNMMTkuNDk4NyAxMy4yMzIxVjE2LjczODRDMTkuNDk4NyAxOC43NDA3IDE3LjkyOTMgMjAuMzc2OSAxNS45NTI4IDIwLjQ4MjlMMTUuNzUzOCAyMC40ODg0TDcuMjU4MjcgMjAuNTAwMUw3LjA1NDk1IDIwLjQ5NDlDNS4xNDIzOSAyMC4zOTU0IDMuNjA4OTUgMTguODYyNyAzLjUwODM3IDE2Ljk1MDJMMy41MDMxMiAxNi43NTExTDMuNTAwODkgOC4yNTI3TDMuNTA1MjkgOC4wNTAyQzMuNjA1MzkgNi4xMzc0OSA1LjEzODY3IDQuNjA0NDkgNy4wNTA5NiA0LjUwNTI3TDcuMjUwMSA0LjUwMDE3SDEwLjc0OTVINy4yNTAxWk0xMy43NDgxIDMuMDAxNDZMMjAuMzAxOCAzLjAwMTk3TDIwLjQwMTQgMy4wMTU3NUwyMC41MDIyIDMuMDQzOTNMMjAuNTU5IDMuMDY4MDNDMjAuNjEyMiAzLjA5MTIyIDIwLjY2MzQgMy4xMjE2MyAyMC43MTExIDMuMTU4ODVMMjAuNzgwNCAzLjIyMTU2TDIwLjg2NDEgMy4zMjAxNEwyMC45MTgzIDMuNDEwMjVMMjAuOTU3IDMuNTAwNTdMMjAuOTc2MiAzLjU2NDc2TDIwLjk4OTggMy42Mjg2MkwyMC45OTkyIDMuNzIyODJMMjAuOTk5NyAxMC4yNTU0QzIwLjk5OTcgMTAuNjY5NiAyMC42NjM5IDExLjAwNTQgMjAuMjQ5NyAxMS4wMDU0QzE5Ljg3IDExLjAwNTQgMTkuNTU2MiAxMC43MjMyIDE5LjUwNjUgMTAuMzU3MUwxOS40OTk3IDEwLjI1NTRMMTkuNDk4OSA1LjU2MTQ3TDEyLjI3OTcgMTIuNzg0N0MxMi4wMTM0IDEzLjA1MSAxMS41OTY4IDEzLjA3NTMgMTEuMzAzMSAxMi44NTc1TDExLjIxOSAxMi43ODQ5QzEwLjk1MjcgMTIuNTE4NyAxMC45Mjg0IDEyLjEwMjEgMTEuMTQ2MiAxMS44MDg0TDExLjIxODggMTEuNzI0M0wxOC40MzY5IDQuNTAxNDZIMTMuNzQ4MUMxMy4zNjg0IDQuNTAxNDYgMTMuMDU0NiA0LjIxOTMxIDEzLjAwNSAzLjg1MzI0TDEyLjk5ODEgMy43NTE0NkMxMi45OTgxIDMuMzcxNzcgMTMuMjgwMyAzLjA1Nzk3IDEzLjY0NjQgMy4wMDgzMUwxMy43NDgxIDMuMDAxNDZaIiBmaWxsPSIjMjEyMTIxIiAvPjwvc3ZnPg==) !important;
@@ -1019,6 +1127,32 @@ export const LiveChatWidgetStateful = props => {
1019
1127
  margin-left: .25em;
1020
1128
  }
1021
1129
 
1130
+ /* ── iOS Safari: underline + number alignment fixes ────────────────
1131
+ 1. Position underlines below all glyphs (not at alphabetic baseline)
1132
+ so they never intersect numbers in links or auto-detected tel: hrefs.
1133
+ 2. Use a solid underline (skip-ink: none) so numbers aren't split by
1134
+ gaps the browser renders around descenders.
1135
+ 3. Prevent ::marker pseudo-element from inheriting text-decoration,
1136
+ which Safari applies to ol/ul counters causing them to appear
1137
+ underlined and misaligned.
1138
+ 4. Normalise ordered-list indentation across Safari/WebKit. */
1139
+ .webchat__basic-transcript__activity-markdown-body a {
1140
+ -webkit-text-underline-position: under;
1141
+ text-underline-position: under;
1142
+ text-decoration-skip-ink: none;
1143
+ -webkit-text-decoration-skip: none;
1144
+ }
1145
+
1146
+ .webchat__basic-transcript__activity-markdown-body ol li::marker,
1147
+ .webchat__basic-transcript__activity-markdown-body ul li::marker {
1148
+ text-decoration: none;
1149
+ }
1150
+
1151
+ .webchat__basic-transcript__activity-markdown-body ol {
1152
+ -webkit-padding-start: 1.5em;
1153
+ padding-inline-start: 1.5em;
1154
+ }
1155
+
1022
1156
  .webchat__link-definitions__header-text {
1023
1157
  color: ${bubbleBackground}
1024
1158
  }
@@ -1038,7 +1172,10 @@ export const LiveChatWidgetStateful = props => {
1038
1172
  }), /*#__PURE__*/React.createElement(Stack, {
1039
1173
  id: widgetElementId,
1040
1174
  styles: generalStyles,
1041
- className: (_livechatProps$styleP = livechatProps.styleProps) === null || _livechatProps$styleP === void 0 ? void 0 : _livechatProps$styleP.className
1175
+ className: (_livechatProps$styleP = livechatProps.styleProps) === null || _livechatProps$styleP === void 0 ? void 0 : _livechatProps$styleP.className,
1176
+ role: isWidgetOpen ? "dialog" : undefined,
1177
+ "aria-modal": isWidgetOpen ? true : undefined,
1178
+ "aria-label": isWidgetOpen ? ((_props$headerProps = props.headerProps) === null || _props$headerProps === void 0 || (_props$headerProps = _props$headerProps.controlProps) === null || _props$headerProps === void 0 || (_props$headerProps = _props$headerProps.headerTitleProps) === null || _props$headerProps === void 0 ? void 0 : _props$headerProps.text) ?? "Live Chat" : undefined
1042
1179
  }, !((_livechatProps$contro = livechatProps.controlProps) !== null && _livechatProps$contro !== void 0 && _livechatProps$contro.hideChatButton) && !((_livechatProps$contro2 = livechatProps.controlProps) !== null && _livechatProps$contro2 !== void 0 && _livechatProps$contro2.hideStartChatButton) && shouldShowChatButton(state) && (decodeComponentString((_livechatProps$compon = livechatProps.componentOverrides) === null || _livechatProps$compon === void 0 ? void 0 : _livechatProps$compon.chatButton) || /*#__PURE__*/React.createElement(ChatButtonStateful, {
1043
1180
  buttonProps: livechatProps.chatButtonProps,
1044
1181
  outOfOfficeButtonProps: livechatProps.outOfOfficeChatButtonProps,