@microsoft/omnichannel-chat-widget 1.7.8-main.d38af40 → 1.7.8-main.d71f599

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 (36) hide show
  1. package/lib/cjs/common/facades/FacadeChatSDK.js +15 -4
  2. package/lib/cjs/common/telemetry/TelemetryConstants.js +4 -0
  3. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +4 -5
  4. package/lib/cjs/components/headerstateful/HeaderStateful.js +3 -5
  5. package/lib/cjs/components/livechatwidget/common/chatDisconnectHelper.js +3 -1
  6. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +0 -5
  7. package/lib/cjs/components/livechatwidget/common/startChat.js +2 -23
  8. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +3 -3
  9. package/lib/cjs/components/ooohpanestateful/OOOHPaneStateful.js +6 -4
  10. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +4 -3
  11. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +4 -0
  12. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +14 -2
  13. package/lib/cjs/firstresponselatency/FirstMessageTrackerFromBot.js +118 -0
  14. package/lib/cjs/firstresponselatency/FirstResponseLatencyTracker.js +32 -5
  15. package/lib/cjs/firstresponselatency/util.js +15 -2
  16. package/lib/esm/common/facades/FacadeChatSDK.js +15 -4
  17. package/lib/esm/common/telemetry/TelemetryConstants.js +4 -0
  18. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +4 -5
  19. package/lib/esm/components/headerstateful/HeaderStateful.js +3 -5
  20. package/lib/esm/components/livechatwidget/common/chatDisconnectHelper.js +3 -1
  21. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +1 -6
  22. package/lib/esm/components/livechatwidget/common/startChat.js +3 -24
  23. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +3 -3
  24. package/lib/esm/components/ooohpanestateful/OOOHPaneStateful.js +6 -4
  25. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +4 -3
  26. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +4 -0
  27. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +14 -2
  28. package/lib/esm/firstresponselatency/FirstMessageTrackerFromBot.js +112 -0
  29. package/lib/esm/firstresponselatency/FirstResponseLatencyTracker.js +33 -6
  30. package/lib/esm/firstresponselatency/util.js +12 -0
  31. package/lib/types/common/facades/FacadeChatSDK.d.ts +1 -0
  32. package/lib/types/common/telemetry/TelemetryConstants.d.ts +5 -1
  33. package/lib/types/firstresponselatency/FirstMessageTrackerFromBot.d.ts +1 -0
  34. package/lib/types/firstresponselatency/FirstResponseLatencyTracker.d.ts +5 -0
  35. package/lib/types/firstresponselatency/util.d.ts +2 -1
  36. package/package.json +13 -3
@@ -148,9 +148,20 @@ class FacadeChatSDK {
148
148
  }
149
149
  }
150
150
  }
151
+ async corroborateTokenIsSet(chatSDK) {
152
+ var _chatSDK$chatSDKConfi;
153
+ // if getAuthToken is not set, it's because handleAuthentication hasnt being called
154
+ // so we need to call it
155
+ if (this.isAuthenticated && (chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$chatSDKConfi = chatSDK.chatSDKConfig) === null || _chatSDK$chatSDKConfi === void 0 ? void 0 : _chatSDK$chatSDKConfi.getAuthToken) === undefined) {
156
+ (0, _authHelper.handleAuthentication)(this.chatSDK, this.chatConfig, this.getAuthToken);
157
+ }
158
+ }
151
159
  async tokenRing() {
152
160
  var _this$chatSDK$chatSDK;
153
161
  if (this.disableReauthentication === true) {
162
+ // Since we are not validating the token anymore, we at least need to check if the token is set
163
+ // no need to validate anything other that the token is set
164
+ await this.corroborateTokenIsSet(this.chatSDK);
154
165
  // facade feature is disabled, so we are bypassing the re authentication and let it fail.
155
166
  return {
156
167
  result: true,
@@ -194,7 +205,7 @@ class FacadeChatSDK {
194
205
  this.expiration = 0;
195
206
  try {
196
207
  const ring = await (0, _authHelper.handleAuthentication)(this.chatSDK, this.chatConfig, this.getAuthToken);
197
- if (ring.result === true && ring.token) {
208
+ if ((ring === null || ring === void 0 ? void 0 : ring.result) === true && ring !== null && ring !== void 0 && ring.token) {
198
209
  await this.setToken(ring.token);
199
210
  _TelemetryHelper.TelemetryHelper.logFacadeChatSDKEvent(_TelemetryConstants.LogLevel.INFO, {
200
211
  Event: _TelemetryConstants.TelemetryEvent.NewTokenSuccess,
@@ -211,12 +222,12 @@ class FacadeChatSDK {
211
222
  var _ring$error, _ring$error2;
212
223
  _TelemetryHelper.TelemetryHelper.logFacadeChatSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
213
224
  Event: _TelemetryConstants.TelemetryEvent.NewTokenFailed,
214
- Description: (_ring$error = ring.error) === null || _ring$error === void 0 ? void 0 : _ring$error.message,
215
- ExceptionDetails: ring.error
225
+ Description: ring === null || ring === void 0 ? void 0 : (_ring$error = ring.error) === null || _ring$error === void 0 ? void 0 : _ring$error.message,
226
+ ExceptionDetails: ring === null || ring === void 0 ? void 0 : ring.error
216
227
  });
217
228
  return {
218
229
  result: false,
219
- message: ((_ring$error2 = ring.error) === null || _ring$error2 === void 0 ? void 0 : _ring$error2.message) || "Failed to get token"
230
+ message: (ring === null || ring === void 0 ? void 0 : (_ring$error2 = ring.error) === null || _ring$error2 === void 0 ? void 0 : _ring$error2.message) || "Failed to get token"
220
231
  };
221
232
  }
222
233
  } catch (e) {
@@ -66,6 +66,8 @@ exports.BroadcastEvent = BroadcastEvent;
66
66
  BroadcastEvent["ContactIdNotFound"] = "ContactIdNotFound";
67
67
  BroadcastEvent["SyncMinimize"] = "SyncMinimize";
68
68
  BroadcastEvent["OnWidgetError"] = "OnWidgetError";
69
+ BroadcastEvent["FMLTrackingCompletedAck"] = "FMLTrackingCompletedAck";
70
+ BroadcastEvent["FMLTrackingCompleted"] = "FMLTrackingCompleted";
69
71
  })(BroadcastEvent || (exports.BroadcastEvent = BroadcastEvent = {}));
70
72
  let TelemetryEvent;
71
73
  exports.TelemetryEvent = TelemetryEvent;
@@ -206,6 +208,8 @@ exports.TelemetryEvent = TelemetryEvent;
206
208
  TelemetryEvent["MessageSent"] = "MessageSent";
207
209
  TelemetryEvent["MessageReceived"] = "MessageReceived";
208
210
  TelemetryEvent["MessageLapTrack"] = "MessageLapTrack";
211
+ TelemetryEvent["BotFirstMessageLapTrack"] = "BotFirstMessageLapTrack";
212
+ TelemetryEvent["BotFirstMessageLapTrackError"] = "BotFirstMessageLapTrackError";
209
213
  TelemetryEvent["MessageStartLapTrackError"] = "MessageStartLapTrackError";
210
214
  TelemetryEvent["MessageStopLapTrackError"] = "MessageStopLapTrackError";
211
215
  TelemetryEvent["SystemMessageReceived"] = "SystemMessageReceived";
@@ -20,7 +20,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
20
20
  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
21
  let uiTimer;
22
22
  const ChatButtonStateful = props => {
23
- var _state$domainStates$l, _state$domainStates$l2, _buttonProps$controlP, _props$buttonProps, _props$buttonProps$co, _props$buttonProps2, _props$buttonProps2$c, _props$buttonProps3, _props$buttonProps3$c;
23
+ var _buttonProps$controlP, _props$buttonProps, _props$buttonProps$co, _props$buttonProps2, _props$buttonProps2$c, _props$buttonProps3, _props$buttonProps3$c;
24
24
  // this is to ensure the telemetry is set only once and start the load timer
25
25
  (0, _react.useEffect)(() => {
26
26
  uiTimer = (0, _utils.createTimer)();
@@ -37,7 +37,8 @@ const ChatButtonStateful = props => {
37
37
  startChat
38
38
  } = props;
39
39
  //Setting OutOfOperatingHours Flag
40
- const [outOfOperatingHours, setOutOfOperatingHours] = (0, _react.useState)(((_state$domainStates$l = state.domainStates.liveChatConfig) === null || _state$domainStates$l === void 0 ? void 0 : (_state$domainStates$l2 = _state$domainStates$l.LiveWSAndLiveChatEngJoin) === null || _state$domainStates$l2 === void 0 ? void 0 : _state$domainStates$l2.OutOfOperatingHours) === "True");
40
+ //Setting OutOfOperatingHours Flag - to string conversion to normalize the value (could be boolean from other states or string directly from config)
41
+ const [outOfOperatingHours, setOutOfOperatingHours] = (0, _react.useState)(state.appStates.outsideOperatingHours);
41
42
  const ref = (0, _react.useRef)(() => {
42
43
  return;
43
44
  });
@@ -96,9 +97,7 @@ const ChatButtonStateful = props => {
96
97
  ...(outOfOfficeButtonProps === null || outOfOfficeButtonProps === void 0 ? void 0 : outOfOfficeButtonProps.controlProps)
97
98
  };
98
99
  (0, _react.useEffect)(() => {
99
- if (state.appStates.outsideOperatingHours) {
100
- setOutOfOperatingHours(true);
101
- }
100
+ setOutOfOperatingHours(state.appStates.outsideOperatingHours);
102
101
  _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
103
102
  Event: _TelemetryConstants.TelemetryEvent.LCWChatButtonShow,
104
103
  ElapsedTimeInMilliseconds: _TelemetryManager.TelemetryTimers.LcwLoadToChatButtonTimer.milliSecondsElapsed
@@ -21,7 +21,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
21
21
  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; }
22
22
  let uiTimer;
23
23
  const HeaderStateful = props => {
24
- var _state$domainStates$l, _state$domainStates$l2, _state$domainStates, _headerProps$controlP, _headerProps$controlP2, _headerProps$controlP3, _outOfOfficeHeaderPro, _state$domainStates3;
24
+ var _state$domainStates, _headerProps$controlP, _headerProps$controlP2, _headerProps$controlP3, _outOfOfficeHeaderPro, _state$domainStates3;
25
25
  (0, _react.useEffect)(() => {
26
26
  uiTimer = (0, _utils.createTimer)();
27
27
  _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
@@ -37,7 +37,7 @@ const HeaderStateful = props => {
37
37
  endChat
38
38
  } = props;
39
39
  //Setting OutOfOperatingHours Flag
40
- const [outOfOperatingHours, setOutOfOperatingHours] = (0, _react.useState)(((_state$domainStates$l = state.domainStates.liveChatConfig) === null || _state$domainStates$l === void 0 ? void 0 : (_state$domainStates$l2 = _state$domainStates$l.LiveWSAndLiveChatEngJoin) === null || _state$domainStates$l2 === void 0 ? void 0 : _state$domainStates$l2.OutOfOperatingHours) === "True");
40
+ const [outOfOperatingHours, setOutOfOperatingHours] = (0, _react.useState)(state.appStates.outsideOperatingHours);
41
41
  const outOfOfficeStyleProps = Object.assign({}, _defaultOutOfOfficeHeaderStyleProps.defaultOutOfOfficeHeaderStyleProps, outOfOfficeHeaderProps === null || outOfOfficeHeaderProps === void 0 ? void 0 : outOfOfficeHeaderProps.styleProps);
42
42
 
43
43
  // For some reason state object is not getting updated values in this component
@@ -109,9 +109,7 @@ const HeaderStateful = props => {
109
109
  hideCloseButton: state.appStates.conversationState === _ConversationState.ConversationState.OutOfOffice || (outOfOfficeHeaderProps === null || outOfOfficeHeaderProps === void 0 ? void 0 : (_outOfOfficeHeaderPro = outOfOfficeHeaderProps.controlProps) === null || _outOfOfficeHeaderPro === void 0 ? void 0 : _outOfOfficeHeaderPro.hideCloseButton)
110
110
  };
111
111
  (0, _react.useEffect)(() => {
112
- if (state.appStates.outsideOperatingHours) {
113
- setOutOfOperatingHours(true);
114
- }
112
+ setOutOfOperatingHours(state.appStates.outsideOperatingHours);
115
113
  }, []);
116
114
  (0, _react.useEffect)(() => {
117
115
  var _state$domainStates2;
@@ -11,7 +11,7 @@ var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
11
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
- var _state$appStates, _state$domainStates, _state$domainStates$m, _props$webChatContain, _props$webChatContain2;
14
+ var _state$appStates, _state$domainStates, _state$domainStates$m, _props$webChatContain, _props$webChatContain2, _props$webChatContain3, _props$webChatContain4;
15
15
  const chatDisconnectState = state === null || state === void 0 ? void 0 : (_state$appStates = state.appStates) === null || _state$appStates === void 0 ? void 0 : _state$appStates.chatDisconnectEventReceived;
16
16
  const chatDisconnectMessage = (state === null || state === void 0 ? void 0 : (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : (_state$domainStates$m = _state$domainStates.middlewareLocalizedTexts) === null || _state$domainStates$m === void 0 ? void 0 : _state$domainStates$m.MIDDLEWARE_BANNER_CHAT_DISCONNECT) ?? _defaultMiddlewareLocalizedTexts.defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_CHAT_DISCONNECT;
17
17
  const hideSendBoxOnConversationEnd = props === null || props === void 0 ? void 0 : (_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : (_props$webChatContain2 = _props$webChatContain.renderingMiddlewareProps) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.hideSendboxOnConversationEnd;
@@ -32,6 +32,8 @@ const handleChatDisconnect = (props, state, setWebChatStyles) => {
32
32
  });
33
33
  break;
34
34
  case false:
35
+ // this means customer on purpose wants to hide the send box, we should not override it
36
+ if ((props === null || props === void 0 ? void 0 : (_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : (_props$webChatContain4 = _props$webChatContain3.webChatStyles) === null || _props$webChatContain4 === void 0 ? void 0 : _props$webChatContain4.hideSendBox) === true) return;
35
37
  if (hideSendBoxOnConversationEnd !== false) {
36
38
  setWebChatStyles(styles => {
37
39
  return {
@@ -67,11 +67,6 @@ const getChatReconnectContext = async (facadeChatSDK, chatConfig, props, isAuthe
67
67
  const chatReconnectOptionalParams = {
68
68
  reconnectId: (_props$reconnectChatP4 = props.reconnectChatPaneProps) === null || _props$reconnectChatP4 === void 0 ? void 0 : _props$reconnectChatP4.reconnectId
69
69
  };
70
- // Get auth token for getting chat reconnect context
71
- if (isAuthenticatedChat) {
72
- // handle authentication will throw error if auth token is not available, so no need to check for response
73
- await (0, _authHelper.handleAuthentication)(facadeChatSDK.getChatSDK(), chatConfig, props.getAuthToken);
74
- }
75
70
  const reconnectChatContext = await (facadeChatSDK === null || facadeChatSDK === void 0 ? void 0 : facadeChatSDK.getChatReconnectContext(chatReconnectOptionalParams));
76
71
  if (isAuthenticatedChat) {
77
72
  // remove auth token after reconnectId is fetched
@@ -7,7 +7,6 @@ exports.setPreChatAndInitiateChat = exports.prepareStartChat = exports.initStart
7
7
  var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
8
8
  var _Constants = require("../../../common/Constants");
9
9
  var _utils = require("../../../common/utils");
10
- var _authHelper = require("./authHelper");
11
10
  var _reconnectChatHelper = require("./reconnectChatHelper");
12
11
  var _startChatErrorHandler = require("./startChatErrorHandler");
13
12
  var _ActivityStreamHandler = require("./ActivityStreamHandler");
@@ -19,6 +18,7 @@ var _TelemetryManager = require("../../../common/telemetry/TelemetryManager");
19
18
  var _endChat = require("./endChat");
20
19
  var _createAdapter = require("./createAdapter");
21
20
  var _newMessageEventHandler = require("../../../plugins/newMessageEventHandler");
21
+ var _FirstMessageTrackerFromBot = require("../../../firstresponselatency/FirstMessageTrackerFromBot");
22
22
  var _liveChatConfigUtils = require("./liveChatConfigUtils");
23
23
  var _setPostChatContextAndLoadSurvey = require("./setPostChatContextAndLoadSurvey");
24
24
  var _persistentChatHelper = require("./persistentChatHelper");
@@ -30,20 +30,6 @@ let widgetInstanceId;
30
30
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
31
  let popoutWidgetInstanceId;
32
32
 
33
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
- const setAuthenticationIfApplicable = async (props, facadeChatSDK) => {
35
- const chatConfig = props === null || props === void 0 ? void 0 : props.chatConfig;
36
- const getAuthToken = props === null || props === void 0 ? void 0 : props.getAuthToken;
37
- const authClientFunction = (0, _authHelper.getAuthClientFunction)(chatConfig);
38
- if (getAuthToken && authClientFunction) {
39
- // set auth token to chat sdk before start chat
40
- const authSuccess = await (0, _authHelper.handleAuthentication)(facadeChatSDK.getChatSDK(), chatConfig, getAuthToken);
41
- if (!authSuccess.result) {
42
- throw new Error(_Constants.WidgetLoadCustomErrorString.AuthenticationFailedErrorString);
43
- }
44
- }
45
- };
46
-
47
33
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
34
  const prepareStartChat = async (props, facadeChatSDK, state, dispatch, setAdapter) => {
49
35
  optionalParams = {}; //Resetting to ensure no stale values
@@ -71,11 +57,6 @@ const prepareStartChat = async (props, facadeChatSDK, state, dispatch, setAdapte
71
57
  const isProactiveChat = state.appStates.conversationState === _ConversationState.ConversationState.ProactiveChat;
72
58
  const isPreChatEnabledInProactiveChat = state.appStates.proactiveChatStates.proactiveChatEnablePrechat;
73
59
 
74
- // Setting auth settings to OC API to retrieve existing persistent chat session before start chat if any
75
- if ((0, _reconnectChatHelper.isPersistentEnabled)(props.chatConfig)) {
76
- await setAuthenticationIfApplicable(props, facadeChatSDK);
77
- }
78
-
79
60
  //Setting PreChat and intiate chat
80
61
  await setPreChatAndInitiateChat(facadeChatSDK, dispatch, setAdapter, isProactiveChat, isPreChatEnabledInProactiveChat, state, props);
81
62
  };
@@ -151,6 +132,7 @@ const setPreChatAndInitiateChat = async (facadeChatSDK, dispatch, setAdapter, is
151
132
  const optionalParams = {
152
133
  isProactiveChat
153
134
  };
135
+ (0, _FirstMessageTrackerFromBot.createTrackingForFirstMessage)();
154
136
  await initStartChat(facadeChatSDK, dispatch, setAdapter, state, props, optionalParams);
155
137
  };
156
138
 
@@ -179,9 +161,6 @@ const initStartChat = async (facadeChatSDK, dispatch, setAdapter, state, props,
179
161
  Description: "Widget loading started"
180
162
  });
181
163
 
182
- // Auth token retrieval needs to happen during start chat to support pop-out chat
183
- await setAuthenticationIfApplicable(props, facadeChatSDK);
184
-
185
164
  //Check if chat retrieved from cache
186
165
  if (persistedState || params !== null && params !== void 0 && params.liveChatContext) {
187
166
  var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4, _persistedState$domai5;
@@ -64,7 +64,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
64
64
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
65
65
  let uiTimer;
66
66
  const LiveChatWidgetStateful = props => {
67
- var _props$webChatContain, _props$styleProps, _props$webChatContain2, _props$webChatContain3, _props$controlProps, _props$controlProps3, _state$appStates7, _props$webChatContain7, _state$appStates14, _props$webChatContain9, _props$webChatContain10, _props$controlProps12, _props$draggableChatW, _props$draggableChatW2, _props$draggableChatW3, _props$draggableChatW4, _props$draggableChatW5, _livechatProps$webCha, _props$webChatContain11, _props$webChatContain12, _props$webChatContain13, _props$webChatContain14, _livechatProps$styleP, _livechatProps$contro, _livechatProps$contro2, _livechatProps$compon, _livechatProps$contro3, _livechatProps$compon2, _livechatProps$contro4, _livechatProps$compon3, _livechatProps$contro5, _livechatProps$compon4, _livechatProps$contro6, _livechatProps$compon5, _livechatProps$contro7, _livechatProps$compon6, _livechatProps$contro8, _livechatProps$compon7, _livechatProps$contro9, _livechatProps$compon8, _livechatProps$contro10, _livechatProps$contro11, _livechatProps$compon9, _livechatProps$contro12, _livechatProps$compon10, _livechatProps$contro13, _livechatProps$compon11, _livechatProps$compon12, _livechatProps$compon13;
67
+ var _props$webChatContain, _props$styleProps, _props$webChatContain2, _props$webChatContain3, _props$controlProps, _props$controlProps3, _state$appStates7, _props$webChatContain7, _state$appStates14, _props$webChatContain9, _props$webChatContain10, _props$controlProps12, _props$draggableChatW, _props$draggableChatW2, _props$draggableChatW3, _props$draggableChatW4, _props$draggableChatW5, _livechatProps$webCha, _props$webChatContain11, _props$webChatContain12, _props$webChatContain13, _props$webChatContain14, _props$webChatContain15, _props$webChatContain16, _props$webChatContain17, _props$webChatContain18, _livechatProps$styleP, _livechatProps$contro, _livechatProps$contro2, _livechatProps$compon, _livechatProps$contro3, _livechatProps$compon2, _livechatProps$contro4, _livechatProps$compon3, _livechatProps$contro5, _livechatProps$compon4, _livechatProps$contro6, _livechatProps$compon5, _livechatProps$contro7, _livechatProps$compon6, _livechatProps$contro8, _livechatProps$compon7, _livechatProps$contro9, _livechatProps$compon8, _livechatProps$contro10, _livechatProps$contro11, _livechatProps$compon9, _livechatProps$contro12, _livechatProps$compon10, _livechatProps$contro13, _livechatProps$compon11, _livechatProps$compon12, _livechatProps$compon13;
68
68
  (0, _react2.useEffect)(() => {
69
69
  uiTimer = (0, _utils.createTimer)();
70
70
  _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
@@ -882,8 +882,8 @@ const LiveChatWidgetStateful = props => {
882
882
  userID: userID,
883
883
  styleOptions: {
884
884
  ...webChatStyles,
885
- bubbleBackground: ((_props$webChatContain11 = props.webChatContainerProps) === null || _props$webChatContain11 === void 0 ? void 0 : (_props$webChatContain12 = _props$webChatContain11.adaptiveCardStyles) === null || _props$webChatContain12 === void 0 ? void 0 : _props$webChatContain12.background) ?? _defaultAdaptiveCardStyles.defaultAdaptiveCardStyles.background,
886
- bubbleTextColor: ((_props$webChatContain13 = props.webChatContainerProps) === null || _props$webChatContain13 === void 0 ? void 0 : (_props$webChatContain14 = _props$webChatContain13.adaptiveCardStyles) === null || _props$webChatContain14 === void 0 ? void 0 : _props$webChatContain14.color) ?? _defaultAdaptiveCardStyles.defaultAdaptiveCardStyles.color
885
+ bubbleBackground: ((_props$webChatContain11 = props.webChatContainerProps) === null || _props$webChatContain11 === void 0 ? void 0 : (_props$webChatContain12 = _props$webChatContain11.webChatStyles) === null || _props$webChatContain12 === void 0 ? void 0 : _props$webChatContain12.bubbleBackground) ?? ((_props$webChatContain13 = props.webChatContainerProps) === null || _props$webChatContain13 === void 0 ? void 0 : (_props$webChatContain14 = _props$webChatContain13.adaptiveCardStyles) === null || _props$webChatContain14 === void 0 ? void 0 : _props$webChatContain14.background) ?? _defaultAdaptiveCardStyles.defaultAdaptiveCardStyles.background,
886
+ bubbleTextColor: ((_props$webChatContain15 = props.webChatContainerProps) === null || _props$webChatContain15 === void 0 ? void 0 : (_props$webChatContain16 = _props$webChatContain15.webChatStyles) === null || _props$webChatContain16 === void 0 ? void 0 : _props$webChatContain16.bubbleTextColor) ?? ((_props$webChatContain17 = props.webChatContainerProps) === null || _props$webChatContain17 === void 0 ? void 0 : (_props$webChatContain18 = _props$webChatContain17.adaptiveCardStyles) === null || _props$webChatContain18 === void 0 ? void 0 : _props$webChatContain18.color) ?? _defaultAdaptiveCardStyles.defaultAdaptiveCardStyles.color
887
887
  },
888
888
  directLine: directLine
889
889
  }), /*#__PURE__*/_react2.default.createElement(_react.Stack, {
@@ -7,11 +7,11 @@ exports.default = exports.OutOfOfficeHoursPaneStateful = void 0;
7
7
  var _TelemetryConstants = require("../../common/telemetry/TelemetryConstants");
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _utils = require("../../common/utils");
10
+ var _dompurify = _interopRequireDefault(require("dompurify"));
10
11
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
11
12
  var _TelemetryHelper = require("../../common/telemetry/TelemetryHelper");
12
13
  var _defaultgeneralOOOHPaneStyleProps = require("./common/defaultStyleProps/defaultgeneralOOOHPaneStyleProps");
13
14
  var _useChatContextStore = _interopRequireDefault(require("../../hooks/useChatContextStore"));
14
- var _dompurify = _interopRequireDefault(require("dompurify"));
15
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
16
  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); }
17
17
  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; }
@@ -38,9 +38,11 @@ const OutOfOfficeHoursPaneStateful = props => {
38
38
 
39
39
  // Move focus to the first button
40
40
  (0, _react.useEffect)(() => {
41
- const firstElement = (0, _utils.findAllFocusableElement)(`#${state.domainStates.widgetElementId}`);
42
- if (firstElement && firstElement[0]) {
43
- firstElement[0].focus();
41
+ if (state.domainStates.widgetElementId !== null && state.domainStates.widgetElementId !== undefined && state.domainStates.widgetElementId.trim() !== "") {
42
+ const firstElement = (0, _utils.findAllFocusableElement)(`#${state.domainStates.widgetElementId}`);
43
+ if (firstElement && firstElement[0]) {
44
+ firstElement[0].focus();
45
+ }
44
46
  }
45
47
  _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
46
48
  Event: _TelemetryConstants.TelemetryEvent.OutOfOfficePaneLoaded
@@ -4,13 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.WebChatContainerStateful = void 0;
7
+ var _Constants = require("../../common/Constants");
7
8
  var _react = require("@fluentui/react");
8
9
  var _TelemetryConstants = require("../../common/telemetry/TelemetryConstants");
9
10
  var _react2 = _interopRequireWildcard(require("react"));
10
11
  var _utils = require("../../common/utils");
11
12
  var _BotMagicCodeStore = require("./webchatcontroller/BotMagicCodeStore");
12
13
  var _botframeworkWebchat = require("botframework-webchat");
13
- var _Constants = require("../../common/Constants");
14
14
  var _LiveChatWidgetActionType = require("../../contexts/common/LiveChatWidgetActionType");
15
15
  var _NotificationHandler = require("./webchatcontroller/notification/NotificationHandler");
16
16
  var _NotificationScenarios = require("./webchatcontroller/enums/NotificationScenarios");
@@ -56,7 +56,7 @@ const createMagicCodeSuccessResponse = signin => {
56
56
  };
57
57
  };
58
58
  const WebChatContainerStateful = props => {
59
- var _webChatContainerProp, _webChatContainerProp2, _webChatContainerProp3, _webChatContainerProp4, _webChatContainerProp5, _webChatContainerProp6, _webChatContainerProp7, _props$webChatContain5, _props$webChatContain6, _defaultWebChatContai, _props$webChatContain7, _props$webChatContain8, _defaultWebChatContai2, _webChatContainerProp8, _webChatContainerProp9, _webChatContainerProp10, _webChatContainerProp11, _webChatContainerProp12, _webChatContainerProp13, _webChatContainerProp14, _webChatContainerProp15, _props$webChatContain9, _props$webChatContain10;
59
+ var _webChatContainerProp, _webChatContainerProp2, _webChatContainerProp3, _webChatContainerProp4, _webChatContainerProp5, _webChatContainerProp6, _webChatContainerProp7, _props$webChatContain5, _props$webChatContain6, _defaultWebChatContai, _props$webChatContain7, _props$webChatContain8, _defaultWebChatContai2, _webChatContainerProp8, _webChatContainerProp9, _webChatContainerProp10, _webChatContainerProp11, _webChatContainerProp12, _webChatContainerProp13, _webChatContainerProp14, _webChatContainerProp15, _webChatContainerProp16, _props$webChatContain9, _props$webChatContain10;
60
60
  (0, _react2.useEffect)(() => {
61
61
  uiTimer = (0, _utils.createTimer)();
62
62
  _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
@@ -241,8 +241,9 @@ const WebChatContainerStateful = props => {
241
241
  color: ${(webChatContainerProps === null || webChatContainerProps === void 0 ? void 0 : (_webChatContainerProp14 = webChatContainerProps.renderingMiddlewareProps) === null || _webChatContainerProp14 === void 0 ? void 0 : (_webChatContainerProp15 = _webChatContainerProp14.sentMessageAnchorStyles) === null || _webChatContainerProp15 === void 0 ? void 0 : _webChatContainerProp15.color) ?? (_defaultSentMessageAnchorStyles.defaultSentMessageAnchorStyles === null || _defaultSentMessageAnchorStyles.defaultSentMessageAnchorStyles === void 0 ? void 0 : _defaultSentMessageAnchorStyles.defaultSentMessageAnchorStyles.color)};
242
242
  }
243
243
 
244
+ // we had a nasty bug long time ago with crashing borders messing with the sendbox, so if customer adds this value, they need to deal with that
244
245
  .webchat__bubble:not(.webchat__bubble--from-user) .webchat__bubble__content {
245
- border-radius: 0 !important; /* Override border-radius */
246
+ border-radius: ${(webChatContainerProps === null || webChatContainerProps === void 0 ? void 0 : (_webChatContainerProp16 = webChatContainerProps.webChatStyles) === null || _webChatContainerProp16 === void 0 ? void 0 : _webChatContainerProp16.bubbleBorderRadius) ?? 0} !important; /* Override border-radius */
246
247
  }
247
248
 
248
249
  .webchat__stacked-layout_container>div {
@@ -41,6 +41,10 @@ const DeliveredTimestamp = _ref => {
41
41
  return /*#__PURE__*/_react.default.createElement("span", {
42
42
  dir: "ltr"
43
43
  }, (0, _utils.getTimestampHourMinute)(timestamp));
44
+ } else {
45
+ return /*#__PURE__*/_react.default.createElement("span", {
46
+ dir: dir
47
+ }, (0, _utils.getTimestampHourMinute)(timestamp));
44
48
  }
45
49
  return timeString;
46
50
  };
@@ -12,6 +12,10 @@ var _defaultClientDataStoreProvider = require("../../common/storage/default/defa
12
12
  var _defaultMiddlewareLocalizedTexts = require("../../components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
13
13
  const getLiveChatWidgetContextInitialState = props => {
14
14
  var _props$controlProps, _props$webChatContain;
15
+ const isOutsideOperatingHours = () => {
16
+ var _props$chatConfig, _props$chatConfig$Liv, _props$chatConfig$Liv2;
17
+ return ((_props$chatConfig = props.chatConfig) === null || _props$chatConfig === void 0 ? void 0 : (_props$chatConfig$Liv = _props$chatConfig.LiveWSAndLiveChatEngJoin) === null || _props$chatConfig$Liv === void 0 ? void 0 : (_props$chatConfig$Liv2 = _props$chatConfig$Liv.OutOfOperatingHours) === null || _props$chatConfig$Liv2 === void 0 ? void 0 : _props$chatConfig$Liv2.toString().toLowerCase()) === "true";
18
+ };
15
19
  const widgetCacheId = (0, _utils.getWidgetCacheIdfromProps)(props);
16
20
  const cacheTtlInMins = (props === null || props === void 0 ? void 0 : (_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.cacheTtlInMins) ?? _Constants.Constants.CacheTtlInMinutes;
17
21
  const storageType = (props === null || props === void 0 ? void 0 : props.useSessionStorage) === true ? _Constants.StorageType.sessionStorage : _Constants.StorageType.localStorage;
@@ -28,6 +32,14 @@ const getLiveChatWidgetContextInitialState = props => {
28
32
  if (initialStateFromCache.appStates.conversationState === _ConversationState.ConversationState.Prechat) {
29
33
  initialStateFromCache.appStates.conversationState = _ConversationState.ConversationState.Closed;
30
34
  }
35
+
36
+ // we are always setting the chatConfig from the props to avoid any issues with the cache
37
+ initialStateFromCache.domainStates.liveChatConfig = props.chatConfig;
38
+
39
+ // Cache the result of isOutsideOperatingHours() to ensure consistency
40
+ const outsideOperatingHours = isOutsideOperatingHours();
41
+ initialStateFromCache.appStates.outsideOperatingHours = outsideOperatingHours;
42
+ initialStateFromCache.appStates.conversationState = outsideOperatingHours ? _ConversationState.ConversationState.OutOfOffice : initialStateFromCache.appStates.conversationState;
31
43
  return initialStateFromCache;
32
44
  }
33
45
  const LiveChatWidgetContextInitialState = {
@@ -52,11 +64,11 @@ const getLiveChatWidgetContextInitialState = props => {
52
64
  startChatFailureType: _StartChatFailureType.StartChatFailureType.Generic
53
65
  },
54
66
  appStates: {
55
- conversationState: _ConversationState.ConversationState.Closed,
67
+ conversationState: isOutsideOperatingHours() ? _ConversationState.ConversationState.OutOfOffice : _ConversationState.ConversationState.Closed,
56
68
  isMinimized: undefined,
57
69
  previousElementIdOnFocusBeforeModalOpen: null,
58
70
  startChatFailed: false,
59
- outsideOperatingHours: false,
71
+ outsideOperatingHours: isOutsideOperatingHours(),
60
72
  preChatResponseEmail: "",
61
73
  isAudioMuted: null,
62
74
  newMessage: false,
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createTrackingForFirstMessage = void 0;
7
+ var _TelemetryConstants = require("../common/telemetry/TelemetryConstants");
8
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
9
+ var _TelemetryHelper = require("../common/telemetry/TelemetryHelper");
10
+ var _util = require("./util");
11
+ // This tracker is event based, this is since we are tracking events coming from different sources
12
+ // with different timeline, therefore this is a functional approach to track the events, instead of a class based approach
13
+ const createTrackingForFirstMessage = () => {
14
+ // Reset the tracking variables
15
+ let startTracking = false;
16
+ let stopTracking = false;
17
+ let startTime = 0;
18
+ let stopTime = 0;
19
+ let stopTrackingMessage;
20
+ let flag = false;
21
+ const isMessageFromValidSender = payload => {
22
+ var _payload$tags;
23
+ // agent scenario
24
+ if (payload !== null && payload !== void 0 && (_payload$tags = payload.tags) !== null && _payload$tags !== void 0 && _payload$tags.includes("public")) {
25
+ return false;
26
+ }
27
+ return true;
28
+ };
29
+ const widgetLoadListener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.TelemetryEvent.WidgetLoadComplete).subscribe(() => {
30
+ if (startTracking) return;
31
+ startTracking = true;
32
+ startTime = new Date().getTime();
33
+ });
34
+ const newMessageListener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.NewMessageReceived).subscribe(message => {
35
+ const payload = message.payload;
36
+
37
+ // we only care for bot, so we need to check if the message is from the bot
38
+ // pending to add typing message indicator signal detection
39
+
40
+ if (isMessageFromValidSender(payload)) {
41
+ if (startTracking && !stopTracking) {
42
+ stopTime = new Date().getTime();
43
+ const elapsedTime = stopTime - startTime;
44
+ stopTracking = true;
45
+ stopTrackingMessage = (0, _util.createTrackingMessage)(payload, "botMessage");
46
+ notifyFMLTrackingCompleted();
47
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
48
+ Event: _TelemetryConstants.TelemetryEvent.BotFirstMessageLapTrack,
49
+ Description: "First Message from Bot latency tracking",
50
+ CustomProperties: {
51
+ elapsedTime,
52
+ widgetLoadedAt: startTime,
53
+ botMessage: stopTrackingMessage
54
+ }
55
+ });
56
+ }
57
+ }
58
+
59
+ // this track only first message, if coming from the bot or not
60
+ // the only difference is that it logs only those from bot
61
+ disconnectListener();
62
+ });
63
+ const notifyFMLTrackingCompleted = () => {
64
+ ackListener();
65
+ // Retry sending until flag is true, but do not block the main thread
66
+ const interval = setInterval(() => {
67
+ if (flag) {
68
+ clearInterval(interval);
69
+ } else {
70
+ _omnichannelChatComponents.BroadcastService.postMessage({
71
+ eventName: _TelemetryConstants.BroadcastEvent.FMLTrackingCompleted,
72
+ payload: null
73
+ });
74
+ }
75
+ }, 100);
76
+ };
77
+ const ackListener = () => {
78
+ const listen = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.FMLTrackingCompletedAck).subscribe(() => {
79
+ flag = true;
80
+ listen.unsubscribe();
81
+ });
82
+ };
83
+
84
+ // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
85
+ // No need to keep listerning for tracking, enforcing disconnection for the listners
86
+ const rehydrateListener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.TelemetryEvent.RehydrateMessageReceived).subscribe(() => {
87
+ startTracking = false;
88
+ stopTracking = false;
89
+ disconnectListener();
90
+ });
91
+
92
+ // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
93
+ // No need to keep listerning for tracking, enforcing disconnection for the listners
94
+ const historyListener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.HistoryMessageReceived).subscribe(() => {
95
+ startTracking = false;
96
+ stopTracking = false;
97
+ disconnectListener();
98
+ });
99
+ const offlineNetworkListener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.TelemetryEvent.NetworkDisconnected).subscribe(() => {
100
+ startTracking = false;
101
+ stopTracking = false;
102
+ disconnectListener();
103
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
104
+ Event: _TelemetryConstants.TelemetryEvent.BotFirstMessageLapTrackError,
105
+ Description: "Tracker Stopped due to network disconnection"
106
+ });
107
+ });
108
+
109
+ // this is to ensure that we are not tracking messages that are not part of the current conversation
110
+ const disconnectListener = () => {
111
+ historyListener.unsubscribe();
112
+ rehydrateListener.unsubscribe();
113
+ newMessageListener.unsubscribe();
114
+ widgetLoadListener.unsubscribe();
115
+ offlineNetworkListener.unsubscribe();
116
+ };
117
+ };
118
+ exports.createTrackingForFirstMessage = createTrackingForFirstMessage;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.FirstResponseLatencyTracker = void 0;
7
7
  var _TelemetryConstants = require("../common/telemetry/TelemetryConstants");
8
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
8
9
  var _TelemetryHelper = require("../common/telemetry/TelemetryHelper");
9
10
  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; }
10
11
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
@@ -16,6 +17,32 @@ class FirstResponseLatencyTracker {
16
17
  _defineProperty(this, "isEnded", false);
17
18
  _defineProperty(this, "startTrackingMessage", void 0);
18
19
  _defineProperty(this, "stopTrackingMessage", void 0);
20
+ _defineProperty(this, "isReady", false);
21
+ _defineProperty(this, "offlineNetworkListener", _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.TelemetryEvent.NetworkDisconnected).subscribe(() => {
22
+ this.isStarted = false;
23
+ this.isEnded = false;
24
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
25
+ Event: _TelemetryConstants.TelemetryEvent.MessageStopLapTrackError,
26
+ Description: "Tracker Stopped due to network disconnection"
27
+ });
28
+ }));
29
+ _defineProperty(this, "fmltrackingListener", _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.FMLTrackingCompleted).subscribe(() => {
30
+ this.isReady = true;
31
+ _omnichannelChatComponents.BroadcastService.postMessage({
32
+ eventName: _TelemetryConstants.BroadcastEvent.FMLTrackingCompletedAck,
33
+ payload: null
34
+ });
35
+ }));
36
+ // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
37
+ // No need to keep listerning for tracking, enforcing disconnection for the listners
38
+ _defineProperty(this, "rehydrateListener", _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.TelemetryEvent.RehydrateMessageReceived).subscribe(() => {
39
+ this.isReady = true;
40
+ }));
41
+ // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
42
+ // No need to keep listerning for tracking, enforcing disconnection for the listners
43
+ _defineProperty(this, "historyListener", _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.HistoryMessageReceived).subscribe(() => {
44
+ this.isReady = true;
45
+ }));
19
46
  // this is a workaround to ensure in reload we track effectively the messages
20
47
  // we do have a mechanism in place to prevent log agent messages.
21
48
  this.isABotConversation = true;
@@ -35,6 +62,7 @@ class FirstResponseLatencyTracker {
35
62
 
36
63
  // Tracking Functions
37
64
  startTracking(payload) {
65
+ if (!this.isReady) return;
38
66
  // this prevents to initiate tracking for multiple incoming messages
39
67
  if (this.isStarted) {
40
68
  return;
@@ -43,11 +71,9 @@ class FirstResponseLatencyTracker {
43
71
  if (!this.isABotConversation) {
44
72
  return;
45
73
  }
46
-
47
74
  // control of states to prevent clashing of messages
48
75
  this.isStarted = true;
49
76
  this.isEnded = false;
50
-
51
77
  // The idea of using types is to enrich telemetry data
52
78
  this.startTrackingMessage = this.createTrackingMessage(payload, "userMessage");
53
79
  }
@@ -99,9 +125,6 @@ class FirstResponseLatencyTracker {
99
125
  if (!payload || !payload.Id) {
100
126
  throw new Error("Invalid payload");
101
127
  }
102
- // in the case of a reload, tracker will be paused, until last history message is received
103
- // this is because we dont have a way to identidy send messages as part of the history
104
- //if (this.inPause) return;
105
128
  this.startTracking(payload);
106
129
  } catch (e) {
107
130
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
@@ -147,6 +170,10 @@ class FirstResponseLatencyTracker {
147
170
  this.isEnded = false;
148
171
  this.startTrackingMessage = undefined;
149
172
  this.stopTrackingMessage = undefined;
173
+ this.offlineNetworkListener.unsubscribe();
174
+ this.fmltrackingListener.unsubscribe();
175
+ this.rehydrateListener.unsubscribe();
176
+ this.historyListener.unsubscribe();
150
177
  }
151
178
  }
152
179
  exports.FirstResponseLatencyTracker = FirstResponseLatencyTracker;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.polyfillMessagePayloadForEvent = exports.isHistoryMessage = exports.getScenarioType = exports.buildMessagePayload = void 0;
6
+ exports.polyfillMessagePayloadForEvent = exports.isHistoryMessage = exports.getScenarioType = exports.createTrackingMessage = exports.buildMessagePayload = void 0;
7
7
  var _Constants = require("./Constants");
8
8
  var _Constants2 = require("../common/Constants");
9
9
  const isHistoryMessage = (activity, startTime) => {
@@ -82,4 +82,17 @@ const getScenarioType = activity => {
82
82
  }
83
83
  return _Constants.ScenarioType.ReceivedMessageStrategy;
84
84
  };
85
- exports.getScenarioType = getScenarioType;
85
+ exports.getScenarioType = getScenarioType;
86
+ const createTrackingMessage = (payload, type) => {
87
+ return {
88
+ Id: payload.Id,
89
+ role: payload.role,
90
+ timestamp: payload === null || payload === void 0 ? void 0 : payload.timestamp,
91
+ tags: payload.tags,
92
+ messageType: payload.messageType,
93
+ text: payload.text,
94
+ type: type,
95
+ checkTime: new Date().getTime()
96
+ };
97
+ };
98
+ exports.createTrackingMessage = createTrackingMessage;