@microsoft/omnichannel-chat-widget 0.1.0-main.dbc1afa → 0.1.0-main.df02f14

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 (105) hide show
  1. package/README.md +32 -0
  2. package/lib/cjs/common/Constants.js +16 -0
  3. package/lib/cjs/common/telemetry/TelemetryConstants.js +20 -2
  4. package/lib/cjs/common/utils.js +65 -6
  5. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +19 -3
  6. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +0 -1
  7. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +10 -1
  8. package/lib/cjs/components/headerstateful/HeaderStateful.js +4 -3
  9. package/lib/cjs/components/livechatwidget/common/ActivityStreamHandler.js +44 -0
  10. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.js +23 -0
  11. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.js +1 -0
  12. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +39 -0
  13. package/lib/cjs/components/livechatwidget/common/ChatAdapterShim.js +70 -0
  14. package/lib/cjs/components/livechatwidget/common/Deferred.js +42 -0
  15. package/lib/cjs/components/livechatwidget/common/createAdapter.js +13 -1
  16. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +31 -30
  17. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +9 -3
  18. package/lib/cjs/components/livechatwidget/common/endChat.js +55 -23
  19. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +16 -3
  20. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +23 -15
  21. package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +0 -4
  22. package/lib/cjs/components/livechatwidget/common/shareObservable.js +45 -0
  23. package/lib/cjs/components/livechatwidget/common/startChat.js +169 -82
  24. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +219 -91
  25. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +4 -8
  26. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +17 -1
  27. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +80 -0
  28. package/lib/cjs/components/webchatcontainerstateful/common/mockchatsdk.js +2 -0
  29. package/lib/cjs/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  30. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +14 -0
  31. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +16 -2
  32. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +52 -0
  33. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +98 -0
  34. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +117 -0
  35. package/lib/cjs/contexts/common/ConversationState.js +3 -2
  36. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +3 -0
  37. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +3 -2
  38. package/lib/cjs/contexts/createReducer.js +16 -0
  39. package/lib/cjs/controller/componentController.js +3 -3
  40. package/lib/esm/common/Constants.js +16 -0
  41. package/lib/esm/common/telemetry/TelemetryConstants.js +20 -2
  42. package/lib/esm/common/utils.js +49 -4
  43. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +21 -6
  44. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +0 -1
  45. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +8 -2
  46. package/lib/esm/components/headerstateful/HeaderStateful.js +4 -3
  47. package/lib/esm/components/livechatwidget/common/ActivityStreamHandler.js +34 -0
  48. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.js +14 -0
  49. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.js +1 -0
  50. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +29 -0
  51. package/lib/esm/components/livechatwidget/common/ChatAdapterShim.js +59 -0
  52. package/lib/esm/components/livechatwidget/common/Deferred.js +33 -0
  53. package/lib/esm/components/livechatwidget/common/createAdapter.js +12 -2
  54. package/lib/esm/components/livechatwidget/common/createMarkdown.js +31 -30
  55. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +9 -3
  56. package/lib/esm/components/livechatwidget/common/endChat.js +56 -23
  57. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +15 -5
  58. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +23 -15
  59. package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +0 -4
  60. package/lib/esm/components/livechatwidget/common/shareObservable.js +38 -0
  61. package/lib/esm/components/livechatwidget/common/startChat.js +162 -81
  62. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +213 -94
  63. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +5 -8
  64. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +17 -1
  65. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +72 -0
  66. package/lib/esm/components/webchatcontainerstateful/common/mockchatsdk.js +2 -0
  67. package/lib/esm/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  68. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +5 -0
  69. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +16 -2
  70. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +41 -0
  71. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +94 -0
  72. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +107 -0
  73. package/lib/esm/contexts/common/ConversationState.js +3 -2
  74. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +3 -0
  75. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +3 -2
  76. package/lib/esm/contexts/createReducer.js +16 -0
  77. package/lib/esm/controller/componentController.js +3 -3
  78. package/lib/types/common/Constants.d.ts +8 -0
  79. package/lib/types/common/interfaces/IContextDataStore.d.ts +1 -1
  80. package/lib/types/common/telemetry/TelemetryConstants.d.ts +20 -3
  81. package/lib/types/common/utils.d.ts +7 -3
  82. package/lib/types/components/headerstateful/interfaces/IHeaderStatefulParams.d.ts +2 -1
  83. package/lib/types/components/livechatwidget/common/ActivityStreamHandler.d.ts +14 -0
  84. package/lib/types/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.d.ts +5 -0
  85. package/lib/types/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.d.ts +6 -0
  86. package/lib/types/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.d.ts +7 -0
  87. package/lib/types/components/livechatwidget/common/ChatAdapterShim.d.ts +7 -0
  88. package/lib/types/components/livechatwidget/common/Deferred.d.ts +9 -0
  89. package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +4 -3
  90. package/lib/types/components/livechatwidget/common/shareObservable.d.ts +1 -0
  91. package/lib/types/components/livechatwidget/common/startChat.d.ts +4 -2
  92. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetControlProps.d.ts +1 -0
  93. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +1 -0
  94. package/lib/types/components/reconnectchatpanestateful/interfaces/IReconnectChatPaneStatefulProps.d.ts +0 -1
  95. package/lib/types/components/webchatcontainerstateful/common/mockchatsdk.d.ts +1 -0
  96. package/lib/types/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.d.ts +4 -0
  97. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +2 -0
  98. package/lib/types/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.d.ts +3 -0
  99. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.d.ts +2 -0
  100. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.d.ts +1 -0
  101. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.d.ts +5 -0
  102. package/lib/types/contexts/common/ConversationState.d.ts +3 -2
  103. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +2 -1
  104. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +4 -1
  105. 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,10 @@ 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 { Constants } from "../../../common/Constants";
46
48
  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;
49
+ var _props$webChatContain, _props$styleProps, _props$controlProps, _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
50
 
49
51
  const [state, dispatch] = useChatContextStore(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
52
 
@@ -59,8 +61,7 @@ export const LiveChatWidgetStateful = props => {
59
61
  const {
60
62
  Composer
61
63
  } = Components;
62
- const canStartProactiveChat = useRef(true);
63
- const canEndChat = useRef(true); // Process general styles
64
+ const canStartProactiveChat = useRef(true); // Process general styles
64
65
 
65
66
  const generalStyles = {
66
67
  root: Object.assign({}, getGeneralStylesForButton(state), (_props$styleProps = props.styleProps) === null || _props$styleProps === void 0 ? void 0 : _props$styleProps.generalStyles)
@@ -68,9 +69,34 @@ export const LiveChatWidgetStateful = props => {
68
69
  TelemetryTimers.LcwLoadToChatButtonTimer = createTimer();
69
70
  const widgetElementId = ((_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.id) || "oc-lcw";
70
71
  const currentMessageCountRef = useRef(0);
72
+ let widgetStateEventName = "";
73
+
74
+ const initiateEndChatOnBrowserUnload = () => {
75
+ var _DataStoreManager$cli;
76
+
77
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
78
+ Event: TelemetryEvent.BrowserUnloadEventStarted,
79
+ Description: "Browser unload event received."
80
+ });
81
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false); // Clean local storage
82
+
83
+ (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.removeData(widgetStateEventName, "localStorage"); //Dispose calling instance
84
+
85
+ if (voiceVideoCallingSDK) {
86
+ voiceVideoCallingSDK === null || voiceVideoCallingSDK === void 0 ? void 0 : voiceVideoCallingSDK.close();
87
+ } //Message for clearing window[popouTab]
88
+
89
+
90
+ BroadcastService.postMessage({
91
+ eventName: BroadcastEvent.ClosePopoutWindow
92
+ });
93
+ };
94
+
71
95
  useEffect(() => {
72
- var _props$controlProps2, _props$controlProps3, _props$reconnectChatP, _props$controlProps4, _props$chatConfig, _props$chatConfig$Cha, _state$domainStates;
96
+ var _chatSDK$omnichannelC, _props$controlProps2, _props$controlProps3, _props$controlProps4, _props$controlProps5, _props$controlProps7, _props$chatConfig, _props$chatConfig$Cha, _props$controlProps8, _props$reconnectChatP, _props$chatConfig2, _props$chatConfig2$Li;
73
97
 
98
+ 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$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.widgetInstanceId) ?? "");
99
+ BroadcastServiceInitialize(broadcastServiceChannelName);
74
100
  registerTelemetryLoggers(props, dispatch);
75
101
  createInternetConnectionChangeHandler();
76
102
  DataStoreManager.clientDataStore = props.contextDataStore ?? undefined;
@@ -80,49 +106,79 @@ export const LiveChatWidgetStateful = props => {
80
106
  });
81
107
  dispatch({
82
108
  type: LiveChatWidgetActionType.SET_SKIP_CHAT_BUTTON_RENDERING,
83
- payload: ((_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.skipChatButtonRendering) || false
109
+ payload: ((_props$controlProps3 = props.controlProps) === null || _props$controlProps3 === void 0 ? void 0 : _props$controlProps3.skipChatButtonRendering) || false
84
110
  });
85
111
  dispatch({
86
112
  type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
87
113
  payload: false
88
114
  });
115
+
116
+ if ((_props$controlProps4 = props.controlProps) !== null && _props$controlProps4 !== void 0 && _props$controlProps4.widgetInstanceId && !isNullOrEmptyString((_props$controlProps5 = props.controlProps) === null || _props$controlProps5 === void 0 ? void 0 : _props$controlProps5.widgetInstanceId)) {
117
+ var _props$controlProps6;
118
+
119
+ dispatch({
120
+ type: LiveChatWidgetActionType.SET_WIDGET_INSTANCE_ID,
121
+ payload: (_props$controlProps6 = props.controlProps) === null || _props$controlProps6 === void 0 ? void 0 : _props$controlProps6.widgetInstanceId
122
+ });
123
+ }
124
+
89
125
  initCallingSdk(chatSDK, setVoiceVideoCallingSDK).then(sdkCreated => {
90
126
  sdkCreated && dispatch({
91
127
  type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
92
128
  payload: true
93
129
  });
130
+ }); // Initialize global dir
131
+
132
+ const globalDir = ((_props$controlProps7 = props.controlProps) === null || _props$controlProps7 === void 0 ? void 0 : _props$controlProps7.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);
133
+ dispatch({
134
+ type: LiveChatWidgetActionType.SET_GLOBAL_DIR,
135
+ payload: globalDir
94
136
  });
95
137
 
96
- 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) {
138
+ if (!((_props$controlProps8 = props.controlProps) !== null && _props$controlProps8 !== void 0 && _props$controlProps8.skipChatButtonRendering) && (_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
97
139
  var _props$reconnectChatP2;
98
140
 
99
- startUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
100
- } // Initialize global dir
141
+ startUnauthenticatedReconnectChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
142
+ return;
143
+ } // Check if auth settings enabled, do not connect to existing chat from cache during refresh/re-load
144
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
145
+
146
+
147
+ 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;
148
+
149
+ if (isAuthenticationSettingsEnabled === false) {
150
+ var _state$domainStates;
151
+
152
+ if (!isUndefinedOrEmpty((_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.liveChatContext) && state.appStates.conversationState === ConversationState.Active) {
153
+ var _state$domainStates2;
154
+
155
+ const optionalParams = {
156
+ liveChatContext: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.liveChatContext
157
+ };
158
+ initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams);
159
+ return;
160
+ }
161
+ } // All other case should show start chat button, skipChatButtonRendering will take care of it own
101
162
 
102
163
 
103
- 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);
104
164
  dispatch({
105
- type: LiveChatWidgetActionType.SET_GLOBAL_DIR,
106
- payload: globalDir
165
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
166
+ payload: ConversationState.Closed
107
167
  });
168
+ }, []); // useEffect for when skip chat button rendering
108
169
 
109
- if ((_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.liveChatContext) {
110
- var _state$domainStates2;
111
-
112
- const optionalParams = {
113
- liveChatContext: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.liveChatContext
114
- };
115
- initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
116
- }
117
- }, []);
118
170
  useEffect(() => {
119
171
  if (state.appStates.skipChatButtonRendering) {
120
172
  var _props$reconnectChatP3;
121
173
 
174
+ BroadcastService.postMessage({
175
+ eventName: BroadcastEvent.ChatInitiated
176
+ });
177
+
122
178
  if ((_props$reconnectChatP3 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP3 !== void 0 && _props$reconnectChatP3.reconnectId && !state.appStates.reconnectId) {
123
179
  var _props$reconnectChatP4, _props$reconnectChatP5;
124
180
 
125
- 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);
181
+ handleUnauthenticatedReconnectChat(chatSDK, props.chatConfig, props.getAuthToken, 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);
126
182
  } else {
127
183
  getReconnectIdForAuthenticatedChat(props, chatSDK).then(authReconnectId => {
128
184
  if (authReconnectId && !state.appStates.reconnectId) {
@@ -139,18 +195,15 @@ export const LiveChatWidgetStateful = props => {
139
195
  eventName: BroadcastEvent.StartChatSkippingChatButtonRendering
140
196
  };
141
197
  BroadcastService.postMessage(chatStartedSkippingChatButtonRendering);
142
- dispatch({
143
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
144
- payload: ConversationState.Loading
145
- });
146
- initStartChat(chatSDK, dispatch, setAdapter);
198
+ setPreChatAndInitiateChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter);
147
199
  }
148
200
  });
149
201
  }
150
202
  }
151
- }, [state.appStates.skipChatButtonRendering]);
203
+ }, [state.appStates.skipChatButtonRendering]); // useEffect for when skip chat button rendering
204
+
152
205
  useEffect(() => {
153
- var _chatSDK$omnichannelC, _chatSDK$omnichannelC2;
206
+ var _chatSDK$omnichannelC6, _chatSDK$omnichannelC7, _props$controlProps11;
154
207
 
155
208
  // Add the custom context on receiving the SetCustomContext event
156
209
  BroadcastService.getMessageByEventName(BroadcastEvent.SetCustomContext).subscribe(msg => {
@@ -163,7 +216,7 @@ export const LiveChatWidgetStateful = props => {
163
216
  payload: msg === null || msg === void 0 ? void 0 : msg.payload
164
217
  });
165
218
  });
166
- BroadcastService.getMessageByEventName("StartProactiveChat").subscribe(msg => {
219
+ BroadcastService.getMessageByEventName(BroadcastEvent.StartProactiveChat).subscribe(msg => {
167
220
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
168
221
  Event: TelemetryEvent.StartProactiveChatEventReceived,
169
222
  Description: "Start proactive chat event received."
@@ -179,76 +232,127 @@ export const LiveChatWidgetStateful = props => {
179
232
  Description: "Start proactive chat method called, when chat was already triggered."
180
233
  });
181
234
  }
182
- }); // start chat from SDK Event
235
+ }); // Start chat from SDK Event
236
+
237
+ BroadcastService.getMessageByEventName(BroadcastEvent.StartChat).subscribe(() => {
238
+ var _chatSDK$omnichannelC2, _chatSDK$omnichannelC3, _props$controlProps9;
183
239
 
184
- BroadcastService.getMessageByEventName("StartChat").subscribe(() => {
185
240
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
186
241
  Event: TelemetryEvent.StartChatEventRecevied,
187
242
  Description: "Start chat event received."
188
243
  });
244
+ const persistedState = getStateFromCache(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$controlProps9 = props.controlProps) === null || _props$controlProps9 === void 0 ? void 0 : _props$controlProps9.widgetInstanceId) ?? ""); // Chat not found in cache
245
+
246
+ if (persistedState === undefined) {
247
+ BroadcastService.postMessage({
248
+ eventName: BroadcastEvent.ChatInitiated
249
+ });
250
+ prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
251
+ return;
252
+ } // Chat exist in cache
253
+
254
+
255
+ if (persistedState) {
256
+ var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4;
257
+
258
+ // Only initiate new chat if widget state in cache in one of the followings
259
+ if (persistedState.appStates.conversationState === ConversationState.Closed || persistedState.appStates.conversationState === ConversationState.InActive || persistedState.appStates.conversationState === ConversationState.Postchat) {
260
+ BroadcastService.postMessage({
261
+ eventName: BroadcastEvent.ChatInitiated
262
+ });
263
+ prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
264
+ return;
265
+ } // If minimized, maximize the chat
266
+
189
267
 
190
- if (state.appStates.isMinimized) {
191
268
  dispatch({
192
269
  type: LiveChatWidgetActionType.SET_MINIMIZED,
193
270
  payload: false
194
271
  });
195
- } else {
196
- prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
272
+ BroadcastService.postMessage({
273
+ eventName: BroadcastEvent.MaximizeChat,
274
+ payload: {
275
+ 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,
276
+ 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
277
+ }
278
+ });
279
+ }
280
+ }); // End chat
281
+
282
+ BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChat).subscribe(async () => {
283
+ if (state.appStates.skipChatButtonRendering !== true) {
284
+ var _chatSDK$omnichannelC4, _chatSDK$omnichannelC5, _props$controlProps10;
285
+
286
+ // This is to ensure to get latest state from cache in multitab
287
+ 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) ?? "");
288
+
289
+ if (persistedState && persistedState.appStates.conversationState === ConversationState.Active) {
290
+ prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
291
+ } else {
292
+ const skipEndChatSDK = true;
293
+ const skipCloseChat = false;
294
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
295
+ }
197
296
  }
198
- }); // end chat from SDK Event
199
297
 
200
- BroadcastService.getMessageByEventName("EndChat").subscribe(async () => {
201
- TelemetryHelper.logActionEvent(LogLevel.INFO, {
202
- Event: TelemetryEvent.EndChatEventReceived,
203
- Description: "End chat event received."
298
+ BroadcastService.postMessage({
299
+ eventName: BroadcastEvent.CloseChat
204
300
  });
301
+ }); // End chat on browser unload
205
302
 
206
- if (canEndChat.current) {
207
- prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
208
- } else {
209
- const skipEndChatSDK = true;
210
- const skipCloseChat = false;
211
- endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
212
- }
303
+ BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChatOnBrowserUnload).subscribe(() => {
304
+ initiateEndChatOnBrowserUnload();
213
305
  }); // Listen to end chat event from other tabs
214
306
 
215
- const endChatEventName = getWidgetEndChatEventName(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);
307
+ const endChatEventName = getWidgetEndChatEventName(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$controlProps11 = props.controlProps) === null || _props$controlProps11 === void 0 ? void 0 : _props$controlProps11.widgetInstanceId) ?? "");
216
308
  BroadcastService.getMessageByEventName(endChatEventName).subscribe(async () => {
217
309
  endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
218
- });
219
- window.addEventListener("beforeunload", () => {
220
- disposeTelemetryLoggers();
221
- });
310
+ return;
311
+ }); // When conversation ended by agent
222
312
 
223
313
  if (state.appStates.conversationEndedByAgent) {
224
314
  endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
225
- }
226
- }, []);
227
- useEffect(() => {
228
- canStartProactiveChat.current = state.appStates.conversationState === ConversationState.Closed;
229
- canEndChat.current = state.appStates.conversationState === ConversationState.Active;
230
-
231
- if (state.appStates.conversationState === ConversationState.Active) {
232
- chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
233
- BroadcastService.postMessage({
234
- eventName: BroadcastEvent.NewMessageNotification
235
- });
236
- });
237
- } // Track the message count
315
+ } //Listen to WidgetSize, used for minimize to maximize
238
316
 
239
317
 
318
+ BroadcastService.getMessageByEventName("WidgetSize").subscribe(msg => {
319
+ dispatch({
320
+ type: LiveChatWidgetActionType.SET_WIDGET_SIZE,
321
+ payload: msg === null || msg === void 0 ? void 0 : msg.payload
322
+ });
323
+ });
324
+ return () => {
325
+ disposeTelemetryLoggers();
326
+ };
327
+ }, []);
328
+ useEffect(() => {
329
+ // On new message
240
330
  if (state.appStates.conversationState === ConversationState.Active) {
241
331
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
332
+ // Track the message count
242
333
  currentMessageCountRef.current++;
243
334
  dispatch({
244
335
  type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
245
336
  payload: currentMessageCountRef.current + 1
337
+ }); // New message notification
338
+
339
+ BroadcastService.postMessage({
340
+ eventName: BroadcastEvent.NewMessageNotification
246
341
  });
247
342
  });
248
343
  }
249
- }, [state.appStates.conversationState]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
344
+ }, [state.appStates.conversationState]);
345
+ useEffect(() => {
346
+ canStartProactiveChat.current = state.appStates.conversationState === ConversationState.Closed && !state.appStates.proactiveChatStates.proactiveChatInNewWindow;
347
+ }, [state.appStates.conversationState, state.appStates.proactiveChatStates.proactiveChatInNewWindow]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
250
348
 
251
349
  useEffect(() => {
350
+ if (state.appStates.isMinimized) {
351
+ ActivityStreamHandler.cork();
352
+ } else {
353
+ setTimeout(() => ActivityStreamHandler.uncork(), 500);
354
+ }
355
+
252
356
  currentMessageCountRef.current = -1;
253
357
  dispatch({
254
358
  type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
@@ -263,7 +367,7 @@ export const LiveChatWidgetStateful = props => {
263
367
  }, [state.appStates.isMinimized]); // Broadcast the UnreadMessageCount state on any change.
264
368
 
265
369
  useEffect(() => {
266
- if (state.appStates.isMinimized && state.appStates.unreadMessageCount > 0) {
370
+ if (state.appStates.isMinimized === true && state.appStates.unreadMessageCount > 0) {
267
371
  const customEvent = {
268
372
  elementType: ElementType.Custom,
269
373
  eventName: BroadcastEvent.UnreadMessageCount,
@@ -278,13 +382,40 @@ export const LiveChatWidgetStateful = props => {
278
382
  setWebChatStyles({ ...webChatStyles,
279
383
  ...((_props$webChatContain2 = props.webChatContainerProps) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.webChatStyles)
280
384
  });
281
- }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]);
385
+ }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]); // Publish chat widget state
386
+
387
+ useEffect(() => {
388
+ var _props$controlProps12, _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic, _props$controlProps13;
389
+
390
+ // Only activate these windows events when conversation state is active and chat widget is in popout mode
391
+ // Ghost chat scenarios
392
+ if (state.appStates.conversationState === ConversationState.Active && ((_props$controlProps12 = props.controlProps) === null || _props$controlProps12 === void 0 ? void 0 : _props$controlProps12.skipChatButtonRendering) === true) {
393
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
394
+ window.onbeforeunload = function () {
395
+ const prompt = Constants.BrowserUnloadConfirmationMessage;
396
+ return prompt;
397
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
398
+
399
+
400
+ window.onunload = function () {
401
+ initiateEndChatOnBrowserUnload();
402
+ };
403
+ }
404
+
405
+ 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) ?? "");
406
+ const chatWidgetStateChangeEvent = {
407
+ eventName: widgetStateEventName,
408
+ payload: { ...state
409
+ }
410
+ };
411
+ BroadcastService.postMessage(chatWidgetStateChangeEvent);
412
+ }, [state.appStates.conversationState]);
282
413
  const webChatProps = initWebChatComposer(props, chatSDK, state, dispatch, setWebChatStyles);
283
414
 
284
415
  const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch); // eslint-disable-next-line @typescript-eslint/no-explicit-any
285
416
 
286
417
 
287
- const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat) => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat); // eslint-disable-next-line @typescript-eslint/no-explicit-any
418
+ 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
288
419
 
289
420
 
290
421
  const prepareEndChatRelay = (adapter, state) => prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
@@ -292,21 +423,9 @@ export const LiveChatWidgetStateful = props => {
292
423
  const prepareStartChatRelay = () => prepareStartChat(props, chatSDK, state, dispatch, setAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
293
424
 
294
425
 
295
- const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
296
-
297
- const confirmationPaneProps = initConfirmationPropsComposer(props); // publish chat widget state
298
-
299
- useEffect(() => {
300
- var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic;
426
+ const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams, persistedState);
301
427
 
302
- const 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);
303
- const chatWidgetStateChangeEvent = {
304
- eventName: widgetStateEventName,
305
- payload: { ...state
306
- }
307
- };
308
- BroadcastService.postMessage(chatWidgetStateChangeEvent);
309
- }, [state]);
428
+ const confirmationPaneProps = initConfirmationPropsComposer(props);
310
429
  return /*#__PURE__*/React.createElement(Composer, _extends({}, webChatProps, {
311
430
  styleOptions: webChatStyles,
312
431
  directLine: ((_props$webChatContain4 = props.webChatContainerProps) === null || _props$webChatContain4 === void 0 ? void 0 : _props$webChatContain4.directLine) ?? adapter ?? defaultWebChatContainerStatefulProps.directLine
@@ -314,28 +433,28 @@ export const LiveChatWidgetStateful = props => {
314
433
  id: widgetElementId,
315
434
  styles: generalStyles,
316
435
  className: (_props$styleProps2 = props.styleProps) === null || _props$styleProps2 === void 0 ? void 0 : _props$styleProps2.className
317
- }, !((_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, {
436
+ }, !((_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, {
318
437
  buttonProps: props.chatButtonProps,
319
438
  outOfOfficeButtonProps: props.outOfOfficeChatButtonProps,
320
439
  startChat: prepareStartChatRelay
321
- })), !((_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, {
440
+ })), !((_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, {
322
441
  proactiveChatProps: props.proactiveChatPaneProps,
323
442
  startChat: prepareStartChatRelay
324
- })), !((_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, {
443
+ })), !((_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, {
325
444
  headerProps: props.headerProps,
326
445
  outOfOfficeHeaderProps: props.outOfOfficeHeaderProps,
327
446
  endChat: endChatRelay
328
- })), !((_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, {
447
+ })), !((_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, {
329
448
  reconnectChatProps: props.reconnectChatPaneProps,
330
449
  initStartChat: initStartChatRelay
331
- })), !((_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, {
450
+ })), !((_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, {
332
451
  surveyProps: props.preChatSurveyPaneProps,
333
452
  initStartChat: initStartChatRelay
334
- })), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
453
+ })), !((_props$controlProps22 = props.controlProps) !== null && _props$controlProps22 !== void 0 && _props$controlProps22.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
335
454
  voiceVideoCallingSdk: voiceVideoCallingSDK
336
- }, 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, {
455
+ }, 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, {
337
456
  setPostChatContext: setPostChatContextRelay,
338
457
  prepareEndChat: prepareEndChatRelay
339
- }))), !((_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))));
458
+ }))), !((_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))));
340
459
  };
341
460
  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 = {
@@ -24,6 +24,14 @@ export const ProactiveChatPaneStateful = props => {
24
24
  const handleProactiveChatInviteTimeout = () => {
25
25
  if (!timeoutRemoved) {
26
26
  setTimeoutRemoved(true);
27
+ dispatch({
28
+ type: LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
29
+ payload: {
30
+ proactiveChatBodyTitle: "",
31
+ proactiveChatEnablePrechat: false,
32
+ proactiveChatInNewWindow: false
33
+ }
34
+ });
27
35
  dispatch({
28
36
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
29
37
  payload: ConversationState.Closed
@@ -81,13 +89,21 @@ export const ProactiveChatPaneStateful = props => {
81
89
  Event: TelemetryEvent.ProactiveChatClosed,
82
90
  Description: "Proactive chat closed."
83
91
  });
92
+ dispatch({
93
+ type: LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
94
+ payload: {
95
+ proactiveChatBodyTitle: "",
96
+ proactiveChatEnablePrechat: false,
97
+ proactiveChatInNewWindow: false
98
+ }
99
+ });
84
100
  dispatch({
85
101
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
86
102
  payload: ConversationState.Closed
87
103
  });
88
104
  },
89
105
  ...(proactiveChatProps === null || proactiveChatProps === void 0 ? void 0 : proactiveChatProps.controlProps),
90
- 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
91
107
  };
92
108
  useEffect(() => {
93
109
  setFocusOnElement(document.getElementById(controlProps.id + "-startbutton"));