@microsoft/omnichannel-chat-widget 0.1.0-main.0c0fd47 → 0.1.0-main.0d1c6e4
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 +12 -3
- 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 +35 -4
- package/lib/cjs/common/telemetry/TelemetryHelper.js +2 -1
- package/lib/cjs/common/utils.js +23 -2
- package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +12 -19
- package/lib/cjs/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +1 -1
- package/lib/cjs/components/headerstateful/HeaderStateful.js +5 -2
- package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +139 -0
- package/lib/cjs/components/livechatwidget/common/agentEndConversationHelper.js +36 -0
- package/lib/cjs/components/livechatwidget/common/createAdapter.js +2 -0
- package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +14 -10
- package/lib/cjs/components/livechatwidget/common/endChat.js +43 -63
- package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +11 -49
- package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +5 -5
- package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +254 -2
- package/lib/cjs/components/livechatwidget/common/startChat.js +70 -59
- package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +81 -43
- package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +8 -1
- package/lib/cjs/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +3 -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/common/utils/FileAttachmentIconManager.js +2 -0
- 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/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +7 -3
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.js +75 -11
- package/lib/cjs/contexts/common/ConversationEndEntity.js +12 -0
- package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +10 -7
- package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +8 -3
- package/lib/cjs/contexts/createReducer.js +28 -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 +10 -2
- 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 +35 -4
- package/lib/esm/common/telemetry/TelemetryHelper.js +2 -1
- package/lib/esm/common/utils.js +20 -0
- package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +12 -19
- package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +1 -1
- package/lib/esm/components/headerstateful/HeaderStateful.js +5 -2
- package/lib/esm/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +134 -0
- package/lib/esm/components/livechatwidget/common/agentEndConversationHelper.js +30 -0
- package/lib/esm/components/livechatwidget/common/createAdapter.js +2 -0
- package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +14 -10
- package/lib/esm/components/livechatwidget/common/endChat.js +45 -65
- package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +13 -51
- package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +6 -5
- package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +254 -3
- package/lib/esm/components/livechatwidget/common/startChat.js +70 -59
- package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +82 -44
- package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +8 -1
- package/lib/esm/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +3 -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/common/utils/FileAttachmentIconManager.js +2 -0
- 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/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +5 -3
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.js +75 -11
- package/lib/esm/contexts/common/ConversationEndEntity.js +5 -0
- package/lib/esm/contexts/common/LiveChatWidgetActionType.js +10 -7
- package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +8 -3
- package/lib/esm/contexts/createReducer.js +28 -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 +9 -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 +31 -6
- 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/common/utils.d.ts +1 -0
- package/lib/types/components/confirmationpanestateful/interfaces/IConfirmationPaneStatefulParams.d.ts +0 -7
- package/lib/types/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.d.ts +9 -0
- package/lib/types/components/livechatwidget/common/agentEndConversationHelper.d.ts +6 -0
- package/lib/types/components/livechatwidget/common/initWebChatComposer.d.ts +1 -1
- package/lib/types/components/livechatwidget/common/setPostChatContextAndLoadSurvey.d.ts +6 -1
- 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/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.d.ts +1 -1
- package/lib/types/contexts/common/ConversationEndEntity.d.ts +4 -0
- package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +5 -1
- package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +10 -7
- package/lib/types/hooks/useDebounce.d.ts +3 -0
- package/lib/types/hooks/useWindowDimensions.d.ts +4 -0
- package/package.json +3 -3
package/lib/esm/common/utils.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
var _this = this;
|
|
1
2
|
import { AriaTelemetryConstants, Constants, LocaleConstants } from "./Constants";
|
|
2
3
|
import { DataStoreManager } from "./contextDataStore/DataStoreManager";
|
|
3
4
|
import { KeyCodes } from "./KeyCodes";
|
|
@@ -304,4 +305,23 @@ export const addDelayInMs = ms => {
|
|
|
304
305
|
};
|
|
305
306
|
export const getBroadcastChannelName = (widgetId, widgetInstanceId) => {
|
|
306
307
|
return widgetInstanceId && !isNullOrEmptyString(widgetInstanceId) ? `${widgetInstanceId}_${widgetId}` : widgetId;
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
311
|
+
export const debounceLeading = function (fn) {
|
|
312
|
+
let ms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3000;
|
|
313
|
+
let timeoutId;
|
|
314
|
+
return function () {
|
|
315
|
+
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
316
|
+
|
|
317
|
+
if (!timeoutId) {
|
|
318
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
319
|
+
args[_key] = arguments[_key];
|
|
320
|
+
}
|
|
321
|
+
fn.apply(_this, args);
|
|
322
|
+
}
|
|
323
|
+
timeoutId = setTimeout(() => {
|
|
324
|
+
timeoutId = null;
|
|
325
|
+
}, ms);
|
|
326
|
+
};
|
|
307
327
|
};
|
|
@@ -4,21 +4,17 @@ import React, { useEffect } from "react";
|
|
|
4
4
|
import { findAllFocusableElement, findParentFocusableElementsWithoutChildContainer, preventFocusToMoveOutOfElement, setFocusOnElement, setFocusOnSendBox, setTabIndices } from "../../common/utils";
|
|
5
5
|
import { DimLayer } from "../dimlayer/DimLayer";
|
|
6
6
|
import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
|
|
7
|
-
import { NotificationHandler } from "../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler";
|
|
8
|
-
import { NotificationScenarios } from "../webchatcontainerstateful/webchatcontroller/enums/NotificationScenarios";
|
|
9
7
|
import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
|
|
10
8
|
import useChatAdapterStore from "../../hooks/useChatAdapterStore";
|
|
11
9
|
import useChatContextStore from "../../hooks/useChatContextStore";
|
|
10
|
+
import { ConversationEndEntity } from "../../contexts/common/ConversationEndEntity";
|
|
12
11
|
|
|
13
12
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
13
|
export const ConfirmationPaneStateful = props => {
|
|
15
14
|
const initialTabIndexMap = new Map();
|
|
16
15
|
let elements = [];
|
|
17
16
|
const [state, dispatch] = useChatContextStore();
|
|
18
|
-
|
|
19
|
-
prepareEndChat
|
|
20
|
-
} = props;
|
|
21
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
|
|
22
18
|
const [adapter] = useChatAdapterStore();
|
|
23
19
|
const controlProps = {
|
|
24
20
|
id: "oc-lcw-confirmation-pane",
|
|
@@ -32,18 +28,15 @@ export const ConfirmationPaneStateful = props => {
|
|
|
32
28
|
type: LiveChatWidgetActionType.SET_SHOW_CONFIRMATION,
|
|
33
29
|
payload: false
|
|
34
30
|
});
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
});
|
|
45
|
-
NotificationHandler.notifyError(NotificationScenarios.Connection, "Get Conversation Details Call Failed: " + ex);
|
|
46
|
-
}
|
|
31
|
+
setTabIndices(elements, initialTabIndexMap, true);
|
|
32
|
+
dispatch({
|
|
33
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY,
|
|
34
|
+
payload: ConversationEndEntity.Customer
|
|
35
|
+
});
|
|
36
|
+
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
37
|
+
Event: TelemetryEvent.ConversationEndedByCustomer,
|
|
38
|
+
Description: "Conversation is ended by customer."
|
|
39
|
+
});
|
|
47
40
|
},
|
|
48
41
|
onCancel: () => {
|
|
49
42
|
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
@@ -82,7 +75,7 @@ export const ConfirmationPaneStateful = props => {
|
|
|
82
75
|
Event: TelemetryEvent.ConfirmationPaneLoaded
|
|
83
76
|
});
|
|
84
77
|
}, []);
|
|
85
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null,
|
|
78
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DimLayer, {
|
|
86
79
|
brightness: (controlProps === null || controlProps === void 0 ? void 0 : controlProps.brightnessValueOnDim) ?? "0.2"
|
|
87
80
|
}), /*#__PURE__*/React.createElement(ConfirmationPane, {
|
|
88
81
|
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,
|
|
@@ -7,6 +7,7 @@ import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
|
|
|
7
7
|
import { defaultOutOfOfficeHeaderStyleProps } from "./common/styleProps/defaultOutOfOfficeHeaderStyleProps";
|
|
8
8
|
import useChatAdapterStore from "../../hooks/useChatAdapterStore";
|
|
9
9
|
import useChatContextStore from "../../hooks/useChatContextStore";
|
|
10
|
+
import { ConversationEndEntity } from "../../contexts/common/ConversationEndEntity";
|
|
10
11
|
export const HeaderStateful = props => {
|
|
11
12
|
var _state$domainStates$l, _state$domainStates$l2, _headerProps$controlP, _headerProps$controlP2, _headerProps$controlP3, _outOfOfficeHeaderPro;
|
|
12
13
|
const [state, dispatch] = useChatContextStore();
|
|
@@ -21,6 +22,7 @@ export const HeaderStateful = props => {
|
|
|
21
22
|
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
23
|
const outOfOfficeStyleProps = Object.assign({}, defaultOutOfOfficeHeaderStyleProps, outOfOfficeHeaderProps === null || outOfOfficeHeaderProps === void 0 ? void 0 : outOfOfficeHeaderProps.styleProps);
|
|
23
24
|
const conversationState = useRef(state.appStates.conversationState);
|
|
25
|
+
const conversationEndedBy = useRef(state.appStates.conversationEndedBy);
|
|
24
26
|
const controlProps = {
|
|
25
27
|
id: "oc-lcw-header",
|
|
26
28
|
dir: state.domainStates.globalDir,
|
|
@@ -40,7 +42,7 @@ export const HeaderStateful = props => {
|
|
|
40
42
|
Event: TelemetryEvent.HeaderCloseButtonClicked,
|
|
41
43
|
Description: "Header Close button clicked."
|
|
42
44
|
});
|
|
43
|
-
if (conversationState.current === ConversationState.Active) {
|
|
45
|
+
if (conversationState.current === ConversationState.Active || conversationEndedBy.current === ConversationEndEntity.Agent) {
|
|
44
46
|
dispatch({
|
|
45
47
|
type: LiveChatWidgetActionType.SET_SHOW_CONFIRMATION,
|
|
46
48
|
payload: true
|
|
@@ -62,7 +64,7 @@ export const HeaderStateful = props => {
|
|
|
62
64
|
...(headerProps === null || headerProps === void 0 ? void 0 : headerProps.controlProps),
|
|
63
65
|
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
66
|
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)
|
|
67
|
+
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
68
|
};
|
|
67
69
|
const outOfOfficeControlProps = {
|
|
68
70
|
id: "oc-lcw-header",
|
|
@@ -86,6 +88,7 @@ export const HeaderStateful = props => {
|
|
|
86
88
|
if (state.appStates.conversationState) {
|
|
87
89
|
conversationState.current = state.appStates.conversationState;
|
|
88
90
|
}
|
|
91
|
+
conversationEndedBy.current = state.appStates.conversationEndedBy;
|
|
89
92
|
}, [state.appStates]);
|
|
90
93
|
return /*#__PURE__*/React.createElement(Header, {
|
|
91
94
|
componentOverrides: headerProps === null || headerProps === void 0 ? void 0 : headerProps.componentOverrides,
|
package/lib/esm/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
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; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
6
|
+
import { BroadcastService } from "@microsoft/omnichannel-chat-components";
|
|
7
|
+
import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../../common/telemetry/TelemetryConstants";
|
|
8
|
+
import { TelemetryHelper } from "../../../../common/telemetry/TelemetryHelper";
|
|
9
|
+
const supportedSignInCardContentTypes = ["application/vnd.microsoft.card.signin", "application/vnd.microsoft.card.oauth"];
|
|
10
|
+
const botOauthUrlRegex = /[\S]+.botframework.com\/api\/oauth\/signin\?signin=([\S]+)/;
|
|
11
|
+
const delay = t => new Promise(resolve => setTimeout(resolve, t));
|
|
12
|
+
const fetchBotAuthConfigRetries = 3;
|
|
13
|
+
const fetchBotAuthConfigRetryInterval = 1000;
|
|
14
|
+
let response;
|
|
15
|
+
const extractSignInId = signInUrl => {
|
|
16
|
+
const result = botOauthUrlRegex.exec(signInUrl);
|
|
17
|
+
if (result && result[1]) {
|
|
18
|
+
return result[1];
|
|
19
|
+
}
|
|
20
|
+
return "";
|
|
21
|
+
};
|
|
22
|
+
const extractSasUrl = async attachment => {
|
|
23
|
+
let sasUrl = undefined;
|
|
24
|
+
if (attachment && attachment.content && attachment.content.tokenPostResource && attachment.content.tokenPostResource.sasUrl) {
|
|
25
|
+
sasUrl = attachment.content.tokenPostResource.sasUrl;
|
|
26
|
+
}
|
|
27
|
+
if (!sasUrl) {
|
|
28
|
+
const signInId = extractSignInId(attachment.content.buttons[0].value);
|
|
29
|
+
const getTestUrlEndpoint = `https://token.botframework.com/api/sas/gettesturl?signInId=${signInId}`;
|
|
30
|
+
try {
|
|
31
|
+
const response = await window.fetch(getTestUrlEndpoint);
|
|
32
|
+
if (response.status === 200) {
|
|
33
|
+
const responseJson = await response.json();
|
|
34
|
+
sasUrl = responseJson.sasUrl;
|
|
35
|
+
}
|
|
36
|
+
} catch {
|
|
37
|
+
sasUrl = undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return sasUrl;
|
|
41
|
+
};
|
|
42
|
+
const fetchBotAuthConfig = async retries => {
|
|
43
|
+
TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
|
|
44
|
+
Event: TelemetryEvent.SetBotAuthProviderFetchConfig
|
|
45
|
+
});
|
|
46
|
+
const botAuthConfigRequestEvent = {
|
|
47
|
+
eventName: BroadcastEvent.BotAuthConfigRequest
|
|
48
|
+
};
|
|
49
|
+
BroadcastService.postMessage(botAuthConfigRequestEvent);
|
|
50
|
+
const listener = BroadcastService.getMessageByEventName(BroadcastEvent.BotAuthConfigResponse).subscribe(data => {
|
|
51
|
+
var _data$payload, _data$payload2;
|
|
52
|
+
response = ((_data$payload = data.payload) === null || _data$payload === void 0 ? void 0 : _data$payload.response) !== undefined ? (_data$payload2 = data.payload) === null || _data$payload2 === void 0 ? void 0 : _data$payload2.response : response;
|
|
53
|
+
listener.unsubscribe();
|
|
54
|
+
});
|
|
55
|
+
if (response !== undefined) {
|
|
56
|
+
//return response;
|
|
57
|
+
return response;
|
|
58
|
+
}
|
|
59
|
+
if (retries === 1) {
|
|
60
|
+
// Base Case
|
|
61
|
+
throw new Error();
|
|
62
|
+
}
|
|
63
|
+
await delay(fetchBotAuthConfigRetryInterval);
|
|
64
|
+
return await fetchBotAuthConfig(--retries);
|
|
65
|
+
};
|
|
66
|
+
export class BotAuthActivitySubscriber {
|
|
67
|
+
constructor() {
|
|
68
|
+
_defineProperty(this, "observer", void 0);
|
|
69
|
+
_defineProperty(this, "signInCardSeen", void 0);
|
|
70
|
+
this.signInCardSeen = new Set();
|
|
71
|
+
}
|
|
72
|
+
applicable(activity) {
|
|
73
|
+
var _activity$attachments;
|
|
74
|
+
return (activity === null || activity === void 0 ? void 0 : (_activity$attachments = activity.attachments) === null || _activity$attachments === void 0 ? void 0 : _activity$attachments.length) > 0 && activity.attachments[0] && supportedSignInCardContentTypes.indexOf(activity.attachments[0].contentType) >= 0;
|
|
75
|
+
}
|
|
76
|
+
async apply(activity) {
|
|
77
|
+
this.observer.next(false); // Hides card
|
|
78
|
+
const attachment = activity.attachments[0];
|
|
79
|
+
const signInUrl = attachment.content.buttons[0].value;
|
|
80
|
+
const signInId = extractSignInId(signInUrl);
|
|
81
|
+
if (!signInId) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (this.signInCardSeen.has(signInId)) {
|
|
85
|
+
// Prevents duplicate auth
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.signInCardSeen.add(signInId);
|
|
89
|
+
const sasUrl = await extractSasUrl(attachment);
|
|
90
|
+
const event = {
|
|
91
|
+
eventName: BroadcastEvent.SigninCardReceived,
|
|
92
|
+
payload: {
|
|
93
|
+
sasUrl
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
if (!sasUrl) {
|
|
97
|
+
TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
|
|
98
|
+
Event: TelemetryEvent.BotAuthActivityEmptySasUrl,
|
|
99
|
+
Description: "SaS Url is empty"
|
|
100
|
+
});
|
|
101
|
+
return activity;
|
|
102
|
+
} else {
|
|
103
|
+
BroadcastService.postMessage(event);
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const response = await fetchBotAuthConfig(fetchBotAuthConfigRetries);
|
|
107
|
+
if (response === false) {
|
|
108
|
+
TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
|
|
109
|
+
Event: TelemetryEvent.SetBotAuthProviderHideCard
|
|
110
|
+
});
|
|
111
|
+
} else {
|
|
112
|
+
TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
|
|
113
|
+
Event: TelemetryEvent.SetBotAuthProviderDisplayCard
|
|
114
|
+
});
|
|
115
|
+
return activity;
|
|
116
|
+
}
|
|
117
|
+
} catch {
|
|
118
|
+
TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
|
|
119
|
+
Event: TelemetryEvent.SetBotAuthProviderNotFound
|
|
120
|
+
});
|
|
121
|
+
//this is to ensure listener continues waiting for response
|
|
122
|
+
if (this.signInCardSeen.has(signInId)) {
|
|
123
|
+
this.signInCardSeen.delete(signInId);
|
|
124
|
+
}
|
|
125
|
+
return activity;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async next(activity) {
|
|
129
|
+
if (this.applicable(activity)) {
|
|
130
|
+
return await this.apply(activity);
|
|
131
|
+
}
|
|
132
|
+
return activity;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
|
|
2
|
+
import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
|
|
3
|
+
import { ConversationEndEntity } from "../../../contexts/common/ConversationEndEntity";
|
|
4
|
+
import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
|
|
5
|
+
import { checkPostChatEnabled } from "./setPostChatContextAndLoadSurvey";
|
|
6
|
+
const handleAgentEndConversation = (props, state, dispatch) => {
|
|
7
|
+
const isPostChatEnabled = checkPostChatEnabled(props, state);
|
|
8
|
+
if (isPostChatEnabled) {
|
|
9
|
+
if (!state.appStates.postChatWorkflowInProgress) {
|
|
10
|
+
dispatch({
|
|
11
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY,
|
|
12
|
+
payload: ConversationEndEntity.Agent
|
|
13
|
+
});
|
|
14
|
+
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
15
|
+
Event: TelemetryEvent.ConversationEndedByAgent,
|
|
16
|
+
Description: "Conversation is ended from agent side"
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
} else {
|
|
20
|
+
dispatch({
|
|
21
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY,
|
|
22
|
+
payload: ConversationEndEntity.Agent
|
|
23
|
+
});
|
|
24
|
+
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
25
|
+
Event: TelemetryEvent.ConversationEndedByAgent,
|
|
26
|
+
Description: "Conversation is ended from agent side"
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
export { handleAgentEndConversation };
|
|
@@ -4,6 +4,7 @@ import { NotificationScenarios } from "../../webchatcontainerstateful/webchatcon
|
|
|
4
4
|
import { defaultMiddlewareLocalizedTexts } from "../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts";
|
|
5
5
|
import { ChatAdapterShim } from "./ChatAdapterShim";
|
|
6
6
|
import { PauseActivitySubscriber } from "./ActivitySubscriber/PauseActivitySubscriber";
|
|
7
|
+
import { BotAuthActivitySubscriber } from "./ActivitySubscriber/BotAuthActivitySubscriber";
|
|
7
8
|
|
|
8
9
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
10
|
export const createAdapter = async chatSDK => {
|
|
@@ -29,6 +30,7 @@ export const createAdapter = async chatSDK => {
|
|
|
29
30
|
if (chatSDK.isMockModeOn !== true) {
|
|
30
31
|
adapter = new ChatAdapterShim(adapter);
|
|
31
32
|
adapter.addSubscriber(new PauseActivitySubscriber());
|
|
33
|
+
adapter.addSubscriber(new BotAuthActivitySubscriber());
|
|
32
34
|
return adapter.chatAdapter;
|
|
33
35
|
}
|
|
34
36
|
return adapter;
|
|
@@ -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",
|
|
@@ -1,26 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
|
|
2
2
|
import { BroadcastService } from "@microsoft/omnichannel-chat-components";
|
|
3
3
|
import { ConversationState } from "../../../contexts/common/ConversationState";
|
|
4
4
|
import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
|
|
5
5
|
import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
|
|
6
6
|
import { WebChatStoreLoader } from "../../webchatcontainerstateful/webchatcontroller/WebChatStoreLoader";
|
|
7
7
|
import { defaultWebChatContainerStatefulProps } from "../../webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps";
|
|
8
|
-
import {
|
|
9
|
-
import { Constants } from "../../../common/Constants";
|
|
10
|
-
import { addDelayInMs, getWidgetEndChatEventName } from "../../../common/utils";
|
|
8
|
+
import { getWidgetEndChatEventName } from "../../../common/utils";
|
|
11
9
|
import { getAuthClientFunction, handleAuthentication } from "./authHelper";
|
|
10
|
+
import { checkPostChatEnabled, initiatePostChat } from "./setPostChatContextAndLoadSurvey";
|
|
11
|
+
import { ConversationEndEntity } from "../../../contexts/common/ConversationEndEntity";
|
|
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;
|
|
18
|
-
|
|
19
15
|
//Unable to end chat if token has expired
|
|
20
16
|
if (props.getAuthToken) {
|
|
21
17
|
const authClientFunction = getAuthClientFunction(props.chatConfig);
|
|
22
18
|
if (props.getAuthToken && authClientFunction) {
|
|
23
|
-
// set auth token to chat sdk before
|
|
19
|
+
// set auth token to chat sdk before end chat
|
|
24
20
|
const authSuccess = await handleAuthentication(chatSDK, props.chatConfig, props.getAuthToken);
|
|
25
21
|
if (!authSuccess) {
|
|
26
22
|
TelemetryHelper.logActionEvent(LogLevel.ERROR, {
|
|
@@ -32,60 +28,28 @@ const prepareEndChat = async (props, chatSDK, setAdapter, setWebChatStyles, disp
|
|
|
32
28
|
}
|
|
33
29
|
}
|
|
34
30
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
Event: TelemetryEvent.GetConversationDetailsException,
|
|
43
|
-
ExceptionDetails: {
|
|
44
|
-
exception: `Failed to get conversation details: ${erorr}`
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
if (isPostChatEnabled === "true" && ((_conversationDetails = conversationDetails) === null || _conversationDetails === void 0 ? void 0 : _conversationDetails.canRenderPostChat) === Constants.truePascal) {
|
|
49
|
-
const skipEndChatSDK = false;
|
|
50
|
-
const skipCloseChat = true;
|
|
51
|
-
const chatSession = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getCurrentLiveChatContext());
|
|
52
|
-
await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat, false);
|
|
53
|
-
if (chatSession) {
|
|
54
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
55
|
-
chatSDK.chatToken = chatSession.chatToken ?? {};
|
|
56
|
-
chatSDK.requestId = chatSession.requestId;
|
|
31
|
+
const isPostChatEnabled = checkPostChatEnabled(props, state);
|
|
32
|
+
if (isPostChatEnabled) {
|
|
33
|
+
try {
|
|
34
|
+
await initiatePostChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
|
|
35
|
+
} catch (error) {
|
|
36
|
+
// Ending chat because something went wrong
|
|
37
|
+
await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, true);
|
|
57
38
|
}
|
|
58
|
-
|
|
39
|
+
} else {
|
|
40
|
+
if (state.appStates.conversationEndedBy === ConversationEndEntity.Agent) {
|
|
59
41
|
dispatch({
|
|
60
|
-
type: LiveChatWidgetActionType.
|
|
61
|
-
payload:
|
|
62
|
-
});
|
|
63
|
-
await addDelayInMs(Constants.PostChatLoadingDurationInMs);
|
|
64
|
-
const loadPostChatEvent = {
|
|
65
|
-
eventName: BroadcastEvent.LoadPostChatSurvey
|
|
66
|
-
};
|
|
67
|
-
BroadcastService.postMessage(loadPostChatEvent);
|
|
68
|
-
} else if (postChatSurveyMode === PostChatSurveyMode.Link) {
|
|
69
|
-
var _props$webChatContain, _props$webChatContain2;
|
|
42
|
+
type: LiveChatWidgetActionType.SET_CHAT_TOKEN,
|
|
43
|
+
payload: undefined
|
|
44
|
+
});
|
|
70
45
|
dispatch({
|
|
71
|
-
type: LiveChatWidgetActionType.
|
|
72
|
-
payload:
|
|
46
|
+
type: LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
|
|
47
|
+
payload: undefined
|
|
73
48
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if ((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) !== false) {
|
|
77
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
78
|
-
setWebChatStyles(styles => {
|
|
79
|
-
return {
|
|
80
|
-
...styles,
|
|
81
|
-
hideSendBox: true
|
|
82
|
-
};
|
|
83
|
-
});
|
|
84
|
-
}
|
|
49
|
+
} else {
|
|
50
|
+
await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, true);
|
|
85
51
|
}
|
|
86
|
-
return;
|
|
87
52
|
}
|
|
88
|
-
await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, true);
|
|
89
53
|
};
|
|
90
54
|
|
|
91
55
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -106,7 +70,6 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
|
|
|
106
70
|
postMessageToOtherTab = false;
|
|
107
71
|
}
|
|
108
72
|
}
|
|
109
|
-
|
|
110
73
|
// Need to clear these states immediately when chat ended from OC.
|
|
111
74
|
dispatch({
|
|
112
75
|
type: LiveChatWidgetActionType.SET_CUSTOM_CONTEXT,
|
|
@@ -126,12 +89,12 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
|
|
|
126
89
|
});
|
|
127
90
|
if (!skipCloseChat) {
|
|
128
91
|
try {
|
|
129
|
-
var _props$
|
|
92
|
+
var _props$webChatContain;
|
|
130
93
|
adapter === null || adapter === void 0 ? void 0 : adapter.end();
|
|
131
94
|
setAdapter(undefined);
|
|
132
95
|
setWebChatStyles({
|
|
133
96
|
...defaultWebChatContainerStatefulProps.webChatStyles,
|
|
134
|
-
...((_props$
|
|
97
|
+
...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.webChatStyles)
|
|
135
98
|
});
|
|
136
99
|
WebChatStoreLoader.store = null;
|
|
137
100
|
dispatch({
|
|
@@ -139,9 +102,21 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
|
|
|
139
102
|
payload: ConversationState.Closed
|
|
140
103
|
});
|
|
141
104
|
dispatch({
|
|
142
|
-
type: LiveChatWidgetActionType.
|
|
105
|
+
type: LiveChatWidgetActionType.SET_POST_CHAT_WORKFLOW_IN_PROGRESS,
|
|
143
106
|
payload: false
|
|
144
107
|
});
|
|
108
|
+
dispatch({
|
|
109
|
+
type: LiveChatWidgetActionType.SET_SHOULD_USE_BOT_SURVEY,
|
|
110
|
+
payload: false
|
|
111
|
+
});
|
|
112
|
+
dispatch({
|
|
113
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY_AGENT_EVENT_RECEIVED,
|
|
114
|
+
payload: false
|
|
115
|
+
});
|
|
116
|
+
dispatch({
|
|
117
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY,
|
|
118
|
+
payload: undefined
|
|
119
|
+
});
|
|
145
120
|
dispatch({
|
|
146
121
|
type: LiveChatWidgetActionType.SET_RECONNECT_ID,
|
|
147
122
|
payload: undefined
|
|
@@ -150,10 +125,6 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
|
|
|
150
125
|
type: LiveChatWidgetActionType.SET_AUDIO_NOTIFICATION,
|
|
151
126
|
payload: null
|
|
152
127
|
});
|
|
153
|
-
dispatch({
|
|
154
|
-
type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
|
|
155
|
-
payload: 0
|
|
156
|
-
});
|
|
157
128
|
dispatch({
|
|
158
129
|
type: LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
|
|
159
130
|
payload: {
|
|
@@ -169,6 +140,10 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
|
|
|
169
140
|
eventName: endChatEventName
|
|
170
141
|
});
|
|
171
142
|
}
|
|
143
|
+
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
144
|
+
Event: TelemetryEvent.CloseChatCall,
|
|
145
|
+
Description: "Chat was closed succesfully"
|
|
146
|
+
});
|
|
172
147
|
} catch (error) {
|
|
173
148
|
TelemetryHelper.logActionEvent(LogLevel.ERROR, {
|
|
174
149
|
Event: TelemetryEvent.CloseChatMethodException,
|
|
@@ -176,6 +151,11 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
|
|
|
176
151
|
exception: `Failed to endChat: ${error}`
|
|
177
152
|
}
|
|
178
153
|
});
|
|
154
|
+
} finally {
|
|
155
|
+
dispatch({
|
|
156
|
+
type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
|
|
157
|
+
payload: 0
|
|
158
|
+
});
|
|
179
159
|
}
|
|
180
160
|
}
|
|
181
161
|
};
|