@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.
- package/lib/cjs/common/facades/FacadeChatSDK.js +15 -4
- package/lib/cjs/common/telemetry/TelemetryConstants.js +4 -0
- package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +4 -5
- package/lib/cjs/components/headerstateful/HeaderStateful.js +3 -5
- package/lib/cjs/components/livechatwidget/common/chatDisconnectHelper.js +3 -1
- package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +0 -5
- package/lib/cjs/components/livechatwidget/common/startChat.js +2 -23
- package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +3 -3
- package/lib/cjs/components/ooohpanestateful/OOOHPaneStateful.js +6 -4
- package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +4 -3
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +4 -0
- package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +14 -2
- package/lib/cjs/firstresponselatency/FirstMessageTrackerFromBot.js +118 -0
- package/lib/cjs/firstresponselatency/FirstResponseLatencyTracker.js +32 -5
- package/lib/cjs/firstresponselatency/util.js +15 -2
- package/lib/esm/common/facades/FacadeChatSDK.js +15 -4
- package/lib/esm/common/telemetry/TelemetryConstants.js +4 -0
- package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +4 -5
- package/lib/esm/components/headerstateful/HeaderStateful.js +3 -5
- package/lib/esm/components/livechatwidget/common/chatDisconnectHelper.js +3 -1
- package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +1 -6
- package/lib/esm/components/livechatwidget/common/startChat.js +3 -24
- package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +3 -3
- package/lib/esm/components/ooohpanestateful/OOOHPaneStateful.js +6 -4
- package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +4 -3
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +4 -0
- package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +14 -2
- package/lib/esm/firstresponselatency/FirstMessageTrackerFromBot.js +112 -0
- package/lib/esm/firstresponselatency/FirstResponseLatencyTracker.js +33 -6
- package/lib/esm/firstresponselatency/util.js +12 -0
- package/lib/types/common/facades/FacadeChatSDK.d.ts +1 -0
- package/lib/types/common/telemetry/TelemetryConstants.d.ts +5 -1
- package/lib/types/firstresponselatency/FirstMessageTrackerFromBot.d.ts +1 -0
- package/lib/types/firstresponselatency/FirstResponseLatencyTracker.d.ts +5 -0
- package/lib/types/firstresponselatency/util.d.ts +2 -1
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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)(
|
|
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
|
-
|
|
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.
|
|
886
|
-
bubbleTextColor: ((_props$
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
firstElement[0]
|
|
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:
|
|
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;
|