@microsoft/omnichannel-chat-widget 1.6.3-main.18ee949 → 1.6.3-main.cd40716
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/utils.js +6 -2
- package/lib/cjs/components/livechatwidget/common/authHelper.js +4 -1
- package/lib/cjs/components/livechatwidget/common/endChat.js +1 -22
- package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +13 -3
- package/lib/cjs/components/livechatwidget/common/startChatErrorHandler.js +5 -0
- package/lib/cjs/components/webchatcontainerstateful/common/utils/isMaskingFromCustomer.js +4 -2
- package/lib/esm/common/utils.js +3 -0
- package/lib/esm/components/livechatwidget/common/authHelper.js +4 -1
- package/lib/esm/components/livechatwidget/common/endChat.js +2 -23
- package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +15 -4
- package/lib/esm/components/livechatwidget/common/startChatErrorHandler.js +5 -0
- package/lib/esm/components/webchatcontainerstateful/common/utils/isMaskingFromCustomer.js +4 -2
- package/lib/types/common/utils.d.ts +1 -0
- package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +1 -1
- package/package.json +3 -3
package/lib/cjs/common/utils.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.setTabIndices = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isUndefinedOrEmpty = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getWidgetEndChatEventName = exports.getWidgetCacheIdfromProps = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getStateFromCache = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.getConversationDetailsCall = exports.getBroadcastChannelName = exports.formatTemplateString = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.debounceLeading = exports.createTimer = exports.createFileAndDownload = exports.checkContactIdError = exports.changeLanguageCodeFormatForWebChat = exports.addDelayInMs = void 0;
|
|
6
|
+
exports.setTabIndices = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseLowerCaseString = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isUndefinedOrEmpty = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getWidgetEndChatEventName = exports.getWidgetCacheIdfromProps = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getStateFromCache = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.getConversationDetailsCall = exports.getBroadcastChannelName = exports.formatTemplateString = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.debounceLeading = exports.createTimer = exports.createFileAndDownload = exports.checkContactIdError = exports.changeLanguageCodeFormatForWebChat = exports.addDelayInMs = void 0;
|
|
7
7
|
var _Constants = require("./Constants");
|
|
8
8
|
var _TelemetryConstants = require("./telemetry/TelemetryConstants");
|
|
9
9
|
var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
|
|
@@ -449,4 +449,8 @@ const formatTemplateString = (templateMessage, values) => {
|
|
|
449
449
|
return typeof values[index] !== "undefined" ? values[index] : match;
|
|
450
450
|
});
|
|
451
451
|
};
|
|
452
|
-
exports.formatTemplateString = formatTemplateString;
|
|
452
|
+
exports.formatTemplateString = formatTemplateString;
|
|
453
|
+
const parseLowerCaseString = property => {
|
|
454
|
+
return String(property).toLowerCase();
|
|
455
|
+
};
|
|
456
|
+
exports.parseLowerCaseString = parseLowerCaseString;
|
|
@@ -7,6 +7,7 @@ exports.removeAuthTokenProvider = exports.handleAuthentication = exports.getAuth
|
|
|
7
7
|
var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
|
|
8
8
|
var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
|
|
9
9
|
var _utils = require("../../../common/utils");
|
|
10
|
+
var _Constants = require("../../../common/Constants");
|
|
10
11
|
const getAuthClientFunction = chatConfig => {
|
|
11
12
|
let authClientFunction = undefined;
|
|
12
13
|
if (chatConfig !== null && chatConfig !== void 0 && chatConfig.LiveChatConfigAuthSettings) {
|
|
@@ -32,10 +33,12 @@ const handleAuthentication = async (chatSDK, chatConfig, getAuthToken) => {
|
|
|
32
33
|
});
|
|
33
34
|
return true;
|
|
34
35
|
} else {
|
|
36
|
+
// instead of returning false, it's more appropiate to thrown an error to force error handling on the caller side
|
|
37
|
+
// this will help to avoid the error to be ignored and the chat to be started
|
|
35
38
|
_TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
|
|
36
39
|
Event: _TelemetryConstants.TelemetryEvent.ReceivedNullOrEmptyToken
|
|
37
40
|
});
|
|
38
|
-
|
|
41
|
+
throw new Error(_Constants.WidgetLoadCustomErrorString.AuthenticationFailedErrorString);
|
|
39
42
|
}
|
|
40
43
|
}
|
|
41
44
|
return false;
|
|
@@ -119,7 +119,7 @@ const endChat = async (props, chatSDK, state, dispatch, setAdapter, setWebChatSt
|
|
|
119
119
|
Event: _TelemetryConstants.TelemetryEvent.EndChatSDKCall
|
|
120
120
|
});
|
|
121
121
|
//Get auth token again if chat continued for longer time, otherwise gets 401 error
|
|
122
|
-
await
|
|
122
|
+
await (0, _authHelper.handleAuthentication)(chatSDK, props.chatConfig, props.getAuthToken);
|
|
123
123
|
await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.endChat());
|
|
124
124
|
} catch (ex) {
|
|
125
125
|
_TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
|
|
@@ -308,27 +308,6 @@ const closeChatWidget = (dispatch, props, state) => {
|
|
|
308
308
|
});
|
|
309
309
|
};
|
|
310
310
|
|
|
311
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
312
|
-
const handleAuthenticationIfEnabled = async (props, chatSDK) => {
|
|
313
|
-
//Unable to end chat if token has expired
|
|
314
|
-
if (props.getAuthToken) {
|
|
315
|
-
const authClientFunction = (0, _authHelper.getAuthClientFunction)(props.chatConfig);
|
|
316
|
-
if (props.getAuthToken && authClientFunction) {
|
|
317
|
-
// set auth token to chat sdk before end chat
|
|
318
|
-
const authSuccess = await (0, _authHelper.handleAuthentication)(chatSDK, props.chatConfig, props.getAuthToken);
|
|
319
|
-
if (!authSuccess) {
|
|
320
|
-
_TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
|
|
321
|
-
Event: _TelemetryConstants.TelemetryEvent.GetAuthTokenFailed,
|
|
322
|
-
ExceptionDetails: {
|
|
323
|
-
exception: "Unable to get auth token during end chat"
|
|
324
|
-
}
|
|
325
|
-
});
|
|
326
|
-
throw new Error("handleAuthenticationIfEnabled:Failed to get authentication token");
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
};
|
|
331
|
-
|
|
332
311
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
333
312
|
const chatTokenCleanUp = async dispatch => {
|
|
334
313
|
//Just do cleanup here
|
|
@@ -13,6 +13,7 @@ var _Constants = require("../../../common/Constants");
|
|
|
13
13
|
var _ConversationState = require("../../../contexts/common/ConversationState");
|
|
14
14
|
var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
|
|
15
15
|
var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
|
|
16
|
+
var _startChatErrorHandler = require("./startChatErrorHandler");
|
|
16
17
|
// Return value: should start normal chat flow when reconnect is enabled
|
|
17
18
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
19
|
const handleChatReconnect = async (chatSDK, props, dispatch, setAdapter, initStartChat, state) => {
|
|
@@ -21,7 +22,7 @@ const handleChatReconnect = async (chatSDK, props, dispatch, setAdapter, initSta
|
|
|
21
22
|
const isAuthenticatedChat = (_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && (_props$chatConfig$Liv = _props$chatConfig.LiveChatConfigAuthSettings) !== null && _props$chatConfig$Liv !== void 0 && _props$chatConfig$Liv.msdyn_javascriptclientfunction ? true : false;
|
|
22
23
|
|
|
23
24
|
// Get chat reconnect context
|
|
24
|
-
const reconnectChatContext = await getChatReconnectContext(chatSDK, props.chatConfig, props, isAuthenticatedChat);
|
|
25
|
+
const reconnectChatContext = await getChatReconnectContext(chatSDK, props.chatConfig, props, isAuthenticatedChat, dispatch);
|
|
25
26
|
|
|
26
27
|
// Redirect if enabled
|
|
27
28
|
if (reconnectChatContext !== null && reconnectChatContext !== void 0 && reconnectChatContext.redirectURL) {
|
|
@@ -57,7 +58,7 @@ const handleChatReconnect = async (chatSDK, props, dispatch, setAdapter, initSta
|
|
|
57
58
|
|
|
58
59
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
60
|
exports.handleChatReconnect = handleChatReconnect;
|
|
60
|
-
const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticatedChat) => {
|
|
61
|
+
const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticatedChat, dispatch) => {
|
|
61
62
|
try {
|
|
62
63
|
var _props$reconnectChatP4;
|
|
63
64
|
_TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.INFO, {
|
|
@@ -69,6 +70,7 @@ const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticat
|
|
|
69
70
|
};
|
|
70
71
|
// Get auth token for getting chat reconnect context
|
|
71
72
|
if (isAuthenticatedChat) {
|
|
73
|
+
// handle authentication will throw error if auth token is not available, so no need to check for response
|
|
72
74
|
await (0, _authHelper.handleAuthentication)(chatSDK, chatConfig, props.getAuthToken);
|
|
73
75
|
}
|
|
74
76
|
const reconnectChatContext = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getChatReconnectContext(chatReconnectOptionalParams));
|
|
@@ -78,7 +80,9 @@ const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticat
|
|
|
78
80
|
(0, _authHelper.removeAuthTokenProvider)(chatSDK);
|
|
79
81
|
}
|
|
80
82
|
return reconnectChatContext;
|
|
81
|
-
}
|
|
83
|
+
}
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
85
|
+
catch (error) {
|
|
82
86
|
(0, _utils.checkContactIdError)(error);
|
|
83
87
|
_TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
|
|
84
88
|
Event: _TelemetryConstants.TelemetryEvent.GetChatReconnectContextSDKCallFailed,
|
|
@@ -86,6 +90,12 @@ const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticat
|
|
|
86
90
|
exception: error
|
|
87
91
|
}
|
|
88
92
|
});
|
|
93
|
+
|
|
94
|
+
// when auth token is not available, propagate the error to stop the execution and ensure error pane is loaded
|
|
95
|
+
if ((error === null || error === void 0 ? void 0 : error.message) == _Constants.WidgetLoadCustomErrorString.AuthenticationFailedErrorString) {
|
|
96
|
+
(0, _startChatErrorHandler.handleStartChatError)(dispatch, chatSDK, props, new Error(_Constants.WidgetLoadCustomErrorString.AuthenticationFailedErrorString), false);
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
89
99
|
}
|
|
90
100
|
};
|
|
91
101
|
|
|
@@ -29,6 +29,11 @@ const handleStartChatError = (dispatch, chatSDK, props, ex, isStartChatSuccessfu
|
|
|
29
29
|
type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_START_CHAT_FAILURE_TYPE,
|
|
30
30
|
payload: _StartChatFailureType.StartChatFailureType.AuthSetupError
|
|
31
31
|
});
|
|
32
|
+
// set conversation to error to enforce error UI pane
|
|
33
|
+
dispatch({
|
|
34
|
+
type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
35
|
+
payload: _ConversationState.ConversationState.Error
|
|
36
|
+
});
|
|
32
37
|
logWidgetLoadCompleteWithError(ex);
|
|
33
38
|
}
|
|
34
39
|
if (ex.message === _Constants.WidgetLoadCustomErrorString.NetworkErrorString) {
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.isMaskingforCustomer = void 0;
|
|
7
|
+
var _utils = require("../../../../common/utils");
|
|
7
8
|
const isMaskingforCustomer = maskingInfo => {
|
|
8
9
|
var _maskingInfo$setting;
|
|
9
10
|
// If the masking info (containing masking setting and masking rules) is missing or empty, return false.
|
|
@@ -14,8 +15,9 @@ const isMaskingforCustomer = maskingInfo => {
|
|
|
14
15
|
|
|
15
16
|
// If the masking rules are provided and;
|
|
16
17
|
// If the masking setting is NOT null and masking for customer is NOT null, return the configuration
|
|
17
|
-
if ((_maskingInfo$setting = maskingInfo.setting)
|
|
18
|
-
|
|
18
|
+
if (!(0, _utils.isNullOrUndefined)((_maskingInfo$setting = maskingInfo.setting) === null || _maskingInfo$setting === void 0 ? void 0 : _maskingInfo$setting.msdyn_maskforcustomer)) {
|
|
19
|
+
var _maskingInfo$setting2;
|
|
20
|
+
return (0, _utils.parseLowerCaseString)(maskingInfo === null || maskingInfo === void 0 ? void 0 : (_maskingInfo$setting2 = maskingInfo.setting) === null || _maskingInfo$setting2 === void 0 ? void 0 : _maskingInfo$setting2.msdyn_maskforcustomer) === "true";
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
// In all other cases, even if masking setting is missing, return true to apply the masking for backward compatibility (i.e. in old versions, OC does not have masking info settings)
|
package/lib/esm/common/utils.js
CHANGED
|
@@ -413,4 +413,7 @@ export const formatTemplateString = (templateMessage, values) => {
|
|
|
413
413
|
return templateMessage.replace(/{(\d+)}/g, (match, index) => {
|
|
414
414
|
return typeof values[index] !== "undefined" ? values[index] : match;
|
|
415
415
|
});
|
|
416
|
+
};
|
|
417
|
+
export const parseLowerCaseString = property => {
|
|
418
|
+
return String(property).toLowerCase();
|
|
416
419
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
|
|
2
2
|
import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
|
|
3
3
|
import { isNullOrEmptyString } from "../../../common/utils";
|
|
4
|
+
import { WidgetLoadCustomErrorString } from "../../../common/Constants";
|
|
4
5
|
const getAuthClientFunction = chatConfig => {
|
|
5
6
|
let authClientFunction = undefined;
|
|
6
7
|
if (chatConfig !== null && chatConfig !== void 0 && chatConfig.LiveChatConfigAuthSettings) {
|
|
@@ -25,10 +26,12 @@ const handleAuthentication = async (chatSDK, chatConfig, getAuthToken) => {
|
|
|
25
26
|
});
|
|
26
27
|
return true;
|
|
27
28
|
} else {
|
|
29
|
+
// instead of returning false, it's more appropiate to thrown an error to force error handling on the caller side
|
|
30
|
+
// this will help to avoid the error to be ignored and the chat to be started
|
|
28
31
|
TelemetryHelper.logActionEvent(LogLevel.ERROR, {
|
|
29
32
|
Event: TelemetryEvent.ReceivedNullOrEmptyToken
|
|
30
33
|
});
|
|
31
|
-
|
|
34
|
+
throw new Error(WidgetLoadCustomErrorString.AuthenticationFailedErrorString);
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
37
|
return false;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ConfirmationState, Constants, ConversationEndEntity, ParticipantType, PrepareEndChatDescriptionConstants } from "../../../common/Constants";
|
|
2
2
|
import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
|
|
3
|
-
import {
|
|
3
|
+
import { handleAuthentication } from "./authHelper";
|
|
4
4
|
import { getConversationDetailsCall, getWidgetEndChatEventName } from "../../../common/utils";
|
|
5
5
|
import { getPostChatContext, initiatePostChat } from "./renderSurveyHelpers";
|
|
6
6
|
import { BroadcastService } from "@microsoft/omnichannel-chat-components";
|
|
@@ -113,7 +113,7 @@ const endChat = async (props, chatSDK, state, dispatch, setAdapter, setWebChatSt
|
|
|
113
113
|
Event: TelemetryEvent.EndChatSDKCall
|
|
114
114
|
});
|
|
115
115
|
//Get auth token again if chat continued for longer time, otherwise gets 401 error
|
|
116
|
-
await
|
|
116
|
+
await handleAuthentication(chatSDK, props.chatConfig, props.getAuthToken);
|
|
117
117
|
await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.endChat());
|
|
118
118
|
} catch (ex) {
|
|
119
119
|
TelemetryHelper.logSDKEvent(LogLevel.ERROR, {
|
|
@@ -296,27 +296,6 @@ const closeChatWidget = (dispatch, props, state) => {
|
|
|
296
296
|
});
|
|
297
297
|
};
|
|
298
298
|
|
|
299
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
300
|
-
const handleAuthenticationIfEnabled = async (props, chatSDK) => {
|
|
301
|
-
//Unable to end chat if token has expired
|
|
302
|
-
if (props.getAuthToken) {
|
|
303
|
-
const authClientFunction = getAuthClientFunction(props.chatConfig);
|
|
304
|
-
if (props.getAuthToken && authClientFunction) {
|
|
305
|
-
// set auth token to chat sdk before end chat
|
|
306
|
-
const authSuccess = await handleAuthentication(chatSDK, props.chatConfig, props.getAuthToken);
|
|
307
|
-
if (!authSuccess) {
|
|
308
|
-
TelemetryHelper.logActionEvent(LogLevel.ERROR, {
|
|
309
|
-
Event: TelemetryEvent.GetAuthTokenFailed,
|
|
310
|
-
ExceptionDetails: {
|
|
311
|
-
exception: "Unable to get auth token during end chat"
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
throw new Error("handleAuthenticationIfEnabled:Failed to get authentication token");
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
};
|
|
319
|
-
|
|
320
299
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
321
300
|
const chatTokenCleanUp = async dispatch => {
|
|
322
301
|
//Just do cleanup here
|
|
@@ -3,10 +3,12 @@ import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/teleme
|
|
|
3
3
|
import { checkContactIdError, isNullOrEmptyString, isNullOrUndefined } from "../../../common/utils";
|
|
4
4
|
import { handleAuthentication, removeAuthTokenProvider } from "./authHelper";
|
|
5
5
|
import { BroadcastService } from "@microsoft/omnichannel-chat-components";
|
|
6
|
-
import { ConversationMode } from "../../../common/Constants";
|
|
6
|
+
import { ConversationMode, WidgetLoadCustomErrorString } from "../../../common/Constants";
|
|
7
7
|
import { ConversationState } from "../../../contexts/common/ConversationState";
|
|
8
8
|
import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
|
|
9
9
|
import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
|
|
10
|
+
import { handleStartChatError } from "./startChatErrorHandler";
|
|
11
|
+
|
|
10
12
|
// Return value: should start normal chat flow when reconnect is enabled
|
|
11
13
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
14
|
const handleChatReconnect = async (chatSDK, props, dispatch, setAdapter, initStartChat, state) => {
|
|
@@ -15,7 +17,7 @@ const handleChatReconnect = async (chatSDK, props, dispatch, setAdapter, initSta
|
|
|
15
17
|
const isAuthenticatedChat = (_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && (_props$chatConfig$Liv = _props$chatConfig.LiveChatConfigAuthSettings) !== null && _props$chatConfig$Liv !== void 0 && _props$chatConfig$Liv.msdyn_javascriptclientfunction ? true : false;
|
|
16
18
|
|
|
17
19
|
// Get chat reconnect context
|
|
18
|
-
const reconnectChatContext = await getChatReconnectContext(chatSDK, props.chatConfig, props, isAuthenticatedChat);
|
|
20
|
+
const reconnectChatContext = await getChatReconnectContext(chatSDK, props.chatConfig, props, isAuthenticatedChat, dispatch);
|
|
19
21
|
|
|
20
22
|
// Redirect if enabled
|
|
21
23
|
if (reconnectChatContext !== null && reconnectChatContext !== void 0 && reconnectChatContext.redirectURL) {
|
|
@@ -50,7 +52,7 @@ const handleChatReconnect = async (chatSDK, props, dispatch, setAdapter, initSta
|
|
|
50
52
|
};
|
|
51
53
|
|
|
52
54
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
53
|
-
const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticatedChat) => {
|
|
55
|
+
const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticatedChat, dispatch) => {
|
|
54
56
|
try {
|
|
55
57
|
var _props$reconnectChatP4;
|
|
56
58
|
TelemetryHelper.logSDKEvent(LogLevel.INFO, {
|
|
@@ -62,6 +64,7 @@ const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticat
|
|
|
62
64
|
};
|
|
63
65
|
// Get auth token for getting chat reconnect context
|
|
64
66
|
if (isAuthenticatedChat) {
|
|
67
|
+
// handle authentication will throw error if auth token is not available, so no need to check for response
|
|
65
68
|
await handleAuthentication(chatSDK, chatConfig, props.getAuthToken);
|
|
66
69
|
}
|
|
67
70
|
const reconnectChatContext = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getChatReconnectContext(chatReconnectOptionalParams));
|
|
@@ -71,7 +74,9 @@ const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticat
|
|
|
71
74
|
removeAuthTokenProvider(chatSDK);
|
|
72
75
|
}
|
|
73
76
|
return reconnectChatContext;
|
|
74
|
-
}
|
|
77
|
+
}
|
|
78
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
79
|
+
catch (error) {
|
|
75
80
|
checkContactIdError(error);
|
|
76
81
|
TelemetryHelper.logSDKEvent(LogLevel.ERROR, {
|
|
77
82
|
Event: TelemetryEvent.GetChatReconnectContextSDKCallFailed,
|
|
@@ -79,6 +84,12 @@ const getChatReconnectContext = async (chatSDK, chatConfig, props, isAuthenticat
|
|
|
79
84
|
exception: error
|
|
80
85
|
}
|
|
81
86
|
});
|
|
87
|
+
|
|
88
|
+
// when auth token is not available, propagate the error to stop the execution and ensure error pane is loaded
|
|
89
|
+
if ((error === null || error === void 0 ? void 0 : error.message) == WidgetLoadCustomErrorString.AuthenticationFailedErrorString) {
|
|
90
|
+
handleStartChatError(dispatch, chatSDK, props, new Error(WidgetLoadCustomErrorString.AuthenticationFailedErrorString), false);
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
82
93
|
}
|
|
83
94
|
};
|
|
84
95
|
|
|
@@ -24,6 +24,11 @@ export const handleStartChatError = (dispatch, chatSDK, props, ex, isStartChatSu
|
|
|
24
24
|
type: LiveChatWidgetActionType.SET_START_CHAT_FAILURE_TYPE,
|
|
25
25
|
payload: StartChatFailureType.AuthSetupError
|
|
26
26
|
});
|
|
27
|
+
// set conversation to error to enforce error UI pane
|
|
28
|
+
dispatch({
|
|
29
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
30
|
+
payload: ConversationState.Error
|
|
31
|
+
});
|
|
27
32
|
logWidgetLoadCompleteWithError(ex);
|
|
28
33
|
}
|
|
29
34
|
if (ex.message === WidgetLoadCustomErrorString.NetworkErrorString) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isNullOrUndefined, parseLowerCaseString } from "../../../../common/utils";
|
|
1
2
|
export const isMaskingforCustomer = maskingInfo => {
|
|
2
3
|
var _maskingInfo$setting;
|
|
3
4
|
// If the masking info (containing masking setting and masking rules) is missing or empty, return false.
|
|
@@ -8,8 +9,9 @@ export const isMaskingforCustomer = maskingInfo => {
|
|
|
8
9
|
|
|
9
10
|
// If the masking rules are provided and;
|
|
10
11
|
// If the masking setting is NOT null and masking for customer is NOT null, return the configuration
|
|
11
|
-
if ((_maskingInfo$setting = maskingInfo.setting)
|
|
12
|
-
|
|
12
|
+
if (!isNullOrUndefined((_maskingInfo$setting = maskingInfo.setting) === null || _maskingInfo$setting === void 0 ? void 0 : _maskingInfo$setting.msdyn_maskforcustomer)) {
|
|
13
|
+
var _maskingInfo$setting2;
|
|
14
|
+
return parseLowerCaseString(maskingInfo === null || maskingInfo === void 0 ? void 0 : (_maskingInfo$setting2 = maskingInfo.setting) === null || _maskingInfo$setting2 === void 0 ? void 0 : _maskingInfo$setting2.msdyn_maskforcustomer) === "true";
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
// In all other cases, even if masking setting is missing, return true to apply the masking for backward compatibility (i.e. in old versions, OC does not have masking info settings)
|
|
@@ -42,3 +42,4 @@ export declare const createFileAndDownload: (fileName: string, blobData: string,
|
|
|
42
42
|
* @returns formatted string with replaced values
|
|
43
43
|
*/
|
|
44
44
|
export declare const formatTemplateString: (templateMessage: string, values: any) => string;
|
|
45
|
+
export declare const parseLowerCaseString: (property: string | boolean | undefined) => string;
|
|
@@ -5,7 +5,7 @@ import { ILiveChatWidgetAction } from "../../../contexts/common/ILiveChatWidgetA
|
|
|
5
5
|
import { ILiveChatWidgetContext } from "../../../contexts/common/ILiveChatWidgetContext";
|
|
6
6
|
import { ILiveChatWidgetProps } from "../interfaces/ILiveChatWidgetProps";
|
|
7
7
|
declare const handleChatReconnect: (chatSDK: any, props: ILiveChatWidgetProps, dispatch: Dispatch<ILiveChatWidgetAction>, setAdapter: any, initStartChat: any, state: ILiveChatWidgetContext) => Promise<boolean>;
|
|
8
|
-
declare const getChatReconnectContext: (chatSDK: any, chatConfig: ChatConfig, props: any, isAuthenticatedChat: boolean) => Promise<any>;
|
|
8
|
+
declare const getChatReconnectContext: (chatSDK: any, chatConfig: ChatConfig, props: any, isAuthenticatedChat: boolean, dispatch: Dispatch<ILiveChatWidgetAction>) => Promise<any>;
|
|
9
9
|
declare const isReconnectEnabled: (chatConfig?: ChatConfig | undefined) => boolean;
|
|
10
10
|
declare const isPersistentEnabled: (chatConfig?: ChatConfig | undefined) => boolean;
|
|
11
11
|
export { handleChatReconnect, isReconnectEnabled, isPersistentEnabled, getChatReconnectContext };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@microsoft/omnichannel-chat-widget",
|
|
3
|
-
"version": "1.6.3-main.
|
|
3
|
+
"version": "1.6.3-main.cd40716",
|
|
4
4
|
"description": "Microsoft Omnichannel Chat Widget",
|
|
5
5
|
"main": "lib/cjs/index.js",
|
|
6
6
|
"types": "lib/types/index.d.ts",
|
|
@@ -74,8 +74,8 @@
|
|
|
74
74
|
"webpack-cli": "^4.9.2"
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@microsoft/omnichannel-chat-components": "^1.1.
|
|
78
|
-
"@microsoft/omnichannel-chat-sdk": "1.6.
|
|
77
|
+
"@microsoft/omnichannel-chat-components": "^1.1.2",
|
|
78
|
+
"@microsoft/omnichannel-chat-sdk": "1.6.3",
|
|
79
79
|
"abort-controller-es5": "^2.0.1",
|
|
80
80
|
"dompurify": "^2.3.4",
|
|
81
81
|
"markdown-it": "^12.3.2",
|