@microsoft/omnichannel-chat-widget 0.1.0-main.21ab3ba → 0.1.0-main.23dc34f
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/README.md +7 -34
- package/lib/cjs/common/Constants.js +2 -0
- package/lib/cjs/common/storage/default/defaultCacheManager.js +2 -2
- package/lib/cjs/common/storage/default/defaultClientDataStoreProvider.js +15 -6
- package/lib/cjs/common/telemetry/TelemetryConstants.js +5 -0
- package/lib/cjs/common/telemetry/TelemetryHelper.js +2 -1
- package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +1 -1
- package/lib/cjs/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +1 -1
- package/lib/cjs/components/headerstateful/HeaderStateful.js +4 -2
- package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +14 -10
- package/lib/cjs/components/livechatwidget/common/endChat.js +23 -17
- package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +25 -13
- package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +5 -5
- package/lib/cjs/components/livechatwidget/common/startChat.js +70 -59
- package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +43 -37
- package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +8 -1
- package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +1 -1
- package/lib/cjs/components/prechatsurveypanestateful/common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps.js +1 -1
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +1 -3
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +2 -1
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageBoxStyles.js +1 -1
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultUserMessageBoxStyles.js +1 -1
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +2 -14
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +2 -11
- package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +4 -2
- package/lib/cjs/hooks/useDebounce.js +28 -0
- package/lib/cjs/hooks/useWindowDimensions.js +30 -0
- package/lib/cjs/plugins/newMessageEventHandler.js +14 -0
- package/lib/esm/common/Constants.js +2 -0
- package/lib/esm/common/storage/default/defaultCacheManager.js +2 -2
- package/lib/esm/common/storage/default/defaultClientDataStoreProvider.js +15 -6
- package/lib/esm/common/telemetry/TelemetryConstants.js +5 -0
- package/lib/esm/common/telemetry/TelemetryHelper.js +2 -1
- package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +1 -1
- package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +1 -1
- package/lib/esm/components/headerstateful/HeaderStateful.js +4 -2
- package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +14 -10
- package/lib/esm/components/livechatwidget/common/endChat.js +23 -17
- package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +25 -13
- package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +6 -5
- package/lib/esm/components/livechatwidget/common/startChat.js +70 -59
- package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +44 -38
- package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +8 -1
- package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +1 -1
- package/lib/esm/components/prechatsurveypanestateful/common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps.js +1 -1
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +1 -3
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +2 -1
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageBoxStyles.js +1 -1
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultUserMessageBoxStyles.js +1 -1
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +2 -14
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +2 -11
- package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +4 -2
- package/lib/esm/hooks/useDebounce.js +22 -0
- package/lib/esm/hooks/useWindowDimensions.js +23 -0
- package/lib/esm/plugins/newMessageEventHandler.js +14 -0
- package/lib/types/common/Constants.d.ts +2 -0
- package/lib/types/common/storage/default/defaultCacheManager.d.ts +1 -1
- package/lib/types/common/storage/default/defaultClientDataStoreProvider.d.ts +1 -1
- package/lib/types/common/telemetry/TelemetryConstants.d.ts +6 -1
- package/lib/types/common/telemetry/definitions/Contracts.d.ts +2 -0
- package/lib/types/common/telemetry/definitions/Payload.d.ts +1 -0
- package/lib/types/common/telemetry/interfaces/ITelemetryConfig.d.ts +4 -0
- package/lib/types/components/livechatwidget/common/startChat.d.ts +3 -3
- package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetControlProps.d.ts +2 -0
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.d.ts +1 -1
- package/lib/types/hooks/useDebounce.d.ts +3 -0
- package/lib/types/hooks/useWindowDimensions.d.ts +4 -0
- package/package.json +3 -3
|
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.NotDeliveredTimestamp = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
-
var _Constants = require("../../../../../../common/Constants");
|
|
9
8
|
var _KeyCodes = require("../../../../../../common/KeyCodes");
|
|
10
9
|
var _react2 = require("@fluentui/react");
|
|
11
10
|
var _defaultMiddlewareLocalizedTexts = require("../../../../common/defaultProps/defaultMiddlewareLocalizedTexts");
|
|
@@ -57,9 +56,8 @@ const NotDeliveredTimestamp = _ref => {
|
|
|
57
56
|
timestampWebChatNodes[1].innerText = (0, _utils.getTimestampHourMinute)(timestamp);
|
|
58
57
|
}
|
|
59
58
|
}, [timestampRef]);
|
|
60
|
-
const onRetryClick = (0, _react.useCallback)(async
|
|
59
|
+
const onRetryClick = (0, _react.useCallback)(async () => {
|
|
61
60
|
var _activity$channelData;
|
|
62
|
-
removeNotDeliveredTimestamp(event);
|
|
63
61
|
activity.previousClientActivityID = (_activity$channelData = activity.channelData) === null || _activity$channelData === void 0 ? void 0 : _activity$channelData.clientActivityID;
|
|
64
62
|
await postActivity(activity);
|
|
65
63
|
focus("sendBox");
|
|
@@ -67,19 +65,9 @@ const NotDeliveredTimestamp = _ref => {
|
|
|
67
65
|
const onRetryKeyEnter = event => {
|
|
68
66
|
if (event.code === _KeyCodes.KeyCodes.ENTER) {
|
|
69
67
|
event.preventDefault();
|
|
70
|
-
onRetryClick(
|
|
68
|
+
onRetryClick();
|
|
71
69
|
}
|
|
72
70
|
};
|
|
73
|
-
const removeNotDeliveredTimestamp = event => {
|
|
74
|
-
let parent = event.target.parentElement;
|
|
75
|
-
while (parent.tagName !== _Constants.HtmlAttributeNames.listItem) {
|
|
76
|
-
parent = parent.parentElement;
|
|
77
|
-
if (parent.tagName === _Constants.HtmlAttributeNames.unorderedList) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
parent.parentNode.removeChild(parent);
|
|
82
|
-
};
|
|
83
71
|
return /*#__PURE__*/_react.default.createElement(_react2.Stack, {
|
|
84
72
|
style: contentStyles,
|
|
85
73
|
dir: dir,
|
|
@@ -8,30 +8,21 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
8
8
|
var _react2 = require("@fluentui/react");
|
|
9
9
|
var _defaultMiddlewareLocalizedTexts = require("../../../../common/defaultProps/defaultMiddlewareLocalizedTexts");
|
|
10
10
|
var _defaultTimestampContentStyles = require("../defaultStyles/defaultTimestampContentStyles");
|
|
11
|
-
var _utils = require("../../../../../../common/utils");
|
|
12
11
|
var _ = require("../../../../../..");
|
|
13
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
13
|
/* eslint @typescript-eslint/no-explicit-any: "off" */
|
|
15
|
-
const SendingTimestamp =
|
|
14
|
+
const SendingTimestamp = () => {
|
|
16
15
|
var _state$domainStates$r, _state$domainStates$r2, _state$domainStates$m;
|
|
17
|
-
let {
|
|
18
|
-
args
|
|
19
|
-
} = _ref;
|
|
20
16
|
const [state] = (0, _.useChatContextStore)();
|
|
21
17
|
const dir = ((_state$domainStates$r = state.domainStates.renderingMiddlewareProps) === null || _state$domainStates$r === void 0 ? void 0 : _state$domainStates$r.timestampDir) ?? state.domainStates.globalDir;
|
|
22
18
|
const contentStyles = {
|
|
23
19
|
..._defaultTimestampContentStyles.defaultTimestampContentStyles,
|
|
24
20
|
...((_state$domainStates$r2 = state.domainStates.renderingMiddlewareProps) === null || _state$domainStates$r2 === void 0 ? void 0 : _state$domainStates$r2.timestampContentStyleProps)
|
|
25
21
|
};
|
|
26
|
-
const {
|
|
27
|
-
activity: {
|
|
28
|
-
timestamp
|
|
29
|
-
}
|
|
30
|
-
} = args;
|
|
31
22
|
return /*#__PURE__*/_react.default.createElement(_react2.Stack, {
|
|
32
23
|
style: contentStyles,
|
|
33
24
|
dir: dir,
|
|
34
25
|
horizontal: true
|
|
35
|
-
}, /*#__PURE__*/_react.default.createElement("span", null, " ", (
|
|
26
|
+
}, /*#__PURE__*/_react.default.createElement("span", null, " ", ((_state$domainStates$m = state.domainStates.middlewareLocalizedTexts) === null || _state$domainStates$m === void 0 ? void 0 : _state$domainStates$m.MIDDLEWARE_MESSAGE_SENDING) ?? _defaultMiddlewareLocalizedTexts.defaultMiddlewareLocalizedTexts.MIDDLEWARE_MESSAGE_SENDING, " "));
|
|
36
27
|
};
|
|
37
28
|
exports.SendingTimestamp = SendingTimestamp;
|
|
@@ -8,10 +8,12 @@ var _ConversationState = require("./ConversationState");
|
|
|
8
8
|
var _defaultMiddlewareLocalizedTexts = require("../../components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
|
|
9
9
|
var _utils = require("../../common/utils");
|
|
10
10
|
var _defaultClientDataStoreProvider = require("../../common/storage/default/defaultClientDataStoreProvider");
|
|
11
|
+
var _Constants = require("../../common/Constants");
|
|
11
12
|
const getLiveChatWidgetContextInitialState = props => {
|
|
12
|
-
var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic, _props$controlProps, _props$webChatContain;
|
|
13
|
+
var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic, _props$controlProps, _props$controlProps2, _props$webChatContain;
|
|
13
14
|
const widgetCacheId = (0, _utils.getWidgetCacheId)(props === null || props === void 0 ? void 0 : (_props$chatSDK = props.chatSDK) === null || _props$chatSDK === void 0 ? void 0 : (_props$chatSDK$omnich = _props$chatSDK.omnichannelConfig) === null || _props$chatSDK$omnich === void 0 ? void 0 : _props$chatSDK$omnich.orgId, props === null || props === void 0 ? void 0 : (_props$chatSDK2 = props.chatSDK) === null || _props$chatSDK2 === void 0 ? void 0 : (_props$chatSDK2$omnic = _props$chatSDK2.omnichannelConfig) === null || _props$chatSDK2$omnic === void 0 ? void 0 : _props$chatSDK2$omnic.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.widgetInstanceId) ?? "");
|
|
14
|
-
const
|
|
15
|
+
const cacheTtlInMins = (props === null || props === void 0 ? void 0 : (_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.cacheTtlInMins) ?? _Constants.Constants.CacheTtlInMinutes;
|
|
16
|
+
const initialState = (0, _defaultClientDataStoreProvider.defaultClientDataStoreProvider)(cacheTtlInMins).getData(widgetCacheId, "localStorage");
|
|
15
17
|
if (!(0, _utils.isNullOrUndefined)(initialState)) {
|
|
16
18
|
return JSON.parse(initialState);
|
|
17
19
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = useDebounce;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
function useDebounce(func) {
|
|
9
|
+
let delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
|
|
10
|
+
const timer = (0, _react.useRef)();
|
|
11
|
+
(0, _react.useEffect)(() => {
|
|
12
|
+
return () => {
|
|
13
|
+
if (!timer.current) return;
|
|
14
|
+
clearTimeout(timer.current);
|
|
15
|
+
};
|
|
16
|
+
}, []);
|
|
17
|
+
const debouncedFunction = function () {
|
|
18
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
19
|
+
args[_key] = arguments[_key];
|
|
20
|
+
}
|
|
21
|
+
const newTimer = setTimeout(() => {
|
|
22
|
+
func(...args);
|
|
23
|
+
}, delay);
|
|
24
|
+
clearTimeout(timer.current);
|
|
25
|
+
timer.current = newTimer;
|
|
26
|
+
};
|
|
27
|
+
return debouncedFunction;
|
|
28
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = useWindowDimensions;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _useDebounce = _interopRequireDefault(require("./useDebounce"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
function getWindowDimensions() {
|
|
11
|
+
const {
|
|
12
|
+
innerWidth: width,
|
|
13
|
+
innerHeight: height
|
|
14
|
+
} = window;
|
|
15
|
+
return {
|
|
16
|
+
width,
|
|
17
|
+
height
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function useWindowDimensions() {
|
|
21
|
+
let delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 200;
|
|
22
|
+
const [windowDimensions, setWindowDimensions] = (0, _react.useState)(getWindowDimensions());
|
|
23
|
+
const handleResize = () => setWindowDimensions(getWindowDimensions());
|
|
24
|
+
const debouncedHandleResize = (0, _useDebounce.default)(handleResize, delay);
|
|
25
|
+
(0, _react.useEffect)(() => {
|
|
26
|
+
window.addEventListener("resize", debouncedHandleResize);
|
|
27
|
+
return () => window.removeEventListener("resize", debouncedHandleResize);
|
|
28
|
+
}, []);
|
|
29
|
+
return windowDimensions;
|
|
30
|
+
}
|
|
@@ -15,6 +15,7 @@ const createOnNewAdapterActivityHandler = (chatId, userId) => {
|
|
|
15
15
|
const isHistoryMessage = isActivityMessage && ((activity === null || activity === void 0 ? void 0 : (_activity$channelData = activity.channelData) === null || _activity$channelData === void 0 ? void 0 : (_activity$channelData2 = _activity$channelData.tags) === null || _activity$channelData2 === void 0 ? void 0 : _activity$channelData2.includes(_Constants.Constants.historyMessageTag)) || (activity === null || activity === void 0 ? void 0 : (_activity$channelData3 = activity.channelData) === null || _activity$channelData3 === void 0 ? void 0 : _activity$channelData3.fromList));
|
|
16
16
|
raiseMessageEvent(activity, isHistoryMessage);
|
|
17
17
|
};
|
|
18
|
+
let isHistoryMessageReceivedEventRasied = false;
|
|
18
19
|
const raiseMessageEvent = (activity, isHistoryMessage) => {
|
|
19
20
|
if ((activity === null || activity === void 0 ? void 0 : activity.type) === _Constants.Constants.message) {
|
|
20
21
|
var _text, _text2, _activity$channelData4, _activity$from;
|
|
@@ -45,6 +46,10 @@ const createOnNewAdapterActivityHandler = (chatId, userId) => {
|
|
|
45
46
|
if (activity !== null && activity !== void 0 && (_activity$channelData5 = activity.channelData) !== null && _activity$channelData5 !== void 0 && (_activity$channelData6 = _activity$channelData5.tags) !== null && _activity$channelData6 !== void 0 && _activity$channelData6.includes(_Constants.Constants.systemMessageTag)) {
|
|
46
47
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
48
|
payload.messageType = _Constants.Constants.systemMessageTag;
|
|
49
|
+
_TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
|
|
50
|
+
Event: _TelemetryConstants.TelemetryEvent.SystemMessageReceived,
|
|
51
|
+
Description: "System message received"
|
|
52
|
+
});
|
|
48
53
|
} else {
|
|
49
54
|
var _activity$channelData7, _activity$channelData8, _activity$channelData9;
|
|
50
55
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -69,6 +74,15 @@ const createOnNewAdapterActivityHandler = (chatId, userId) => {
|
|
|
69
74
|
Description: "New message received",
|
|
70
75
|
Data: payload
|
|
71
76
|
});
|
|
77
|
+
} else {
|
|
78
|
+
if (!isHistoryMessageReceivedEventRasied) {
|
|
79
|
+
isHistoryMessageReceivedEventRasied = true;
|
|
80
|
+
_TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
|
|
81
|
+
Event: _TelemetryConstants.TelemetryEvent.HistoryMessageReceived,
|
|
82
|
+
Description: "History message received",
|
|
83
|
+
Data: payload
|
|
84
|
+
});
|
|
85
|
+
}
|
|
72
86
|
}
|
|
73
87
|
}
|
|
74
88
|
}
|
|
@@ -82,6 +82,7 @@ _defineProperty(Constants, "internetConnectionTestUrlText", "Omnichannel Connect
|
|
|
82
82
|
_defineProperty(Constants, "ChatWidgetStateChangedPrefix", "ChatWidgetStateChanged");
|
|
83
83
|
_defineProperty(Constants, "PostChatLoadingDurationInMs", 2000);
|
|
84
84
|
_defineProperty(Constants, "BrowserUnloadConfirmationMessage", "Do you want to leave chat?");
|
|
85
|
+
_defineProperty(Constants, "CacheTtlInMinutes", 15);
|
|
85
86
|
export const Regex = (_class = class Regex {}, _defineProperty(_class, "EmailRegex", "(?:[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"), _class);
|
|
86
87
|
export class HtmlIdNames {}
|
|
87
88
|
_defineProperty(HtmlIdNames, "MSLiveChatWidget", "MSLiveChatWidget");
|
|
@@ -122,6 +123,7 @@ _defineProperty(HtmlAttributeNames, "noreferrerTag", "noreferrer");
|
|
|
122
123
|
_defineProperty(HtmlAttributeNames, "adaptiveCardClassName", "ac-adaptiveCard");
|
|
123
124
|
_defineProperty(HtmlAttributeNames, "adaptiveCardTextBlockClassName", "ac-textBlock");
|
|
124
125
|
_defineProperty(HtmlAttributeNames, "adaptiveCardToggleInputClassName", "ac-toggleInput");
|
|
126
|
+
_defineProperty(HtmlAttributeNames, "adaptiveCardActionSetClassName", "ac-actionSet");
|
|
125
127
|
export class WebChatMiddlewareConstants {}
|
|
126
128
|
_defineProperty(WebChatMiddlewareConstants, "nextVisibleActivity", "nextVisibleActivity");
|
|
127
129
|
_defineProperty(WebChatMiddlewareConstants, "timeBetweenTimestampGroups", 300000);
|
|
@@ -6,11 +6,11 @@ import { getWidgetCacheId } from "../../utils";
|
|
|
6
6
|
import { defaultClientDataStoreProvider } from "./defaultClientDataStoreProvider";
|
|
7
7
|
export class defaultCacheManager {}
|
|
8
8
|
_defineProperty(defaultCacheManager, "InternalCache", {});
|
|
9
|
-
export const registerBroadcastServiceForLocalStorage = (orgid, widgetId, widgetInstanceId) => {
|
|
9
|
+
export const registerBroadcastServiceForLocalStorage = (orgid, widgetId, widgetInstanceId, ttlInMins) => {
|
|
10
10
|
const widgetCacheId = getWidgetCacheId(orgid, widgetId, widgetInstanceId);
|
|
11
11
|
BroadcastService.getMessageByEventName(widgetCacheId).subscribe(msg => {
|
|
12
12
|
try {
|
|
13
|
-
defaultClientDataStoreProvider().setData(widgetCacheId, JSON.stringify(msg.payload), "localStorage");
|
|
13
|
+
defaultClientDataStoreProvider(ttlInMins).setData(widgetCacheId, JSON.stringify(msg.payload), "localStorage");
|
|
14
14
|
} catch (error) {
|
|
15
15
|
console.error("Error in setting data to localstorage", error);
|
|
16
16
|
}
|
|
@@ -1,18 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
|
|
3
3
|
import { LogLevel, TelemetryEvent } from "../../telemetry/TelemetryConstants";
|
|
4
|
-
|
|
4
|
+
import { TelemetryHelper } from "../../telemetry/TelemetryHelper";
|
|
5
|
+
import { inMemoryDataStore } from "./defaultInMemoryDataStore";
|
|
6
|
+
export const defaultClientDataStoreProvider = function () {
|
|
7
|
+
let cacheTtlinMins = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
|
8
|
+
let ttlInMs = 0;
|
|
5
9
|
const isCookieAllowed = () => {
|
|
6
10
|
try {
|
|
7
11
|
localStorage;
|
|
8
12
|
sessionStorage;
|
|
9
13
|
return true;
|
|
10
14
|
} catch (error) {
|
|
11
|
-
|
|
15
|
+
if (!window.TPCWarningShown) {
|
|
16
|
+
console.warn("Third party cookies blocked.");
|
|
17
|
+
window.TPCWarningShown = true;
|
|
18
|
+
}
|
|
12
19
|
return false;
|
|
13
20
|
}
|
|
14
21
|
};
|
|
15
|
-
|
|
22
|
+
if (ttlInMs == 0) {
|
|
23
|
+
ttlInMs = cacheTtlinMins * 60 * 1000;
|
|
24
|
+
}
|
|
16
25
|
const dataStoreProvider = {
|
|
17
26
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
27
|
setData: (key, data, type) => {
|
|
@@ -22,7 +31,7 @@ export const defaultClientDataStoreProvider = () => {
|
|
|
22
31
|
const now = new Date();
|
|
23
32
|
const item = {
|
|
24
33
|
data: data,
|
|
25
|
-
expiry: now.getTime() +
|
|
34
|
+
expiry: now.getTime() + ttlInMs
|
|
26
35
|
};
|
|
27
36
|
const strItem = JSON.stringify(item);
|
|
28
37
|
if (type === "localStorage") {
|
|
@@ -49,6 +49,8 @@ export let BroadcastEvent;
|
|
|
49
49
|
BroadcastEvent["InitiateEndChatOnBrowserUnload"] = "InitiateEndChatOnBrowserUnload";
|
|
50
50
|
BroadcastEvent["ClosePopoutWindow"] = "ClosePopoutWindow";
|
|
51
51
|
BroadcastEvent["RaiseErrorEvent"] = "RaiseErrorEvent";
|
|
52
|
+
BroadcastEvent["NetworkDisconnected"] = "NetworkDisconnected";
|
|
53
|
+
BroadcastEvent["NetworkReconnected"] = "NetworkReconnected";
|
|
52
54
|
})(BroadcastEvent || (BroadcastEvent = {}));
|
|
53
55
|
export let TelemetryEvent;
|
|
54
56
|
(function (TelemetryEvent) {
|
|
@@ -109,6 +111,7 @@ export let TelemetryEvent;
|
|
|
109
111
|
TelemetryEvent["DownloadTranscriptResponseNullOrUndefined"] = "DownloadTranscriptResponseNullOrUndefined";
|
|
110
112
|
TelemetryEvent["EmailTranscriptSent"] = "EmailTranscriptSent";
|
|
111
113
|
TelemetryEvent["EmailTranscriptFailed"] = "EmailTranscriptFailed";
|
|
114
|
+
TelemetryEvent["ErrorUIPaneLoaded"] = "ErrorUIPaneLoaded";
|
|
112
115
|
TelemetryEvent["DownloadTranscriptFailed"] = "DownloadTranscriptFailed";
|
|
113
116
|
TelemetryEvent["StartChatFailed"] = "StartChatFailed";
|
|
114
117
|
TelemetryEvent["IC3ThreadUpdateEventReceived"] = "IC3ThreadUpdateEventReceived";
|
|
@@ -164,6 +167,8 @@ export let TelemetryEvent;
|
|
|
164
167
|
TelemetryEvent["ReconnectChatMinimize"] = "ReconnectChatMinimize";
|
|
165
168
|
TelemetryEvent["MessageSent"] = "MessageSent";
|
|
166
169
|
TelemetryEvent["MessageReceived"] = "MessageReceived";
|
|
170
|
+
TelemetryEvent["SystemMessageReceived"] = "SystemMessageReceived";
|
|
171
|
+
TelemetryEvent["HistoryMessageReceived"] = "HistoryMessageReceived";
|
|
167
172
|
TelemetryEvent["CustomContextReceived"] = "CustomContextReceived";
|
|
168
173
|
TelemetryEvent["NetworkDisconnected"] = "NetworkDisconnected";
|
|
169
174
|
TelemetryEvent["NetworkReconnected"] = "NetworkReconnected";
|
|
@@ -56,6 +56,7 @@ export class TelemetryHelper {
|
|
|
56
56
|
event.ElapsedTimeInMilliseconds = payload.ElapsedTimeInMilliseconds;
|
|
57
57
|
event.ExceptionDetails = JSON.stringify(payload.ExceptionDetails);
|
|
58
58
|
event.Description = payload.Description;
|
|
59
|
+
event.CustomProperties = JSON.stringify(payload.CustomProperties);
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
62
|
static conformToWebChatContract(level, input) {
|
|
@@ -161,7 +162,7 @@ export class TelemetryHelper {
|
|
|
161
162
|
telemetryDataLocal.widgetId = telemetryConfig === null || telemetryConfig === void 0 ? void 0 : telemetryConfig.appId;
|
|
162
163
|
telemetryDataLocal.orgId = telemetryConfig === null || telemetryConfig === void 0 ? void 0 : telemetryConfig.orgId;
|
|
163
164
|
telemetryDataLocal.orgUrl = telemetryConfig === null || telemetryConfig === void 0 ? void 0 : telemetryConfig.orgUrl;
|
|
164
|
-
telemetryDataLocal.lcwRuntimeId = newGuid();
|
|
165
|
+
telemetryDataLocal.lcwRuntimeId = telemetryConfig.LCWRuntimeId ?? newGuid();
|
|
165
166
|
return telemetryDataLocal;
|
|
166
167
|
}
|
|
167
168
|
static addSessionDataToTelemetry(chatSession, telemetryInternalData) {
|
|
@@ -82,7 +82,7 @@ export const ConfirmationPaneStateful = props => {
|
|
|
82
82
|
Event: TelemetryEvent.ConfirmationPaneLoaded
|
|
83
83
|
});
|
|
84
84
|
}, []);
|
|
85
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null,
|
|
85
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DimLayer, {
|
|
86
86
|
brightness: (controlProps === null || controlProps === void 0 ? void 0 : controlProps.brightnessValueOnDim) ?? "0.2"
|
|
87
87
|
}), /*#__PURE__*/React.createElement(ConfirmationPane, {
|
|
88
88
|
componentOverrides: props === null || props === void 0 ? void 0 : props.componentOverrides,
|
|
@@ -88,7 +88,7 @@ export const EmailTranscriptPaneStateful = props => {
|
|
|
88
88
|
Event: TelemetryEvent.EmailTranscriptLoaded
|
|
89
89
|
});
|
|
90
90
|
}, [initialEmail]);
|
|
91
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null,
|
|
91
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DimLayer, {
|
|
92
92
|
brightness: (controlProps === null || controlProps === void 0 ? void 0 : controlProps.brightnessValueOnDim) ?? "0.2"
|
|
93
93
|
}), /*#__PURE__*/React.createElement(InputValidationPane, {
|
|
94
94
|
componentOverrides: props.componentOverrides,
|
|
@@ -21,6 +21,7 @@ export const HeaderStateful = props => {
|
|
|
21
21
|
const [outOfOperatingHours, setOutOfOperatingHours] = 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");
|
|
22
22
|
const outOfOfficeStyleProps = Object.assign({}, defaultOutOfOfficeHeaderStyleProps, outOfOfficeHeaderProps === null || outOfOfficeHeaderProps === void 0 ? void 0 : outOfOfficeHeaderProps.styleProps);
|
|
23
23
|
const conversationState = useRef(state.appStates.conversationState);
|
|
24
|
+
const conversationEndedByAgent = useRef(state.appStates.conversationEndedByAgent);
|
|
24
25
|
const controlProps = {
|
|
25
26
|
id: "oc-lcw-header",
|
|
26
27
|
dir: state.domainStates.globalDir,
|
|
@@ -40,7 +41,7 @@ export const HeaderStateful = props => {
|
|
|
40
41
|
Event: TelemetryEvent.HeaderCloseButtonClicked,
|
|
41
42
|
Description: "Header Close button clicked."
|
|
42
43
|
});
|
|
43
|
-
if (conversationState.current === ConversationState.Active) {
|
|
44
|
+
if (conversationState.current === ConversationState.Active || conversationEndedByAgent.current) {
|
|
44
45
|
dispatch({
|
|
45
46
|
type: LiveChatWidgetActionType.SET_SHOW_CONFIRMATION,
|
|
46
47
|
payload: true
|
|
@@ -62,7 +63,7 @@ export const HeaderStateful = props => {
|
|
|
62
63
|
...(headerProps === null || headerProps === void 0 ? void 0 : headerProps.controlProps),
|
|
63
64
|
hideTitle: state.appStates.conversationState === ConversationState.Loading && !state.appStates.isStartChatFailing || state.appStates.conversationState === ConversationState.PostchatLoading || (headerProps === null || headerProps === void 0 ? void 0 : (_headerProps$controlP = headerProps.controlProps) === null || _headerProps$controlP === void 0 ? void 0 : _headerProps$controlP.hideTitle),
|
|
64
65
|
hideIcon: state.appStates.conversationState === ConversationState.Loading && !state.appStates.isStartChatFailing || state.appStates.conversationState === ConversationState.PostchatLoading || (headerProps === null || headerProps === void 0 ? void 0 : (_headerProps$controlP2 = headerProps.controlProps) === null || _headerProps$controlP2 === void 0 ? void 0 : _headerProps$controlP2.hideIcon),
|
|
65
|
-
hideCloseButton: state.appStates.conversationState === ConversationState.Loading && !state.appStates.isStartChatFailing || state.appStates.conversationState === ConversationState.Prechat || state.appStates.conversationState === ConversationState.ReconnectChat || (headerProps === null || headerProps === void 0 ? void 0 : (_headerProps$controlP3 = headerProps.controlProps) === null || _headerProps$controlP3 === void 0 ? void 0 : _headerProps$controlP3.hideCloseButton)
|
|
66
|
+
hideCloseButton: state.appStates.conversationState === ConversationState.Loading && !state.appStates.isStartChatFailing || state.appStates.conversationState === ConversationState.PostchatLoading || state.appStates.conversationState === ConversationState.Prechat || state.appStates.conversationState === ConversationState.ReconnectChat || (headerProps === null || headerProps === void 0 ? void 0 : (_headerProps$controlP3 = headerProps.controlProps) === null || _headerProps$controlP3 === void 0 ? void 0 : _headerProps$controlP3.hideCloseButton)
|
|
66
67
|
};
|
|
67
68
|
const outOfOfficeControlProps = {
|
|
68
69
|
id: "oc-lcw-header",
|
|
@@ -86,6 +87,7 @@ export const HeaderStateful = props => {
|
|
|
86
87
|
if (state.appStates.conversationState) {
|
|
87
88
|
conversationState.current = state.appStates.conversationState;
|
|
88
89
|
}
|
|
90
|
+
conversationEndedByAgent.current = state.appStates.conversationEndedByAgent;
|
|
89
91
|
}, [state.appStates]);
|
|
90
92
|
return /*#__PURE__*/React.createElement(Header, {
|
|
91
93
|
componentOverrides: headerProps === null || headerProps === void 0 ? void 0 : headerProps.componentOverrides,
|
|
@@ -9,9 +9,9 @@ import { createActivityMiddleware } from "../../../webchatcontainerstateful/webc
|
|
|
9
9
|
import createAttachmentMiddleware from "../../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware";
|
|
10
10
|
import { createAvatarMiddleware } from "../../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware";
|
|
11
11
|
import { createMarkdown } from "../createMarkdown";
|
|
12
|
+
import { createWebChatTelemetry } from "../../../webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger";
|
|
12
13
|
import { groupActivitiesMiddleware } from "../../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/groupActivitiesMiddleware";
|
|
13
14
|
import { typingIndicatorMiddleware } from "../../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware";
|
|
14
|
-
import { createWebChatTelemetry } from "../../../webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger";
|
|
15
15
|
|
|
16
16
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
17
17
|
export const dummyDefaultProps = {
|
|
@@ -407,6 +407,7 @@ export const dummyDefaultProps = {
|
|
|
407
407
|
width: "90px",
|
|
408
408
|
cursor: "pointer",
|
|
409
409
|
overflow: "hidden",
|
|
410
|
+
padding: "0px",
|
|
410
411
|
whiteSpace: "nowrap"
|
|
411
412
|
},
|
|
412
413
|
subtitleStyleProps: {
|
|
@@ -414,12 +415,14 @@ export const dummyDefaultProps = {
|
|
|
414
415
|
fontWeight: "200",
|
|
415
416
|
color: "#666",
|
|
416
417
|
overflow: "hidden",
|
|
418
|
+
padding: "0px",
|
|
417
419
|
fontFamily: "'Segoe UI',Arial,sans-serif",
|
|
418
420
|
display: "block",
|
|
419
421
|
alignItems: "center",
|
|
420
422
|
margin: "0px 14px 0px 14px",
|
|
421
423
|
textOverflow: "ellipsis !important",
|
|
422
|
-
width: "
|
|
424
|
+
width: "90px",
|
|
425
|
+
whiteSpace: "nowrap",
|
|
423
426
|
cursor: "pointer"
|
|
424
427
|
},
|
|
425
428
|
classNames: {
|
|
@@ -469,7 +472,6 @@ export const dummyDefaultProps = {
|
|
|
469
472
|
cancelButtonText: "Cancel",
|
|
470
473
|
cancelButtonAriaLabel: "Cancel. Return to Chat",
|
|
471
474
|
brightnessValueOnDim: "0.2",
|
|
472
|
-
disableDimLayer: false,
|
|
473
475
|
onConfirm: () => {},
|
|
474
476
|
// Detailed implementation omitted
|
|
475
477
|
onCancel: () => {} // Detailed implementation omitted
|
|
@@ -577,6 +579,7 @@ export const dummyDefaultProps = {
|
|
|
577
579
|
hideCallingContainer: false,
|
|
578
580
|
hideChatButton: false,
|
|
579
581
|
hideConfirmationPane: false,
|
|
582
|
+
hideErrorUIPane: false,
|
|
580
583
|
hideFooter: false,
|
|
581
584
|
hideHeader: false,
|
|
582
585
|
hideLoadingPane: false,
|
|
@@ -627,7 +630,6 @@ export const dummyDefaultProps = {
|
|
|
627
630
|
cancelButtonText: "Cancel",
|
|
628
631
|
cancelButtonAriaLabel: "Cancel",
|
|
629
632
|
brightnessValueOnDim: "0.2",
|
|
630
|
-
disableDimLayer: false,
|
|
631
633
|
onSend: undefined,
|
|
632
634
|
onCancel: undefined,
|
|
633
635
|
checkInput: undefined
|
|
@@ -1025,7 +1027,8 @@ export const dummyDefaultProps = {
|
|
|
1025
1027
|
margin: "0px 0px 20px 0px",
|
|
1026
1028
|
display: "flex",
|
|
1027
1029
|
order: 1,
|
|
1028
|
-
alignSelf: "auto"
|
|
1030
|
+
alignSelf: "auto",
|
|
1031
|
+
overflow: "visible"
|
|
1029
1032
|
},
|
|
1030
1033
|
iconImageProps: {
|
|
1031
1034
|
src: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2lpKSI+DQo8cGF0aCBkPSJNMTUuMTk3MSAxNi4yNzI1VjI1Ljg1MjRDMTUuMTk3MSAyNy4zODExIDE1Ljg0MDEgMjcuNTIwMSAxNi45ODMyIDI3LjUyMDFMMjYuNzA4NCAyNy41NjQ5TDMxLjAwMzkgMzIuMzEyM1YyNy41NjQ5SDMxLjg5N0MzMi4xNzQzIDI3LjU2MzcgMzIuNDQ4NyAyNy41MDc3IDMyLjcwNDUgMjcuNDAwMUMzMi45NjAzIDI3LjI5MjQgMzMuMTkyNSAyNy4xMzUzIDMzLjM4NzggMjYuOTM3NUMzMy41ODMxIDI2LjczOTggMzMuNzM3NyAyNi41MDU0IDMzLjg0MjcgMjYuMjQ3N0MzMy45NDc4IDI1Ljk5IDM0LjAwMTMgMjUuNzE0IDM0LjAwMDEgMjUuNDM1NVYxNi4zMDM4QzM0LjAwMTMgMTYuMDI1NCAzMy45NDc4IDE1Ljc0OTQgMzMuODQyNyAxNS40OTE3QzMzLjczNzcgMTUuMjM0IDMzLjU4MzEgMTQuOTk5NiAzMy4zODc4IDE0LjgwMThDMzMuMTkyNSAxNC42MDQxIDMyLjk2MDMgMTQuNDQ2OSAzMi43MDQ1IDE0LjMzOTNDMzIuNDQ4NyAxNC4yMzE2IDMyLjE3NDMgMTQuMTc1NiAzMS44OTcgMTQuMTc0NEwxNy4zMDQ3IDE0LjE0MzFDMTcuMDI2OSAxNC4xNDM3IDE2Ljc1MiAxNC4xOTkyIDE2LjQ5NTcgMTQuMzA2NkMxNi4yMzk0IDE0LjQxNCAxNi4wMDY3IDE0LjU3MTEgMTUuODEwOSAxNC43Njg5QzE1LjYxNTIgMTQuOTY2NyAxNS40NjAyIDE1LjIwMTMgMTUuMzU0OCAxNS40NTkzQzE1LjI0OTUgMTUuNzE3MyAxNS4xOTU5IDE1Ljk5MzYgMTUuMTk3MSAxNi4yNzI1WiIgZmlsbD0iI0Q2RDZENiIvPg0KPC9nPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjFfZGlpKSI+DQo8cGF0aCBkPSJNMjcuODczNSA2LjY5ODg3VjE4Ljg0MDlDMjcuODczNSAyMC43Nzg1IDI3LjA1NzIgMjAuOTU0NiAyNS42MDU4IDIwLjk1NDZMMTMuMjU4IDIxLjAxMTRMNy44MDQxNCAyNy4wMjg1VjIxLjAxMTRINi42NzAyN0M2LjMxODEyIDIxLjAwOTkgNS45Njk3MSAyMC45Mzg5IDUuNjQ0OTMgMjAuODAyNUM1LjMyMDE2IDIwLjY2NjEgNS4wMjUzOCAyMC40NjY4IDQuNzc3NDIgMjAuMjE2MkM0LjUyOTQ2IDE5Ljk2NTYgNC4zMzMxOSAxOS42Njg1IDQuMTk5OCAxOS4zNDE5QzQuMDY2NDIgMTkuMDE1MiAzLjk5ODUzIDE4LjY2NTUgNC4wMDAwMiAxOC4zMTI1VjYuNzM4NjRDMy45OTg1MyA2LjM4NTcxIDQuMDY2NDIgNi4wMzU5NSA0LjE5OTggNS43MDkzMUM0LjMzMzE5IDUuMzgyNjcgNC41Mjk0NiA1LjA4NTU3IDQuNzc3NDIgNC44MzQ5NUM1LjAyNTM4IDQuNTg0MzQgNS4zMjAxNiA0LjM4NTEzIDUuNjQ0OTMgNC4yNDg2OUM1Ljk2OTcxIDQuMTEyMjUgNi4zMTgxMiA0LjA0MTI2IDYuNjcwMjcgNC4wMzk3N0wyNS4xOTc2IDRDMjUuNTUwMiA0LjAwMDc0IDI1Ljg5OTMgNC4wNzExOCAyNi4yMjQ3IDQuMjA3MjlDMjYuNTUwMSA0LjM0MzM5IDI2Ljg0NTYgNC41NDI0OSAyNy4wOTQxIDQuNzkzMThDMjcuMzQyNyA1LjA0Mzg2IDI3LjUzOTUgNS4zNDEyMiAyNy42NzMyIDUuNjY4MjNDMjcuODA3IDUuOTk1MjMgMjcuODc1IDYuMzQ1NDYgMjcuODczNSA2LjY5ODg3WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyKSIvPg0KPC9nPg0KPGRlZnM+DQo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2lpIiB4PSIxNS4xOTcxIiB5PSIxNC4xNDMxIiB3aWR0aD0iMTguODAzMSIgaGVpZ2h0PSIxOC4xNjkzIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+DQo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPg0KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPg0KPGZlT2Zmc2V0IGR4PSItMC4yIiBkeT0iLTAuMiIvPg0KPGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgazI9Ii0xIiBrMz0iMSIvPg0KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMSAwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDAuMTcgMCIvPg0KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9InNoYXBlIiByZXN1bHQ9ImVmZmVjdDFfaW5uZXJTaGFkb3ciLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPg0KPGZlT2Zmc2V0IGR4PSItMC41IiBkeT0iLTAuNSIvPg0KPGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgazI9Ii0xIiBrMz0iMSIvPg0KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMSAwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDAuMTYgMCIvPg0KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9ImVmZmVjdDFfaW5uZXJTaGFkb3ciIHJlc3VsdD0iZWZmZWN0Ml9pbm5lclNoYWRvdyIvPg0KPC9maWx0ZXI+DQo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2RpaSIgeD0iMCIgeT0iMCIgd2lkdGg9IjM5Ljg3MzYiIGhlaWdodD0iMzkuMDI4NSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPg0KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+DQo8ZmVPZmZzZXQgZHg9IjQiIGR5PSI0Ii8+DQo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0Ii8+DQo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+DQo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvdyIvPg0KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3ciIHJlc3VsdD0ic2hhcGUiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPg0KPGZlT2Zmc2V0IGR4PSItMiIgZHk9Ii0yIi8+DQo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiBrMj0iLTEiIGszPSIxIi8+DQo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAxIDAgMCAwIDAgMSAwIDAgMCAwIDEgMCAwIDAgMC4xNyAwIi8+DQo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0ic2hhcGUiIHJlc3VsdD0iZWZmZWN0Ml9pbm5lclNoYWRvdyIvPg0KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+DQo8ZmVPZmZzZXQgZHg9Ii0xIiBkeT0iLTEiLz4NCjxmZUNvbXBvc2l0ZSBpbjI9ImhhcmRBbHBoYSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIGsyPSItMSIgazM9IjEiLz4NCjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDAgMSAwIDAgMCAwLjE2IDAiLz4NCjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJlZmZlY3QyX2lubmVyU2hhZG93IiByZXN1bHQ9ImVmZmVjdDNfaW5uZXJTaGFkb3ciLz4NCjwvZmlsdGVyPg0KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyIiB4MT0iLTAuMzk1MDAxIiB5MT0iMjMuMTI4MiIgeDI9IjIwLjEwNTgiIHkyPSIzNy44NDc0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQo8c3RvcCBzdG9wLWNvbG9yPSIjRUZFRkVGIi8+DQo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IndoaXRlIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPC9kZWZzPg0KPC9zdmc+DQo=",
|
|
@@ -1117,7 +1120,8 @@ export const dummyDefaultProps = {
|
|
|
1117
1120
|
dir: "auto",
|
|
1118
1121
|
hideOOOHPane: false,
|
|
1119
1122
|
hideTitle: false,
|
|
1120
|
-
titleText: "Thanks for contacting us. You have reached us outside of our operating hours. An agent will respond when we open."
|
|
1123
|
+
titleText: "Thanks for contacting us. You have reached us outside of our operating hours. An agent will respond when we open. Please see link https://microsoft.com",
|
|
1124
|
+
openLinkInNewTab: true
|
|
1121
1125
|
},
|
|
1122
1126
|
styleProps: {
|
|
1123
1127
|
generalStyleProps: {
|
|
@@ -1160,7 +1164,7 @@ export const dummyDefaultProps = {
|
|
|
1160
1164
|
subtitleText: "Please take a moment to give us feedback about your chat experience. We are loading the survey for you now."
|
|
1161
1165
|
},
|
|
1162
1166
|
styleProps: {
|
|
1163
|
-
// ...[Existing
|
|
1167
|
+
// ...[Existing loading pane style props]
|
|
1164
1168
|
generalStyleProps: {
|
|
1165
1169
|
position: "initial",
|
|
1166
1170
|
width: "100%",
|
|
@@ -1205,7 +1209,7 @@ export const dummyDefaultProps = {
|
|
|
1205
1209
|
generalStyleProps: {
|
|
1206
1210
|
borderStyle: "solid",
|
|
1207
1211
|
borderRadius: "4px",
|
|
1208
|
-
borderWidth: "
|
|
1212
|
+
borderWidth: "0px",
|
|
1209
1213
|
backgroundColor: "#FFFFFF",
|
|
1210
1214
|
borderColor: "#F1F1F1",
|
|
1211
1215
|
overflowY: "auto",
|
|
@@ -1610,10 +1614,10 @@ export const dummyDefaultProps = {
|
|
|
1610
1614
|
padding: "0px 10px 0 10px"
|
|
1611
1615
|
},
|
|
1612
1616
|
userMessageBoxStyles: {
|
|
1613
|
-
maxWidth: "
|
|
1617
|
+
maxWidth: "90%"
|
|
1614
1618
|
},
|
|
1615
1619
|
systemMessageBoxStyles: {
|
|
1616
|
-
maxWidth: "
|
|
1620
|
+
maxWidth: "90%"
|
|
1617
1621
|
},
|
|
1618
1622
|
typingIndicatorStyleProps: {
|
|
1619
1623
|
marginLeft: "10px",
|
|
@@ -12,15 +12,15 @@ import { getAuthClientFunction, handleAuthentication } from "./authHelper";
|
|
|
12
12
|
|
|
13
13
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
14
|
const prepareEndChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state) => {
|
|
15
|
-
var _state$domainStates$l, _state$domainStates$l2, _state$domainStates$l3, _state$domainStates$l4, _conversationDetails;
|
|
16
|
-
const isPostChatEnabled = (_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.msdyn_postconversationsurveyenable;
|
|
17
|
-
const postChatSurveyMode = (_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : (_state$domainStates$l4 = _state$domainStates$l3.LiveWSAndLiveChatEngJoin) === null || _state$domainStates$l4 === void 0 ? void 0 : _state$domainStates$l4.msdyn_postconversationsurveymode;
|
|
15
|
+
var _props$chatConfig, _props$chatConfig$Liv, _state$domainStates$l, _state$domainStates$l2, _props$chatConfig2, _props$chatConfig2$Li, _state$domainStates$l3, _state$domainStates$l4, _conversationDetails;
|
|
16
|
+
const isPostChatEnabled = ((_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$Liv.msdyn_postconversationsurveyenable) ?? ((_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.msdyn_postconversationsurveyenable);
|
|
17
|
+
const postChatSurveyMode = ((_props$chatConfig2 = props.chatConfig) === null || _props$chatConfig2 === void 0 ? void 0 : (_props$chatConfig2$Li = _props$chatConfig2.LiveWSAndLiveChatEngJoin) === null || _props$chatConfig2$Li === void 0 ? void 0 : _props$chatConfig2$Li.msdyn_postconversationsurveymode) ?? ((_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : (_state$domainStates$l4 = _state$domainStates$l3.LiveWSAndLiveChatEngJoin) === null || _state$domainStates$l4 === void 0 ? void 0 : _state$domainStates$l4.msdyn_postconversationsurveymode);
|
|
18
18
|
|
|
19
19
|
//Unable to end chat if token has expired
|
|
20
20
|
if (props.getAuthToken) {
|
|
21
21
|
const authClientFunction = getAuthClientFunction(props.chatConfig);
|
|
22
22
|
if (props.getAuthToken && authClientFunction) {
|
|
23
|
-
// set auth token to chat sdk before
|
|
23
|
+
// set auth token to chat sdk before end chat
|
|
24
24
|
const authSuccess = await handleAuthentication(chatSDK, props.chatConfig, props.getAuthToken);
|
|
25
25
|
if (!authSuccess) {
|
|
26
26
|
TelemetryHelper.logActionEvent(LogLevel.ERROR, {
|
|
@@ -56,15 +56,20 @@ const prepareEndChat = async (props, chatSDK, setAdapter, setWebChatStyles, disp
|
|
|
56
56
|
chatSDK.requestId = chatSession.requestId;
|
|
57
57
|
}
|
|
58
58
|
if (postChatSurveyMode === PostChatSurveyMode.Embed) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
59
|
+
// Only start embedded Postchat workflow if postchat context is set successfully else close chat
|
|
60
|
+
if (state.domainStates.postChatContext) {
|
|
61
|
+
dispatch({
|
|
62
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
63
|
+
payload: ConversationState.PostchatLoading
|
|
64
|
+
});
|
|
65
|
+
await addDelayInMs(Constants.PostChatLoadingDurationInMs);
|
|
66
|
+
const loadPostChatEvent = {
|
|
67
|
+
eventName: BroadcastEvent.LoadPostChatSurvey
|
|
68
|
+
};
|
|
69
|
+
BroadcastService.postMessage(loadPostChatEvent);
|
|
70
|
+
} else {
|
|
71
|
+
await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, true, false, true);
|
|
72
|
+
}
|
|
68
73
|
} else if (postChatSurveyMode === PostChatSurveyMode.Link) {
|
|
69
74
|
var _props$webChatContain, _props$webChatContain2;
|
|
70
75
|
dispatch({
|
|
@@ -150,10 +155,6 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
|
|
|
150
155
|
type: LiveChatWidgetActionType.SET_AUDIO_NOTIFICATION,
|
|
151
156
|
payload: null
|
|
152
157
|
});
|
|
153
|
-
dispatch({
|
|
154
|
-
type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
|
|
155
|
-
payload: 0
|
|
156
|
-
});
|
|
157
158
|
dispatch({
|
|
158
159
|
type: LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
|
|
159
160
|
payload: {
|
|
@@ -176,6 +177,11 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
|
|
|
176
177
|
exception: `Failed to endChat: ${error}`
|
|
177
178
|
}
|
|
178
179
|
});
|
|
180
|
+
} finally {
|
|
181
|
+
dispatch({
|
|
182
|
+
type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
|
|
183
|
+
payload: 0
|
|
184
|
+
});
|
|
179
185
|
}
|
|
180
186
|
}
|
|
181
187
|
};
|
|
@@ -33,7 +33,7 @@ import { Constants } from "../../../common/Constants";
|
|
|
33
33
|
|
|
34
34
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
35
|
export const initWebChatComposer = (props, chatSDK, state, dispatch, setWebChatStyles) => {
|
|
36
|
-
var _props$webChatContain, _props$webChatContain2, _props$webChatContain3, _state$domainStates$l, _state$domainStates$l2, _state$domainStates$l3, _state$domainStates$l4, _state$domainStates$l8, _state$domainStates$l9, _props$webChatContain7, _props$webChatContain8, _state$domainStates$r, _state$domainStates$r2, _props$webChatContain9, _props$webChatContain10, _state$domainStates$r3, _state$domainStates$r4, _props$webChatContain11, _props$webChatContain12, _defaultWebChatContai, _props$webChatContain13, _props$webChatContain14, _props$webChatContain15, _props$webChatContain16, _state$domainStates$r5, _state$domainStates$r6, _props$webChatContain17, _props$webChatContain18, _defaultWebChatContai2, _props$webChatContain19, _props$webChatContain20, _defaultWebChatContai3, _props$webChatContain21, _props$webChatContain22;
|
|
36
|
+
var _props$webChatContain, _props$webChatContain2, _props$webChatContain3, _props$chatConfig, _props$chatConfig$Liv, _state$domainStates$l, _state$domainStates$l2, _props$chatConfig2, _props$chatConfig2$Li, _state$domainStates$l3, _state$domainStates$l4, _state$domainStates$l8, _state$domainStates$l9, _props$webChatContain7, _props$webChatContain8, _state$domainStates$r, _state$domainStates$r2, _props$webChatContain9, _props$webChatContain10, _state$domainStates$r3, _state$domainStates$r4, _props$webChatContain11, _props$webChatContain12, _defaultWebChatContai, _props$webChatContain13, _props$webChatContain14, _props$webChatContain15, _props$webChatContain16, _state$domainStates$r5, _state$domainStates$r6, _props$webChatContain17, _props$webChatContain18, _defaultWebChatContai2, _props$webChatContain19, _props$webChatContain20, _defaultWebChatContai3, _props$webChatContain21, _props$webChatContain22;
|
|
37
37
|
const localizedTexts = {
|
|
38
38
|
...defaultMiddlewareLocalizedTexts,
|
|
39
39
|
...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.localizedTexts)
|
|
@@ -41,8 +41,8 @@ export const initWebChatComposer = (props, chatSDK, state, dispatch, setWebChatS
|
|
|
41
41
|
const disableNewLineMarkdownSupport = ((_props$webChatContain2 = props.webChatContainerProps) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.disableNewLineMarkdownSupport) ?? defaultWebChatContainerStatefulProps.disableNewLineMarkdownSupport;
|
|
42
42
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
43
43
|
const markdown = createMarkdown(((_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.disableMarkdownMessageFormatting) ?? defaultWebChatContainerStatefulProps.disableMarkdownMessageFormatting, disableNewLineMarkdownSupport);
|
|
44
|
-
const isPostChatEnabled = (_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.msdyn_postconversationsurveyenable;
|
|
45
|
-
const postChatSurveyMode = (_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : (_state$domainStates$l4 = _state$domainStates$l3.LiveWSAndLiveChatEngJoin) === null || _state$domainStates$l4 === void 0 ? void 0 : _state$domainStates$l4.msdyn_postconversationsurveymode;
|
|
44
|
+
const isPostChatEnabled = ((_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$Liv.msdyn_postconversationsurveyenable) ?? ((_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.msdyn_postconversationsurveyenable);
|
|
45
|
+
const postChatSurveyMode = ((_props$chatConfig2 = props.chatConfig) === null || _props$chatConfig2 === void 0 ? void 0 : (_props$chatConfig2$Li = _props$chatConfig2.LiveWSAndLiveChatEngJoin) === null || _props$chatConfig2$Li === void 0 ? void 0 : _props$chatConfig2$Li.msdyn_postconversationsurveymode) ?? ((_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : (_state$domainStates$l4 = _state$domainStates$l3.LiveWSAndLiveChatEngJoin) === null || _state$domainStates$l4 === void 0 ? void 0 : _state$domainStates$l4.msdyn_postconversationsurveymode);
|
|
46
46
|
|
|
47
47
|
// Initialize Web Chat's redux store
|
|
48
48
|
let webChatStore = WebChatStoreLoader.store;
|
|
@@ -64,16 +64,28 @@ export const initWebChatComposer = (props, chatSDK, state, dispatch, setWebChatS
|
|
|
64
64
|
}
|
|
65
65
|
if (isPostChatEnabled === "true") {
|
|
66
66
|
if (postChatSurveyMode === PostChatSurveyMode.Embed) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
67
|
+
// Only start embedded Postchat workflow if postchat context is set successfully else close chat
|
|
68
|
+
if (state.domainStates.postChatContext) {
|
|
69
|
+
WebChatStoreLoader.store = null;
|
|
70
|
+
dispatch({
|
|
71
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
72
|
+
payload: ConversationState.PostchatLoading
|
|
73
|
+
});
|
|
74
|
+
await addDelayInMs(Constants.PostChatLoadingDurationInMs);
|
|
75
|
+
const loadPostChatEvent = {
|
|
76
|
+
eventName: BroadcastEvent.LoadPostChatSurvey
|
|
77
|
+
};
|
|
78
|
+
BroadcastService.postMessage(loadPostChatEvent);
|
|
79
|
+
} else {
|
|
80
|
+
dispatch({
|
|
81
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
82
|
+
payload: ConversationState.InActive
|
|
83
|
+
});
|
|
84
|
+
dispatch({
|
|
85
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY_AGENT,
|
|
86
|
+
payload: true
|
|
87
|
+
});
|
|
88
|
+
}
|
|
77
89
|
} else if (postChatSurveyMode === PostChatSurveyMode.Link) {
|
|
78
90
|
dispatch({
|
|
79
91
|
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|