@microsoft/omnichannel-chat-widget 0.1.0-main.15c1e2b → 0.1.0-main.18d1166
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 +3 -0
- package/lib/cjs/common/telemetry/TelemetryConstants.js +31 -4
- package/lib/cjs/common/utils.js +23 -2
- package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +11 -18
- package/lib/cjs/components/headerstateful/HeaderStateful.js +5 -4
- 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 +5 -2
- package/lib/cjs/components/livechatwidget/common/endChat.js +43 -63
- package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +11 -43
- package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +3 -3
- package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +254 -2
- package/lib/cjs/components/livechatwidget/common/startChat.js +35 -50
- package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +64 -27
- 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/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +7 -3
- 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 +4 -1
- 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 +10 -0
- package/lib/esm/common/Constants.js +3 -0
- package/lib/esm/common/telemetry/TelemetryConstants.js +31 -4
- package/lib/esm/common/utils.js +20 -0
- package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +11 -18
- package/lib/esm/components/headerstateful/HeaderStateful.js +5 -4
- 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 +5 -2
- package/lib/esm/components/livechatwidget/common/endChat.js +45 -65
- package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +13 -45
- package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +3 -3
- package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +254 -3
- package/lib/esm/components/livechatwidget/common/startChat.js +35 -50
- package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +64 -27
- 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/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +5 -3
- 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 +4 -1
- 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 +10 -0
- package/lib/types/common/Constants.d.ts +3 -0
- package/lib/types/common/telemetry/TelemetryConstants.d.ts +27 -6
- 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 +2 -3
- package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetControlProps.d.ts +1 -0
- 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
|
@@ -81,12 +81,16 @@ const setPreChatAndInitiateChat = async (chatSDK, dispatch, setAdapter, isProact
|
|
|
81
81
|
const optionalParams = {
|
|
82
82
|
isProactiveChat
|
|
83
83
|
};
|
|
84
|
-
await initStartChat(chatSDK,
|
|
84
|
+
await initStartChat(chatSDK, dispatch, setAdapter, props, optionalParams);
|
|
85
85
|
};
|
|
86
86
|
|
|
87
87
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
-
const initStartChat = async (chatSDK,
|
|
88
|
+
const initStartChat = async (chatSDK, dispatch, setAdapter, props, params, persistedState) => {
|
|
89
|
+
var _props$controlProps2;
|
|
89
90
|
let isStartChatSuccessful = false;
|
|
91
|
+
const chatConfig = props === null || props === void 0 ? void 0 : props.chatConfig;
|
|
92
|
+
const getAuthToken = props === null || props === void 0 ? void 0 : props.getAuthToken;
|
|
93
|
+
const hideErrorUIPane = props === null || props === void 0 ? void 0 : (_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.hideErrorUIPane;
|
|
90
94
|
try {
|
|
91
95
|
var _newAdapter$activity$, _TelemetryTimers$Widg;
|
|
92
96
|
//Start widget load timer
|
|
@@ -100,6 +104,10 @@ const initStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAda
|
|
|
100
104
|
// set auth token to chat sdk before start chat
|
|
101
105
|
const authSuccess = await handleAuthentication(chatSDK, chatConfig, getAuthToken);
|
|
102
106
|
if (!authSuccess) {
|
|
107
|
+
dispatch({
|
|
108
|
+
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
109
|
+
payload: ConversationState.Closed
|
|
110
|
+
});
|
|
103
111
|
return;
|
|
104
112
|
}
|
|
105
113
|
}
|
|
@@ -135,12 +143,6 @@ const initStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAda
|
|
|
135
143
|
}
|
|
136
144
|
});
|
|
137
145
|
isStartChatSuccessful = false;
|
|
138
|
-
// Resetting the widget state to Closed, for recent introduction of OC rate limiting(429 Error)
|
|
139
|
-
// TODO : How to diplay a proper UI message to customer to try after sometime at this point - cool down scenario
|
|
140
|
-
dispatch({
|
|
141
|
-
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
142
|
-
payload: ConversationState.Closed
|
|
143
|
-
});
|
|
144
146
|
return;
|
|
145
147
|
}
|
|
146
148
|
|
|
@@ -169,12 +171,6 @@ const initStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAda
|
|
|
169
171
|
payload: liveChatContext
|
|
170
172
|
});
|
|
171
173
|
|
|
172
|
-
// Set post chat context in state, no survey load
|
|
173
|
-
setPostChatContextAndLoadSurvey(chatSDK, dispatch);
|
|
174
|
-
|
|
175
|
-
// Updating chat session detail for telemetry
|
|
176
|
-
await updateSessionDataForTelemetry(chatSDK, dispatch);
|
|
177
|
-
|
|
178
174
|
// Set app state to Active
|
|
179
175
|
if (isStartChatSuccessful) {
|
|
180
176
|
ActivityStreamHandler.uncork();
|
|
@@ -193,6 +189,12 @@ const initStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAda
|
|
|
193
189
|
Description: "Widget load complete",
|
|
194
190
|
ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg === void 0 ? void 0 : _TelemetryTimers$Widg.milliSecondsElapsed
|
|
195
191
|
});
|
|
192
|
+
|
|
193
|
+
// Set post chat context in state, no survey load
|
|
194
|
+
setPostChatContextAndLoadSurvey(chatSDK, dispatch);
|
|
195
|
+
|
|
196
|
+
// Updating chat session detail for telemetry
|
|
197
|
+
await updateSessionDataForTelemetry(chatSDK, dispatch);
|
|
196
198
|
} catch (ex) {
|
|
197
199
|
TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
|
|
198
200
|
Event: TelemetryEvent.WidgetLoadFailed,
|
|
@@ -213,11 +215,17 @@ const initStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAda
|
|
|
213
215
|
});
|
|
214
216
|
return;
|
|
215
217
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
218
|
+
if (!hideErrorUIPane) {
|
|
219
|
+
// Set app state to failing start chat if hideErrorUI is not turned on
|
|
220
|
+
dispatch({
|
|
221
|
+
type: LiveChatWidgetActionType.SET_START_CHAT_FAILING,
|
|
222
|
+
payload: true
|
|
223
|
+
});
|
|
224
|
+
TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
|
|
225
|
+
Event: TelemetryEvent.ErrorUIPaneLoaded,
|
|
226
|
+
Description: "Error UI Pane Loaded"
|
|
227
|
+
});
|
|
228
|
+
}
|
|
221
229
|
// Show the loading pane in other cases for failure, this will help for both hideStartChatButton case
|
|
222
230
|
dispatch({
|
|
223
231
|
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
@@ -248,15 +256,15 @@ const forceEndChat = async chatSDK => {
|
|
|
248
256
|
|
|
249
257
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
250
258
|
const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
|
|
251
|
-
var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _props$
|
|
259
|
+
var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _props$controlProps3, _persistedState$domai6;
|
|
252
260
|
// By pass this function in case of popout chat
|
|
253
261
|
if (state.appStates.hideStartChatButton === true) {
|
|
254
262
|
return false;
|
|
255
263
|
}
|
|
256
|
-
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$
|
|
264
|
+
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$controlProps3 = props.controlProps) === null || _props$controlProps3 === void 0 ? void 0 : _props$controlProps3.widgetInstanceId) ?? "");
|
|
257
265
|
|
|
258
266
|
//Connect to only active chat session
|
|
259
|
-
if (persistedState && !isUndefinedOrEmpty(persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai6 = persistedState.domainStates) === null || _persistedState$domai6 === void 0 ? void 0 : _persistedState$domai6.liveChatContext)
|
|
267
|
+
if (persistedState && !isUndefinedOrEmpty(persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai6 = persistedState.domainStates) === null || _persistedState$domai6 === void 0 ? void 0 : _persistedState$domai6.liveChatContext)) {
|
|
260
268
|
var _persistedState$domai7;
|
|
261
269
|
dispatch({
|
|
262
270
|
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
@@ -265,7 +273,7 @@ const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdap
|
|
|
265
273
|
const optionalParams = {
|
|
266
274
|
liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai7 = persistedState.domainStates) === null || _persistedState$domai7 === void 0 ? void 0 : _persistedState$domai7.liveChatContext
|
|
267
275
|
};
|
|
268
|
-
await initStartChat(chatSDK,
|
|
276
|
+
await initStartChat(chatSDK, dispatch, setAdapter, props, optionalParams, persistedState);
|
|
269
277
|
return true;
|
|
270
278
|
} else {
|
|
271
279
|
return false;
|
|
@@ -295,38 +303,11 @@ const setCustomContextParams = chatSDK => {
|
|
|
295
303
|
}
|
|
296
304
|
};
|
|
297
305
|
|
|
298
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
299
|
-
const handleAuthenticationIfEnabled = async (chatSDK, props) => {
|
|
300
|
-
//For auth chat
|
|
301
|
-
if (props.getAuthToken) {
|
|
302
|
-
const authClientFunction = getAuthClientFunction(props.chatConfig);
|
|
303
|
-
if (authClientFunction) {
|
|
304
|
-
// set auth token to chat sdk before start chat
|
|
305
|
-
const authSuccess = await handleAuthentication(chatSDK, props.chatConfig, props.getAuthToken);
|
|
306
|
-
if (!authSuccess) {
|
|
307
|
-
return false;
|
|
308
|
-
}
|
|
309
|
-
return true;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
return true;
|
|
313
|
-
};
|
|
314
|
-
|
|
315
306
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
316
307
|
const checkIfConversationStillValid = async (chatSDK, props, requestId, dispatch) => {
|
|
317
308
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
318
309
|
let conversationDetails = undefined;
|
|
319
310
|
|
|
320
|
-
// Show Loading screen during auth check and start chat calls
|
|
321
|
-
dispatch({
|
|
322
|
-
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
323
|
-
payload: ConversationState.Loading
|
|
324
|
-
});
|
|
325
|
-
const authSucceed = await handleAuthenticationIfEnabled(chatSDK, props);
|
|
326
|
-
if (!authSucceed) {
|
|
327
|
-
return false;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
311
|
//Preserve old requestId
|
|
331
312
|
const oldRequestId = chatSDK.requestId;
|
|
332
313
|
try {
|
|
@@ -337,6 +318,10 @@ const checkIfConversationStillValid = async (chatSDK, props, requestId, dispatch
|
|
|
337
318
|
return false;
|
|
338
319
|
}
|
|
339
320
|
if (conversationDetails.state === LiveWorkItemState.Closed || conversationDetails.state === LiveWorkItemState.WrapUp) {
|
|
321
|
+
dispatch({
|
|
322
|
+
type: LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
|
|
323
|
+
payload: undefined
|
|
324
|
+
});
|
|
340
325
|
chatSDK.requestId = oldRequestId;
|
|
341
326
|
return false;
|
|
342
327
|
}
|
|
@@ -46,8 +46,10 @@ import { startProactiveChat } from "../common/startProactiveChat";
|
|
|
46
46
|
import useChatAdapterStore from "../../../hooks/useChatAdapterStore";
|
|
47
47
|
import useChatContextStore from "../../../hooks/useChatContextStore";
|
|
48
48
|
import useChatSDKStore from "../../../hooks/useChatSDKStore";
|
|
49
|
+
import { ConversationEndEntity } from "../../../contexts/common/ConversationEndEntity";
|
|
50
|
+
import { handleAgentEndConversation } from "../common/agentEndConversationHelper";
|
|
49
51
|
export const LiveChatWidgetStateful = props => {
|
|
50
|
-
var _props$webChatContain, _props$styleProps, _chatSDK$omnichannelC, _props$controlProps, _props$controlProps2, _props$webChatContain3, _props$webChatContain4, _props$styleProps2, _props$
|
|
52
|
+
var _props$webChatContain, _props$styleProps, _chatSDK$omnichannelC, _props$controlProps, _props$controlProps2, _props$webChatContain3, _props$webChatContain4, _props$styleProps2, _props$controlProps15, _props$controlProps16, _props$componentOverr, _props$controlProps17, _props$componentOverr2, _props$controlProps18, _props$componentOverr3, _props$controlProps19, _props$componentOverr4, _props$controlProps20, _props$componentOverr5, _props$controlProps21, _props$componentOverr6, _props$controlProps22, _props$componentOverr7, _props$controlProps23, _props$controlProps24, _props$componentOverr8, _props$controlProps25, _props$componentOverr9, _props$controlProps26, _props$componentOverr10, _props$componentOverr11, _props$componentOverr12;
|
|
51
53
|
const [state, dispatch] = useChatContextStore();
|
|
52
54
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
53
55
|
const [adapter, setAdapter] = useChatAdapterStore();
|
|
@@ -117,7 +119,7 @@ export const LiveChatWidgetStateful = props => {
|
|
|
117
119
|
//Check if conversation state is not in wrapup or closed state
|
|
118
120
|
isChatValid = await checkIfConversationStillValid(chatSDK, props, (_state$domainStates3 = state.domainStates) === null || _state$domainStates3 === void 0 ? void 0 : (_state$domainStates3$ = _state$domainStates3.liveChatContext) === null || _state$domainStates3$ === void 0 ? void 0 : _state$domainStates3$.requestId, dispatch);
|
|
119
121
|
if (isChatValid === true) {
|
|
120
|
-
await initStartChat(chatSDK,
|
|
122
|
+
await initStartChat(chatSDK, dispatch, setAdapter, props, optionalParams);
|
|
121
123
|
return;
|
|
122
124
|
}
|
|
123
125
|
}
|
|
@@ -133,8 +135,9 @@ export const LiveChatWidgetStateful = props => {
|
|
|
133
135
|
}
|
|
134
136
|
}
|
|
135
137
|
};
|
|
136
|
-
|
|
137
|
-
|
|
138
|
+
|
|
139
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
140
|
+
const setupClientDataStore = () => {
|
|
138
141
|
// Add default localStorage support for widget
|
|
139
142
|
if (props.contextDataStore === undefined) {
|
|
140
143
|
var _props$controlProps3, _chatSDK$omnichannelC2, _chatSDK$omnichannelC3, _props$controlProps4;
|
|
@@ -144,6 +147,10 @@ export const LiveChatWidgetStateful = props => {
|
|
|
144
147
|
} else {
|
|
145
148
|
DataStoreManager.clientDataStore = props.contextDataStore;
|
|
146
149
|
}
|
|
150
|
+
};
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
var _props$controlProps5, _props$controlProps6, _props$controlProps7, _props$chatConfig, _props$chatConfig$Liv, _props$controlProps9, _props$chatConfig2, _props$chatConfig2$Ch;
|
|
153
|
+
setupClientDataStore();
|
|
147
154
|
registerTelemetryLoggers(props, dispatch);
|
|
148
155
|
createInternetConnectionChangeHandler();
|
|
149
156
|
dispatch({
|
|
@@ -201,7 +208,7 @@ export const LiveChatWidgetStateful = props => {
|
|
|
201
208
|
|
|
202
209
|
// useEffect for custom context
|
|
203
210
|
useEffect(() => {
|
|
204
|
-
var _chatSDK$omnichannelC8, _chatSDK$omnichannelC9, _props$
|
|
211
|
+
var _chatSDK$omnichannelC8, _chatSDK$omnichannelC9, _props$controlProps13;
|
|
205
212
|
// Add the custom context on receiving the SetCustomContext event
|
|
206
213
|
BroadcastService.getMessageByEventName(BroadcastEvent.SetCustomContext).subscribe(msg => {
|
|
207
214
|
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
@@ -229,14 +236,33 @@ export const LiveChatWidgetStateful = props => {
|
|
|
229
236
|
}
|
|
230
237
|
});
|
|
231
238
|
|
|
239
|
+
// Toggle chat visibility
|
|
240
|
+
BroadcastService.getMessageByEventName(BroadcastEvent.HideChatVisibilityChangeEvent).subscribe(event => {
|
|
241
|
+
var _event$payload;
|
|
242
|
+
if ((event === null || event === void 0 ? void 0 : (_event$payload = event.payload) === null || _event$payload === void 0 ? void 0 : _event$payload.isChatHidden) !== undefined) {
|
|
243
|
+
var _event$payload2, _props$controlProps10;
|
|
244
|
+
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
245
|
+
Event: TelemetryEvent.ChatVisibilityChanged,
|
|
246
|
+
Description: "Chat visibility changed to " + (event === null || event === void 0 ? void 0 : (_event$payload2 = event.payload) === null || _event$payload2 === void 0 ? void 0 : _event$payload2.isChatHidden)
|
|
247
|
+
});
|
|
248
|
+
if ((_props$controlProps10 = props.controlProps) !== null && _props$controlProps10 !== void 0 && _props$controlProps10.hideStartChatButton) {
|
|
249
|
+
var _event$payload3;
|
|
250
|
+
dispatch({
|
|
251
|
+
type: LiveChatWidgetActionType.SET_MINIMIZED,
|
|
252
|
+
payload: event === null || event === void 0 ? void 0 : (_event$payload3 = event.payload) === null || _event$payload3 === void 0 ? void 0 : _event$payload3.isChatHidden
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
|
|
232
258
|
// Start chat from SDK Event
|
|
233
259
|
BroadcastService.getMessageByEventName(BroadcastEvent.StartChat).subscribe(() => {
|
|
234
|
-
var _chatSDK$omnichannelC4, _chatSDK$omnichannelC5, _props$
|
|
260
|
+
var _chatSDK$omnichannelC4, _chatSDK$omnichannelC5, _props$controlProps11;
|
|
235
261
|
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
236
262
|
Event: TelemetryEvent.StartChatEventRecevied,
|
|
237
263
|
Description: "Start chat event received."
|
|
238
264
|
});
|
|
239
|
-
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC4 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC4 === void 0 ? void 0 : _chatSDK$omnichannelC4.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC5 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC5 === void 0 ? void 0 : _chatSDK$omnichannelC5.widgetId, (props === null || props === void 0 ? void 0 : (_props$
|
|
265
|
+
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC4 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC4 === void 0 ? void 0 : _chatSDK$omnichannelC4.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC5 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC5 === void 0 ? void 0 : _chatSDK$omnichannelC5.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps11 = props.controlProps) === null || _props$controlProps11 === void 0 ? void 0 : _props$controlProps11.widgetInstanceId) ?? "");
|
|
240
266
|
|
|
241
267
|
// Chat not found in cache
|
|
242
268
|
if (persistedState === undefined) {
|
|
@@ -277,9 +303,9 @@ export const LiveChatWidgetStateful = props => {
|
|
|
277
303
|
// End chat
|
|
278
304
|
BroadcastService.getMessageByEventName(BroadcastEvent.InitiateEndChat).subscribe(async () => {
|
|
279
305
|
if (state.appStates.hideStartChatButton === false) {
|
|
280
|
-
var _chatSDK$omnichannelC6, _chatSDK$omnichannelC7, _props$
|
|
306
|
+
var _chatSDK$omnichannelC6, _chatSDK$omnichannelC7, _props$controlProps12;
|
|
281
307
|
// This is to ensure to get latest state from cache in multitab
|
|
282
|
-
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC6 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC6 === void 0 ? void 0 : _chatSDK$omnichannelC6.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC7 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC7 === void 0 ? void 0 : _chatSDK$omnichannelC7.widgetId, (props === null || props === void 0 ? void 0 : (_props$
|
|
308
|
+
const persistedState = getStateFromCache(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC6 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC6 === void 0 ? void 0 : _chatSDK$omnichannelC6.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC7 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC7 === void 0 ? void 0 : _chatSDK$omnichannelC7.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps12 = props.controlProps) === null || _props$controlProps12 === void 0 ? void 0 : _props$controlProps12.widgetInstanceId) ?? "");
|
|
283
309
|
if (persistedState && persistedState.appStates.conversationState === ConversationState.Active) {
|
|
284
310
|
prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
|
|
285
311
|
} else {
|
|
@@ -299,14 +325,14 @@ export const LiveChatWidgetStateful = props => {
|
|
|
299
325
|
});
|
|
300
326
|
|
|
301
327
|
// Listen to end chat event from other tabs
|
|
302
|
-
const endChatEventName = getWidgetEndChatEventName(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC8 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC8 === void 0 ? void 0 : _chatSDK$omnichannelC8.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC9 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC9 === void 0 ? void 0 : _chatSDK$omnichannelC9.widgetId, ((_props$
|
|
328
|
+
const endChatEventName = getWidgetEndChatEventName(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC8 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC8 === void 0 ? void 0 : _chatSDK$omnichannelC8.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC9 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC9 === void 0 ? void 0 : _chatSDK$omnichannelC9.widgetId, ((_props$controlProps13 = props.controlProps) === null || _props$controlProps13 === void 0 ? void 0 : _props$controlProps13.widgetInstanceId) ?? "");
|
|
303
329
|
BroadcastService.getMessageByEventName(endChatEventName).subscribe(async () => {
|
|
304
330
|
endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
|
|
305
331
|
return;
|
|
306
332
|
});
|
|
307
333
|
|
|
308
334
|
// When conversation ended by agent
|
|
309
|
-
if (state.appStates.
|
|
335
|
+
if (state.appStates.conversationEndedBy === ConversationEndEntity.Agent) {
|
|
310
336
|
endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
|
|
311
337
|
}
|
|
312
338
|
|
|
@@ -404,7 +430,7 @@ export const LiveChatWidgetStateful = props => {
|
|
|
404
430
|
|
|
405
431
|
// Publish chat widget state
|
|
406
432
|
useEffect(() => {
|
|
407
|
-
var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic, _props$
|
|
433
|
+
var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic, _props$controlProps14;
|
|
408
434
|
// Only activate these windows events when conversation state is active and chat widget is in popout mode
|
|
409
435
|
// Ghost chat scenarios
|
|
410
436
|
/* COMMENTING THIS CODE FOR PARITY WITH OLD LCW
|
|
@@ -422,7 +448,7 @@ export const LiveChatWidgetStateful = props => {
|
|
|
422
448
|
};
|
|
423
449
|
}*/
|
|
424
450
|
|
|
425
|
-
widgetStateEventName = getWidgetCacheId(props === null || props === void 0 ? void 0 : (_props$chatSDK = props.chatSDK) === null || _props$chatSDK === void 0 ? void 0 : (_props$chatSDK$omnich = _props$chatSDK.omnichannelConfig) === null || _props$chatSDK$omnich === void 0 ? void 0 : _props$chatSDK$omnich.orgId, props === null || props === void 0 ? void 0 : (_props$chatSDK2 = props.chatSDK) === null || _props$chatSDK2 === void 0 ? void 0 : (_props$chatSDK2$omnic = _props$chatSDK2.omnichannelConfig) === null || _props$chatSDK2$omnic === void 0 ? void 0 : _props$chatSDK2$omnic.widgetId, (props === null || props === void 0 ? void 0 : (_props$
|
|
451
|
+
widgetStateEventName = getWidgetCacheId(props === null || props === void 0 ? void 0 : (_props$chatSDK = props.chatSDK) === null || _props$chatSDK === void 0 ? void 0 : (_props$chatSDK$omnich = _props$chatSDK.omnichannelConfig) === null || _props$chatSDK$omnich === void 0 ? void 0 : _props$chatSDK$omnich.orgId, props === null || props === void 0 ? void 0 : (_props$chatSDK2 = props.chatSDK) === null || _props$chatSDK2 === void 0 ? void 0 : (_props$chatSDK2$omnic = _props$chatSDK2.omnichannelConfig) === null || _props$chatSDK2$omnic === void 0 ? void 0 : _props$chatSDK2$omnic.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps14 = props.controlProps) === null || _props$controlProps14 === void 0 ? void 0 : _props$controlProps14.widgetInstanceId) ?? "");
|
|
426
452
|
const chatWidgetStateChangeEvent = {
|
|
427
453
|
eventName: widgetStateEventName,
|
|
428
454
|
payload: {
|
|
@@ -431,6 +457,20 @@ export const LiveChatWidgetStateful = props => {
|
|
|
431
457
|
};
|
|
432
458
|
BroadcastService.postMessage(chatWidgetStateChangeEvent);
|
|
433
459
|
}, [state]);
|
|
460
|
+
|
|
461
|
+
// Initiate End chat from a single point
|
|
462
|
+
useEffect(() => {
|
|
463
|
+
if (state.appStates.conversationEndedBy !== undefined) {
|
|
464
|
+
prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
|
|
465
|
+
}
|
|
466
|
+
}, [state.appStates.conversationEndedBy]);
|
|
467
|
+
|
|
468
|
+
// Handle Agent end conversation cases
|
|
469
|
+
useEffect(() => {
|
|
470
|
+
if (state.appStates.conversationEndedByAgentEventReceived) {
|
|
471
|
+
handleAgentEndConversation(props, state, dispatch);
|
|
472
|
+
}
|
|
473
|
+
}, [state.appStates.conversationEndedByAgentEventReceived]);
|
|
434
474
|
const initiateEndChatOnBrowserUnload = () => {
|
|
435
475
|
var _DataStoreManager$cli;
|
|
436
476
|
TelemetryHelper.logActionEvent(LogLevel.INFO, {
|
|
@@ -450,15 +490,13 @@ export const LiveChatWidgetStateful = props => {
|
|
|
450
490
|
eventName: BroadcastEvent.ClosePopoutWindow
|
|
451
491
|
});
|
|
452
492
|
};
|
|
453
|
-
const webChatProps = initWebChatComposer(props, chatSDK, state, dispatch, setWebChatStyles);
|
|
493
|
+
const webChatProps = initWebChatComposer(props, chatSDK, setAdapter, state, dispatch, adapter, setWebChatStyles);
|
|
454
494
|
const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch);
|
|
455
495
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
456
496
|
const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat, postMessageToOtherTab) => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat, postMessageToOtherTab);
|
|
457
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
458
|
-
const prepareEndChatRelay = (adapter, state) => prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
|
|
459
497
|
const prepareStartChatRelay = () => prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
|
|
460
498
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
461
|
-
const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK,
|
|
499
|
+
const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, dispatch, setAdapter, props, optionalParams, persistedState);
|
|
462
500
|
const confirmationPaneProps = initConfirmationPropsComposer(props);
|
|
463
501
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("style", null, `
|
|
464
502
|
::-webkit-scrollbar {
|
|
@@ -484,28 +522,27 @@ export const LiveChatWidgetStateful = props => {
|
|
|
484
522
|
id: widgetElementId,
|
|
485
523
|
styles: generalStyles,
|
|
486
524
|
className: (_props$styleProps2 = props.styleProps) === null || _props$styleProps2 === void 0 ? void 0 : _props$styleProps2.className
|
|
487
|
-
}, !((_props$
|
|
525
|
+
}, !((_props$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.hideChatButton) && !((_props$controlProps16 = props.controlProps) !== null && _props$controlProps16 !== void 0 && _props$controlProps16.hideStartChatButton) && shouldShowChatButton(state) && (decodeComponentString((_props$componentOverr = props.componentOverrides) === null || _props$componentOverr === void 0 ? void 0 : _props$componentOverr.chatButton) || /*#__PURE__*/React.createElement(ChatButtonStateful, {
|
|
488
526
|
buttonProps: props.chatButtonProps,
|
|
489
527
|
outOfOfficeButtonProps: props.outOfOfficeChatButtonProps,
|
|
490
528
|
startChat: prepareStartChatRelay
|
|
491
|
-
})), !((_props$
|
|
529
|
+
})), !((_props$controlProps17 = props.controlProps) !== null && _props$controlProps17 !== void 0 && _props$controlProps17.hideProactiveChatPane) && shouldShowProactiveChatPane(state) && (decodeComponentString((_props$componentOverr2 = props.componentOverrides) === null || _props$componentOverr2 === void 0 ? void 0 : _props$componentOverr2.proactiveChatPane) || /*#__PURE__*/React.createElement(ProactiveChatPaneStateful, {
|
|
492
530
|
proactiveChatProps: props.proactiveChatPaneProps,
|
|
493
531
|
startChat: prepareStartChatRelay
|
|
494
|
-
})), !((_props$
|
|
532
|
+
})), !((_props$controlProps18 = props.controlProps) !== null && _props$controlProps18 !== void 0 && _props$controlProps18.hideHeader) && shouldShowHeader(state) && (decodeComponentString((_props$componentOverr3 = props.componentOverrides) === null || _props$componentOverr3 === void 0 ? void 0 : _props$componentOverr3.header) || /*#__PURE__*/React.createElement(HeaderStateful, {
|
|
495
533
|
headerProps: props.headerProps,
|
|
496
534
|
outOfOfficeHeaderProps: props.outOfOfficeHeaderProps,
|
|
497
535
|
endChat: endChatRelay
|
|
498
|
-
})), !((_props$
|
|
536
|
+
})), !((_props$controlProps19 = props.controlProps) !== null && _props$controlProps19 !== void 0 && _props$controlProps19.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$controlProps20 = props.controlProps) !== null && _props$controlProps20 !== void 0 && _props$controlProps20.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$controlProps21 = props.controlProps) !== null && _props$controlProps21 !== void 0 && _props$controlProps21.hideReconnectChatPane) && shouldShowReconnectChatPane(state) && (decodeComponentString((_props$componentOverr6 = props.componentOverrides) === null || _props$componentOverr6 === void 0 ? void 0 : _props$componentOverr6.reconnectChatPane) || /*#__PURE__*/React.createElement(ReconnectChatPaneStateful, {
|
|
499
537
|
reconnectChatProps: props.reconnectChatPaneProps,
|
|
500
538
|
initStartChat: initStartChatRelay
|
|
501
|
-
})), !((_props$
|
|
539
|
+
})), !((_props$controlProps22 = props.controlProps) !== null && _props$controlProps22 !== void 0 && _props$controlProps22.hidePreChatSurveyPane) && shouldShowPreChatSurveyPane(state) && (decodeComponentString((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.preChatSurveyPane) || /*#__PURE__*/React.createElement(PreChatSurveyPaneStateful, {
|
|
502
540
|
surveyProps: props.preChatSurveyPaneProps,
|
|
503
541
|
initStartChat: initStartChatRelay
|
|
504
|
-
})), !((_props$
|
|
542
|
+
})), !((_props$controlProps23 = props.controlProps) !== null && _props$controlProps23 !== void 0 && _props$controlProps23.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
|
|
505
543
|
voiceVideoCallingSdk: voiceVideoCallingSDK
|
|
506
|
-
}, props.callingContainerProps)), !((_props$
|
|
507
|
-
setPostChatContext: setPostChatContextRelay
|
|
508
|
-
|
|
509
|
-
}))), !((_props$controlProps25 = props.controlProps) !== null && _props$controlProps25 !== void 0 && _props$controlProps25.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)))));
|
|
544
|
+
}, props.callingContainerProps)), !((_props$controlProps24 = props.controlProps) !== null && _props$controlProps24 !== void 0 && _props$controlProps24.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$controlProps25 = props.controlProps) !== null && _props$controlProps25 !== void 0 && _props$controlProps25.hideConfirmationPane) && shouldShowConfirmationPane(state) && (decodeComponentString((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.confirmationPane) || /*#__PURE__*/React.createElement(ConfirmationPaneStateful, _extends({}, confirmationPaneProps, {
|
|
545
|
+
setPostChatContext: setPostChatContextRelay
|
|
546
|
+
}))), !((_props$controlProps26 = props.controlProps) !== null && _props$controlProps26 !== void 0 && _props$controlProps26.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)))));
|
|
510
547
|
};
|
|
511
548
|
export default LiveChatWidgetStateful;
|
|
@@ -5,6 +5,7 @@ import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
|
|
|
5
5
|
import { defaultGeneralLoadingPaneStyleProps } from "./common/defaultStyleProps/defaultgeneralLoadingPaneStyleProps";
|
|
6
6
|
import { findAllFocusableElement } from "../../common/utils";
|
|
7
7
|
import useChatContextStore from "../../hooks/useChatContextStore";
|
|
8
|
+
import useWindowDimensions from "../../hooks/useWindowDimensions";
|
|
8
9
|
import { errorUILoadingPaneStyleProps } from "./common/errorUIStyleProps/errorUILoadingPaneStyleProps";
|
|
9
10
|
export const LoadingPaneStateful = props => {
|
|
10
11
|
var _props$styleProps;
|
|
@@ -31,6 +32,10 @@ export const LoadingPaneStateful = props => {
|
|
|
31
32
|
hideSpinnerText: true,
|
|
32
33
|
...props.controlProps
|
|
33
34
|
};
|
|
35
|
+
const {
|
|
36
|
+
height,
|
|
37
|
+
width
|
|
38
|
+
} = useWindowDimensions();
|
|
34
39
|
|
|
35
40
|
// Move focus to the first button
|
|
36
41
|
useEffect(() => {
|
|
@@ -46,7 +51,9 @@ export const LoadingPaneStateful = props => {
|
|
|
46
51
|
return /*#__PURE__*/React.createElement(LoadingPane, {
|
|
47
52
|
componentOverrides: props.componentOverrides,
|
|
48
53
|
controlProps: state.appStates.isStartChatFailing ? errorUIControlProps : controlProps,
|
|
49
|
-
styleProps: state.appStates.isStartChatFailing ? errorUIStyleProps : styleProps
|
|
54
|
+
styleProps: state.appStates.isStartChatFailing ? errorUIStyleProps : styleProps,
|
|
55
|
+
windowWidth: width,
|
|
56
|
+
windowHeight: height
|
|
50
57
|
});
|
|
51
58
|
};
|
|
52
59
|
export default LoadingPaneStateful;
|
|
@@ -15,7 +15,9 @@ export const PostChatSurveyPaneStateful = props => {
|
|
|
15
15
|
display: state.appStates.isMinimized ? "none" : ""
|
|
16
16
|
});
|
|
17
17
|
let surveyInviteLink = "";
|
|
18
|
-
if (state.domainStates.postChatContext.
|
|
18
|
+
if (state.appStates.shouldUseBotSurvey && state.domainStates.postChatContext.botSurveyInviteLink) {
|
|
19
|
+
surveyInviteLink = state.domainStates.postChatContext.botSurveyInviteLink + "&embed=" + (postChatSurveyMode === PostChatSurveyMode.Embed).toString() + "&compact=" + (props.isCustomerVoiceSurveyCompact ?? true).toString() + "&lang=" + (state.domainStates.postChatContext.formsProLocale ?? "en") + "&showmultilingual=false";
|
|
20
|
+
} else {
|
|
19
21
|
surveyInviteLink = state.domainStates.postChatContext.surveyInviteLink + "&embed=" + (postChatSurveyMode === PostChatSurveyMode.Embed).toString() + "&compact=" + (props.isCustomerVoiceSurveyCompact ?? true).toString() + "&lang=" + (state.domainStates.postChatContext.formsProLocale ?? "en") + "&showmultilingual=false";
|
|
20
22
|
}
|
|
21
23
|
const styleProps = {
|
|
@@ -112,7 +112,7 @@ export const PreChatSurveyPaneStateful = props => {
|
|
|
112
112
|
}
|
|
113
113
|
if (current && current.tagName.toLowerCase() == HtmlAttributeNames.div && current.childElementCount > 0) {
|
|
114
114
|
const input = current.children[0].children;
|
|
115
|
-
if (input
|
|
115
|
+
if ((input === null || input === void 0 ? void 0 : input.length) > 0 && input[0].className != HtmlAttributeNames.adaptiveCardToggleInputClassName && input[0].className != HtmlAttributeNames.adaptiveCardActionSetClassName) {
|
|
116
116
|
input[0].setAttribute(HtmlAttributeNames.ariaLabel, value);
|
|
117
117
|
}
|
|
118
118
|
}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/******
|
|
2
2
|
* TypingIndicatorMiddleware
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* This middleware changes the component that shows who's actively typing. It uses the default Microsoft LiveChatWidget styles.
|
|
5
5
|
******/
|
|
6
6
|
|
|
7
|
-
import React from "react";
|
|
7
|
+
import React, { useCallback } from "react";
|
|
8
8
|
import { DirectLineSenderRole } from "../../enums/DirectLineSenderRole";
|
|
9
9
|
import { defaultMiddlewareLocalizedTexts } from "../../../common/defaultProps/defaultMiddlewareLocalizedTexts";
|
|
10
10
|
import { defaultTypingIndicatorBubbleStyles } from "./defaultStyles/defaultTypingIndicatorBubbleStyles";
|
|
11
11
|
import { defaultTypingIndicatorContainerStyles } from "./defaultStyles/defaultTypingIndicatorContainerStyles";
|
|
12
12
|
import { defaultTypingIndicatorMessageStyles } from "./defaultStyles/defaultTypingIndicatorMessageStyles";
|
|
13
13
|
import { useChatContextStore } from "../../../../..";
|
|
14
|
+
import { debounceLeading } from "../../../../../common/utils";
|
|
14
15
|
import useChatSDKStore from "../../../../../hooks/useChatSDKStore";
|
|
15
16
|
|
|
16
17
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -23,6 +24,7 @@ const TypingIndicator = _ref => {
|
|
|
23
24
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
25
|
const chatSDK = useChatSDKStore();
|
|
25
26
|
const [state] = useChatContextStore();
|
|
27
|
+
const debounceTyping = useCallback(debounceLeading(() => chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.sendTypingEvent()), []);
|
|
26
28
|
if (!activeTyping || Object.keys(activeTyping).length === 0 || ((_state$domainStates$l = state.domainStates.liveChatConfig) === null || _state$domainStates$l === void 0 ? void 0 : _state$domainStates$l.LiveChatVersion) === 1 && !visible) {
|
|
27
29
|
return null;
|
|
28
30
|
}
|
|
@@ -32,7 +34,7 @@ const TypingIndicator = _ref => {
|
|
|
32
34
|
var _state$domainStates$l2;
|
|
33
35
|
//visible is set to false if the current user is typing, in which case, we just send typing indicator to OC
|
|
34
36
|
if (((_state$domainStates$l2 = state.domainStates.liveChatConfig) === null || _state$domainStates$l2 === void 0 ? void 0 : _state$domainStates$l2.LiveChatVersion) === 2 && !visible) {
|
|
35
|
-
|
|
37
|
+
debounceTyping();
|
|
36
38
|
return null;
|
|
37
39
|
}
|
|
38
40
|
activeTyping.splice(i, 1);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export let ConversationEndEntity;
|
|
2
|
+
(function (ConversationEndEntity) {
|
|
3
|
+
ConversationEndEntity[ConversationEndEntity["Customer"] = 0] = "Customer";
|
|
4
|
+
ConversationEndEntity[ConversationEndEntity["Agent"] = 1] = "Agent";
|
|
5
|
+
})(ConversationEndEntity || (ConversationEndEntity = {}));
|
|
@@ -29,11 +29,14 @@ export let LiveChatWidgetActionType;
|
|
|
29
29
|
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_RECONNECT_ID"] = 26] = "SET_RECONNECT_ID";
|
|
30
30
|
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_UNREAD_MESSAGE_COUNT"] = 27] = "SET_UNREAD_MESSAGE_COUNT";
|
|
31
31
|
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_FOCUS_CHAT_BUTTON"] = 28] = "SET_FOCUS_CHAT_BUTTON";
|
|
32
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
33
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
34
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
35
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
36
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
37
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
38
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
32
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATION_ENDED_BY_AGENT_EVENT_RECEIVED"] = 29] = "SET_CONVERSATION_ENDED_BY_AGENT_EVENT_RECEIVED";
|
|
33
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATION_ENDED_BY"] = 30] = "SET_CONVERSATION_ENDED_BY";
|
|
34
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_STATE"] = 31] = "SET_WIDGET_STATE";
|
|
35
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_LIVE_CHAT_CONTEXT"] = 32] = "SET_LIVE_CHAT_CONTEXT";
|
|
36
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_BOT_OAUTH_SIGNIN_ID"] = 33] = "SET_BOT_OAUTH_SIGNIN_ID";
|
|
37
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_SIZE"] = 34] = "SET_WIDGET_SIZE";
|
|
38
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_INSTANCE_ID"] = 35] = "SET_WIDGET_INSTANCE_ID";
|
|
39
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_LIVE_CHAT_CONFIG"] = 36] = "SET_LIVE_CHAT_CONFIG";
|
|
40
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_POST_CHAT_WORKFLOW_IN_PROGRESS"] = 37] = "SET_POST_CHAT_WORKFLOW_IN_PROGRESS";
|
|
41
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_SHOULD_USE_BOT_SURVEY"] = 38] = "SET_SHOULD_USE_BOT_SURVEY";
|
|
39
42
|
})(LiveChatWidgetActionType || (LiveChatWidgetActionType = {}));
|
|
@@ -45,7 +45,10 @@ export const getLiveChatWidgetContextInitialState = props => {
|
|
|
45
45
|
},
|
|
46
46
|
e2vvEnabled: false,
|
|
47
47
|
unreadMessageCount: 0,
|
|
48
|
-
|
|
48
|
+
conversationEndedByAgentEventReceived: false,
|
|
49
|
+
conversationEndedBy: undefined,
|
|
50
|
+
postChatWorkflowInProgress: false,
|
|
51
|
+
shouldUseBotSurvey: false
|
|
49
52
|
},
|
|
50
53
|
uiStates: {
|
|
51
54
|
showConfirmationPane: false,
|
|
@@ -258,12 +258,20 @@ export const createReducer = () => {
|
|
|
258
258
|
return {
|
|
259
259
|
...action.payload
|
|
260
260
|
};
|
|
261
|
-
case LiveChatWidgetActionType.
|
|
261
|
+
case LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY_AGENT_EVENT_RECEIVED:
|
|
262
262
|
return {
|
|
263
263
|
...state,
|
|
264
264
|
appStates: {
|
|
265
265
|
...state.appStates,
|
|
266
|
-
|
|
266
|
+
conversationEndedByAgentEventReceived: action.payload
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
case LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY:
|
|
270
|
+
return {
|
|
271
|
+
...state,
|
|
272
|
+
appStates: {
|
|
273
|
+
...state.appStates,
|
|
274
|
+
conversationEndedBy: action.payload
|
|
267
275
|
}
|
|
268
276
|
};
|
|
269
277
|
case LiveChatWidgetActionType.SET_WIDGET_SIZE:
|
|
@@ -293,6 +301,24 @@ export const createReducer = () => {
|
|
|
293
301
|
liveChatConfig: action.payload
|
|
294
302
|
}
|
|
295
303
|
};
|
|
304
|
+
case LiveChatWidgetActionType.SET_POST_CHAT_WORKFLOW_IN_PROGRESS:
|
|
305
|
+
return {
|
|
306
|
+
...state,
|
|
307
|
+
appStates: {
|
|
308
|
+
...state.appStates,
|
|
309
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
310
|
+
postChatWorkflowInProgress: action.payload
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
case LiveChatWidgetActionType.SET_SHOULD_USE_BOT_SURVEY:
|
|
314
|
+
return {
|
|
315
|
+
...state,
|
|
316
|
+
appStates: {
|
|
317
|
+
...state.appStates,
|
|
318
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
319
|
+
shouldUseBotSurvey: action.payload
|
|
320
|
+
}
|
|
321
|
+
};
|
|
296
322
|
default:
|
|
297
323
|
return state;
|
|
298
324
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useRef, useEffect } from "react";
|
|
2
|
+
export default function useDebounce(func) {
|
|
3
|
+
let delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
|
|
4
|
+
const timer = useRef();
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
return () => {
|
|
7
|
+
if (!timer.current) return;
|
|
8
|
+
clearTimeout(timer.current);
|
|
9
|
+
};
|
|
10
|
+
}, []);
|
|
11
|
+
const debouncedFunction = function () {
|
|
12
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
13
|
+
args[_key] = arguments[_key];
|
|
14
|
+
}
|
|
15
|
+
const newTimer = setTimeout(() => {
|
|
16
|
+
func(...args);
|
|
17
|
+
}, delay);
|
|
18
|
+
clearTimeout(timer.current);
|
|
19
|
+
timer.current = newTimer;
|
|
20
|
+
};
|
|
21
|
+
return debouncedFunction;
|
|
22
|
+
}
|