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

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 (118) hide show
  1. package/lib/cjs/common/Constants.js +4 -0
  2. package/lib/cjs/common/storage/default/defaultCacheManager.js +34 -0
  3. package/lib/cjs/common/storage/default/defaultClientDataStoreProvider.js +114 -0
  4. package/lib/cjs/common/storage/default/defaultInMemoryDataStore.js +86 -0
  5. package/lib/cjs/common/telemetry/TelemetryConstants.js +12 -0
  6. package/lib/cjs/common/utils.js +64 -5
  7. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +4 -0
  8. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +0 -1
  9. package/lib/cjs/components/footerstateful/FooterStateful.js +1 -8
  10. package/lib/cjs/components/headerstateful/HeaderStateful.js +4 -3
  11. package/lib/cjs/components/livechatwidget/common/ActivityStreamHandler.js +44 -0
  12. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.js +23 -0
  13. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.js +1 -0
  14. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +39 -0
  15. package/lib/cjs/components/livechatwidget/common/ChatAdapterShim.js +70 -0
  16. package/lib/cjs/components/livechatwidget/common/Deferred.js +42 -0
  17. package/lib/cjs/components/livechatwidget/common/authHelper.js +65 -0
  18. package/lib/cjs/components/livechatwidget/common/createAdapter.js +13 -1
  19. package/lib/cjs/components/livechatwidget/common/createFooter.js +7 -16
  20. package/lib/cjs/components/livechatwidget/common/createInternetConnectionChangeHandler.js +12 -0
  21. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +31 -30
  22. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +23 -5
  23. package/lib/cjs/components/livechatwidget/common/endChat.js +52 -20
  24. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +12 -0
  25. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +55 -35
  26. package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +0 -4
  27. package/lib/cjs/components/livechatwidget/common/shareObservable.js +45 -0
  28. package/lib/cjs/components/livechatwidget/common/startChat.js +153 -85
  29. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +188 -116
  30. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +4 -8
  31. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +1 -1
  32. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +16 -2
  33. package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps.js +4 -1
  34. package/lib/cjs/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +11 -0
  35. package/lib/cjs/components/webchatcontainerstateful/common/mockchatsdk.js +2 -0
  36. package/lib/cjs/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.js +1 -0
  37. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +2 -1
  38. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultReceivedMessageAnchorStyles.js +10 -0
  39. package/lib/cjs/contexts/common/ConversationState.js +3 -2
  40. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +1 -0
  41. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +12 -5
  42. package/lib/cjs/contexts/createReducer.js +8 -0
  43. package/lib/cjs/controller/componentController.js +2 -2
  44. package/lib/esm/common/Constants.js +4 -0
  45. package/lib/esm/common/storage/default/defaultCacheManager.js +19 -0
  46. package/lib/esm/common/storage/default/defaultClientDataStoreProvider.js +102 -0
  47. package/lib/esm/common/storage/default/defaultInMemoryDataStore.js +71 -0
  48. package/lib/esm/common/telemetry/TelemetryConstants.js +12 -0
  49. package/lib/esm/common/utils.js +48 -3
  50. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +4 -0
  51. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +0 -1
  52. package/lib/esm/components/footerstateful/FooterStateful.js +1 -8
  53. package/lib/esm/components/headerstateful/HeaderStateful.js +4 -3
  54. package/lib/esm/components/livechatwidget/common/ActivityStreamHandler.js +34 -0
  55. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.js +14 -0
  56. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.js +1 -0
  57. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +29 -0
  58. package/lib/esm/components/livechatwidget/common/ChatAdapterShim.js +59 -0
  59. package/lib/esm/components/livechatwidget/common/Deferred.js +33 -0
  60. package/lib/esm/components/livechatwidget/common/authHelper.js +50 -0
  61. package/lib/esm/components/livechatwidget/common/createAdapter.js +12 -2
  62. package/lib/esm/components/livechatwidget/common/createFooter.js +4 -15
  63. package/lib/esm/components/livechatwidget/common/createInternetConnectionChangeHandler.js +8 -0
  64. package/lib/esm/components/livechatwidget/common/createMarkdown.js +31 -30
  65. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +23 -5
  66. package/lib/esm/components/livechatwidget/common/endChat.js +53 -21
  67. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +13 -2
  68. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +56 -37
  69. package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +0 -4
  70. package/lib/esm/components/livechatwidget/common/shareObservable.js +38 -0
  71. package/lib/esm/components/livechatwidget/common/startChat.js +148 -86
  72. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +188 -117
  73. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +5 -8
  74. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +1 -1
  75. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +14 -2
  76. package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps.js +3 -1
  77. package/lib/esm/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +4 -0
  78. package/lib/esm/components/webchatcontainerstateful/common/mockchatsdk.js +2 -0
  79. package/lib/esm/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.js +1 -0
  80. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +2 -1
  81. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultReceivedMessageAnchorStyles.js +3 -0
  82. package/lib/esm/contexts/common/ConversationState.js +3 -2
  83. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +1 -0
  84. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +10 -5
  85. package/lib/esm/contexts/createReducer.js +8 -0
  86. package/lib/esm/controller/componentController.js +2 -2
  87. package/lib/types/common/Constants.d.ts +2 -0
  88. package/lib/types/common/storage/default/defaultCacheManager.d.ts +4 -0
  89. package/lib/types/common/storage/default/defaultClientDataStoreProvider.d.ts +2 -0
  90. package/lib/types/common/storage/default/defaultInMemoryDataStore.d.ts +6 -0
  91. package/lib/types/common/telemetry/TelemetryConstants.d.ts +11 -2
  92. package/lib/types/common/utils.d.ts +7 -3
  93. package/lib/types/components/headerstateful/interfaces/IHeaderStatefulParams.d.ts +2 -1
  94. package/lib/types/components/livechatwidget/common/ActivityStreamHandler.d.ts +14 -0
  95. package/lib/types/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.d.ts +5 -0
  96. package/lib/types/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.d.ts +6 -0
  97. package/lib/types/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.d.ts +7 -0
  98. package/lib/types/components/livechatwidget/common/ChatAdapterShim.d.ts +7 -0
  99. package/lib/types/components/livechatwidget/common/Deferred.d.ts +9 -0
  100. package/lib/types/components/livechatwidget/common/authHelper.d.ts +5 -0
  101. package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +5 -4
  102. package/lib/types/components/livechatwidget/common/shareObservable.d.ts +1 -0
  103. package/lib/types/components/livechatwidget/common/startChat.d.ts +4 -2
  104. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetControlProps.d.ts +1 -0
  105. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +1 -0
  106. package/lib/types/components/reconnectchatpanestateful/interfaces/IReconnectChatPaneStatefulProps.d.ts +0 -1
  107. package/lib/types/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.d.ts +2 -0
  108. package/lib/types/components/webchatcontainerstateful/common/mockchatsdk.d.ts +1 -0
  109. package/lib/types/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.d.ts +4 -0
  110. package/lib/types/components/webchatcontainerstateful/interfaces/IRenderingMiddlewareProps.d.ts +2 -1
  111. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +2 -0
  112. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.d.ts +1 -1
  113. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultReceivedMessageAnchorStyles.d.ts +2 -0
  114. package/lib/types/contexts/common/ConversationState.d.ts +3 -2
  115. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -1
  116. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +2 -1
  117. package/lib/types/contexts/common/LiveChatWidgetContextInitialState.d.ts +1 -2
  118. 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, getWidgetCacheId, getWidgetEndChatEventName } 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
 
@@ -59,105 +62,146 @@ export const LiveChatWidgetStateful = props => {
59
62
  const {
60
63
  Composer
61
64
  } = Components;
62
- const canStartProactiveChat = useRef(true);
63
- const canEndChat = useRef(true); // Process general styles
65
+ const canStartProactiveChat = useRef(true); // Process general styles
64
66
 
65
67
  const generalStyles = {
66
68
  root: Object.assign({}, getGeneralStylesForButton(state), (_props$styleProps = props.styleProps) === null || _props$styleProps === void 0 ? void 0 : _props$styleProps.generalStyles)
67
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);
68
72
  TelemetryTimers.LcwLoadToChatButtonTimer = createTimer();
69
- 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";
70
74
  const currentMessageCountRef = useRef(0);
71
75
  let widgetStateEventName = "";
72
76
 
73
77
  const initiateEndChatOnBrowserUnload = () => {
74
78
  var _DataStoreManager$cli;
75
79
 
76
- const persistedState = getStateFromCache(); // End chat if the chat is still active and browser closed
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
77
85
 
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
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]
82
91
 
83
92
 
84
- (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.removeData(widgetStateEventName, "localStorage");
85
93
  BroadcastService.postMessage({
86
- eventName: BroadcastEvent.ChatEnded
94
+ eventName: BroadcastEvent.ClosePopoutWindow
87
95
  });
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
96
  };
100
97
 
101
98
  useEffect(() => {
102
- 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
+ }
103
110
 
104
111
  registerTelemetryLoggers(props, dispatch);
105
112
  createInternetConnectionChangeHandler();
106
- DataStoreManager.clientDataStore = props.contextDataStore ?? undefined;
107
113
  dispatch({
108
114
  type: LiveChatWidgetActionType.SET_WIDGET_ELEMENT_ID,
109
115
  payload: widgetElementId
110
116
  });
111
117
  dispatch({
112
118
  type: LiveChatWidgetActionType.SET_SKIP_CHAT_BUTTON_RENDERING,
113
- 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
114
120
  });
115
121
  dispatch({
116
122
  type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
117
123
  payload: false
118
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
+
119
135
  initCallingSdk(chatSDK, setVoiceVideoCallingSDK).then(sdkCreated => {
120
136
  sdkCreated && dispatch({
121
137
  type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
122
138
  payload: true
123
139
  });
124
- });
125
-
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) {
127
- var _props$reconnectChatP2;
128
-
129
- startUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
130
- } // Initialize global dir
131
-
140
+ }); // Initialize global dir
132
141
 
133
- 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);
134
143
  dispatch({
135
144
  type: LiveChatWidgetActionType.SET_GLOBAL_DIR,
136
145
  payload: globalDir
137
146
  });
138
147
 
139
- 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) {
140
177
  var _state$domainStates2;
141
178
 
142
179
  const optionalParams = {
143
180
  liveChatContext: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.liveChatContext
144
181
  };
145
- initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
146
- }
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
+ });
147
191
  }, []); // useEffect for when skip chat button rendering
148
192
 
149
193
  useEffect(() => {
150
194
  if (state.appStates.skipChatButtonRendering) {
151
- var _props$reconnectChatP3;
195
+ var _props$reconnectChatP5;
152
196
 
153
197
  BroadcastService.postMessage({
154
198
  eventName: BroadcastEvent.ChatInitiated
155
199
  });
156
200
 
157
- if ((_props$reconnectChatP3 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP3 !== void 0 && _props$reconnectChatP3.reconnectId && !state.appStates.reconnectId) {
158
- 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;
159
203
 
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);
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);
161
205
  } else {
162
206
  getReconnectIdForAuthenticatedChat(props, chatSDK).then(authReconnectId => {
163
207
  if (authReconnectId && !state.appStates.reconnectId) {
@@ -170,15 +214,23 @@ export const LiveChatWidgetStateful = props => {
170
214
  payload: ConversationState.ReconnectChat
171
215
  });
172
216
  } else {
217
+ var _state$domainStates3;
218
+
173
219
  const chatStartedSkippingChatButtonRendering = {
174
220
  eventName: BroadcastEvent.StartChatSkippingChatButtonRendering
175
221
  };
176
222
  BroadcastService.postMessage(chatStartedSkippingChatButtonRendering);
177
- dispatch({
178
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
179
- payload: ConversationState.Loading
180
- });
181
- 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
+ }
182
234
  }
183
235
  });
184
236
  }
@@ -186,7 +238,7 @@ export const LiveChatWidgetStateful = props => {
186
238
  }, [state.appStates.skipChatButtonRendering]); // useEffect for when skip chat button rendering
187
239
 
188
240
  useEffect(() => {
189
- var _chatSDK$omnichannelC3, _chatSDK$omnichannelC4;
241
+ var _chatSDK$omnichannelC8, _chatSDK$omnichannelC9, _props$controlProps12;
190
242
 
191
243
  // Add the custom context on receiving the SetCustomContext event
192
244
  BroadcastService.getMessageByEventName(BroadcastEvent.SetCustomContext).subscribe(msg => {
@@ -205,7 +257,7 @@ export const LiveChatWidgetStateful = props => {
205
257
  Description: "Start proactive chat event received."
206
258
  });
207
259
 
208
- if (canStartProactiveChat.current) {
260
+ if (canStartProactiveChat.current === true) {
209
261
  var _msg$payload, _msg$payload2, _msg$payload3;
210
262
 
211
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);
@@ -218,28 +270,36 @@ export const LiveChatWidgetStateful = props => {
218
270
  }); // Start chat from SDK Event
219
271
 
220
272
  BroadcastService.getMessageByEventName(BroadcastEvent.StartChat).subscribe(() => {
273
+ var _chatSDK$omnichannelC4, _chatSDK$omnichannelC5, _props$controlProps10;
274
+
221
275
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
222
276
  Event: TelemetryEvent.StartChatEventRecevied,
223
277
  Description: "Start chat event received."
224
278
  });
225
- const persistedState = getStateFromCache();
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
226
280
 
227
- if (persistedState && (persistedState.appStates.conversationState === ConversationState.Closed || persistedState.appStates.conversationState === ConversationState.InActive || persistedState.appStates.conversationState === ConversationState.Postchat)) {
228
- // Embedded mode
281
+ if (persistedState === undefined) {
229
282
  BroadcastService.postMessage({
230
283
  eventName: BroadcastEvent.ChatInitiated
231
284
  });
232
285
  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 {
286
+ return;
287
+ } // Chat exist in cache
288
+
289
+
290
+ if (persistedState) {
240
291
  var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4;
241
292
 
242
- // Minimize to Maximize
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
+
302
+
243
303
  dispatch({
244
304
  type: LiveChatWidgetActionType.SET_MINIMIZED,
245
305
  payload: false
@@ -255,49 +315,39 @@ export const LiveChatWidgetStateful = props => {
255
315
  }); // End chat
256
316
 
257
317
  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);
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
+ }
264
331
  }
265
332
 
266
333
  BroadcastService.postMessage({
267
334
  eventName: BroadcastEvent.CloseChat
268
335
  });
269
- });
336
+ }); // End chat on browser unload
337
+
270
338
  BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChatOnBrowserUnload).subscribe(() => {
271
339
  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
340
  }); // Listen to end chat event from other tabs
284
341
 
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);
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) ?? "");
286
343
  BroadcastService.getMessageByEventName(endChatEventName).subscribe(async () => {
287
344
  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
- });
295
- disposeTelemetryLoggers();
296
- });
345
+ return;
346
+ }); // When conversation ended by agent
297
347
 
298
348
  if (state.appStates.conversationEndedByAgent) {
299
349
  endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
300
- } //Listen to WidgetSize
350
+ } //Listen to WidgetSize, used for minimize to maximize
301
351
 
302
352
 
303
353
  BroadcastService.getMessageByEventName("WidgetSize").subscribe(msg => {
@@ -306,25 +356,23 @@ export const LiveChatWidgetStateful = props => {
306
356
  payload: msg === null || msg === void 0 ? void 0 : msg.payload
307
357
  });
308
358
  });
359
+ return () => {
360
+ disposeTelemetryLoggers();
361
+ };
309
362
  }, []);
310
363
  useEffect(() => {
311
- canEndChat.current = state.appStates.conversationState === ConversationState.Active;
312
-
313
- if (state.appStates.conversationState === ConversationState.Active) {
314
- chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
315
- BroadcastService.postMessage({
316
- eventName: BroadcastEvent.NewMessageNotification
317
- });
318
- });
319
- } // Track the message count
320
-
321
-
364
+ // On new message
322
365
  if (state.appStates.conversationState === ConversationState.Active) {
323
366
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
367
+ // Track the message count
324
368
  currentMessageCountRef.current++;
325
369
  dispatch({
326
370
  type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
327
371
  payload: currentMessageCountRef.current + 1
372
+ }); // New message notification
373
+
374
+ BroadcastService.postMessage({
375
+ eventName: BroadcastEvent.NewMessageNotification
328
376
  });
329
377
  });
330
378
  }
@@ -334,6 +382,12 @@ export const LiveChatWidgetStateful = props => {
334
382
  }, [state.appStates.conversationState, state.appStates.proactiveChatStates.proactiveChatInNewWindow]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
335
383
 
336
384
  useEffect(() => {
385
+ if (state.appStates.isMinimized) {
386
+ ActivityStreamHandler.cork();
387
+ } else {
388
+ setTimeout(() => ActivityStreamHandler.uncork(), 500);
389
+ }
390
+
337
391
  currentMessageCountRef.current = -1;
338
392
  dispatch({
339
393
  type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
@@ -348,7 +402,7 @@ export const LiveChatWidgetStateful = props => {
348
402
  }, [state.appStates.isMinimized]); // Broadcast the UnreadMessageCount state on any change.
349
403
 
350
404
  useEffect(() => {
351
- if (state.appStates.isMinimized && state.appStates.unreadMessageCount > 0) {
405
+ if (state.appStates.isMinimized === true && state.appStates.unreadMessageCount > 0) {
352
406
  const customEvent = {
353
407
  elementType: ElementType.Custom,
354
408
  eventName: BroadcastEvent.UnreadMessageCount,
@@ -366,9 +420,26 @@ export const LiveChatWidgetStateful = props => {
366
420
  }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]); // Publish chat widget state
367
421
 
368
422
  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);
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) ?? "");
372
443
  const chatWidgetStateChangeEvent = {
373
444
  eventName: widgetStateEventName,
374
445
  payload: { ...state
@@ -381,7 +452,7 @@ export const LiveChatWidgetStateful = props => {
381
452
  const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch); // eslint-disable-next-line @typescript-eslint/no-explicit-any
382
453
 
383
454
 
384
- 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
385
456
 
386
457
 
387
458
  const prepareEndChatRelay = (adapter, state) => prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
@@ -389,7 +460,7 @@ export const LiveChatWidgetStateful = props => {
389
460
  const prepareStartChatRelay = () => prepareStartChat(props, chatSDK, state, dispatch, setAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
390
461
 
391
462
 
392
- const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
463
+ const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams, persistedState);
393
464
 
394
465
  const confirmationPaneProps = initConfirmationPropsComposer(props);
395
466
  return /*#__PURE__*/React.createElement(Composer, _extends({}, webChatProps, {
@@ -399,28 +470,28 @@ export const LiveChatWidgetStateful = props => {
399
470
  id: widgetElementId,
400
471
  styles: generalStyles,
401
472
  className: (_props$styleProps2 = props.styleProps) === null || _props$styleProps2 === void 0 ? void 0 : _props$styleProps2.className
402
- }, !((_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, {
403
474
  buttonProps: props.chatButtonProps,
404
475
  outOfOfficeButtonProps: props.outOfOfficeChatButtonProps,
405
476
  startChat: prepareStartChatRelay
406
- })), !((_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, {
407
478
  proactiveChatProps: props.proactiveChatPaneProps,
408
479
  startChat: prepareStartChatRelay
409
- })), !((_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, {
410
481
  headerProps: props.headerProps,
411
482
  outOfOfficeHeaderProps: props.outOfOfficeHeaderProps,
412
483
  endChat: endChatRelay
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, {
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, {
414
485
  reconnectChatProps: props.reconnectChatPaneProps,
415
486
  initStartChat: initStartChatRelay
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, {
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, {
417
488
  surveyProps: props.preChatSurveyPaneProps,
418
489
  initStartChat: initStartChatRelay
419
- })), !((_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({
420
491
  voiceVideoCallingSdk: voiceVideoCallingSDK
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, {
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, {
422
493
  setPostChatContext: setPostChatContextRelay,
423
494
  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))));
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))));
425
496
  };
426
497
  export default LiveChatWidgetStateful;
@@ -1,9 +1,8 @@
1
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, getWidgetCacheId, 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,14 +66,12 @@ export const PreChatSurveyPaneStateful = props => {
67
66
  });
68
67
 
69
68
  try {
70
- var _state$domainStates, _state$domainStates$t, _state$domainStates$t2, _DataStoreManager$cli, _persistedState$domai;
69
+ var _state$domainStates, _state$domainStates$t, _state$domainStates$t2, _persistedState$domai, _persistedState$appSt;
71
70
 
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 = {};
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
76
73
 
77
- 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) {
78
75
  var _persistedState$domai2;
79
76
 
80
77
  optionalParams = {
@@ -103,7 +103,7 @@ export const ProactiveChatPaneStateful = props => {
103
103
  });
104
104
  },
105
105
  ...(proactiveChatProps === null || proactiveChatProps === void 0 ? void 0 : proactiveChatProps.controlProps),
106
- bodyTitleText: state.appStates.proactiveChatStates.proactiveChatBodyTitle ?? (proactiveChatProps === null || proactiveChatProps === void 0 ? void 0 : (_proactiveChatProps$c = proactiveChatProps.controlProps) === null || _proactiveChatProps$c === void 0 ? void 0 : _proactiveChatProps$c.bodyTitleText)
106
+ bodyTitleText: state.appStates.proactiveChatStates.proactiveChatBodyTitle ? state.appStates.proactiveChatStates.proactiveChatBodyTitle : proactiveChatProps === null || proactiveChatProps === void 0 ? void 0 : (_proactiveChatProps$c = proactiveChatProps.controlProps) === null || _proactiveChatProps$c === void 0 ? void 0 : _proactiveChatProps$c.bodyTitleText
107
107
  };
108
108
  useEffect(() => {
109
109
  setFocusOnElement(document.getElementById(controlProps.id + "-startbutton"));