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

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 (49) hide show
  1. package/lib/cjs/common/Constants.js +2 -2
  2. package/lib/cjs/common/telemetry/TelemetryConstants.js +6 -1
  3. package/lib/cjs/common/telemetry/TelemetryManager.js +7 -1
  4. package/lib/cjs/common/telemetry/loggers/ariaTelemetryLogger.js +8 -9
  5. package/lib/cjs/common/telemetry/loggers/consoleLogger.js +6 -5
  6. package/lib/cjs/common/utils.js +17 -2
  7. package/lib/cjs/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  8. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +1 -1
  9. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +1 -1
  10. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +0 -12
  11. package/lib/cjs/components/livechatwidget/common/endChat.js +27 -12
  12. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +4 -0
  13. package/lib/cjs/components/livechatwidget/common/startChat.js +49 -10
  14. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +32 -2
  15. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +4 -5
  16. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +1 -0
  17. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +22 -21
  18. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +2 -1
  19. package/lib/cjs/contexts/createReducer.js +8 -0
  20. package/lib/cjs/plugins/newMessageEventHandler.js +10 -13
  21. package/lib/esm/common/Constants.js +2 -2
  22. package/lib/esm/common/telemetry/TelemetryConstants.js +6 -1
  23. package/lib/esm/common/telemetry/TelemetryManager.js +6 -1
  24. package/lib/esm/common/telemetry/loggers/ariaTelemetryLogger.js +8 -6
  25. package/lib/esm/common/telemetry/loggers/consoleLogger.js +6 -5
  26. package/lib/esm/common/utils.js +8 -0
  27. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  28. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +1 -1
  29. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +1 -1
  30. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +0 -12
  31. package/lib/esm/components/livechatwidget/common/endChat.js +24 -13
  32. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +4 -0
  33. package/lib/esm/components/livechatwidget/common/startChat.js +51 -14
  34. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +29 -3
  35. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +6 -7
  36. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +1 -0
  37. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +22 -21
  38. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +2 -1
  39. package/lib/esm/contexts/createReducer.js +8 -0
  40. package/lib/esm/plugins/newMessageEventHandler.js +10 -12
  41. package/lib/types/common/Constants.d.ts +1 -1
  42. package/lib/types/common/telemetry/TelemetryConstants.d.ts +6 -3
  43. package/lib/types/common/telemetry/TelemetryHelper.d.ts +1 -0
  44. package/lib/types/common/telemetry/definitions/Payload.d.ts +12 -9
  45. package/lib/types/common/utils.d.ts +2 -0
  46. package/lib/types/components/livechatwidget/common/endChat.d.ts +1 -1
  47. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
  48. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +22 -21
  49. package/package.json +2 -2
@@ -45,8 +45,6 @@ _defineProperty(Constants, "false", "false");
45
45
 
46
46
  _defineProperty(Constants, "maximumUnreadMessageCount", 99);
47
47
 
48
- _defineProperty(Constants, "widgetStateDataKey", "LcwChatWidgetState");
49
-
50
48
  _defineProperty(Constants, "channelIdKey", "ChannelId-");
51
49
 
52
50
  _defineProperty(Constants, "ChannelId", "lcw");
@@ -155,6 +153,8 @@ _defineProperty(Constants, "internetConnectionTestUrl", "https://ocsdk-prod.azur
155
153
 
156
154
  _defineProperty(Constants, "internetConnectionTestUrlText", "Omnichannel Connect Test");
157
155
 
156
+ _defineProperty(Constants, "ChatWidgetStateChangedPrefix", "ChatWidgetStateChanged");
157
+
158
158
  const Regex = (_class = class Regex {}, _defineProperty(_class, "EmailRegex", "(?:[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"), _class);
159
159
  exports.Regex = Regex;
160
160
 
@@ -40,7 +40,6 @@ exports.BroadcastEvent = BroadcastEvent;
40
40
  BroadcastEvent["EndChat"] = "ChatEnded";
41
41
  BroadcastEvent["NewMessageNotification"] = "NewMessageNotification";
42
42
  BroadcastEvent["UnreadMessageCount"] = "UnreadMessageCount";
43
- BroadcastEvent["ChatWidgetStateChanged"] = "ChatWidgetStateChanged";
44
43
  BroadcastEvent["ProactiveChatStartChat"] = "ProactiveChatStartChat";
45
44
  BroadcastEvent["ProactiveChatStartPopoutChat"] = "ProactiveChatStartPopoutChat";
46
45
  BroadcastEvent["InvalidAdaptiveCardFormat"] = "InvalidAdaptiveCardFormat";
@@ -49,6 +48,8 @@ exports.BroadcastEvent = BroadcastEvent;
49
48
  BroadcastEvent["RedirectPageRequest"] = "RedirectPageRequest";
50
49
  BroadcastEvent["StartChatSkippingChatButtonRendering"] = "StartChatSkippingChatButtonRendering";
51
50
  BroadcastEvent["StartUnauthenticatedReconnectChat"] = "StartUnauthenticatedReconnectChat";
51
+ BroadcastEvent["SetCustomContext"] = "SetCustomContext";
52
+ BroadcastEvent["ChatRetrievedFromCache"] = "ChatRetrievedFromCache";
52
53
  })(BroadcastEvent || (exports.BroadcastEvent = BroadcastEvent = {}));
53
54
 
54
55
  let TelemetryEvent;
@@ -152,6 +153,7 @@ exports.TelemetryEvent = TelemetryEvent;
152
153
  TelemetryEvent["ReconnectChatMinimize"] = "ReconnectChatMinimize";
153
154
  TelemetryEvent["MessageSent"] = "MessageSent";
154
155
  TelemetryEvent["MessageReceived"] = "MessageReceived";
156
+ TelemetryEvent["CustomContextReceived"] = "CustomContextReceived";
155
157
  })(TelemetryEvent || (exports.TelemetryEvent = TelemetryEvent = {}));
156
158
 
157
159
  class TelemetryConstants {
@@ -194,6 +196,9 @@ class TelemetryConstants {
194
196
  case TelemetryEvent.PreChatSurveyStartChatMethodFailed:
195
197
  case TelemetryEvent.HeaderCloseButtonClicked:
196
198
  case TelemetryEvent.HeaderMinimizeButtonClicked:
199
+ case TelemetryEvent.MessageSent:
200
+ case TelemetryEvent.MessageReceived:
201
+ case TelemetryEvent.CustomContextReceived:
197
202
  return ScenarioType.ACTIONS;
198
203
 
199
204
  case TelemetryEvent.StartChatSDKCall:
@@ -15,6 +15,8 @@ var _consoleLogger = require("./loggers/consoleLogger");
15
15
 
16
16
  var _defaultAriaConfig = require("./defaultConfigs/defaultAriaConfig");
17
17
 
18
+ var _TelemetryHelper = require("./TelemetryHelper");
19
+
18
20
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
19
21
 
20
22
  class TelemetryTimers {}
@@ -92,7 +94,11 @@ const RegisterLoggers = () => {
92
94
 
93
95
  const logLevel = telemetryEvent.logLevel ?? _TelemetryConstants.LogLevel.INFO;
94
96
  const scenarioType = ((_payload = telemetryEvent.payload) === null || _payload === void 0 ? void 0 : _payload.scenarioType) ?? _TelemetryConstants.ScenarioType.UNDEFINED;
95
- logger.log(logLevel, parseInput(telemetryEvent === null || telemetryEvent === void 0 ? void 0 : telemetryEvent.payload, scenarioType));
97
+ const telemetryInput = parseInput(telemetryEvent === null || telemetryEvent === void 0 ? void 0 : telemetryEvent.payload, scenarioType);
98
+ telemetryInput.telemetryInfo = {
99
+ telemetryInfo: _TelemetryHelper.TelemetryHelper.buildTelemetryEvent(logLevel, telemetryInput)
100
+ };
101
+ logger.log(logLevel, telemetryInput);
96
102
  });
97
103
  };
98
104
 
@@ -15,8 +15,6 @@ var _Enums = require("@microsoft/omnichannel-chat-sdk/lib/external/aria/common/E
15
15
 
16
16
  var _Constants = require("../../Constants");
17
17
 
18
- var _TelemetryHelper = require("../TelemetryHelper");
19
-
20
18
  var _TelemetryManager = require("../TelemetryManager");
21
19
 
22
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -67,18 +65,19 @@ const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, collectiorUr
67
65
  log: (logLevel, telemetryInput) => {
68
66
  try {
69
67
  let property;
68
+ const telemetryInfo = telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.telemetryInfo;
70
69
  const eventProperties = new _AWTEventProperties.default();
71
-
72
- const event = _TelemetryHelper.TelemetryHelper.buildTelemetryEvent(logLevel, telemetryInput);
73
-
74
70
  eventProperties.setName(telemetryInput.scenarioType);
75
71
 
76
- for (const key of Object.keys(event)) {
77
- property = typeof event[key] === "object" ? JSON.stringify(event[key]) : event[key];
78
- eventProperties.setProperty(key, property);
72
+ if (telemetryInfo) {
73
+ for (const key of Object.keys(telemetryInfo)) {
74
+ property = typeof telemetryInfo[key] === "object" ? JSON.stringify(telemetryInfo[key]) : telemetryInfo[key];
75
+ eventProperties.setProperty(key, property);
76
+ }
77
+
78
+ eventProperties.setPropertyWithPii(ariaTelemetryApplicationName, _Constants.Constants.LiveChatWidget, _Enums.AWTPiiKind.GenericData);
79
79
  }
80
80
 
81
- eventProperties.setPropertyWithPii(ariaTelemetryApplicationName, _Constants.Constants.LiveChatWidget, _Enums.AWTPiiKind.GenericData);
82
81
  logger() ? logger().logEvent(eventProperties) : console.log("Unable to initialize aria logger");
83
82
  } catch (error) {
84
83
  console.error("Error in logging telemetry to Aria logger:" + error);
@@ -13,27 +13,28 @@ const consoleLogger = () => {
13
13
  const consoleLogger = {
14
14
  log: (logLevel, telemetryInput) => {
15
15
  const payload = telemetryInput !== null && telemetryInput !== void 0 && telemetryInput.payload && Object.keys(telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.payload).length > 0 ? telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.payload : "";
16
+ const telemetryInfo = telemetryInput !== null && telemetryInput !== void 0 && telemetryInput.telemetryInfo && Object.keys(telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.telemetryInfo).length > 0 ? telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.telemetryInfo : "";
16
17
 
17
18
  try {
18
19
  switch (logLevel) {
19
20
  case _TelemetryConstants.LogLevel.INFO:
20
- console.info(_Constants.Constants.LiveChatWidget, payload);
21
+ console.info(_Constants.Constants.LiveChatWidget, payload, telemetryInfo);
21
22
  break;
22
23
 
23
24
  case _TelemetryConstants.LogLevel.DEBUG:
24
- console.debug(_Constants.Constants.LiveChatWidget, payload);
25
+ console.debug(_Constants.Constants.LiveChatWidget, payload, telemetryInfo);
25
26
  break;
26
27
 
27
28
  case _TelemetryConstants.LogLevel.WARN:
28
- console.warn(_Constants.Constants.LiveChatWidget, payload);
29
+ console.warn(_Constants.Constants.LiveChatWidget, payload, telemetryInfo);
29
30
  break;
30
31
 
31
32
  case _TelemetryConstants.LogLevel.ERROR:
32
- console.error(_Constants.Constants.LiveChatWidget, payload);
33
+ console.error(_Constants.Constants.LiveChatWidget, payload, telemetryInfo);
33
34
  break;
34
35
 
35
36
  default:
36
- console.debug(_Constants.Constants.LiveChatWidget, payload);
37
+ console.debug(_Constants.Constants.LiveChatWidget, payload, telemetryInfo);
37
38
  break;
38
39
  }
39
40
  } catch (ex) {
@@ -3,12 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.setTabIndices = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getTimestampHourMinute = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.createTimer = exports.changeLanguageCodeFormatForWebChat = void 0;
6
+ exports.setTabIndices = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getWidgetEndChatEventName = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.createTimer = exports.changeLanguageCodeFormatForWebChat = void 0;
7
7
 
8
8
  var _Constants = require("./Constants");
9
9
 
10
10
  var _KeyCodes = require("./KeyCodes");
11
11
 
12
+ var _TelemetryConstants = require("./telemetry/TelemetryConstants");
13
+
12
14
  const getElementBySelector = selector => {
13
15
  let element;
14
16
 
@@ -333,6 +335,7 @@ const createTimer = () => {
333
335
 
334
336
  };
335
337
  }; // Returns the domain of the org
338
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
336
339
 
337
340
 
338
341
  exports.createTimer = createTimer;
@@ -347,4 +350,16 @@ const getDomain = hostValue => {
347
350
  return _Constants.AriaTelemetryConstants.Public;
348
351
  };
349
352
 
350
- exports.getDomain = getDomain;
353
+ exports.getDomain = getDomain;
354
+
355
+ const getWidgetCacheId = (orgId, widgetId) => {
356
+ return `${_Constants.Constants.ChatWidgetStateChangedPrefix}_${orgId}_${widgetId}`;
357
+ };
358
+
359
+ exports.getWidgetCacheId = getWidgetCacheId;
360
+
361
+ const getWidgetEndChatEventName = (orgId, widgetId) => {
362
+ return `${_TelemetryConstants.BroadcastEvent.EndChat}_${orgId}_${widgetId}`;
363
+ };
364
+
365
+ exports.getWidgetEndChatEventName = getWidgetEndChatEventName;
@@ -206,6 +206,20 @@ const CallingContainerStateful = props => {
206
206
  });
207
207
  }
208
208
  });
209
+ window.addEventListener("beforeunload", () => {
210
+ if (state.uiStates.isIncomingCall) {
211
+ voiceVideoCallingSdk === null || voiceVideoCallingSdk === void 0 ? void 0 : voiceVideoCallingSdk.rejectCall();
212
+ } else {
213
+ voiceVideoCallingSdk === null || voiceVideoCallingSdk === void 0 ? void 0 : voiceVideoCallingSdk.stopCall();
214
+ }
215
+
216
+ voiceVideoCallingSdk === null || voiceVideoCallingSdk === void 0 ? void 0 : voiceVideoCallingSdk.close();
217
+ dispatch({
218
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_E2VV_ENABLED,
219
+ payload: false
220
+ });
221
+ resetCallingStates(true);
222
+ });
209
223
  }, []);
210
224
  const controlProps = {
211
225
  id: "oc-lcw-callingcontainer",
@@ -50,7 +50,7 @@ const ChatButtonStateful = props => {
50
50
  dir: state.domainStates.globalDir,
51
51
  titleText: "Let's Chat!",
52
52
  subtitleText: "We're online.",
53
- hideNotificationBubble: !(state.appStates.isMinimized === true && state.appStates.unreadMessageCount > 0) || (buttonProps === null || buttonProps === void 0 ? void 0 : (_buttonProps$controlP = buttonProps.controlProps) === null || _buttonProps$controlP === void 0 ? void 0 : _buttonProps$controlP.hideNotificationBubble) === true,
53
+ hideNotificationBubble: (buttonProps === null || buttonProps === void 0 ? void 0 : (_buttonProps$controlP = buttonProps.controlProps) === null || _buttonProps$controlP === void 0 ? void 0 : _buttonProps$controlP.hideNotificationBubble) === true || state.appStates.isMinimized === false,
54
54
  unreadMessageCount: state.appStates.unreadMessageCount ? state.appStates.unreadMessageCount > _Constants.Constants.maximumUnreadMessageCount ? _Constants.Constants.maximumUnreadMessageCount.toString() + "+" : state.appStates.unreadMessageCount.toString() : "0",
55
55
  onClick: async () => {
56
56
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
@@ -138,7 +138,7 @@ const beautifyChatTranscripts = (chatTranscripts, renderMarkDown, attachmentMess
138
138
 
139
139
  if (value.attachments && value.attachments.length > 0 && value.attachments[0].name) {
140
140
  fileAttachmentName = value.attachments[0].name;
141
- value.content = attachmentMessage ?? "The following attachment was uploaded during the conversation:" + fileAttachmentName;
141
+ value.content = attachmentMessage ? attachmentMessage + " " + fileAttachmentName : "The following attachment was uploaded during the conversation: " + fileAttachmentName;
142
142
  }
143
143
  }
144
144
 
@@ -274,18 +274,6 @@ const dummyDefaultProps = {
274
274
  width: "50px",
275
275
  fontSize: "18px"
276
276
  },
277
- currentCallTimerStyleProps: {
278
- borderRadius: "2px",
279
- margin: "1px",
280
- color: "#FFFFFF",
281
- paddingTop: "18px",
282
- fontSize: 12,
283
- fontFamily: "Segoe UI, Arial, sans-serif",
284
- backgroundColor: "darkgrey",
285
- height: "45px",
286
- width: "50px",
287
- textAlign: "center"
288
- },
289
277
  videoTileStyleProps: {
290
278
  width: "100%",
291
279
  marginLeft: "auto",
@@ -23,6 +23,8 @@ var _PostChatSurveyMode = require("../../postchatsurveypanestateful/enums/PostCh
23
23
 
24
24
  var _Constants = require("../../../common/Constants");
25
25
 
26
+ var _utils = require("../../../common/utils");
27
+
26
28
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
29
  const prepareEndChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state) => {
28
30
  var _state$domainStates$l, _state$domainStates$l2, _state$domainStates$l3, _state$domainStates$l4;
@@ -34,7 +36,7 @@ const prepareEndChat = async (props, chatSDK, setAdapter, setWebChatStyles, disp
34
36
  if (isPostChatEnabled === "true" && (conversationDetails === null || conversationDetails === void 0 ? void 0 : conversationDetails.canRenderPostChat) === _Constants.Constants.truePascal) {
35
37
  const skipEndChatSDK = false;
36
38
  const skipCloseChat = true;
37
- await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
39
+ await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat, true);
38
40
 
39
41
  if (postChatSurveyMode === _PostChatSurveyMode.PostChatSurveyMode.Embed) {
40
42
  const loadPostChatEvent = {
@@ -49,21 +51,30 @@ const prepareEndChat = async (props, chatSDK, setAdapter, setWebChatStyles, disp
49
51
  });
50
52
  }
51
53
  } else {
52
- await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
54
+ await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, true);
53
55
  }
54
56
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
57
 
56
58
 
57
59
  exports.prepareEndChat = prepareEndChat;
58
60
 
59
- const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat) => {
61
+ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat, postMessageToOtherTab) => {
60
62
  if (!skipEndChatSDK) {
61
63
  try {
62
64
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.INFO, {
63
65
  Event: _TelemetryConstants.TelemetryEvent.EndChatSDKCall
64
66
  });
65
67
 
66
- await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.endChat());
68
+ await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.endChat()); // Need to clear these states immediately when chat ended from OC.
69
+
70
+ dispatch({
71
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CHAT_TOKEN,
72
+ payload: undefined
73
+ });
74
+ dispatch({
75
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
76
+ payload: undefined
77
+ });
67
78
  } catch (ex) {
68
79
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
69
80
  Event: _TelemetryConstants.TelemetryEvent.EndChatSDKCallFailed,
@@ -71,6 +82,8 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
71
82
  exception: ex
72
83
  }
73
84
  });
85
+
86
+ postMessageToOtherTab = false;
74
87
  }
75
88
  }
76
89
 
@@ -100,18 +113,20 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
100
113
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_AUDIO_NOTIFICATION,
101
114
  payload: null
102
115
  });
103
- dispatch({
104
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CHAT_TOKEN,
105
- payload: undefined
106
- });
107
- dispatch({
108
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
109
- payload: undefined
110
- });
111
116
 
112
117
  _omnichannelChatComponents.BroadcastService.postMessage({
113
118
  eventName: _TelemetryConstants.BroadcastEvent.EndChat
114
119
  });
120
+
121
+ if (postMessageToOtherTab) {
122
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2;
123
+
124
+ 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);
125
+
126
+ _omnichannelChatComponents.BroadcastService.postMessage({
127
+ eventName: endChatEventName
128
+ });
129
+ }
115
130
  } catch (error) {
116
131
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
117
132
  Event: _TelemetryConstants.TelemetryEvent.CloseChatMethodException,
@@ -123,6 +123,10 @@ const initWebChatComposer = (props, chatSDK, state, dispatch, setWebChatStyles)
123
123
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CHAT_TOKEN,
124
124
  payload: undefined
125
125
  });
126
+ dispatch({
127
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
128
+ payload: undefined
129
+ });
126
130
  };
127
131
 
128
132
  webChatStore = (0, _botframeworkWebchat.createStore)({}, //initial state
@@ -35,7 +35,11 @@ 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) => {
40
44
  var _props$reconnectChatP;
41
45
 
@@ -74,11 +78,13 @@ const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) =>
74
78
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
75
79
  payload: _ConversationState.ConversationState.Prechat
76
80
  });
81
+ setCustomContextParams(props, state);
77
82
  } else {
78
83
  dispatch({
79
84
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
80
85
  payload: _ConversationState.ConversationState.Loading
81
86
  });
87
+ setCustomContextParams(props, state);
82
88
  await initStartChat(chatSDK, dispatch, setAdapter);
83
89
  }
84
90
  }
@@ -91,6 +97,21 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
91
97
  try {
92
98
  var _newAdapter$activity$, _TelemetryTimers$Widg;
93
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
+
94
115
  try {
95
116
  _TelemetryManager.TelemetryTimers.WidgetLoadTimer = (0, _utils.createTimer)();
96
117
 
@@ -98,7 +119,9 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
98
119
  Event: _TelemetryConstants.TelemetryEvent.StartChatSDKCall
99
120
  });
100
121
 
101
- await chatSDK.startChat(params);
122
+ optionalParams = Object.assign({}, params, optionalParams);
123
+ await chatSDK.startChat(optionalParams);
124
+ isStartChatSuccessful = true;
102
125
  } catch (error) {
103
126
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
104
127
  Event: _TelemetryConstants.TelemetryEvent.StartChatMethodException,
@@ -106,6 +129,8 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
106
129
  exception: `Failed to setup startChat: ${error}`
107
130
  }
108
131
  });
132
+
133
+ isStartChatSuccessful = false;
109
134
  }
110
135
 
111
136
  const newAdapter = await (0, _createAdapter.createAdapter)(chatSDK);
@@ -133,10 +158,12 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
133
158
  await (0, _setPostChatContextAndLoadSurvey.setPostChatContextAndLoadSurvey)(chatSDK, dispatch);
134
159
  await (0, _updateSessionDataForTelemetry.updateSessionDataForTelemetry)(chatSDK, dispatch); // Set app state to Active
135
160
 
136
- dispatch({
137
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
138
- payload: _ConversationState.ConversationState.Active
139
- });
161
+ if (isStartChatSuccessful) {
162
+ dispatch({
163
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
164
+ payload: _ConversationState.ConversationState.Active
165
+ });
166
+ }
140
167
  } else {
141
168
  dispatch({
142
169
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_WIDGET_STATE,
@@ -178,24 +205,36 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
178
205
  exports.initStartChat = initStartChat;
179
206
 
180
207
  const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
181
- var _DataStoreManager$cli, _persistedState$domai;
208
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _DataStoreManager$cli, _persistedState$domai6;
182
209
 
183
- 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");
184
212
  const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
185
213
 
186
- if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai = persistedState.domainStates) !== null && _persistedState$domai !== void 0 && _persistedState$domai.liveChatContext) {
187
- 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;
188
216
 
189
217
  dispatch({
190
218
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
191
219
  payload: _ConversationState.ConversationState.Loading
192
220
  });
193
221
  const optionalParams = {
194
- 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
195
223
  };
196
224
  await initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
197
225
  return true;
198
226
  } else {
199
227
  return false;
200
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
+ }
201
240
  };
@@ -107,7 +107,8 @@ 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
@@ -135,6 +136,10 @@ const LiveChatWidgetStateful = props => {
135
136
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_SKIP_CHAT_BUTTON_RENDERING,
136
137
  payload: ((_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.skipChatButtonRendering) || false
137
138
  });
139
+ dispatch({
140
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_E2VV_ENABLED,
141
+ payload: false
142
+ });
138
143
  (0, _initCallingSdk.initCallingSdk)(chatSDK, setVoiceVideoCallingSDK).then(sdkCreated => {
139
144
  sdkCreated && dispatch({
140
145
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_E2VV_ENABLED,
@@ -201,6 +206,21 @@ const LiveChatWidgetStateful = props => {
201
206
  }
202
207
  }, [state.appStates.skipChatButtonRendering]);
203
208
  (0, _react2.useEffect)(() => {
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
+
204
224
  _omnichannelChatComponents.BroadcastService.getMessageByEventName("StartProactiveChat").subscribe(msg => {
205
225
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
206
226
  Event: _TelemetryConstants.TelemetryEvent.StartProactiveChatEventReceived,
@@ -250,6 +270,13 @@ const LiveChatWidgetStateful = props => {
250
270
  const skipCloseChat = false;
251
271
  (0, _endChat.endChat)(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
252
272
  }
273
+ }); // Listen to end chat event from other tabs
274
+
275
+
276
+ 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);
277
+
278
+ _omnichannelChatComponents.BroadcastService.getMessageByEventName(endChatEventName).subscribe(async () => {
279
+ (0, _endChat.endChat)(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
253
280
  });
254
281
 
255
282
  window.addEventListener("beforeunload", () => {
@@ -335,8 +362,11 @@ const LiveChatWidgetStateful = props => {
335
362
  const confirmationPaneProps = (0, _initConfirmationPropsComposer.initConfirmationPropsComposer)(props); // publish chat widget state
336
363
 
337
364
  (0, _react2.useEffect)(() => {
365
+ var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic;
366
+
367
+ 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);
338
368
  const chatWidgetStateChangeEvent = {
339
- eventName: _TelemetryConstants.BroadcastEvent.ChatWidgetStateChanged,
369
+ eventName: widgetStateEventName,
340
370
  payload: { ...state
341
371
  }
342
372
  };
@@ -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);
@@ -10,6 +10,7 @@ var _TelemetryConstants = require("../../../../common/telemetry/TelemetryConstan
10
10
  var _TelemetryHelper = require("../../../../common/telemetry/TelemetryHelper");
11
11
 
12
12
  function createWebChatTelemetry() {
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
14
  const handleTelemetry = event => {
14
15
  const {
15
16
  level