@microsoft/omnichannel-chat-widget 1.0.4-main.d4abfe6 → 1.0.5-main.09afcbb

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 (38) hide show
  1. package/lib/cjs/common/Constants.js +1 -0
  2. package/lib/cjs/common/telemetry/TelemetryConstants.js +1 -0
  3. package/lib/cjs/common/telemetry/TelemetryHelper.js +3 -2
  4. package/lib/cjs/common/telemetry/defaultConfigs/defaultTelemetryInternalData.js +1 -1
  5. package/lib/cjs/common/telemetry/loggers/ariaTelemetryLogger.js +22 -2
  6. package/lib/cjs/common/utils.js +22 -2
  7. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +11 -6
  8. package/lib/cjs/components/livechatwidget/common/endChat.js +8 -30
  9. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +19 -9
  10. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +2 -1
  11. package/lib/cjs/components/livechatwidget/common/renderSurveyHelpers.js +3 -2
  12. package/lib/cjs/components/livechatwidget/common/startChat.js +29 -13
  13. package/lib/cjs/components/livechatwidget/common/updateSessionDataForTelemetry.js +2 -1
  14. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +8 -0
  15. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +5 -1
  16. package/lib/esm/common/Constants.js +1 -0
  17. package/lib/esm/common/telemetry/TelemetryConstants.js +1 -0
  18. package/lib/esm/common/telemetry/TelemetryHelper.js +3 -2
  19. package/lib/esm/common/telemetry/defaultConfigs/defaultTelemetryInternalData.js +1 -1
  20. package/lib/esm/common/telemetry/loggers/ariaTelemetryLogger.js +22 -2
  21. package/lib/esm/common/utils.js +20 -1
  22. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +10 -6
  23. package/lib/esm/components/livechatwidget/common/endChat.js +7 -28
  24. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +19 -9
  25. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +2 -1
  26. package/lib/esm/components/livechatwidget/common/renderSurveyHelpers.js +3 -2
  27. package/lib/esm/components/livechatwidget/common/startChat.js +30 -14
  28. package/lib/esm/components/livechatwidget/common/updateSessionDataForTelemetry.js +2 -1
  29. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +8 -0
  30. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +5 -1
  31. package/lib/types/common/Constants.d.ts +2 -1
  32. package/lib/types/common/telemetry/TelemetryConstants.d.ts +2 -1
  33. package/lib/types/common/telemetry/TelemetryHelper.d.ts +3 -3
  34. package/lib/types/common/telemetry/definitions/Payload.d.ts +1 -0
  35. package/lib/types/common/utils.d.ts +1 -0
  36. package/lib/types/components/livechatwidget/common/endChat.d.ts +2 -3
  37. package/lib/types/components/livechatwidget/common/renderSurveyHelpers.d.ts +1 -1
  38. package/package.json +3 -4
@@ -189,6 +189,7 @@ let ChatSDKError;
189
189
  exports.ChatSDKError = ChatSDKError;
190
190
  (function (ChatSDKError) {
191
191
  ChatSDKError["WidgetUseOutsideOperatingHour"] = "WidgetUseOutsideOperatingHour";
192
+ ChatSDKError["AuthContactIdNotFoundFailure"] = "AuthContactIdNotFoundFailure";
192
193
  })(ChatSDKError || (exports.ChatSDKError = ChatSDKError = {}));
193
194
  let EnvironmentVersion;
194
195
  exports.EnvironmentVersion = EnvironmentVersion;
@@ -63,6 +63,7 @@ exports.BroadcastEvent = BroadcastEvent;
63
63
  BroadcastEvent["HideChatVisibilityChangeEvent"] = "hideChatVisibilityChangeEvent";
64
64
  BroadcastEvent["UpdateSessionDataForTelemetry"] = "UpdateSessionDataForTelemetry";
65
65
  BroadcastEvent["UpdateConversationDataForTelemetry"] = "UpdateConversationDataForTelemetry";
66
+ BroadcastEvent["ContactIdNotFound"] = "ContactIdNotFound";
66
67
  })(BroadcastEvent || (exports.BroadcastEvent = BroadcastEvent = {}));
67
68
  let TelemetryEvent;
68
69
  exports.TelemetryEvent = TelemetryEvent;
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.TelemetryHelper = void 0;
7
7
  var _TelemetryConstants = require("./TelemetryConstants");
8
- var _utils = require("../utils");
9
- var _TelemetryManager = require("./TelemetryManager");
10
8
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
9
+ var _TelemetryManager = require("./TelemetryManager");
10
+ var _utils = require("../utils");
11
11
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
12
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
13
13
  function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
@@ -96,6 +96,7 @@ class TelemetryHelper {
96
96
  return TelemetryHelper.populate(level, payload, event => {
97
97
  var _TelemetryManager$Int11, _TelemetryManager$Int12, _TelemetryManager$Int13;
98
98
  event.Event = payload.Event;
99
+ event.Description = payload.Description;
99
100
  event.ResourcePath = payload.ResourcePath;
100
101
  event.WidgetState = payload.WidgetState;
101
102
  event.ChatState = payload.ChatState;
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.defaultInternalTelemetryData = void 0;
7
7
  const defaultInternalTelemetryData = {
8
- environmentVersion: "test",
8
+ environmentVersion: "prod",
9
9
  chatWidgetLocaleLCID: "1033",
10
10
  channelId: "lcw2.0"
11
11
  };
@@ -9,10 +9,29 @@ var _AriaSDK = require("@microsoft/omnichannel-chat-sdk/lib/external/aria/webjs/
9
9
  var _Enums = require("@microsoft/omnichannel-chat-sdk/lib/external/aria/common/Enums");
10
10
  var _Constants = require("../../Constants");
11
11
  var _TelemetryManager = require("../TelemetryManager");
12
+ const AWTDefaultConfiguration = {
13
+ collectorUri: "https://browser.pipe.aria.microsoft.com/Collector/3.0/",
14
+ cacheMemorySizeLimitInNumberOfEvents: 10000,
15
+ disableCookiesUsage: false,
16
+ canSendStatEvent: eventName => {
17
+ return true;
18
+ },
19
+ // eslint-disable-line @typescript-eslint/no-unused-vars
20
+ clockSkewRefreshDurationInMins: 0
21
+ };
12
22
  const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, collectiorUriForTelemetry, ariaTelemetryApplicationName) => {
13
23
  let _logger;
24
+
25
+ // AWTLogManager is a global variable. Reset after a logEvent() is required to prevent collisions with other components using AWTLogManager.
26
+ const resetAriaLogger = function () {
27
+ let configuration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : AWTDefaultConfiguration;
28
+ _AriaSDK.AWTLogManager.flushAndTeardown();
29
+ _AriaSDK.AWTLogManager._isInitialized = false; // eslint-disable-line @typescript-eslint/no-explicit-any
30
+ _AriaSDK.AWTLogManager._isDestroyed = false; // eslint-disable-line @typescript-eslint/no-explicit-any
31
+ _logger = _AriaSDK.AWTLogManager.initialize(ariaTelemetryKey, configuration);
32
+ };
14
33
  const logger = () => {
15
- if ((0, _utils.isNullOrUndefined)(_logger) && !(0, _utils.isNullOrEmptyString)(ariaTelemetryKey)) {
34
+ if (!(0, _utils.isNullOrEmptyString)(ariaTelemetryKey)) {
16
35
  const configuration = {
17
36
  disableCookiesUsage: disabledCookieUsage
18
37
  };
@@ -32,7 +51,7 @@ const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, collectiorUr
32
51
  }
33
52
  }
34
53
  try {
35
- _logger = _AriaSDK.AWTLogManager.initialize(ariaTelemetryKey, configuration);
54
+ resetAriaLogger(configuration);
36
55
  if (_logger === undefined) {
37
56
  _logger = _AriaSDK.AWTLogManager.getLogger(ariaTelemetryKey);
38
57
  }
@@ -74,6 +93,7 @@ const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, collectiorUr
74
93
  eventProperties.properties[ariaTelemetryApplicationName] = nameProperty;
75
94
  }
76
95
  logger() ? logger().logEvent(eventProperties) : console.log("Unable to initialize aria logger");
96
+ resetAriaLogger();
77
97
  } catch (error) {
78
98
  console.error("Error in logging telemetry to Aria logger:" + error);
79
99
  }
@@ -3,9 +3,10 @@
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.isUndefinedOrEmpty = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getWidgetEndChatEventName = exports.getWidgetCacheIdfromProps = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getStateFromCache = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.getConversationDetailsCall = exports.getBroadcastChannelName = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.debounceLeading = exports.createTimer = exports.changeLanguageCodeFormatForWebChat = exports.addDelayInMs = void 0;
6
+ exports.setTabIndices = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isUndefinedOrEmpty = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getWidgetEndChatEventName = exports.getWidgetCacheIdfromProps = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getStateFromCache = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.getConversationDetailsCall = exports.getBroadcastChannelName = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.debounceLeading = exports.createTimer = exports.checkContactIdError = exports.changeLanguageCodeFormatForWebChat = exports.addDelayInMs = void 0;
7
7
  var _Constants = require("./Constants");
8
8
  var _TelemetryConstants = require("./telemetry/TelemetryConstants");
9
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
9
10
  var _DataStoreManager = require("./contextDataStore/DataStoreManager");
10
11
  var _KeyCodes = require("./KeyCodes");
11
12
  var _md5Typescript = require("md5-typescript");
@@ -385,8 +386,13 @@ const getConversationDetailsCall = async chatSDK => {
385
386
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
386
387
  let conversationDetails = undefined;
387
388
  try {
389
+ _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.INFO, {
390
+ Event: _TelemetryConstants.TelemetryEvent.GetConversationDetailsCallStarted,
391
+ Description: "Conversation details call started"
392
+ });
388
393
  conversationDetails = await chatSDK.getConversationDetails();
389
394
  } catch (error) {
395
+ checkContactIdError(error);
390
396
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
391
397
  Event: _TelemetryConstants.TelemetryEvent.GetConversationDetailsCallFailed,
392
398
  ExceptionDetails: {
@@ -396,4 +402,18 @@ const getConversationDetailsCall = async chatSDK => {
396
402
  }
397
403
  return conversationDetails;
398
404
  };
399
- exports.getConversationDetailsCall = getConversationDetailsCall;
405
+
406
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
407
+ exports.getConversationDetailsCall = getConversationDetailsCall;
408
+ const checkContactIdError = e => {
409
+ if ((e === null || e === void 0 ? void 0 : e.message) === _Constants.ChatSDKError.AuthContactIdNotFoundFailure) {
410
+ const contactIdNotFoundErrorEvent = {
411
+ eventName: _TelemetryConstants.BroadcastEvent.ContactIdNotFound,
412
+ payload: {
413
+ error: e
414
+ }
415
+ };
416
+ _omnichannelChatComponents.BroadcastService.postMessage(contactIdNotFoundErrorEvent);
417
+ }
418
+ };
419
+ exports.checkContactIdError = checkContactIdError;
@@ -9,6 +9,8 @@ var _NotificationScenarios = require("../../webchatcontainerstateful/webchatcont
9
9
  var _NotificationHandler = require("../../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler");
10
10
  var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
11
11
  var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
12
+ var _dompurify = _interopRequireDefault(require("dompurify"));
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
14
  const processDisplayName = displayName => {
13
15
  // if displayname matches "teamsvisitor:<some alphanumeric string>", we replace it with "Customer"
14
16
  const displayNameRegex = ".+:.+";
@@ -64,6 +66,8 @@ const processContent = (transcriptContent, isAgentChat, renderMarkDown) => {
64
66
  }
65
67
  if (renderMarkDown) {
66
68
  transcriptContent = renderMarkDown(transcriptContent);
69
+ } else {
70
+ transcriptContent = _dompurify.default.sanitize(transcriptContent);
67
71
  }
68
72
  return transcriptContent;
69
73
  };
@@ -160,12 +164,13 @@ const beautifyChatTranscripts = (chatTranscripts, renderMarkDown, attachmentMess
160
164
  const downloadTranscript = async (chatSDK, renderMarkDown, bannerMessageOnError, attachmentMessage, state) => {
161
165
  var _state$domainStates, _state$domainStates2, _state$domainStates2$;
162
166
  // Need to keep existing request id for scenarios when trnascript is downloaded after endchat
163
- const existingRequestId = chatSDK.requestId;
164
- chatSDK.chatToken = state === null || state === void 0 ? void 0 : (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.chatToken;
165
- chatSDK.requestId = state === null || state === void 0 ? void 0 : (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : (_state$domainStates2$ = _state$domainStates2.chatToken) === null || _state$domainStates2$ === void 0 ? void 0 : _state$domainStates2$.requestId;
166
- let data = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getLiveChatTranscript());
167
- // This is used for allowing to start next chat
168
- chatSDK.requestId = existingRequestId;
167
+ const liveChatContext = {
168
+ chatToken: state === null || state === void 0 ? void 0 : (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.chatToken,
169
+ requestId: state === null || state === void 0 ? void 0 : (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : (_state$domainStates2$ = _state$domainStates2.chatToken) === null || _state$domainStates2$ === void 0 ? void 0 : _state$domainStates2$.requestId
170
+ };
171
+ let data = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getLiveChatTranscript({
172
+ liveChatContext
173
+ }));
169
174
  if (typeof data === _Constants.Constants.String) {
170
175
  data = JSON.parse(data);
171
176
  }
@@ -3,23 +3,23 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.prepareEndChat = exports.getConversationDetails = exports.endChat = void 0;
6
+ exports.prepareEndChat = exports.endChat = void 0;
7
+ var _Constants = require("../../../common/Constants");
7
8
  var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
9
+ var _authHelper = require("./authHelper");
10
+ var _utils = require("../../../common/utils");
11
+ var _renderSurveyHelpers = require("./renderSurveyHelpers");
8
12
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
9
13
  var _ConversationState = require("../../../contexts/common/ConversationState");
10
14
  var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
11
15
  var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
12
16
  var _WebChatStoreLoader = require("../../webchatcontainerstateful/webchatcontroller/WebChatStoreLoader");
13
17
  var _defaultWebChatContainerStatefulProps = require("../../webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps");
14
- var _utils = require("../../../common/utils");
15
- var _authHelper = require("./authHelper");
16
- var _renderSurveyHelpers = require("./renderSurveyHelpers");
17
- var _Constants = require("../../../common/Constants");
18
18
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
19
  const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter, uwid) => {
20
20
  try {
21
21
  var _conversationDetails$, _state$domainStates, _state$domainStates2;
22
- const conversationDetails = await getConversationDetails(chatSDK);
22
+ const conversationDetails = await (0, _utils.getConversationDetailsCall)(chatSDK);
23
23
 
24
24
  // Use Case : When post chat is not configured
25
25
  if ((conversationDetails === null || conversationDetails === void 0 ? void 0 : (_conversationDetails$ = conversationDetails.canRenderPostChat) === null || _conversationDetails$ === void 0 ? void 0 : _conversationDetails$.toLowerCase()) === _Constants.Constants.false) {
@@ -56,7 +56,7 @@ const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWe
56
56
 
57
57
  // Initiate post chat render
58
58
  if (state !== null && state !== void 0 && (_state$domainStates2 = state.domainStates) !== null && _state$domainStates2 !== void 0 && _state$domainStates2.postChatContext) {
59
- await (0, _renderSurveyHelpers.initiatePostChat)(props, conversationDetails, state, dispatch);
59
+ await (0, _renderSurveyHelpers.initiatePostChat)(props, conversationDetails, state, dispatch, postchatContext);
60
60
  return;
61
61
  }
62
62
  } catch (error) {
@@ -252,26 +252,4 @@ const chatTokenCleanUp = async dispatch => {
252
252
  const getEndChatEventName = async (chatSDK, props) => {
253
253
  var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _props$controlProps4;
254
254
  return (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, (props === null || props === void 0 ? void 0 : (_props$controlProps4 = props.controlProps) === null || _props$controlProps4 === void 0 ? void 0 : _props$controlProps4.widgetInstanceId) ?? "");
255
- };
256
-
257
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
258
- const getConversationDetails = async chatSDK => {
259
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
260
- let conversationDetails = undefined;
261
- try {
262
- _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.INFO, {
263
- Event: _TelemetryConstants.TelemetryEvent.GetConversationDetailsCallStarted,
264
- Description: "Conversation details call started"
265
- });
266
- conversationDetails = await chatSDK.getConversationDetails();
267
- } catch (error) {
268
- _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
269
- Event: _TelemetryConstants.TelemetryEvent.GetConversationDetailsCallFailed,
270
- ExceptionDetails: {
271
- exception: `Get Conversation Details Call Failed : ${error}`
272
- }
273
- });
274
- }
275
- return conversationDetails;
276
- };
277
- exports.getConversationDetails = getConversationDetails;
255
+ };
@@ -4,22 +4,26 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.initWebChatComposer = void 0;
7
+ var _Constants = require("../../../common/Constants");
7
8
  var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
8
- var _botframeworkWebchat = require("botframework-webchat");
9
+ var _utils = require("../../../common/utils");
10
+ var _HyperlinkTextOverrideRenderer = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/markdownrenderers/HyperlinkTextOverrideRenderer"));
9
11
  var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
10
12
  var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
11
13
  var _WebChatStoreLoader = require("../../webchatcontainerstateful/webchatcontroller/WebChatStoreLoader");
12
14
  var _attachmentProcessingMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware"));
13
- var _utils = require("../../../common/utils");
14
15
  var _channelDataMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware"));
15
16
  var _activityMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware");
16
17
  var _attachmentMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware"));
17
18
  var _attachmentUploadValidatorMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware"));
18
19
  var _avatarMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware");
20
+ var _cardActionMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware");
19
21
  var _conversationEndMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware"));
20
22
  var _dataMaskingMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware"));
21
23
  var _createMarkdown = require("./createMarkdown");
22
24
  var _maxMessageSizeValidator = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator"));
25
+ var _messageTimestampMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware"));
26
+ var _botframeworkWebchat = require("botframework-webchat");
23
27
  var _WebChatLogger = require("../../webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger");
24
28
  var _defaultAttachmentProps = require("../../webchatcontainerstateful/common/defaultProps/defaultAttachmentProps");
25
29
  var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
@@ -30,15 +34,13 @@ var _htmlPlayerMiddleware = _interopRequireDefault(require("../../webchatcontain
30
34
  var _htmlTextMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware"));
31
35
  var _preProcessingMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware"));
32
36
  var _sanitizationMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware"));
33
- var _cardActionMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware");
34
- var _messageTimestampMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware"));
35
- var _Constants = require("../../../common/Constants");
36
- var _endChat = require("./endChat");
37
- var _HyperlinkTextOverrideRenderer = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/markdownrenderers/HyperlinkTextOverrideRenderer"));
37
+ var _dompurify = _interopRequireDefault(require("dompurify"));
38
38
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
39
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
40
  const initWebChatComposer = (props, state, dispatch, chatSDK) => {
41
41
  var _props$webChatContain, _props$webChatContain2, _props$webChatContain3, _props$webChatContain4, _state$domainStates$l4, _state$domainStates$l5, _props$webChatContain9, _props$webChatContain10, _state$domainStates$r, _state$domainStates$r2, _props$webChatContain11, _props$webChatContain12, _state$domainStates$r3, _state$domainStates$r4, _props$webChatContain13, _props$webChatContain14, _defaultWebChatContai, _props$webChatContain15, _props$webChatContain16, _state$domainStates$r5, _state$domainStates$r6, _props$webChatContain17, _props$webChatContain18, _defaultWebChatContai2, _props$webChatContain19, _props$webChatContain20, _defaultWebChatContai3, _props$webChatContain21, _props$webChatContain22;
42
+ // Add a hook to make all links open a new window
43
+ postDomPurifyActivities();
42
44
  const localizedTexts = {
43
45
  ..._defaultMiddlewareLocalizedTexts.defaultMiddlewareLocalizedTexts,
44
46
  ...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.localizedTexts)
@@ -53,7 +55,7 @@ const initWebChatComposer = (props, state, dispatch, chatSDK) => {
53
55
  var _state$domainStates$l, _state$domainStates$l2, _state$domainStates$l3, _props$webChatContain5;
54
56
  const conversationEndCallback = async () => {
55
57
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
- const conversationDetails = await (0, _endChat.getConversationDetails)(chatSDK);
58
+ const conversationDetails = await (0, _utils.getConversationDetailsCall)(chatSDK);
57
59
  if ((conversationDetails === null || conversationDetails === void 0 ? void 0 : conversationDetails.participantType) === _Constants.ParticipantType.Bot) {
58
60
  dispatch({
59
61
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY,
@@ -91,9 +93,17 @@ const initWebChatComposer = (props, state, dispatch, chatSDK) => {
91
93
  markdownRenderers.forEach(renderer => {
92
94
  text = renderer.render(text);
93
95
  });
96
+ text = _dompurify.default.sanitize(text);
94
97
  return text;
95
98
  };
96
-
99
+ function postDomPurifyActivities() {
100
+ _dompurify.default.addHook("afterSanitizeAttributes", function (node) {
101
+ // set all elements owning target to target=_blank
102
+ if ("target" in node) {
103
+ node.setAttribute("target", "_blank");
104
+ }
105
+ });
106
+ }
97
107
  // Initialize the remaining Web Chat props
98
108
  const webChatProps = {
99
109
  ..._defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.webChatProps,
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.isReconnectEnabled = exports.handleChatReconnect = exports.getChatReconnectContext = void 0;
7
7
  require("regenerator-runtime/runtime");
8
8
  var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
9
- var _authHelper = require("./authHelper");
10
9
  var _utils = require("../../../common/utils");
10
+ var _authHelper = require("./authHelper");
11
11
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
12
12
  var _ConversationState = require("../../../contexts/common/ConversationState");
13
13
  var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
@@ -75,6 +75,7 @@ const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticat
75
75
  }
76
76
  return reconnectChatContext;
77
77
  } catch (error) {
78
+ (0, _utils.checkContactIdError)(error);
78
79
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
79
80
  Event: _TelemetryConstants.TelemetryEvent.GetChatReconnectContextSDKCallFailed,
80
81
  ExceptionDetails: {
@@ -87,10 +87,11 @@ const embedModePostChatWorkflow = async (state, dispatch) => {
87
87
  };
88
88
 
89
89
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
- const initiatePostChat = async (props, conversationDetailsParam, state, dispatch) => {
90
+ const initiatePostChat = async (props, conversationDetailsParam, state, dispatch, postchatContext) => {
91
91
  var _conversationDetails;
92
92
  conversationDetails = conversationDetailsParam;
93
- await setSurveyMode(props, (_conversationDetails = conversationDetails) === null || _conversationDetails === void 0 ? void 0 : _conversationDetails.participantType, state, dispatch);
93
+ const participantType = ((_conversationDetails = conversationDetails) === null || _conversationDetails === void 0 ? void 0 : _conversationDetails.participantType) ?? postchatContext.participantType;
94
+ await setSurveyMode(props, participantType, state, dispatch);
94
95
  await renderSurvey(state, dispatch);
95
96
  };
96
97
 
@@ -61,12 +61,13 @@ const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) =>
61
61
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
62
  exports.prepareStartChat = prepareStartChat;
63
63
  const setPreChatAndInitiateChat = async (chatSDK, dispatch, setAdapter, isProactiveChat, proactiveChatEnablePrechatState, state, props) => {
64
+ var _props$controlProps;
64
65
  //Handle reconnect scenario
65
66
 
66
67
  // Getting prechat Survey Context
67
68
  const parseToJson = false;
68
69
  const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
69
- const showPrechat = isProactiveChat ? preChatSurveyResponse && proactiveChatEnablePrechatState : preChatSurveyResponse;
70
+ const showPrechat = isProactiveChat ? preChatSurveyResponse && proactiveChatEnablePrechatState : preChatSurveyResponse && !(props !== null && props !== void 0 && (_props$controlProps = props.controlProps) !== null && _props$controlProps !== void 0 && _props$controlProps.hidePreChatSurveyPane);
70
71
  if (showPrechat) {
71
72
  dispatch({
72
73
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
@@ -93,13 +94,13 @@ const setPreChatAndInitiateChat = async (chatSDK, dispatch, setAdapter, isProact
93
94
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
95
  exports.setPreChatAndInitiateChat = setPreChatAndInitiateChat;
95
96
  const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persistedState) => {
96
- var _props$controlProps;
97
+ var _props$controlProps2;
97
98
  let isStartChatSuccessful = false;
98
99
  const chatConfig = props === null || props === void 0 ? void 0 : props.chatConfig;
99
100
  const getAuthToken = props === null || props === void 0 ? void 0 : props.getAuthToken;
100
- const hideErrorUIPane = props === null || props === void 0 ? void 0 : (_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.hideErrorUIPane;
101
+ const hideErrorUIPane = props === null || props === void 0 ? void 0 : (_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.hideErrorUIPane;
101
102
  try {
102
- var _newAdapter$activity$, _TelemetryTimers$Widg;
103
+ var _newAdapter$activity$, _TelemetryTimers$Widg2;
103
104
  //Start widget load timer
104
105
  _TelemetryManager.TelemetryTimers.WidgetLoadTimer = (0, _utils.createTimer)();
105
106
  _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
@@ -140,6 +141,7 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persi
140
141
  await chatSDK.startChat(startChatOptionalParams);
141
142
  isStartChatSuccessful = true;
142
143
  } catch (error) {
144
+ (0, _utils.checkContactIdError)(error);
143
145
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
144
146
  Event: _TelemetryConstants.TelemetryEvent.StartChatMethodException,
145
147
  ExceptionDetails: {
@@ -174,10 +176,16 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persi
174
176
  });
175
177
  }
176
178
  if (persistedState) {
179
+ var _TelemetryTimers$Widg;
177
180
  dispatch({
178
181
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_WIDGET_STATE,
179
182
  payload: persistedState
180
183
  });
184
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
185
+ Event: _TelemetryConstants.TelemetryEvent.WidgetLoadComplete,
186
+ Description: "Widget load complete. Persisted state retrieved",
187
+ ElapsedTimeInMilliseconds: _TelemetryManager.TelemetryTimers === null || _TelemetryManager.TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg = _TelemetryManager.TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg === void 0 ? void 0 : _TelemetryTimers$Widg.milliSecondsElapsed
188
+ });
181
189
  await (0, _setPostChatContextAndLoadSurvey.setPostChatContextAndLoadSurvey)(chatSDK, dispatch, true);
182
190
  return;
183
191
  }
@@ -191,7 +199,7 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persi
191
199
  _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
192
200
  Event: _TelemetryConstants.TelemetryEvent.WidgetLoadComplete,
193
201
  Description: "Widget load complete",
194
- ElapsedTimeInMilliseconds: _TelemetryManager.TelemetryTimers === null || _TelemetryManager.TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg = _TelemetryManager.TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg === void 0 ? void 0 : _TelemetryTimers$Widg.milliSecondsElapsed
202
+ ElapsedTimeInMilliseconds: _TelemetryManager.TelemetryTimers === null || _TelemetryManager.TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg2 = _TelemetryManager.TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg2 === void 0 ? void 0 : _TelemetryTimers$Widg2.milliSecondsElapsed
195
203
  });
196
204
 
197
205
  // Set post chat context in state
@@ -201,15 +209,10 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persi
201
209
  // Updating chat session detail for telemetry
202
210
  await (0, _updateSessionDataForTelemetry.updateSessionDataForTelemetry)(chatSDK, dispatch);
203
211
  } catch (ex) {
204
- _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.ERROR, {
205
- Event: _TelemetryConstants.TelemetryEvent.WidgetLoadFailed,
206
- ExceptionDetails: {
207
- Exception: `Widget load Failed: ${ex}`
208
- }
209
- });
210
- _NotificationHandler.NotificationHandler.notifyError(_NotificationScenarios.NotificationScenarios.Connection, "Start Chat Failed: " + ex);
212
+ var _TelemetryTimers$Widg4;
211
213
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
212
214
  if (ex.message === _Constants.ChatSDKError.WidgetUseOutsideOperatingHour) {
215
+ var _TelemetryTimers$Widg3;
213
216
  dispatch({
214
217
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_OUTSIDE_OPERATING_HOURS,
215
218
  payload: true
@@ -218,8 +221,21 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persi
218
221
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
219
222
  payload: _ConversationState.ConversationState.OutOfOffice
220
223
  });
224
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
225
+ Event: _TelemetryConstants.TelemetryEvent.WidgetLoadComplete,
226
+ Description: "Widget load complete. Widget is OOOH.",
227
+ ElapsedTimeInMilliseconds: _TelemetryManager.TelemetryTimers === null || _TelemetryManager.TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg3 = _TelemetryManager.TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg3 === void 0 ? void 0 : _TelemetryTimers$Widg3.milliSecondsElapsed
228
+ });
221
229
  return;
222
230
  }
231
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.ERROR, {
232
+ Event: _TelemetryConstants.TelemetryEvent.WidgetLoadFailed,
233
+ ExceptionDetails: {
234
+ Exception: `Widget load Failed: ${ex}`
235
+ },
236
+ ElapsedTimeInMilliseconds: _TelemetryManager.TelemetryTimers === null || _TelemetryManager.TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg4 = _TelemetryManager.TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg4 === void 0 ? void 0 : _TelemetryTimers$Widg4.milliSecondsElapsed
237
+ });
238
+ _NotificationHandler.NotificationHandler.notifyError(_NotificationScenarios.NotificationScenarios.Connection, "Start Chat Failed: " + ex);
223
239
  dispatch({
224
240
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_START_CHAT_FAILING,
225
241
  payload: true
@@ -351,7 +367,7 @@ const checkIfConversationStillValid = async (chatSDK, dispatch, state) => {
351
367
  });
352
368
  try {
353
369
  chatSDK.requestId = requestIdFromCache;
354
- conversationDetails = await chatSDK.getConversationDetails();
370
+ conversationDetails = await (0, _utils.getConversationDetailsCall)(chatSDK);
355
371
  if (Object.keys(conversationDetails).length === 0) {
356
372
  chatSDK.requestId = currentRequestId;
357
373
  return false;
@@ -9,6 +9,7 @@ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components
9
9
  var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
10
10
  var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
11
11
  var _TelemetryManager = require("../../../common/telemetry/TelemetryManager");
12
+ var _utils = require("../../../common/utils");
12
13
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
14
  const updateSessionDataForTelemetry = async (chatSDK, dispatch) => {
14
15
  if (chatSDK) {
@@ -34,7 +35,7 @@ exports.updateSessionDataForTelemetry = updateSessionDataForTelemetry;
34
35
  const updateConversationDataForTelemetry = async (chatSDK, dispatch) => {
35
36
  if (chatSDK) {
36
37
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
- const liveWorkItem = await chatSDK.getConversationDetails();
38
+ const liveWorkItem = await (0, _utils.getConversationDetailsCall)(chatSDK);
38
39
  const telemetryData = _TelemetryHelper.TelemetryHelper.addConversationDataToTelemetry(liveWorkItem, _TelemetryManager.TelemetryManager.InternalTelemetryData);
39
40
  dispatch({
40
41
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_TELEMETRY_DATA,
@@ -142,6 +142,14 @@ const LiveChatWidgetStateful = props => {
142
142
  }
143
143
  if (isChatValid === false) {
144
144
  if (localState) {
145
+ // adding the reconnect logic for the case when customer tries to reconnect from a new browser or InPrivate browser
146
+ if ((0, _reconnectChatHelper.isReconnectEnabled)(props.chatConfig) === true) {
147
+ await (0, _reconnectChatHelper.handleChatReconnect)(chatSDK, props, dispatch, setAdapter, _startChat.initStartChat, state);
148
+ // If chat reconnect has kicked in chat state will become Active or Reconnect. So just exit, else go next
149
+ if (state.appStates.conversationState === _ConversationState.ConversationState.Active || state.appStates.conversationState === _ConversationState.ConversationState.ReconnectChat) {
150
+ return;
151
+ }
152
+ }
145
153
  await (0, _startChat.setPreChatAndInitiateChat)(chatSDK, dispatch, setAdapter, undefined, undefined, localState, props);
146
154
  return;
147
155
  } else {
@@ -60,9 +60,13 @@ const ProactiveChatPaneStateful = props => {
60
60
  Description: "Proactive chat accepted."
61
61
  });
62
62
  if (state.appStates.proactiveChatStates.proactiveChatInNewWindow) {
63
+ var _state$appStates, _state$appStates$proa;
63
64
  // TODO: BroadcastService: replace with the sdk broadcast service, when in place
64
65
  const startPopoutChatEvent = {
65
- eventName: _TelemetryConstants.BroadcastEvent.ProactiveChatStartPopoutChat
66
+ eventName: _TelemetryConstants.BroadcastEvent.ProactiveChatStartPopoutChat,
67
+ payload: {
68
+ enablePrechat: (state === null || state === void 0 ? void 0 : (_state$appStates = state.appStates) === null || _state$appStates === void 0 ? void 0 : (_state$appStates$proa = _state$appStates.proactiveChatStates) === null || _state$appStates$proa === void 0 ? void 0 : _state$appStates$proa.proactiveChatEnablePrechat) === true
69
+ }
66
70
  };
67
71
  _omnichannelChatComponents.BroadcastService.postMessage(startPopoutChatEvent);
68
72
  dispatch({
@@ -171,6 +171,7 @@ export let ElementType;
171
171
  export let ChatSDKError;
172
172
  (function (ChatSDKError) {
173
173
  ChatSDKError["WidgetUseOutsideOperatingHour"] = "WidgetUseOutsideOperatingHour";
174
+ ChatSDKError["AuthContactIdNotFoundFailure"] = "AuthContactIdNotFoundFailure";
174
175
  })(ChatSDKError || (ChatSDKError = {}));
175
176
  export let EnvironmentVersion;
176
177
  (function (EnvironmentVersion) {
@@ -58,6 +58,7 @@ export let BroadcastEvent;
58
58
  BroadcastEvent["HideChatVisibilityChangeEvent"] = "hideChatVisibilityChangeEvent";
59
59
  BroadcastEvent["UpdateSessionDataForTelemetry"] = "UpdateSessionDataForTelemetry";
60
60
  BroadcastEvent["UpdateConversationDataForTelemetry"] = "UpdateConversationDataForTelemetry";
61
+ BroadcastEvent["ContactIdNotFound"] = "ContactIdNotFound";
61
62
  })(BroadcastEvent || (BroadcastEvent = {}));
62
63
  export let TelemetryEvent;
63
64
  (function (TelemetryEvent) {
@@ -2,9 +2,9 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
2
2
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
3
  function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
4
4
  import { ScenarioType, TelemetryEvent } from "./TelemetryConstants";
5
- import { newGuid } from "../utils";
6
- import { TelemetryManager } from "./TelemetryManager";
7
5
  import { BroadcastService } from "@microsoft/omnichannel-chat-components";
6
+ import { TelemetryManager } from "./TelemetryManager";
7
+ import { newGuid } from "../utils";
8
8
  export class TelemetryHelper {
9
9
  static buildTelemetryEvent(level, input) {
10
10
  switch (input.scenarioType) {
@@ -90,6 +90,7 @@ export class TelemetryHelper {
90
90
  return TelemetryHelper.populate(level, payload, event => {
91
91
  var _TelemetryManager$Int11, _TelemetryManager$Int12, _TelemetryManager$Int13;
92
92
  event.Event = payload.Event;
93
+ event.Description = payload.Description;
93
94
  event.ResourcePath = payload.ResourcePath;
94
95
  event.WidgetState = payload.WidgetState;
95
96
  event.ChatState = payload.ChatState;
@@ -1,5 +1,5 @@
1
1
  export const defaultInternalTelemetryData = {
2
- environmentVersion: "test",
2
+ environmentVersion: "prod",
3
3
  chatWidgetLocaleLCID: "1033",
4
4
  channelId: "lcw2.0"
5
5
  };
@@ -3,10 +3,29 @@ import { AWTLogManager } from "@microsoft/omnichannel-chat-sdk/lib/external/aria
3
3
  import { AWTCustomerContentKind, AWTPiiKind, AWTPropertyType } from "@microsoft/omnichannel-chat-sdk/lib/external/aria/common/Enums";
4
4
  import { Constants, AriaTelemetryConstants, EnvironmentVersion } from "../../Constants";
5
5
  import { TelemetryManager } from "../TelemetryManager";
6
+ const AWTDefaultConfiguration = {
7
+ collectorUri: "https://browser.pipe.aria.microsoft.com/Collector/3.0/",
8
+ cacheMemorySizeLimitInNumberOfEvents: 10000,
9
+ disableCookiesUsage: false,
10
+ canSendStatEvent: eventName => {
11
+ return true;
12
+ },
13
+ // eslint-disable-line @typescript-eslint/no-unused-vars
14
+ clockSkewRefreshDurationInMins: 0
15
+ };
6
16
  export const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, collectiorUriForTelemetry, ariaTelemetryApplicationName) => {
7
17
  let _logger;
18
+
19
+ // AWTLogManager is a global variable. Reset after a logEvent() is required to prevent collisions with other components using AWTLogManager.
20
+ const resetAriaLogger = function () {
21
+ let configuration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : AWTDefaultConfiguration;
22
+ AWTLogManager.flushAndTeardown();
23
+ AWTLogManager._isInitialized = false; // eslint-disable-line @typescript-eslint/no-explicit-any
24
+ AWTLogManager._isDestroyed = false; // eslint-disable-line @typescript-eslint/no-explicit-any
25
+ _logger = AWTLogManager.initialize(ariaTelemetryKey, configuration);
26
+ };
8
27
  const logger = () => {
9
- if (isNullOrUndefined(_logger) && !isNullOrEmptyString(ariaTelemetryKey)) {
28
+ if (!isNullOrEmptyString(ariaTelemetryKey)) {
10
29
  const configuration = {
11
30
  disableCookiesUsage: disabledCookieUsage
12
31
  };
@@ -26,7 +45,7 @@ export const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, colle
26
45
  }
27
46
  }
28
47
  try {
29
- _logger = AWTLogManager.initialize(ariaTelemetryKey, configuration);
48
+ resetAriaLogger(configuration);
30
49
  if (_logger === undefined) {
31
50
  _logger = AWTLogManager.getLogger(ariaTelemetryKey);
32
51
  }
@@ -68,6 +87,7 @@ export const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, colle
68
87
  eventProperties.properties[ariaTelemetryApplicationName] = nameProperty;
69
88
  }
70
89
  logger() ? logger().logEvent(eventProperties) : console.log("Unable to initialize aria logger");
90
+ resetAriaLogger();
71
91
  } catch (error) {
72
92
  console.error("Error in logging telemetry to Aria logger:" + error);
73
93
  }
@@ -1,6 +1,7 @@
1
1
  var _this = this;
2
- import { AriaTelemetryConstants, Constants, LocaleConstants } from "./Constants";
2
+ import { AriaTelemetryConstants, ChatSDKError, Constants, LocaleConstants } from "./Constants";
3
3
  import { BroadcastEvent, LogLevel, TelemetryEvent } from "./telemetry/TelemetryConstants";
4
+ import { BroadcastService } from "@microsoft/omnichannel-chat-components";
4
5
  import { DataStoreManager } from "./contextDataStore/DataStoreManager";
5
6
  import { KeyCodes } from "./KeyCodes";
6
7
  import { Md5 } from "md5-typescript";
@@ -353,8 +354,13 @@ export const getConversationDetailsCall = async chatSDK => {
353
354
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
354
355
  let conversationDetails = undefined;
355
356
  try {
357
+ TelemetryHelper.logSDKEvent(LogLevel.INFO, {
358
+ Event: TelemetryEvent.GetConversationDetailsCallStarted,
359
+ Description: "Conversation details call started"
360
+ });
356
361
  conversationDetails = await chatSDK.getConversationDetails();
357
362
  } catch (error) {
363
+ checkContactIdError(error);
358
364
  TelemetryHelper.logSDKEvent(LogLevel.ERROR, {
359
365
  Event: TelemetryEvent.GetConversationDetailsCallFailed,
360
366
  ExceptionDetails: {
@@ -363,4 +369,17 @@ export const getConversationDetailsCall = async chatSDK => {
363
369
  });
364
370
  }
365
371
  return conversationDetails;
372
+ };
373
+
374
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
375
+ export const checkContactIdError = e => {
376
+ if ((e === null || e === void 0 ? void 0 : e.message) === ChatSDKError.AuthContactIdNotFoundFailure) {
377
+ const contactIdNotFoundErrorEvent = {
378
+ eventName: BroadcastEvent.ContactIdNotFound,
379
+ payload: {
380
+ error: e
381
+ }
382
+ };
383
+ BroadcastService.postMessage(contactIdNotFoundErrorEvent);
384
+ }
366
385
  };
@@ -3,6 +3,7 @@ import { NotificationScenarios } from "../../webchatcontainerstateful/webchatcon
3
3
  import { NotificationHandler } from "../../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler";
4
4
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
5
5
  import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
6
+ import DOMPurify from "dompurify";
6
7
  const processDisplayName = displayName => {
7
8
  // if displayname matches "teamsvisitor:<some alphanumeric string>", we replace it with "Customer"
8
9
  const displayNameRegex = ".+:.+";
@@ -58,6 +59,8 @@ const processContent = (transcriptContent, isAgentChat, renderMarkDown) => {
58
59
  }
59
60
  if (renderMarkDown) {
60
61
  transcriptContent = renderMarkDown(transcriptContent);
62
+ } else {
63
+ transcriptContent = DOMPurify.sanitize(transcriptContent);
61
64
  }
62
65
  return transcriptContent;
63
66
  };
@@ -154,12 +157,13 @@ const beautifyChatTranscripts = (chatTranscripts, renderMarkDown, attachmentMess
154
157
  export const downloadTranscript = async (chatSDK, renderMarkDown, bannerMessageOnError, attachmentMessage, state) => {
155
158
  var _state$domainStates, _state$domainStates2, _state$domainStates2$;
156
159
  // Need to keep existing request id for scenarios when trnascript is downloaded after endchat
157
- const existingRequestId = chatSDK.requestId;
158
- chatSDK.chatToken = state === null || state === void 0 ? void 0 : (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.chatToken;
159
- chatSDK.requestId = state === null || state === void 0 ? void 0 : (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : (_state$domainStates2$ = _state$domainStates2.chatToken) === null || _state$domainStates2$ === void 0 ? void 0 : _state$domainStates2$.requestId;
160
- let data = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getLiveChatTranscript());
161
- // This is used for allowing to start next chat
162
- chatSDK.requestId = existingRequestId;
160
+ const liveChatContext = {
161
+ chatToken: state === null || state === void 0 ? void 0 : (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.chatToken,
162
+ requestId: state === null || state === void 0 ? void 0 : (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : (_state$domainStates2$ = _state$domainStates2.chatToken) === null || _state$domainStates2$ === void 0 ? void 0 : _state$domainStates2$.requestId
163
+ };
164
+ let data = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getLiveChatTranscript({
165
+ liveChatContext
166
+ }));
163
167
  if (typeof data === Constants.String) {
164
168
  data = JSON.parse(data);
165
169
  }
@@ -1,20 +1,20 @@
1
+ import { ConfirmationState, Constants, ConversationEndEntity } from "../../../common/Constants";
1
2
  import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
3
+ import { getAuthClientFunction, handleAuthentication } from "./authHelper";
4
+ import { getConversationDetailsCall, getWidgetEndChatEventName, isNullOrEmptyString } from "../../../common/utils";
5
+ import { getPostChatContext, initiatePostChat } from "./renderSurveyHelpers";
2
6
  import { BroadcastService } from "@microsoft/omnichannel-chat-components";
3
7
  import { ConversationState } from "../../../contexts/common/ConversationState";
4
8
  import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
5
9
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
6
10
  import { WebChatStoreLoader } from "../../webchatcontainerstateful/webchatcontroller/WebChatStoreLoader";
7
11
  import { defaultWebChatContainerStatefulProps } from "../../webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps";
8
- import { getWidgetEndChatEventName, isNullOrEmptyString } from "../../../common/utils";
9
- import { getAuthClientFunction, handleAuthentication } from "./authHelper";
10
- import { initiatePostChat, getPostChatContext } from "./renderSurveyHelpers";
11
- import { Constants, ConversationEndEntity, ConfirmationState } from "../../../common/Constants";
12
12
 
13
13
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
14
  const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter, uwid) => {
15
15
  try {
16
16
  var _conversationDetails$, _state$domainStates, _state$domainStates2;
17
- const conversationDetails = await getConversationDetails(chatSDK);
17
+ const conversationDetails = await getConversationDetailsCall(chatSDK);
18
18
 
19
19
  // Use Case : When post chat is not configured
20
20
  if ((conversationDetails === null || conversationDetails === void 0 ? void 0 : (_conversationDetails$ = conversationDetails.canRenderPostChat) === null || _conversationDetails$ === void 0 ? void 0 : _conversationDetails$.toLowerCase()) === Constants.false) {
@@ -51,7 +51,7 @@ const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWe
51
51
 
52
52
  // Initiate post chat render
53
53
  if (state !== null && state !== void 0 && (_state$domainStates2 = state.domainStates) !== null && _state$domainStates2 !== void 0 && _state$domainStates2.postChatContext) {
54
- await initiatePostChat(props, conversationDetails, state, dispatch);
54
+ await initiatePostChat(props, conversationDetails, state, dispatch, postchatContext);
55
55
  return;
56
56
  }
57
57
  } catch (error) {
@@ -246,25 +246,4 @@ const getEndChatEventName = async (chatSDK, props) => {
246
246
  var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _props$controlProps4;
247
247
  return 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, (props === null || props === void 0 ? void 0 : (_props$controlProps4 = props.controlProps) === null || _props$controlProps4 === void 0 ? void 0 : _props$controlProps4.widgetInstanceId) ?? "");
248
248
  };
249
-
250
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
251
- const getConversationDetails = async chatSDK => {
252
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
253
- let conversationDetails = undefined;
254
- try {
255
- TelemetryHelper.logSDKEvent(LogLevel.INFO, {
256
- Event: TelemetryEvent.GetConversationDetailsCallStarted,
257
- Description: "Conversation details call started"
258
- });
259
- conversationDetails = await chatSDK.getConversationDetails();
260
- } catch (error) {
261
- TelemetryHelper.logSDKEvent(LogLevel.ERROR, {
262
- Event: TelemetryEvent.GetConversationDetailsCallFailed,
263
- ExceptionDetails: {
264
- exception: `Get Conversation Details Call Failed : ${error}`
265
- }
266
- });
267
- }
268
- return conversationDetails;
269
- };
270
- export { prepareEndChat, endChat, getConversationDetails };
249
+ export { prepareEndChat, endChat };
@@ -1,19 +1,23 @@
1
+ import { ConversationEndEntity, ParticipantType } from "../../../common/Constants";
1
2
  import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
2
- import { createStore } from "botframework-webchat";
3
+ import { changeLanguageCodeFormatForWebChat, getConversationDetailsCall } from "../../../common/utils";
4
+ import HyperlinkTextOverrideRenderer from "../../webchatcontainerstateful/webchatcontroller/markdownrenderers/HyperlinkTextOverrideRenderer";
3
5
  import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
4
6
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
5
7
  import { WebChatStoreLoader } from "../../webchatcontainerstateful/webchatcontroller/WebChatStoreLoader";
6
8
  import attachmentProcessingMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware";
7
- import { changeLanguageCodeFormatForWebChat } from "../../../common/utils";
8
9
  import channelDataMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware";
9
10
  import { createActivityMiddleware } from "../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware";
10
11
  import createAttachmentMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware";
11
12
  import createAttachmentUploadValidatorMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware";
12
13
  import { createAvatarMiddleware } from "../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware";
14
+ import { createCardActionMiddleware } from "../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware";
13
15
  import createConversationEndMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware";
14
16
  import createDataMaskingMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware";
15
17
  import { createMarkdown } from "./createMarkdown";
16
18
  import createMaxMessageSizeValidator from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator";
19
+ import createMessageTimeStampMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware";
20
+ import { createStore } from "botframework-webchat";
17
21
  import { createWebChatTelemetry } from "../../webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger";
18
22
  import { defaultAttachmentProps } from "../../webchatcontainerstateful/common/defaultProps/defaultAttachmentProps";
19
23
  import { defaultMiddlewareLocalizedTexts } from "../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts";
@@ -24,15 +28,13 @@ import htmlPlayerMiddleware from "../../webchatcontainerstateful/webchatcontroll
24
28
  import htmlTextMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware";
25
29
  import preProcessingMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware";
26
30
  import sanitizationMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware";
27
- import { createCardActionMiddleware } from "../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware";
28
- import createMessageTimeStampMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware";
29
- import { ConversationEndEntity, ParticipantType } from "../../../common/Constants";
30
- import { getConversationDetails } from "./endChat";
31
- import HyperlinkTextOverrideRenderer from "../../webchatcontainerstateful/webchatcontroller/markdownrenderers/HyperlinkTextOverrideRenderer";
31
+ import DOMPurify from "dompurify";
32
32
 
33
33
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
34
  export const initWebChatComposer = (props, state, dispatch, chatSDK) => {
35
35
  var _props$webChatContain, _props$webChatContain2, _props$webChatContain3, _props$webChatContain4, _state$domainStates$l4, _state$domainStates$l5, _props$webChatContain9, _props$webChatContain10, _state$domainStates$r, _state$domainStates$r2, _props$webChatContain11, _props$webChatContain12, _state$domainStates$r3, _state$domainStates$r4, _props$webChatContain13, _props$webChatContain14, _defaultWebChatContai, _props$webChatContain15, _props$webChatContain16, _state$domainStates$r5, _state$domainStates$r6, _props$webChatContain17, _props$webChatContain18, _defaultWebChatContai2, _props$webChatContain19, _props$webChatContain20, _defaultWebChatContai3, _props$webChatContain21, _props$webChatContain22;
36
+ // Add a hook to make all links open a new window
37
+ postDomPurifyActivities();
36
38
  const localizedTexts = {
37
39
  ...defaultMiddlewareLocalizedTexts,
38
40
  ...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.localizedTexts)
@@ -47,7 +49,7 @@ export const initWebChatComposer = (props, state, dispatch, chatSDK) => {
47
49
  var _state$domainStates$l, _state$domainStates$l2, _state$domainStates$l3, _props$webChatContain5;
48
50
  const conversationEndCallback = async () => {
49
51
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
- const conversationDetails = await getConversationDetails(chatSDK);
52
+ const conversationDetails = await getConversationDetailsCall(chatSDK);
51
53
  if ((conversationDetails === null || conversationDetails === void 0 ? void 0 : conversationDetails.participantType) === ParticipantType.Bot) {
52
54
  dispatch({
53
55
  type: LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY,
@@ -85,9 +87,17 @@ export const initWebChatComposer = (props, state, dispatch, chatSDK) => {
85
87
  markdownRenderers.forEach(renderer => {
86
88
  text = renderer.render(text);
87
89
  });
90
+ text = DOMPurify.sanitize(text);
88
91
  return text;
89
92
  };
90
-
93
+ function postDomPurifyActivities() {
94
+ DOMPurify.addHook("afterSanitizeAttributes", function (node) {
95
+ // set all elements owning target to target=_blank
96
+ if ("target" in node) {
97
+ node.setAttribute("target", "_blank");
98
+ }
99
+ });
100
+ }
91
101
  // Initialize the remaining Web Chat props
92
102
  const webChatProps = {
93
103
  ...defaultWebChatContainerStatefulProps.webChatProps,
@@ -1,7 +1,7 @@
1
1
  import "regenerator-runtime/runtime";
2
2
  import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
3
+ import { checkContactIdError, isNullOrEmptyString, isNullOrUndefined } from "../../../common/utils";
3
4
  import { handleAuthentication, removeAuthTokenProvider } from "./authHelper";
4
- import { isNullOrEmptyString, isNullOrUndefined } from "../../../common/utils";
5
5
  import { BroadcastService } from "@microsoft/omnichannel-chat-components";
6
6
  import { ConversationState } from "../../../contexts/common/ConversationState";
7
7
  import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
@@ -69,6 +69,7 @@ const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticat
69
69
  }
70
70
  return reconnectChatContext;
71
71
  } catch (error) {
72
+ checkContactIdError(error);
72
73
  TelemetryHelper.logSDKEvent(LogLevel.ERROR, {
73
74
  Event: TelemetryEvent.GetChatReconnectContextSDKCallFailed,
74
75
  ExceptionDetails: {
@@ -81,10 +81,11 @@ const embedModePostChatWorkflow = async (state, dispatch) => {
81
81
  };
82
82
 
83
83
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
84
- const initiatePostChat = async (props, conversationDetailsParam, state, dispatch) => {
84
+ const initiatePostChat = async (props, conversationDetailsParam, state, dispatch, postchatContext) => {
85
85
  var _conversationDetails;
86
86
  conversationDetails = conversationDetailsParam;
87
- await setSurveyMode(props, (_conversationDetails = conversationDetails) === null || _conversationDetails === void 0 ? void 0 : _conversationDetails.participantType, state, dispatch);
87
+ const participantType = ((_conversationDetails = conversationDetails) === null || _conversationDetails === void 0 ? void 0 : _conversationDetails.participantType) ?? postchatContext.participantType;
88
+ await setSurveyMode(props, participantType, state, dispatch);
88
89
  await renderSurvey(state, dispatch);
89
90
  };
90
91
 
@@ -1,6 +1,6 @@
1
1
  import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
2
2
  import { ChatSDKError, Constants, LiveWorkItemState } from "../../../common/Constants";
3
- import { createTimer, getStateFromCache, getWidgetCacheIdfromProps, isNullOrEmptyString, isUndefinedOrEmpty } from "../../../common/utils";
3
+ import { checkContactIdError, createTimer, getConversationDetailsCall, getStateFromCache, getWidgetCacheIdfromProps, isNullOrEmptyString, isUndefinedOrEmpty } from "../../../common/utils";
4
4
  import { getAuthClientFunction, handleAuthentication } from "./authHelper";
5
5
  import { ActivityStreamHandler } from "./ActivityStreamHandler";
6
6
  import { BroadcastService } from "@microsoft/omnichannel-chat-components";
@@ -55,12 +55,13 @@ const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) =>
55
55
 
56
56
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
57
  const setPreChatAndInitiateChat = async (chatSDK, dispatch, setAdapter, isProactiveChat, proactiveChatEnablePrechatState, state, props) => {
58
+ var _props$controlProps;
58
59
  //Handle reconnect scenario
59
60
 
60
61
  // Getting prechat Survey Context
61
62
  const parseToJson = false;
62
63
  const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
63
- const showPrechat = isProactiveChat ? preChatSurveyResponse && proactiveChatEnablePrechatState : preChatSurveyResponse;
64
+ const showPrechat = isProactiveChat ? preChatSurveyResponse && proactiveChatEnablePrechatState : preChatSurveyResponse && !(props !== null && props !== void 0 && (_props$controlProps = props.controlProps) !== null && _props$controlProps !== void 0 && _props$controlProps.hidePreChatSurveyPane);
64
65
  if (showPrechat) {
65
66
  dispatch({
66
67
  type: LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
@@ -86,13 +87,13 @@ const setPreChatAndInitiateChat = async (chatSDK, dispatch, setAdapter, isProact
86
87
 
87
88
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
89
  const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persistedState) => {
89
- var _props$controlProps;
90
+ var _props$controlProps2;
90
91
  let isStartChatSuccessful = false;
91
92
  const chatConfig = props === null || props === void 0 ? void 0 : props.chatConfig;
92
93
  const getAuthToken = props === null || props === void 0 ? void 0 : props.getAuthToken;
93
- const hideErrorUIPane = props === null || props === void 0 ? void 0 : (_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.hideErrorUIPane;
94
+ const hideErrorUIPane = props === null || props === void 0 ? void 0 : (_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.hideErrorUIPane;
94
95
  try {
95
- var _newAdapter$activity$, _TelemetryTimers$Widg;
96
+ var _newAdapter$activity$, _TelemetryTimers$Widg2;
96
97
  //Start widget load timer
97
98
  TelemetryTimers.WidgetLoadTimer = createTimer();
98
99
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
@@ -133,6 +134,7 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persi
133
134
  await chatSDK.startChat(startChatOptionalParams);
134
135
  isStartChatSuccessful = true;
135
136
  } catch (error) {
137
+ checkContactIdError(error);
136
138
  TelemetryHelper.logSDKEvent(LogLevel.ERROR, {
137
139
  Event: TelemetryEvent.StartChatMethodException,
138
140
  ExceptionDetails: {
@@ -167,10 +169,16 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persi
167
169
  });
168
170
  }
169
171
  if (persistedState) {
172
+ var _TelemetryTimers$Widg;
170
173
  dispatch({
171
174
  type: LiveChatWidgetActionType.SET_WIDGET_STATE,
172
175
  payload: persistedState
173
176
  });
177
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
178
+ Event: TelemetryEvent.WidgetLoadComplete,
179
+ Description: "Widget load complete. Persisted state retrieved",
180
+ ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg === void 0 ? void 0 : _TelemetryTimers$Widg.milliSecondsElapsed
181
+ });
174
182
  await setPostChatContextAndLoadSurvey(chatSDK, dispatch, true);
175
183
  return;
176
184
  }
@@ -184,7 +192,7 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persi
184
192
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
185
193
  Event: TelemetryEvent.WidgetLoadComplete,
186
194
  Description: "Widget load complete",
187
- ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg === void 0 ? void 0 : _TelemetryTimers$Widg.milliSecondsElapsed
195
+ ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg2 = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg2 === void 0 ? void 0 : _TelemetryTimers$Widg2.milliSecondsElapsed
188
196
  });
189
197
 
190
198
  // Set post chat context in state
@@ -194,15 +202,10 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persi
194
202
  // Updating chat session detail for telemetry
195
203
  await updateSessionDataForTelemetry(chatSDK, dispatch);
196
204
  } catch (ex) {
197
- TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
198
- Event: TelemetryEvent.WidgetLoadFailed,
199
- ExceptionDetails: {
200
- Exception: `Widget load Failed: ${ex}`
201
- }
202
- });
203
- NotificationHandler.notifyError(NotificationScenarios.Connection, "Start Chat Failed: " + ex);
205
+ var _TelemetryTimers$Widg4;
204
206
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
205
207
  if (ex.message === ChatSDKError.WidgetUseOutsideOperatingHour) {
208
+ var _TelemetryTimers$Widg3;
206
209
  dispatch({
207
210
  type: LiveChatWidgetActionType.SET_OUTSIDE_OPERATING_HOURS,
208
211
  payload: true
@@ -211,8 +214,21 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persi
211
214
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
212
215
  payload: ConversationState.OutOfOffice
213
216
  });
217
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
218
+ Event: TelemetryEvent.WidgetLoadComplete,
219
+ Description: "Widget load complete. Widget is OOOH.",
220
+ ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg3 = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg3 === void 0 ? void 0 : _TelemetryTimers$Widg3.milliSecondsElapsed
221
+ });
214
222
  return;
215
223
  }
224
+ TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
225
+ Event: TelemetryEvent.WidgetLoadFailed,
226
+ ExceptionDetails: {
227
+ Exception: `Widget load Failed: ${ex}`
228
+ },
229
+ ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg4 = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg4 === void 0 ? void 0 : _TelemetryTimers$Widg4.milliSecondsElapsed
230
+ });
231
+ NotificationHandler.notifyError(NotificationScenarios.Connection, "Start Chat Failed: " + ex);
216
232
  dispatch({
217
233
  type: LiveChatWidgetActionType.SET_START_CHAT_FAILING,
218
234
  payload: true
@@ -343,7 +359,7 @@ const checkIfConversationStillValid = async (chatSDK, dispatch, state) => {
343
359
  });
344
360
  try {
345
361
  chatSDK.requestId = requestIdFromCache;
346
- conversationDetails = await chatSDK.getConversationDetails();
362
+ conversationDetails = await getConversationDetailsCall(chatSDK);
347
363
  if (Object.keys(conversationDetails).length === 0) {
348
364
  chatSDK.requestId = currentRequestId;
349
365
  return false;
@@ -3,6 +3,7 @@ import { BroadcastService } from "@microsoft/omnichannel-chat-components";
3
3
  import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
4
4
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
5
5
  import { TelemetryManager } from "../../../common/telemetry/TelemetryManager";
6
+ import { getConversationDetailsCall } from "../../../common/utils";
6
7
 
7
8
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
9
  export const updateSessionDataForTelemetry = async (chatSDK, dispatch) => {
@@ -28,7 +29,7 @@ export const updateSessionDataForTelemetry = async (chatSDK, dispatch) => {
28
29
  const updateConversationDataForTelemetry = async (chatSDK, dispatch) => {
29
30
  if (chatSDK) {
30
31
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
- const liveWorkItem = await chatSDK.getConversationDetails();
32
+ const liveWorkItem = await getConversationDetailsCall(chatSDK);
32
33
  const telemetryData = TelemetryHelper.addConversationDataToTelemetry(liveWorkItem, TelemetryManager.InternalTelemetryData);
33
34
  dispatch({
34
35
  type: LiveChatWidgetActionType.SET_TELEMETRY_DATA,
@@ -134,6 +134,14 @@ export const LiveChatWidgetStateful = props => {
134
134
  }
135
135
  if (isChatValid === false) {
136
136
  if (localState) {
137
+ // adding the reconnect logic for the case when customer tries to reconnect from a new browser or InPrivate browser
138
+ if (isReconnectEnabled(props.chatConfig) === true) {
139
+ await handleChatReconnect(chatSDK, props, dispatch, setAdapter, initStartChat, state);
140
+ // If chat reconnect has kicked in chat state will become Active or Reconnect. So just exit, else go next
141
+ if (state.appStates.conversationState === ConversationState.Active || state.appStates.conversationState === ConversationState.ReconnectChat) {
142
+ return;
143
+ }
144
+ }
137
145
  await setPreChatAndInitiateChat(chatSDK, dispatch, setAdapter, undefined, undefined, localState, props);
138
146
  return;
139
147
  } else {
@@ -53,9 +53,13 @@ export const ProactiveChatPaneStateful = props => {
53
53
  Description: "Proactive chat accepted."
54
54
  });
55
55
  if (state.appStates.proactiveChatStates.proactiveChatInNewWindow) {
56
+ var _state$appStates, _state$appStates$proa;
56
57
  // TODO: BroadcastService: replace with the sdk broadcast service, when in place
57
58
  const startPopoutChatEvent = {
58
- eventName: BroadcastEvent.ProactiveChatStartPopoutChat
59
+ eventName: BroadcastEvent.ProactiveChatStartPopoutChat,
60
+ payload: {
61
+ enablePrechat: (state === null || state === void 0 ? void 0 : (_state$appStates = state.appStates) === null || _state$appStates === void 0 ? void 0 : (_state$appStates$proa = _state$appStates.proactiveChatStates) === null || _state$appStates$proa === void 0 ? void 0 : _state$appStates$proa.proactiveChatEnablePrechat) === true
62
+ }
59
63
  };
60
64
  BroadcastService.postMessage(startPopoutChatEvent);
61
65
  dispatch({
@@ -155,7 +155,8 @@ export declare enum ElementType {
155
155
  CallingContainerSDK = "CallingContainerSDK"
156
156
  }
157
157
  export declare enum ChatSDKError {
158
- WidgetUseOutsideOperatingHour = "WidgetUseOutsideOperatingHour"
158
+ WidgetUseOutsideOperatingHour = "WidgetUseOutsideOperatingHour",
159
+ AuthContactIdNotFoundFailure = "AuthContactIdNotFoundFailure"
159
160
  }
160
161
  export declare enum EnvironmentVersion {
161
162
  prod = "prod",
@@ -51,7 +51,8 @@ export declare enum BroadcastEvent {
51
51
  InitiateStartChatInPopoutMode = "InitiateStartChatInPopoutMode",
52
52
  HideChatVisibilityChangeEvent = "hideChatVisibilityChangeEvent",
53
53
  UpdateSessionDataForTelemetry = "UpdateSessionDataForTelemetry",
54
- UpdateConversationDataForTelemetry = "UpdateConversationDataForTelemetry"
54
+ UpdateConversationDataForTelemetry = "UpdateConversationDataForTelemetry",
55
+ ContactIdNotFound = "ContactIdNotFound"
55
56
  }
56
57
  export declare enum TelemetryEvent {
57
58
  CallAdded = "CallAdded",
@@ -1,11 +1,11 @@
1
- import { LogLevel, TelemetryEvent, TelemetryInput } from "./TelemetryConstants";
2
1
  import { BaseContract, TelemetryContract } from "./definitions/Contracts";
3
2
  import { TelemetryData } from "./definitions/Payload";
3
+ import { LogLevel, TelemetryEvent, TelemetryInput } from "./TelemetryConstants";
4
4
  import ChatConfig from "@microsoft/omnichannel-chat-sdk/lib/core/ChatConfig";
5
- import LiveChatContext from "@microsoft/omnichannel-chat-sdk/lib/core/LiveChatContext";
6
- import LiveWorkItemDetails from "@microsoft/omnichannel-chat-sdk/lib/core/LiveWorkItemDetails";
7
5
  import { IInternalTelemetryData } from "./interfaces/IInternalTelemetryData";
8
6
  import { ITelemetryConfig } from "./interfaces/ITelemetryConfig";
7
+ import LiveChatContext from "@microsoft/omnichannel-chat-sdk/lib/core/LiveChatContext";
8
+ import LiveWorkItemDetails from "@microsoft/omnichannel-chat-sdk/lib/core/LiveWorkItemDetails";
9
9
  export interface TelemetryEventWrapper {
10
10
  Event: TelemetryEvent;
11
11
  Description?: string;
@@ -22,6 +22,7 @@ export interface LoadTelemetryData extends BaseTelemetryData {
22
22
  OCChatSDKVersion?: string;
23
23
  OCChatWidgetVersion?: string;
24
24
  OCChatComponentsVersion?: string;
25
+ Description?: string;
25
26
  }
26
27
  export interface MessageProcessingErrorData extends BaseTelemetryData {
27
28
  Event: string;
@@ -31,3 +31,4 @@ export declare const getBroadcastChannelName: (widgetId: string, widgetInstanceI
31
31
  export declare const getWidgetCacheIdfromProps: (props: any, popoutChat?: boolean) => string;
32
32
  export declare const debounceLeading: (fn: any, ms?: number) => (...args: any[]) => void;
33
33
  export declare const getConversationDetailsCall: (chatSDK: any) => Promise<any>;
34
+ export declare const checkContactIdError: (e: any) => void;
@@ -1,8 +1,7 @@
1
1
  import { Dispatch } from "react";
2
2
  import { ILiveChatWidgetAction } from "../../../contexts/common/ILiveChatWidgetAction";
3
- import { ILiveChatWidgetProps } from "../interfaces/ILiveChatWidgetProps";
4
3
  import { ILiveChatWidgetContext } from "../../../contexts/common/ILiveChatWidgetContext";
4
+ import { ILiveChatWidgetProps } from "../interfaces/ILiveChatWidgetProps";
5
5
  declare const prepareEndChat: (props: ILiveChatWidgetProps, chatSDK: any, state: ILiveChatWidgetContext, dispatch: Dispatch<ILiveChatWidgetAction>, setAdapter: any, setWebChatStyles: any, adapter: any, uwid: string) => Promise<void>;
6
6
  declare const endChat: (props: ILiveChatWidgetProps, chatSDK: any, state: ILiveChatWidgetContext, dispatch: Dispatch<ILiveChatWidgetAction>, setAdapter: any, setWebChatStyles: any, adapter: any, skipEndChatSDK?: boolean | undefined, skipCloseChat?: boolean | undefined, postMessageToOtherTab?: boolean | undefined, uwid?: string) => Promise<void>;
7
- declare const getConversationDetails: (chatSDK: any) => Promise<any>;
8
- export { prepareEndChat, endChat, getConversationDetails };
7
+ export { prepareEndChat, endChat };
@@ -2,7 +2,7 @@ import { Dispatch } from "react";
2
2
  import { ILiveChatWidgetAction } from "../../../contexts/common/ILiveChatWidgetAction";
3
3
  import { ILiveChatWidgetContext } from "../../../contexts/common/ILiveChatWidgetContext";
4
4
  import { ILiveChatWidgetProps } from "../interfaces/ILiveChatWidgetProps";
5
- declare const initiatePostChat: (props: ILiveChatWidgetProps, conversationDetailsParam: any, state: ILiveChatWidgetContext, dispatch: Dispatch<ILiveChatWidgetAction>) => Promise<void>;
5
+ declare const initiatePostChat: (props: ILiveChatWidgetProps, conversationDetailsParam: any, state: ILiveChatWidgetContext, dispatch: Dispatch<ILiveChatWidgetAction>, postchatContext: any) => Promise<void>;
6
6
  declare const isPostChatEnabled: (props: ILiveChatWidgetProps, state: ILiveChatWidgetContext) => boolean;
7
7
  declare const getPostChatContext: (chatSDK: any, state: ILiveChatWidgetContext, dispatch: Dispatch<ILiveChatWidgetAction>) => Promise<void>;
8
8
  declare const setWidgetStateToInactive: (dispatch: Dispatch<ILiveChatWidgetAction>) => Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/omnichannel-chat-widget",
3
- "version": "1.0.4-main.d4abfe6",
3
+ "version": "1.0.5-main.09afcbb",
4
4
  "description": "Microsoft Omnichannel Chat Widget",
5
5
  "main": "lib/cjs/index.js",
6
6
  "types": "lib/types/index.d.ts",
@@ -74,9 +74,8 @@
74
74
  "webpack-cli": "^4.9.2"
75
75
  },
76
76
  "dependencies": {
77
- "@fluentui/react": "^8.49.1",
78
- "@microsoft/omnichannel-chat-components": "1.0.1",
79
- "@microsoft/omnichannel-chat-sdk": "1.3.0",
77
+ "@microsoft/omnichannel-chat-components": "^1.0.1",
78
+ "@microsoft/omnichannel-chat-sdk": "1.4.2",
80
79
  "abort-controller-es5": "^2.0.1",
81
80
  "dompurify": "^2.3.4",
82
81
  "markdown-it": "^12.3.2",