@microsoft/omnichannel-chat-widget 0.1.0-main.99b5123 → 0.1.0-main.99bac9c

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 (54) hide show
  1. package/lib/cjs/common/storage/default/defaultCacheManager.js +34 -0
  2. package/lib/cjs/common/storage/default/defaultClientDataStoreProvider.js +114 -0
  3. package/lib/cjs/common/storage/default/defaultInMemoryDataStore.js +86 -0
  4. package/lib/cjs/common/telemetry/TelemetryConstants.js +13 -0
  5. package/lib/cjs/common/telemetry/loggers/ariaTelemetryLogger.js +31 -18
  6. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +4 -4
  7. package/lib/cjs/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +4 -4
  8. package/lib/cjs/components/footerstateful/FooterStateful.js +5 -13
  9. package/lib/cjs/components/headerstateful/HeaderStateful.js +10 -4
  10. package/lib/cjs/components/livechatwidget/common/authHelper.js +16 -3
  11. package/lib/cjs/components/livechatwidget/common/createFooter.js +7 -16
  12. package/lib/cjs/components/livechatwidget/common/createInternetConnectionChangeHandler.js +12 -0
  13. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +15 -2
  14. package/lib/cjs/components/livechatwidget/common/startChat.js +12 -3
  15. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +81 -44
  16. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +10 -5
  17. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +2 -1
  18. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultReceivedMessageAnchorStyles.js +10 -0
  19. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +1 -1
  20. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +11 -4
  21. package/lib/cjs/contexts/createReducer.js +2 -2
  22. package/lib/esm/common/storage/default/defaultCacheManager.js +19 -0
  23. package/lib/esm/common/storage/default/defaultClientDataStoreProvider.js +102 -0
  24. package/lib/esm/common/storage/default/defaultInMemoryDataStore.js +71 -0
  25. package/lib/esm/common/telemetry/TelemetryConstants.js +13 -0
  26. package/lib/esm/common/telemetry/loggers/ariaTelemetryLogger.js +29 -13
  27. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +4 -4
  28. package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +4 -4
  29. package/lib/esm/components/footerstateful/FooterStateful.js +5 -13
  30. package/lib/esm/components/headerstateful/HeaderStateful.js +10 -4
  31. package/lib/esm/components/livechatwidget/common/authHelper.js +14 -3
  32. package/lib/esm/components/livechatwidget/common/createFooter.js +4 -15
  33. package/lib/esm/components/livechatwidget/common/createInternetConnectionChangeHandler.js +8 -0
  34. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +15 -2
  35. package/lib/esm/components/livechatwidget/common/startChat.js +13 -4
  36. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +81 -44
  37. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +6 -3
  38. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +2 -1
  39. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultReceivedMessageAnchorStyles.js +3 -0
  40. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +1 -1
  41. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +9 -4
  42. package/lib/esm/contexts/createReducer.js +2 -2
  43. package/lib/types/common/storage/default/defaultCacheManager.d.ts +4 -0
  44. package/lib/types/common/storage/default/defaultClientDataStoreProvider.d.ts +2 -0
  45. package/lib/types/common/storage/default/defaultInMemoryDataStore.d.ts +6 -0
  46. package/lib/types/common/telemetry/TelemetryConstants.d.ts +5 -1
  47. package/lib/types/components/livechatwidget/common/authHelper.d.ts +3 -2
  48. package/lib/types/components/webchatcontainerstateful/interfaces/IRenderingMiddlewareProps.d.ts +2 -1
  49. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.d.ts +1 -1
  50. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultReceivedMessageAnchorStyles.d.ts +2 -0
  51. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -1
  52. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +1 -1
  53. package/lib/types/contexts/common/LiveChatWidgetContextInitialState.d.ts +1 -2
  54. package/package.json +2 -2
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.registerBroadcastServiceForLocalStorage = exports.defaultCacheManager = void 0;
7
+
8
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
9
+
10
+ var _utils = require("../../utils");
11
+
12
+ var _defaultClientDataStoreProvider = require("./defaultClientDataStoreProvider");
13
+
14
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
+
16
+ class defaultCacheManager {}
17
+
18
+ exports.defaultCacheManager = defaultCacheManager;
19
+
20
+ _defineProperty(defaultCacheManager, "InternalCache", {});
21
+
22
+ const registerBroadcastServiceForLocalStorage = (orgid, widgetId, widgetInstanceId) => {
23
+ const widgetCacheId = (0, _utils.getWidgetCacheId)(orgid, widgetId, widgetInstanceId);
24
+
25
+ _omnichannelChatComponents.BroadcastService.getMessageByEventName(widgetCacheId).subscribe(msg => {
26
+ try {
27
+ (0, _defaultClientDataStoreProvider.defaultClientDataStoreProvider)().setData(widgetCacheId, JSON.stringify(msg.payload), "localStorage");
28
+ } catch (error) {
29
+ console.error("Error in setting data to localstorage", error);
30
+ }
31
+ });
32
+ };
33
+
34
+ exports.registerBroadcastServiceForLocalStorage = registerBroadcastServiceForLocalStorage;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.defaultClientDataStoreProvider = void 0;
7
+
8
+ var _defaultInMemoryDataStore = require("./defaultInMemoryDataStore");
9
+
10
+ var _TelemetryHelper = require("../../telemetry/TelemetryHelper");
11
+
12
+ var _TelemetryConstants = require("../../telemetry/TelemetryConstants");
13
+
14
+ const defaultClientDataStoreProvider = () => {
15
+ const isCookieAllowed = () => {
16
+ try {
17
+ localStorage;
18
+ sessionStorage;
19
+ return true;
20
+ } catch (error) {
21
+ console.error("Third party cookie blocked");
22
+ return false;
23
+ }
24
+ };
25
+
26
+ const TtlInMs = 15 * 60 * 1000; // 15 mins
27
+
28
+ const dataStoreProvider = {
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
+ setData: (key, data, type) => {
31
+ if (isCookieAllowed()) {
32
+ try {
33
+ if (key) {
34
+ const now = new Date();
35
+ const item = {
36
+ data: data,
37
+ expiry: now.getTime() + TtlInMs
38
+ };
39
+ const strItem = JSON.stringify(item);
40
+
41
+ if (type === "localStorage") {
42
+ localStorage.setItem(key, strItem);
43
+ } else {
44
+ sessionStorage.setItem(key, strItem);
45
+ }
46
+ }
47
+ } catch (error) {
48
+ _TelemetryHelper.TelemetryHelper.logConfigDataEvent(_TelemetryConstants.LogLevel.ERROR, {
49
+ Event: _TelemetryConstants.TelemetryEvent.ClientDataStoreProviderFailed,
50
+ ExceptionDetails: error,
51
+ Description: "Unable to store data in localStorage."
52
+ });
53
+ }
54
+ } else {
55
+ const dataToCache = {
56
+ key: key,
57
+ data: data,
58
+ type: type
59
+ };
60
+ parent.postMessage(dataToCache, "*");
61
+ }
62
+ },
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ getData: (key, type) => {
65
+ if (isCookieAllowed()) {
66
+ let item;
67
+
68
+ if (type === "localStorage") {
69
+ item = localStorage.getItem(key);
70
+ } else {
71
+ item = sessionStorage.getItem(key);
72
+ } //Return item if not expired
73
+
74
+
75
+ let itemInJson = undefined;
76
+
77
+ if (item !== null) {
78
+ itemInJson = JSON.parse(item);
79
+ const now = new Date(); // compare the expiry time of the item with the current time
80
+
81
+ if (now.getTime() > itemInJson.expiry) {
82
+ // If the item is expired, delete the item from storage
83
+ // and return null
84
+ localStorage.removeItem(key);
85
+ return null;
86
+ }
87
+
88
+ return itemInJson.data;
89
+ }
90
+ } else {
91
+ // get data from in memory db when cookie is disabled
92
+ return (0, _defaultInMemoryDataStore.inMemoryDataStore)().getData(key);
93
+ }
94
+ },
95
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
96
+ removeData: (key, type) => {
97
+ if (isCookieAllowed()) {
98
+ if (key) {
99
+ if (type === "localStorage") {
100
+ return localStorage.removeItem(key);
101
+ } else {
102
+ return sessionStorage.removeItem(key);
103
+ }
104
+ }
105
+ } else {
106
+ // get data from in memory db when cookie is disabled
107
+ return (0, _defaultInMemoryDataStore.inMemoryDataStore)().removeData(key);
108
+ }
109
+ }
110
+ };
111
+ return dataStoreProvider;
112
+ };
113
+
114
+ exports.defaultClientDataStoreProvider = defaultClientDataStoreProvider;
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.inMemoryDataStore = exports.defaultInitializeInMemoryDataStore = void 0;
7
+
8
+ var _TelemetryConstants = require("../../telemetry/TelemetryConstants");
9
+
10
+ var _TelemetryHelper = require("../../telemetry/TelemetryHelper");
11
+
12
+ var _defaultCacheManager = require("./defaultCacheManager");
13
+
14
+ const defaultInitializeInMemoryDataStore = widgetId => {
15
+ try {
16
+ localStorage;
17
+ } catch (error) {
18
+ // Register below events when localStorage is not accessible
19
+ // Listening to event raised from client browser
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ window.addEventListener("message", function (e) {
22
+ try {
23
+ if (e.data.key) {
24
+ const browserData = e.data;
25
+
26
+ if (_defaultCacheManager.defaultCacheManager.InternalCache[browserData.key]) {
27
+ delete _defaultCacheManager.defaultCacheManager.InternalCache[browserData.key];
28
+ }
29
+
30
+ _defaultCacheManager.defaultCacheManager.InternalCache[browserData.key] = browserData.data;
31
+ }
32
+ } catch (error) {
33
+ _TelemetryHelper.TelemetryHelper.logConfigDataEvent(_TelemetryConstants.LogLevel.ERROR, {
34
+ Event: _TelemetryConstants.TelemetryEvent.InMemoryDataStoreFailed,
35
+ ExceptionDetails: error,
36
+ Description: "Unable to register default in-memory cache."
37
+ });
38
+ }
39
+ }); // send cache initialize message to client
40
+
41
+ if (_defaultCacheManager.defaultCacheManager.InternalCache === undefined || {}) {
42
+ parent.postMessage({
43
+ data: "cacheinitialize",
44
+ widgetId: widgetId
45
+ }, "*");
46
+ }
47
+ }
48
+ };
49
+
50
+ exports.defaultInitializeInMemoryDataStore = defaultInitializeInMemoryDataStore;
51
+
52
+ const inMemoryDataStore = () => {
53
+ const dataStoreProvider = {
54
+ getData: key => {
55
+ if (_defaultCacheManager.defaultCacheManager.InternalCache && _defaultCacheManager.defaultCacheManager.InternalCache[key]) {
56
+ return _defaultCacheManager.defaultCacheManager.InternalCache[key];
57
+ }
58
+ },
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+ setData: (key, data) => {
61
+ try {
62
+ _defaultCacheManager.defaultCacheManager.InternalCache[key] = data;
63
+ } catch (error) {
64
+ _TelemetryHelper.TelemetryHelper.logConfigDataEvent(_TelemetryConstants.LogLevel.ERROR, {
65
+ Event: _TelemetryConstants.TelemetryEvent.InMemoryDataStoreFailed,
66
+ ExceptionDetails: error,
67
+ Description: "Unable to set data in default in-memory cache."
68
+ });
69
+ }
70
+ },
71
+ removeData: key => {
72
+ try {
73
+ _defaultCacheManager.defaultCacheManager.InternalCache[key] = {};
74
+ } catch (error) {
75
+ _TelemetryHelper.TelemetryHelper.logConfigDataEvent(_TelemetryConstants.LogLevel.ERROR, {
76
+ Event: _TelemetryConstants.TelemetryEvent.InMemoryDataStoreFailed,
77
+ ExceptionDetails: error,
78
+ Description: "Unable to remove data from default in-memory cache."
79
+ });
80
+ }
81
+ }
82
+ };
83
+ return dataStoreProvider;
84
+ };
85
+
86
+ exports.inMemoryDataStore = inMemoryDataStore;
@@ -101,6 +101,8 @@ exports.TelemetryEvent = TelemetryEvent;
101
101
  TelemetryEvent["PostChatContextCallSucceed"] = "PostChatContextCallSucceed";
102
102
  TelemetryEvent["PostChatContextCallFailed"] = "PostChatContextCallFailed";
103
103
  TelemetryEvent["ParseAdaptiveCardFailed"] = "ParseAdaptiveCardFailed";
104
+ TelemetryEvent["ClientDataStoreProviderFailed"] = "ClientDataStoreProviderFailed";
105
+ TelemetryEvent["InMemoryDataStoreFailed"] = "InMemoryDataStoreFailed";
104
106
  TelemetryEvent["WebChatLoaded"] = "WebChatLoaded";
105
107
  TelemetryEvent["LCWChatButtonClicked"] = "LCWChatButtonClicked";
106
108
  TelemetryEvent["LCWChatButtonShow"] = "LCWChatButtonShow";
@@ -171,12 +173,18 @@ exports.TelemetryEvent = TelemetryEvent;
171
173
  TelemetryEvent["MessageSent"] = "MessageSent";
172
174
  TelemetryEvent["MessageReceived"] = "MessageReceived";
173
175
  TelemetryEvent["CustomContextReceived"] = "CustomContextReceived";
176
+ TelemetryEvent["NetworkDisconnected"] = "NetworkDisconnected";
177
+ TelemetryEvent["NetworkReconnected"] = "NetworkReconnected";
174
178
  })(TelemetryEvent || (exports.TelemetryEvent = TelemetryEvent = {}));
175
179
 
176
180
  class TelemetryConstants {
177
181
  static map(eventTypeOrScenarioType) {
178
182
  switch (eventTypeOrScenarioType) {
179
183
  case TelemetryEvent.ParseAdaptiveCardFailed:
184
+ case TelemetryEvent.ReceivedNullOrEmptyToken:
185
+ case TelemetryEvent.GetAuthTokenCalled:
186
+ case TelemetryEvent.SuppressBotMagicCodeSucceeded:
187
+ case TelemetryEvent.SuppressBotMagicCodeFailed:
180
188
  return ScenarioType.CONFIG_VALIDATION;
181
189
 
182
190
  case TelemetryEvent.WebChatLoaded:
@@ -217,6 +225,10 @@ class TelemetryConstants {
217
225
  case TelemetryEvent.MessageReceived:
218
226
  case TelemetryEvent.CustomContextReceived:
219
227
  case TelemetryEvent.BrowserUnloadEventStarted:
228
+ case TelemetryEvent.NetworkDisconnected:
229
+ case TelemetryEvent.NetworkReconnected:
230
+ case TelemetryEvent.AudioToggleButtonClicked:
231
+ case TelemetryEvent.EmailTranscriptCancelButtonClicked:
220
232
  return ScenarioType.ACTIONS;
221
233
 
222
234
  case TelemetryEvent.StartChatSDKCall:
@@ -233,6 +245,7 @@ class TelemetryConstants {
233
245
  case TelemetryEvent.EndChatSDKCallFailed:
234
246
  case TelemetryEvent.PostChatContextCallFailed:
235
247
  case TelemetryEvent.PostChatContextCallSucceed:
248
+ case TelemetryEvent.GetConversationDetailsException:
236
249
  return ScenarioType.SDK;
237
250
 
238
251
  case TelemetryEvent.VideoCallAcceptButtonClick:
@@ -7,9 +7,7 @@ exports.ariaTelemetryLogger = void 0;
7
7
 
8
8
  var _utils = require("../../utils");
9
9
 
10
- var _AWTEventProperties = _interopRequireDefault(require("@microsoft/omnichannel-chat-sdk/lib/external/aria/webjs/AWTEventProperties"));
11
-
12
- var _AWTLogManager = _interopRequireDefault(require("@microsoft/omnichannel-chat-sdk/lib/external/aria/webjs/AWTLogManager"));
10
+ var _AriaSDK = require("@microsoft/omnichannel-chat-sdk/lib/external/aria/webjs/AriaSDK");
13
11
 
14
12
  var _Enums = require("@microsoft/omnichannel-chat-sdk/lib/external/aria/common/Enums");
15
13
 
@@ -17,8 +15,6 @@ var _Constants = require("../../Constants");
17
15
 
18
16
  var _TelemetryManager = require("../TelemetryManager");
19
17
 
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
22
18
  const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, collectiorUriForTelemetry, ariaTelemetryApplicationName) => {
23
19
  let _logger;
24
20
 
@@ -48,10 +44,10 @@ const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, collectiorUr
48
44
  }
49
45
 
50
46
  try {
51
- _logger = _AWTLogManager.default.initialize(ariaTelemetryKey, configuration);
47
+ _logger = _AriaSDK.AWTLogManager.initialize(ariaTelemetryKey, configuration);
52
48
 
53
49
  if (_logger === undefined) {
54
- _logger = _AWTLogManager.default.getLogger(ariaTelemetryKey);
50
+ _logger = _AriaSDK.AWTLogManager.getLogger(ariaTelemetryKey);
55
51
  }
56
52
  } catch (error) {
57
53
  console.log(error);
@@ -64,18 +60,35 @@ const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, collectiorUr
64
60
  const ariaLogger = {
65
61
  log: (logLevel, telemetryInput) => {
66
62
  try {
67
- let property;
68
- const telemetryInfo = telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.telemetryInfo;
69
- const eventProperties = new _AWTEventProperties.default();
70
- eventProperties.setName(telemetryInput.scenarioType);
63
+ var _telemetryInput$telem;
71
64
 
72
- if (telemetryInfo) {
73
- for (const key of Object.keys(telemetryInfo)) {
74
- property = typeof telemetryInfo[key] === "object" ? JSON.stringify(telemetryInfo[key]) : telemetryInfo[key];
75
- eventProperties.setProperty(key, property);
76
- }
65
+ const telemetryInfo = telemetryInput === null || telemetryInput === void 0 ? void 0 : (_telemetryInput$telem = telemetryInput.telemetryInfo) === null || _telemetryInput$telem === void 0 ? void 0 : _telemetryInput$telem.telemetryInfo; // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
66
 
78
- eventProperties.setPropertyWithPii(ariaTelemetryApplicationName, _Constants.Constants.LiveChatWidget, _Enums.AWTPiiKind.GenericData);
67
+ const eventProperties = {
68
+ name: telemetryInput.scenarioType,
69
+ properties: {}
70
+ };
71
+
72
+ if (telemetryInfo) {
73
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
74
+ Object.keys(telemetryInfo).forEach((key, index) => {
75
+ if (!(0, _utils.isNullOrUndefined)(telemetryInfo[key]) && !(0, _utils.isNullOrEmptyString)(telemetryInfo[key])) {
76
+ const property = {
77
+ value: typeof telemetryInfo[key] === "object" ? JSON.stringify(telemetryInfo[key]) : telemetryInfo[key],
78
+ type: typeof telemetryInfo[key] === "number" ? _Enums.AWTPropertyType.Double : _Enums.AWTPropertyType.String,
79
+ pii: _Enums.AWTPiiKind.NotSet,
80
+ cc: _Enums.AWTCustomerContentKind.NotSet
81
+ };
82
+ eventProperties.properties[key] = property;
83
+ }
84
+ });
85
+ const nameProperty = {
86
+ value: _Constants.Constants.LiveChatWidget,
87
+ type: _Enums.AWTPropertyType.String,
88
+ pii: _Enums.AWTPiiKind.GenericData,
89
+ cc: _Enums.AWTCustomerContentKind.NotSet
90
+ };
91
+ eventProperties.properties[ariaTelemetryApplicationName] = nameProperty;
79
92
  }
80
93
 
81
94
  logger() ? logger().logEvent(eventProperties) : console.log("Unable to initialize aria logger");
@@ -84,7 +97,7 @@ const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, collectiorUr
84
97
  }
85
98
  },
86
99
  dispose: () => {
87
- _AWTLogManager.default.flush(function () {
100
+ _AriaSDK.AWTLogManager.flush(function () {
88
101
  console.log("Aria logger disposed");
89
102
  });
90
103
  }
@@ -81,12 +81,12 @@ const ConfirmationPaneStateful = props => {
81
81
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_SHOW_CONFIRMATION,
82
82
  payload: false
83
83
  });
84
- const previousFocused = state.appStates.previousElementOnFocusBeforeModalOpen;
84
+ const previousFocusedElementId = state.appStates.previousElementIdOnFocusBeforeModalOpen;
85
85
 
86
- if (previousFocused) {
87
- (0, _utils.setFocusOnElement)(previousFocused);
86
+ if (previousFocusedElementId) {
87
+ (0, _utils.setFocusOnElement)("#" + previousFocusedElementId);
88
88
  dispatch({
89
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PREVIOUS_FOCUSED_ELEMENT,
89
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PREVIOUS_FOCUSED_ELEMENT_ID,
90
90
  payload: null
91
91
  });
92
92
  } else {
@@ -50,16 +50,16 @@ const EmailTranscriptPaneStateful = props => {
50
50
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_SHOW_EMAIL_TRANSCRIPT_PANE,
51
51
  payload: false
52
52
  });
53
- const previousFocused = state.appStates.previousElementOnFocusBeforeModalOpen;
53
+ const previousFocusedElementId = state.appStates.previousElementIdOnFocusBeforeModalOpen;
54
54
 
55
- if (previousFocused) {
56
- (0, _utils.setFocusOnElement)(previousFocused);
55
+ if (previousFocusedElementId) {
56
+ (0, _utils.setFocusOnElement)("#" + previousFocusedElementId);
57
57
  } else {
58
58
  (0, _utils.setFocusOnSendBox)();
59
59
  }
60
60
 
61
61
  dispatch({
62
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PREVIOUS_FOCUSED_ELEMENT,
62
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PREVIOUS_FOCUSED_ELEMENT_ID,
63
63
  payload: null
64
64
  });
65
65
  (0, _utils.setTabIndices)(elements, initialTabIndexMap, true);
@@ -79,13 +79,12 @@ const FooterStateful = props => {
79
79
  Description: "Email Transcript button clicked."
80
80
  });
81
81
 
82
- const emailTranscriptButtonId = (footerProps === null || footerProps === void 0 ? void 0 : (_footerProps$controlP = footerProps.controlProps) === null || _footerProps$controlP === void 0 ? void 0 : (_footerProps$controlP2 = _footerProps$controlP.emailTranscriptButtonProps) === null || _footerProps$controlP2 === void 0 ? void 0 : _footerProps$controlP2.id) ?? "oc-lcw-footer-emailtranscript-button";
83
- const emailTranscriptButton = document.getElementById(emailTranscriptButtonId);
82
+ const emailTranscriptButtonId = (footerProps === null || footerProps === void 0 ? void 0 : (_footerProps$controlP = footerProps.controlProps) === null || _footerProps$controlP === void 0 ? void 0 : (_footerProps$controlP2 = _footerProps$controlP.emailTranscriptButtonProps) === null || _footerProps$controlP2 === void 0 ? void 0 : _footerProps$controlP2.id) ?? `${controlProps.id}-emailtranscript-button`;
84
83
 
85
- if (emailTranscriptButton) {
84
+ if (emailTranscriptButtonId) {
86
85
  dispatch({
87
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PREVIOUS_FOCUSED_ELEMENT,
88
- payload: emailTranscriptButton
86
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PREVIOUS_FOCUSED_ELEMENT_ID,
87
+ payload: emailTranscriptButtonId
89
88
  });
90
89
  }
91
90
 
@@ -110,14 +109,7 @@ const FooterStateful = props => {
110
109
  isAudioMuted: state.appStates.isAudioMuted
111
110
  }
112
111
  };
113
- const footerId = (controlProps === null || controlProps === void 0 ? void 0 : controlProps.id) ?? "oc-lcw-footer";
114
- const footer = document.getElementById(footerId);
115
-
116
- if (footer) {
117
- footer.style.display = hideFooterDisplay ? "none" : "";
118
- }
119
-
120
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_omnichannelChatComponents.Footer, {
112
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !hideFooterDisplay && /*#__PURE__*/_react.default.createElement(_omnichannelChatComponents.Footer, {
121
113
  componentOverrides: footerProps === null || footerProps === void 0 ? void 0 : footerProps.componentOverrides,
122
114
  controlProps: controlProps,
123
115
  styleProps: footerProps === null || footerProps === void 0 ? void 0 : footerProps.styleProps
@@ -59,6 +59,8 @@ const HeaderStateful = props => {
59
59
  });
60
60
  },
61
61
  onCloseClick: async () => {
62
+ var _props$headerProps, _props$headerProps$co, _props$headerProps$co2;
63
+
62
64
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
63
65
  Event: _TelemetryConstants.TelemetryEvent.HeaderCloseButtonClicked,
64
66
  Description: "Header Close button clicked."
@@ -76,10 +78,14 @@ const HeaderStateful = props => {
76
78
  await endChat(adapter, skipEndChatSDK, skipCloseChat, postMessageToOtherTabs);
77
79
  }
78
80
 
79
- dispatch({
80
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PREVIOUS_FOCUSED_ELEMENT,
81
- payload: document.getElementById(`${controlProps.id}-closebutton`)
82
- });
81
+ const closeButtonId = ((_props$headerProps = props.headerProps) === null || _props$headerProps === void 0 ? void 0 : (_props$headerProps$co = _props$headerProps.controlProps) === null || _props$headerProps$co === void 0 ? void 0 : (_props$headerProps$co2 = _props$headerProps$co.closeButtonProps) === null || _props$headerProps$co2 === void 0 ? void 0 : _props$headerProps$co2.id) ?? `${controlProps.id}-close-button`;
82
+
83
+ if (closeButtonId) {
84
+ dispatch({
85
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PREVIOUS_FOCUSED_ELEMENT_ID,
86
+ payload: closeButtonId
87
+ });
88
+ }
83
89
  },
84
90
  ...(headerProps === null || headerProps === void 0 ? void 0 : headerProps.controlProps),
85
91
  hideTitle: state.appStates.conversationState === _ConversationState.ConversationState.Loading || state.appStates.conversationState === _ConversationState.ConversationState.PostchatLoading || (headerProps === null || headerProps === void 0 ? void 0 : (_headerProps$controlP = headerProps.controlProps) === null || _headerProps$controlP === void 0 ? void 0 : _headerProps$controlP.hideTitle),
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.removeAuthTokenProvider = exports.handleAuthentication = void 0;
6
+ exports.removeAuthTokenProvider = exports.handleAuthentication = exports.getAuthClientFunction = void 0;
7
7
 
8
8
  var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
9
9
 
@@ -11,8 +11,7 @@ var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
11
11
 
12
12
  var _utils = require("../../../common/utils");
13
13
 
14
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
- const handleAuthentication = async (chatSDK, chatConfig, getAuthToken) => {
14
+ const getAuthClientFunction = chatConfig => {
16
15
  let authClientFunction = undefined;
17
16
 
18
17
  if (chatConfig !== null && chatConfig !== void 0 && chatConfig.LiveChatConfigAuthSettings) {
@@ -21,6 +20,15 @@ const handleAuthentication = async (chatSDK, chatConfig, getAuthToken) => {
21
20
  authClientFunction = (chatConfig === null || chatConfig === void 0 ? void 0 : (_chatConfig$LiveChatC = chatConfig.LiveChatConfigAuthSettings) === null || _chatConfig$LiveChatC === void 0 ? void 0 : _chatConfig$LiveChatC.msdyn_javascriptclientfunction) ?? undefined;
22
21
  }
23
22
 
23
+ return authClientFunction;
24
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+
26
+
27
+ exports.getAuthClientFunction = getAuthClientFunction;
28
+
29
+ const handleAuthentication = async (chatSDK, chatConfig, getAuthToken) => {
30
+ const authClientFunction = getAuthClientFunction(chatConfig);
31
+
24
32
  if (getAuthToken && authClientFunction) {
25
33
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
26
34
  Event: _TelemetryConstants.TelemetryEvent.GetAuthTokenCalled
@@ -33,12 +41,17 @@ const handleAuthentication = async (chatSDK, chatConfig, getAuthToken) => {
33
41
  chatSDK.setAuthTokenProvider(async () => {
34
42
  return token;
35
43
  });
44
+ return true;
36
45
  } else {
37
46
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
38
47
  Event: _TelemetryConstants.TelemetryEvent.ReceivedNullOrEmptyToken
39
48
  });
49
+
50
+ return false;
40
51
  }
41
52
  }
53
+
54
+ return false;
42
55
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
56
 
44
57
 
@@ -16,26 +16,17 @@ var _componentController = require("../../../controller/componentController");
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
 
18
18
  const createFooter = (props, state) => {
19
- var _props$footerProps, _props$controlProps, _props$componentOverr, _props$componentOverr2;
20
-
21
- const footerPropsHidden = { ...props.footerProps,
22
- controlProps: { ...((_props$footerProps = props.footerProps) === null || _props$footerProps === void 0 ? void 0 : _props$footerProps.controlProps),
23
- hideDownloadTranscriptButton: true,
24
- hideEmailTranscriptButton: true,
25
- hideAudioNotificationButton: true
26
- }
27
- };
28
- const footer = !((_props$controlProps = props.controlProps) !== null && _props$controlProps !== void 0 && _props$controlProps.hideFooter) && (0, _componentController.shouldShowFooter)(state) ? (0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr = props.componentOverrides) === null || _props$componentOverr === void 0 ? void 0 : _props$componentOverr.footer) || /*#__PURE__*/_react.default.createElement(_FooterStateful.default, {
19
+ var _props$controlProps, _props$componentOverr;
20
+
21
+ const hideFooterDisplay = !((_props$controlProps = props.controlProps) !== null && _props$controlProps !== void 0 && _props$controlProps.hideFooter) && (0, _componentController.shouldShowFooter)(state) ? false : true;
22
+
23
+ const footer = (0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr = props.componentOverrides) === null || _props$componentOverr === void 0 ? void 0 : _props$componentOverr.footer) || /*#__PURE__*/_react.default.createElement(_FooterStateful.default, {
29
24
  footerProps: props.footerProps,
30
25
  downloadTranscriptProps: props.downloadTranscriptProps,
31
26
  audioNotificationProps: props.audioNotificationProps,
32
- hideFooterDisplay: false
33
- }) : (0, _omnichannelChatComponents.decodeComponentString)((_props$componentOverr2 = props.componentOverrides) === null || _props$componentOverr2 === void 0 ? void 0 : _props$componentOverr2.footer) || /*#__PURE__*/_react.default.createElement(_FooterStateful.default, {
34
- footerProps: footerPropsHidden,
35
- downloadTranscriptProps: props.downloadTranscriptProps,
36
- audioNotificationProps: props.audioNotificationProps,
37
- hideFooterDisplay: true
27
+ hideFooterDisplay: hideFooterDisplay
38
28
  });
29
+
39
30
  return footer;
40
31
  };
41
32
 
@@ -13,6 +13,10 @@ var _NotificationScenarios = require("../../webchatcontainerstateful/webchatcont
13
13
 
14
14
  var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
15
15
 
16
+ var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
17
+
18
+ var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
19
+
16
20
  const isInternetConnected = async () => {
17
21
  try {
18
22
  const response = await fetch(_Constants.Constants.internetConnectionTestUrl);
@@ -28,8 +32,16 @@ const createInternetConnectionChangeHandler = async () => {
28
32
  const connected = await isInternetConnected();
29
33
 
30
34
  if (!connected) {
35
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.WARN, {
36
+ Event: _TelemetryConstants.TelemetryEvent.NetworkDisconnected
37
+ });
38
+
31
39
  _NotificationHandler.NotificationHandler.notifyError(_NotificationScenarios.NotificationScenarios.InternetConnection, _defaultMiddlewareLocalizedTexts.defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_NO_INTERNET_CONNECTION);
32
40
  } else {
41
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.WARN, {
42
+ Event: _TelemetryConstants.TelemetryEvent.NetworkReconnected
43
+ });
44
+
33
45
  _NotificationHandler.NotificationHandler.notifySuccess(_NotificationScenarios.NotificationScenarios.InternetConnection, _defaultMiddlewareLocalizedTexts.defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_INTERNET_BACK_ONLINE);
34
46
  }
35
47
  }; // Checking connection status on online & offline events due to possible false positives
@@ -891,7 +891,7 @@ const dummyDefaultProps = {
891
891
  className: undefined
892
892
  },
893
893
  closeButtonProps: {
894
- id: "oc-lcw-header-minimize-button",
894
+ id: "oc-lcw-header-close-button",
895
895
  type: "icon",
896
896
  iconName: "ChromeClose",
897
897
  ariaLabel: "Close",
@@ -1207,7 +1207,17 @@ const dummyDefaultProps = {
1207
1207
  hideSubtitle: false,
1208
1208
  subtitleText: "Live chat support!",
1209
1209
  hideCloseButton: false,
1210
- closeButtonAriaLabel: "Close Button",
1210
+ closeButtonProps: {
1211
+ id: "oc-lcw-proactivechat-closebutton",
1212
+ type: "icon",
1213
+ iconName: "ChromeClose",
1214
+ ariaLabel: "Close",
1215
+ imageIconProps: undefined,
1216
+ text: "Close",
1217
+ onClick: undefined,
1218
+ className: undefined,
1219
+ hideButtonTitle: true
1220
+ },
1211
1221
  isBodyContainerHorizantal: false,
1212
1222
  hideBodyTitle: false,
1213
1223
  bodyTitleText: "Hi! Have any questions? I am here to help.",
@@ -1676,6 +1686,9 @@ const dummyDefaultProps = {
1676
1686
  },
1677
1687
  attachmentSizeStyles: {
1678
1688
  display: "none"
1689
+ },
1690
+ receivedMessageAnchorStyles: {
1691
+ color: "white"
1679
1692
  }
1680
1693
  },
1681
1694
  localizedTexts: {
@@ -121,6 +121,17 @@ const initStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAda
121
121
  try {
122
122
  var _newAdapter$activity$, _TelemetryTimers$Widg;
123
123
 
124
+ const authClientFunction = (0, _authHelper.getAuthClientFunction)(chatConfig);
125
+
126
+ if (getAuthToken && authClientFunction) {
127
+ // set auth token to chat sdk before start chat
128
+ const authSuccess = await (0, _authHelper.handleAuthentication)(chatSDK, chatConfig, getAuthToken);
129
+
130
+ if (!authSuccess) {
131
+ return;
132
+ }
133
+ }
134
+
124
135
  let isStartChatSuccessful = false; //Check if chat retrieved from cache
125
136
 
126
137
  if (persistedState || params !== null && params !== void 0 && params.liveChatContext) {
@@ -145,9 +156,7 @@ const initStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAda
145
156
 
146
157
 
147
158
  setCustomContextParams(chatSDK);
148
- optionalParams = Object.assign({}, params, optionalParams); // set auth token to chat sdk before start chat
149
-
150
- await (0, _authHelper.handleAuthentication)(chatSDK, chatConfig, getAuthToken);
159
+ optionalParams = Object.assign({}, params, optionalParams);
151
160
  await chatSDK.startChat(optionalParams);
152
161
  isStartChatSuccessful = true;
153
162
  } catch (error) {