@microsoft/omnichannel-chat-widget 0.1.0-main.c461296 → 0.1.0-main.d80ebb6

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 (101) hide show
  1. package/README.md +35 -11
  2. package/lib/cjs/common/Constants.js +46 -6
  3. package/lib/cjs/common/telemetry/TelemetryConstants.js +27 -2
  4. package/lib/cjs/common/telemetry/TelemetryHelper.js +13 -0
  5. package/lib/cjs/common/telemetry/TelemetryManager.js +16 -5
  6. package/lib/cjs/common/telemetry/defaultConfigs/defaultAriaConfig.js +1 -1
  7. package/lib/cjs/common/telemetry/defaultConfigs/defaultTelemetryConfiguration.js +4 -1
  8. package/lib/cjs/common/telemetry/loggers/ariaTelemetryLogger.js +33 -13
  9. package/lib/cjs/common/telemetry/loggers/consoleLogger.js +6 -5
  10. package/lib/cjs/common/utils.js +30 -2
  11. package/lib/cjs/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  12. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +16 -4
  13. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +4 -39
  14. package/lib/cjs/components/footerstateful/FooterStateful.js +1 -2
  15. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +11 -2
  16. package/lib/cjs/components/headerstateful/HeaderStateful.js +1 -7
  17. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +12 -15
  18. package/lib/cjs/components/livechatwidget/common/endChat.js +63 -12
  19. package/lib/cjs/components/livechatwidget/common/initCallingSdk.js +1 -1
  20. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +15 -3
  21. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +105 -20
  22. package/lib/cjs/components/livechatwidget/common/registerTelemetryLoggers.js +6 -17
  23. package/lib/cjs/components/livechatwidget/common/startChat.js +87 -39
  24. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +113 -21
  25. package/lib/cjs/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +8 -0
  26. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +4 -5
  27. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +16 -0
  28. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +80 -0
  29. package/lib/cjs/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  30. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +14 -0
  31. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +16 -2
  32. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +52 -0
  33. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +98 -0
  34. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/mesageTimestampMiddleware.js +116 -0
  35. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +45 -0
  36. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +8 -7
  37. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +2 -1
  38. package/lib/cjs/contexts/createReducer.js +8 -10
  39. package/lib/cjs/plugins/newMessageEventHandler.js +10 -13
  40. package/lib/esm/common/Constants.js +42 -5
  41. package/lib/esm/common/telemetry/TelemetryConstants.js +27 -2
  42. package/lib/esm/common/telemetry/TelemetryHelper.js +13 -1
  43. package/lib/esm/common/telemetry/TelemetryManager.js +14 -5
  44. package/lib/esm/common/telemetry/defaultConfigs/defaultAriaConfig.js +1 -1
  45. package/lib/esm/common/telemetry/defaultConfigs/defaultTelemetryConfiguration.js +4 -1
  46. package/lib/esm/common/telemetry/loggers/ariaTelemetryLogger.js +36 -14
  47. package/lib/esm/common/telemetry/loggers/consoleLogger.js +6 -5
  48. package/lib/esm/common/utils.js +19 -1
  49. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  50. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +18 -6
  51. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +7 -37
  52. package/lib/esm/components/footerstateful/FooterStateful.js +1 -2
  53. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +9 -3
  54. package/lib/esm/components/headerstateful/HeaderStateful.js +1 -7
  55. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +12 -16
  56. package/lib/esm/components/livechatwidget/common/endChat.js +58 -13
  57. package/lib/esm/components/livechatwidget/common/initCallingSdk.js +1 -1
  58. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +13 -4
  59. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +94 -20
  60. package/lib/esm/components/livechatwidget/common/registerTelemetryLoggers.js +5 -14
  61. package/lib/esm/components/livechatwidget/common/startChat.js +90 -44
  62. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +106 -24
  63. package/lib/esm/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +6 -0
  64. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +6 -7
  65. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +16 -0
  66. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +72 -0
  67. package/lib/esm/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  68. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +5 -0
  69. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +16 -2
  70. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +41 -0
  71. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +94 -0
  72. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/mesageTimestampMiddleware.js +106 -0
  73. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +32 -0
  74. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +8 -7
  75. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +2 -1
  76. package/lib/esm/contexts/createReducer.js +8 -9
  77. package/lib/esm/plugins/newMessageEventHandler.js +10 -12
  78. package/lib/types/common/Constants.d.ts +23 -2
  79. package/lib/types/common/interfaces/IContextDataStore.d.ts +1 -1
  80. package/lib/types/common/telemetry/TelemetryConstants.d.ts +22 -4
  81. package/lib/types/common/telemetry/TelemetryHelper.d.ts +2 -0
  82. package/lib/types/common/telemetry/definitions/Payload.d.ts +12 -9
  83. package/lib/types/common/telemetry/interfaces/ITelemetryConfig.d.ts +3 -3
  84. package/lib/types/common/utils.d.ts +3 -0
  85. package/lib/types/components/confirmationpanestateful/interfaces/IConfirmationPaneStatefulParams.d.ts +4 -4
  86. package/lib/types/components/footerstateful/audionotificationstateful/interfaces/IAudioNotificationStatefulParams.d.ts +0 -1
  87. package/lib/types/components/livechatwidget/common/endChat.d.ts +4 -1
  88. package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +5 -2
  89. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetComponentOverrides.d.ts +1 -0
  90. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +1 -1
  91. package/lib/types/components/reconnectchatpanestateful/interfaces/IReconnectChatPaneStatefulProps.d.ts +1 -0
  92. package/lib/types/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.d.ts +4 -0
  93. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +2 -0
  94. package/lib/types/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.d.ts +3 -0
  95. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.d.ts +2 -0
  96. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.d.ts +1 -0
  97. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/mesageTimestampMiddleware.d.ts +5 -0
  98. package/lib/types/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.d.ts +1 -0
  99. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
  100. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +9 -8
  101. package/package.json +6 -7
@@ -35,43 +35,58 @@ var _setPostChatContextAndLoadSurvey = require("./setPostChatContextAndLoadSurve
35
35
 
36
36
  var _updateSessionDataForTelemetry = require("./updateSessionDataForTelemetry");
37
37
 
38
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
39
+
38
40
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
+ let optionalParams = {}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+
39
43
  const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) => {
44
+ var _props$reconnectChatP;
45
+
40
46
  if (await canConnectToExistingChat(props, chatSDK, state, dispatch, setAdapter)) {
41
47
  return;
42
- } // Getting PreChat Survey Context
43
-
48
+ } // Redirecting if unauthenticated reconnect chat expired
44
49
 
45
- const parseToJson = false;
46
- const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
47
- const showPrechat = state.appStates.conversationState === _ConversationState.ConversationState.ProactiveChat ? preChatSurveyResponse && state.appStates.proactiveChatStates.proactiveChatEnablePrechat : preChatSurveyResponse; // Getting reconnectId for authenticated chat
48
50
 
49
- const reconnectId = await (0, _reconnectChatHelper.getReconnectIdForAuthenticatedChat)(props, chatSDK);
51
+ if ((_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
52
+ var _props$reconnectChatP2, _props$reconnectChatP3;
50
53
 
51
- if (reconnectId) {
52
- dispatch({
53
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_RECONNECT_ID,
54
- payload: reconnectId
55
- });
56
- dispatch({
57
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
58
- payload: _ConversationState.ConversationState.ReconnectChat
59
- });
60
- } else if (showPrechat) {
61
- dispatch({
62
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
63
- payload: preChatSurveyResponse
64
- });
65
- dispatch({
66
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
67
- payload: _ConversationState.ConversationState.Prechat
68
- });
54
+ await (0, _reconnectChatHelper.handleRedirectUnauthenticatedReconnectChat)(chatSDK, dispatch, setAdapter, initStartChat, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, (_props$reconnectChatP3 = props.reconnectChatPaneProps) === null || _props$reconnectChatP3 === void 0 ? void 0 : _props$reconnectChatP3.redirectInSameWindow);
69
55
  } else {
70
- dispatch({
71
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
72
- payload: _ConversationState.ConversationState.Loading
73
- });
74
- await initStartChat(chatSDK, dispatch, setAdapter);
56
+ // Getting PreChat Survey Context
57
+ const parseToJson = false;
58
+ const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
59
+ const showPrechat = state.appStates.conversationState === _ConversationState.ConversationState.ProactiveChat ? preChatSurveyResponse && state.appStates.proactiveChatStates.proactiveChatEnablePrechat : preChatSurveyResponse; // Getting reconnectId for authenticated chat
60
+
61
+ const reconnectId = await (0, _reconnectChatHelper.getReconnectIdForAuthenticatedChat)(props, chatSDK);
62
+
63
+ if (reconnectId) {
64
+ dispatch({
65
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_RECONNECT_ID,
66
+ payload: reconnectId
67
+ });
68
+ dispatch({
69
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
70
+ payload: _ConversationState.ConversationState.ReconnectChat
71
+ });
72
+ } else if (showPrechat) {
73
+ dispatch({
74
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
75
+ payload: preChatSurveyResponse
76
+ });
77
+ dispatch({
78
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
79
+ payload: _ConversationState.ConversationState.Prechat
80
+ });
81
+ setCustomContextParams(props, state);
82
+ } else {
83
+ dispatch({
84
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
85
+ payload: _ConversationState.ConversationState.Loading
86
+ });
87
+ setCustomContextParams(props, state);
88
+ await initStartChat(chatSDK, dispatch, setAdapter);
89
+ }
75
90
  }
76
91
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
92
 
@@ -82,6 +97,21 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
82
97
  try {
83
98
  var _newAdapter$activity$, _TelemetryTimers$Widg;
84
99
 
100
+ let isStartChatSuccessful = false;
101
+
102
+ if (persistedState || params !== null && params !== void 0 && params.liveChatContext) {
103
+ var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4, _persistedState$domai5;
104
+
105
+ // Broadcasting limited cached chat details
106
+ _omnichannelChatComponents.BroadcastService.postMessage({
107
+ eventName: _TelemetryConstants.BroadcastEvent.ChatRetrievedFromCache,
108
+ payload: {
109
+ chatId: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai = persistedState.domainStates) === null || _persistedState$domai === void 0 ? void 0 : (_persistedState$domai2 = _persistedState$domai.liveChatContext) === null || _persistedState$domai2 === void 0 ? void 0 : (_persistedState$domai3 = _persistedState$domai2.chatToken) === null || _persistedState$domai3 === void 0 ? void 0 : _persistedState$domai3.chatId,
110
+ requestId: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai4 = persistedState.domainStates) === null || _persistedState$domai4 === void 0 ? void 0 : (_persistedState$domai5 = _persistedState$domai4.liveChatContext) === null || _persistedState$domai5 === void 0 ? void 0 : _persistedState$domai5.requestId
111
+ }
112
+ });
113
+ }
114
+
85
115
  try {
86
116
  _TelemetryManager.TelemetryTimers.WidgetLoadTimer = (0, _utils.createTimer)();
87
117
 
@@ -89,7 +119,9 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
89
119
  Event: _TelemetryConstants.TelemetryEvent.StartChatSDKCall
90
120
  });
91
121
 
92
- await chatSDK.startChat(params);
122
+ optionalParams = Object.assign({}, params, optionalParams);
123
+ await chatSDK.startChat(optionalParams);
124
+ isStartChatSuccessful = true;
93
125
  } catch (error) {
94
126
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
95
127
  Event: _TelemetryConstants.TelemetryEvent.StartChatMethodException,
@@ -97,6 +129,8 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
97
129
  exception: `Failed to setup startChat: ${error}`
98
130
  }
99
131
  });
132
+
133
+ isStartChatSuccessful = false;
100
134
  }
101
135
 
102
136
  const newAdapter = await (0, _createAdapter.createAdapter)(chatSDK);
@@ -124,10 +158,12 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
124
158
  await (0, _setPostChatContextAndLoadSurvey.setPostChatContextAndLoadSurvey)(chatSDK, dispatch);
125
159
  await (0, _updateSessionDataForTelemetry.updateSessionDataForTelemetry)(chatSDK, dispatch); // Set app state to Active
126
160
 
127
- dispatch({
128
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
129
- payload: _ConversationState.ConversationState.Active
130
- });
161
+ if (isStartChatSuccessful) {
162
+ dispatch({
163
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
164
+ payload: _ConversationState.ConversationState.Active
165
+ });
166
+ }
131
167
  } else {
132
168
  dispatch({
133
169
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_WIDGET_STATE,
@@ -169,24 +205,36 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
169
205
  exports.initStartChat = initStartChat;
170
206
 
171
207
  const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
172
- var _DataStoreManager$cli, _persistedState$domai;
208
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _DataStoreManager$cli, _persistedState$domai6;
173
209
 
174
- const widgetStateFromCache = (_DataStoreManager$cli = _DataStoreManager.DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(_Constants.Constants.widgetStateDataKey, "localStorage");
210
+ const widgetStateEventName = (0, _utils.getWidgetCacheId)((chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC === void 0 ? void 0 : _chatSDK$omnichannelC.orgId) ?? "", (chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.widgetId) ?? "");
211
+ const widgetStateFromCache = (_DataStoreManager$cli = _DataStoreManager.DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(widgetStateEventName, "localStorage");
175
212
  const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
176
213
 
177
- if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai = persistedState.domainStates) !== null && _persistedState$domai !== void 0 && _persistedState$domai.liveChatContext) {
178
- var _persistedState$domai2;
214
+ if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai6 = persistedState.domainStates) !== null && _persistedState$domai6 !== void 0 && _persistedState$domai6.liveChatContext) {
215
+ var _persistedState$domai7;
179
216
 
180
217
  dispatch({
181
218
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
182
219
  payload: _ConversationState.ConversationState.Loading
183
220
  });
184
221
  const optionalParams = {
185
- liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai2 = persistedState.domainStates) === null || _persistedState$domai2 === void 0 ? void 0 : _persistedState$domai2.liveChatContext
222
+ liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai7 = persistedState.domainStates) === null || _persistedState$domai7 === void 0 ? void 0 : _persistedState$domai7.liveChatContext
186
223
  };
187
224
  await initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
188
225
  return true;
189
226
  } else {
190
227
  return false;
191
228
  }
229
+ };
230
+
231
+ const setCustomContextParams = (props, state) => {
232
+ var _props$chatConfig, _state$domainStates;
233
+
234
+ // Add custom context if any only for unauthenticated chat
235
+ if (!((_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && _props$chatConfig.LiveChatConfigAuthSettings) && (_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.customContext) {
236
+ optionalParams = Object.assign({}, optionalParams, {
237
+ customContext: state.domainStates.customContext
238
+ });
239
+ }
192
240
  };
@@ -98,7 +98,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
98
98
  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); }
99
99
 
100
100
  const LiveChatWidgetStateful = props => {
101
- 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$controlProps12, _props$controlProps13, _props$componentOverr7, _props$controlProps14, _props$componentOverr8, _props$controlProps15, _props$componentOverr9, _props$componentOverr10, _props$componentOverr11;
101
+ 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;
102
102
 
103
103
  const [state, dispatch] = (0, _useChatContextStore.default)(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
104
104
 
@@ -107,12 +107,14 @@ const LiveChatWidgetStateful = props => {
107
107
  ...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.webChatStyles)
108
108
  }); // eslint-disable-next-line @typescript-eslint/no-explicit-any
109
109
 
110
- const chatSDK = (0, _useChatSDKStore.default)();
110
+ const chatSDK = (0, _useChatSDKStore.default)(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
111
+
111
112
  const [voiceVideoCallingSDK, setVoiceVideoCallingSDK] = (0, _react2.useState)(undefined);
112
113
  const {
113
114
  Composer
114
115
  } = _botframeworkWebchat.Components;
115
- const canStartProactiveChat = (0, _react2.useRef)(true); // Process general styles
116
+ const canStartProactiveChat = (0, _react2.useRef)(true);
117
+ const canEndChat = (0, _react2.useRef)(true); // Process general styles
116
118
 
117
119
  const generalStyles = {
118
120
  root: Object.assign({}, (0, _getGeneralStylesForButton.getGeneralStylesForButton)(state), (_props$styleProps = props.styleProps) === null || _props$styleProps === void 0 ? void 0 : _props$styleProps.generalStyles)
@@ -134,6 +136,10 @@ const LiveChatWidgetStateful = props => {
134
136
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_SKIP_CHAT_BUTTON_RENDERING,
135
137
  payload: ((_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.skipChatButtonRendering) || false
136
138
  });
139
+ dispatch({
140
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_E2VV_ENABLED,
141
+ payload: false
142
+ });
137
143
  (0, _initCallingSdk.initCallingSdk)(chatSDK, setVoiceVideoCallingSDK).then(sdkCreated => {
138
144
  sdkCreated && dispatch({
139
145
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_E2VV_ENABLED,
@@ -144,7 +150,7 @@ const LiveChatWidgetStateful = props => {
144
150
  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) {
145
151
  var _props$reconnectChatP2;
146
152
 
147
- (0, _reconnectChatHelper.handleUnauthenticatedReconnectChat)(dispatch, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, _startChat.initStartChat);
153
+ (0, _reconnectChatHelper.startUnauthenticatedReconnectChat)(chatSDK, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, _startChat.initStartChat);
148
154
  } // Initialize global dir
149
155
 
150
156
 
@@ -154,13 +160,11 @@ const LiveChatWidgetStateful = props => {
154
160
  payload: globalDir
155
161
  });
156
162
 
157
- if ((_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.chatToken) {
163
+ if ((_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.liveChatContext) {
158
164
  var _state$domainStates2;
159
165
 
160
166
  const optionalParams = {
161
- liveChatContext: {
162
- chatToken: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.chatToken
163
- }
167
+ liveChatContext: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.liveChatContext
164
168
  };
165
169
  (0, _startChat.initStartChat)(chatSDK, dispatch, setAdapter, optionalParams);
166
170
  }
@@ -170,9 +174,9 @@ const LiveChatWidgetStateful = props => {
170
174
  var _props$reconnectChatP3;
171
175
 
172
176
  if ((_props$reconnectChatP3 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP3 !== void 0 && _props$reconnectChatP3.reconnectId && !state.appStates.reconnectId) {
173
- var _props$reconnectChatP4;
177
+ var _props$reconnectChatP4, _props$reconnectChatP5;
174
178
 
175
- (0, _reconnectChatHelper.handleUnauthenticatedReconnectChat)(dispatch, (_props$reconnectChatP4 = props.reconnectChatPaneProps) === null || _props$reconnectChatP4 === void 0 ? void 0 : _props$reconnectChatP4.reconnectId, _startChat.initStartChat);
179
+ (0, _reconnectChatHelper.handleUnauthenticatedReconnectChat)(chatSDK, dispatch, setAdapter, (_props$reconnectChatP4 = props.reconnectChatPaneProps) === null || _props$reconnectChatP4 === void 0 ? void 0 : _props$reconnectChatP4.reconnectId, _startChat.initStartChat, (_props$reconnectChatP5 = props.reconnectChatPaneProps) === null || _props$reconnectChatP5 === void 0 ? void 0 : _props$reconnectChatP5.redirectInSameWindow);
176
180
  } else {
177
181
  (0, _reconnectChatHelper.getReconnectIdForAuthenticatedChat)(props, chatSDK).then(authReconnectId => {
178
182
  if (authReconnectId && !state.appStates.reconnectId) {
@@ -185,6 +189,12 @@ const LiveChatWidgetStateful = props => {
185
189
  payload: _ConversationState.ConversationState.ReconnectChat
186
190
  });
187
191
  } else {
192
+ const chatStartedSkippingChatButtonRendering = {
193
+ eventName: _TelemetryConstants.BroadcastEvent.StartChatSkippingChatButtonRendering
194
+ };
195
+
196
+ _omnichannelChatComponents.BroadcastService.postMessage(chatStartedSkippingChatButtonRendering);
197
+
188
198
  dispatch({
189
199
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
190
200
  payload: _ConversationState.ConversationState.Loading
@@ -196,7 +206,22 @@ const LiveChatWidgetStateful = props => {
196
206
  }
197
207
  }, [state.appStates.skipChatButtonRendering]);
198
208
  (0, _react2.useEffect)(() => {
199
- _omnichannelChatComponents.BroadcastService.getMessageByEventName("StartProactiveChat").subscribe(msg => {
209
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2;
210
+
211
+ // Add the custom context on receiving the SetCustomContext event
212
+ _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.SetCustomContext).subscribe(msg => {
213
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
214
+ Event: _TelemetryConstants.TelemetryEvent.CustomContextReceived,
215
+ Description: "CustomContext received."
216
+ });
217
+
218
+ dispatch({
219
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CUSTOM_CONTEXT,
220
+ payload: msg === null || msg === void 0 ? void 0 : msg.payload
221
+ });
222
+ });
223
+
224
+ _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.StartProactiveChat).subscribe(msg => {
200
225
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
201
226
  Event: _TelemetryConstants.TelemetryEvent.StartProactiveChatEventReceived,
202
227
  Description: "Start proactive chat event received."
@@ -212,9 +237,67 @@ const LiveChatWidgetStateful = props => {
212
237
  Description: "Start proactive chat method called, when chat was already triggered."
213
238
  });
214
239
  }
215
- });
240
+ }); // start chat from SDK Event
241
+
242
+
243
+ _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.StartChat).subscribe(() => {
244
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
245
+ Event: _TelemetryConstants.TelemetryEvent.StartChatEventRecevied,
246
+ Description: "Start chat event received."
247
+ });
248
+
249
+ if (state.appStates.isMinimized) {
250
+ dispatch({
251
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_MINIMIZED,
252
+ payload: false
253
+ });
254
+ } else {
255
+ (0, _startChat.prepareStartChat)(props, chatSDK, state, dispatch, setAdapter);
256
+ }
257
+ }); // end chat from SDK Event
258
+
259
+
260
+ _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.EndChat).subscribe(async () => {
261
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
262
+ Event: _TelemetryConstants.TelemetryEvent.EndChatEventReceived,
263
+ Description: "End chat event received."
264
+ });
265
+
266
+ if (canEndChat.current) {
267
+ (0, _endChat.prepareEndChat)(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
268
+ } else {
269
+ const skipEndChatSDK = true;
270
+ const skipCloseChat = false;
271
+ (0, _endChat.endChat)(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
272
+ }
273
+ }); // reset proactive chat params
274
+
275
+
276
+ _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.ResetProactiveChatParams).subscribe(async () => {
277
+ dispatch({
278
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
279
+ payload: {
280
+ proactiveChatBodyTitle: "",
281
+ proactiveChatEnablePrechat: false,
282
+ proactiveChatInNewWindow: false
283
+ }
284
+ });
285
+ }); // Listen to end chat event from other tabs
286
+
287
+
288
+ const endChatEventName = (0, _utils.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);
289
+
290
+ _omnichannelChatComponents.BroadcastService.getMessageByEventName(endChatEventName).subscribe(async () => {
291
+ (0, _endChat.endChat)(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
292
+ }); // Close popout window
293
+
216
294
 
217
295
  window.addEventListener("beforeunload", () => {
296
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
297
+ Event: _TelemetryConstants.TelemetryEvent.WindowClosed,
298
+ Description: "Closed window."
299
+ });
300
+
218
301
  (0, _disposeTelemetryLoggers.disposeTelemetryLoggers)();
219
302
  });
220
303
 
@@ -223,7 +306,7 @@ const LiveChatWidgetStateful = props => {
223
306
  }
224
307
  }, []);
225
308
  (0, _react2.useEffect)(() => {
226
- canStartProactiveChat.current = state.appStates.conversationState === _ConversationState.ConversationState.Closed;
309
+ canEndChat.current = state.appStates.conversationState === _ConversationState.ConversationState.Active;
227
310
 
228
311
  if (state.appStates.conversationState === _ConversationState.ConversationState.Active) {
229
312
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
@@ -243,7 +326,10 @@ const LiveChatWidgetStateful = props => {
243
326
  });
244
327
  });
245
328
  }
246
- }, [state.appStates.conversationState]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
329
+ }, [state.appStates.conversationState]);
330
+ (0, _react2.useEffect)(() => {
331
+ canStartProactiveChat.current = state.appStates.conversationState === _ConversationState.ConversationState.Closed && !state.appStates.proactiveChatStates.proactiveChatInNewWindow;
332
+ }, [state.appStates.conversationState, state.appStates.proactiveChatStates.proactiveChatInNewWindow]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
247
333
 
248
334
  (0, _react2.useEffect)(() => {
249
335
  currentMessageCountRef.current = -1;
@@ -283,7 +369,10 @@ const LiveChatWidgetStateful = props => {
283
369
  const setPostChatContextRelay = () => (0, _setPostChatContextAndLoadSurvey.setPostChatContextAndLoadSurvey)(chatSDK, dispatch); // eslint-disable-next-line @typescript-eslint/no-explicit-any
284
370
 
285
371
 
286
- const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat) => (0, _endChat.endChat)(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
372
+ const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat) => (0, _endChat.endChat)(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat); // eslint-disable-next-line @typescript-eslint/no-explicit-any
373
+
374
+
375
+ const prepareEndChatRelay = (adapter, state) => (0, _endChat.prepareEndChat)(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
287
376
 
288
377
  const prepareStartChatRelay = () => (0, _startChat.prepareStartChat)(props, chatSDK, state, dispatch, setAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
289
378
 
@@ -293,8 +382,11 @@ const LiveChatWidgetStateful = props => {
293
382
  const confirmationPaneProps = (0, _initConfirmationPropsComposer.initConfirmationPropsComposer)(props); // publish chat widget state
294
383
 
295
384
  (0, _react2.useEffect)(() => {
385
+ var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic;
386
+
387
+ const widgetStateEventName = (0, _utils.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);
296
388
  const chatWidgetStateChangeEvent = {
297
- eventName: _TelemetryConstants.BroadcastEvent.ChatWidgetStateChanged,
389
+ eventName: widgetStateEventName,
298
390
  payload: { ...state
299
391
  }
300
392
  };
@@ -322,15 +414,15 @@ const LiveChatWidgetStateful = props => {
322
414
  })), !((_props$controlProps8 = props.controlProps) !== null && _props$controlProps8 !== void 0 && _props$controlProps8.hideLoadingPane) && (0, _componentController.shouldShowLoadingPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr4 = props.componentOverrides) === null || _props$componentOverr4 === void 0 ? void 0 : _props$componentOverr4.loadingPane) || /*#__PURE__*/_react2.default.createElement(_LoadingPaneStateful.default, props.loadingPaneProps)), !((_props$controlProps9 = props.controlProps) !== null && _props$controlProps9 !== void 0 && _props$controlProps9.hideOutOfOfficeHoursPane) && (0, _componentController.shouldShowOutOfOfficeHoursPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr5 = props.componentOverrides) === null || _props$componentOverr5 === void 0 ? void 0 : _props$componentOverr5.outOfOfficeHoursPane) || /*#__PURE__*/_react2.default.createElement(_OOOHPaneStateful.default, props.outOfOfficeHoursPaneProps)), !((_props$controlProps10 = props.controlProps) !== null && _props$controlProps10 !== void 0 && _props$controlProps10.hideReconnectChatPane) && (0, _componentController.shouldShowReconnectChatPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr6 = props.componentOverrides) === null || _props$componentOverr6 === void 0 ? void 0 : _props$componentOverr6.reconnectChatPane) || /*#__PURE__*/_react2.default.createElement(_ReconnectChatPaneStateful.default, {
323
415
  reconnectChatProps: props.reconnectChatPaneProps,
324
416
  initStartChat: initStartChatRelay
325
- })), !((_props$controlProps11 = props.controlProps) !== null && _props$controlProps11 !== void 0 && _props$controlProps11.hidePreChatSurveyPane) && (0, _componentController.shouldShowPreChatSurveyPane)(state) && /*#__PURE__*/_react2.default.createElement(_PreChatSurveyPaneStateful.default, {
417
+ })), !((_props$controlProps11 = props.controlProps) !== null && _props$controlProps11 !== void 0 && _props$controlProps11.hidePreChatSurveyPane) && (0, _componentController.shouldShowPreChatSurveyPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.preChatSurveyPane) || /*#__PURE__*/_react2.default.createElement(_PreChatSurveyPaneStateful.default, {
326
418
  surveyProps: props.preChatSurveyPaneProps,
327
419
  initStartChat: initStartChatRelay
328
- }), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && (0, _componentController.shouldShowCallingContainer)(state) && /*#__PURE__*/_react2.default.createElement(_CallingContainerStateful.default, _extends({
420
+ })), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && (0, _componentController.shouldShowCallingContainer)(state) && /*#__PURE__*/_react2.default.createElement(_CallingContainerStateful.default, _extends({
329
421
  voiceVideoCallingSdk: voiceVideoCallingSDK
330
- }, props.callingContainerProps)), !((_props$controlProps13 = props.controlProps) !== null && _props$controlProps13 !== void 0 && _props$controlProps13.hideWebChatContainer) && (0, _componentController.shouldShowWebChatContainer)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.webChatContainer) || /*#__PURE__*/_react2.default.createElement(_WebChatContainerStateful.default, props.webChatContainerProps)), !((_props$controlProps14 = props.controlProps) !== null && _props$controlProps14 !== void 0 && _props$controlProps14.hideConfirmationPane) && (0, _componentController.shouldShowConfirmationPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr8 = props.componentOverrides) === null || _props$componentOverr8 === void 0 ? void 0 : _props$componentOverr8.confirmationPane) || /*#__PURE__*/_react2.default.createElement(_ConfirmationPaneStateful.default, _extends({}, confirmationPaneProps, {
422
+ }, props.callingContainerProps)), !((_props$controlProps13 = props.controlProps) !== null && _props$controlProps13 !== void 0 && _props$controlProps13.hideWebChatContainer) && (0, _componentController.shouldShowWebChatContainer)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr8 = props.componentOverrides) === null || _props$componentOverr8 === void 0 ? void 0 : _props$componentOverr8.webChatContainer) || /*#__PURE__*/_react2.default.createElement(_WebChatContainerStateful.default, props.webChatContainerProps)), !((_props$controlProps14 = props.controlProps) !== null && _props$controlProps14 !== void 0 && _props$controlProps14.hideConfirmationPane) && (0, _componentController.shouldShowConfirmationPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.confirmationPane) || /*#__PURE__*/_react2.default.createElement(_ConfirmationPaneStateful.default, _extends({}, confirmationPaneProps, {
331
423
  setPostChatContext: setPostChatContextRelay,
332
- endChat: endChatRelay
333
- }))), !((_props$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.hidePostChatLoadingPane) && (0, _componentController.shouldShowPostChatLoadingPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.postChatLoadingPane) || /*#__PURE__*/_react2.default.createElement(_PostChatLoadingPaneStateful.default, props.postChatLoadingPaneProps)), (0, _componentController.shouldShowPostChatSurveyPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr10 = props.componentOverrides) === null || _props$componentOverr10 === void 0 ? void 0 : _props$componentOverr10.postChatSurveyPane) || /*#__PURE__*/_react2.default.createElement(_PostChatSurveyPaneStateful.default, _extends({}, props.postChatSurveyPaneProps, props.chatSDK))), (0, _createFooter.createFooter)(props, state), (0, _componentController.shouldShowEmailTranscriptPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr11 = props.componentOverrides) === null || _props$componentOverr11 === void 0 ? void 0 : _props$componentOverr11.emailTranscriptPane) || /*#__PURE__*/_react2.default.createElement(_EmailTranscriptPaneStateful.default, props.emailTranscriptPane))));
424
+ prepareEndChat: prepareEndChatRelay
425
+ }))), !((_props$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.hidePostChatLoadingPane) && (0, _componentController.shouldShowPostChatLoadingPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr10 = props.componentOverrides) === null || _props$componentOverr10 === void 0 ? void 0 : _props$componentOverr10.postChatLoadingPane) || /*#__PURE__*/_react2.default.createElement(_PostChatLoadingPaneStateful.default, props.postChatLoadingPaneProps)), (0, _componentController.shouldShowPostChatSurveyPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr11 = props.componentOverrides) === null || _props$componentOverr11 === void 0 ? void 0 : _props$componentOverr11.postChatSurveyPane) || /*#__PURE__*/_react2.default.createElement(_PostChatSurveyPaneStateful.default, _extends({}, props.postChatSurveyPaneProps, props.chatSDK))), (0, _createFooter.createFooter)(props, state), (0, _componentController.shouldShowEmailTranscriptPane)(state) && ((0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr12 = props.componentOverrides) === null || _props$componentOverr12 === void 0 ? void 0 : _props$componentOverr12.emailTranscriptPane) || /*#__PURE__*/_react2.default.createElement(_EmailTranscriptPaneStateful.default, props.emailTranscriptPane))));
334
426
  };
335
427
 
336
428
  exports.LiveChatWidgetStateful = LiveChatWidgetStateful;
@@ -15,6 +15,10 @@ var _utils = require("../../common/utils");
15
15
 
16
16
  var _useChatContextStore = _interopRequireDefault(require("../../hooks/useChatContextStore"));
17
17
 
18
+ var _TelemetryHelper = require("../../common/telemetry/TelemetryHelper");
19
+
20
+ var _TelemetryConstants = require("../../common/telemetry/TelemetryConstants");
21
+
18
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
23
 
20
24
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -46,6 +50,10 @@ const PostChatLoadingPaneStateful = props => {
46
50
  if (firstElement && firstElement[0]) {
47
51
  firstElement[0].focus();
48
52
  }
53
+
54
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
55
+ Event: _TelemetryConstants.TelemetryEvent.PostChatSurveyLoadingPaneLoaded
56
+ });
49
57
  }, []);
50
58
  return /*#__PURE__*/_react.default.createElement(_omnichannelChatComponents.LoadingPane, {
51
59
  componentOverrides: props.componentOverrides,
@@ -93,9 +93,10 @@ const PreChatSurveyPaneStateful = props => {
93
93
  });
94
94
 
95
95
  try {
96
- var _DataStoreManager$cli, _persistedState$domai;
96
+ var _state$domainStates, _state$domainStates$t, _state$domainStates$t2, _DataStoreManager$cli, _persistedState$domai;
97
97
 
98
- const widgetStateFromCache = (_DataStoreManager$cli = _DataStoreManager.DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(_Constants.Constants.widgetStateDataKey, "localStorage");
98
+ const widgetStateCacheId = (0, _utils.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) ?? "");
99
+ const widgetStateFromCache = (_DataStoreManager$cli = _DataStoreManager.DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(widgetStateCacheId, "localStorage");
99
100
  const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
100
101
  let optionalParams = {};
101
102
 
@@ -109,9 +110,7 @@ const PreChatSurveyPaneStateful = props => {
109
110
  } else {
110
111
  const prechatResponseValues = (0, _utils.extractPreChatSurveyResponseValues)(state.domainStates.preChatSurveyResponse, values);
111
112
  optionalParams = {
112
- initContext: {
113
- preChatResponse: prechatResponseValues
114
- }
113
+ preChatResponse: prechatResponseValues
115
114
  };
116
115
  setPreChatResponseEmail(values);
117
116
  await initStartChat(optionalParams);
@@ -46,6 +46,14 @@ const ProactiveChatPaneStateful = props => {
46
46
  const handleProactiveChatInviteTimeout = () => {
47
47
  if (!timeoutRemoved) {
48
48
  setTimeoutRemoved(true);
49
+ dispatch({
50
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
51
+ payload: {
52
+ proactiveChatBodyTitle: "",
53
+ proactiveChatEnablePrechat: false,
54
+ proactiveChatInNewWindow: false
55
+ }
56
+ });
49
57
  dispatch({
50
58
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
51
59
  payload: _ConversationState.ConversationState.Closed
@@ -111,6 +119,14 @@ const ProactiveChatPaneStateful = props => {
111
119
  Description: "Proactive chat closed."
112
120
  });
113
121
 
122
+ dispatch({
123
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
124
+ payload: {
125
+ proactiveChatBodyTitle: "",
126
+ proactiveChatEnablePrechat: false,
127
+ proactiveChatInNewWindow: false
128
+ }
129
+ });
114
130
  dispatch({
115
131
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
116
132
  payload: _ConversationState.ConversationState.Closed
@@ -25,15 +25,53 @@ var _utils = require("../../common/utils");
25
25
 
26
26
  var _ = require("../..");
27
27
 
28
+ var _WebChatActionType = require("./webchatcontroller/enums/WebChatActionType");
29
+
30
+ var _WebChatStoreLoader = require("./webchatcontroller/WebChatStoreLoader");
31
+
32
+ var _Constants = require("../../common/Constants");
33
+
34
+ var _BotMagicCodeStore = require("./webchatcontroller/BotMagicCodeStore");
35
+
28
36
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
37
 
30
38
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
39
 
40
+ const broadcastChannelMessageEvent = "message";
41
+
42
+ const postActivity = activity => {
43
+ // eslint-disable-line @typescript-eslint/no-explicit-any
44
+ return {
45
+ type: _WebChatActionType.WebChatActionType.DIRECT_LINE_POST_ACTIVITY,
46
+ meta: {
47
+ method: "keyboard"
48
+ },
49
+ payload: {
50
+ activity: {
51
+ channelData: undefined,
52
+ text: "",
53
+ textFormat: "plain",
54
+ type: _Constants.Constants.message,
55
+ ...activity
56
+ }
57
+ }
58
+ };
59
+ };
60
+
61
+ const createMagicCodeSuccessResponse = signin => {
62
+ return {
63
+ signin,
64
+ result: "Success"
65
+ };
66
+ };
67
+
32
68
  const WebChatContainerStateful = props => {
33
69
  const {
34
70
  BasicWebChat
35
71
  } = _botframeworkWebchat.Components;
36
72
  const [state, dispatch] = (0, _.useChatContextStore)();
73
+ const magicCodeBroadcastChannel = new BroadcastChannel(_Constants.Constants.magicCodeBroadcastChannel);
74
+ const magicCodeResponseBroadcastChannel = new BroadcastChannel(_Constants.Constants.magicCodeResponseBroadcastChannel);
37
75
  const containerStyles = {
38
76
  root: Object.assign({}, _defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.containerStyles, props === null || props === void 0 ? void 0 : props.containerStyles, {
39
77
  display: state.appStates.isMinimized ? "none" : ""
@@ -58,6 +96,48 @@ const WebChatContainerStateful = props => {
58
96
  Event: _TelemetryConstants.TelemetryEvent.WebChatLoaded
59
97
  });
60
98
  }, []);
99
+ (0, _react2.useEffect)(() => {
100
+ const eventListener = event => {
101
+ // eslint-disable-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-empty-function
102
+ const {
103
+ data
104
+ } = event;
105
+
106
+ if (_BotMagicCodeStore.BotMagicCodeStore.botOAuthSignInId === data.signin) {
107
+ const {
108
+ signin,
109
+ code
110
+ } = data;
111
+ const text = `${code}`;
112
+ const action = postActivity({
113
+ text,
114
+ channelData: {
115
+ tags: [_Constants.Constants.hiddenTag]
116
+ }
117
+ });
118
+
119
+ _WebChatStoreLoader.WebChatStoreLoader.store.dispatch(action);
120
+
121
+ const response = createMagicCodeSuccessResponse(signin);
122
+ magicCodeResponseBroadcastChannel.postMessage(response);
123
+
124
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
125
+ Event: _TelemetryConstants.TelemetryEvent.SuppressBotMagicCodeSucceeded
126
+ });
127
+
128
+ _BotMagicCodeStore.BotMagicCodeStore.botOAuthSignInId = "";
129
+ magicCodeBroadcastChannel.close();
130
+ magicCodeResponseBroadcastChannel.close();
131
+ } else {
132
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
133
+ Event: _TelemetryConstants.TelemetryEvent.SuppressBotMagicCodeFailed,
134
+ Description: "Signin does not match"
135
+ });
136
+ }
137
+ };
138
+
139
+ magicCodeBroadcastChannel.addEventListener(broadcastChannelMessageEvent, eventListener);
140
+ }, []);
61
141
  return /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, /*#__PURE__*/_react2.default.createElement("style", null, `
62
142
  .ms_lcw_webchat_received_message img.webchat__markdown__external-link-icon {
63
143
  background-image : url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIzIDMgMTggMTgiICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik03LjI1MDEgNC41MDAxN0gxMC43NDk1QzExLjE2MzcgNC41MDAxNyAxMS40OTk1IDQuODM1OTYgMTEuNDk5NSA1LjI1MDE3QzExLjQ5OTUgNS42Mjk4NiAxMS4yMTczIDUuOTQzNjYgMTAuODUxMyA1Ljk5MzMyTDEwLjc0OTUgNi4wMDAxN0g3LjI0OTc0QzYuMDcwNzkgNS45OTk2MSA1LjEwMzQ5IDYuOTA2NTYgNS4wMDc4NiA4LjA2MTEyTDUuMDAwMjggOC4yMjAwM0w1LjAwMzEyIDE2Ljc1MDdDNS4wMDM0MyAxNy45NDE1IDUuOTI4ODUgMTguOTE2MSA3LjA5OTY2IDE4Ljk5NDlMNy4yNTM3MSAxOS4wMDAxTDE1Ljc1MTggMTguOTg4NEMxNi45NDE1IDE4Ljk4NjggMTcuOTE0NSAxOC4wNjIgMTcuOTkzNSAxNi44OTIzTDE3Ljk5ODcgMTYuNzM4NFYxMy4yMzIxQzE3Ljk5ODcgMTIuODE3OSAxOC4zMzQ1IDEyLjQ4MjEgMTguNzQ4NyAxMi40ODIxQzE5LjEyODQgMTIuNDgyMSAxOS40NDIyIDEyLjc2NDMgMTkuNDkxOCAxMy4xMzAzTDE5LjQ5ODcgMTMuMjMyMVYxNi43Mzg0QzE5LjQ5ODcgMTguNzQwNyAxNy45MjkzIDIwLjM3NjkgMTUuOTUyOCAyMC40ODI5TDE1Ljc1MzggMjAuNDg4NEw3LjI1ODI3IDIwLjUwMDFMNy4wNTQ5NSAyMC40OTQ5QzUuMTQyMzkgMjAuMzk1NCAzLjYwODk1IDE4Ljg2MjcgMy41MDgzNyAxNi45NTAyTDMuNTAzMTIgMTYuNzUxMUwzLjUwMDg5IDguMjUyN0wzLjUwNTI5IDguMDUwMkMzLjYwNTM5IDYuMTM3NDkgNS4xMzg2NyA0LjYwNDQ5IDcuMDUwOTYgNC41MDUyN0w3LjI1MDEgNC41MDAxN0gxMC43NDk1SDcuMjUwMVpNMTMuNzQ4MSAzLjAwMTQ2TDIwLjMwMTggMy4wMDE5N0wyMC40MDE0IDMuMDE1NzVMMjAuNTAyMiAzLjA0MzkzTDIwLjU1OSAzLjA2ODAzQzIwLjYxMjIgMy4wOTEyMiAyMC42NjM0IDMuMTIxNjMgMjAuNzExMSAzLjE1ODg1TDIwLjc4MDQgMy4yMjE1NkwyMC44NjQxIDMuMzIwMTRMMjAuOTE4MyAzLjQxMDI1TDIwLjk1NyAzLjUwMDU3TDIwLjk3NjIgMy41NjQ3NkwyMC45ODk4IDMuNjI4NjJMMjAuOTk5MiAzLjcyMjgyTDIwLjk5OTcgMTAuMjU1NEMyMC45OTk3IDEwLjY2OTYgMjAuNjYzOSAxMS4wMDU0IDIwLjI0OTcgMTEuMDA1NEMxOS44NyAxMS4wMDU0IDE5LjU1NjIgMTAuNzIzMiAxOS41MDY1IDEwLjM1NzFMMTkuNDk5NyAxMC4yNTU0TDE5LjQ5ODkgNS41NjE0N0wxMi4yNzk3IDEyLjc4NDdDMTIuMDEzNCAxMy4wNTEgMTEuNTk2OCAxMy4wNzUzIDExLjMwMzEgMTIuODU3NUwxMS4yMTkgMTIuNzg0OUMxMC45NTI3IDEyLjUxODcgMTAuOTI4NCAxMi4xMDIxIDExLjE0NjIgMTEuODA4NEwxMS4yMTg4IDExLjcyNDNMMTguNDM2OSA0LjUwMTQ2SDEzLjc0ODFDMTMuMzY4NCA0LjUwMTQ2IDEzLjA1NDYgNC4yMTkzMSAxMy4wMDUgMy44NTMyNEwxMi45OTgxIDMuNzUxNDZDMTIuOTk4MSAzLjM3MTc3IDEzLjI4MDMgMy4wNTc5NyAxMy42NDY0IDMuMDA4MzFMMTMuNzQ4MSAzLjAwMTQ2WiIgZmlsbD0iI0ZGRkZGRiIgLz48L3N2Zz4) !important;