@microsoft/omnichannel-chat-widget 0.1.0-main.89c6531 → 0.1.0-main.9e62ed8

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 (174) hide show
  1. package/README.md +259 -0
  2. package/lib/cjs/assets/Audios.js +8 -0
  3. package/lib/cjs/assets/Icons.js +28 -0
  4. package/lib/cjs/common/Constants.js +50 -4
  5. package/lib/cjs/common/contextDataStore/DataStoreManager.js +14 -0
  6. package/lib/cjs/{assets/assets.d.js → common/interfaces/IContextDataStore.js} +0 -0
  7. package/lib/cjs/common/telemetry/TelemetryConstants.js +55 -5
  8. package/lib/cjs/common/telemetry/TelemetryHelper.js +13 -0
  9. package/lib/cjs/common/telemetry/TelemetryManager.js +17 -6
  10. package/lib/cjs/common/telemetry/defaultConfigs/defaultAriaConfig.js +1 -1
  11. package/lib/cjs/common/telemetry/defaultConfigs/defaultTelemetryConfiguration.js +4 -1
  12. package/lib/cjs/common/telemetry/loggers/ariaTelemetryLogger.js +33 -13
  13. package/lib/cjs/common/telemetry/loggers/consoleLogger.js +6 -5
  14. package/lib/cjs/common/utils.js +30 -2
  15. package/lib/cjs/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  16. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +16 -4
  17. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +8 -54
  18. package/lib/cjs/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +2 -2
  19. package/lib/cjs/components/footerstateful/FooterStateful.js +4 -5
  20. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +11 -2
  21. package/lib/cjs/components/headerstateful/HeaderStateful.js +11 -8
  22. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +3 -4
  23. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +23 -22
  24. package/lib/cjs/components/livechatwidget/common/endChat.js +116 -49
  25. package/lib/cjs/components/livechatwidget/common/initCallingSdk.js +5 -0
  26. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +40 -11
  27. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +105 -20
  28. package/lib/cjs/components/livechatwidget/common/registerTelemetryLoggers.js +11 -5
  29. package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +26 -24
  30. package/lib/cjs/components/livechatwidget/common/startChat.js +151 -53
  31. package/lib/cjs/components/livechatwidget/common/startProactiveChat.js +3 -3
  32. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +228 -44
  33. package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +1 -1
  34. package/lib/cjs/components/ooohpanestateful/OOOHPaneStateful.js +8 -0
  35. package/lib/cjs/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +8 -0
  36. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +26 -10
  37. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +26 -4
  38. package/lib/cjs/components/proactivechatpanestateful/interfaces/IProactiveChatNotificationConfig.js +1 -0
  39. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +80 -0
  40. package/lib/cjs/components/webchatcontainerstateful/common/mockchatsdk.js +4 -0
  41. package/lib/cjs/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.js +51 -73
  42. package/lib/cjs/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  43. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +14 -0
  44. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +25 -48
  45. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +3 -1
  46. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +52 -0
  47. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +98 -0
  48. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +117 -0
  49. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -6
  50. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +45 -0
  51. package/lib/cjs/contexts/common/ConversationState.js +3 -2
  52. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +12 -7
  53. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +11 -3
  54. package/lib/cjs/contexts/createReducer.js +36 -10
  55. package/lib/cjs/controller/componentController.js +3 -3
  56. package/lib/cjs/plugins/newMessageEventHandler.js +99 -0
  57. package/lib/esm/assets/Audios.js +1 -0
  58. package/lib/esm/assets/Icons.js +11 -0
  59. package/lib/esm/common/Constants.js +46 -3
  60. package/lib/esm/common/contextDataStore/DataStoreManager.js +5 -0
  61. package/lib/esm/common/interfaces/IContextDataStore.js +1 -0
  62. package/lib/esm/common/telemetry/TelemetryConstants.js +51 -4
  63. package/lib/esm/common/telemetry/TelemetryHelper.js +13 -1
  64. package/lib/esm/common/telemetry/TelemetryManager.js +15 -6
  65. package/lib/esm/common/telemetry/defaultConfigs/defaultAriaConfig.js +1 -1
  66. package/lib/esm/common/telemetry/defaultConfigs/defaultTelemetryConfiguration.js +4 -1
  67. package/lib/esm/common/telemetry/loggers/ariaTelemetryLogger.js +36 -14
  68. package/lib/esm/common/telemetry/loggers/consoleLogger.js +6 -5
  69. package/lib/esm/common/utils.js +19 -1
  70. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  71. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +18 -7
  72. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +8 -50
  73. package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +2 -2
  74. package/lib/esm/components/footerstateful/FooterStateful.js +4 -5
  75. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +9 -3
  76. package/lib/esm/components/headerstateful/HeaderStateful.js +12 -9
  77. package/lib/esm/components/livechatwidget/common/createMarkdown.js +3 -3
  78. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +21 -23
  79. package/lib/esm/components/livechatwidget/common/endChat.js +111 -46
  80. package/lib/esm/components/livechatwidget/common/initCallingSdk.js +3 -0
  81. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +34 -11
  82. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +94 -20
  83. package/lib/esm/components/livechatwidget/common/registerTelemetryLoggers.js +10 -4
  84. package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +23 -22
  85. package/lib/esm/components/livechatwidget/common/startChat.js +146 -52
  86. package/lib/esm/components/livechatwidget/common/startProactiveChat.js +5 -5
  87. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +212 -45
  88. package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +1 -1
  89. package/lib/esm/components/ooohpanestateful/OOOHPaneStateful.js +6 -0
  90. package/lib/esm/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +6 -0
  91. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +25 -10
  92. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +25 -5
  93. package/lib/esm/components/proactivechatpanestateful/interfaces/IProactiveChatNotificationConfig.js +1 -0
  94. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +72 -0
  95. package/lib/esm/components/webchatcontainerstateful/common/mockchatsdk.js +4 -0
  96. package/lib/esm/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.js +2 -12
  97. package/lib/esm/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  98. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +5 -0
  99. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +23 -46
  100. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +2 -1
  101. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +41 -0
  102. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +94 -0
  103. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +107 -0
  104. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -6
  105. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +32 -0
  106. package/lib/esm/contexts/common/ConversationState.js +3 -2
  107. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +12 -7
  108. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +11 -3
  109. package/lib/esm/contexts/createReducer.js +36 -9
  110. package/lib/esm/controller/componentController.js +3 -3
  111. package/lib/esm/plugins/newMessageEventHandler.js +82 -0
  112. package/lib/types/assets/Audios.d.ts +1 -0
  113. package/lib/types/assets/Icons.d.ts +11 -0
  114. package/lib/types/common/Constants.d.ts +25 -1
  115. package/lib/types/common/contextDataStore/DataStoreManager.d.ts +4 -0
  116. package/lib/types/common/interfaces/IContextDataStore.d.ts +14 -0
  117. package/lib/types/common/telemetry/TelemetryConstants.d.ts +39 -2
  118. package/lib/types/common/telemetry/TelemetryHelper.d.ts +2 -0
  119. package/lib/types/common/telemetry/definitions/Payload.d.ts +12 -9
  120. package/lib/types/common/telemetry/interfaces/ITelemetryConfig.d.ts +3 -3
  121. package/lib/types/common/utils.d.ts +3 -0
  122. package/lib/types/components/confirmationpanestateful/interfaces/IConfirmationPaneStatefulParams.d.ts +5 -2
  123. package/lib/types/components/footerstateful/audionotificationstateful/interfaces/IAudioNotificationStatefulParams.d.ts +0 -1
  124. package/lib/types/components/headerstateful/interfaces/IHeaderStatefulParams.d.ts +4 -1
  125. package/lib/types/components/livechatwidget/common/endChat.d.ts +4 -1
  126. package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +5 -2
  127. package/lib/types/components/livechatwidget/common/setPostChatContextAndLoadSurvey.d.ts +1 -1
  128. package/lib/types/components/livechatwidget/common/startChat.d.ts +1 -1
  129. package/lib/types/components/livechatwidget/common/startProactiveChat.d.ts +2 -1
  130. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetComponentOverrides.d.ts +1 -0
  131. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +2 -0
  132. package/lib/types/components/prechatsurveypanestateful/interfaces/IPreChatSurveyPaneStatefulParams.d.ts +1 -1
  133. package/lib/types/components/proactivechatpanestateful/interfaces/IProactiveChatNotificationConfig.d.ts +3 -0
  134. package/lib/types/components/reconnectchatpanestateful/interfaces/IReconnectChatPaneStatefulProps.d.ts +1 -0
  135. package/lib/types/components/webchatcontainerstateful/common/mockchatsdk.d.ts +1 -0
  136. package/lib/types/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.d.ts +1 -1
  137. package/lib/types/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.d.ts +4 -0
  138. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +2 -0
  139. package/lib/types/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.d.ts +3 -0
  140. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.d.ts +0 -1
  141. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.d.ts +2 -0
  142. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.d.ts +1 -0
  143. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.d.ts +5 -0
  144. package/lib/types/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.d.ts +1 -0
  145. package/lib/types/contexts/common/ConversationState.d.ts +3 -2
  146. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +4 -0
  147. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +13 -8
  148. package/lib/types/plugins/newMessageEventHandler.d.ts +2 -0
  149. package/package.json +11 -11
  150. package/lib/cjs/assets/audios/newMessageNotification.mp3 +0 -0
  151. package/lib/cjs/assets/icons/archiveIcon.svg +0 -3
  152. package/lib/cjs/assets/icons/audioIcon.svg +0 -6
  153. package/lib/cjs/assets/icons/blankIcon.svg +0 -6
  154. package/lib/cjs/assets/icons/excelIcon.svg +0 -6
  155. package/lib/cjs/assets/icons/imageIcon.svg +0 -6
  156. package/lib/cjs/assets/icons/oneNoteIcon.svg +0 -6
  157. package/lib/cjs/assets/icons/pdfIcon.svg +0 -6
  158. package/lib/cjs/assets/icons/powerpointIcon.svg +0 -6
  159. package/lib/cjs/assets/icons/videoIcon.svg +0 -6
  160. package/lib/cjs/assets/icons/visioIcon.svg +0 -6
  161. package/lib/cjs/assets/icons/wordIcon.svg +0 -6
  162. package/lib/esm/assets/assets.d.js +0 -0
  163. package/lib/esm/assets/audios/newMessageNotification.mp3 +0 -0
  164. package/lib/esm/assets/icons/archiveIcon.svg +0 -3
  165. package/lib/esm/assets/icons/audioIcon.svg +0 -6
  166. package/lib/esm/assets/icons/blankIcon.svg +0 -6
  167. package/lib/esm/assets/icons/excelIcon.svg +0 -6
  168. package/lib/esm/assets/icons/imageIcon.svg +0 -6
  169. package/lib/esm/assets/icons/oneNoteIcon.svg +0 -6
  170. package/lib/esm/assets/icons/pdfIcon.svg +0 -6
  171. package/lib/esm/assets/icons/powerpointIcon.svg +0 -6
  172. package/lib/esm/assets/icons/videoIcon.svg +0 -6
  173. package/lib/esm/assets/icons/visioIcon.svg +0 -6
  174. package/lib/esm/assets/icons/wordIcon.svg +0 -6
@@ -1,10 +1,11 @@
1
1
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
2
 
3
+ import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
3
4
  import { BroadcastService, decodeComponentString } from "@microsoft/omnichannel-chat-components";
4
5
  import { Stack } from "@fluentui/react";
5
6
  import React, { useEffect, useRef, useState } from "react";
6
- import { createTimer, getLocaleDirection } from "../../../common/utils";
7
- import { getReconnectIdForAuthenticatedChat, handleUnauthenticatedReconnectChat } from "../common/reconnectChatHelper";
7
+ import { createTimer, getLocaleDirection, getWidgetCacheId, getWidgetEndChatEventName } from "../../../common/utils";
8
+ import { getReconnectIdForAuthenticatedChat, handleUnauthenticatedReconnectChat, startUnauthenticatedReconnectChat } from "../common/reconnectChatHelper";
8
9
  import { initStartChat, prepareStartChat } from "../common/startChat";
9
10
  import { shouldShowCallingContainer, shouldShowChatButton, shouldShowConfirmationPane, shouldShowEmailTranscriptPane, shouldShowHeader, shouldShowLoadingPane, shouldShowOutOfOfficeHoursPane, shouldShowPostChatLoadingPane, shouldShowPostChatSurveyPane, shouldShowPreChatSurveyPane, shouldShowProactiveChatPane, shouldShowReconnectChatPane, shouldShowWebChatContainer } from "../../../controller/componentController";
10
11
  import CallingContainerStateful from "../../callingcontainerstateful/CallingContainerStateful";
@@ -12,6 +13,7 @@ import ChatButtonStateful from "../../chatbuttonstateful/ChatButtonStateful";
12
13
  import { Components } from "botframework-webchat";
13
14
  import ConfirmationPaneStateful from "../../confirmationpanestateful/ConfirmationPaneStateful";
14
15
  import { ConversationState } from "../../../contexts/common/ConversationState";
16
+ import { DataStoreManager } from "../../../common/contextDataStore/DataStoreManager";
15
17
  import { ElementType } from "@microsoft/omnichannel-chat-components";
16
18
  import EmailTranscriptPaneStateful from "../../emailtranscriptpanestateful/EmailTranscriptPaneStateful";
17
19
  import HeaderStateful from "../../headerstateful/HeaderStateful";
@@ -23,12 +25,14 @@ import PostChatSurveyPaneStateful from "../../postchatsurveypanestateful/PostCha
23
25
  import PreChatSurveyPaneStateful from "../../prechatsurveypanestateful/PreChatSurveyPaneStateful";
24
26
  import ProactiveChatPaneStateful from "../../proactivechatpanestateful/ProactiveChatPaneStateful";
25
27
  import ReconnectChatPaneStateful from "../../reconnectchatpanestateful/ReconnectChatPaneStateful";
28
+ import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
26
29
  import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
27
30
  import WebChatContainerStateful from "../../webchatcontainerstateful/WebChatContainerStateful";
28
31
  import { createFooter } from "../common/createFooter";
29
32
  import { createInternetConnectionChangeHandler } from "../common/createInternetConnectionChangeHandler";
30
33
  import { defaultWebChatContainerStatefulProps } from "../../webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps";
31
- import { endChat } from "../common/endChat";
34
+ import { disposeTelemetryLoggers } from "../common/disposeTelemetryLoggers";
35
+ import { endChat, prepareEndChat } from "../common/endChat";
32
36
  import { getGeneralStylesForButton } from "../common/getGeneralStylesForButton";
33
37
  import { initCallingSdk } from "../common/initCallingSdk";
34
38
  import { initConfirmationPropsComposer } from "../common/initConfirmationPropsComposer";
@@ -39,10 +43,8 @@ import { startProactiveChat } from "../common/startProactiveChat";
39
43
  import useChatAdapterStore from "../../../hooks/useChatAdapterStore";
40
44
  import useChatContextStore from "../../../hooks/useChatContextStore";
41
45
  import useChatSDKStore from "../../../hooks/useChatSDKStore";
42
- import { TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
43
- import { disposeTelemetryLoggers } from "../common/disposeTelemetryLoggers";
44
46
  export const LiveChatWidgetStateful = props => {
45
- var _props$webChatContain, _props$styleProps, _props$controlProps, _props$webChatContain3, _props$webChatContain4, _props$styleProps2, _props$controlProps5, _props$componentOverr, _props$controlProps6, _props$componentOverr2, _props$controlProps7, _props$componentOverr3, _props$controlProps8, _props$componentOverr4, _props$controlProps9, _props$componentOverr5, _props$controlProps10, _props$componentOverr6, _props$controlProps11, _props$controlProps12, _props$controlProps13, _props$componentOverr7, _props$controlProps14, _props$componentOverr8, _props$controlProps15, _props$componentOverr9, _props$componentOverr10, _props$componentOverr11;
47
+ var _props$webChatContain, _props$styleProps, _props$controlProps, _props$webChatContain3, _props$webChatContain4, _props$styleProps2, _props$controlProps5, _props$componentOverr, _props$controlProps6, _props$componentOverr2, _props$controlProps7, _props$componentOverr3, _props$controlProps8, _props$componentOverr4, _props$controlProps9, _props$componentOverr5, _props$controlProps10, _props$componentOverr6, _props$controlProps11, _props$componentOverr7, _props$controlProps12, _props$controlProps13, _props$componentOverr8, _props$controlProps14, _props$componentOverr9, _props$controlProps15, _props$componentOverr10, _props$componentOverr11, _props$componentOverr12;
46
48
 
47
49
  const [state, dispatch] = useChatContextStore(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
50
 
@@ -51,12 +53,14 @@ export const LiveChatWidgetStateful = props => {
51
53
  ...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.webChatStyles)
52
54
  }); // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
55
 
54
- const chatSDK = useChatSDKStore();
56
+ const chatSDK = useChatSDKStore(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+
55
58
  const [voiceVideoCallingSDK, setVoiceVideoCallingSDK] = useState(undefined);
56
59
  const {
57
60
  Composer
58
61
  } = Components;
59
- const canStartProactiveChat = useRef(true); // Process general styles
62
+ const canStartProactiveChat = useRef(true);
63
+ const canEndChat = useRef(true); // Process general styles
60
64
 
61
65
  const generalStyles = {
62
66
  root: Object.assign({}, getGeneralStylesForButton(state), (_props$styleProps = props.styleProps) === null || _props$styleProps === void 0 ? void 0 : _props$styleProps.generalStyles)
@@ -64,11 +68,42 @@ export const LiveChatWidgetStateful = props => {
64
68
  TelemetryTimers.LcwLoadToChatButtonTimer = createTimer();
65
69
  const widgetElementId = ((_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.id) || "oc-lcw";
66
70
  const currentMessageCountRef = useRef(0);
71
+ let widgetStateEventName = "";
72
+
73
+ const initiateEndChatOnBrowserUnload = () => {
74
+ var _DataStoreManager$cli;
75
+
76
+ const persistedState = getStateFromCache(); // End chat if the chat is still active and browser closed
77
+
78
+ if (persistedState.appStates.conversationState === ConversationState.Active) {
79
+ //Browser close scenario/no room for PCS/so just end chat and notify agent immidiately
80
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
81
+ } // Clean local storage
82
+
83
+
84
+ (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.removeData(widgetStateEventName, "localStorage");
85
+ BroadcastService.postMessage({
86
+ eventName: BroadcastEvent.ChatEnded
87
+ });
88
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
+
90
+
91
+ const getStateFromCache = () => {
92
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _DataStoreManager$cli2;
93
+
94
+ // Getting updated state from cache
95
+ const widgetStateEventName = getWidgetCacheId((chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC === void 0 ? void 0 : _chatSDK$omnichannelC.orgId) ?? "", (chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.widgetId) ?? "");
96
+ const widgetStateFromCache = (_DataStoreManager$cli2 = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli2 === void 0 ? void 0 : _DataStoreManager$cli2.getData(widgetStateEventName, "localStorage");
97
+ const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
98
+ return persistedState;
99
+ };
100
+
67
101
  useEffect(() => {
68
102
  var _props$controlProps2, _props$controlProps3, _props$reconnectChatP, _props$controlProps4, _props$chatConfig, _props$chatConfig$Cha, _state$domainStates;
69
103
 
70
104
  registerTelemetryLoggers(props, dispatch);
71
105
  createInternetConnectionChangeHandler();
106
+ DataStoreManager.clientDataStore = props.contextDataStore ?? undefined;
72
107
  dispatch({
73
108
  type: LiveChatWidgetActionType.SET_WIDGET_ELEMENT_ID,
74
109
  payload: widgetElementId
@@ -77,6 +112,10 @@ export const LiveChatWidgetStateful = props => {
77
112
  type: LiveChatWidgetActionType.SET_SKIP_CHAT_BUTTON_RENDERING,
78
113
  payload: ((_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.skipChatButtonRendering) || false
79
114
  });
115
+ dispatch({
116
+ type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
117
+ payload: false
118
+ });
80
119
  initCallingSdk(chatSDK, setVoiceVideoCallingSDK).then(sdkCreated => {
81
120
  sdkCreated && dispatch({
82
121
  type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
@@ -87,7 +126,7 @@ export const LiveChatWidgetStateful = props => {
87
126
  if (!((_props$controlProps3 = props.controlProps) !== null && _props$controlProps3 !== void 0 && _props$controlProps3.skipChatButtonRendering) && (_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
88
127
  var _props$reconnectChatP2;
89
128
 
90
- handleUnauthenticatedReconnectChat(dispatch, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
129
+ startUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
91
130
  } // Initialize global dir
92
131
 
93
132
 
@@ -97,25 +136,28 @@ export const LiveChatWidgetStateful = props => {
97
136
  payload: globalDir
98
137
  });
99
138
 
100
- if ((_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.chatToken) {
139
+ if ((_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.liveChatContext) {
101
140
  var _state$domainStates2;
102
141
 
103
142
  const optionalParams = {
104
- liveChatContext: {
105
- chatToken: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.chatToken
106
- }
143
+ liveChatContext: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.liveChatContext
107
144
  };
108
145
  initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
109
146
  }
110
- }, []);
147
+ }, []); // useEffect for when skip chat button rendering
148
+
111
149
  useEffect(() => {
112
150
  if (state.appStates.skipChatButtonRendering) {
113
151
  var _props$reconnectChatP3;
114
152
 
153
+ BroadcastService.postMessage({
154
+ eventName: BroadcastEvent.ChatInitiated
155
+ });
156
+
115
157
  if ((_props$reconnectChatP3 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP3 !== void 0 && _props$reconnectChatP3.reconnectId && !state.appStates.reconnectId) {
116
- var _props$reconnectChatP4;
158
+ var _props$reconnectChatP4, _props$reconnectChatP5;
117
159
 
118
- handleUnauthenticatedReconnectChat(dispatch, (_props$reconnectChatP4 = props.reconnectChatPaneProps) === null || _props$reconnectChatP4 === void 0 ? void 0 : _props$reconnectChatP4.reconnectId, initStartChat);
160
+ handleUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, (_props$reconnectChatP4 = props.reconnectChatPaneProps) === null || _props$reconnectChatP4 === void 0 ? void 0 : _props$reconnectChatP4.reconnectId, initStartChat, (_props$reconnectChatP5 = props.reconnectChatPaneProps) === null || _props$reconnectChatP5 === void 0 ? void 0 : _props$reconnectChatP5.redirectInSameWindow);
119
161
  } else {
120
162
  getReconnectIdForAuthenticatedChat(props, chatSDK).then(authReconnectId => {
121
163
  if (authReconnectId && !state.appStates.reconnectId) {
@@ -128,6 +170,10 @@ export const LiveChatWidgetStateful = props => {
128
170
  payload: ConversationState.ReconnectChat
129
171
  });
130
172
  } else {
173
+ const chatStartedSkippingChatButtonRendering = {
174
+ eventName: BroadcastEvent.StartChatSkippingChatButtonRendering
175
+ };
176
+ BroadcastService.postMessage(chatStartedSkippingChatButtonRendering);
131
177
  dispatch({
132
178
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
133
179
  payload: ConversationState.Loading
@@ -137,34 +183,143 @@ export const LiveChatWidgetStateful = props => {
137
183
  });
138
184
  }
139
185
  }
140
- }, [state.appStates.skipChatButtonRendering]);
186
+ }, [state.appStates.skipChatButtonRendering]); // useEffect for when skip chat button rendering
187
+
141
188
  useEffect(() => {
142
- BroadcastService.getMessageByEventName("StartProactiveChat").subscribe(msg => {
189
+ var _chatSDK$omnichannelC3, _chatSDK$omnichannelC4;
190
+
191
+ // Add the custom context on receiving the SetCustomContext event
192
+ BroadcastService.getMessageByEventName(BroadcastEvent.SetCustomContext).subscribe(msg => {
193
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
194
+ Event: TelemetryEvent.CustomContextReceived,
195
+ Description: "CustomContext received."
196
+ });
197
+ dispatch({
198
+ type: LiveChatWidgetActionType.SET_CUSTOM_CONTEXT,
199
+ payload: msg === null || msg === void 0 ? void 0 : msg.payload
200
+ });
201
+ });
202
+ BroadcastService.getMessageByEventName(BroadcastEvent.StartProactiveChat).subscribe(msg => {
203
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
204
+ Event: TelemetryEvent.StartProactiveChatEventReceived,
205
+ Description: "Start proactive chat event received."
206
+ });
207
+
143
208
  if (canStartProactiveChat.current) {
144
209
  var _msg$payload, _msg$payload2, _msg$payload3;
145
210
 
146
- startProactiveChat(dispatch, msg === null || msg === void 0 ? void 0 : (_msg$payload = msg.payload) === null || _msg$payload === void 0 ? void 0 : _msg$payload.bodyTitle, msg === null || msg === void 0 ? void 0 : (_msg$payload2 = msg.payload) === null || _msg$payload2 === void 0 ? void 0 : _msg$payload2.showPrechat, msg === null || msg === void 0 ? void 0 : (_msg$payload3 = msg.payload) === null || _msg$payload3 === void 0 ? void 0 : _msg$payload3.inNewWindow);
211
+ startProactiveChat(dispatch, msg === null || msg === void 0 ? void 0 : (_msg$payload = msg.payload) === null || _msg$payload === void 0 ? void 0 : _msg$payload.notificationConfig, msg === null || msg === void 0 ? void 0 : (_msg$payload2 = msg.payload) === null || _msg$payload2 === void 0 ? void 0 : _msg$payload2.enablePreChat, msg === null || msg === void 0 ? void 0 : (_msg$payload3 = msg.payload) === null || _msg$payload3 === void 0 ? void 0 : _msg$payload3.inNewWindow);
212
+ } else {
213
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
214
+ Event: TelemetryEvent.ChatAlreadyTriggered,
215
+ Description: "Start proactive chat method called, when chat was already triggered."
216
+ });
217
+ }
218
+ }); // Start chat from SDK Event
219
+
220
+ BroadcastService.getMessageByEventName(BroadcastEvent.StartChat).subscribe(() => {
221
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
222
+ Event: TelemetryEvent.StartChatEventRecevied,
223
+ Description: "Start chat event received."
224
+ });
225
+ const persistedState = getStateFromCache();
226
+
227
+ if (persistedState && (persistedState.appStates.conversationState === ConversationState.Closed || persistedState.appStates.conversationState === ConversationState.InActive || persistedState.appStates.conversationState === ConversationState.Postchat)) {
228
+ // Embedded mode
229
+ BroadcastService.postMessage({
230
+ eventName: BroadcastEvent.ChatInitiated
231
+ });
232
+ prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
233
+ } else if (!persistedState) {
234
+ // Popout chat
235
+ BroadcastService.postMessage({
236
+ eventName: BroadcastEvent.ChatInitiated
237
+ });
238
+ prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
239
+ } else {
240
+ var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4;
241
+
242
+ // Minimize to Maximize
243
+ dispatch({
244
+ type: LiveChatWidgetActionType.SET_MINIMIZED,
245
+ payload: false
246
+ });
247
+ BroadcastService.postMessage({
248
+ eventName: BroadcastEvent.MaximizeChat,
249
+ payload: {
250
+ height: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai = persistedState.domainStates) === null || _persistedState$domai === void 0 ? void 0 : (_persistedState$domai2 = _persistedState$domai.widgetSize) === null || _persistedState$domai2 === void 0 ? void 0 : _persistedState$domai2.height,
251
+ width: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai3 = persistedState.domainStates) === null || _persistedState$domai3 === void 0 ? void 0 : (_persistedState$domai4 = _persistedState$domai3.widgetSize) === null || _persistedState$domai4 === void 0 ? void 0 : _persistedState$domai4.width
252
+ }
253
+ });
254
+ }
255
+ }); // End chat
256
+
257
+ BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChat).subscribe(async () => {
258
+ if (canEndChat.current) {
259
+ prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
260
+ } else {
261
+ const skipEndChatSDK = true;
262
+ const skipCloseChat = false;
263
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
147
264
  }
265
+
266
+ BroadcastService.postMessage({
267
+ eventName: BroadcastEvent.CloseChat
268
+ });
148
269
  });
149
- window.addEventListener("beforeunload", event => {
270
+ BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChatOnBrowserUnload).subscribe(() => {
271
+ initiateEndChatOnBrowserUnload();
272
+ }); // reset proactive chat params
273
+
274
+ BroadcastService.getMessageByEventName(BroadcastEvent.ResetProactiveChatParams).subscribe(async () => {
275
+ dispatch({
276
+ type: LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
277
+ payload: {
278
+ proactiveChatBodyTitle: "",
279
+ proactiveChatEnablePrechat: false,
280
+ proactiveChatInNewWindow: false
281
+ }
282
+ });
283
+ }); // Listen to end chat event from other tabs
284
+
285
+ const endChatEventName = getWidgetEndChatEventName(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC3 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC3 === void 0 ? void 0 : _chatSDK$omnichannelC3.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC4 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC4 === void 0 ? void 0 : _chatSDK$omnichannelC4.widgetId);
286
+ BroadcastService.getMessageByEventName(endChatEventName).subscribe(async () => {
287
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
288
+ }); // Close popout window
289
+
290
+ window.addEventListener("beforeunload", () => {
291
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
292
+ Event: TelemetryEvent.WindowClosed,
293
+ Description: "Closed window."
294
+ });
150
295
  disposeTelemetryLoggers();
151
296
  });
297
+
298
+ if (state.appStates.conversationEndedByAgent) {
299
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
300
+ } //Listen to WidgetSize
301
+
302
+
303
+ BroadcastService.getMessageByEventName("WidgetSize").subscribe(msg => {
304
+ dispatch({
305
+ type: LiveChatWidgetActionType.SET_WIDGET_SIZE,
306
+ payload: msg === null || msg === void 0 ? void 0 : msg.payload
307
+ });
308
+ });
152
309
  }, []);
153
310
  useEffect(() => {
154
- if (state.appStates.conversationState !== ConversationState.Closed) {
155
- canStartProactiveChat.current = false;
156
- }
311
+ canEndChat.current = state.appStates.conversationState === ConversationState.Active;
157
312
 
158
313
  if (state.appStates.conversationState === ConversationState.Active) {
159
314
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
160
315
  BroadcastService.postMessage({
161
- eventName: "NewMessageNotification"
316
+ eventName: BroadcastEvent.NewMessageNotification
162
317
  });
163
318
  });
164
319
  } // Track the message count
165
320
 
166
321
 
167
- if (state.appStates.conversationState == ConversationState.Active) {
322
+ if (state.appStates.conversationState === ConversationState.Active) {
168
323
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
169
324
  currentMessageCountRef.current++;
170
325
  dispatch({
@@ -173,7 +328,10 @@ export const LiveChatWidgetStateful = props => {
173
328
  });
174
329
  });
175
330
  }
176
- }, [state.appStates.conversationState]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
331
+ }, [state.appStates.conversationState]);
332
+ useEffect(() => {
333
+ canStartProactiveChat.current = state.appStates.conversationState === ConversationState.Closed && !state.appStates.proactiveChatStates.proactiveChatInNewWindow;
334
+ }, [state.appStates.conversationState, state.appStates.proactiveChatStates.proactiveChatInNewWindow]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
177
335
 
178
336
  useEffect(() => {
179
337
  currentMessageCountRef.current = -1;
@@ -183,7 +341,7 @@ export const LiveChatWidgetStateful = props => {
183
341
  });
184
342
  const customEvent = {
185
343
  elementType: ElementType.Custom,
186
- eventName: "UnreadMessageCount",
344
+ eventName: BroadcastEvent.UnreadMessageCount,
187
345
  payload: 0
188
346
  };
189
347
  BroadcastService.postMessage(customEvent);
@@ -193,7 +351,7 @@ export const LiveChatWidgetStateful = props => {
193
351
  if (state.appStates.isMinimized && state.appStates.unreadMessageCount > 0) {
194
352
  const customEvent = {
195
353
  elementType: ElementType.Custom,
196
- eventName: "UnreadMessageCount",
354
+ eventName: BroadcastEvent.UnreadMessageCount,
197
355
  payload: `${state.appStates.unreadMessageCount}`
198
356
  };
199
357
  BroadcastService.postMessage(customEvent);
@@ -205,26 +363,35 @@ export const LiveChatWidgetStateful = props => {
205
363
  setWebChatStyles({ ...webChatStyles,
206
364
  ...((_props$webChatContain2 = props.webChatContainerProps) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.webChatStyles)
207
365
  });
208
- }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]);
366
+ }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]); // Publish chat widget state
367
+
368
+ useEffect(() => {
369
+ var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic;
370
+
371
+ widgetStateEventName = getWidgetCacheId(props === null || props === void 0 ? void 0 : (_props$chatSDK = props.chatSDK) === null || _props$chatSDK === void 0 ? void 0 : (_props$chatSDK$omnich = _props$chatSDK.omnichannelConfig) === null || _props$chatSDK$omnich === void 0 ? void 0 : _props$chatSDK$omnich.orgId, props === null || props === void 0 ? void 0 : (_props$chatSDK2 = props.chatSDK) === null || _props$chatSDK2 === void 0 ? void 0 : (_props$chatSDK2$omnic = _props$chatSDK2.omnichannelConfig) === null || _props$chatSDK2$omnic === void 0 ? void 0 : _props$chatSDK2$omnic.widgetId);
372
+ const chatWidgetStateChangeEvent = {
373
+ eventName: widgetStateEventName,
374
+ payload: { ...state
375
+ }
376
+ };
377
+ BroadcastService.postMessage(chatWidgetStateChangeEvent);
378
+ }, [state]);
209
379
  const webChatProps = initWebChatComposer(props, chatSDK, state, dispatch, setWebChatStyles);
210
380
 
211
- const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch, true);
381
+ const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch); // eslint-disable-next-line @typescript-eslint/no-explicit-any
212
382
 
213
- const endChatRelay = () => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
214
383
 
215
- const prepareStartChatRelay = () => prepareStartChat(props, chatSDK, state, dispatch, setAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
384
+ const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat) => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat); // eslint-disable-next-line @typescript-eslint/no-explicit-any
216
385
 
217
386
 
218
- const initStartChatRelay = optionalParams => initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
387
+ const prepareEndChatRelay = (adapter, state) => prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
219
388
 
220
- const confirmationPaneProps = initConfirmationPropsComposer(props); // publish chat widget state
389
+ const prepareStartChatRelay = () => prepareStartChat(props, chatSDK, state, dispatch, setAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
221
390
 
222
- const chatWidgetStateChangeEvent = {
223
- eventName: TelemetryEvent.ChatWidgetStateChanged,
224
- payload: { ...state
225
- }
226
- };
227
- BroadcastService.postMessage(chatWidgetStateChangeEvent);
391
+
392
+ const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
393
+
394
+ const confirmationPaneProps = initConfirmationPropsComposer(props);
228
395
  return /*#__PURE__*/React.createElement(Composer, _extends({}, webChatProps, {
229
396
  styleOptions: webChatStyles,
230
397
  directLine: ((_props$webChatContain4 = props.webChatContainerProps) === null || _props$webChatContain4 === void 0 ? void 0 : _props$webChatContain4.directLine) ?? adapter ?? defaultWebChatContainerStatefulProps.directLine
@@ -246,14 +413,14 @@ export const LiveChatWidgetStateful = props => {
246
413
  })), !((_props$controlProps8 = props.controlProps) !== null && _props$controlProps8 !== void 0 && _props$controlProps8.hideLoadingPane) && shouldShowLoadingPane(state) && (decodeComponentString((_props$componentOverr4 = props.componentOverrides) === null || _props$componentOverr4 === void 0 ? void 0 : _props$componentOverr4.loadingPane) || /*#__PURE__*/React.createElement(LoadingPaneStateful, props.loadingPaneProps)), !((_props$controlProps9 = props.controlProps) !== null && _props$controlProps9 !== void 0 && _props$controlProps9.hideOutOfOfficeHoursPane) && shouldShowOutOfOfficeHoursPane(state) && (decodeComponentString((_props$componentOverr5 = props.componentOverrides) === null || _props$componentOverr5 === void 0 ? void 0 : _props$componentOverr5.outOfOfficeHoursPane) || /*#__PURE__*/React.createElement(OutOfOfficeHoursPaneStateful, props.outOfOfficeHoursPaneProps)), !((_props$controlProps10 = props.controlProps) !== null && _props$controlProps10 !== void 0 && _props$controlProps10.hideReconnectChatPane) && shouldShowReconnectChatPane(state) && (decodeComponentString((_props$componentOverr6 = props.componentOverrides) === null || _props$componentOverr6 === void 0 ? void 0 : _props$componentOverr6.reconnectChatPane) || /*#__PURE__*/React.createElement(ReconnectChatPaneStateful, {
247
414
  reconnectChatProps: props.reconnectChatPaneProps,
248
415
  initStartChat: initStartChatRelay
249
- })), !((_props$controlProps11 = props.controlProps) !== null && _props$controlProps11 !== void 0 && _props$controlProps11.hidePreChatSurveyPane) && shouldShowPreChatSurveyPane(state) && /*#__PURE__*/React.createElement(PreChatSurveyPaneStateful, {
416
+ })), !((_props$controlProps11 = props.controlProps) !== null && _props$controlProps11 !== void 0 && _props$controlProps11.hidePreChatSurveyPane) && shouldShowPreChatSurveyPane(state) && (decodeComponentString((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.preChatSurveyPane) || /*#__PURE__*/React.createElement(PreChatSurveyPaneStateful, {
250
417
  surveyProps: props.preChatSurveyPaneProps,
251
418
  initStartChat: initStartChatRelay
252
- }), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
419
+ })), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
253
420
  voiceVideoCallingSdk: voiceVideoCallingSDK
254
- }, props.callingContainerProps)), !((_props$controlProps13 = props.controlProps) !== null && _props$controlProps13 !== void 0 && _props$controlProps13.hideWebChatContainer) && shouldShowWebChatContainer(state) && (decodeComponentString((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.webChatContainer) || /*#__PURE__*/React.createElement(WebChatContainerStateful, props.webChatContainerProps)), !((_props$controlProps14 = props.controlProps) !== null && _props$controlProps14 !== void 0 && _props$controlProps14.hideConfirmationPane) && shouldShowConfirmationPane(state) && (decodeComponentString((_props$componentOverr8 = props.componentOverrides) === null || _props$componentOverr8 === void 0 ? void 0 : _props$componentOverr8.confirmationPane) || /*#__PURE__*/React.createElement(ConfirmationPaneStateful, _extends({}, confirmationPaneProps, {
421
+ }, props.callingContainerProps)), !((_props$controlProps13 = props.controlProps) !== null && _props$controlProps13 !== void 0 && _props$controlProps13.hideWebChatContainer) && shouldShowWebChatContainer(state) && (decodeComponentString((_props$componentOverr8 = props.componentOverrides) === null || _props$componentOverr8 === void 0 ? void 0 : _props$componentOverr8.webChatContainer) || /*#__PURE__*/React.createElement(WebChatContainerStateful, props.webChatContainerProps)), !((_props$controlProps14 = props.controlProps) !== null && _props$controlProps14 !== void 0 && _props$controlProps14.hideConfirmationPane) && shouldShowConfirmationPane(state) && (decodeComponentString((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.confirmationPane) || /*#__PURE__*/React.createElement(ConfirmationPaneStateful, _extends({}, confirmationPaneProps, {
255
422
  setPostChatContext: setPostChatContextRelay,
256
- endChat: endChatRelay
257
- }))), !((_props$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.hidePostChatLoadingPane) && shouldShowPostChatLoadingPane(state) && (decodeComponentString((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.postChatLoadingPane) || /*#__PURE__*/React.createElement(PostChatLoadingPaneStateful, props.postChatLoadingPaneProps)), shouldShowPostChatSurveyPane(state) && (decodeComponentString((_props$componentOverr10 = props.componentOverrides) === null || _props$componentOverr10 === void 0 ? void 0 : _props$componentOverr10.postChatSurveyPane) || /*#__PURE__*/React.createElement(PostChatSurveyPaneStateful, _extends({}, props.postChatSurveyPaneProps, props.chatSDK))), createFooter(props, state), shouldShowEmailTranscriptPane(state) && (decodeComponentString((_props$componentOverr11 = props.componentOverrides) === null || _props$componentOverr11 === void 0 ? void 0 : _props$componentOverr11.emailTranscriptPane) || /*#__PURE__*/React.createElement(EmailTranscriptPaneStateful, props.emailTranscriptPane))));
423
+ prepareEndChat: prepareEndChatRelay
424
+ }))), !((_props$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.hidePostChatLoadingPane) && shouldShowPostChatLoadingPane(state) && (decodeComponentString((_props$componentOverr10 = props.componentOverrides) === null || _props$componentOverr10 === void 0 ? void 0 : _props$componentOverr10.postChatLoadingPane) || /*#__PURE__*/React.createElement(PostChatLoadingPaneStateful, props.postChatLoadingPaneProps)), shouldShowPostChatSurveyPane(state) && (decodeComponentString((_props$componentOverr11 = props.componentOverrides) === null || _props$componentOverr11 === void 0 ? void 0 : _props$componentOverr11.postChatSurveyPane) || /*#__PURE__*/React.createElement(PostChatSurveyPaneStateful, _extends({}, props.postChatSurveyPaneProps, props.chatSDK))), createFooter(props, state), shouldShowEmailTranscriptPane(state) && (decodeComponentString((_props$componentOverr12 = props.componentOverrides) === null || _props$componentOverr12 === void 0 ? void 0 : _props$componentOverr12.emailTranscriptPane) || /*#__PURE__*/React.createElement(EmailTranscriptPaneStateful, props.emailTranscriptPane))));
258
425
  };
259
426
  export default LiveChatWidgetStateful;
@@ -26,7 +26,7 @@ export const LoadingPaneStateful = props => {
26
26
  firstElement[0].focus();
27
27
  }
28
28
 
29
- TelemetryHelper.logActionEvent(LogLevel.INFO, {
29
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
30
30
  Event: TelemetryEvent.LoadingPaneLoaded,
31
31
  Description: "Loading pane loaded."
32
32
  });
@@ -1,5 +1,7 @@
1
+ import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
1
2
  import React, { useEffect } from "react";
2
3
  import { OutOfOfficeHoursPane } from "@microsoft/omnichannel-chat-components";
4
+ import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
3
5
  import { defaultGeneralStyleProps } from "./common/defaultStyleProps/defaultgeneralOOOHPaneStyleProps";
4
6
  import { findAllFocusableElement } from "../../common/utils";
5
7
  import useChatContextStore from "../../hooks/useChatContextStore";
@@ -23,6 +25,10 @@ export const OutOfOfficeHoursPaneStateful = props => {
23
25
  if (firstElement && firstElement[0]) {
24
26
  firstElement[0].focus();
25
27
  }
28
+
29
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
30
+ Event: TelemetryEvent.OutOfOfficePaneLoaded
31
+ });
26
32
  }, []);
27
33
  return /*#__PURE__*/React.createElement(OutOfOfficeHoursPane, {
28
34
  componentOverrides: props.componentOverrides,
@@ -3,6 +3,8 @@ import { LoadingPane } from "@microsoft/omnichannel-chat-components";
3
3
  import { defaultGeneralPostChatLoadingPaneStyleProps } from "./common/defaultgeneralPostChatLoadingPaneStyleProps";
4
4
  import { findAllFocusableElement } from "../../common/utils";
5
5
  import useChatContextStore from "../../hooks/useChatContextStore";
6
+ import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
7
+ import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
6
8
  export const PostChatLoadingPaneStateful = props => {
7
9
  var _props$styleProps;
8
10
 
@@ -28,6 +30,10 @@ export const PostChatLoadingPaneStateful = props => {
28
30
  if (firstElement && firstElement[0]) {
29
31
  firstElement[0].focus();
30
32
  }
33
+
34
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
35
+ Event: TelemetryEvent.PostChatSurveyLoadingPaneLoaded
36
+ });
31
37
  }, []);
32
38
  return /*#__PURE__*/React.createElement(LoadingPane, {
33
39
  componentOverrides: props.componentOverrides,
@@ -1,10 +1,11 @@
1
+ import { HtmlAttributeNames, Regex } from "../../common/Constants";
1
2
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
3
  import React, { useEffect } from "react";
3
- import { extractPreChatSurveyResponseValues, findAllFocusableElement, parseAdaptiveCardPayload } from "../../common/utils";
4
+ import { extractPreChatSurveyResponseValues, findAllFocusableElement, getWidgetCacheId, parseAdaptiveCardPayload } from "../../common/utils";
4
5
  import { ConversationState } from "../../contexts/common/ConversationState";
6
+ import { DataStoreManager } from "../../common/contextDataStore/DataStoreManager";
5
7
  import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
6
8
  import { PreChatSurveyPane } from "@microsoft/omnichannel-chat-components";
7
- import { HtmlAttributeNames, Regex } from "../../common/Constants";
8
9
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
9
10
  import { defaultGeneralPreChatSurveyPaneStyleProps } from "./common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps";
10
11
  import { defaultPreChatSurveyLocalizedTexts } from "./common/defaultProps/defaultPreChatSurveyLocalizedTexts";
@@ -39,7 +40,7 @@ export const PreChatSurveyPaneStateful = props => {
39
40
  try {
40
41
  return parseAdaptiveCardPayload(payload, requiredFieldMissingMessage);
41
42
  } catch (ex) {
42
- TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
43
+ TelemetryHelper.logConfigDataEvent(LogLevel.ERROR, {
43
44
  Event: TelemetryEvent.ParseAdaptiveCardFailed,
44
45
  Description: "Adaptive Card JSON Parse Failed.",
45
46
  ExceptionDetails: {
@@ -66,14 +67,28 @@ export const PreChatSurveyPaneStateful = props => {
66
67
  });
67
68
 
68
69
  try {
69
- const prechatResponseValues = extractPreChatSurveyResponseValues(state.domainStates.preChatSurveyResponse, values);
70
- const optionalParams = {
71
- initContext: {
70
+ var _state$domainStates, _state$domainStates$t, _state$domainStates$t2, _DataStoreManager$cli, _persistedState$domai;
71
+
72
+ const widgetStateCacheId = getWidgetCacheId(((_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : (_state$domainStates$t = _state$domainStates.telemetryInternalData) === null || _state$domainStates$t === void 0 ? void 0 : _state$domainStates$t.orgId) ?? "", ((_state$domainStates$t2 = state.domainStates.telemetryInternalData) === null || _state$domainStates$t2 === void 0 ? void 0 : _state$domainStates$t2.widgetId) ?? "");
73
+ const widgetStateFromCache = (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(widgetStateCacheId, "localStorage");
74
+ const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
75
+ let optionalParams = {};
76
+
77
+ if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai = persistedState.domainStates) !== null && _persistedState$domai !== void 0 && _persistedState$domai.liveChatContext) {
78
+ var _persistedState$domai2;
79
+
80
+ optionalParams = {
81
+ liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai2 = persistedState.domainStates) === null || _persistedState$domai2 === void 0 ? void 0 : _persistedState$domai2.liveChatContext
82
+ };
83
+ await initStartChat(optionalParams, persistedState);
84
+ } else {
85
+ const prechatResponseValues = extractPreChatSurveyResponseValues(state.domainStates.preChatSurveyResponse, values);
86
+ optionalParams = {
72
87
  preChatResponse: prechatResponseValues
73
- }
74
- };
75
- setPreChatResponseEmail(values);
76
- await initStartChat(optionalParams);
88
+ };
89
+ setPreChatResponseEmail(values);
90
+ await initStartChat(optionalParams);
91
+ }
77
92
  } catch (ex) {
78
93
  TelemetryHelper.logActionEvent(LogLevel.ERROR, {
79
94
  Event: TelemetryEvent.PreChatSurveyStartChatMethodFailed,
@@ -1,4 +1,4 @@
1
- import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
1
+ import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
2
  import React, { useEffect, useState } from "react";
3
3
  import { createTimer, setFocusOnElement } from "../../common/utils";
4
4
  import { BroadcastService } from "@microsoft/omnichannel-chat-components";
@@ -24,11 +24,19 @@ export const ProactiveChatPaneStateful = props => {
24
24
  const handleProactiveChatInviteTimeout = () => {
25
25
  if (!timeoutRemoved) {
26
26
  setTimeoutRemoved(true);
27
+ dispatch({
28
+ type: LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
29
+ payload: {
30
+ proactiveChatBodyTitle: "",
31
+ proactiveChatEnablePrechat: false,
32
+ proactiveChatInNewWindow: false
33
+ }
34
+ });
27
35
  dispatch({
28
36
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
29
37
  payload: ConversationState.Closed
30
38
  });
31
- TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
39
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
32
40
  Event: TelemetryEvent.ProactiveChatRejected,
33
41
  ElapsedTimeInMilliseconds: TelemetryTimers.LcwLoadToChatButtonTimer.milliSecondsElapsed,
34
42
  Description: "Proactive chat invitation timed out."
@@ -51,12 +59,12 @@ export const ProactiveChatPaneStateful = props => {
51
59
  if (state.appStates.proactiveChatStates.proactiveChatInNewWindow) {
52
60
  // TODO: BroadcastService: replace with the sdk broadcast service, when in place
53
61
  const startPopoutChatEvent = {
54
- eventName: "StartPopoutChat"
62
+ eventName: BroadcastEvent.ProactiveChatStartPopoutChat
55
63
  };
56
64
  BroadcastService.postMessage(startPopoutChatEvent);
57
65
  dispatch({
58
- type: LiveChatWidgetActionType.SET_SKIP_CHAT_BUTTON_RENDERING,
59
- payload: true
66
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
67
+ payload: ConversationState.Closed
60
68
  });
61
69
  } else if (((_state$domainStates$l = state.domainStates.liveChatConfig) === null || _state$domainStates$l === void 0 ? void 0 : (_state$domainStates$l2 = _state$domainStates$l.LiveWSAndLiveChatEngJoin) === null || _state$domainStates$l2 === void 0 ? void 0 : _state$domainStates$l2.OutOfOperatingHours) === "True") {
62
70
  dispatch({
@@ -68,6 +76,10 @@ export const ProactiveChatPaneStateful = props => {
68
76
  payload: ConversationState.OutOfOffice
69
77
  });
70
78
  } else {
79
+ const proactiveChatStarted = {
80
+ eventName: BroadcastEvent.ProactiveChatStartChat
81
+ };
82
+ BroadcastService.postMessage(proactiveChatStarted);
71
83
  await startChat();
72
84
  }
73
85
  },
@@ -77,6 +89,14 @@ export const ProactiveChatPaneStateful = props => {
77
89
  Event: TelemetryEvent.ProactiveChatClosed,
78
90
  Description: "Proactive chat closed."
79
91
  });
92
+ dispatch({
93
+ type: LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
94
+ payload: {
95
+ proactiveChatBodyTitle: "",
96
+ proactiveChatEnablePrechat: false,
97
+ proactiveChatInNewWindow: false
98
+ }
99
+ });
80
100
  dispatch({
81
101
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
82
102
  payload: ConversationState.Closed