@microsoft/omnichannel-chat-widget 0.1.0-main.e170704 → 0.1.0-main.e312ecd

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 (154) hide show
  1. package/README.md +32 -0
  2. package/lib/cjs/common/Constants.js +18 -2
  3. package/lib/cjs/common/storage/default/defaultCacheManager.js +34 -0
  4. package/lib/cjs/common/storage/default/defaultClientDataStoreProvider.js +114 -0
  5. package/lib/cjs/common/storage/default/defaultInMemoryDataStore.js +86 -0
  6. package/lib/cjs/common/telemetry/TelemetryConstants.js +34 -3
  7. package/lib/cjs/common/telemetry/TelemetryManager.js +7 -1
  8. package/lib/cjs/common/telemetry/loggers/ariaTelemetryLogger.js +33 -21
  9. package/lib/cjs/common/telemetry/loggers/consoleLogger.js +6 -5
  10. package/lib/cjs/common/utils.js +76 -2
  11. package/lib/cjs/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  12. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +19 -3
  13. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +0 -1
  14. package/lib/cjs/components/footerstateful/FooterStateful.js +1 -8
  15. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +11 -2
  16. package/lib/cjs/components/headerstateful/HeaderStateful.js +4 -3
  17. package/lib/cjs/components/livechatwidget/common/ActivityStreamHandler.js +44 -0
  18. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.js +23 -0
  19. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.js +1 -0
  20. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +39 -0
  21. package/lib/cjs/components/livechatwidget/common/ChatAdapterShim.js +70 -0
  22. package/lib/cjs/components/livechatwidget/common/Deferred.js +42 -0
  23. package/lib/cjs/components/livechatwidget/common/authHelper.js +65 -0
  24. package/lib/cjs/components/livechatwidget/common/createAdapter.js +13 -1
  25. package/lib/cjs/components/livechatwidget/common/createFooter.js +7 -16
  26. package/lib/cjs/components/livechatwidget/common/createInternetConnectionChangeHandler.js +12 -0
  27. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +31 -30
  28. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +29 -17
  29. package/lib/cjs/components/livechatwidget/common/endChat.js +63 -16
  30. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +24 -3
  31. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +55 -35
  32. package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +0 -4
  33. package/lib/cjs/components/livechatwidget/common/shareObservable.js +45 -0
  34. package/lib/cjs/components/livechatwidget/common/startChat.js +179 -72
  35. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +273 -91
  36. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +5 -10
  37. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +17 -1
  38. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +96 -2
  39. package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps.js +4 -1
  40. package/lib/cjs/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +11 -0
  41. package/lib/cjs/components/webchatcontainerstateful/common/mockchatsdk.js +2 -0
  42. package/lib/cjs/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.js +1 -0
  43. package/lib/cjs/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  44. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +14 -0
  45. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +16 -2
  46. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +2 -1
  47. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +52 -0
  48. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +98 -0
  49. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultReceivedMessageAnchorStyles.js +10 -0
  50. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +117 -0
  51. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +1 -0
  52. package/lib/cjs/contexts/common/ConversationState.js +3 -2
  53. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +3 -0
  54. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +13 -5
  55. package/lib/cjs/contexts/createReducer.js +17 -0
  56. package/lib/cjs/controller/componentController.js +3 -3
  57. package/lib/cjs/plugins/newMessageEventHandler.js +10 -13
  58. package/lib/esm/common/Constants.js +18 -2
  59. package/lib/esm/common/storage/default/defaultCacheManager.js +19 -0
  60. package/lib/esm/common/storage/default/defaultClientDataStoreProvider.js +102 -0
  61. package/lib/esm/common/storage/default/defaultInMemoryDataStore.js +71 -0
  62. package/lib/esm/common/telemetry/TelemetryConstants.js +34 -3
  63. package/lib/esm/common/telemetry/TelemetryManager.js +6 -1
  64. package/lib/esm/common/telemetry/loggers/ariaTelemetryLogger.js +30 -12
  65. package/lib/esm/common/telemetry/loggers/consoleLogger.js +6 -5
  66. package/lib/esm/common/utils.js +53 -0
  67. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  68. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +21 -6
  69. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +0 -1
  70. package/lib/esm/components/footerstateful/FooterStateful.js +1 -8
  71. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +9 -3
  72. package/lib/esm/components/headerstateful/HeaderStateful.js +4 -3
  73. package/lib/esm/components/livechatwidget/common/ActivityStreamHandler.js +34 -0
  74. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.js +14 -0
  75. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.js +1 -0
  76. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +29 -0
  77. package/lib/esm/components/livechatwidget/common/ChatAdapterShim.js +59 -0
  78. package/lib/esm/components/livechatwidget/common/Deferred.js +33 -0
  79. package/lib/esm/components/livechatwidget/common/authHelper.js +50 -0
  80. package/lib/esm/components/livechatwidget/common/createAdapter.js +12 -2
  81. package/lib/esm/components/livechatwidget/common/createFooter.js +4 -15
  82. package/lib/esm/components/livechatwidget/common/createInternetConnectionChangeHandler.js +8 -0
  83. package/lib/esm/components/livechatwidget/common/createMarkdown.js +31 -30
  84. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +29 -17
  85. package/lib/esm/components/livechatwidget/common/endChat.js +61 -17
  86. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +23 -5
  87. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +56 -37
  88. package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +0 -4
  89. package/lib/esm/components/livechatwidget/common/shareObservable.js +38 -0
  90. package/lib/esm/components/livechatwidget/common/startChat.js +174 -75
  91. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +265 -94
  92. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +7 -11
  93. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +17 -1
  94. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +86 -2
  95. package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps.js +3 -1
  96. package/lib/esm/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +4 -0
  97. package/lib/esm/components/webchatcontainerstateful/common/mockchatsdk.js +2 -0
  98. package/lib/esm/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.js +1 -0
  99. package/lib/esm/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  100. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +5 -0
  101. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +16 -2
  102. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +2 -1
  103. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +41 -0
  104. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +94 -0
  105. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultReceivedMessageAnchorStyles.js +3 -0
  106. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +107 -0
  107. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +1 -0
  108. package/lib/esm/contexts/common/ConversationState.js +3 -2
  109. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +3 -0
  110. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +11 -5
  111. package/lib/esm/contexts/createReducer.js +17 -0
  112. package/lib/esm/controller/componentController.js +3 -3
  113. package/lib/esm/plugins/newMessageEventHandler.js +10 -12
  114. package/lib/types/common/Constants.d.ts +9 -1
  115. package/lib/types/common/interfaces/IContextDataStore.d.ts +1 -1
  116. package/lib/types/common/storage/default/defaultCacheManager.d.ts +4 -0
  117. package/lib/types/common/storage/default/defaultClientDataStoreProvider.d.ts +2 -0
  118. package/lib/types/common/storage/default/defaultInMemoryDataStore.d.ts +6 -0
  119. package/lib/types/common/telemetry/TelemetryConstants.d.ts +27 -5
  120. package/lib/types/common/telemetry/TelemetryHelper.d.ts +1 -0
  121. package/lib/types/common/telemetry/definitions/Payload.d.ts +12 -9
  122. package/lib/types/common/utils.d.ts +7 -1
  123. package/lib/types/components/headerstateful/interfaces/IHeaderStatefulParams.d.ts +2 -1
  124. package/lib/types/components/livechatwidget/common/ActivityStreamHandler.d.ts +14 -0
  125. package/lib/types/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.d.ts +5 -0
  126. package/lib/types/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.d.ts +6 -0
  127. package/lib/types/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.d.ts +7 -0
  128. package/lib/types/components/livechatwidget/common/ChatAdapterShim.d.ts +7 -0
  129. package/lib/types/components/livechatwidget/common/Deferred.d.ts +9 -0
  130. package/lib/types/components/livechatwidget/common/authHelper.d.ts +5 -0
  131. package/lib/types/components/livechatwidget/common/endChat.d.ts +1 -1
  132. package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +5 -4
  133. package/lib/types/components/livechatwidget/common/shareObservable.d.ts +1 -0
  134. package/lib/types/components/livechatwidget/common/startChat.d.ts +4 -2
  135. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetControlProps.d.ts +1 -0
  136. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +1 -0
  137. package/lib/types/components/reconnectchatpanestateful/interfaces/IReconnectChatPaneStatefulProps.d.ts +0 -1
  138. package/lib/types/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.d.ts +2 -0
  139. package/lib/types/components/webchatcontainerstateful/common/mockchatsdk.d.ts +1 -0
  140. package/lib/types/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.d.ts +4 -0
  141. package/lib/types/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.d.ts +4 -0
  142. package/lib/types/components/webchatcontainerstateful/interfaces/IRenderingMiddlewareProps.d.ts +2 -1
  143. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +4 -0
  144. package/lib/types/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.d.ts +3 -0
  145. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.d.ts +1 -1
  146. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.d.ts +2 -0
  147. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.d.ts +1 -0
  148. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultReceivedMessageAnchorStyles.d.ts +2 -0
  149. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.d.ts +5 -0
  150. package/lib/types/contexts/common/ConversationState.d.ts +3 -2
  151. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +2 -1
  152. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +4 -1
  153. package/lib/types/contexts/common/LiveChatWidgetContextInitialState.d.ts +1 -2
  154. package/package.json +4 -3
@@ -1,12 +1,12 @@
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); }
1
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : 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
3
  import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
4
- import { BroadcastService, decodeComponentString } from "@microsoft/omnichannel-chat-components";
4
+ import { BroadcastService, decodeComponentString, BroadcastServiceInitialize } from "@microsoft/omnichannel-chat-components";
5
5
  import { Stack } from "@fluentui/react";
6
6
  import React, { useEffect, useRef, useState } from "react";
7
- import { createTimer, getLocaleDirection } from "../../../common/utils";
7
+ import { createTimer, getBroadcastChannelName, getLocaleDirection, getStateFromCache, getWidgetCacheId, getWidgetEndChatEventName, isNullOrEmptyString, isUndefinedOrEmpty } from "../../../common/utils";
8
8
  import { getReconnectIdForAuthenticatedChat, handleUnauthenticatedReconnectChat, startUnauthenticatedReconnectChat } from "../common/reconnectChatHelper";
9
- import { initStartChat, prepareStartChat } from "../common/startChat";
9
+ import { initStartChat, prepareStartChat, setPreChatAndInitiateChat } from "../common/startChat";
10
10
  import { shouldShowCallingContainer, shouldShowChatButton, shouldShowConfirmationPane, shouldShowEmailTranscriptPane, shouldShowHeader, shouldShowLoadingPane, shouldShowOutOfOfficeHoursPane, shouldShowPostChatLoadingPane, shouldShowPostChatSurveyPane, shouldShowPreChatSurveyPane, shouldShowProactiveChatPane, shouldShowReconnectChatPane, shouldShowWebChatContainer } from "../../../controller/componentController";
11
11
  import CallingContainerStateful from "../../callingcontainerstateful/CallingContainerStateful";
12
12
  import ChatButtonStateful from "../../chatbuttonstateful/ChatButtonStateful";
@@ -43,8 +43,11 @@ import { startProactiveChat } from "../common/startProactiveChat";
43
43
  import useChatAdapterStore from "../../../hooks/useChatAdapterStore";
44
44
  import useChatContextStore from "../../../hooks/useChatContextStore";
45
45
  import useChatSDKStore from "../../../hooks/useChatSDKStore";
46
+ import { ActivityStreamHandler } from "../common/ActivityStreamHandler";
47
+ import { registerBroadcastServiceForLocalStorage } from "../../../common/storage/default/defaultCacheManager";
48
+ import { defaultClientDataStoreProvider } from "../../../common/storage/default/defaultClientDataStoreProvider";
46
49
  export const LiveChatWidgetStateful = props => {
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;
50
+ var _props$webChatContain, _props$styleProps, _chatSDK$omnichannelC, _props$controlProps, _props$controlProps2, _props$webChatContain3, _props$webChatContain4, _props$styleProps2, _props$controlProps14, _props$controlProps15, _props$componentOverr, _props$controlProps16, _props$componentOverr2, _props$controlProps17, _props$componentOverr3, _props$controlProps18, _props$componentOverr4, _props$controlProps19, _props$componentOverr5, _props$controlProps20, _props$componentOverr6, _props$controlProps21, _props$componentOverr7, _props$controlProps22, _props$controlProps23, _props$componentOverr8, _props$controlProps24, _props$componentOverr9, _props$controlProps25, _props$componentOverr10, _props$componentOverr11, _props$componentOverr12;
48
51
 
49
52
  const [state, dispatch] = useChatContextStore(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
53
 
@@ -53,71 +56,152 @@ export const LiveChatWidgetStateful = props => {
53
56
  ...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.webChatStyles)
54
57
  }); // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
58
 
56
- const chatSDK = useChatSDKStore();
59
+ const chatSDK = useChatSDKStore(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+
57
61
  const [voiceVideoCallingSDK, setVoiceVideoCallingSDK] = useState(undefined);
58
62
  const {
59
63
  Composer
60
64
  } = Components;
61
- const canStartProactiveChat = useRef(true);
62
- const canEndChat = useRef(true); // Process general styles
65
+ const canStartProactiveChat = useRef(true); // Process general styles
63
66
 
64
67
  const generalStyles = {
65
68
  root: Object.assign({}, getGeneralStylesForButton(state), (_props$styleProps = props.styleProps) === null || _props$styleProps === void 0 ? void 0 : _props$styleProps.generalStyles)
66
69
  };
70
+ const broadcastServiceChannelName = getBroadcastChannelName(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC === void 0 ? void 0 : _chatSDK$omnichannelC.widgetId, ((_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.widgetInstanceId) ?? "");
71
+ BroadcastServiceInitialize(broadcastServiceChannelName);
67
72
  TelemetryTimers.LcwLoadToChatButtonTimer = createTimer();
68
- const widgetElementId = ((_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.id) || "oc-lcw";
73
+ const widgetElementId = ((_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.id) || "oc-lcw";
69
74
  const currentMessageCountRef = useRef(0);
75
+ let widgetStateEventName = "";
76
+
77
+ const initiateEndChatOnBrowserUnload = () => {
78
+ var _DataStoreManager$cli;
79
+
80
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
81
+ Event: TelemetryEvent.BrowserUnloadEventStarted,
82
+ Description: "Browser unload event received."
83
+ });
84
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false); // Clean local storage
85
+
86
+ (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.removeData(widgetStateEventName, "localStorage"); //Dispose calling instance
87
+
88
+ if (voiceVideoCallingSDK) {
89
+ voiceVideoCallingSDK === null || voiceVideoCallingSDK === void 0 ? void 0 : voiceVideoCallingSDK.close();
90
+ } //Message for clearing window[popouTab]
91
+
92
+
93
+ BroadcastService.postMessage({
94
+ eventName: BroadcastEvent.ClosePopoutWindow
95
+ });
96
+ };
97
+
70
98
  useEffect(() => {
71
- var _props$controlProps2, _props$controlProps3, _props$reconnectChatP, _props$controlProps4, _props$chatConfig, _props$chatConfig$Cha, _state$domainStates;
99
+ var _props$controlProps4, _props$controlProps5, _props$controlProps6, _props$controlProps8, _props$chatConfig, _props$chatConfig$Cha, _props$controlProps9, _props$reconnectChatP, _props$chatConfig2, _props$chatConfig2$Li, _props$reconnectChatP4, _state$domainStates;
100
+
101
+ // Add default localStorage support for widget
102
+ if (props.contextDataStore === undefined) {
103
+ var _chatSDK$omnichannelC2, _chatSDK$omnichannelC3, _props$controlProps3;
104
+
105
+ registerBroadcastServiceForLocalStorage(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC3 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC3 === void 0 ? void 0 : _chatSDK$omnichannelC3.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps3 = props.controlProps) === null || _props$controlProps3 === void 0 ? void 0 : _props$controlProps3.widgetInstanceId) ?? "");
106
+ DataStoreManager.clientDataStore = defaultClientDataStoreProvider();
107
+ } else {
108
+ DataStoreManager.clientDataStore = props.contextDataStore;
109
+ }
72
110
 
73
111
  registerTelemetryLoggers(props, dispatch);
74
112
  createInternetConnectionChangeHandler();
75
- DataStoreManager.clientDataStore = props.contextDataStore ?? undefined;
76
113
  dispatch({
77
114
  type: LiveChatWidgetActionType.SET_WIDGET_ELEMENT_ID,
78
115
  payload: widgetElementId
79
116
  });
80
117
  dispatch({
81
118
  type: LiveChatWidgetActionType.SET_SKIP_CHAT_BUTTON_RENDERING,
82
- payload: ((_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.skipChatButtonRendering) || false
119
+ payload: ((_props$controlProps4 = props.controlProps) === null || _props$controlProps4 === void 0 ? void 0 : _props$controlProps4.skipChatButtonRendering) || false
83
120
  });
121
+ dispatch({
122
+ type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
123
+ payload: false
124
+ });
125
+
126
+ if ((_props$controlProps5 = props.controlProps) !== null && _props$controlProps5 !== void 0 && _props$controlProps5.widgetInstanceId && !isNullOrEmptyString((_props$controlProps6 = props.controlProps) === null || _props$controlProps6 === void 0 ? void 0 : _props$controlProps6.widgetInstanceId)) {
127
+ var _props$controlProps7;
128
+
129
+ dispatch({
130
+ type: LiveChatWidgetActionType.SET_WIDGET_INSTANCE_ID,
131
+ payload: (_props$controlProps7 = props.controlProps) === null || _props$controlProps7 === void 0 ? void 0 : _props$controlProps7.widgetInstanceId
132
+ });
133
+ }
134
+
84
135
  initCallingSdk(chatSDK, setVoiceVideoCallingSDK).then(sdkCreated => {
85
136
  sdkCreated && dispatch({
86
137
  type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
87
138
  payload: true
88
139
  });
89
- });
90
-
91
- 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) {
92
- var _props$reconnectChatP2;
140
+ }); // Initialize global dir
93
141
 
94
- startUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
95
- } // Initialize global dir
96
-
97
-
98
- const globalDir = ((_props$controlProps4 = props.controlProps) === null || _props$controlProps4 === void 0 ? void 0 : _props$controlProps4.dir) ?? getLocaleDirection((_props$chatConfig = props.chatConfig) === null || _props$chatConfig === void 0 ? void 0 : (_props$chatConfig$Cha = _props$chatConfig.ChatWidgetLanguage) === null || _props$chatConfig$Cha === void 0 ? void 0 : _props$chatConfig$Cha.msdyn_localeid);
142
+ const globalDir = ((_props$controlProps8 = props.controlProps) === null || _props$controlProps8 === void 0 ? void 0 : _props$controlProps8.dir) ?? getLocaleDirection((_props$chatConfig = props.chatConfig) === null || _props$chatConfig === void 0 ? void 0 : (_props$chatConfig$Cha = _props$chatConfig.ChatWidgetLanguage) === null || _props$chatConfig$Cha === void 0 ? void 0 : _props$chatConfig$Cha.msdyn_localeid);
99
143
  dispatch({
100
144
  type: LiveChatWidgetActionType.SET_GLOBAL_DIR,
101
145
  payload: globalDir
102
146
  });
103
147
 
104
- if ((_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.liveChatContext) {
148
+ if (!((_props$controlProps9 = props.controlProps) !== null && _props$controlProps9 !== void 0 && _props$controlProps9.skipChatButtonRendering) && (_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
149
+ var _props$reconnectChatP2, _props$reconnectChatP3;
150
+
151
+ startUnauthenticatedReconnectChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.isReconnectEnabled, (_props$reconnectChatP3 = props.reconnectChatPaneProps) === null || _props$reconnectChatP3 === void 0 ? void 0 : _props$reconnectChatP3.reconnectId, initStartChat);
152
+ return;
153
+ } // Checks if reconnectId is present for auth chat. If it is present, then it shows reconnect chat pane,
154
+ // where customer can choose to continue previous conversation or start new conversation
155
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
156
+
157
+
158
+ const isAuthenticationSettingsEnabled = (_props$chatConfig2 = props.chatConfig) !== null && _props$chatConfig2 !== void 0 && (_props$chatConfig2$Li = _props$chatConfig2.LiveChatConfigAuthSettings) !== null && _props$chatConfig2$Li !== void 0 && _props$chatConfig2$Li.msdyn_javascriptclientfunction ? true : false;
159
+
160
+ if (!state.appStates.skipChatButtonRendering && state.appStates.conversationState === ConversationState.Active && isAuthenticationSettingsEnabled === true && (_props$reconnectChatP4 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP4 !== void 0 && _props$reconnectChatP4.isReconnectEnabled) {
161
+ getReconnectIdForAuthenticatedChat(props, chatSDK).then(authReconnectId => {
162
+ if (authReconnectId && !state.appStates.reconnectId) {
163
+ dispatch({
164
+ type: LiveChatWidgetActionType.SET_RECONNECT_ID,
165
+ payload: authReconnectId
166
+ });
167
+ dispatch({
168
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
169
+ payload: ConversationState.ReconnectChat
170
+ });
171
+ }
172
+ });
173
+ return;
174
+ }
175
+
176
+ if (!state.appStates.skipChatButtonRendering && !isUndefinedOrEmpty((_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.liveChatContext) && state.appStates.conversationState === ConversationState.Active) {
105
177
  var _state$domainStates2;
106
178
 
107
179
  const optionalParams = {
108
180
  liveChatContext: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.liveChatContext
109
181
  };
110
- initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
111
- }
112
- }, []);
182
+ initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams);
183
+ return;
184
+ } // All other case should show start chat button, skipChatButtonRendering will take care of it own
185
+
186
+
187
+ dispatch({
188
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
189
+ payload: ConversationState.Closed
190
+ });
191
+ }, []); // useEffect for when skip chat button rendering
192
+
113
193
  useEffect(() => {
114
194
  if (state.appStates.skipChatButtonRendering) {
115
- var _props$reconnectChatP3;
195
+ var _props$reconnectChatP5;
196
+
197
+ BroadcastService.postMessage({
198
+ eventName: BroadcastEvent.ChatInitiated
199
+ });
116
200
 
117
- if ((_props$reconnectChatP3 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP3 !== void 0 && _props$reconnectChatP3.reconnectId && !state.appStates.reconnectId) {
118
- var _props$reconnectChatP4, _props$reconnectChatP5;
201
+ if ((_props$reconnectChatP5 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP5 !== void 0 && _props$reconnectChatP5.reconnectId && !state.appStates.reconnectId) {
202
+ var _props$reconnectChatP6, _props$reconnectChatP7, _props$reconnectChatP8;
119
203
 
120
- 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);
204
+ handleUnauthenticatedReconnectChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, (_props$reconnectChatP6 = props.reconnectChatPaneProps) === null || _props$reconnectChatP6 === void 0 ? void 0 : _props$reconnectChatP6.isReconnectEnabled, (_props$reconnectChatP7 = props.reconnectChatPaneProps) === null || _props$reconnectChatP7 === void 0 ? void 0 : _props$reconnectChatP7.reconnectId, initStartChat, (_props$reconnectChatP8 = props.reconnectChatPaneProps) === null || _props$reconnectChatP8 === void 0 ? void 0 : _props$reconnectChatP8.redirectInSameWindow);
121
205
  } else {
122
206
  getReconnectIdForAuthenticatedChat(props, chatSDK).then(authReconnectId => {
123
207
  if (authReconnectId && !state.appStates.reconnectId) {
@@ -130,21 +214,32 @@ export const LiveChatWidgetStateful = props => {
130
214
  payload: ConversationState.ReconnectChat
131
215
  });
132
216
  } else {
217
+ var _state$domainStates3;
218
+
133
219
  const chatStartedSkippingChatButtonRendering = {
134
220
  eventName: BroadcastEvent.StartChatSkippingChatButtonRendering
135
221
  };
136
222
  BroadcastService.postMessage(chatStartedSkippingChatButtonRendering);
137
- dispatch({
138
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
139
- payload: ConversationState.Loading
140
- });
141
- initStartChat(chatSDK, dispatch, setAdapter);
223
+
224
+ if (!isUndefinedOrEmpty((_state$domainStates3 = state.domainStates) === null || _state$domainStates3 === void 0 ? void 0 : _state$domainStates3.liveChatContext) && state.appStates.conversationState === ConversationState.Active) {
225
+ var _state$domainStates4;
226
+
227
+ const optionalParams = {
228
+ liveChatContext: (_state$domainStates4 = state.domainStates) === null || _state$domainStates4 === void 0 ? void 0 : _state$domainStates4.liveChatContext
229
+ };
230
+ initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams);
231
+ } else {
232
+ setPreChatAndInitiateChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter);
233
+ }
142
234
  }
143
235
  });
144
236
  }
145
237
  }
146
- }, [state.appStates.skipChatButtonRendering]);
238
+ }, [state.appStates.skipChatButtonRendering]); // useEffect for when skip chat button rendering
239
+
147
240
  useEffect(() => {
241
+ var _chatSDK$omnichannelC8, _chatSDK$omnichannelC9, _props$controlProps12;
242
+
148
243
  // Add the custom context on receiving the SetCustomContext event
149
244
  BroadcastService.getMessageByEventName(BroadcastEvent.SetCustomContext).subscribe(msg => {
150
245
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
@@ -156,13 +251,13 @@ export const LiveChatWidgetStateful = props => {
156
251
  payload: msg === null || msg === void 0 ? void 0 : msg.payload
157
252
  });
158
253
  });
159
- BroadcastService.getMessageByEventName("StartProactiveChat").subscribe(msg => {
254
+ BroadcastService.getMessageByEventName(BroadcastEvent.StartProactiveChat).subscribe(msg => {
160
255
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
161
256
  Event: TelemetryEvent.StartProactiveChatEventReceived,
162
257
  Description: "Start proactive chat event received."
163
258
  });
164
259
 
165
- if (canStartProactiveChat.current) {
260
+ if (canStartProactiveChat.current === true) {
166
261
  var _msg$payload, _msg$payload2, _msg$payload3;
167
262
 
168
263
  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);
@@ -172,71 +267,127 @@ export const LiveChatWidgetStateful = props => {
172
267
  Description: "Start proactive chat method called, when chat was already triggered."
173
268
  });
174
269
  }
175
- }); // start chat from SDK Event
270
+ }); // Start chat from SDK Event
271
+
272
+ BroadcastService.getMessageByEventName(BroadcastEvent.StartChat).subscribe(() => {
273
+ var _chatSDK$omnichannelC4, _chatSDK$omnichannelC5, _props$controlProps10;
176
274
 
177
- BroadcastService.getMessageByEventName("StartChat").subscribe(() => {
178
275
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
179
276
  Event: TelemetryEvent.StartChatEventRecevied,
180
277
  Description: "Start chat event received."
181
278
  });
279
+ const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC4 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC4 === void 0 ? void 0 : _chatSDK$omnichannelC4.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC5 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC5 === void 0 ? void 0 : _chatSDK$omnichannelC5.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps10 = props.controlProps) === null || _props$controlProps10 === void 0 ? void 0 : _props$controlProps10.widgetInstanceId) ?? ""); // Chat not found in cache
280
+
281
+ if (persistedState === undefined) {
282
+ BroadcastService.postMessage({
283
+ eventName: BroadcastEvent.ChatInitiated
284
+ });
285
+ prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
286
+ return;
287
+ } // Chat exist in cache
288
+
289
+
290
+ if (persistedState) {
291
+ var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4;
292
+
293
+ // Only initiate new chat if widget state in cache in one of the followings
294
+ if (persistedState.appStates.conversationState === ConversationState.Closed || persistedState.appStates.conversationState === ConversationState.InActive || persistedState.appStates.conversationState === ConversationState.Postchat) {
295
+ BroadcastService.postMessage({
296
+ eventName: BroadcastEvent.ChatInitiated
297
+ });
298
+ prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
299
+ return;
300
+ } // If minimized, maximize the chat
301
+
182
302
 
183
- if (state.appStates.isMinimized) {
184
303
  dispatch({
185
304
  type: LiveChatWidgetActionType.SET_MINIMIZED,
186
305
  payload: false
187
306
  });
188
- } else {
189
- prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
307
+ BroadcastService.postMessage({
308
+ eventName: BroadcastEvent.MaximizeChat,
309
+ payload: {
310
+ 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,
311
+ 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
312
+ }
313
+ });
314
+ }
315
+ }); // End chat
316
+
317
+ BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChat).subscribe(async () => {
318
+ if (state.appStates.skipChatButtonRendering !== true) {
319
+ var _chatSDK$omnichannelC6, _chatSDK$omnichannelC7, _props$controlProps11;
320
+
321
+ // This is to ensure to get latest state from cache in multitab
322
+ const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC6 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC6 === void 0 ? void 0 : _chatSDK$omnichannelC6.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC7 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC7 === void 0 ? void 0 : _chatSDK$omnichannelC7.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps11 = props.controlProps) === null || _props$controlProps11 === void 0 ? void 0 : _props$controlProps11.widgetInstanceId) ?? "");
323
+
324
+ if (persistedState && persistedState.appStates.conversationState === ConversationState.Active) {
325
+ prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
326
+ } else {
327
+ const skipEndChatSDK = true;
328
+ const skipCloseChat = false;
329
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
330
+ }
190
331
  }
191
- }); // end chat from SDK Event
192
332
 
193
- BroadcastService.getMessageByEventName("EndChat").subscribe(async () => {
194
- TelemetryHelper.logActionEvent(LogLevel.INFO, {
195
- Event: TelemetryEvent.EndChatEventReceived,
196
- Description: "End chat event received."
333
+ BroadcastService.postMessage({
334
+ eventName: BroadcastEvent.CloseChat
197
335
  });
336
+ }); // End chat on browser unload
198
337
 
199
- if (canEndChat.current) {
200
- prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
201
- } else {
202
- const skipEndChatSDK = true;
203
- const skipCloseChat = false;
204
- endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
205
- }
206
- });
207
- window.addEventListener("beforeunload", () => {
208
- disposeTelemetryLoggers();
209
- });
338
+ BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChatOnBrowserUnload).subscribe(() => {
339
+ initiateEndChatOnBrowserUnload();
340
+ }); // Listen to end chat event from other tabs
341
+
342
+ const endChatEventName = getWidgetEndChatEventName(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC8 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC8 === void 0 ? void 0 : _chatSDK$omnichannelC8.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC9 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC9 === void 0 ? void 0 : _chatSDK$omnichannelC9.widgetId, ((_props$controlProps12 = props.controlProps) === null || _props$controlProps12 === void 0 ? void 0 : _props$controlProps12.widgetInstanceId) ?? "");
343
+ BroadcastService.getMessageByEventName(endChatEventName).subscribe(async () => {
344
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
345
+ return;
346
+ }); // When conversation ended by agent
210
347
 
211
348
  if (state.appStates.conversationEndedByAgent) {
212
349
  endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
213
- }
214
- }, []);
215
- useEffect(() => {
216
- canStartProactiveChat.current = state.appStates.conversationState === ConversationState.Closed;
217
- canEndChat.current = state.appStates.conversationState === ConversationState.Active;
218
-
219
- if (state.appStates.conversationState === ConversationState.Active) {
220
- chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
221
- BroadcastService.postMessage({
222
- eventName: BroadcastEvent.NewMessageNotification
223
- });
224
- });
225
- } // Track the message count
350
+ } //Listen to WidgetSize, used for minimize to maximize
226
351
 
227
352
 
353
+ BroadcastService.getMessageByEventName("WidgetSize").subscribe(msg => {
354
+ dispatch({
355
+ type: LiveChatWidgetActionType.SET_WIDGET_SIZE,
356
+ payload: msg === null || msg === void 0 ? void 0 : msg.payload
357
+ });
358
+ });
359
+ return () => {
360
+ disposeTelemetryLoggers();
361
+ };
362
+ }, []);
363
+ useEffect(() => {
364
+ // On new message
228
365
  if (state.appStates.conversationState === ConversationState.Active) {
229
366
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
367
+ // Track the message count
230
368
  currentMessageCountRef.current++;
231
369
  dispatch({
232
370
  type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
233
371
  payload: currentMessageCountRef.current + 1
372
+ }); // New message notification
373
+
374
+ BroadcastService.postMessage({
375
+ eventName: BroadcastEvent.NewMessageNotification
234
376
  });
235
377
  });
236
378
  }
237
- }, [state.appStates.conversationState]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
379
+ }, [state.appStates.conversationState]);
380
+ useEffect(() => {
381
+ canStartProactiveChat.current = state.appStates.conversationState === ConversationState.Closed && !state.appStates.proactiveChatStates.proactiveChatInNewWindow;
382
+ }, [state.appStates.conversationState, state.appStates.proactiveChatStates.proactiveChatInNewWindow]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
238
383
 
239
384
  useEffect(() => {
385
+ if (state.appStates.isMinimized) {
386
+ ActivityStreamHandler.cork();
387
+ } else {
388
+ setTimeout(() => ActivityStreamHandler.uncork(), 500);
389
+ }
390
+
240
391
  currentMessageCountRef.current = -1;
241
392
  dispatch({
242
393
  type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
@@ -251,7 +402,7 @@ export const LiveChatWidgetStateful = props => {
251
402
  }, [state.appStates.isMinimized]); // Broadcast the UnreadMessageCount state on any change.
252
403
 
253
404
  useEffect(() => {
254
- if (state.appStates.isMinimized && state.appStates.unreadMessageCount > 0) {
405
+ if (state.appStates.isMinimized === true && state.appStates.unreadMessageCount > 0) {
255
406
  const customEvent = {
256
407
  elementType: ElementType.Custom,
257
408
  eventName: BroadcastEvent.UnreadMessageCount,
@@ -266,13 +417,42 @@ export const LiveChatWidgetStateful = props => {
266
417
  setWebChatStyles({ ...webChatStyles,
267
418
  ...((_props$webChatContain2 = props.webChatContainerProps) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.webChatStyles)
268
419
  });
269
- }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]);
420
+ }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]); // Publish chat widget state
421
+
422
+ useEffect(() => {
423
+ var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic, _props$controlProps13;
424
+
425
+ // Only activate these windows events when conversation state is active and chat widget is in popout mode
426
+ // Ghost chat scenarios
427
+
428
+ /* COMMENTING THIS CODE FOR PARITY WITH OLD LCW
429
+ if (state.appStates.conversationState === ConversationState.Active &&
430
+ props.controlProps?.skipChatButtonRendering === true) {
431
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
432
+
433
+ window.onbeforeunload = function () {
434
+ const prompt = Constants.BrowserUnloadConfirmationMessage;
435
+ return prompt;
436
+ };
437
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
438
+ window.onunload = function () {
439
+ initiateEndChatOnBrowserUnload();
440
+ };
441
+ }*/
442
+ 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, (props === null || props === void 0 ? void 0 : (_props$controlProps13 = props.controlProps) === null || _props$controlProps13 === void 0 ? void 0 : _props$controlProps13.widgetInstanceId) ?? "");
443
+ const chatWidgetStateChangeEvent = {
444
+ eventName: widgetStateEventName,
445
+ payload: { ...state
446
+ }
447
+ };
448
+ BroadcastService.postMessage(chatWidgetStateChangeEvent);
449
+ }, [state]);
270
450
  const webChatProps = initWebChatComposer(props, chatSDK, state, dispatch, setWebChatStyles);
271
451
 
272
452
  const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch); // eslint-disable-next-line @typescript-eslint/no-explicit-any
273
453
 
274
454
 
275
- const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat) => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat); // eslint-disable-next-line @typescript-eslint/no-explicit-any
455
+ const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat, postMessageToOtherTab) => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat, postMessageToOtherTab); // eslint-disable-next-line @typescript-eslint/no-explicit-any
276
456
 
277
457
 
278
458
  const prepareEndChatRelay = (adapter, state) => prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
@@ -280,18 +460,9 @@ export const LiveChatWidgetStateful = props => {
280
460
  const prepareStartChatRelay = () => prepareStartChat(props, chatSDK, state, dispatch, setAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
281
461
 
282
462
 
283
- const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
284
-
285
- const confirmationPaneProps = initConfirmationPropsComposer(props); // publish chat widget state
463
+ const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams, persistedState);
286
464
 
287
- useEffect(() => {
288
- const chatWidgetStateChangeEvent = {
289
- eventName: BroadcastEvent.ChatWidgetStateChanged,
290
- payload: { ...state
291
- }
292
- };
293
- BroadcastService.postMessage(chatWidgetStateChangeEvent);
294
- }, [state]);
465
+ const confirmationPaneProps = initConfirmationPropsComposer(props);
295
466
  return /*#__PURE__*/React.createElement(Composer, _extends({}, webChatProps, {
296
467
  styleOptions: webChatStyles,
297
468
  directLine: ((_props$webChatContain4 = props.webChatContainerProps) === null || _props$webChatContain4 === void 0 ? void 0 : _props$webChatContain4.directLine) ?? adapter ?? defaultWebChatContainerStatefulProps.directLine
@@ -299,28 +470,28 @@ export const LiveChatWidgetStateful = props => {
299
470
  id: widgetElementId,
300
471
  styles: generalStyles,
301
472
  className: (_props$styleProps2 = props.styleProps) === null || _props$styleProps2 === void 0 ? void 0 : _props$styleProps2.className
302
- }, !((_props$controlProps5 = props.controlProps) !== null && _props$controlProps5 !== void 0 && _props$controlProps5.hideChatButton) && shouldShowChatButton(state) && (decodeComponentString((_props$componentOverr = props.componentOverrides) === null || _props$componentOverr === void 0 ? void 0 : _props$componentOverr.chatButton) || /*#__PURE__*/React.createElement(ChatButtonStateful, {
473
+ }, !((_props$controlProps14 = props.controlProps) !== null && _props$controlProps14 !== void 0 && _props$controlProps14.hideChatButton) && !((_props$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.skipChatButtonRendering) && shouldShowChatButton(state) && (decodeComponentString((_props$componentOverr = props.componentOverrides) === null || _props$componentOverr === void 0 ? void 0 : _props$componentOverr.chatButton) || /*#__PURE__*/React.createElement(ChatButtonStateful, {
303
474
  buttonProps: props.chatButtonProps,
304
475
  outOfOfficeButtonProps: props.outOfOfficeChatButtonProps,
305
476
  startChat: prepareStartChatRelay
306
- })), !((_props$controlProps6 = props.controlProps) !== null && _props$controlProps6 !== void 0 && _props$controlProps6.hideProactiveChatPane) && shouldShowProactiveChatPane(state) && (decodeComponentString((_props$componentOverr2 = props.componentOverrides) === null || _props$componentOverr2 === void 0 ? void 0 : _props$componentOverr2.proactiveChatPane) || /*#__PURE__*/React.createElement(ProactiveChatPaneStateful, {
477
+ })), !((_props$controlProps16 = props.controlProps) !== null && _props$controlProps16 !== void 0 && _props$controlProps16.hideProactiveChatPane) && shouldShowProactiveChatPane(state) && (decodeComponentString((_props$componentOverr2 = props.componentOverrides) === null || _props$componentOverr2 === void 0 ? void 0 : _props$componentOverr2.proactiveChatPane) || /*#__PURE__*/React.createElement(ProactiveChatPaneStateful, {
307
478
  proactiveChatProps: props.proactiveChatPaneProps,
308
479
  startChat: prepareStartChatRelay
309
- })), !((_props$controlProps7 = props.controlProps) !== null && _props$controlProps7 !== void 0 && _props$controlProps7.hideHeader) && shouldShowHeader(state) && (decodeComponentString((_props$componentOverr3 = props.componentOverrides) === null || _props$componentOverr3 === void 0 ? void 0 : _props$componentOverr3.header) || /*#__PURE__*/React.createElement(HeaderStateful, {
480
+ })), !((_props$controlProps17 = props.controlProps) !== null && _props$controlProps17 !== void 0 && _props$controlProps17.hideHeader) && shouldShowHeader(state) && (decodeComponentString((_props$componentOverr3 = props.componentOverrides) === null || _props$componentOverr3 === void 0 ? void 0 : _props$componentOverr3.header) || /*#__PURE__*/React.createElement(HeaderStateful, {
310
481
  headerProps: props.headerProps,
311
482
  outOfOfficeHeaderProps: props.outOfOfficeHeaderProps,
312
483
  endChat: endChatRelay
313
- })), !((_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, {
484
+ })), !((_props$controlProps18 = props.controlProps) !== null && _props$controlProps18 !== void 0 && _props$controlProps18.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$controlProps19 = props.controlProps) !== null && _props$controlProps19 !== void 0 && _props$controlProps19.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$controlProps20 = props.controlProps) !== null && _props$controlProps20 !== void 0 && _props$controlProps20.hideReconnectChatPane) && shouldShowReconnectChatPane(state) && (decodeComponentString((_props$componentOverr6 = props.componentOverrides) === null || _props$componentOverr6 === void 0 ? void 0 : _props$componentOverr6.reconnectChatPane) || /*#__PURE__*/React.createElement(ReconnectChatPaneStateful, {
314
485
  reconnectChatProps: props.reconnectChatPaneProps,
315
486
  initStartChat: initStartChatRelay
316
- })), !((_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, {
487
+ })), !((_props$controlProps21 = props.controlProps) !== null && _props$controlProps21 !== void 0 && _props$controlProps21.hidePreChatSurveyPane) && shouldShowPreChatSurveyPane(state) && (decodeComponentString((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.preChatSurveyPane) || /*#__PURE__*/React.createElement(PreChatSurveyPaneStateful, {
317
488
  surveyProps: props.preChatSurveyPaneProps,
318
489
  initStartChat: initStartChatRelay
319
- })), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
490
+ })), !((_props$controlProps22 = props.controlProps) !== null && _props$controlProps22 !== void 0 && _props$controlProps22.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
320
491
  voiceVideoCallingSdk: voiceVideoCallingSDK
321
- }, 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, {
492
+ }, props.callingContainerProps)), !((_props$controlProps23 = props.controlProps) !== null && _props$controlProps23 !== void 0 && _props$controlProps23.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$controlProps24 = props.controlProps) !== null && _props$controlProps24 !== void 0 && _props$controlProps24.hideConfirmationPane) && shouldShowConfirmationPane(state) && (decodeComponentString((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.confirmationPane) || /*#__PURE__*/React.createElement(ConfirmationPaneStateful, _extends({}, confirmationPaneProps, {
322
493
  setPostChatContext: setPostChatContextRelay,
323
494
  prepareEndChat: prepareEndChatRelay
324
- }))), !((_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))));
495
+ }))), !((_props$controlProps25 = props.controlProps) !== null && _props$controlProps25 !== void 0 && _props$controlProps25.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))));
325
496
  };
326
497
  export default LiveChatWidgetStateful;
@@ -1,9 +1,8 @@
1
- import { Constants, HtmlAttributeNames, Regex } from "../../common/Constants";
1
+ import { HtmlAttributeNames, Regex } from "../../common/Constants";
2
2
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
3
3
  import React, { useEffect } from "react";
4
- import { extractPreChatSurveyResponseValues, findAllFocusableElement, parseAdaptiveCardPayload } from "../../common/utils";
4
+ import { extractPreChatSurveyResponseValues, findAllFocusableElement, getStateFromCache, isUndefinedOrEmpty, parseAdaptiveCardPayload } from "../../common/utils";
5
5
  import { ConversationState } from "../../contexts/common/ConversationState";
6
- import { DataStoreManager } from "../../common/contextDataStore/DataStoreManager";
7
6
  import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
8
7
  import { PreChatSurveyPane } from "@microsoft/omnichannel-chat-components";
9
8
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
@@ -67,13 +66,12 @@ export const PreChatSurveyPaneStateful = props => {
67
66
  });
68
67
 
69
68
  try {
70
- var _DataStoreManager$cli, _persistedState$domai;
69
+ var _state$domainStates, _state$domainStates$t, _state$domainStates$t2, _persistedState$domai, _persistedState$appSt;
71
70
 
72
- const widgetStateFromCache = (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(Constants.widgetStateDataKey, "localStorage");
73
- const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
74
- let optionalParams = {};
71
+ const persistedState = getStateFromCache(((_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) ?? "", state.domainStates.widgetInstanceId ?? "");
72
+ let optionalParams = {}; //Connect to Active chats and chat is not popout
75
73
 
76
- if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai = persistedState.domainStates) !== null && _persistedState$domai !== void 0 && _persistedState$domai.liveChatContext) {
74
+ if (persistedState && !isUndefinedOrEmpty(persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai = persistedState.domainStates) === null || _persistedState$domai === void 0 ? void 0 : _persistedState$domai.liveChatContext) && (persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$appSt = persistedState.appStates) === null || _persistedState$appSt === void 0 ? void 0 : _persistedState$appSt.conversationState) === ConversationState.Active && !state.appStates.skipChatButtonRendering) {
77
75
  var _persistedState$domai2;
78
76
 
79
77
  optionalParams = {
@@ -83,9 +81,7 @@ export const PreChatSurveyPaneStateful = props => {
83
81
  } else {
84
82
  const prechatResponseValues = extractPreChatSurveyResponseValues(state.domainStates.preChatSurveyResponse, values);
85
83
  optionalParams = {
86
- initContext: {
87
- preChatResponse: prechatResponseValues
88
- }
84
+ preChatResponse: prechatResponseValues
89
85
  };
90
86
  setPreChatResponseEmail(values);
91
87
  await initStartChat(optionalParams);