@microsoft/omnichannel-chat-widget 0.1.0-main.ae3aa42 → 0.1.0-main.b511ad6

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 (123) hide show
  1. package/README.md +32 -0
  2. package/lib/cjs/common/Constants.js +16 -2
  3. package/lib/cjs/common/telemetry/TelemetryConstants.js +26 -3
  4. package/lib/cjs/common/telemetry/TelemetryManager.js +7 -1
  5. package/lib/cjs/common/telemetry/loggers/ariaTelemetryLogger.js +8 -9
  6. package/lib/cjs/common/telemetry/loggers/consoleLogger.js +6 -5
  7. package/lib/cjs/common/utils.js +63 -2
  8. package/lib/cjs/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  9. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +20 -4
  10. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +0 -1
  11. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +11 -2
  12. package/lib/cjs/components/headerstateful/HeaderStateful.js +2 -2
  13. package/lib/cjs/components/livechatwidget/common/ActivityStreamHandler.js +44 -0
  14. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.js +23 -0
  15. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.js +1 -0
  16. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +39 -0
  17. package/lib/cjs/components/livechatwidget/common/ChatAdapterShim.js +70 -0
  18. package/lib/cjs/components/livechatwidget/common/Deferred.js +42 -0
  19. package/lib/cjs/components/livechatwidget/common/createAdapter.js +13 -1
  20. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +31 -30
  21. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +9 -15
  22. package/lib/cjs/components/livechatwidget/common/endChat.js +63 -16
  23. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +20 -3
  24. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +23 -15
  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 +177 -67
  28. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +206 -85
  29. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +5 -10
  30. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +17 -1
  31. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +80 -0
  32. package/lib/cjs/components/webchatcontainerstateful/common/mockchatsdk.js +2 -0
  33. package/lib/cjs/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  34. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +14 -0
  35. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +16 -2
  36. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +52 -0
  37. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +98 -0
  38. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +117 -0
  39. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +1 -0
  40. package/lib/cjs/contexts/common/ConversationState.js +3 -2
  41. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +24 -21
  42. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +3 -2
  43. package/lib/cjs/contexts/createReducer.js +16 -0
  44. package/lib/cjs/controller/componentController.js +3 -3
  45. package/lib/cjs/plugins/newMessageEventHandler.js +10 -13
  46. package/lib/esm/common/Constants.js +16 -2
  47. package/lib/esm/common/telemetry/TelemetryConstants.js +26 -3
  48. package/lib/esm/common/telemetry/TelemetryManager.js +6 -1
  49. package/lib/esm/common/telemetry/loggers/ariaTelemetryLogger.js +8 -6
  50. package/lib/esm/common/telemetry/loggers/consoleLogger.js +6 -5
  51. package/lib/esm/common/utils.js +44 -0
  52. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  53. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +22 -7
  54. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +0 -1
  55. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +9 -3
  56. package/lib/esm/components/headerstateful/HeaderStateful.js +2 -2
  57. package/lib/esm/components/livechatwidget/common/ActivityStreamHandler.js +34 -0
  58. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.js +14 -0
  59. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.js +1 -0
  60. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +29 -0
  61. package/lib/esm/components/livechatwidget/common/ChatAdapterShim.js +59 -0
  62. package/lib/esm/components/livechatwidget/common/Deferred.js +33 -0
  63. package/lib/esm/components/livechatwidget/common/createAdapter.js +12 -2
  64. package/lib/esm/components/livechatwidget/common/createMarkdown.js +31 -30
  65. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +9 -15
  66. package/lib/esm/components/livechatwidget/common/endChat.js +61 -17
  67. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +19 -5
  68. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +23 -15
  69. package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +0 -4
  70. package/lib/esm/components/livechatwidget/common/shareObservable.js +38 -0
  71. package/lib/esm/components/livechatwidget/common/startChat.js +172 -68
  72. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +197 -87
  73. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +7 -11
  74. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +17 -1
  75. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +72 -0
  76. package/lib/esm/components/webchatcontainerstateful/common/mockchatsdk.js +2 -0
  77. package/lib/esm/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  78. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +5 -0
  79. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +16 -2
  80. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +41 -0
  81. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +94 -0
  82. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +107 -0
  83. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +1 -0
  84. package/lib/esm/contexts/common/ConversationState.js +3 -2
  85. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +24 -21
  86. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +3 -2
  87. package/lib/esm/contexts/createReducer.js +16 -0
  88. package/lib/esm/controller/componentController.js +3 -3
  89. package/lib/esm/plugins/newMessageEventHandler.js +10 -12
  90. package/lib/types/common/Constants.d.ts +8 -1
  91. package/lib/types/common/interfaces/IContextDataStore.d.ts +1 -1
  92. package/lib/types/common/telemetry/TelemetryConstants.d.ts +25 -5
  93. package/lib/types/common/telemetry/TelemetryHelper.d.ts +2 -1
  94. package/lib/types/common/telemetry/definitions/Payload.d.ts +12 -9
  95. package/lib/types/common/utils.d.ts +6 -1
  96. package/lib/types/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.d.ts +1 -1
  97. package/lib/types/components/livechatwidget/common/ActivityStreamHandler.d.ts +14 -0
  98. package/lib/types/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.d.ts +5 -0
  99. package/lib/types/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.d.ts +6 -0
  100. package/lib/types/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.d.ts +7 -0
  101. package/lib/types/components/livechatwidget/common/ChatAdapterShim.d.ts +7 -0
  102. package/lib/types/components/livechatwidget/common/Deferred.d.ts +9 -0
  103. package/lib/types/components/livechatwidget/common/endChat.d.ts +1 -1
  104. package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +5 -4
  105. package/lib/types/components/livechatwidget/common/setPostChatContextAndLoadSurvey.d.ts +1 -1
  106. package/lib/types/components/livechatwidget/common/shareObservable.d.ts +1 -0
  107. package/lib/types/components/livechatwidget/common/startChat.d.ts +4 -2
  108. package/lib/types/components/livechatwidget/common/startProactiveChat.d.ts +1 -1
  109. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +1 -0
  110. package/lib/types/components/reconnectchatpanestateful/interfaces/IReconnectChatPaneStatefulProps.d.ts +0 -1
  111. package/lib/types/components/webchatcontainerstateful/common/mockchatsdk.d.ts +1 -0
  112. package/lib/types/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.d.ts +4 -0
  113. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +2 -0
  114. package/lib/types/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.d.ts +3 -0
  115. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.d.ts +1 -1
  116. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware.d.ts +1 -1
  117. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.d.ts +2 -0
  118. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.d.ts +1 -0
  119. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.d.ts +5 -0
  120. package/lib/types/contexts/common/ConversationState.d.ts +3 -2
  121. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +2 -1
  122. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +24 -21
  123. package/package.json +2 -2
@@ -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
4
  import { BroadcastService, decodeComponentString } from "@microsoft/omnichannel-chat-components";
5
5
  import { Stack } from "@fluentui/react";
6
6
  import React, { useEffect, useRef, useState } from "react";
7
- import { createTimer, getLocaleDirection } from "../../../common/utils";
7
+ import { createTimer, getLocaleDirection, getStateFromCache, getWidgetCacheId, getWidgetEndChatEventName, 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,9 @@ 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";
46
47
  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;
48
+ var _props$webChatContain, _props$styleProps, _props$controlProps, _props$webChatContain3, _props$webChatContain4, _props$styleProps2, _props$controlProps5, _props$controlProps6, _props$componentOverr, _props$controlProps7, _props$componentOverr2, _props$controlProps8, _props$componentOverr3, _props$controlProps9, _props$componentOverr4, _props$controlProps10, _props$componentOverr5, _props$controlProps11, _props$componentOverr6, _props$controlProps12, _props$componentOverr7, _props$controlProps13, _props$controlProps14, _props$componentOverr8, _props$controlProps15, _props$componentOverr9, _props$controlProps16, _props$componentOverr10, _props$componentOverr11, _props$componentOverr12;
48
49
 
49
50
  const [state, dispatch] = useChatContextStore(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
51
 
@@ -53,13 +54,13 @@ export const LiveChatWidgetStateful = props => {
53
54
  ...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.webChatStyles)
54
55
  }); // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
56
 
56
- const chatSDK = useChatSDKStore();
57
+ const chatSDK = useChatSDKStore(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
+
57
59
  const [voiceVideoCallingSDK, setVoiceVideoCallingSDK] = useState(undefined);
58
60
  const {
59
61
  Composer
60
62
  } = Components;
61
- const canStartProactiveChat = useRef(true);
62
- const canEndChat = useRef(true); // Process general styles
63
+ const canStartProactiveChat = useRef(true); // Process general styles
63
64
 
64
65
  const generalStyles = {
65
66
  root: Object.assign({}, getGeneralStylesForButton(state), (_props$styleProps = props.styleProps) === null || _props$styleProps === void 0 ? void 0 : _props$styleProps.generalStyles)
@@ -67,8 +68,37 @@ export const LiveChatWidgetStateful = props => {
67
68
  TelemetryTimers.LcwLoadToChatButtonTimer = createTimer();
68
69
  const widgetElementId = ((_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.id) || "oc-lcw";
69
70
  const currentMessageCountRef = useRef(0);
71
+ let widgetStateEventName = "";
72
+
73
+ const initiateEndChatOnBrowserUnload = () => {
74
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _DataStoreManager$cli;
75
+
76
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
77
+ Event: TelemetryEvent.BrowserUnloadEventStarted,
78
+ Description: "Browser unload event received."
79
+ });
80
+ const persistedState = getStateFromCache(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); // End chat if the chat is still active and browser closed
81
+
82
+ if (persistedState.appStates.conversationState === ConversationState.Active) {
83
+ //Browser close scenario/no room for PCS/so just end chat and notify agent immidiately
84
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
85
+ } // Clean local storage
86
+
87
+
88
+ (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.removeData(widgetStateEventName, "localStorage"); //Dispose calling instance
89
+
90
+ if (voiceVideoCallingSDK) {
91
+ voiceVideoCallingSDK === null || voiceVideoCallingSDK === void 0 ? void 0 : voiceVideoCallingSDK.close();
92
+ } //Message for clearing window[popouTab]
93
+
94
+
95
+ BroadcastService.postMessage({
96
+ eventName: BroadcastEvent.ClosePopoutWindow
97
+ });
98
+ };
99
+
70
100
  useEffect(() => {
71
- var _props$controlProps2, _props$controlProps3, _props$reconnectChatP, _props$controlProps4, _props$chatConfig, _props$chatConfig$Cha, _state$domainStates;
101
+ var _props$controlProps2, _props$controlProps3, _props$chatConfig, _props$chatConfig$Cha, _props$controlProps4, _props$reconnectChatP, _props$chatConfig2, _props$chatConfig2$Li;
72
102
 
73
103
  registerTelemetryLoggers(props, dispatch);
74
104
  createInternetConnectionChangeHandler();
@@ -81,43 +111,67 @@ export const LiveChatWidgetStateful = props => {
81
111
  type: LiveChatWidgetActionType.SET_SKIP_CHAT_BUTTON_RENDERING,
82
112
  payload: ((_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.skipChatButtonRendering) || false
83
113
  });
114
+ dispatch({
115
+ type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
116
+ payload: false
117
+ });
84
118
  initCallingSdk(chatSDK, setVoiceVideoCallingSDK).then(sdkCreated => {
85
119
  sdkCreated && dispatch({
86
120
  type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
87
121
  payload: true
88
122
  });
123
+ }); // Initialize global dir
124
+
125
+ const globalDir = ((_props$controlProps3 = props.controlProps) === null || _props$controlProps3 === void 0 ? void 0 : _props$controlProps3.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);
126
+ dispatch({
127
+ type: LiveChatWidgetActionType.SET_GLOBAL_DIR,
128
+ payload: globalDir
89
129
  });
90
130
 
91
- if (!((_props$controlProps3 = props.controlProps) !== null && _props$controlProps3 !== void 0 && _props$controlProps3.skipChatButtonRendering) && (_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
131
+ if (!((_props$controlProps4 = props.controlProps) !== null && _props$controlProps4 !== void 0 && _props$controlProps4.skipChatButtonRendering) && (_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
92
132
  var _props$reconnectChatP2;
93
133
 
94
- startUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
95
- } // Initialize global dir
134
+ startUnauthenticatedReconnectChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
135
+ return;
136
+ } // Check if auth settings enabled, do not connect to existing chat from cache during refresh/re-load
137
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
138
+
139
+
140
+ 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;
141
+
142
+ if (!isAuthenticationSettingsEnabled) {
143
+ var _state$domainStates;
144
+
145
+ if (!isUndefinedOrEmpty((_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.liveChatContext) && state.appStates.conversationState === ConversationState.Active) {
146
+ var _state$domainStates2;
147
+
148
+ const optionalParams = {
149
+ liveChatContext: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.liveChatContext
150
+ };
151
+ initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams);
152
+ return;
153
+ }
154
+ } // All other case should show start chat button, skipChatButtonRendering will take care of it own
96
155
 
97
156
 
98
- const globalDir = ((_props$controlProps4 = props.controlProps) === null || _props$controlProps4 === void 0 ? void 0 : _props$controlProps4.dir) ?? getLocaleDirection((_props$chatConfig = props.chatConfig) === null || _props$chatConfig === void 0 ? void 0 : (_props$chatConfig$Cha = _props$chatConfig.ChatWidgetLanguage) === null || _props$chatConfig$Cha === void 0 ? void 0 : _props$chatConfig$Cha.msdyn_localeid);
99
157
  dispatch({
100
- type: LiveChatWidgetActionType.SET_GLOBAL_DIR,
101
- payload: globalDir
158
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
159
+ payload: ConversationState.Closed
102
160
  });
161
+ }, []); // useEffect for when skip chat button rendering
103
162
 
104
- if ((_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.liveChatContext) {
105
- var _state$domainStates2;
106
-
107
- const optionalParams = {
108
- liveChatContext: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.liveChatContext
109
- };
110
- initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
111
- }
112
- }, []);
113
163
  useEffect(() => {
114
164
  if (state.appStates.skipChatButtonRendering) {
115
165
  var _props$reconnectChatP3;
116
166
 
167
+ BroadcastService.postMessage({
168
+ eventName: BroadcastEvent.ChatInitiated
169
+ });
170
+
117
171
  if ((_props$reconnectChatP3 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP3 !== void 0 && _props$reconnectChatP3.reconnectId && !state.appStates.reconnectId) {
118
172
  var _props$reconnectChatP4, _props$reconnectChatP5;
119
173
 
120
- handleUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, (_props$reconnectChatP4 = props.reconnectChatPaneProps) === null || _props$reconnectChatP4 === void 0 ? void 0 : _props$reconnectChatP4.reconnectId, initStartChat, (_props$reconnectChatP5 = props.reconnectChatPaneProps) === null || _props$reconnectChatP5 === void 0 ? void 0 : _props$reconnectChatP5.redirectInSameWindow);
174
+ 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);
121
175
  } else {
122
176
  getReconnectIdForAuthenticatedChat(props, chatSDK).then(authReconnectId => {
123
177
  if (authReconnectId && !state.appStates.reconnectId) {
@@ -134,18 +188,28 @@ export const LiveChatWidgetStateful = props => {
134
188
  eventName: BroadcastEvent.StartChatSkippingChatButtonRendering
135
189
  };
136
190
  BroadcastService.postMessage(chatStartedSkippingChatButtonRendering);
137
- dispatch({
138
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
139
- payload: ConversationState.Loading
140
- });
141
- initStartChat(chatSDK, dispatch, setAdapter);
191
+ setPreChatAndInitiateChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter);
142
192
  }
143
193
  });
144
194
  }
145
195
  }
146
- }, [state.appStates.skipChatButtonRendering]);
196
+ }, [state.appStates.skipChatButtonRendering]); // useEffect for when skip chat button rendering
197
+
147
198
  useEffect(() => {
148
- BroadcastService.getMessageByEventName("StartProactiveChat").subscribe(msg => {
199
+ var _chatSDK$omnichannelC7, _chatSDK$omnichannelC8;
200
+
201
+ // Add the custom context on receiving the SetCustomContext event
202
+ BroadcastService.getMessageByEventName(BroadcastEvent.SetCustomContext).subscribe(msg => {
203
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
204
+ Event: TelemetryEvent.CustomContextReceived,
205
+ Description: "CustomContext received."
206
+ });
207
+ dispatch({
208
+ type: LiveChatWidgetActionType.SET_CUSTOM_CONTEXT,
209
+ payload: msg === null || msg === void 0 ? void 0 : msg.payload
210
+ });
211
+ });
212
+ BroadcastService.getMessageByEventName(BroadcastEvent.StartProactiveChat).subscribe(msg => {
149
213
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
150
214
  Event: TelemetryEvent.StartProactiveChatEventReceived,
151
215
  Description: "Start proactive chat event received."
@@ -161,71 +225,114 @@ export const LiveChatWidgetStateful = props => {
161
225
  Description: "Start proactive chat method called, when chat was already triggered."
162
226
  });
163
227
  }
164
- }); // start chat from SDK Event
228
+ }); // Start chat from SDK Event
229
+
230
+ BroadcastService.getMessageByEventName(BroadcastEvent.StartChat).subscribe(() => {
231
+ var _chatSDK$omnichannelC3, _chatSDK$omnichannelC4;
165
232
 
166
- BroadcastService.getMessageByEventName("StartChat").subscribe(() => {
167
233
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
168
234
  Event: TelemetryEvent.StartChatEventRecevied,
169
235
  Description: "Start chat event received."
170
236
  });
237
+ const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC3 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC3 === void 0 ? void 0 : _chatSDK$omnichannelC3.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC4 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC4 === void 0 ? void 0 : _chatSDK$omnichannelC4.widgetId);
238
+
239
+ if (persistedState && (persistedState.appStates.conversationState === ConversationState.Closed || persistedState.appStates.conversationState === ConversationState.InActive || persistedState.appStates.conversationState === ConversationState.Postchat)) {
240
+ // Embedded mode
241
+ BroadcastService.postMessage({
242
+ eventName: BroadcastEvent.ChatInitiated
243
+ });
244
+ prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
245
+ } else {
246
+ var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4;
171
247
 
172
- if (state.appStates.isMinimized) {
248
+ // Minimize to Maximize
173
249
  dispatch({
174
250
  type: LiveChatWidgetActionType.SET_MINIMIZED,
175
251
  payload: false
176
252
  });
177
- } else {
178
- prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
253
+ BroadcastService.postMessage({
254
+ eventName: BroadcastEvent.MaximizeChat,
255
+ payload: {
256
+ 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,
257
+ 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
258
+ }
259
+ });
260
+ }
261
+ }); // End chat
262
+
263
+ BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChat).subscribe(async () => {
264
+ if (state.appStates.skipChatButtonRendering !== true) {
265
+ var _chatSDK$omnichannelC5, _chatSDK$omnichannelC6;
266
+
267
+ // This is to ensure to get latest state from cache in multitab
268
+ const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC5 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC5 === void 0 ? void 0 : _chatSDK$omnichannelC5.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC6 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC6 === void 0 ? void 0 : _chatSDK$omnichannelC6.widgetId);
269
+
270
+ if (persistedState && persistedState.appStates.conversationState === ConversationState.Active) {
271
+ prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
272
+ } else {
273
+ const skipEndChatSDK = true;
274
+ const skipCloseChat = false;
275
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
276
+ }
179
277
  }
180
- }); // end chat from SDK Event
181
278
 
182
- BroadcastService.getMessageByEventName("EndChat").subscribe(async () => {
183
- TelemetryHelper.logActionEvent(LogLevel.INFO, {
184
- Event: TelemetryEvent.EndChatEventReceived,
185
- Description: "End chat event received."
279
+ BroadcastService.postMessage({
280
+ eventName: BroadcastEvent.CloseChat
186
281
  });
282
+ }); // End chat on browser unload
187
283
 
188
- if (canEndChat.current) {
189
- prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
190
- } else {
191
- const skipEndChatSDK = true;
192
- const skipCloseChat = false;
193
- endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
194
- }
195
- });
196
- window.addEventListener("beforeunload", () => {
197
- disposeTelemetryLoggers();
198
- });
284
+ BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChatOnBrowserUnload).subscribe(() => {
285
+ initiateEndChatOnBrowserUnload();
286
+ }); // Listen to end chat event from other tabs
287
+
288
+ const endChatEventName = getWidgetEndChatEventName(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC7 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC7 === void 0 ? void 0 : _chatSDK$omnichannelC7.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC8 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC8 === void 0 ? void 0 : _chatSDK$omnichannelC8.widgetId);
289
+ BroadcastService.getMessageByEventName(endChatEventName).subscribe(async () => {
290
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
291
+ }); // When conversation ended by agent
199
292
 
200
293
  if (state.appStates.conversationEndedByAgent) {
201
294
  endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
202
- }
203
- }, []);
204
- useEffect(() => {
205
- canStartProactiveChat.current = state.appStates.conversationState === ConversationState.Closed;
206
- canEndChat.current = state.appStates.conversationState === ConversationState.Active;
207
-
208
- if (state.appStates.conversationState === ConversationState.Active) {
209
- chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
210
- BroadcastService.postMessage({
211
- eventName: BroadcastEvent.NewMessageNotification
212
- });
213
- });
214
- } // Track the message count
295
+ } //Listen to WidgetSize, used for minimize to maximize
215
296
 
216
297
 
298
+ BroadcastService.getMessageByEventName("WidgetSize").subscribe(msg => {
299
+ dispatch({
300
+ type: LiveChatWidgetActionType.SET_WIDGET_SIZE,
301
+ payload: msg === null || msg === void 0 ? void 0 : msg.payload
302
+ });
303
+ });
304
+ return () => {
305
+ disposeTelemetryLoggers();
306
+ };
307
+ }, []);
308
+ useEffect(() => {
309
+ // On new message
217
310
  if (state.appStates.conversationState === ConversationState.Active) {
218
311
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
312
+ // Track the message count
219
313
  currentMessageCountRef.current++;
220
314
  dispatch({
221
315
  type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
222
316
  payload: currentMessageCountRef.current + 1
317
+ }); // New message notification
318
+
319
+ BroadcastService.postMessage({
320
+ eventName: BroadcastEvent.NewMessageNotification
223
321
  });
224
322
  });
225
323
  }
226
- }, [state.appStates.conversationState]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
324
+ }, [state.appStates.conversationState]);
325
+ useEffect(() => {
326
+ canStartProactiveChat.current = state.appStates.conversationState === ConversationState.Closed && !state.appStates.proactiveChatStates.proactiveChatInNewWindow;
327
+ }, [state.appStates.conversationState, state.appStates.proactiveChatStates.proactiveChatInNewWindow]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
227
328
 
228
329
  useEffect(() => {
330
+ if (state.appStates.isMinimized) {
331
+ ActivityStreamHandler.cork();
332
+ } else {
333
+ setTimeout(() => ActivityStreamHandler.uncork(), 500);
334
+ }
335
+
229
336
  currentMessageCountRef.current = -1;
230
337
  dispatch({
231
338
  type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
@@ -240,7 +347,7 @@ export const LiveChatWidgetStateful = props => {
240
347
  }, [state.appStates.isMinimized]); // Broadcast the UnreadMessageCount state on any change.
241
348
 
242
349
  useEffect(() => {
243
- if (state.appStates.isMinimized && state.appStates.unreadMessageCount > 0) {
350
+ if (state.appStates.isMinimized === true && state.appStates.unreadMessageCount > 0) {
244
351
  const customEvent = {
245
352
  elementType: ElementType.Custom,
246
353
  eventName: BroadcastEvent.UnreadMessageCount,
@@ -255,7 +362,19 @@ export const LiveChatWidgetStateful = props => {
255
362
  setWebChatStyles({ ...webChatStyles,
256
363
  ...((_props$webChatContain2 = props.webChatContainerProps) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.webChatStyles)
257
364
  });
258
- }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]);
365
+ }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]); // Publish chat widget state
366
+
367
+ useEffect(() => {
368
+ var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic;
369
+
370
+ 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);
371
+ const chatWidgetStateChangeEvent = {
372
+ eventName: widgetStateEventName,
373
+ payload: { ...state
374
+ }
375
+ };
376
+ BroadcastService.postMessage(chatWidgetStateChangeEvent);
377
+ }, [state]);
259
378
  const webChatProps = initWebChatComposer(props, chatSDK, state, dispatch, setWebChatStyles);
260
379
 
261
380
  const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch); // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -269,18 +388,9 @@ export const LiveChatWidgetStateful = props => {
269
388
  const prepareStartChatRelay = () => prepareStartChat(props, chatSDK, state, dispatch, setAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
270
389
 
271
390
 
272
- const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
273
-
274
- const confirmationPaneProps = initConfirmationPropsComposer(props); // publish chat widget state
391
+ const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams, persistedState);
275
392
 
276
- useEffect(() => {
277
- const chatWidgetStateChangeEvent = {
278
- eventName: BroadcastEvent.ChatWidgetStateChanged,
279
- payload: { ...state
280
- }
281
- };
282
- BroadcastService.postMessage(chatWidgetStateChangeEvent);
283
- }, [state]);
393
+ const confirmationPaneProps = initConfirmationPropsComposer(props);
284
394
  return /*#__PURE__*/React.createElement(Composer, _extends({}, webChatProps, {
285
395
  styleOptions: webChatStyles,
286
396
  directLine: ((_props$webChatContain4 = props.webChatContainerProps) === null || _props$webChatContain4 === void 0 ? void 0 : _props$webChatContain4.directLine) ?? adapter ?? defaultWebChatContainerStatefulProps.directLine
@@ -288,28 +398,28 @@ export const LiveChatWidgetStateful = props => {
288
398
  id: widgetElementId,
289
399
  styles: generalStyles,
290
400
  className: (_props$styleProps2 = props.styleProps) === null || _props$styleProps2 === void 0 ? void 0 : _props$styleProps2.className
291
- }, !((_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, {
401
+ }, !((_props$controlProps5 = props.controlProps) !== null && _props$controlProps5 !== void 0 && _props$controlProps5.hideChatButton) && !((_props$controlProps6 = props.controlProps) !== null && _props$controlProps6 !== void 0 && _props$controlProps6.skipChatButtonRendering) && shouldShowChatButton(state) && (decodeComponentString((_props$componentOverr = props.componentOverrides) === null || _props$componentOverr === void 0 ? void 0 : _props$componentOverr.chatButton) || /*#__PURE__*/React.createElement(ChatButtonStateful, {
292
402
  buttonProps: props.chatButtonProps,
293
403
  outOfOfficeButtonProps: props.outOfOfficeChatButtonProps,
294
404
  startChat: prepareStartChatRelay
295
- })), !((_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, {
405
+ })), !((_props$controlProps7 = props.controlProps) !== null && _props$controlProps7 !== void 0 && _props$controlProps7.hideProactiveChatPane) && shouldShowProactiveChatPane(state) && (decodeComponentString((_props$componentOverr2 = props.componentOverrides) === null || _props$componentOverr2 === void 0 ? void 0 : _props$componentOverr2.proactiveChatPane) || /*#__PURE__*/React.createElement(ProactiveChatPaneStateful, {
296
406
  proactiveChatProps: props.proactiveChatPaneProps,
297
407
  startChat: prepareStartChatRelay
298
- })), !((_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, {
408
+ })), !((_props$controlProps8 = props.controlProps) !== null && _props$controlProps8 !== void 0 && _props$controlProps8.hideHeader) && shouldShowHeader(state) && (decodeComponentString((_props$componentOverr3 = props.componentOverrides) === null || _props$componentOverr3 === void 0 ? void 0 : _props$componentOverr3.header) || /*#__PURE__*/React.createElement(HeaderStateful, {
299
409
  headerProps: props.headerProps,
300
410
  outOfOfficeHeaderProps: props.outOfOfficeHeaderProps,
301
411
  endChat: endChatRelay
302
- })), !((_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, {
412
+ })), !((_props$controlProps9 = props.controlProps) !== null && _props$controlProps9 !== void 0 && _props$controlProps9.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$controlProps10 = props.controlProps) !== null && _props$controlProps10 !== void 0 && _props$controlProps10.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$controlProps11 = props.controlProps) !== null && _props$controlProps11 !== void 0 && _props$controlProps11.hideReconnectChatPane) && shouldShowReconnectChatPane(state) && (decodeComponentString((_props$componentOverr6 = props.componentOverrides) === null || _props$componentOverr6 === void 0 ? void 0 : _props$componentOverr6.reconnectChatPane) || /*#__PURE__*/React.createElement(ReconnectChatPaneStateful, {
303
413
  reconnectChatProps: props.reconnectChatPaneProps,
304
414
  initStartChat: initStartChatRelay
305
- })), !((_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, {
415
+ })), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hidePreChatSurveyPane) && shouldShowPreChatSurveyPane(state) && (decodeComponentString((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.preChatSurveyPane) || /*#__PURE__*/React.createElement(PreChatSurveyPaneStateful, {
306
416
  surveyProps: props.preChatSurveyPaneProps,
307
417
  initStartChat: initStartChatRelay
308
- })), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
418
+ })), !((_props$controlProps13 = props.controlProps) !== null && _props$controlProps13 !== void 0 && _props$controlProps13.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
309
419
  voiceVideoCallingSdk: voiceVideoCallingSDK
310
- }, 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, {
420
+ }, props.callingContainerProps)), !((_props$controlProps14 = props.controlProps) !== null && _props$controlProps14 !== void 0 && _props$controlProps14.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$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.hideConfirmationPane) && shouldShowConfirmationPane(state) && (decodeComponentString((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.confirmationPane) || /*#__PURE__*/React.createElement(ConfirmationPaneStateful, _extends({}, confirmationPaneProps, {
311
421
  setPostChatContext: setPostChatContextRelay,
312
422
  prepareEndChat: prepareEndChatRelay
313
- }))), !((_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))));
423
+ }))), !((_props$controlProps16 = props.controlProps) !== null && _props$controlProps16 !== void 0 && _props$controlProps16.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))));
314
424
  };
315
425
  export default LiveChatWidgetStateful;
@@ -1,9 +1,8 @@
1
- import { Constants, HtmlAttributeNames, Regex } from "../../common/Constants";
1
+ import { HtmlAttributeNames, Regex } from "../../common/Constants";
2
2
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
3
3
  import React, { useEffect } from "react";
4
- import { extractPreChatSurveyResponseValues, findAllFocusableElement, parseAdaptiveCardPayload } from "../../common/utils";
4
+ import { extractPreChatSurveyResponseValues, findAllFocusableElement, getStateFromCache, isUndefinedOrEmpty, parseAdaptiveCardPayload } from "../../common/utils";
5
5
  import { ConversationState } from "../../contexts/common/ConversationState";
6
- import { DataStoreManager } from "../../common/contextDataStore/DataStoreManager";
7
6
  import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
8
7
  import { PreChatSurveyPane } from "@microsoft/omnichannel-chat-components";
9
8
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
@@ -67,13 +66,12 @@ export const PreChatSurveyPaneStateful = props => {
67
66
  });
68
67
 
69
68
  try {
70
- var _DataStoreManager$cli, _persistedState$domai;
69
+ var _state$domainStates, _state$domainStates$t, _state$domainStates$t2, _persistedState$domai, _persistedState$appSt;
71
70
 
72
- const widgetStateFromCache = (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(Constants.widgetStateDataKey, "localStorage");
73
- const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
74
- let optionalParams = {};
71
+ const persistedState = getStateFromCache(((_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : (_state$domainStates$t = _state$domainStates.telemetryInternalData) === null || _state$domainStates$t === void 0 ? void 0 : _state$domainStates$t.orgId) ?? "", ((_state$domainStates$t2 = state.domainStates.telemetryInternalData) === null || _state$domainStates$t2 === void 0 ? void 0 : _state$domainStates$t2.widgetId) ?? "");
72
+ let optionalParams = {}; //Connect to Active chats and chat is not popout
75
73
 
76
- if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai = persistedState.domainStates) !== null && _persistedState$domai !== void 0 && _persistedState$domai.liveChatContext) {
74
+ if (persistedState && !isUndefinedOrEmpty(persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai = persistedState.domainStates) === null || _persistedState$domai === void 0 ? void 0 : _persistedState$domai.liveChatContext) && (persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$appSt = persistedState.appStates) === null || _persistedState$appSt === void 0 ? void 0 : _persistedState$appSt.conversationState) === ConversationState.Active && !state.appStates.skipChatButtonRendering) {
77
75
  var _persistedState$domai2;
78
76
 
79
77
  optionalParams = {
@@ -83,9 +81,7 @@ export const PreChatSurveyPaneStateful = props => {
83
81
  } else {
84
82
  const prechatResponseValues = extractPreChatSurveyResponseValues(state.domainStates.preChatSurveyResponse, values);
85
83
  optionalParams = {
86
- initContext: {
87
- preChatResponse: prechatResponseValues
88
- }
84
+ preChatResponse: prechatResponseValues
89
85
  };
90
86
  setPreChatResponseEmail(values);
91
87
  await initStartChat(optionalParams);
@@ -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"));
@@ -8,11 +8,45 @@ import { defaultMiddlewareLocalizedTexts } from "./common/defaultProps/defaultMi
8
8
  import { defaultWebChatContainerStatefulProps } from "./common/defaultProps/defaultWebChatContainerStatefulProps";
9
9
  import { setFocusOnSendBox } from "../../common/utils";
10
10
  import { useChatContextStore } from "../..";
11
+ import { WebChatActionType } from "./webchatcontroller/enums/WebChatActionType";
12
+ import { WebChatStoreLoader } from "./webchatcontroller/WebChatStoreLoader";
13
+ import { Constants } from "../../common/Constants";
14
+ import { BotMagicCodeStore } from "./webchatcontroller/BotMagicCodeStore";
15
+ const broadcastChannelMessageEvent = "message";
16
+
17
+ const postActivity = activity => {
18
+ // eslint-disable-line @typescript-eslint/no-explicit-any
19
+ return {
20
+ type: WebChatActionType.DIRECT_LINE_POST_ACTIVITY,
21
+ meta: {
22
+ method: "keyboard"
23
+ },
24
+ payload: {
25
+ activity: {
26
+ channelData: undefined,
27
+ text: "",
28
+ textFormat: "plain",
29
+ type: Constants.message,
30
+ ...activity
31
+ }
32
+ }
33
+ };
34
+ };
35
+
36
+ const createMagicCodeSuccessResponse = signin => {
37
+ return {
38
+ signin,
39
+ result: "Success"
40
+ };
41
+ };
42
+
11
43
  export const WebChatContainerStateful = props => {
12
44
  const {
13
45
  BasicWebChat
14
46
  } = Components;
15
47
  const [state, dispatch] = useChatContextStore();
48
+ const magicCodeBroadcastChannel = new BroadcastChannel(Constants.magicCodeBroadcastChannel);
49
+ const magicCodeResponseBroadcastChannel = new BroadcastChannel(Constants.magicCodeResponseBroadcastChannel);
16
50
  const containerStyles = {
17
51
  root: Object.assign({}, defaultWebChatContainerStatefulProps.containerStyles, props === null || props === void 0 ? void 0 : props.containerStyles, {
18
52
  display: state.appStates.isMinimized ? "none" : ""
@@ -36,6 +70,44 @@ export const WebChatContainerStateful = props => {
36
70
  Event: TelemetryEvent.WebChatLoaded
37
71
  });
38
72
  }, []);
73
+ useEffect(() => {
74
+ const eventListener = event => {
75
+ // eslint-disable-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-empty-function
76
+ const {
77
+ data
78
+ } = event;
79
+
80
+ if (BotMagicCodeStore.botOAuthSignInId === data.signin) {
81
+ const {
82
+ signin,
83
+ code
84
+ } = data;
85
+ const text = `${code}`;
86
+ const action = postActivity({
87
+ text,
88
+ channelData: {
89
+ tags: [Constants.hiddenTag]
90
+ }
91
+ });
92
+ WebChatStoreLoader.store.dispatch(action);
93
+ const response = createMagicCodeSuccessResponse(signin);
94
+ magicCodeResponseBroadcastChannel.postMessage(response);
95
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
96
+ Event: TelemetryEvent.SuppressBotMagicCodeSucceeded
97
+ });
98
+ BotMagicCodeStore.botOAuthSignInId = "";
99
+ magicCodeBroadcastChannel.close();
100
+ magicCodeResponseBroadcastChannel.close();
101
+ } else {
102
+ TelemetryHelper.logActionEvent(LogLevel.ERROR, {
103
+ Event: TelemetryEvent.SuppressBotMagicCodeFailed,
104
+ Description: "Signin does not match"
105
+ });
106
+ }
107
+ };
108
+
109
+ magicCodeBroadcastChannel.addEventListener(broadcastChannelMessageEvent, eventListener);
110
+ }, []);
39
111
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("style", null, `
40
112
  .ms_lcw_webchat_received_message img.webchat__markdown__external-link-icon {
41
113
  background-image : url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIzIDMgMTggMTgiICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik03LjI1MDEgNC41MDAxN0gxMC43NDk1QzExLjE2MzcgNC41MDAxNyAxMS40OTk1IDQuODM1OTYgMTEuNDk5NSA1LjI1MDE3QzExLjQ5OTUgNS42Mjk4NiAxMS4yMTczIDUuOTQzNjYgMTAuODUxMyA1Ljk5MzMyTDEwLjc0OTUgNi4wMDAxN0g3LjI0OTc0QzYuMDcwNzkgNS45OTk2MSA1LjEwMzQ5IDYuOTA2NTYgNS4wMDc4NiA4LjA2MTEyTDUuMDAwMjggOC4yMjAwM0w1LjAwMzEyIDE2Ljc1MDdDNS4wMDM0MyAxNy45NDE1IDUuOTI4ODUgMTguOTE2MSA3LjA5OTY2IDE4Ljk5NDlMNy4yNTM3MSAxOS4wMDAxTDE1Ljc1MTggMTguOTg4NEMxNi45NDE1IDE4Ljk4NjggMTcuOTE0NSAxOC4wNjIgMTcuOTkzNSAxNi44OTIzTDE3Ljk5ODcgMTYuNzM4NFYxMy4yMzIxQzE3Ljk5ODcgMTIuODE3OSAxOC4zMzQ1IDEyLjQ4MjEgMTguNzQ4NyAxMi40ODIxQzE5LjEyODQgMTIuNDgyMSAxOS40NDIyIDEyLjc2NDMgMTkuNDkxOCAxMy4xMzAzTDE5LjQ5ODcgMTMuMjMyMVYxNi43Mzg0QzE5LjQ5ODcgMTguNzQwNyAxNy45MjkzIDIwLjM3NjkgMTUuOTUyOCAyMC40ODI5TDE1Ljc1MzggMjAuNDg4NEw3LjI1ODI3IDIwLjUwMDFMNy4wNTQ5NSAyMC40OTQ5QzUuMTQyMzkgMjAuMzk1NCAzLjYwODk1IDE4Ljg2MjcgMy41MDgzNyAxNi45NTAyTDMuNTAzMTIgMTYuNzUxMUwzLjUwMDg5IDguMjUyN0wzLjUwNTI5IDguMDUwMkMzLjYwNTM5IDYuMTM3NDkgNS4xMzg2NyA0LjYwNDQ5IDcuMDUwOTYgNC41MDUyN0w3LjI1MDEgNC41MDAxN0gxMC43NDk1SDcuMjUwMVpNMTMuNzQ4MSAzLjAwMTQ2TDIwLjMwMTggMy4wMDE5N0wyMC40MDE0IDMuMDE1NzVMMjAuNTAyMiAzLjA0MzkzTDIwLjU1OSAzLjA2ODAzQzIwLjYxMjIgMy4wOTEyMiAyMC42NjM0IDMuMTIxNjMgMjAuNzExMSAzLjE1ODg1TDIwLjc4MDQgMy4yMjE1NkwyMC44NjQxIDMuMzIwMTRMMjAuOTE4MyAzLjQxMDI1TDIwLjk1NyAzLjUwMDU3TDIwLjk3NjIgMy41NjQ3NkwyMC45ODk4IDMuNjI4NjJMMjAuOTk5MiAzLjcyMjgyTDIwLjk5OTcgMTAuMjU1NEMyMC45OTk3IDEwLjY2OTYgMjAuNjYzOSAxMS4wMDU0IDIwLjI0OTcgMTEuMDA1NEMxOS44NyAxMS4wMDU0IDE5LjU1NjIgMTAuNzIzMiAxOS41MDY1IDEwLjM1NzFMMTkuNDk5NyAxMC4yNTU0TDE5LjQ5ODkgNS41NjE0N0wxMi4yNzk3IDEyLjc4NDdDMTIuMDEzNCAxMy4wNTEgMTEuNTk2OCAxMy4wNzUzIDExLjMwMzEgMTIuODU3NUwxMS4yMTkgMTIuNzg0OUMxMC45NTI3IDEyLjUxODcgMTAuOTI4NCAxMi4xMDIxIDExLjE0NjIgMTEuODA4NEwxMS4yMTg4IDExLjcyNDNMMTguNDM2OSA0LjUwMTQ2SDEzLjc0ODFDMTMuMzY4NCA0LjUwMTQ2IDEzLjA1NDYgNC4yMTkzMSAxMy4wMDUgMy44NTMyNEwxMi45OTgxIDMuNzUxNDZDMTIuOTk4MSAzLjM3MTc3IDEzLjI4MDMgMy4wNTc5NyAxMy42NDY0IDMuMDA4MzFMMTMuNzQ4MSAzLjAwMTQ2WiIgZmlsbD0iI0ZGRkZGRiIgLz48L3N2Zz4) !important;