@microsoft/omnichannel-chat-widget 0.1.0-main.cde77ea → 0.1.0-main.ce08f21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/common/Constants.js +2 -0
- package/lib/cjs/common/telemetry/TelemetryConstants.js +2 -0
- package/lib/cjs/common/utils.js +12 -5
- package/lib/cjs/components/headerstateful/HeaderStateful.js +2 -1
- package/lib/cjs/components/livechatwidget/common/ActivityStreamHandler.js +44 -0
- package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +39 -0
- package/lib/cjs/components/livechatwidget/common/Deferred.js +42 -0
- package/lib/cjs/components/livechatwidget/common/createAdapter.js +4 -0
- package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +2 -5
- package/lib/cjs/components/livechatwidget/common/endChat.js +3 -3
- package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +23 -15
- package/lib/cjs/components/livechatwidget/common/startChat.js +45 -14
- package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +84 -40
- package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +1 -1
- package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +1 -0
- package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +2 -1
- package/lib/cjs/contexts/createReducer.js +8 -0
- package/lib/esm/common/Constants.js +2 -0
- package/lib/esm/common/telemetry/TelemetryConstants.js +2 -0
- package/lib/esm/common/utils.js +11 -5
- package/lib/esm/components/headerstateful/HeaderStateful.js +2 -1
- package/lib/esm/components/livechatwidget/common/ActivityStreamHandler.js +34 -0
- package/lib/esm/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +29 -0
- package/lib/esm/components/livechatwidget/common/Deferred.js +33 -0
- package/lib/esm/components/livechatwidget/common/createAdapter.js +4 -1
- package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +2 -5
- package/lib/esm/components/livechatwidget/common/endChat.js +3 -3
- package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +24 -17
- package/lib/esm/components/livechatwidget/common/startChat.js +44 -16
- package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +83 -42
- package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +1 -1
- package/lib/esm/contexts/common/LiveChatWidgetActionType.js +1 -0
- package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +2 -1
- package/lib/esm/contexts/createReducer.js +8 -0
- package/lib/types/common/Constants.d.ts +1 -0
- package/lib/types/common/telemetry/TelemetryConstants.d.ts +2 -0
- package/lib/types/common/telemetry/TelemetryHelper.d.ts +1 -1
- package/lib/types/common/utils.d.ts +4 -4
- package/lib/types/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.d.ts +1 -1
- package/lib/types/components/headerstateful/interfaces/IHeaderStatefulParams.d.ts +2 -1
- package/lib/types/components/livechatwidget/common/ActivityStreamHandler.d.ts +14 -0
- package/lib/types/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.d.ts +7 -0
- package/lib/types/components/livechatwidget/common/Deferred.d.ts +9 -0
- package/lib/types/components/livechatwidget/common/endChat.d.ts +1 -1
- package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +5 -5
- package/lib/types/components/livechatwidget/common/setPostChatContextAndLoadSurvey.d.ts +1 -1
- package/lib/types/components/livechatwidget/common/startChat.d.ts +3 -3
- package/lib/types/components/livechatwidget/common/startProactiveChat.d.ts +1 -1
- package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetControlProps.d.ts +1 -0
- package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +1 -2
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.d.ts +1 -1
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware.d.ts +1 -1
- package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
- package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +2 -1
- package/package.json +4 -3
- package/lib/cjs/components/livechatwidget/interfaces/IAuthProps.js +0 -1
- package/lib/esm/components/livechatwidget/interfaces/IAuthProps.js +0 -1
- package/lib/types/components/livechatwidget/interfaces/IAuthProps.d.ts +0 -4
|
@@ -3,9 +3,8 @@ import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/teleme
|
|
|
3
3
|
import { BroadcastService } from "@microsoft/omnichannel-chat-components";
|
|
4
4
|
import { ConversationState } from "../../../contexts/common/ConversationState";
|
|
5
5
|
import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
|
|
6
|
-
import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
|
|
6
|
+
import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper"; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
7
|
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
8
|
const getChatReconnectContext = async (chatSDK, reconnectId) => {
|
|
10
9
|
try {
|
|
11
10
|
if (reconnectId) {
|
|
@@ -30,9 +29,17 @@ const getChatReconnectContext = async (chatSDK, reconnectId) => {
|
|
|
30
29
|
|
|
31
30
|
|
|
32
31
|
const getReconnectIdForAuthenticatedChat = async (props, chatSDK) => {
|
|
33
|
-
var _props$
|
|
32
|
+
var _props$chatConfig, _props$reconnectChatP;
|
|
34
33
|
|
|
35
|
-
|
|
34
|
+
let authClientFunction = undefined;
|
|
35
|
+
|
|
36
|
+
if ((_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && _props$chatConfig.LiveChatConfigAuthSettings) {
|
|
37
|
+
var _props$chatConfig2, _props$chatConfig2$Li;
|
|
38
|
+
|
|
39
|
+
authClientFunction = ((_props$chatConfig2 = props.chatConfig) === null || _props$chatConfig2 === void 0 ? void 0 : (_props$chatConfig2$Li = _props$chatConfig2.LiveChatConfigAuthSettings) === null || _props$chatConfig2$Li === void 0 ? void 0 : _props$chatConfig2$Li.msdyn_javascriptclientfunction) ?? undefined;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if ((_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.isReconnectEnabled && authClientFunction // TODO: Implement this after storage is in place
|
|
36
43
|
|
|
37
44
|
/* && !isLoadWithState() */
|
|
38
45
|
) {
|
|
@@ -47,27 +54,27 @@ const getReconnectIdForAuthenticatedChat = async (props, chatSDK) => {
|
|
|
47
54
|
}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
48
55
|
|
|
49
56
|
|
|
50
|
-
const handleUnauthenticatedReconnectChat = async (chatSDK,
|
|
57
|
+
const handleUnauthenticatedReconnectChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat, redirectInSameWindow) => {
|
|
51
58
|
const reconnectAvailabilityResponse = await getChatReconnectContext(chatSDK, reconnectId);
|
|
52
59
|
|
|
53
60
|
if (shouldRedirectOrStartNewChat(reconnectAvailabilityResponse)) {
|
|
54
|
-
await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK,
|
|
61
|
+
await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, redirectInSameWindow);
|
|
55
62
|
} else {
|
|
56
|
-
await setReconnectIdAndStartChat(chatSDK,
|
|
63
|
+
await setReconnectIdAndStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat);
|
|
57
64
|
}
|
|
58
65
|
}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
66
|
|
|
60
67
|
|
|
61
|
-
const startUnauthenticatedReconnectChat = async (chatSDK,
|
|
68
|
+
const startUnauthenticatedReconnectChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat) => {
|
|
62
69
|
const reconnectAvailabilityResponse = await getChatReconnectContext(chatSDK, reconnectId);
|
|
63
70
|
|
|
64
71
|
if (!shouldRedirectOrStartNewChat(reconnectAvailabilityResponse)) {
|
|
65
|
-
await setReconnectIdAndStartChat(chatSDK,
|
|
72
|
+
await setReconnectIdAndStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat);
|
|
66
73
|
}
|
|
67
74
|
}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
75
|
|
|
69
76
|
|
|
70
|
-
const setReconnectIdAndStartChat = async (chatSDK,
|
|
77
|
+
const setReconnectIdAndStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat) => {
|
|
71
78
|
const startUnauthenticatedReconnectChat = {
|
|
72
79
|
eventName: BroadcastEvent.StartUnauthenticatedReconnectChat
|
|
73
80
|
};
|
|
@@ -83,7 +90,7 @@ const setReconnectIdAndStartChat = async (chatSDK, authProps, dispatch, setAdapt
|
|
|
83
90
|
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
84
91
|
payload: ConversationState.Loading
|
|
85
92
|
});
|
|
86
|
-
await initStartChat(chatSDK,
|
|
93
|
+
await initStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, optionalParams);
|
|
87
94
|
};
|
|
88
95
|
|
|
89
96
|
const redirectPage = (redirectURL, redirectInSameWindow) => {
|
|
@@ -105,7 +112,7 @@ const shouldRedirectOrStartNewChat = reconnectAvailabilityResponse => {
|
|
|
105
112
|
}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
113
|
|
|
107
114
|
|
|
108
|
-
const startNewChatEmptyRedirectionUrl = async (chatSDK,
|
|
115
|
+
const startNewChatEmptyRedirectionUrl = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat) => {
|
|
109
116
|
const startUnauthenticatedReconnectChat = {
|
|
110
117
|
eventName: BroadcastEvent.StartUnauthenticatedReconnectChat
|
|
111
118
|
};
|
|
@@ -128,25 +135,25 @@ const startNewChatEmptyRedirectionUrl = async (chatSDK, authProps, dispatch, set
|
|
|
128
135
|
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
129
136
|
payload: ConversationState.Loading
|
|
130
137
|
});
|
|
131
|
-
await initStartChat(chatSDK,
|
|
138
|
+
await initStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter);
|
|
132
139
|
}
|
|
133
140
|
}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
134
141
|
|
|
135
142
|
|
|
136
|
-
const handleRedirectUnauthenticatedReconnectChat = async (chatSDK,
|
|
143
|
+
const handleRedirectUnauthenticatedReconnectChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, reconnectId, redirectInSameWindow) => {
|
|
137
144
|
const reconnectAvailabilityResponse = await getChatReconnectContext(chatSDK, reconnectId);
|
|
138
145
|
|
|
139
146
|
if (shouldRedirectOrStartNewChat(reconnectAvailabilityResponse)) {
|
|
140
|
-
await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK,
|
|
147
|
+
await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, redirectInSameWindow);
|
|
141
148
|
}
|
|
142
149
|
}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
143
150
|
|
|
144
151
|
|
|
145
|
-
const redirectOrStartNewChat = async (reconnectAvailabilityResponse, chatSDK,
|
|
152
|
+
const redirectOrStartNewChat = async (reconnectAvailabilityResponse, chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, redirectInSameWindow) => {
|
|
146
153
|
if (reconnectAvailabilityResponse.redirectURL) {
|
|
147
154
|
redirectPage(reconnectAvailabilityResponse.redirectURL, redirectInSameWindow);
|
|
148
155
|
} else {
|
|
149
|
-
await startNewChatEmptyRedirectionUrl(chatSDK,
|
|
156
|
+
await startNewChatEmptyRedirectionUrl(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat);
|
|
150
157
|
}
|
|
151
158
|
};
|
|
152
159
|
|
|
@@ -8,12 +8,13 @@ import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
|
|
|
8
8
|
import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
|
|
9
9
|
import { createAdapter } from "./createAdapter";
|
|
10
10
|
import { createOnNewAdapterActivityHandler } from "../../../plugins/newMessageEventHandler";
|
|
11
|
-
import { createTimer, getStateFromCache, isUndefinedOrEmpty } from "../../../common/utils";
|
|
11
|
+
import { createTimer, getStateFromCache, isNullOrEmptyString, isUndefinedOrEmpty } from "../../../common/utils";
|
|
12
12
|
import { getReconnectIdForAuthenticatedChat, handleRedirectUnauthenticatedReconnectChat } from "./reconnectChatHelper";
|
|
13
13
|
import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey";
|
|
14
14
|
import { updateSessionDataForTelemetry } from "./updateSessionDataForTelemetry";
|
|
15
15
|
import { BroadcastService } from "@microsoft/omnichannel-chat-components";
|
|
16
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
+
import { ActivityStreamHandler } from "./ActivityStreamHandler"; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
|
+
|
|
17
18
|
let optionalParams = {}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
19
|
|
|
19
20
|
const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) => {
|
|
@@ -30,7 +31,7 @@ const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) =>
|
|
|
30
31
|
if ((_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
|
|
31
32
|
var _props$reconnectChatP2, _props$reconnectChatP3;
|
|
32
33
|
|
|
33
|
-
await handleRedirectUnauthenticatedReconnectChat(chatSDK, props.
|
|
34
|
+
await handleRedirectUnauthenticatedReconnectChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, initStartChat, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, (_props$reconnectChatP3 = props.reconnectChatPaneProps) === null || _props$reconnectChatP3 === void 0 ? void 0 : _props$reconnectChatP3.redirectInSameWindow);
|
|
34
35
|
return;
|
|
35
36
|
} // Getting reconnectId for authenticated chat
|
|
36
37
|
|
|
@@ -55,11 +56,11 @@ const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) =>
|
|
|
55
56
|
const isProactiveChat = state.appStates.conversationState === ConversationState.ProactiveChat;
|
|
56
57
|
const isPreChatEnabledInProactiveChat = state.appStates.proactiveChatStates.proactiveChatEnablePrechat; //Setting PreChat and intiate chat
|
|
57
58
|
|
|
58
|
-
setPreChatAndInitiateChat(chatSDK, props.
|
|
59
|
+
setPreChatAndInitiateChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, isProactiveChat, isPreChatEnabledInProactiveChat);
|
|
59
60
|
}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
61
|
|
|
61
62
|
|
|
62
|
-
const setPreChatAndInitiateChat = async (chatSDK,
|
|
63
|
+
const setPreChatAndInitiateChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, isProactiveChat, proactiveChatEnablePrechatState) => {
|
|
63
64
|
// Getting prechat Survey Context
|
|
64
65
|
const parseToJson = false;
|
|
65
66
|
const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
|
|
@@ -82,11 +83,40 @@ const setPreChatAndInitiateChat = async (chatSDK, authProps, dispatch, setAdapte
|
|
|
82
83
|
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
83
84
|
payload: ConversationState.Loading
|
|
84
85
|
});
|
|
85
|
-
await initStartChat(chatSDK,
|
|
86
|
+
await initStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter);
|
|
87
|
+
}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
const handleAuthentication = async (chatSDK, chatConfig, getAuthToken) => {
|
|
91
|
+
if (getAuthToken) {
|
|
92
|
+
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
93
|
+
Event: TelemetryEvent.GetAuthTokenCalled
|
|
94
|
+
});
|
|
95
|
+
let authClientFunction = undefined;
|
|
96
|
+
|
|
97
|
+
if (chatConfig !== null && chatConfig !== void 0 && chatConfig.LiveChatConfigAuthSettings) {
|
|
98
|
+
var _chatConfig$LiveChatC;
|
|
99
|
+
|
|
100
|
+
authClientFunction = (chatConfig === null || chatConfig === void 0 ? void 0 : (_chatConfig$LiveChatC = chatConfig.LiveChatConfigAuthSettings) === null || _chatConfig$LiveChatC === void 0 ? void 0 : _chatConfig$LiveChatC.msdyn_javascriptclientfunction) ?? undefined;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const token = await getAuthToken(authClientFunction);
|
|
104
|
+
|
|
105
|
+
if (!isNullOrEmptyString(token)) {
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
+
chatSDK.setAuthTokenProvider(async () => {
|
|
108
|
+
return token;
|
|
109
|
+
});
|
|
110
|
+
} else {
|
|
111
|
+
TelemetryHelper.logActionEvent(LogLevel.ERROR, {
|
|
112
|
+
Event: TelemetryEvent.ReceivedNullOrEmptyToken
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
86
116
|
}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
117
|
|
|
88
118
|
|
|
89
|
-
const initStartChat = async (chatSDK,
|
|
119
|
+
const initStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, params, persistedState) => {
|
|
90
120
|
try {
|
|
91
121
|
var _newAdapter$activity$, _TelemetryTimers$Widg;
|
|
92
122
|
|
|
@@ -113,10 +143,7 @@ const initStartChat = async (chatSDK, authProps, dispatch, setAdapter, params, p
|
|
|
113
143
|
|
|
114
144
|
optionalParams = Object.assign({}, params, optionalParams); // set auth token to chat sdk before start chat
|
|
115
145
|
|
|
116
|
-
|
|
117
|
-
await authProps.setAuthTokenProviderToChatSdk(chatSDK, authProps.authClientFunction);
|
|
118
|
-
}
|
|
119
|
-
|
|
146
|
+
await handleAuthentication(chatSDK, chatConfig, getAuthToken);
|
|
120
147
|
await chatSDK.startChat(optionalParams);
|
|
121
148
|
isStartChatSuccessful = true;
|
|
122
149
|
} catch (error) {
|
|
@@ -167,6 +194,7 @@ const initStartChat = async (chatSDK, authProps, dispatch, setAdapter, params, p
|
|
|
167
194
|
await updateSessionDataForTelemetry(chatSDK, dispatch); // Set app state to Active
|
|
168
195
|
|
|
169
196
|
if (isStartChatSuccessful) {
|
|
197
|
+
ActivityStreamHandler.uncork();
|
|
170
198
|
dispatch({
|
|
171
199
|
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
172
200
|
payload: ConversationState.Active
|
|
@@ -204,14 +232,14 @@ const initStartChat = async (chatSDK, authProps, dispatch, setAdapter, params, p
|
|
|
204
232
|
|
|
205
233
|
|
|
206
234
|
const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
|
|
207
|
-
var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _persistedState$domai6, _persistedState$appSt;
|
|
235
|
+
var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _props$controlProps, _persistedState$domai6, _persistedState$appSt;
|
|
208
236
|
|
|
209
237
|
// By pass this function in case of popout chat
|
|
210
238
|
if (state.appStates.skipChatButtonRendering === true) {
|
|
211
239
|
return false;
|
|
212
240
|
}
|
|
213
241
|
|
|
214
|
-
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC === void 0 ? void 0 : _chatSDK$omnichannelC.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.widgetId); //Connect to only active chat session
|
|
242
|
+
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC === void 0 ? void 0 : _chatSDK$omnichannelC.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.widgetInstanceId) ?? ""); //Connect to only active chat session
|
|
215
243
|
|
|
216
244
|
if (persistedState && !isUndefinedOrEmpty(persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai6 = persistedState.domainStates) === null || _persistedState$domai6 === void 0 ? void 0 : _persistedState$domai6.liveChatContext) && (persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$appSt = persistedState.appStates) === null || _persistedState$appSt === void 0 ? void 0 : _persistedState$appSt.conversationState) === ConversationState.Active) {
|
|
217
245
|
var _persistedState$domai7;
|
|
@@ -223,7 +251,7 @@ const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdap
|
|
|
223
251
|
const optionalParams = {
|
|
224
252
|
liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai7 = persistedState.domainStates) === null || _persistedState$domai7 === void 0 ? void 0 : _persistedState$domai7.liveChatContext
|
|
225
253
|
};
|
|
226
|
-
await initStartChat(chatSDK, props.
|
|
254
|
+
await initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams, persistedState);
|
|
227
255
|
return true;
|
|
228
256
|
} else {
|
|
229
257
|
return false;
|
|
@@ -232,10 +260,10 @@ const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdap
|
|
|
232
260
|
|
|
233
261
|
|
|
234
262
|
const setCustomContextParams = (props, chatSDK) => {
|
|
235
|
-
var _chatSDK$omnichannelC3, _chatSDK$omnichannelC4, _props$chatConfig, _persistedState$domai8;
|
|
263
|
+
var _chatSDK$omnichannelC3, _chatSDK$omnichannelC4, _props$controlProps2, _props$chatConfig, _persistedState$domai8;
|
|
236
264
|
|
|
237
265
|
// Add custom context only for unauthenticated chat
|
|
238
|
-
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC3 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC3 === void 0 ? void 0 : _chatSDK$omnichannelC3.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC4 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC4 === void 0 ? void 0 : _chatSDK$omnichannelC4.widgetId);
|
|
266
|
+
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC3 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC3 === void 0 ? void 0 : _chatSDK$omnichannelC3.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC4 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC4 === void 0 ? void 0 : _chatSDK$omnichannelC4.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.widgetInstanceId) ?? "");
|
|
239
267
|
|
|
240
268
|
if (!((_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && _props$chatConfig.LiveChatConfigAuthSettings) && !isUndefinedOrEmpty(persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai8 = persistedState.domainStates) === null || _persistedState$domai8 === void 0 ? void 0 : _persistedState$domai8.customContext)) {
|
|
241
269
|
var _persistedState$domai9;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
2
|
|
|
3
3
|
import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
|
|
4
|
-
import { BroadcastService, decodeComponentString } from "@microsoft/omnichannel-chat-components";
|
|
4
|
+
import { BroadcastService, decodeComponentString, BroadcastServiceInitialize } from "@microsoft/omnichannel-chat-components";
|
|
5
5
|
import { Stack } from "@fluentui/react";
|
|
6
6
|
import React, { useEffect, useRef, useState } from "react";
|
|
7
|
-
import { createTimer, getLocaleDirection, getStateFromCache, getWidgetCacheId, getWidgetEndChatEventName, isUndefinedOrEmpty } from "../../../common/utils";
|
|
7
|
+
import { createTimer, getLocaleDirection, getStateFromCache, getWidgetCacheId, getWidgetEndChatEventName, isNullOrEmptyString, isUndefinedOrEmpty } from "../../../common/utils";
|
|
8
8
|
import { getReconnectIdForAuthenticatedChat, handleUnauthenticatedReconnectChat, startUnauthenticatedReconnectChat } from "../common/reconnectChatHelper";
|
|
9
9
|
import { initStartChat, prepareStartChat, setPreChatAndInitiateChat } from "../common/startChat";
|
|
10
10
|
import { shouldShowCallingContainer, shouldShowChatButton, shouldShowConfirmationPane, shouldShowEmailTranscriptPane, shouldShowHeader, shouldShowLoadingPane, shouldShowOutOfOfficeHoursPane, shouldShowPostChatLoadingPane, shouldShowPostChatSurveyPane, shouldShowPreChatSurveyPane, shouldShowProactiveChatPane, shouldShowReconnectChatPane, shouldShowWebChatContainer } from "../../../controller/componentController";
|
|
@@ -43,8 +43,10 @@ import { startProactiveChat } from "../common/startProactiveChat";
|
|
|
43
43
|
import useChatAdapterStore from "../../../hooks/useChatAdapterStore";
|
|
44
44
|
import useChatContextStore from "../../../hooks/useChatContextStore";
|
|
45
45
|
import useChatSDKStore from "../../../hooks/useChatSDKStore";
|
|
46
|
+
import { ActivityStreamHandler } from "../common/ActivityStreamHandler";
|
|
47
|
+
import { Constants } from "../../../common/Constants";
|
|
46
48
|
export const LiveChatWidgetStateful = props => {
|
|
47
|
-
var _props$webChatContain, _props$styleProps, _props$controlProps, _props$webChatContain3, _props$webChatContain4, _props$styleProps2, _props$
|
|
49
|
+
var _props$webChatContain, _props$styleProps, _props$controlProps, _props$webChatContain3, _props$webChatContain4, _props$styleProps2, _props$controlProps13, _props$controlProps14, _props$componentOverr, _props$controlProps15, _props$componentOverr2, _props$controlProps16, _props$componentOverr3, _props$controlProps17, _props$componentOverr4, _props$controlProps18, _props$componentOverr5, _props$controlProps19, _props$componentOverr6, _props$controlProps20, _props$componentOverr7, _props$controlProps21, _props$controlProps22, _props$componentOverr8, _props$controlProps23, _props$componentOverr9, _props$controlProps24, _props$componentOverr10, _props$componentOverr11, _props$componentOverr12;
|
|
48
50
|
|
|
49
51
|
const [state, dispatch] = useChatContextStore(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
52
|
|
|
@@ -70,19 +72,13 @@ export const LiveChatWidgetStateful = props => {
|
|
|
70
72
|
let widgetStateEventName = "";
|
|
71
73
|
|
|
72
74
|
const initiateEndChatOnBrowserUnload = () => {
|
|
73
|
-
var
|
|
75
|
+
var _DataStoreManager$cli;
|
|
74
76
|
|
|
75
77
|
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
76
78
|
Event: TelemetryEvent.BrowserUnloadEventStarted,
|
|
77
79
|
Description: "Browser unload event received."
|
|
78
80
|
});
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (persistedState.appStates.conversationState === ConversationState.Active) {
|
|
82
|
-
//Browser close scenario/no room for PCS/so just end chat and notify agent immidiately
|
|
83
|
-
endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
|
|
84
|
-
} // Clean local storage
|
|
85
|
-
|
|
81
|
+
endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false); // Clean local storage
|
|
86
82
|
|
|
87
83
|
(_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.removeData(widgetStateEventName, "localStorage"); //Dispose calling instance
|
|
88
84
|
|
|
@@ -97,8 +93,9 @@ export const LiveChatWidgetStateful = props => {
|
|
|
97
93
|
};
|
|
98
94
|
|
|
99
95
|
useEffect(() => {
|
|
100
|
-
var _props$controlProps2, _props$controlProps3, _props$chatConfig, _props$chatConfig$Cha, _props$
|
|
96
|
+
var _props$chatSDK, _props$chatSDK$omnich, _props$controlProps2, _props$controlProps3, _props$controlProps4, _props$controlProps6, _props$chatConfig, _props$chatConfig$Cha, _props$controlProps7, _props$reconnectChatP, _props$chatConfig2, _props$chatConfig2$Li;
|
|
101
97
|
|
|
98
|
+
BroadcastServiceInitialize((_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.widgetId);
|
|
102
99
|
registerTelemetryLoggers(props, dispatch);
|
|
103
100
|
createInternetConnectionChangeHandler();
|
|
104
101
|
DataStoreManager.clientDataStore = props.contextDataStore ?? undefined;
|
|
@@ -114,6 +111,16 @@ export const LiveChatWidgetStateful = props => {
|
|
|
114
111
|
type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
|
|
115
112
|
payload: false
|
|
116
113
|
});
|
|
114
|
+
|
|
115
|
+
if ((_props$controlProps3 = props.controlProps) !== null && _props$controlProps3 !== void 0 && _props$controlProps3.widgetInstanceId && !isNullOrEmptyString((_props$controlProps4 = props.controlProps) === null || _props$controlProps4 === void 0 ? void 0 : _props$controlProps4.widgetInstanceId)) {
|
|
116
|
+
var _props$controlProps5;
|
|
117
|
+
|
|
118
|
+
dispatch({
|
|
119
|
+
type: LiveChatWidgetActionType.SET_WIDGET_INSTANCE_ID,
|
|
120
|
+
payload: (_props$controlProps5 = props.controlProps) === null || _props$controlProps5 === void 0 ? void 0 : _props$controlProps5.widgetInstanceId
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
117
124
|
initCallingSdk(chatSDK, setVoiceVideoCallingSDK).then(sdkCreated => {
|
|
118
125
|
sdkCreated && dispatch({
|
|
119
126
|
type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
|
|
@@ -121,16 +128,16 @@ export const LiveChatWidgetStateful = props => {
|
|
|
121
128
|
});
|
|
122
129
|
}); // Initialize global dir
|
|
123
130
|
|
|
124
|
-
const globalDir = ((_props$
|
|
131
|
+
const globalDir = ((_props$controlProps6 = props.controlProps) === null || _props$controlProps6 === void 0 ? void 0 : _props$controlProps6.dir) ?? getLocaleDirection((_props$chatConfig = props.chatConfig) === null || _props$chatConfig === void 0 ? void 0 : (_props$chatConfig$Cha = _props$chatConfig.ChatWidgetLanguage) === null || _props$chatConfig$Cha === void 0 ? void 0 : _props$chatConfig$Cha.msdyn_localeid);
|
|
125
132
|
dispatch({
|
|
126
133
|
type: LiveChatWidgetActionType.SET_GLOBAL_DIR,
|
|
127
134
|
payload: globalDir
|
|
128
135
|
});
|
|
129
136
|
|
|
130
|
-
if (!((_props$
|
|
137
|
+
if (!((_props$controlProps7 = props.controlProps) !== null && _props$controlProps7 !== void 0 && _props$controlProps7.skipChatButtonRendering) && (_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
|
|
131
138
|
var _props$reconnectChatP2;
|
|
132
139
|
|
|
133
|
-
startUnauthenticatedReconnectChat(chatSDK, props.
|
|
140
|
+
startUnauthenticatedReconnectChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
|
|
134
141
|
return;
|
|
135
142
|
} // Check if auth settings enabled, do not connect to existing chat from cache during refresh/re-load
|
|
136
143
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -138,7 +145,7 @@ export const LiveChatWidgetStateful = props => {
|
|
|
138
145
|
|
|
139
146
|
const isAuthenticationSettingsEnabled = (_props$chatConfig2 = props.chatConfig) !== null && _props$chatConfig2 !== void 0 && (_props$chatConfig2$Li = _props$chatConfig2.LiveChatConfigAuthSettings) !== null && _props$chatConfig2$Li !== void 0 && _props$chatConfig2$Li.msdyn_javascriptclientfunction ? true : false;
|
|
140
147
|
|
|
141
|
-
if (
|
|
148
|
+
if (isAuthenticationSettingsEnabled === false) {
|
|
142
149
|
var _state$domainStates;
|
|
143
150
|
|
|
144
151
|
if (!isUndefinedOrEmpty((_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : _state$domainStates.liveChatContext) && state.appStates.conversationState === ConversationState.Active) {
|
|
@@ -147,7 +154,7 @@ export const LiveChatWidgetStateful = props => {
|
|
|
147
154
|
const optionalParams = {
|
|
148
155
|
liveChatContext: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.liveChatContext
|
|
149
156
|
};
|
|
150
|
-
initStartChat(chatSDK, props.
|
|
157
|
+
initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams);
|
|
151
158
|
return;
|
|
152
159
|
}
|
|
153
160
|
} // All other case should show start chat button, skipChatButtonRendering will take care of it own
|
|
@@ -170,7 +177,7 @@ export const LiveChatWidgetStateful = props => {
|
|
|
170
177
|
if ((_props$reconnectChatP3 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP3 !== void 0 && _props$reconnectChatP3.reconnectId && !state.appStates.reconnectId) {
|
|
171
178
|
var _props$reconnectChatP4, _props$reconnectChatP5;
|
|
172
179
|
|
|
173
|
-
handleUnauthenticatedReconnectChat(chatSDK, props.
|
|
180
|
+
handleUnauthenticatedReconnectChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, (_props$reconnectChatP4 = props.reconnectChatPaneProps) === null || _props$reconnectChatP4 === void 0 ? void 0 : _props$reconnectChatP4.reconnectId, initStartChat, (_props$reconnectChatP5 = props.reconnectChatPaneProps) === null || _props$reconnectChatP5 === void 0 ? void 0 : _props$reconnectChatP5.redirectInSameWindow);
|
|
174
181
|
} else {
|
|
175
182
|
getReconnectIdForAuthenticatedChat(props, chatSDK).then(authReconnectId => {
|
|
176
183
|
if (authReconnectId && !state.appStates.reconnectId) {
|
|
@@ -187,7 +194,7 @@ export const LiveChatWidgetStateful = props => {
|
|
|
187
194
|
eventName: BroadcastEvent.StartChatSkippingChatButtonRendering
|
|
188
195
|
};
|
|
189
196
|
BroadcastService.postMessage(chatStartedSkippingChatButtonRendering);
|
|
190
|
-
setPreChatAndInitiateChat(chatSDK, props.
|
|
197
|
+
setPreChatAndInitiateChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter);
|
|
191
198
|
}
|
|
192
199
|
});
|
|
193
200
|
}
|
|
@@ -195,7 +202,7 @@ export const LiveChatWidgetStateful = props => {
|
|
|
195
202
|
}, [state.appStates.skipChatButtonRendering]); // useEffect for when skip chat button rendering
|
|
196
203
|
|
|
197
204
|
useEffect(() => {
|
|
198
|
-
var _chatSDK$
|
|
205
|
+
var _chatSDK$omnichannelC5, _chatSDK$omnichannelC6, _props$controlProps10;
|
|
199
206
|
|
|
200
207
|
// Add the custom context on receiving the SetCustomContext event
|
|
201
208
|
BroadcastService.getMessageByEventName(BroadcastEvent.SetCustomContext).subscribe(msg => {
|
|
@@ -227,24 +234,36 @@ export const LiveChatWidgetStateful = props => {
|
|
|
227
234
|
}); // Start chat from SDK Event
|
|
228
235
|
|
|
229
236
|
BroadcastService.getMessageByEventName(BroadcastEvent.StartChat).subscribe(() => {
|
|
230
|
-
var _chatSDK$
|
|
237
|
+
var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _props$controlProps8;
|
|
231
238
|
|
|
232
239
|
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
233
240
|
Event: TelemetryEvent.StartChatEventRecevied,
|
|
234
241
|
Description: "Start chat event received."
|
|
235
242
|
});
|
|
236
|
-
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$
|
|
243
|
+
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC === void 0 ? void 0 : _chatSDK$omnichannelC.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps8 = props.controlProps) === null || _props$controlProps8 === void 0 ? void 0 : _props$controlProps8.widgetInstanceId) ?? ""); // Chat not found in cache
|
|
237
244
|
|
|
238
|
-
if (persistedState
|
|
239
|
-
// Embedded mode
|
|
245
|
+
if (persistedState === undefined) {
|
|
240
246
|
BroadcastService.postMessage({
|
|
241
247
|
eventName: BroadcastEvent.ChatInitiated
|
|
242
248
|
});
|
|
243
249
|
prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
|
|
244
|
-
|
|
250
|
+
return;
|
|
251
|
+
} // Chat exist in cache
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
if (persistedState) {
|
|
245
255
|
var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4;
|
|
246
256
|
|
|
247
|
-
//
|
|
257
|
+
// Only initiate new chat if widget state in cache in one of the followings
|
|
258
|
+
if (persistedState.appStates.conversationState === ConversationState.Closed || persistedState.appStates.conversationState === ConversationState.InActive || persistedState.appStates.conversationState === ConversationState.Postchat) {
|
|
259
|
+
BroadcastService.postMessage({
|
|
260
|
+
eventName: BroadcastEvent.ChatInitiated
|
|
261
|
+
});
|
|
262
|
+
prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
|
|
263
|
+
return;
|
|
264
|
+
} // If minimized, maximize the chat
|
|
265
|
+
|
|
266
|
+
|
|
248
267
|
dispatch({
|
|
249
268
|
type: LiveChatWidgetActionType.SET_MINIMIZED,
|
|
250
269
|
payload: false
|
|
@@ -261,10 +280,10 @@ export const LiveChatWidgetStateful = props => {
|
|
|
261
280
|
|
|
262
281
|
BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChat).subscribe(async () => {
|
|
263
282
|
if (state.appStates.skipChatButtonRendering !== true) {
|
|
264
|
-
var _chatSDK$
|
|
283
|
+
var _chatSDK$omnichannelC3, _chatSDK$omnichannelC4, _props$controlProps9;
|
|
265
284
|
|
|
266
285
|
// This is to ensure to get latest state from cache in multitab
|
|
267
|
-
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$
|
|
286
|
+
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC3 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC3 === void 0 ? void 0 : _chatSDK$omnichannelC3.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC4 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC4 === void 0 ? void 0 : _chatSDK$omnichannelC4.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps9 = props.controlProps) === null || _props$controlProps9 === void 0 ? void 0 : _props$controlProps9.widgetInstanceId) ?? "");
|
|
268
287
|
|
|
269
288
|
if (persistedState && persistedState.appStates.conversationState === ConversationState.Active) {
|
|
270
289
|
prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
|
|
@@ -284,9 +303,10 @@ export const LiveChatWidgetStateful = props => {
|
|
|
284
303
|
initiateEndChatOnBrowserUnload();
|
|
285
304
|
}); // Listen to end chat event from other tabs
|
|
286
305
|
|
|
287
|
-
const endChatEventName = getWidgetEndChatEventName(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$
|
|
306
|
+
const endChatEventName = getWidgetEndChatEventName(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC5 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC5 === void 0 ? void 0 : _chatSDK$omnichannelC5.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC6 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC6 === void 0 ? void 0 : _chatSDK$omnichannelC6.widgetId, ((_props$controlProps10 = props.controlProps) === null || _props$controlProps10 === void 0 ? void 0 : _props$controlProps10.widgetInstanceId) ?? "");
|
|
288
307
|
BroadcastService.getMessageByEventName(endChatEventName).subscribe(async () => {
|
|
289
308
|
endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
|
|
309
|
+
return;
|
|
290
310
|
}); // When conversation ended by agent
|
|
291
311
|
|
|
292
312
|
if (state.appStates.conversationEndedByAgent) {
|
|
@@ -326,6 +346,12 @@ export const LiveChatWidgetStateful = props => {
|
|
|
326
346
|
}, [state.appStates.conversationState, state.appStates.proactiveChatStates.proactiveChatInNewWindow]); // Reset the UnreadMessageCount when minimized is toggled and broadcast it.
|
|
327
347
|
|
|
328
348
|
useEffect(() => {
|
|
349
|
+
if (state.appStates.isMinimized) {
|
|
350
|
+
ActivityStreamHandler.cork();
|
|
351
|
+
} else {
|
|
352
|
+
setTimeout(() => ActivityStreamHandler.uncork(), 500);
|
|
353
|
+
}
|
|
354
|
+
|
|
329
355
|
currentMessageCountRef.current = -1;
|
|
330
356
|
dispatch({
|
|
331
357
|
type: LiveChatWidgetActionType.SET_UNREAD_MESSAGE_COUNT,
|
|
@@ -358,22 +384,37 @@ export const LiveChatWidgetStateful = props => {
|
|
|
358
384
|
}, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]); // Publish chat widget state
|
|
359
385
|
|
|
360
386
|
useEffect(() => {
|
|
361
|
-
var _props$
|
|
387
|
+
var _props$controlProps11, _props$chatSDK2, _props$chatSDK2$omnic, _props$chatSDK3, _props$chatSDK3$omnic, _props$controlProps12;
|
|
362
388
|
|
|
363
|
-
|
|
389
|
+
// Only activate these windows events when conversation state is active and chat widget is in popout mode
|
|
390
|
+
// Ghost chat scenarios
|
|
391
|
+
if (state.appStates.conversationState === ConversationState.Active && ((_props$controlProps11 = props.controlProps) === null || _props$controlProps11 === void 0 ? void 0 : _props$controlProps11.skipChatButtonRendering) === true) {
|
|
392
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
393
|
+
window.onbeforeunload = function () {
|
|
394
|
+
const prompt = Constants.BrowserUnloadConfirmationMessage;
|
|
395
|
+
return prompt;
|
|
396
|
+
}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
window.onunload = function () {
|
|
400
|
+
initiateEndChatOnBrowserUnload();
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
widgetStateEventName = getWidgetCacheId(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.orgId, props === null || props === void 0 ? void 0 : (_props$chatSDK3 = props.chatSDK) === null || _props$chatSDK3 === void 0 ? void 0 : (_props$chatSDK3$omnic = _props$chatSDK3.omnichannelConfig) === null || _props$chatSDK3$omnic === void 0 ? void 0 : _props$chatSDK3$omnic.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps12 = props.controlProps) === null || _props$controlProps12 === void 0 ? void 0 : _props$controlProps12.widgetInstanceId) ?? "");
|
|
364
405
|
const chatWidgetStateChangeEvent = {
|
|
365
406
|
eventName: widgetStateEventName,
|
|
366
407
|
payload: { ...state
|
|
367
408
|
}
|
|
368
409
|
};
|
|
369
410
|
BroadcastService.postMessage(chatWidgetStateChangeEvent);
|
|
370
|
-
}, [state]);
|
|
411
|
+
}, [state.appStates.conversationState]);
|
|
371
412
|
const webChatProps = initWebChatComposer(props, chatSDK, state, dispatch, setWebChatStyles);
|
|
372
413
|
|
|
373
414
|
const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch); // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
374
415
|
|
|
375
416
|
|
|
376
|
-
const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat) => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat); // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
417
|
+
const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat, postMessageToOtherTab) => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat, postMessageToOtherTab); // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
377
418
|
|
|
378
419
|
|
|
379
420
|
const prepareEndChatRelay = (adapter, state) => prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
|
|
@@ -381,7 +422,7 @@ export const LiveChatWidgetStateful = props => {
|
|
|
381
422
|
const prepareStartChatRelay = () => prepareStartChat(props, chatSDK, state, dispatch, setAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
382
423
|
|
|
383
424
|
|
|
384
|
-
const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, props.
|
|
425
|
+
const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams, persistedState);
|
|
385
426
|
|
|
386
427
|
const confirmationPaneProps = initConfirmationPropsComposer(props);
|
|
387
428
|
return /*#__PURE__*/React.createElement(Composer, _extends({}, webChatProps, {
|
|
@@ -391,28 +432,28 @@ export const LiveChatWidgetStateful = props => {
|
|
|
391
432
|
id: widgetElementId,
|
|
392
433
|
styles: generalStyles,
|
|
393
434
|
className: (_props$styleProps2 = props.styleProps) === null || _props$styleProps2 === void 0 ? void 0 : _props$styleProps2.className
|
|
394
|
-
}, !((_props$
|
|
435
|
+
}, !((_props$controlProps13 = props.controlProps) !== null && _props$controlProps13 !== void 0 && _props$controlProps13.hideChatButton) && !((_props$controlProps14 = props.controlProps) !== null && _props$controlProps14 !== void 0 && _props$controlProps14.skipChatButtonRendering) && shouldShowChatButton(state) && (decodeComponentString((_props$componentOverr = props.componentOverrides) === null || _props$componentOverr === void 0 ? void 0 : _props$componentOverr.chatButton) || /*#__PURE__*/React.createElement(ChatButtonStateful, {
|
|
395
436
|
buttonProps: props.chatButtonProps,
|
|
396
437
|
outOfOfficeButtonProps: props.outOfOfficeChatButtonProps,
|
|
397
438
|
startChat: prepareStartChatRelay
|
|
398
|
-
})), !((_props$
|
|
439
|
+
})), !((_props$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.hideProactiveChatPane) && shouldShowProactiveChatPane(state) && (decodeComponentString((_props$componentOverr2 = props.componentOverrides) === null || _props$componentOverr2 === void 0 ? void 0 : _props$componentOverr2.proactiveChatPane) || /*#__PURE__*/React.createElement(ProactiveChatPaneStateful, {
|
|
399
440
|
proactiveChatProps: props.proactiveChatPaneProps,
|
|
400
441
|
startChat: prepareStartChatRelay
|
|
401
|
-
})), !((_props$
|
|
442
|
+
})), !((_props$controlProps16 = props.controlProps) !== null && _props$controlProps16 !== void 0 && _props$controlProps16.hideHeader) && shouldShowHeader(state) && (decodeComponentString((_props$componentOverr3 = props.componentOverrides) === null || _props$componentOverr3 === void 0 ? void 0 : _props$componentOverr3.header) || /*#__PURE__*/React.createElement(HeaderStateful, {
|
|
402
443
|
headerProps: props.headerProps,
|
|
403
444
|
outOfOfficeHeaderProps: props.outOfOfficeHeaderProps,
|
|
404
445
|
endChat: endChatRelay
|
|
405
|
-
})), !((_props$
|
|
446
|
+
})), !((_props$controlProps17 = props.controlProps) !== null && _props$controlProps17 !== void 0 && _props$controlProps17.hideLoadingPane) && shouldShowLoadingPane(state) && (decodeComponentString((_props$componentOverr4 = props.componentOverrides) === null || _props$componentOverr4 === void 0 ? void 0 : _props$componentOverr4.loadingPane) || /*#__PURE__*/React.createElement(LoadingPaneStateful, props.loadingPaneProps)), !((_props$controlProps18 = props.controlProps) !== null && _props$controlProps18 !== void 0 && _props$controlProps18.hideOutOfOfficeHoursPane) && shouldShowOutOfOfficeHoursPane(state) && (decodeComponentString((_props$componentOverr5 = props.componentOverrides) === null || _props$componentOverr5 === void 0 ? void 0 : _props$componentOverr5.outOfOfficeHoursPane) || /*#__PURE__*/React.createElement(OutOfOfficeHoursPaneStateful, props.outOfOfficeHoursPaneProps)), !((_props$controlProps19 = props.controlProps) !== null && _props$controlProps19 !== void 0 && _props$controlProps19.hideReconnectChatPane) && shouldShowReconnectChatPane(state) && (decodeComponentString((_props$componentOverr6 = props.componentOverrides) === null || _props$componentOverr6 === void 0 ? void 0 : _props$componentOverr6.reconnectChatPane) || /*#__PURE__*/React.createElement(ReconnectChatPaneStateful, {
|
|
406
447
|
reconnectChatProps: props.reconnectChatPaneProps,
|
|
407
448
|
initStartChat: initStartChatRelay
|
|
408
|
-
})), !((_props$
|
|
449
|
+
})), !((_props$controlProps20 = props.controlProps) !== null && _props$controlProps20 !== void 0 && _props$controlProps20.hidePreChatSurveyPane) && shouldShowPreChatSurveyPane(state) && (decodeComponentString((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.preChatSurveyPane) || /*#__PURE__*/React.createElement(PreChatSurveyPaneStateful, {
|
|
409
450
|
surveyProps: props.preChatSurveyPaneProps,
|
|
410
451
|
initStartChat: initStartChatRelay
|
|
411
|
-
})), !((_props$
|
|
452
|
+
})), !((_props$controlProps21 = props.controlProps) !== null && _props$controlProps21 !== void 0 && _props$controlProps21.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
|
|
412
453
|
voiceVideoCallingSdk: voiceVideoCallingSDK
|
|
413
|
-
}, props.callingContainerProps)), !((_props$
|
|
454
|
+
}, props.callingContainerProps)), !((_props$controlProps22 = props.controlProps) !== null && _props$controlProps22 !== void 0 && _props$controlProps22.hideWebChatContainer) && shouldShowWebChatContainer(state) && (decodeComponentString((_props$componentOverr8 = props.componentOverrides) === null || _props$componentOverr8 === void 0 ? void 0 : _props$componentOverr8.webChatContainer) || /*#__PURE__*/React.createElement(WebChatContainerStateful, props.webChatContainerProps)), !((_props$controlProps23 = props.controlProps) !== null && _props$controlProps23 !== void 0 && _props$controlProps23.hideConfirmationPane) && shouldShowConfirmationPane(state) && (decodeComponentString((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.confirmationPane) || /*#__PURE__*/React.createElement(ConfirmationPaneStateful, _extends({}, confirmationPaneProps, {
|
|
414
455
|
setPostChatContext: setPostChatContextRelay,
|
|
415
456
|
prepareEndChat: prepareEndChatRelay
|
|
416
|
-
}))), !((_props$
|
|
457
|
+
}))), !((_props$controlProps24 = props.controlProps) !== null && _props$controlProps24 !== void 0 && _props$controlProps24.hidePostChatLoadingPane) && shouldShowPostChatLoadingPane(state) && (decodeComponentString((_props$componentOverr10 = props.componentOverrides) === null || _props$componentOverr10 === void 0 ? void 0 : _props$componentOverr10.postChatLoadingPane) || /*#__PURE__*/React.createElement(PostChatLoadingPaneStateful, props.postChatLoadingPaneProps)), shouldShowPostChatSurveyPane(state) && (decodeComponentString((_props$componentOverr11 = props.componentOverrides) === null || _props$componentOverr11 === void 0 ? void 0 : _props$componentOverr11.postChatSurveyPane) || /*#__PURE__*/React.createElement(PostChatSurveyPaneStateful, _extends({}, props.postChatSurveyPaneProps, props.chatSDK))), createFooter(props, state), shouldShowEmailTranscriptPane(state) && (decodeComponentString((_props$componentOverr12 = props.componentOverrides) === null || _props$componentOverr12 === void 0 ? void 0 : _props$componentOverr12.emailTranscriptPane) || /*#__PURE__*/React.createElement(EmailTranscriptPaneStateful, props.emailTranscriptPane))));
|
|
417
458
|
};
|
|
418
459
|
export default LiveChatWidgetStateful;
|
|
@@ -68,7 +68,7 @@ export const PreChatSurveyPaneStateful = props => {
|
|
|
68
68
|
try {
|
|
69
69
|
var _state$domainStates, _state$domainStates$t, _state$domainStates$t2, _persistedState$domai, _persistedState$appSt;
|
|
70
70
|
|
|
71
|
-
const persistedState = getStateFromCache(((_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : (_state$domainStates$t = _state$domainStates.telemetryInternalData) === null || _state$domainStates$t === void 0 ? void 0 : _state$domainStates$t.orgId) ?? "", ((_state$domainStates$t2 = state.domainStates.telemetryInternalData) === null || _state$domainStates$t2 === void 0 ? void 0 : _state$domainStates$t2.widgetId) ?? "");
|
|
71
|
+
const persistedState = getStateFromCache(((_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : (_state$domainStates$t = _state$domainStates.telemetryInternalData) === null || _state$domainStates$t === void 0 ? void 0 : _state$domainStates$t.orgId) ?? "", ((_state$domainStates$t2 = state.domainStates.telemetryInternalData) === null || _state$domainStates$t2 === void 0 ? void 0 : _state$domainStates$t2.widgetId) ?? "", state.domainStates.widgetInstanceId ?? "");
|
|
72
72
|
let optionalParams = {}; //Connect to Active chats and chat is not popout
|
|
73
73
|
|
|
74
74
|
if (persistedState && !isUndefinedOrEmpty(persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai = persistedState.domainStates) === null || _persistedState$domai === void 0 ? void 0 : _persistedState$domai.liveChatContext) && (persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$appSt = persistedState.appStates) === null || _persistedState$appSt === void 0 ? void 0 : _persistedState$appSt.conversationState) === ConversationState.Active && !state.appStates.skipChatButtonRendering) {
|
|
@@ -34,4 +34,5 @@ export let LiveChatWidgetActionType;
|
|
|
34
34
|
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_LIVE_CHAT_CONTEXT"] = 30] = "SET_LIVE_CHAT_CONTEXT";
|
|
35
35
|
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_BOT_OAUTH_SIGNIN_ID"] = 31] = "SET_BOT_OAUTH_SIGNIN_ID";
|
|
36
36
|
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_SIZE"] = 32] = "SET_WIDGET_SIZE";
|
|
37
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_INSTANCE_ID"] = 33] = "SET_WIDGET_INSTANCE_ID";
|
|
37
38
|
})(LiveChatWidgetActionType || (LiveChatWidgetActionType = {}));
|