@microsoft/omnichannel-chat-widget 1.6.3-main.25307f2 → 1.6.3-main.6248890

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.
@@ -64,6 +64,7 @@ exports.BroadcastEvent = BroadcastEvent;
64
64
  BroadcastEvent["UpdateSessionDataForTelemetry"] = "UpdateSessionDataForTelemetry";
65
65
  BroadcastEvent["UpdateConversationDataForTelemetry"] = "UpdateConversationDataForTelemetry";
66
66
  BroadcastEvent["ContactIdNotFound"] = "ContactIdNotFound";
67
+ BroadcastEvent["SyncMinimize"] = "SyncMinimize";
67
68
  })(BroadcastEvent || (exports.BroadcastEvent = BroadcastEvent = {}));
68
69
  let TelemetryEvent;
69
70
  exports.TelemetryEvent = TelemetryEvent;
@@ -32,7 +32,6 @@ let popoutWidgetInstanceId;
32
32
  const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) => {
33
33
  optionalParams = {}; //Resetting to ensure no stale values
34
34
  widgetInstanceId = (0, _utils.getWidgetCacheIdfromProps)(props);
35
-
36
35
  // reconnect > chat from cache
37
36
  if ((0, _reconnectChatHelper.isReconnectEnabled)(props.chatConfig) === true && !(0, _reconnectChatHelper.isPersistentEnabled)(props.chatConfig)) {
38
37
  const shouldStartChatNormally = await (0, _reconnectChatHelper.handleChatReconnect)(chatSDK, props, dispatch, setAdapter, initStartChat, state);
@@ -83,6 +82,7 @@ const setPreChatAndInitiateChat = async (chatSDK, dispatch, setAdapter, isProact
83
82
  });
84
83
  return;
85
84
  } else {
85
+ var _state$appStates;
86
86
  dispatch({
87
87
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
88
88
  payload: preChatSurveyResponse
@@ -91,6 +91,24 @@ const setPreChatAndInitiateChat = async (chatSDK, dispatch, setAdapter, isProact
91
91
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
92
92
  payload: _ConversationState.ConversationState.Prechat
93
93
  });
94
+
95
+ // If minimized, maximize the chat, if the state is missing, consider it as minimized
96
+ if ((state === null || state === void 0 ? void 0 : state.appStates.isMinimized) == undefined || (state === null || state === void 0 ? void 0 : (_state$appStates = state.appStates) === null || _state$appStates === void 0 ? void 0 : _state$appStates.isMinimized) === true) {
97
+ var _state$domainStates2, _state$domainStates2$, _state$domainStates3, _state$domainStates3$;
98
+ dispatch({
99
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_MINIMIZED,
100
+ payload: false
101
+ });
102
+
103
+ // this event will notify the upper layer to maximize the widget, an event missing during multi-tab scenario.
104
+ _omnichannelChatComponents.BroadcastService.postMessage({
105
+ eventName: _TelemetryConstants.BroadcastEvent.MaximizeChat,
106
+ payload: {
107
+ height: state === null || state === void 0 ? void 0 : (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : (_state$domainStates2$ = _state$domainStates2.widgetSize) === null || _state$domainStates2$ === void 0 ? void 0 : _state$domainStates2$.height,
108
+ width: state === null || state === void 0 ? void 0 : (_state$domainStates3 = state.domainStates) === null || _state$domainStates3 === void 0 ? void 0 : (_state$domainStates3$ = _state$domainStates3.widgetSize) === null || _state$domainStates3$ === void 0 ? void 0 : _state$domainStates3$.width
109
+ }
110
+ });
111
+ }
94
112
  return;
95
113
  }
96
114
  }
@@ -117,9 +135,9 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
117
135
  (0, _endChat.chatSDKStateCleanUp)(chatSDK);
118
136
  }
119
137
  try {
120
- var _state$appStates, _newAdapter$activity$;
138
+ var _state$appStates2, _newAdapter$activity$;
121
139
  // Clear disconnect state on start chat
122
- (state === null || state === void 0 ? void 0 : (_state$appStates = state.appStates) === null || _state$appStates === void 0 ? void 0 : _state$appStates.chatDisconnectEventReceived) && dispatch({
140
+ (state === null || state === void 0 ? void 0 : (_state$appStates2 = state.appStates) === null || _state$appStates2 === void 0 ? void 0 : _state$appStates2.chatDisconnectEventReceived) && dispatch({
123
141
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CHAT_DISCONNECT_EVENT_RECEIVED,
124
142
  payload: false
125
143
  });
@@ -214,7 +232,6 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
214
232
  payload: liveChatContext
215
233
  });
216
234
  (0, _startChatErrorHandler.logWidgetLoadComplete)();
217
-
218
235
  // Set post chat context in state
219
236
  // Commenting this for now as post chat context is fetched during end chat
220
237
  await (0, _setPostChatContextAndLoadSurvey.setPostChatContextAndLoadSurvey)(chatSDK, dispatch);
@@ -232,9 +249,9 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
232
249
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
233
250
  exports.initStartChat = initStartChat;
234
251
  const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
235
- var _state$appStates2, _persistedState$domai6, _persistedState$appSt;
252
+ var _state$appStates3, _persistedState$domai6, _persistedState$appSt;
236
253
  // By pass this function in case of popout chat
237
- if ((state === null || state === void 0 ? void 0 : (_state$appStates2 = state.appStates) === null || _state$appStates2 === void 0 ? void 0 : _state$appStates2.hideStartChatButton) === true) {
254
+ if ((state === null || state === void 0 ? void 0 : (_state$appStates3 = state.appStates) === null || _state$appStates3 === void 0 ? void 0 : _state$appStates3.hideStartChatButton) === true) {
238
255
  return false;
239
256
  }
240
257
  const persistedState = (0, _utils.getStateFromCache)((0, _utils.getWidgetCacheIdfromProps)(props));
@@ -257,17 +274,17 @@ const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdap
257
274
 
258
275
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
259
276
  const setCustomContextParams = async (state, props) => {
260
- var _props$chatConfig, _props$chatConfig$Liv, _state$domainStates2, _persistedState$domai8;
277
+ var _props$chatConfig, _props$chatConfig$Liv, _state$domainStates4, _persistedState$domai8;
261
278
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
262
279
  const isAuthenticatedChat = props !== null && props !== void 0 && (_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && (_props$chatConfig$Liv = _props$chatConfig.LiveChatConfigAuthSettings) !== null && _props$chatConfig$Liv !== void 0 && _props$chatConfig$Liv.msdyn_javascriptclientfunction ? true : false;
263
280
  //Should not set custom context for auth chat
264
281
  if (isAuthenticatedChat) {
265
282
  return;
266
283
  }
267
- if (state !== null && state !== void 0 && (_state$domainStates2 = state.domainStates) !== null && _state$domainStates2 !== void 0 && _state$domainStates2.customContext) {
268
- var _state$domainStates3;
284
+ if (state !== null && state !== void 0 && (_state$domainStates4 = state.domainStates) !== null && _state$domainStates4 !== void 0 && _state$domainStates4.customContext) {
285
+ var _state$domainStates5;
269
286
  optionalParams = Object.assign({}, optionalParams, {
270
- customContext: JSON.parse(JSON.stringify(state === null || state === void 0 ? void 0 : (_state$domainStates3 = state.domainStates) === null || _state$domainStates3 === void 0 ? void 0 : _state$domainStates3.customContext))
287
+ customContext: JSON.parse(JSON.stringify(state === null || state === void 0 ? void 0 : (_state$domainStates5 = state.domainStates) === null || _state$domainStates5 === void 0 ? void 0 : _state$domainStates5.customContext))
271
288
  });
272
289
  return;
273
290
  }
@@ -315,8 +332,8 @@ const canStartPopoutChat = async props => {
315
332
 
316
333
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
317
334
  const checkIfConversationStillValid = async (chatSDK, dispatch, state) => {
318
- var _state$domainStates4, _state$domainStates4$;
319
- const requestIdFromCache = (_state$domainStates4 = state.domainStates) === null || _state$domainStates4 === void 0 ? void 0 : (_state$domainStates4$ = _state$domainStates4.liveChatContext) === null || _state$domainStates4$ === void 0 ? void 0 : _state$domainStates4$.requestId;
335
+ var _state$domainStates6, _state$domainStates6$;
336
+ const requestIdFromCache = (_state$domainStates6 = state.domainStates) === null || _state$domainStates6 === void 0 ? void 0 : (_state$domainStates6$ = _state$domainStates6.liveChatContext) === null || _state$domainStates6$ === void 0 ? void 0 : _state$domainStates6$.requestId;
320
337
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
321
338
  let conversationDetails = undefined;
322
339
 
@@ -342,11 +359,11 @@ const checkIfConversationStillValid = async (chatSDK, dispatch, state) => {
342
359
  return false;
343
360
  }
344
361
  return true;
345
- } catch (erorr) {
362
+ } catch (error) {
346
363
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
347
364
  Event: _TelemetryConstants.TelemetryEvent.GetConversationDetailsException,
348
365
  ExceptionDetails: {
349
- exception: `Conversation is not valid: ${erorr}`
366
+ exception: `Conversation is not valid: ${error}`
350
367
  }
351
368
  });
352
369
  chatSDK.requestId = currentRequestId;
@@ -144,9 +144,6 @@ const LiveChatWidgetStateful = props => {
144
144
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
145
145
  payload: _ConversationState.ConversationState.Loading
146
146
  });
147
- if (localState) {
148
- localState.appStates.conversationState = _ConversationState.ConversationState.Loading;
149
- }
150
147
 
151
148
  //Check if conversation state is not in wrapup or closed state
152
149
  isChatValid = await (0, _startChat.checkIfConversationStillValid)(chatSDK, dispatch, state);
@@ -163,7 +160,11 @@ const LiveChatWidgetStateful = props => {
163
160
  // adding the reconnect logic for the case when customer tries to reconnect from a new browser or InPrivate browser
164
161
  const reconnectTriggered = await isReconnectTriggered();
165
162
  if (!reconnectTriggered) {
166
- await (0, _startChat.setPreChatAndInitiateChat)(chatSDK, dispatch, setAdapter, undefined, undefined, localState, props);
163
+ const inMemoryState = (0, _createReducer.executeReducer)(state, {
164
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
165
+ payload: null
166
+ });
167
+ await (0, _startChat.setPreChatAndInitiateChat)(chatSDK, dispatch, setAdapter, undefined, undefined, inMemoryState, props);
167
168
  }
168
169
  return;
169
170
  } else {
@@ -343,31 +344,35 @@ const LiveChatWidgetStateful = props => {
343
344
  }
344
345
  });
345
346
 
347
+ /**
348
+ * This will allow to sync multiple tabs to handle minimize and maximize state,
349
+ * the event is expected to be emitted from scripting layer.
350
+ */
351
+ _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.SyncMinimize).subscribe(msg => {
352
+ var _msg$payload4;
353
+ dispatch({
354
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_MINIMIZED,
355
+ payload: msg === null || msg === void 0 ? void 0 : (_msg$payload4 = msg.payload) === null || _msg$payload4 === void 0 ? void 0 : _msg$payload4.minimized
356
+ });
357
+ });
358
+
346
359
  // Start chat from SDK Event
347
360
  _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.StartChat).subscribe(msg => {
348
- var _msg$payload4, _msg$payload5, _msg$payload6, _inMemoryState$appSta, _inMemoryState$appSta2, _inMemoryState$appSta3, _inMemoryState$appSta4;
361
+ var _msg$payload5, _msg$payload6, _msg$payload7, _msg$payload9, _inMemoryState$appSta, _inMemoryState$appSta2, _inMemoryState$appSta3, _inMemoryState$appSta4;
349
362
  // If the startChat event is not initiated by the same tab. Ignore the call
350
- if (!(0, _utils.isNullOrUndefined)(msg === null || msg === void 0 ? void 0 : (_msg$payload4 = msg.payload) === null || _msg$payload4 === void 0 ? void 0 : _msg$payload4.runtimeId) && (msg === null || msg === void 0 ? void 0 : (_msg$payload5 = msg.payload) === null || _msg$payload5 === void 0 ? void 0 : _msg$payload5.runtimeId) !== _TelemetryManager.TelemetryManager.InternalTelemetryData.lcwRuntimeId) {
363
+ if (!(0, _utils.isNullOrUndefined)(msg === null || msg === void 0 ? void 0 : (_msg$payload5 = msg.payload) === null || _msg$payload5 === void 0 ? void 0 : _msg$payload5.runtimeId) && (msg === null || msg === void 0 ? void 0 : (_msg$payload6 = msg.payload) === null || _msg$payload6 === void 0 ? void 0 : _msg$payload6.runtimeId) !== _TelemetryManager.TelemetryManager.InternalTelemetryData.lcwRuntimeId) {
351
364
  return;
352
365
  }
353
- let stateWithUpdatedContext = state;
354
- if (msg !== null && msg !== void 0 && (_msg$payload6 = msg.payload) !== null && _msg$payload6 !== void 0 && _msg$payload6.customContext) {
355
- var _msg$payload7, _msg$payload8;
366
+ if (msg !== null && msg !== void 0 && (_msg$payload7 = msg.payload) !== null && _msg$payload7 !== void 0 && _msg$payload7.customContext) {
367
+ var _msg$payload8;
356
368
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
357
369
  Event: _TelemetryConstants.TelemetryEvent.CustomContextReceived,
358
370
  Description: "CustomContext received through startChat event."
359
371
  });
360
372
  dispatch({
361
373
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CUSTOM_CONTEXT,
362
- payload: msg === null || msg === void 0 ? void 0 : (_msg$payload7 = msg.payload) === null || _msg$payload7 === void 0 ? void 0 : _msg$payload7.customContext
374
+ payload: msg === null || msg === void 0 ? void 0 : (_msg$payload8 = msg.payload) === null || _msg$payload8 === void 0 ? void 0 : _msg$payload8.customContext
363
375
  });
364
- stateWithUpdatedContext = {
365
- ...state,
366
- domainStates: {
367
- ...state.domainStates,
368
- customContext: msg === null || msg === void 0 ? void 0 : (_msg$payload8 = msg.payload) === null || _msg$payload8 === void 0 ? void 0 : _msg$payload8.customContext
369
- }
370
- };
371
376
  }
372
377
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
373
378
  Event: _TelemetryConstants.TelemetryEvent.StartChatEventRecevied,
@@ -377,13 +382,14 @@ const LiveChatWidgetStateful = props => {
377
382
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
378
383
  payload: null
379
384
  });
385
+ inMemoryState.domainStates.customContext = msg === null || msg === void 0 ? void 0 : (_msg$payload9 = msg.payload) === null || _msg$payload9 === void 0 ? void 0 : _msg$payload9.customContext;
380
386
 
381
387
  // Only initiate new chat if widget runtime state is one of the followings
382
388
  if (((_inMemoryState$appSta = inMemoryState.appStates) === null || _inMemoryState$appSta === void 0 ? void 0 : _inMemoryState$appSta.conversationState) === _ConversationState.ConversationState.Closed || ((_inMemoryState$appSta2 = inMemoryState.appStates) === null || _inMemoryState$appSta2 === void 0 ? void 0 : _inMemoryState$appSta2.conversationState) === _ConversationState.ConversationState.InActive || ((_inMemoryState$appSta3 = inMemoryState.appStates) === null || _inMemoryState$appSta3 === void 0 ? void 0 : _inMemoryState$appSta3.conversationState) === _ConversationState.ConversationState.Postchat) {
383
389
  _omnichannelChatComponents.BroadcastService.postMessage({
384
390
  eventName: _TelemetryConstants.BroadcastEvent.ChatInitiated
385
391
  });
386
- (0, _startChat.prepareStartChat)(props, chatSDK, stateWithUpdatedContext, dispatch, setAdapter);
392
+ (0, _startChat.prepareStartChat)(props, chatSDK, inMemoryState, dispatch, setAdapter);
387
393
  return;
388
394
  }
389
395
 
@@ -450,8 +456,8 @@ const LiveChatWidgetStateful = props => {
450
456
  // Listen to end chat event from other tabs
451
457
  const endChatEventName = (0, _utils.getWidgetEndChatEventName)(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC3 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC3 === void 0 ? void 0 : _chatSDK$omnichannelC3.widgetId, ((_props$controlProps11 = props.controlProps) === null || _props$controlProps11 === void 0 ? void 0 : _props$controlProps11.widgetInstanceId) ?? "");
452
458
  _omnichannelChatComponents.BroadcastService.getMessageByEventName(endChatEventName).subscribe(msg => {
453
- var _msg$payload9;
454
- if ((msg === null || msg === void 0 ? void 0 : (_msg$payload9 = msg.payload) === null || _msg$payload9 === void 0 ? void 0 : _msg$payload9.runtimeId) !== _TelemetryManager.TelemetryManager.InternalTelemetryData.lcwRuntimeId) {
459
+ var _msg$payload10;
460
+ if ((msg === null || msg === void 0 ? void 0 : (_msg$payload10 = msg.payload) === null || _msg$payload10 === void 0 ? void 0 : _msg$payload10.runtimeId) !== _TelemetryManager.TelemetryManager.InternalTelemetryData.lcwRuntimeId) {
455
461
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.INFO, {
456
462
  Event: _TelemetryConstants.TelemetryEvent.PrepareEndChat,
457
463
  Description: "Received EndChat BroadcastEvent from other tabs. Closing this chat."
@@ -18,6 +18,16 @@ const getLiveChatWidgetContextInitialState = props => {
18
18
  const initialState = (0, _defaultClientDataStoreProvider.defaultClientDataStoreProvider)(cacheTtlInMins, storageType).getData(widgetCacheId);
19
19
  if (!(0, _utils.isNullOrUndefined)(initialState)) {
20
20
  const initialStateFromCache = JSON.parse(initialState);
21
+
22
+ /*
23
+ * this step is needed to avoid the pre-chat pane to be injected in the DOM when the widget is reloaded, because wont be visible
24
+ * and it will be blocking all elements behind it
25
+ * as part of the flow, the pre-chat will be detected and then it will be displayed properly
26
+ * this case is only and only for pre-chat pane.
27
+ * **/
28
+ if (initialStateFromCache.appStates.conversationState === _ConversationState.ConversationState.Prechat) {
29
+ initialStateFromCache.appStates.conversationState = _ConversationState.ConversationState.Closed;
30
+ }
21
31
  return initialStateFromCache;
22
32
  }
23
33
  const LiveChatWidgetContextInitialState = {
@@ -89,7 +89,7 @@ const reducer = (state, action) => {
89
89
  inMemory = {
90
90
  ...inMemory,
91
91
  appStates: {
92
- ...state.appStates,
92
+ ...inMemory.appStates,
93
93
  isMinimized: action.payload
94
94
  }
95
95
  };
@@ -59,6 +59,7 @@ export let BroadcastEvent;
59
59
  BroadcastEvent["UpdateSessionDataForTelemetry"] = "UpdateSessionDataForTelemetry";
60
60
  BroadcastEvent["UpdateConversationDataForTelemetry"] = "UpdateConversationDataForTelemetry";
61
61
  BroadcastEvent["ContactIdNotFound"] = "ContactIdNotFound";
62
+ BroadcastEvent["SyncMinimize"] = "SyncMinimize";
62
63
  })(BroadcastEvent || (BroadcastEvent = {}));
63
64
  export let TelemetryEvent;
64
65
  (function (TelemetryEvent) {
@@ -27,7 +27,6 @@ let popoutWidgetInstanceId;
27
27
  const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) => {
28
28
  optionalParams = {}; //Resetting to ensure no stale values
29
29
  widgetInstanceId = getWidgetCacheIdfromProps(props);
30
-
31
30
  // reconnect > chat from cache
32
31
  if (isReconnectEnabled(props.chatConfig) === true && !isPersistentEnabled(props.chatConfig)) {
33
32
  const shouldStartChatNormally = await handleChatReconnect(chatSDK, props, dispatch, setAdapter, initStartChat, state);
@@ -77,6 +76,7 @@ const setPreChatAndInitiateChat = async (chatSDK, dispatch, setAdapter, isProact
77
76
  });
78
77
  return;
79
78
  } else {
79
+ var _state$appStates;
80
80
  dispatch({
81
81
  type: LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
82
82
  payload: preChatSurveyResponse
@@ -85,6 +85,24 @@ const setPreChatAndInitiateChat = async (chatSDK, dispatch, setAdapter, isProact
85
85
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
86
86
  payload: ConversationState.Prechat
87
87
  });
88
+
89
+ // If minimized, maximize the chat, if the state is missing, consider it as minimized
90
+ if ((state === null || state === void 0 ? void 0 : state.appStates.isMinimized) == undefined || (state === null || state === void 0 ? void 0 : (_state$appStates = state.appStates) === null || _state$appStates === void 0 ? void 0 : _state$appStates.isMinimized) === true) {
91
+ var _state$domainStates2, _state$domainStates2$, _state$domainStates3, _state$domainStates3$;
92
+ dispatch({
93
+ type: LiveChatWidgetActionType.SET_MINIMIZED,
94
+ payload: false
95
+ });
96
+
97
+ // this event will notify the upper layer to maximize the widget, an event missing during multi-tab scenario.
98
+ BroadcastService.postMessage({
99
+ eventName: BroadcastEvent.MaximizeChat,
100
+ payload: {
101
+ height: state === null || state === void 0 ? void 0 : (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : (_state$domainStates2$ = _state$domainStates2.widgetSize) === null || _state$domainStates2$ === void 0 ? void 0 : _state$domainStates2$.height,
102
+ width: state === null || state === void 0 ? void 0 : (_state$domainStates3 = state.domainStates) === null || _state$domainStates3 === void 0 ? void 0 : (_state$domainStates3$ = _state$domainStates3.widgetSize) === null || _state$domainStates3$ === void 0 ? void 0 : _state$domainStates3$.width
103
+ }
104
+ });
105
+ }
88
106
  return;
89
107
  }
90
108
  }
@@ -110,9 +128,9 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
110
128
  chatSDKStateCleanUp(chatSDK);
111
129
  }
112
130
  try {
113
- var _state$appStates, _newAdapter$activity$;
131
+ var _state$appStates2, _newAdapter$activity$;
114
132
  // Clear disconnect state on start chat
115
- (state === null || state === void 0 ? void 0 : (_state$appStates = state.appStates) === null || _state$appStates === void 0 ? void 0 : _state$appStates.chatDisconnectEventReceived) && dispatch({
133
+ (state === null || state === void 0 ? void 0 : (_state$appStates2 = state.appStates) === null || _state$appStates2 === void 0 ? void 0 : _state$appStates2.chatDisconnectEventReceived) && dispatch({
116
134
  type: LiveChatWidgetActionType.SET_CHAT_DISCONNECT_EVENT_RECEIVED,
117
135
  payload: false
118
136
  });
@@ -207,7 +225,6 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
207
225
  payload: liveChatContext
208
226
  });
209
227
  logWidgetLoadComplete();
210
-
211
228
  // Set post chat context in state
212
229
  // Commenting this for now as post chat context is fetched during end chat
213
230
  await setPostChatContextAndLoadSurvey(chatSDK, dispatch);
@@ -224,9 +241,9 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
224
241
 
225
242
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
226
243
  const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
227
- var _state$appStates2, _persistedState$domai6, _persistedState$appSt;
244
+ var _state$appStates3, _persistedState$domai6, _persistedState$appSt;
228
245
  // By pass this function in case of popout chat
229
- if ((state === null || state === void 0 ? void 0 : (_state$appStates2 = state.appStates) === null || _state$appStates2 === void 0 ? void 0 : _state$appStates2.hideStartChatButton) === true) {
246
+ if ((state === null || state === void 0 ? void 0 : (_state$appStates3 = state.appStates) === null || _state$appStates3 === void 0 ? void 0 : _state$appStates3.hideStartChatButton) === true) {
230
247
  return false;
231
248
  }
232
249
  const persistedState = getStateFromCache(getWidgetCacheIdfromProps(props));
@@ -249,17 +266,17 @@ const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdap
249
266
 
250
267
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
251
268
  const setCustomContextParams = async (state, props) => {
252
- var _props$chatConfig, _props$chatConfig$Liv, _state$domainStates2, _persistedState$domai8;
269
+ var _props$chatConfig, _props$chatConfig$Liv, _state$domainStates4, _persistedState$domai8;
253
270
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
254
271
  const isAuthenticatedChat = props !== null && props !== void 0 && (_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && (_props$chatConfig$Liv = _props$chatConfig.LiveChatConfigAuthSettings) !== null && _props$chatConfig$Liv !== void 0 && _props$chatConfig$Liv.msdyn_javascriptclientfunction ? true : false;
255
272
  //Should not set custom context for auth chat
256
273
  if (isAuthenticatedChat) {
257
274
  return;
258
275
  }
259
- if (state !== null && state !== void 0 && (_state$domainStates2 = state.domainStates) !== null && _state$domainStates2 !== void 0 && _state$domainStates2.customContext) {
260
- var _state$domainStates3;
276
+ if (state !== null && state !== void 0 && (_state$domainStates4 = state.domainStates) !== null && _state$domainStates4 !== void 0 && _state$domainStates4.customContext) {
277
+ var _state$domainStates5;
261
278
  optionalParams = Object.assign({}, optionalParams, {
262
- customContext: JSON.parse(JSON.stringify(state === null || state === void 0 ? void 0 : (_state$domainStates3 = state.domainStates) === null || _state$domainStates3 === void 0 ? void 0 : _state$domainStates3.customContext))
279
+ customContext: JSON.parse(JSON.stringify(state === null || state === void 0 ? void 0 : (_state$domainStates5 = state.domainStates) === null || _state$domainStates5 === void 0 ? void 0 : _state$domainStates5.customContext))
263
280
  });
264
281
  return;
265
282
  }
@@ -307,8 +324,8 @@ const canStartPopoutChat = async props => {
307
324
 
308
325
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
309
326
  const checkIfConversationStillValid = async (chatSDK, dispatch, state) => {
310
- var _state$domainStates4, _state$domainStates4$;
311
- const requestIdFromCache = (_state$domainStates4 = state.domainStates) === null || _state$domainStates4 === void 0 ? void 0 : (_state$domainStates4$ = _state$domainStates4.liveChatContext) === null || _state$domainStates4$ === void 0 ? void 0 : _state$domainStates4$.requestId;
327
+ var _state$domainStates6, _state$domainStates6$;
328
+ const requestIdFromCache = (_state$domainStates6 = state.domainStates) === null || _state$domainStates6 === void 0 ? void 0 : (_state$domainStates6$ = _state$domainStates6.liveChatContext) === null || _state$domainStates6$ === void 0 ? void 0 : _state$domainStates6$.requestId;
312
329
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
313
330
  let conversationDetails = undefined;
314
331
 
@@ -334,11 +351,11 @@ const checkIfConversationStillValid = async (chatSDK, dispatch, state) => {
334
351
  return false;
335
352
  }
336
353
  return true;
337
- } catch (erorr) {
354
+ } catch (error) {
338
355
  TelemetryHelper.logActionEvent(LogLevel.ERROR, {
339
356
  Event: TelemetryEvent.GetConversationDetailsException,
340
357
  ExceptionDetails: {
341
- exception: `Conversation is not valid: ${erorr}`
358
+ exception: `Conversation is not valid: ${error}`
342
359
  }
343
360
  });
344
361
  chatSDK.requestId = currentRequestId;
@@ -136,9 +136,6 @@ export const LiveChatWidgetStateful = props => {
136
136
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
137
137
  payload: ConversationState.Loading
138
138
  });
139
- if (localState) {
140
- localState.appStates.conversationState = ConversationState.Loading;
141
- }
142
139
 
143
140
  //Check if conversation state is not in wrapup or closed state
144
141
  isChatValid = await checkIfConversationStillValid(chatSDK, dispatch, state);
@@ -155,7 +152,11 @@ export const LiveChatWidgetStateful = props => {
155
152
  // adding the reconnect logic for the case when customer tries to reconnect from a new browser or InPrivate browser
156
153
  const reconnectTriggered = await isReconnectTriggered();
157
154
  if (!reconnectTriggered) {
158
- await setPreChatAndInitiateChat(chatSDK, dispatch, setAdapter, undefined, undefined, localState, props);
155
+ const inMemoryState = executeReducer(state, {
156
+ type: LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
157
+ payload: null
158
+ });
159
+ await setPreChatAndInitiateChat(chatSDK, dispatch, setAdapter, undefined, undefined, inMemoryState, props);
159
160
  }
160
161
  return;
161
162
  } else {
@@ -335,31 +336,35 @@ export const LiveChatWidgetStateful = props => {
335
336
  }
336
337
  });
337
338
 
339
+ /**
340
+ * This will allow to sync multiple tabs to handle minimize and maximize state,
341
+ * the event is expected to be emitted from scripting layer.
342
+ */
343
+ BroadcastService.getMessageByEventName(BroadcastEvent.SyncMinimize).subscribe(msg => {
344
+ var _msg$payload4;
345
+ dispatch({
346
+ type: LiveChatWidgetActionType.SET_MINIMIZED,
347
+ payload: msg === null || msg === void 0 ? void 0 : (_msg$payload4 = msg.payload) === null || _msg$payload4 === void 0 ? void 0 : _msg$payload4.minimized
348
+ });
349
+ });
350
+
338
351
  // Start chat from SDK Event
339
352
  BroadcastService.getMessageByEventName(BroadcastEvent.StartChat).subscribe(msg => {
340
- var _msg$payload4, _msg$payload5, _msg$payload6, _inMemoryState$appSta, _inMemoryState$appSta2, _inMemoryState$appSta3, _inMemoryState$appSta4;
353
+ var _msg$payload5, _msg$payload6, _msg$payload7, _msg$payload9, _inMemoryState$appSta, _inMemoryState$appSta2, _inMemoryState$appSta3, _inMemoryState$appSta4;
341
354
  // If the startChat event is not initiated by the same tab. Ignore the call
342
- if (!isNullOrUndefined(msg === null || msg === void 0 ? void 0 : (_msg$payload4 = msg.payload) === null || _msg$payload4 === void 0 ? void 0 : _msg$payload4.runtimeId) && (msg === null || msg === void 0 ? void 0 : (_msg$payload5 = msg.payload) === null || _msg$payload5 === void 0 ? void 0 : _msg$payload5.runtimeId) !== TelemetryManager.InternalTelemetryData.lcwRuntimeId) {
355
+ if (!isNullOrUndefined(msg === null || msg === void 0 ? void 0 : (_msg$payload5 = msg.payload) === null || _msg$payload5 === void 0 ? void 0 : _msg$payload5.runtimeId) && (msg === null || msg === void 0 ? void 0 : (_msg$payload6 = msg.payload) === null || _msg$payload6 === void 0 ? void 0 : _msg$payload6.runtimeId) !== TelemetryManager.InternalTelemetryData.lcwRuntimeId) {
343
356
  return;
344
357
  }
345
- let stateWithUpdatedContext = state;
346
- if (msg !== null && msg !== void 0 && (_msg$payload6 = msg.payload) !== null && _msg$payload6 !== void 0 && _msg$payload6.customContext) {
347
- var _msg$payload7, _msg$payload8;
358
+ if (msg !== null && msg !== void 0 && (_msg$payload7 = msg.payload) !== null && _msg$payload7 !== void 0 && _msg$payload7.customContext) {
359
+ var _msg$payload8;
348
360
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
349
361
  Event: TelemetryEvent.CustomContextReceived,
350
362
  Description: "CustomContext received through startChat event."
351
363
  });
352
364
  dispatch({
353
365
  type: LiveChatWidgetActionType.SET_CUSTOM_CONTEXT,
354
- payload: msg === null || msg === void 0 ? void 0 : (_msg$payload7 = msg.payload) === null || _msg$payload7 === void 0 ? void 0 : _msg$payload7.customContext
366
+ payload: msg === null || msg === void 0 ? void 0 : (_msg$payload8 = msg.payload) === null || _msg$payload8 === void 0 ? void 0 : _msg$payload8.customContext
355
367
  });
356
- stateWithUpdatedContext = {
357
- ...state,
358
- domainStates: {
359
- ...state.domainStates,
360
- customContext: msg === null || msg === void 0 ? void 0 : (_msg$payload8 = msg.payload) === null || _msg$payload8 === void 0 ? void 0 : _msg$payload8.customContext
361
- }
362
- };
363
368
  }
364
369
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
365
370
  Event: TelemetryEvent.StartChatEventRecevied,
@@ -369,13 +374,14 @@ export const LiveChatWidgetStateful = props => {
369
374
  type: LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
370
375
  payload: null
371
376
  });
377
+ inMemoryState.domainStates.customContext = msg === null || msg === void 0 ? void 0 : (_msg$payload9 = msg.payload) === null || _msg$payload9 === void 0 ? void 0 : _msg$payload9.customContext;
372
378
 
373
379
  // Only initiate new chat if widget runtime state is one of the followings
374
380
  if (((_inMemoryState$appSta = inMemoryState.appStates) === null || _inMemoryState$appSta === void 0 ? void 0 : _inMemoryState$appSta.conversationState) === ConversationState.Closed || ((_inMemoryState$appSta2 = inMemoryState.appStates) === null || _inMemoryState$appSta2 === void 0 ? void 0 : _inMemoryState$appSta2.conversationState) === ConversationState.InActive || ((_inMemoryState$appSta3 = inMemoryState.appStates) === null || _inMemoryState$appSta3 === void 0 ? void 0 : _inMemoryState$appSta3.conversationState) === ConversationState.Postchat) {
375
381
  BroadcastService.postMessage({
376
382
  eventName: BroadcastEvent.ChatInitiated
377
383
  });
378
- prepareStartChat(props, chatSDK, stateWithUpdatedContext, dispatch, setAdapter);
384
+ prepareStartChat(props, chatSDK, inMemoryState, dispatch, setAdapter);
379
385
  return;
380
386
  }
381
387
 
@@ -442,8 +448,8 @@ export const LiveChatWidgetStateful = props => {
442
448
  // Listen to end chat event from other tabs
443
449
  const endChatEventName = getWidgetEndChatEventName(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC3 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC3 === void 0 ? void 0 : _chatSDK$omnichannelC3.widgetId, ((_props$controlProps11 = props.controlProps) === null || _props$controlProps11 === void 0 ? void 0 : _props$controlProps11.widgetInstanceId) ?? "");
444
450
  BroadcastService.getMessageByEventName(endChatEventName).subscribe(msg => {
445
- var _msg$payload9;
446
- if ((msg === null || msg === void 0 ? void 0 : (_msg$payload9 = msg.payload) === null || _msg$payload9 === void 0 ? void 0 : _msg$payload9.runtimeId) !== TelemetryManager.InternalTelemetryData.lcwRuntimeId) {
451
+ var _msg$payload10;
452
+ if ((msg === null || msg === void 0 ? void 0 : (_msg$payload10 = msg.payload) === null || _msg$payload10 === void 0 ? void 0 : _msg$payload10.runtimeId) !== TelemetryManager.InternalTelemetryData.lcwRuntimeId) {
447
453
  TelemetryHelper.logSDKEvent(LogLevel.INFO, {
448
454
  Event: TelemetryEvent.PrepareEndChat,
449
455
  Description: "Received EndChat BroadcastEvent from other tabs. Closing this chat."
@@ -12,6 +12,16 @@ export const getLiveChatWidgetContextInitialState = props => {
12
12
  const initialState = defaultClientDataStoreProvider(cacheTtlInMins, storageType).getData(widgetCacheId);
13
13
  if (!isNullOrUndefined(initialState)) {
14
14
  const initialStateFromCache = JSON.parse(initialState);
15
+
16
+ /*
17
+ * this step is needed to avoid the pre-chat pane to be injected in the DOM when the widget is reloaded, because wont be visible
18
+ * and it will be blocking all elements behind it
19
+ * as part of the flow, the pre-chat will be detected and then it will be displayed properly
20
+ * this case is only and only for pre-chat pane.
21
+ * **/
22
+ if (initialStateFromCache.appStates.conversationState === ConversationState.Prechat) {
23
+ initialStateFromCache.appStates.conversationState = ConversationState.Closed;
24
+ }
15
25
  return initialStateFromCache;
16
26
  }
17
27
  const LiveChatWidgetContextInitialState = {
@@ -81,7 +81,7 @@ const reducer = (state, action) => {
81
81
  inMemory = {
82
82
  ...inMemory,
83
83
  appStates: {
84
- ...state.appStates,
84
+ ...inMemory.appStates,
85
85
  isMinimized: action.payload
86
86
  }
87
87
  };
@@ -52,7 +52,8 @@ export declare enum BroadcastEvent {
52
52
  HideChatVisibilityChangeEvent = "hideChatVisibilityChangeEvent",
53
53
  UpdateSessionDataForTelemetry = "UpdateSessionDataForTelemetry",
54
54
  UpdateConversationDataForTelemetry = "UpdateConversationDataForTelemetry",
55
- ContactIdNotFound = "ContactIdNotFound"
55
+ ContactIdNotFound = "ContactIdNotFound",
56
+ SyncMinimize = "SyncMinimize"
56
57
  }
57
58
  export declare enum TelemetryEvent {
58
59
  CallAdded = "CallAdded",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/omnichannel-chat-widget",
3
- "version": "1.6.3-main.25307f2",
3
+ "version": "1.6.3-main.6248890",
4
4
  "description": "Microsoft Omnichannel Chat Widget",
5
5
  "main": "lib/cjs/index.js",
6
6
  "types": "lib/types/index.d.ts",
@@ -74,7 +74,7 @@
74
74
  "webpack-cli": "^4.9.2"
75
75
  },
76
76
  "dependencies": {
77
- "@microsoft/omnichannel-chat-components": "^1.1.1",
77
+ "@microsoft/omnichannel-chat-components": "^1.1.2",
78
78
  "@microsoft/omnichannel-chat-sdk": "1.6.3",
79
79
  "abort-controller-es5": "^2.0.1",
80
80
  "dompurify": "^2.3.4",
@@ -84,6 +84,7 @@
84
84
  "markdown-it-for-inline": "^0.1.1",
85
85
  "md5-typescript": "^1.0.5",
86
86
  "p-defer-es5": "^2.0.1",
87
+ "sanitize-html": "2.12.1",
87
88
  "slack-markdown-it": "^1.0.5"
88
89
  },
89
90
  "scripts": {
@@ -110,6 +111,7 @@
110
111
  "**/url-parse": "1.5.9",
111
112
  "**/p-defer-es5": "^2.0.1",
112
113
  "**/abort-controller-es5": "^2.0.1",
113
- "**/minimist": "1.2.6"
114
+ "**/minimist": "1.2.6",
115
+ "**/sanitize-html": "2.12.1"
114
116
  }
115
117
  }