@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.
Files changed (69) hide show
  1. package/README.md +7 -34
  2. package/lib/cjs/common/Constants.js +3 -0
  3. package/lib/cjs/common/telemetry/TelemetryConstants.js +31 -4
  4. package/lib/cjs/common/utils.js +23 -2
  5. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +11 -18
  6. package/lib/cjs/components/headerstateful/HeaderStateful.js +5 -4
  7. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +139 -0
  8. package/lib/cjs/components/livechatwidget/common/agentEndConversationHelper.js +36 -0
  9. package/lib/cjs/components/livechatwidget/common/createAdapter.js +2 -0
  10. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +5 -2
  11. package/lib/cjs/components/livechatwidget/common/endChat.js +43 -63
  12. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +11 -43
  13. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +3 -3
  14. package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +254 -2
  15. package/lib/cjs/components/livechatwidget/common/startChat.js +35 -50
  16. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +64 -27
  17. package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +8 -1
  18. package/lib/cjs/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +3 -1
  19. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +1 -1
  20. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +7 -3
  21. package/lib/cjs/contexts/common/ConversationEndEntity.js +12 -0
  22. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +10 -7
  23. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +4 -1
  24. package/lib/cjs/contexts/createReducer.js +28 -2
  25. package/lib/cjs/hooks/useDebounce.js +28 -0
  26. package/lib/cjs/hooks/useWindowDimensions.js +30 -0
  27. package/lib/cjs/plugins/newMessageEventHandler.js +10 -0
  28. package/lib/esm/common/Constants.js +3 -0
  29. package/lib/esm/common/telemetry/TelemetryConstants.js +31 -4
  30. package/lib/esm/common/utils.js +20 -0
  31. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +11 -18
  32. package/lib/esm/components/headerstateful/HeaderStateful.js +5 -4
  33. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +134 -0
  34. package/lib/esm/components/livechatwidget/common/agentEndConversationHelper.js +30 -0
  35. package/lib/esm/components/livechatwidget/common/createAdapter.js +2 -0
  36. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +5 -2
  37. package/lib/esm/components/livechatwidget/common/endChat.js +45 -65
  38. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +13 -45
  39. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +3 -3
  40. package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +254 -3
  41. package/lib/esm/components/livechatwidget/common/startChat.js +35 -50
  42. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +64 -27
  43. package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +8 -1
  44. package/lib/esm/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +3 -1
  45. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +1 -1
  46. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +5 -3
  47. package/lib/esm/contexts/common/ConversationEndEntity.js +5 -0
  48. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +10 -7
  49. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +4 -1
  50. package/lib/esm/contexts/createReducer.js +28 -2
  51. package/lib/esm/hooks/useDebounce.js +22 -0
  52. package/lib/esm/hooks/useWindowDimensions.js +23 -0
  53. package/lib/esm/plugins/newMessageEventHandler.js +10 -0
  54. package/lib/types/common/Constants.d.ts +3 -0
  55. package/lib/types/common/telemetry/TelemetryConstants.d.ts +27 -6
  56. package/lib/types/common/utils.d.ts +1 -0
  57. package/lib/types/components/confirmationpanestateful/interfaces/IConfirmationPaneStatefulParams.d.ts +0 -7
  58. package/lib/types/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.d.ts +9 -0
  59. package/lib/types/components/livechatwidget/common/agentEndConversationHelper.d.ts +6 -0
  60. package/lib/types/components/livechatwidget/common/initWebChatComposer.d.ts +1 -1
  61. package/lib/types/components/livechatwidget/common/setPostChatContextAndLoadSurvey.d.ts +6 -1
  62. package/lib/types/components/livechatwidget/common/startChat.d.ts +2 -3
  63. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetControlProps.d.ts +1 -0
  64. package/lib/types/contexts/common/ConversationEndEntity.d.ts +4 -0
  65. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +5 -1
  66. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +10 -7
  67. package/lib/types/hooks/useDebounce.d.ts +3 -0
  68. package/lib/types/hooks/useWindowDimensions.d.ts +4 -0
  69. 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, props === null || props === void 0 ? void 0 : props.chatConfig, props === null || props === void 0 ? void 0 : props.getAuthToken, dispatch, setAdapter, optionalParams);
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, chatConfig, getAuthToken, dispatch, setAdapter, params, persistedState) => {
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
- // Set app state to failing start chat
217
- dispatch({
218
- type: LiveChatWidgetActionType.SET_START_CHAT_FAILING,
219
- payload: true
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$controlProps2, _persistedState$domai6, _persistedState$appSt;
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$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.widgetInstanceId) ?? "");
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) && (persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$appSt = persistedState.appStates) === null || _persistedState$appSt === void 0 ? void 0 : _persistedState$appSt.conversationState) === ConversationState.Active) {
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, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams, persistedState);
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$controlProps14, _props$controlProps15, _props$componentOverr, _props$controlProps16, _props$componentOverr2, _props$controlProps17, _props$componentOverr3, _props$controlProps18, _props$componentOverr4, _props$controlProps19, _props$componentOverr5, _props$controlProps20, _props$componentOverr6, _props$controlProps21, _props$componentOverr7, _props$controlProps22, _props$controlProps23, _props$componentOverr8, _props$controlProps24, _props$componentOverr9, _props$controlProps25, _props$componentOverr10, _props$componentOverr11, _props$componentOverr12;
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, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams);
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
- useEffect(() => {
137
- var _props$controlProps5, _props$controlProps6, _props$controlProps7, _props$chatConfig, _props$chatConfig$Liv, _props$controlProps9, _props$chatConfig2, _props$chatConfig2$Ch;
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$controlProps12;
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$controlProps10;
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$controlProps10 = props.controlProps) === null || _props$controlProps10 === void 0 ? void 0 : _props$controlProps10.widgetInstanceId) ?? "");
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$controlProps11;
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$controlProps11 = props.controlProps) === null || _props$controlProps11 === void 0 ? void 0 : _props$controlProps11.widgetInstanceId) ?? "");
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$controlProps12 = props.controlProps) === null || _props$controlProps12 === void 0 ? void 0 : _props$controlProps12.widgetInstanceId) ?? "");
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.conversationEndedByAgent) {
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$controlProps13;
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$controlProps13 = props.controlProps) === null || _props$controlProps13 === void 0 ? void 0 : _props$controlProps13.widgetInstanceId) ?? "");
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, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams, persistedState);
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$controlProps14 = props.controlProps) !== null && _props$controlProps14 !== void 0 && _props$controlProps14.hideChatButton) && !((_props$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.hideStartChatButton) && shouldShowChatButton(state) && (decodeComponentString((_props$componentOverr = props.componentOverrides) === null || _props$componentOverr === void 0 ? void 0 : _props$componentOverr.chatButton) || /*#__PURE__*/React.createElement(ChatButtonStateful, {
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$controlProps16 = props.controlProps) !== null && _props$controlProps16 !== void 0 && _props$controlProps16.hideProactiveChatPane) && shouldShowProactiveChatPane(state) && (decodeComponentString((_props$componentOverr2 = props.componentOverrides) === null || _props$componentOverr2 === void 0 ? void 0 : _props$componentOverr2.proactiveChatPane) || /*#__PURE__*/React.createElement(ProactiveChatPaneStateful, {
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$controlProps17 = props.controlProps) !== null && _props$controlProps17 !== void 0 && _props$controlProps17.hideHeader) && shouldShowHeader(state) && (decodeComponentString((_props$componentOverr3 = props.componentOverrides) === null || _props$componentOverr3 === void 0 ? void 0 : _props$componentOverr3.header) || /*#__PURE__*/React.createElement(HeaderStateful, {
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$controlProps18 = props.controlProps) !== null && _props$controlProps18 !== void 0 && _props$controlProps18.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$controlProps19 = props.controlProps) !== null && _props$controlProps19 !== void 0 && _props$controlProps19.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$controlProps20 = props.controlProps) !== null && _props$controlProps20 !== void 0 && _props$controlProps20.hideReconnectChatPane) && shouldShowReconnectChatPane(state) && (decodeComponentString((_props$componentOverr6 = props.componentOverrides) === null || _props$componentOverr6 === void 0 ? void 0 : _props$componentOverr6.reconnectChatPane) || /*#__PURE__*/React.createElement(ReconnectChatPaneStateful, {
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$controlProps21 = props.controlProps) !== null && _props$controlProps21 !== void 0 && _props$controlProps21.hidePreChatSurveyPane) && shouldShowPreChatSurveyPane(state) && (decodeComponentString((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.preChatSurveyPane) || /*#__PURE__*/React.createElement(PreChatSurveyPaneStateful, {
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$controlProps22 = props.controlProps) !== null && _props$controlProps22 !== void 0 && _props$controlProps22.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
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$controlProps23 = props.controlProps) !== null && _props$controlProps23 !== void 0 && _props$controlProps23.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$controlProps24 = props.controlProps) !== null && _props$controlProps24 !== void 0 && _props$controlProps24.hideConfirmationPane) && shouldShowConfirmationPane(state) && (decodeComponentString((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.confirmationPane) || /*#__PURE__*/React.createElement(ConfirmationPaneStateful, _extends({}, confirmationPaneProps, {
507
- setPostChatContext: setPostChatContextRelay,
508
- prepareEndChat: prepareEndChatRelay
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.surveyInviteLink) {
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 && input.length > 0 && input[0].className != HtmlAttributeNames.adaptiveCardToggleInputClassName) {
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
- chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.sendTypingEvent();
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["SET_CONVERSATION_ENDED_BY_AGENT"] = 29] = "SET_CONVERSATION_ENDED_BY_AGENT";
33
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_STATE"] = 30] = "SET_WIDGET_STATE";
34
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_LIVE_CHAT_CONTEXT"] = 31] = "SET_LIVE_CHAT_CONTEXT";
35
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_BOT_OAUTH_SIGNIN_ID"] = 32] = "SET_BOT_OAUTH_SIGNIN_ID";
36
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_SIZE"] = 33] = "SET_WIDGET_SIZE";
37
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_INSTANCE_ID"] = 34] = "SET_WIDGET_INSTANCE_ID";
38
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_LIVE_CHAT_CONFIG"] = 35] = "SET_LIVE_CHAT_CONFIG";
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
- conversationEndedByAgent: false
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.SET_CONVERSATION_ENDED_BY_AGENT:
261
+ case LiveChatWidgetActionType.SET_CONVERSATION_ENDED_BY_AGENT_EVENT_RECEIVED:
262
262
  return {
263
263
  ...state,
264
264
  appStates: {
265
265
  ...state.appStates,
266
- conversationEndedByAgent: action.payload
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
+ }