@microsoft/omnichannel-chat-widget 1.7.3-main.fee24eb → 1.7.4-main.0574a04

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 (61) hide show
  1. package/lib/cjs/common/Constants.js +1 -0
  2. package/lib/cjs/common/telemetry/TelemetryConstants.js +3 -0
  3. package/lib/cjs/components/footerstateful/FooterStateful.js +17 -3
  4. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +15 -6
  5. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/HiddenAdaptiveCardActivitySubscriber.js +77 -0
  6. package/lib/cjs/components/livechatwidget/common/chatDisconnectHelper.js +2 -2
  7. package/lib/cjs/components/livechatwidget/common/createAdapter.js +15 -2
  8. package/lib/cjs/components/livechatwidget/common/createInternetConnectionChangeHandler.js +6 -2
  9. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +2 -2
  10. package/lib/cjs/components/livechatwidget/common/endChat.js +20 -9
  11. package/lib/cjs/components/livechatwidget/common/helpers/markdownHelper.js +23 -0
  12. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +8 -4
  13. package/lib/cjs/components/livechatwidget/common/persistentChatHelper.js +2 -1
  14. package/lib/cjs/components/livechatwidget/common/startChat.js +9 -3
  15. package/lib/cjs/components/livechatwidget/interfaces/IBotAuthActivitySubscriberOptionalParams.js +1 -0
  16. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +49 -0
  17. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +11 -6
  18. package/lib/cjs/components/webchatcontainerstateful/common/DesignerChatAdapter.js +4 -4
  19. package/lib/cjs/components/webchatcontainerstateful/common/DesignerChatSDK.js +31 -0
  20. package/lib/cjs/components/webchatcontainerstateful/interfaces/IBotAuthConfig.js +1 -0
  21. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +2 -1
  22. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.js +8 -0
  23. package/lib/cjs/index.js +7 -0
  24. package/lib/cjs/plugins/createChatTranscript.js +84 -0
  25. package/lib/esm/common/Constants.js +1 -0
  26. package/lib/esm/common/telemetry/TelemetryConstants.js +3 -0
  27. package/lib/esm/components/footerstateful/FooterStateful.js +15 -3
  28. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +15 -6
  29. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/HiddenAdaptiveCardActivitySubscriber.js +70 -0
  30. package/lib/esm/components/livechatwidget/common/chatDisconnectHelper.js +3 -2
  31. package/lib/esm/components/livechatwidget/common/createAdapter.js +14 -2
  32. package/lib/esm/components/livechatwidget/common/createInternetConnectionChangeHandler.js +6 -2
  33. package/lib/esm/components/livechatwidget/common/createMarkdown.js +2 -2
  34. package/lib/esm/components/livechatwidget/common/endChat.js +20 -9
  35. package/lib/esm/components/livechatwidget/common/helpers/markdownHelper.js +15 -0
  36. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +8 -4
  37. package/lib/esm/components/livechatwidget/common/persistentChatHelper.js +2 -1
  38. package/lib/esm/components/livechatwidget/common/startChat.js +9 -3
  39. package/lib/esm/components/livechatwidget/interfaces/IBotAuthActivitySubscriberOptionalParams.js +1 -0
  40. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +50 -1
  41. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +11 -6
  42. package/lib/esm/components/webchatcontainerstateful/common/DesignerChatAdapter.js +4 -4
  43. package/lib/esm/components/webchatcontainerstateful/common/DesignerChatSDK.js +31 -0
  44. package/lib/esm/components/webchatcontainerstateful/interfaces/IBotAuthConfig.js +1 -0
  45. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +2 -1
  46. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/notification/NotificationHandler.js +8 -0
  47. package/lib/esm/index.js +1 -0
  48. package/lib/esm/plugins/createChatTranscript.js +84 -0
  49. package/lib/types/common/Constants.d.ts +1 -0
  50. package/lib/types/common/telemetry/TelemetryConstants.d.ts +5 -2
  51. package/lib/types/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.d.ts +4 -1
  52. package/lib/types/components/livechatwidget/common/ActivitySubscriber/HiddenAdaptiveCardActivitySubscriber.d.ts +7 -0
  53. package/lib/types/components/livechatwidget/common/createAdapter.d.ts +2 -1
  54. package/lib/types/components/livechatwidget/common/helpers/markdownHelper.d.ts +2 -0
  55. package/lib/types/components/livechatwidget/interfaces/IBotAuthActivitySubscriberOptionalParams.d.ts +4 -0
  56. package/lib/types/components/webchatcontainerstateful/common/DesignerChatSDK.d.ts +25 -0
  57. package/lib/types/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.d.ts +1 -0
  58. package/lib/types/components/webchatcontainerstateful/interfaces/IBotAuthConfig.d.ts +4 -0
  59. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +2 -0
  60. package/lib/types/index.d.ts +1 -0
  61. package/package.json +4 -2
@@ -307,6 +307,7 @@ class WidgetLoadCustomErrorString {}
307
307
  exports.WidgetLoadCustomErrorString = WidgetLoadCustomErrorString;
308
308
  _defineProperty(WidgetLoadCustomErrorString, "AuthenticationFailedErrorString", "Authentication was not successful");
309
309
  _defineProperty(WidgetLoadCustomErrorString, "NetworkErrorString", "Network Error");
310
+ _defineProperty(WidgetLoadCustomErrorString, "CloseAdapterAfterDisconnectionErrorString", "Error trying to end/close chat adapter after the widget is back on-line, for an already disconnected session");
310
311
  class PrepareEndChatDescriptionConstants {}
311
312
  exports.PrepareEndChatDescriptionConstants = PrepareEndChatDescriptionConstants;
312
313
  _defineProperty(PrepareEndChatDescriptionConstants, "ConversationEndedByCustomerWithoutPostChat", "Conversation ended by customer. Post chat not configured or should not show.");
@@ -65,6 +65,7 @@ exports.BroadcastEvent = BroadcastEvent;
65
65
  BroadcastEvent["UpdateConversationDataForTelemetry"] = "UpdateConversationDataForTelemetry";
66
66
  BroadcastEvent["ContactIdNotFound"] = "ContactIdNotFound";
67
67
  BroadcastEvent["SyncMinimize"] = "SyncMinimize";
68
+ BroadcastEvent["OnWidgetError"] = "OnWidgetError";
68
69
  })(BroadcastEvent || (exports.BroadcastEvent = BroadcastEvent = {}));
69
70
  let TelemetryEvent;
70
71
  exports.TelemetryEvent = TelemetryEvent;
@@ -215,6 +216,8 @@ exports.TelemetryEvent = TelemetryEvent;
215
216
  TelemetryEvent["PostChatSurveyLoadingPaneLoaded"] = "PostChatSurveyLoadingPaneLoaded";
216
217
  TelemetryEvent["PostChatSurveyLoaded"] = "PostChatSurveyLoaded";
217
218
  TelemetryEvent["ChatDisconnectThreadEventReceived"] = "ChatDisconnectThreadEventReceived";
219
+ TelemetryEvent["HiddenAdaptiveCardMessageReceived"] = "HiddenAdaptiveCardMessageReceived";
220
+ TelemetryEvent["EndingAdapterAfterDisconnectionError"] = "EndingAdapterAfterDisconnectionError";
218
221
  })(TelemetryEvent || (exports.TelemetryEvent = TelemetryEvent = {}));
219
222
  class TelemetryConstants {
220
223
  static map(eventTypeOrScenarioType) {
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = exports.FooterStateful = void 0;
7
7
  var _TelemetryConstants = require("../../common/telemetry/TelemetryConstants");
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = _interopRequireWildcard(require("react"));
9
9
  var _AudioNotificationStateful = _interopRequireDefault(require("./audionotificationstateful/AudioNotificationStateful"));
10
10
  var _Constants = require("../../common/Constants");
11
11
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
@@ -17,10 +17,13 @@ var _TelemetryHelper = require("../../common/telemetry/TelemetryHelper");
17
17
  var _DownloadTranscriptStateful = require("./downloadtranscriptstateful/DownloadTranscriptStateful");
18
18
  var _useChatContextStore = _interopRequireDefault(require("../../hooks/useChatContextStore"));
19
19
  var _useChatSDKStore = _interopRequireDefault(require("../../hooks/useChatSDKStore"));
20
+ var _ConversationState = require("../../contexts/common/ConversationState");
20
21
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
21
24
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
25
  const FooterStateful = props => {
23
- var _footerProps$controlP3, _footerProps$controlP4;
26
+ var _footerProps$controlP3;
24
27
  const [state, dispatch] = (0, _useChatContextStore.default)();
25
28
  // hideFooterDisplay - the purpose of this is to keep the footer always "active",
26
29
  // but hide it visually in certain states (e.g., loading state) and show in some other states (e.g. active state).
@@ -87,13 +90,24 @@ const FooterStateful = props => {
87
90
  isAudioMuted: state.appStates.isAudioMuted
88
91
  }
89
92
  };
93
+ (0, _react.useEffect)(() => {
94
+ if (state.appStates.conversationState === _ConversationState.ConversationState.Active) {
95
+ if (state.appStates.isAudioMuted === null) {
96
+ var _footerProps$controlP4, _footerProps$controlP5, _footerProps$controlP6;
97
+ dispatch({
98
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_AUDIO_NOTIFICATION,
99
+ payload: footerProps !== null && footerProps !== void 0 && (_footerProps$controlP4 = footerProps.controlProps) !== null && _footerProps$controlP4 !== void 0 && _footerProps$controlP4.hideAudioNotificationButton ? true : (footerProps === null || footerProps === void 0 ? void 0 : (_footerProps$controlP5 = footerProps.controlProps) === null || _footerProps$controlP5 === void 0 ? void 0 : (_footerProps$controlP6 = _footerProps$controlP5.audioNotificationButtonProps) === null || _footerProps$controlP6 === void 0 ? void 0 : _footerProps$controlP6.isAudioMuted) ?? false
100
+ });
101
+ }
102
+ }
103
+ }, [state.appStates.conversationState]);
90
104
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !hideFooterDisplay && /*#__PURE__*/_react.default.createElement(_omnichannelChatComponents.Footer, {
91
105
  componentOverrides: footerProps === null || footerProps === void 0 ? void 0 : footerProps.componentOverrides,
92
106
  controlProps: controlProps,
93
107
  styleProps: footerProps === null || footerProps === void 0 ? void 0 : footerProps.styleProps
94
108
  }), /*#__PURE__*/_react.default.createElement(_AudioNotificationStateful.default, {
95
109
  audioSrc: (audioNotificationProps === null || audioNotificationProps === void 0 ? void 0 : audioNotificationProps.audioSrc) ?? _Audios.NewMessageNotificationSoundBase64,
96
- isAudioMuted: state.appStates.isAudioMuted === null ? (footerProps === null || footerProps === void 0 ? void 0 : (_footerProps$controlP4 = footerProps.controlProps) === null || _footerProps$controlP4 === void 0 ? void 0 : _footerProps$controlP4.hideAudioNotificationButton) ?? false : state.appStates.isAudioMuted ?? false
110
+ isAudioMuted: state.appStates.isAudioMuted ?? false
97
111
  }));
98
112
  };
99
113
  exports.FooterStateful = FooterStateful;
@@ -13,8 +13,6 @@ function _toPrimitive(input, hint) { if (typeof input !== "object" || input ===
13
13
  const supportedSignInCardContentTypes = ["application/vnd.microsoft.card.signin", "application/vnd.microsoft.card.oauth"];
14
14
  const botOauthUrlRegex = /[\S]+.botframework.com\/api\/oauth\/signin\?signin=([\S]+)/;
15
15
  const delay = t => new Promise(resolve => setTimeout(resolve, t));
16
- const fetchBotAuthConfigRetries = 3;
17
- const fetchBotAuthConfigRetryInterval = 1000;
18
16
  let response;
19
17
  const extractSignInId = signInUrl => {
20
18
  const result = botOauthUrlRegex.exec(signInUrl);
@@ -43,7 +41,7 @@ const extractSasUrl = async attachment => {
43
41
  }
44
42
  return sasUrl;
45
43
  };
46
- const fetchBotAuthConfig = async retries => {
44
+ const fetchBotAuthConfig = async (retries, interval) => {
47
45
  _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
48
46
  Event: _TelemetryConstants.TelemetryEvent.SetBotAuthProviderFetchConfig
49
47
  });
@@ -64,14 +62,25 @@ const fetchBotAuthConfig = async retries => {
64
62
  // Base Case
65
63
  throw new Error();
66
64
  }
67
- await delay(fetchBotAuthConfigRetryInterval);
68
- return await fetchBotAuthConfig(--retries);
65
+ await delay(interval);
66
+ return await fetchBotAuthConfig(--retries, interval);
69
67
  };
70
68
  class BotAuthActivitySubscriber {
71
69
  constructor() {
70
+ let optionalParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
72
71
  _defineProperty(this, "observer", void 0);
73
72
  _defineProperty(this, "signInCardSeen", void 0);
73
+ _defineProperty(this, "fetchBotAuthConfigRetries", void 0);
74
+ _defineProperty(this, "fetchBotAuthConfigRetryInterval", void 0);
74
75
  this.signInCardSeen = new Set();
76
+ this.fetchBotAuthConfigRetries = 3;
77
+ this.fetchBotAuthConfigRetryInterval = 1000;
78
+ if (optionalParams.fetchBotAuthConfigRetries) {
79
+ this.fetchBotAuthConfigRetries = optionalParams.fetchBotAuthConfigRetries;
80
+ }
81
+ if (optionalParams.fetchBotAuthConfigRetryInterval) {
82
+ this.fetchBotAuthConfigRetryInterval = optionalParams.fetchBotAuthConfigRetryInterval;
83
+ }
75
84
  }
76
85
  applicable(activity) {
77
86
  var _activity$attachments;
@@ -110,7 +119,7 @@ class BotAuthActivitySubscriber {
110
119
  _omnichannelChatComponents.BroadcastService.postMessage(event);
111
120
  }
112
121
  try {
113
- const response = await fetchBotAuthConfig(fetchBotAuthConfigRetries);
122
+ const response = await fetchBotAuthConfig(this.fetchBotAuthConfigRetries, this.fetchBotAuthConfigRetryInterval);
114
123
  if (response === false) {
115
124
  _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
116
125
  Event: _TelemetryConstants.TelemetryEvent.SetBotAuthProviderHideCard
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.HiddenAdaptiveCardActivitySubscriber = void 0;
7
+ var _Constants = require("../../../../common/Constants");
8
+ var _TelemetryConstants = require("../../../../common/telemetry/TelemetryConstants");
9
+ var _TelemetryHelper = require("../../../../common/telemetry/TelemetryHelper");
10
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
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
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
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); }
14
+ class HiddenAdaptiveCardActivitySubscriber {
15
+ constructor() {
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ _defineProperty(this, "observer", void 0);
18
+ }
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ async apply(activity) {
21
+ const {
22
+ attachments,
23
+ attachment
24
+ } = activity;
25
+ this.observer.next(false);
26
+ _omnichannelChatComponents.BroadcastService.postMessage({
27
+ eventName: _TelemetryConstants.BroadcastEvent.NewMessageReceived,
28
+ payload: {
29
+ attachments: attachments || [attachment],
30
+ text: "Custom Event"
31
+ }
32
+ });
33
+ return;
34
+ }
35
+
36
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
37
+ applicable(activity) {
38
+ const {
39
+ attachments,
40
+ attachment
41
+ } = activity;
42
+
43
+ // Use `attachments` or `attachment` (whichever exists)
44
+ const cards = attachments || [attachment];
45
+
46
+ // Check if contentType is "AdaptiveCard"
47
+ const adaptiveCard = cards === null || cards === void 0 ? void 0 : cards.find(
48
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
+ item => _Constants.Constants.supportedAdaptiveCardContentTypes.indexOf(item === null || item === void 0 ? void 0 : item.contentType) >= 0);
50
+ if (adaptiveCard && adaptiveCard.content) {
51
+ const {
52
+ body
53
+ } = adaptiveCard.content;
54
+ if (Array.isArray(body)) {
55
+ // Check if all elements in `body` have `isVisible: false`
56
+ const allInvisible = body.every(item => item.isVisible === false);
57
+ if (allInvisible) {
58
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
59
+ Event: _TelemetryConstants.TelemetryEvent.HiddenAdaptiveCardMessageReceived,
60
+ Description: "All elements in AdaptiveCard are invisible"
61
+ });
62
+ return true;
63
+ }
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+
69
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ async next(activity) {
71
+ if (this.applicable(activity)) {
72
+ return await this.apply(activity);
73
+ }
74
+ return activity;
75
+ }
76
+ }
77
+ exports.HiddenAdaptiveCardActivitySubscriber = HiddenAdaptiveCardActivitySubscriber;
@@ -4,11 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.handleChatDisconnect = void 0;
7
+ var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
7
8
  var _NotificationHandler = require("../../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler");
8
9
  var _NotificationScenarios = require("../../webchatcontainerstateful/webchatcontroller/enums/NotificationScenarios");
9
- var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
10
- var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
11
10
  var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
11
+ var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
12
12
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
13
  const handleChatDisconnect = (props, state, setWebChatStyles) => {
14
14
  var _state$appStates, _state$domainStates, _state$domainStates$m, _props$webChatContain, _props$webChatContain2;
@@ -11,8 +11,14 @@ var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/c
11
11
  var _ChatAdapterShim = require("./ChatAdapterShim");
12
12
  var _PauseActivitySubscriber = require("./ActivitySubscriber/PauseActivitySubscriber");
13
13
  var _BotAuthActivitySubscriber = require("./ActivitySubscriber/BotAuthActivitySubscriber");
14
+ var _HiddenAdaptiveCardActivitySubscriber = require("./ActivitySubscriber/HiddenAdaptiveCardActivitySubscriber");
15
+ const defaultBotAuthConfig = {
16
+ fetchBotAuthConfigRetries: 3,
17
+ fetchBotAuthConfigRetryInterval: 1000
18
+ };
19
+
14
20
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
- const createAdapter = async chatSDK => {
21
+ const createAdapter = async (chatSDK, props) => {
16
22
  const chatAdapterOptionalParams = {
17
23
  IC3Adapter: {
18
24
  options: {
@@ -38,9 +44,16 @@ const createAdapter = async chatSDK => {
38
44
  let adapter = await chatSDK.createChatAdapter(chatAdapterOptionalParams);
39
45
  //so far, there is no need to convert to the shim adapter when using visual tests
40
46
  if (chatSDK.isMockModeOn !== true) {
47
+ var _props$webChatContain, _props$webChatContain2, _props$webChatContain3, _props$webChatContain4;
48
+ const botAuthActivitySubscriberOptionalParams = {
49
+ fetchBotAuthConfigRetries: (props === null || props === void 0 ? void 0 : (_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : (_props$webChatContain2 = _props$webChatContain.botAuthConfig) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.fetchBotAuthConfigRetries) || defaultBotAuthConfig.fetchBotAuthConfigRetries,
50
+ fetchBotAuthConfigRetryInterval: (props === null || props === void 0 ? void 0 : (_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : (_props$webChatContain4 = _props$webChatContain3.botAuthConfig) === null || _props$webChatContain4 === void 0 ? void 0 : _props$webChatContain4.fetchBotAuthConfigRetryInterval) || defaultBotAuthConfig.fetchBotAuthConfigRetryInterval
51
+ };
41
52
  adapter = new _ChatAdapterShim.ChatAdapterShim(adapter);
42
53
  adapter.addSubscriber(new _PauseActivitySubscriber.PauseActivitySubscriber());
43
- adapter.addSubscriber(new _BotAuthActivitySubscriber.BotAuthActivitySubscriber());
54
+ adapter.addSubscriber(new _BotAuthActivitySubscriber.BotAuthActivitySubscriber(botAuthActivitySubscriberOptionalParams));
55
+ // Remove this code after ICM ID:544623085 is fixed
56
+ adapter.addSubscriber(new _HiddenAdaptiveCardActivitySubscriber.HiddenAdaptiveCardActivitySubscriber());
44
57
  return adapter.chatAdapter;
45
58
  }
46
59
  return adapter;
@@ -4,12 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.createInternetConnectionChangeHandler = void 0;
7
+ var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
8
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
7
9
  var _Constants = require("../../../common/Constants");
8
10
  var _NotificationHandler = require("../../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler");
9
11
  var _NotificationScenarios = require("../../webchatcontainerstateful/webchatcontroller/enums/NotificationScenarios");
10
- var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
11
12
  var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
12
- var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
13
+ var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
13
14
  const isInternetConnected = async () => {
14
15
  try {
15
16
  const response = await fetch(_Constants.Constants.internetConnectionTestUrl);
@@ -32,6 +33,9 @@ const createInternetConnectionChangeHandler = async () => {
32
33
  Event: _TelemetryConstants.TelemetryEvent.NetworkReconnected
33
34
  });
34
35
  _NotificationHandler.NotificationHandler.notifySuccess(_NotificationScenarios.NotificationScenarios.InternetConnection, _defaultMiddlewareLocalizedTexts.defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_INTERNET_BACK_ONLINE);
36
+ _omnichannelChatComponents.BroadcastService.postMessage({
37
+ eventName: _TelemetryConstants.BroadcastEvent.NetworkReconnected
38
+ });
35
39
  }
36
40
  };
37
41
 
@@ -7,8 +7,8 @@ exports.createMarkdown = void 0;
7
7
  var _Constants = require("../../../common/Constants");
8
8
  var _markdownIt = _interopRequireDefault(require("markdown-it"));
9
9
  var _markdownItForInline = _interopRequireDefault(require("markdown-it-for-inline"));
10
- var _slackMarkdownIt = _interopRequireDefault(require("slack-markdown-it"));
11
10
  var _defaultMarkdownLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMarkdownLocalizedTexts");
11
+ var _markdownHelper = require("./helpers/markdownHelper");
12
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
13
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
14
  const createMarkdown = (disableMarkdownMessageFormatting, disableNewLineMarkdownSupport) => {
@@ -19,7 +19,7 @@ const createMarkdown = (disableMarkdownMessageFormatting, disableNewLineMarkdown
19
19
  linkify: true,
20
20
  breaks: !disableNewLineMarkdownSupport
21
21
  });
22
- markdown.use(_slackMarkdownIt.default);
22
+ markdown = (0, _markdownHelper.addSlackMarkdownIt)(markdown);
23
23
  } else {
24
24
  markdown = new _markdownIt.default(_Constants.Constants.Zero, {
25
25
  html: true,
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.prepareEndChat = exports.endVoiceVideoCallIfOngoing = exports.endChatStateCleanUp = exports.endChat = exports.closeChatStateCleanUp = exports.chatSDKStateCleanUp = exports.callingStateCleanUp = void 0;
7
- var _Constants = require("../../../common/Constants");
8
7
  var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
8
+ var _Constants = require("../../../common/Constants");
9
9
  var _utils = require("../../../common/utils");
10
10
  var _renderSurveyHelpers = require("./renderSurveyHelpers");
11
11
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
@@ -60,6 +60,13 @@ const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWe
60
60
  const postchatContext = (await (0, _renderSurveyHelpers.getPostChatContext)(chatSDK, state, dispatch)) ?? (state === null || state === void 0 ? void 0 : (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.postChatContext);
61
61
  if (postchatContext === undefined) {
62
62
  var _state$appStates2;
63
+ _omnichannelChatComponents.BroadcastService.postMessage({
64
+ eventName: _TelemetryConstants.BroadcastEvent.OnWidgetError,
65
+ payload: {
66
+ errorMessage: "Widget did not display post chat survey as getPostChatContext returned undefined."
67
+ }
68
+ });
69
+
63
70
  // For Customer intiated conversations, just close chat widget
64
71
  if ((state === null || state === void 0 ? void 0 : (_state$appStates2 = state.appStates) === null || _state$appStates2 === void 0 ? void 0 : _state$appStates2.conversationEndedBy) === _Constants.ConversationEndEntity.Customer) {
65
72
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.INFO, {
@@ -133,21 +140,25 @@ const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWe
133
140
  exports.prepareEndChat = prepareEndChat;
134
141
  const endChat = async (props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter, skipEndChatSDK, skipCloseChat, postMessageToOtherTab) => {
135
142
  if (!skipEndChatSDK && chatSDK.conversation) {
143
+ var _inMemoryState$appSta;
144
+ const inMemoryState = (0, _createReducer.executeReducer)(state, {
145
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
146
+ payload: null
147
+ });
148
+ const endChatOptionalParameters = {
149
+ isSessionEnded: inMemoryState === null || inMemoryState === void 0 ? void 0 : (_inMemoryState$appSta = inMemoryState.appStates) === null || _inMemoryState$appSta === void 0 ? void 0 : _inMemoryState$appSta.chatDisconnectEventReceived
150
+ };
136
151
  try {
137
152
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.INFO, {
138
153
  Event: _TelemetryConstants.TelemetryEvent.EndChatSDKCall
139
154
  });
140
155
  //Get auth token again if chat continued for longer time, otherwise gets 401 error
141
156
  await (0, _authHelper.handleAuthentication)(chatSDK, props.chatConfig, props.getAuthToken);
142
- await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.endChat());
157
+ await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.endChat(endChatOptionalParameters));
143
158
  } catch (ex) {
144
- var _inMemoryState$appSta;
145
- const inMemoryState = (0, _createReducer.executeReducer)(state, {
146
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
147
- payload: null
148
- });
159
+ var _inMemoryState$appSta2;
149
160
  // if the chat was disconnected or ended by the agent, we don't want to log the error
150
- if (!(inMemoryState !== null && inMemoryState !== void 0 && (_inMemoryState$appSta = inMemoryState.appStates) !== null && _inMemoryState$appSta !== void 0 && _inMemoryState$appSta.chatDisconnectEventReceived)) {
161
+ if (!(inMemoryState !== null && inMemoryState !== void 0 && (_inMemoryState$appSta2 = inMemoryState.appStates) !== null && _inMemoryState$appSta2 !== void 0 && _inMemoryState$appSta2.chatDisconnectEventReceived)) {
151
162
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
152
163
  Event: _TelemetryConstants.TelemetryEvent.EndChatSDKCallFailed,
153
164
  ExceptionDetails: {
@@ -164,7 +175,7 @@ const endChat = async (props, chatSDK, state, dispatch, setAdapter, setWebChatSt
164
175
  }
165
176
  postMessageToOtherTab = false;
166
177
  } finally {
167
- await endChatStateCleanUp(dispatch);
178
+ endChatStateCleanUp(dispatch);
168
179
  }
169
180
  }
170
181
  if (!skipCloseChat) {
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.addSlackMarkdownIt = void 0;
7
+ var _slackMarkdownIt = _interopRequireDefault(require("slack-markdown-it"));
8
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
+ const addSlackMarkdownIt = markdown => {
10
+ try {
11
+ markdown.use(_slackMarkdownIt.default);
12
+ } catch (e) {
13
+ // this is to support the case when slack-markdown-it
14
+ // transpiled code doesn't export default (webpack5)
15
+ if (_slackMarkdownIt.default.default.apply) {
16
+ markdown.use(_slackMarkdownIt.default.default);
17
+ } else {
18
+ console.error("Error while adding slackMarkdown plugin", e);
19
+ }
20
+ }
21
+ return markdown;
22
+ };
23
+ exports.addSlackMarkdownIt = addSlackMarkdownIt;
@@ -7,6 +7,7 @@ exports.initWebChatComposer = void 0;
7
7
  var _Constants = require("../../../common/Constants");
8
8
  var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
9
9
  var _utils = require("../../../common/utils");
10
+ var _dompurify = _interopRequireDefault(require("dompurify"));
10
11
  var _HyperlinkTextOverrideRenderer = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/markdownrenderers/HyperlinkTextOverrideRenderer"));
11
12
  var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
12
13
  var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
@@ -22,8 +23,10 @@ var _conversationEndMiddleware = _interopRequireDefault(require("../../webchatco
22
23
  var _dataMaskingMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware"));
23
24
  var _createMarkdown = require("./createMarkdown");
24
25
  var _maxMessageSizeValidator = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator"));
26
+ var _messageSequenceIdOverrideMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware"));
25
27
  var _messageTimestampMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware"));
26
28
  var _botframeworkWebchat = require("botframework-webchat");
29
+ var _toastMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/toastMiddleware"));
27
30
  var _WebChatLogger = require("../../webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger");
28
31
  var _defaultAttachmentProps = require("../../webchatcontainerstateful/common/defaultProps/defaultAttachmentProps");
29
32
  var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
@@ -34,9 +37,6 @@ var _htmlPlayerMiddleware = _interopRequireDefault(require("../../webchatcontain
34
37
  var _htmlTextMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware"));
35
38
  var _preProcessingMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware"));
36
39
  var _sanitizationMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware"));
37
- var _dompurify = _interopRequireDefault(require("dompurify"));
38
- var _messageSequenceIdOverrideMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware"));
39
- var _toastMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/toastMiddleware"));
40
40
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
41
41
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
42
  const initWebChatComposer = (props, state, dispatch, chatSDK, endChat) => {
@@ -106,7 +106,11 @@ const initWebChatComposer = (props, state, dispatch, chatSDK, endChat) => {
106
106
  markdownRenderers.forEach(renderer => {
107
107
  text = renderer.render(text);
108
108
  });
109
- text = _dompurify.default.sanitize(text);
109
+ const config = {
110
+ FORBID_TAGS: ["form", "button", "script", "div"],
111
+ FORBID_ATTR: ["action"]
112
+ };
113
+ text = _dompurify.default.sanitize(text, config);
110
114
  return text;
111
115
  };
112
116
  function postDomPurifyActivities() {
@@ -11,7 +11,8 @@ const shouldSetPreChatIfPersistentChat = async (chatSDK, conversationMode, showP
11
11
  let skipPreChat = false;
12
12
  if (persistentEnabled) {
13
13
  const reconnectableChatsParams = {
14
- authenticatedUserToken: chatSDK.authenticatedUserToken
14
+ authenticatedUserToken: chatSDK.authenticatedUserToken,
15
+ requestId: chatSDK.requestId
15
16
  };
16
17
  try {
17
18
  const reconnectableChatsResponse = await chatSDK.OCClient.getReconnectableChats(reconnectableChatsParams);
@@ -206,10 +206,16 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
206
206
  exception: `Failed to setup startChat: ${error}`
207
207
  }
208
208
  });
209
+ _omnichannelChatComponents.BroadcastService.postMessage({
210
+ eventName: _TelemetryConstants.BroadcastEvent.OnWidgetError,
211
+ payload: {
212
+ errorMessage: error
213
+ }
214
+ });
209
215
  isStartChatSuccessful = false;
210
216
  throw error;
211
217
  }
212
- await createAdapterAndSubscribe(chatSDK, dispatch, setAdapter);
218
+ await createAdapterAndSubscribe(chatSDK, dispatch, setAdapter, props);
213
219
 
214
220
  // Set app state to Active
215
221
  if (isStartChatSuccessful) {
@@ -260,10 +266,10 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
260
266
 
261
267
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
262
268
  exports.initStartChat = initStartChat;
263
- const createAdapterAndSubscribe = async (chatSDK, dispatch, setAdapter) => {
269
+ const createAdapterAndSubscribe = async (chatSDK, dispatch, setAdapter, props) => {
264
270
  var _newAdapter$activity$;
265
271
  // New adapter creation
266
- const newAdapter = await (0, _createAdapter.createAdapter)(chatSDK);
272
+ const newAdapter = await (0, _createAdapter.createAdapter)(chatSDK, props);
267
273
  setAdapter(newAdapter);
268
274
  const chatToken = await chatSDK.getChatToken();
269
275
  dispatch({
@@ -155,6 +155,12 @@ const LiveChatWidgetStateful = props => {
155
155
  }
156
156
  return;
157
157
  }
158
+ _omnichannelChatComponents.BroadcastService.postMessage({
159
+ eventName: _TelemetryConstants.BroadcastEvent.OnWidgetError,
160
+ payload: {
161
+ errorMessage: "Chat found in cache but invalid as the conversation status is inactive."
162
+ }
163
+ });
158
164
  }
159
165
  if (isChatValid === false) {
160
166
  if (localState) {
@@ -274,6 +280,12 @@ const LiveChatWidgetStateful = props => {
274
280
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
275
281
  payload: _ConversationState.ConversationState.OutOfOffice
276
282
  });
283
+ _omnichannelChatComponents.BroadcastService.postMessage({
284
+ eventName: _TelemetryConstants.BroadcastEvent.OnWidgetError,
285
+ payload: {
286
+ errorMessage: "Out-of-office hours status is shown."
287
+ }
288
+ });
277
289
  return;
278
290
  }
279
291
  _omnichannelChatComponents.BroadcastService.postMessage({
@@ -354,6 +366,30 @@ const LiveChatWidgetStateful = props => {
354
366
  }
355
367
  }
356
368
  });
369
+ _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.NetworkReconnected).subscribe(async () => {
370
+ var _window2, _window2$location;
371
+ if ((0, _utils.isThisSessionPopout)((_window2 = window) === null || _window2 === void 0 ? void 0 : (_window2$location = _window2.location) === null || _window2$location === void 0 ? void 0 : _window2$location.href)) {
372
+ return;
373
+ }
374
+ const conversationDetails = await (0, _utils.getConversationDetailsCall)(chatSDK);
375
+ if ((conversationDetails === null || conversationDetails === void 0 ? void 0 : conversationDetails.state) === _Constants.LiveWorkItemState.WrapUp || (conversationDetails === null || conversationDetails === void 0 ? void 0 : conversationDetails.state) === _Constants.LiveWorkItemState.Closed) {
376
+ dispatch({
377
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CHAT_DISCONNECT_EVENT_RECEIVED,
378
+ payload: true
379
+ });
380
+ const desc = "Chat disconnected due to timeout, user went offline or blocked the device (including closing laptop)";
381
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
382
+ Event: _TelemetryConstants.TelemetryEvent.ChatDisconnectThreadEventReceived,
383
+ Description: desc
384
+ });
385
+ _omnichannelChatComponents.BroadcastService.postMessage({
386
+ eventName: _TelemetryConstants.BroadcastEvent.OnWidgetError,
387
+ payload: {
388
+ errorMessage: desc
389
+ }
390
+ });
391
+ }
392
+ });
357
393
 
358
394
  /**
359
395
  * This will allow to sync multiple tabs to handle minimize and maximize state,
@@ -671,11 +707,24 @@ const LiveChatWidgetStateful = props => {
671
707
 
672
708
  // Handle Chat disconnect cases
673
709
  (0, _react2.useEffect)(() => {
710
+ var _inMemoryState$appSta5;
674
711
  const inMemoryState = (0, _createReducer.executeReducer)(state, {
675
712
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
676
713
  payload: null
677
714
  });
678
715
  (0, _chatDisconnectHelper.handleChatDisconnect)(props, inMemoryState, setWebChatStyles);
716
+ const chatDisconnectState = inMemoryState === null || inMemoryState === void 0 ? void 0 : (_inMemoryState$appSta5 = inMemoryState.appStates) === null || _inMemoryState$appSta5 === void 0 ? void 0 : _inMemoryState$appSta5.chatDisconnectEventReceived;
717
+ if (chatDisconnectState && adapter) {
718
+ try {
719
+ adapter.end();
720
+ adapter.close();
721
+ } catch (e) {
722
+ _TelemetryHelper.TelemetryHelper.logWebChatEvent(_TelemetryConstants.LogLevel.ERROR, {
723
+ Event: _TelemetryConstants.TelemetryEvent.EndingAdapterAfterDisconnectionError,
724
+ Description: _Constants.WidgetLoadCustomErrorString.CloseAdapterAfterDisconnectionErrorString
725
+ });
726
+ }
727
+ }
679
728
  }, [state.appStates.chatDisconnectEventReceived]);
680
729
 
681
730
  // if props state gets updates we need to update the renderingMiddlewareProps in the state