@microsoft/omnichannel-chat-widget 0.1.0-main.a7e4e7d → 0.1.0-main.acb91cf

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