@microsoft/omnichannel-chat-widget 1.5.1-main.c3533cf → 1.5.1-main.ee4453c

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 (74) hide show
  1. package/lib/cjs/common/Constants.js +15 -8
  2. package/lib/cjs/common/telemetry/TelemetryConstants.js +1 -2
  3. package/lib/cjs/common/utils.js +2 -1
  4. package/lib/cjs/components/livechatwidget/common/endChat.js +16 -4
  5. package/lib/cjs/components/livechatwidget/common/startChat.js +8 -82
  6. package/lib/cjs/components/livechatwidget/common/startChatErrorHandler.js +205 -0
  7. package/lib/cjs/components/livechatwidget/common/startChatErrorHandler.spec.js +282 -0
  8. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +12 -13
  9. package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +1 -1
  10. package/lib/cjs/components/startchaterrorpanestateful/StartChatErrorPaneStateful.js +68 -0
  11. package/lib/cjs/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneGeneralStyleProps.js +17 -0
  12. package/lib/cjs/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneIconImageProps.js +17 -0
  13. package/lib/cjs/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneIconStyleProps.js +15 -0
  14. package/lib/cjs/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneSubtitleStyleProps.js +17 -0
  15. package/lib/cjs/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneTitleStyleProps.js +17 -0
  16. package/lib/cjs/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneControlProps.js +1 -0
  17. package/lib/cjs/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneProps.js +1 -0
  18. package/lib/cjs/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneStyleProps.js +1 -0
  19. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +2 -11
  20. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.spec.js +1 -1
  21. package/lib/cjs/contexts/common/ConversationState.js +1 -0
  22. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +1 -0
  23. package/lib/cjs/controller/componentController.js +5 -1
  24. package/lib/esm/common/Constants.js +11 -6
  25. package/lib/esm/common/telemetry/TelemetryConstants.js +1 -2
  26. package/lib/esm/common/utils.js +3 -2
  27. package/lib/esm/components/livechatwidget/common/endChat.js +14 -3
  28. package/lib/esm/components/livechatwidget/common/startChat.js +9 -83
  29. package/lib/esm/components/livechatwidget/common/startChatErrorHandler.js +198 -0
  30. package/lib/esm/components/livechatwidget/common/startChatErrorHandler.spec.js +280 -0
  31. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +14 -15
  32. package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +1 -1
  33. package/lib/esm/components/startchaterrorpanestateful/StartChatErrorPaneStateful.js +57 -0
  34. package/lib/esm/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneGeneralStyleProps.js +10 -0
  35. package/lib/esm/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneIconImageProps.js +10 -0
  36. package/lib/esm/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneIconStyleProps.js +8 -0
  37. package/lib/esm/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneSubtitleStyleProps.js +10 -0
  38. package/lib/esm/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneTitleStyleProps.js +10 -0
  39. package/lib/esm/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneControlProps.js +1 -0
  40. package/lib/esm/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneProps.js +1 -0
  41. package/lib/esm/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneStyleProps.js +1 -0
  42. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +2 -11
  43. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.spec.js +1 -1
  44. package/lib/esm/contexts/common/ConversationState.js +1 -0
  45. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +1 -0
  46. package/lib/esm/controller/componentController.js +3 -0
  47. package/lib/types/common/Constants.d.ts +13 -4
  48. package/lib/types/common/telemetry/TelemetryConstants.d.ts +1 -1
  49. package/lib/types/components/livechatwidget/common/endChat.d.ts +4 -3
  50. package/lib/types/components/livechatwidget/common/startChatErrorHandler.d.ts +5 -0
  51. package/lib/types/components/livechatwidget/common/startChatErrorHandler.spec.d.ts +1 -0
  52. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetComponentOverrides.d.ts +1 -0
  53. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +1 -1
  54. package/lib/types/components/startchaterrorpanestateful/StartChatErrorPaneStateful.d.ts +3 -0
  55. package/lib/types/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneGeneralStyleProps.d.ts +2 -0
  56. package/lib/types/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneIconImageProps.d.ts +2 -0
  57. package/lib/types/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneIconStyleProps.d.ts +2 -0
  58. package/lib/types/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneSubtitleStyleProps.d.ts +2 -0
  59. package/lib/types/components/startchaterrorpanestateful/common/defaultStartChatErrorPaneTitleStyleProps.d.ts +2 -0
  60. package/lib/types/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneClassNames.d.ts +5 -0
  61. package/lib/types/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneComponentOverrides.d.ts +6 -0
  62. package/lib/types/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneControlProps.d.ts +10 -0
  63. package/lib/types/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneProps.d.ts +8 -0
  64. package/lib/types/components/startchaterrorpanestateful/interfaces/IStartChatErrorPaneStyleProps.d.ts +10 -0
  65. package/lib/types/contexts/common/ConversationState.d.ts +2 -1
  66. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
  67. package/lib/types/controller/componentController.d.ts +1 -0
  68. package/package.json +3 -3
  69. package/lib/types/components/loadingpanestateful/interfaces/IStartChatErrorPaneControlProps.d.ts +0 -4
  70. package/lib/types/components/loadingpanestateful/interfaces/IStartChatErrorPaneProps.d.ts +0 -4
  71. /package/lib/cjs/components/{loadingpanestateful/interfaces/IStartChatErrorPaneControlProps.js → startchaterrorpanestateful/interfaces/IStartChatErrorPaneClassNames.js} +0 -0
  72. /package/lib/cjs/components/{loadingpanestateful/interfaces/IStartChatErrorPaneProps.js → startchaterrorpanestateful/interfaces/IStartChatErrorPaneComponentOverrides.js} +0 -0
  73. /package/lib/esm/components/{loadingpanestateful/interfaces/IStartChatErrorPaneControlProps.js → startchaterrorpanestateful/interfaces/IStartChatErrorPaneClassNames.js} +0 -0
  74. /package/lib/esm/components/{loadingpanestateful/interfaces/IStartChatErrorPaneProps.js → startchaterrorpanestateful/interfaces/IStartChatErrorPaneComponentOverrides.js} +0 -0
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.shouldShowWebChatContainer = exports.shouldShowReconnectChatPane = exports.shouldShowProactiveChatPane = exports.shouldShowPreChatSurveyPane = exports.shouldShowPostChatSurveyPane = exports.shouldShowPostChatLoadingPane = exports.shouldShowOutOfOfficeHoursPane = exports.shouldShowLoadingPane = exports.shouldShowHeader = exports.shouldShowFooter = exports.shouldShowEmailTranscriptPane = exports.shouldShowConfirmationPane = exports.shouldShowChatButton = exports.shouldShowCallingContainer = void 0;
6
+ exports.shouldShowWebChatContainer = exports.shouldShowStartChatErrorPane = exports.shouldShowReconnectChatPane = exports.shouldShowProactiveChatPane = exports.shouldShowPreChatSurveyPane = exports.shouldShowPostChatSurveyPane = exports.shouldShowPostChatLoadingPane = exports.shouldShowOutOfOfficeHoursPane = exports.shouldShowLoadingPane = exports.shouldShowHeader = exports.shouldShowFooter = exports.shouldShowEmailTranscriptPane = exports.shouldShowConfirmationPane = exports.shouldShowChatButton = exports.shouldShowCallingContainer = void 0;
7
7
  var _ConversationState = require("../contexts/common/ConversationState");
8
8
  const shouldShowChatButton = state => {
9
9
  var _state$appStates;
@@ -34,6 +34,10 @@ const shouldShowLoadingPane = state => {
34
34
  return !state.appStates.isMinimized && state.appStates.conversationState === _ConversationState.ConversationState.Loading;
35
35
  };
36
36
  exports.shouldShowLoadingPane = shouldShowLoadingPane;
37
+ const shouldShowStartChatErrorPane = state => {
38
+ return !state.appStates.isMinimized && state.appStates.conversationState === _ConversationState.ConversationState.Error;
39
+ };
40
+ exports.shouldShowStartChatErrorPane = shouldShowStartChatErrorPane;
37
41
  const shouldShowReconnectChatPane = state => {
38
42
  return !state.appStates.isMinimized && state.appStates.conversationState === _ConversationState.ConversationState.ReconnectChat;
39
43
  };
@@ -174,11 +174,6 @@ export let ElementType;
174
174
  (function (ElementType) {
175
175
  ElementType["CallingContainerSDK"] = "CallingContainerSDK";
176
176
  })(ElementType || (ElementType = {}));
177
- export let ChatSDKError;
178
- (function (ChatSDKError) {
179
- ChatSDKError["WidgetUseOutsideOperatingHour"] = "WidgetUseOutsideOperatingHour";
180
- ChatSDKError["AuthContactIdNotFoundFailure"] = "AuthContactIdNotFoundFailure";
181
- })(ChatSDKError || (ChatSDKError = {}));
182
177
  export let EnvironmentVersion;
183
178
  (function (EnvironmentVersion) {
184
179
  EnvironmentVersion["prod"] = "prod";
@@ -252,6 +247,10 @@ _defineProperty(NotificationPaneConstants, "IconText", "Notification Icon");
252
247
  _defineProperty(NotificationPaneConstants, "ChatDisconnectTitleText", "Chat disconnected");
253
248
  _defineProperty(NotificationPaneConstants, "ChatDisconnectSubtitleText", "For additional assistance, please close the chat and try again.");
254
249
  _defineProperty(NotificationPaneConstants, "ChromeCloseIconName", "ChromeClose");
250
+ export class StartChatErrorPaneConstants {}
251
+ _defineProperty(StartChatErrorPaneConstants, "DefaultStartChatErrorPaneId", "oc-lcw-start-chat-error-pane");
252
+ _defineProperty(StartChatErrorPaneConstants, "DefaultStartChatErrorTitleText", "We are unable to load chat at this time.");
253
+ _defineProperty(StartChatErrorPaneConstants, "DefaultStartChatErrorSubtitleText", "Please try again later.");
255
254
  export class AriaTelemetryConstants {}
256
255
  // Aria Endpoint for different environment types.
257
256
  _defineProperty(AriaTelemetryConstants, "GERMANY_ENDPOINT", "https://de.pipe.aria.microsoft.com/Collector/3.0/");
@@ -265,4 +264,10 @@ _defineProperty(AriaTelemetryConstants, "MOONCAKE_ENDPOINT", "");
265
264
  _defineProperty(AriaTelemetryConstants, "Public", "Public");
266
265
  _defineProperty(AriaTelemetryConstants, "EU", "Europe");
267
266
  // EUR: crm4; FRA: crm12; GER: crm16; CHE: crm17; NOR: crm19
268
- _defineProperty(AriaTelemetryConstants, "lcwEUDomainNames", ["crm4.omnichannelengagementhub.com", "crm12.omnichannelengagementhub.com", "crm16.omnichannelengagementhub.com", "crm17.omnichannelengagementhub.com", "crm19.omnichannelengagementhub.com"]);
267
+ _defineProperty(AriaTelemetryConstants, "lcwEUDomainNames", ["crm4.omnichannelengagementhub.com", "crm12.omnichannelengagementhub.com", "crm16.omnichannelengagementhub.com", "crm17.omnichannelengagementhub.com", "crm19.omnichannelengagementhub.com"]);
268
+ export class WidgetLoadTelemetryMessage {}
269
+ _defineProperty(WidgetLoadTelemetryMessage, "OOOHMessage", "Widget is OOOH");
270
+ _defineProperty(WidgetLoadTelemetryMessage, "PersistedStateRetrievedMessage", "Persisted state retrieved");
271
+ export class WidgetLoadCustomErrorString {}
272
+ _defineProperty(WidgetLoadCustomErrorString, "AuthenticationFailedErrorString", "Authentication was not successful");
273
+ _defineProperty(WidgetLoadCustomErrorString, "NetworkErrorString", "Network Error");
@@ -127,10 +127,10 @@ export let TelemetryEvent;
127
127
  TelemetryEvent["ErrorUIPaneLoaded"] = "ErrorUIPaneLoaded";
128
128
  TelemetryEvent["DownloadTranscriptFailed"] = "DownloadTranscriptFailed";
129
129
  TelemetryEvent["StartChatFailed"] = "StartChatFailed";
130
- TelemetryEvent["IC3ThreadUpdateEventReceived"] = "IC3ThreadUpdateEventReceived";
131
130
  TelemetryEvent["ConfirmationCancelButtonClicked"] = "ConfirmationCancelButtonClicked";
132
131
  TelemetryEvent["ConfirmationConfirmButtonClicked"] = "ConfirmationConfirmButtonClicked";
133
132
  TelemetryEvent["LoadingPaneLoaded"] = "LoadingPaneLoaded";
133
+ TelemetryEvent["StartChatErrorPaneLoaded"] = "StartChatErrorPaneLoaded";
134
134
  TelemetryEvent["EmailTranscriptLoaded"] = "EmailTranscriptLoaded";
135
135
  TelemetryEvent["OutOfOfficePaneLoaded"] = "OutOfOfficePaneLoaded";
136
136
  TelemetryEvent["ConfirmationPaneLoaded"] = "ConfirmationPaneLoaded";
@@ -244,7 +244,6 @@ export class TelemetryConstants {
244
244
  case TelemetryEvent.EmailTranscriptSent:
245
245
  case TelemetryEvent.EmailTranscriptFailed:
246
246
  case TelemetryEvent.DownloadTranscriptFailed:
247
- case TelemetryEvent.IC3ThreadUpdateEventReceived:
248
247
  case TelemetryEvent.ConfirmationCancelButtonClicked:
249
248
  case TelemetryEvent.ConfirmationConfirmButtonClicked:
250
249
  case TelemetryEvent.PreChatSurveyStartChatMethodFailed:
@@ -1,11 +1,12 @@
1
1
  var _this = this;
2
- import { AriaTelemetryConstants, ChatSDKError, Constants, HtmlAttributeNames, LocaleConstants } from "./Constants";
2
+ import { AriaTelemetryConstants, Constants, HtmlAttributeNames, LocaleConstants } from "./Constants";
3
3
  import { BroadcastEvent, LogLevel, TelemetryEvent } from "./telemetry/TelemetryConstants";
4
4
  import { BroadcastService } from "@microsoft/omnichannel-chat-components";
5
5
  import { DataStoreManager } from "./contextDataStore/DataStoreManager";
6
6
  import { KeyCodes } from "./KeyCodes";
7
7
  import { Md5 } from "md5-typescript";
8
8
  import { TelemetryHelper } from "./telemetry/TelemetryHelper";
9
+ import { ChatSDKErrorName } from "@microsoft/omnichannel-chat-sdk";
9
10
  const getElementBySelector = selector => {
10
11
  let element;
11
12
  if (typeof selector === "string") {
@@ -373,7 +374,7 @@ export const getConversationDetailsCall = async chatSDK => {
373
374
 
374
375
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
375
376
  export const checkContactIdError = e => {
376
- if ((e === null || e === void 0 ? void 0 : e.message) === ChatSDKError.AuthContactIdNotFoundFailure) {
377
+ if ((e === null || e === void 0 ? void 0 : e.message) === ChatSDKErrorName.AuthContactIdNotFoundFailure) {
377
378
  const contactIdNotFoundErrorEvent = {
378
379
  eventName: BroadcastEvent.ContactIdNotFound,
379
380
  payload: {
@@ -10,6 +10,7 @@ import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
10
10
  import { WebChatStoreLoader } from "../../webchatcontainerstateful/webchatcontroller/WebChatStoreLoader";
11
11
  import { defaultWebChatContainerStatefulProps } from "../../webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps";
12
12
  import { TelemetryManager } from "../../../common/telemetry/TelemetryManager";
13
+ import { uuidv4 } from "@microsoft/omnichannel-chat-sdk";
13
14
 
14
15
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
16
  const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter) => {
@@ -145,7 +146,7 @@ const endChat = async (props, chatSDK, state, dispatch, setAdapter, setWebChatSt
145
146
  });
146
147
  }
147
148
  };
148
- export const callingStateCleanUp = async dispatch => {
149
+ export const callingStateCleanUp = dispatch => {
149
150
  dispatch({
150
151
  type: LiveChatWidgetActionType.SHOW_CALLING_CONTAINER,
151
152
  payload: false
@@ -167,7 +168,7 @@ export const callingStateCleanUp = async dispatch => {
167
168
  payload: true
168
169
  });
169
170
  };
170
- export const endChatStateCleanUp = async dispatch => {
171
+ export const endChatStateCleanUp = dispatch => {
171
172
  // Need to clear these states immediately when chat ended from OC.
172
173
  dispatch({
173
174
  type: LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
@@ -182,7 +183,7 @@ export const endChatStateCleanUp = async dispatch => {
182
183
  payload: false
183
184
  });
184
185
  };
185
- export const closeChatStateCleanUp = async dispatch => {
186
+ export const closeChatStateCleanUp = dispatch => {
186
187
  dispatch({
187
188
  type: LiveChatWidgetActionType.SET_CHAT_TOKEN,
188
189
  payload: undefined
@@ -218,6 +219,16 @@ export const closeChatStateCleanUp = async dispatch => {
218
219
  });
219
220
  };
220
221
 
222
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
223
+ export const chatSDKStateCleanUp = chatSDK => {
224
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
225
+ chatSDK.requestId = uuidv4();
226
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
227
+ chatSDK.chatToken = {};
228
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
229
+ chatSDK.reconnectId = null;
230
+ };
231
+
221
232
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
222
233
  export const endVoiceVideoCallIfOngoing = async (chatSDK, dispatch) => {
223
234
  let callId = "";
@@ -1,13 +1,11 @@
1
1
  import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
2
- import { ChatSDKError, Constants, LiveWorkItemState } from "../../../common/Constants";
2
+ import { Constants, LiveWorkItemState, WidgetLoadCustomErrorString, WidgetLoadTelemetryMessage } from "../../../common/Constants";
3
3
  import { checkContactIdError, createTimer, getConversationDetailsCall, getStateFromCache, getWidgetCacheIdfromProps, isNullOrEmptyString, isUndefinedOrEmpty } from "../../../common/utils";
4
4
  import { getAuthClientFunction, handleAuthentication } from "./authHelper";
5
5
  import { ActivityStreamHandler } from "./ActivityStreamHandler";
6
6
  import { BroadcastService } from "@microsoft/omnichannel-chat-components";
7
7
  import { ConversationState } from "../../../contexts/common/ConversationState";
8
8
  import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
9
- import { NotificationHandler } from "../../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler";
10
- import { NotificationScenarios } from "../../webchatcontainerstateful/webchatcontroller/enums/NotificationScenarios";
11
9
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
12
10
  import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
13
11
  import { createAdapter } from "./createAdapter";
@@ -15,7 +13,8 @@ import { createOnNewAdapterActivityHandler } from "../../../plugins/newMessageEv
15
13
  import { handleChatReconnect, isPersistentEnabled, isReconnectEnabled } from "./reconnectChatHelper";
16
14
  import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey";
17
15
  import { updateSessionDataForTelemetry } from "./updateSessionDataForTelemetry";
18
- import { uuidv4 } from "@microsoft/omnichannel-chat-sdk";
16
+ import { logWidgetLoadComplete, handleStartChatError } from "./startChatErrorHandler";
17
+ import { chatSDKStateCleanUp } from "./endChat";
19
18
 
20
19
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
20
  let optionalParams = {};
@@ -108,19 +107,15 @@ const setPreChatAndInitiateChat = async (chatSDK, dispatch, setAdapter, isProact
108
107
 
109
108
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
110
109
  const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params, persistedState) => {
111
- var _props$controlProps2;
112
110
  let isStartChatSuccessful = false;
113
111
  const chatConfig = props === null || props === void 0 ? void 0 : props.chatConfig;
114
112
  const getAuthToken = props === null || props === void 0 ? void 0 : props.getAuthToken;
115
- const hideErrorUIPane = props === null || props === void 0 ? void 0 : (_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.hideErrorUIPane;
116
113
  if ((state === null || state === void 0 ? void 0 : state.appStates.conversationState) === ConversationState.Closed) {
117
114
  // Preventive reset to avoid starting chat with previous requestId which could potentially cause problems
118
- chatSDK.requestId = uuidv4();
119
- chatSDK.chatToken = {};
120
- chatSDK.reconnectId = null;
115
+ chatSDKStateCleanUp(chatSDK);
121
116
  }
122
117
  try {
123
- var _state$appStates, _newAdapter$activity$, _TelemetryTimers$Widg2;
118
+ var _state$appStates, _newAdapter$activity$;
124
119
  // Clear disconnect state on start chat
125
120
  (state === null || state === void 0 ? void 0 : (_state$appStates = state.appStates) === null || _state$appStates === void 0 ? void 0 : _state$appStates.chatDisconnectEventReceived) && dispatch({
126
121
  type: LiveChatWidgetActionType.SET_CHAT_DISCONNECT_EVENT_RECEIVED,
@@ -138,8 +133,7 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
138
133
  // set auth token to chat sdk before start chat
139
134
  const authSuccess = await handleAuthentication(chatSDK, chatConfig, getAuthToken);
140
135
  if (!authSuccess) {
141
- // Replacing with error ui
142
- throw new Error("Authentication was not successful");
136
+ throw new Error(WidgetLoadCustomErrorString.AuthenticationFailedErrorString);
143
137
  }
144
138
  }
145
139
 
@@ -202,16 +196,11 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
202
196
  });
203
197
  }
204
198
  if (persistedState) {
205
- var _TelemetryTimers$Widg;
206
199
  dispatch({
207
200
  type: LiveChatWidgetActionType.SET_WIDGET_STATE,
208
201
  payload: persistedState
209
202
  });
210
- TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
211
- Event: TelemetryEvent.WidgetLoadComplete,
212
- Description: "Widget load complete. Persisted state retrieved",
213
- ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg === void 0 ? void 0 : _TelemetryTimers$Widg.milliSecondsElapsed
214
- });
203
+ logWidgetLoadComplete(WidgetLoadTelemetryMessage.PersistedStateRetrievedMessage);
215
204
  await setPostChatContextAndLoadSurvey(chatSDK, dispatch, true);
216
205
  return;
217
206
  }
@@ -222,11 +211,7 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
222
211
  type: LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
223
212
  payload: liveChatContext
224
213
  });
225
- TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
226
- Event: TelemetryEvent.WidgetLoadComplete,
227
- Description: "Widget load complete",
228
- ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg2 = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg2 === void 0 ? void 0 : _TelemetryTimers$Widg2.milliSecondsElapsed
229
- });
214
+ logWidgetLoadComplete();
230
215
 
231
216
  // Set post chat context in state
232
217
  // Commenting this for now as post chat context is fetched during end chat
@@ -235,72 +220,13 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
235
220
  // Updating chat session detail for telemetry
236
221
  await updateSessionDataForTelemetry(chatSDK, dispatch);
237
222
  } catch (ex) {
238
- var _TelemetryTimers$Widg4;
239
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
240
- if (ex.message === ChatSDKError.WidgetUseOutsideOperatingHour) {
241
- var _TelemetryTimers$Widg3;
242
- dispatch({
243
- type: LiveChatWidgetActionType.SET_OUTSIDE_OPERATING_HOURS,
244
- payload: true
245
- });
246
- dispatch({
247
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
248
- payload: ConversationState.OutOfOffice
249
- });
250
- TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
251
- Event: TelemetryEvent.WidgetLoadComplete,
252
- Description: "Widget load complete. Widget is OOOH.",
253
- ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg3 = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg3 === void 0 ? void 0 : _TelemetryTimers$Widg3.milliSecondsElapsed
254
- });
255
- return;
256
- }
257
- TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
258
- Event: TelemetryEvent.WidgetLoadFailed,
259
- ExceptionDetails: {
260
- Exception: `Widget load Failed: ${ex}`
261
- },
262
- ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg4 = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg4 === void 0 ? void 0 : _TelemetryTimers$Widg4.milliSecondsElapsed
263
- });
264
- NotificationHandler.notifyError(NotificationScenarios.Connection, "Start Chat Failed: " + ex);
265
- dispatch({
266
- type: LiveChatWidgetActionType.SET_START_CHAT_FAILING,
267
- payload: true
268
- });
269
- if (!hideErrorUIPane) {
270
- // Set app state to failing start chat if hideErrorUI is not turned on
271
- TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
272
- Event: TelemetryEvent.ErrorUIPaneLoaded,
273
- Description: "Error UI Pane Loaded"
274
- });
275
- }
276
- // Show the loading pane in other cases for failure, this will help for both hideStartChatButton case
277
- dispatch({
278
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
279
- payload: ConversationState.Loading
280
- });
281
-
282
- // If sessionInit was successful but LCW startchat failed due to some reason e.g adapter didn't load
283
- // we need to directly endChat to avoid leaving ghost chats in OC, not disturbing any other UI state
284
- if (isStartChatSuccessful === true) {
285
- await forceEndChat(chatSDK);
286
- }
223
+ handleStartChatError(dispatch, chatSDK, props, ex, isStartChatSuccessful);
287
224
  } finally {
288
225
  optionalParams = {};
289
226
  widgetInstanceId = "";
290
227
  }
291
228
  };
292
229
 
293
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
294
- const forceEndChat = async chatSDK => {
295
- TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
296
- Event: TelemetryEvent.WidgetLoadFailed,
297
- ExceptionDetails: {
298
- Exception: "SessionInit was successful, but widget load failed."
299
- }
300
- });
301
- chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.endChat();
302
- };
303
-
304
230
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
305
231
  const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
306
232
  var _state$appStates2, _persistedState$domai6, _persistedState$appSt;
@@ -0,0 +1,198 @@
1
+ import { ChatSDKErrorName, ChatSDKError } from "@microsoft/omnichannel-chat-sdk";
2
+ import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
3
+ import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
4
+ import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
5
+ import { ConversationState } from "../../../contexts/common/ConversationState";
6
+ import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
7
+ import { callingStateCleanUp, endChatStateCleanUp, closeChatStateCleanUp, chatSDKStateCleanUp } from "./endChat";
8
+ import { DataStoreManager } from "../../../common/contextDataStore/DataStoreManager";
9
+ import { getWidgetCacheIdfromProps } from "../../../common/utils";
10
+ import { WidgetLoadCustomErrorString, WidgetLoadTelemetryMessage } from "../../../common/Constants";
11
+
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ export const handleStartChatError = (dispatch, chatSDK, props, ex, isStartChatSuccessful) => {
14
+ var _props$controlProps;
15
+ if (!ex) {
16
+ logWidgetLoadFailed();
17
+ return;
18
+ }
19
+
20
+ // Handle internal or misc errors
21
+ if (ex.message === WidgetLoadCustomErrorString.AuthenticationFailedErrorString || ex.message === WidgetLoadCustomErrorString.NetworkErrorString) {
22
+ logWidgetLoadCompleteWithError(ex);
23
+ }
24
+
25
+ // Handle ChatSDK errors
26
+ if (ex instanceof ChatSDKError) {
27
+ switch (ex.message) {
28
+ case ChatSDKErrorName.WidgetUseOutsideOperatingHour:
29
+ handleWidgetUseOutsideOperatingHour(dispatch);
30
+ return;
31
+ case ChatSDKErrorName.PersistentChatConversationRetrievalFailure:
32
+ handlePersistentChatConversationRetrievalFailure(ex);
33
+ break;
34
+ case ChatSDKErrorName.ConversationInitializationFailure:
35
+ handleConversationInitializationFailure(ex);
36
+ break;
37
+ case ChatSDKErrorName.ChatTokenRetrievalFailure:
38
+ handleChatTokenRetrievalFailure(ex);
39
+ break;
40
+ case ChatSDKErrorName.UninitializedChatSDK:
41
+ handleUninitializedChatSDK(ex);
42
+ break;
43
+ case ChatSDKErrorName.InvalidConversation:
44
+ case ChatSDKErrorName.ClosedConversation:
45
+ handleInvalidOrClosedConversation(dispatch, chatSDK, props, ex);
46
+ return;
47
+ default:
48
+ logWidgetLoadFailed(ex);
49
+ }
50
+ }
51
+
52
+ // Show the error UI pane
53
+ dispatch({
54
+ type: LiveChatWidgetActionType.SET_START_CHAT_FAILING,
55
+ payload: true
56
+ });
57
+ if (!(props !== null && props !== void 0 && (_props$controlProps = props.controlProps) !== null && _props$controlProps !== void 0 && _props$controlProps.hideErrorUIPane)) {
58
+ // New flow of leveraging ConversationState.Error
59
+ // Set app state to failing start chat if hideErrorUI is not turned on
60
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
61
+ Event: TelemetryEvent.ErrorUIPaneLoaded,
62
+ Description: "Error UI Pane Loaded"
63
+ });
64
+ dispatch({
65
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
66
+ payload: ConversationState.Error
67
+ });
68
+ } else {
69
+ // Old flow of leveraging ConversationState.Loading
70
+ // Show the loading pane in other cases for failure, this will help for both hideStartChatButton case
71
+ dispatch({
72
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
73
+ payload: ConversationState.Loading
74
+ });
75
+ }
76
+
77
+ // If sessionInit was successful but LCW startchat failed due to some reason e.g adapter didn't load
78
+ // we need to directly endChat to avoid leaving ghost chats in OC, not disturbing any other UI state
79
+ if (isStartChatSuccessful === true) {
80
+ forceEndChat(chatSDK);
81
+ }
82
+ };
83
+ const logWidgetLoadFailed = ex => {
84
+ var _TelemetryTimers$Widg;
85
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
+ const exDetails = {
87
+ Exception: `Widget load complete with error: ${ex}`
88
+ };
89
+ if (ex !== null && ex !== void 0 && ex.httpResponseStatusCode) {
90
+ exDetails.HttpResponseStatusCode = ex.httpResponseStatusCode;
91
+ }
92
+ TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
93
+ Event: TelemetryEvent.WidgetLoadFailed,
94
+ ExceptionDetails: exDetails,
95
+ ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg === void 0 ? void 0 : _TelemetryTimers$Widg.milliSecondsElapsed
96
+ });
97
+ };
98
+ export const logWidgetLoadComplete = additionalMessage => {
99
+ var _TelemetryTimers$Widg2;
100
+ let descriptionString = "Widget load complete";
101
+ if (additionalMessage) {
102
+ descriptionString += `. ${additionalMessage}`;
103
+ }
104
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
105
+ Event: TelemetryEvent.WidgetLoadComplete,
106
+ Description: descriptionString,
107
+ ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg2 = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg2 === void 0 ? void 0 : _TelemetryTimers$Widg2.milliSecondsElapsed
108
+ });
109
+ };
110
+ const logWidgetLoadCompleteWithError = ex => {
111
+ var _TelemetryTimers$Widg3;
112
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
113
+ const exDetails = {
114
+ Exception: `Widget load complete with error: ${ex}`
115
+ };
116
+ if (ex !== null && ex !== void 0 && ex.httpResponseStatusCode) {
117
+ exDetails.HttpResponseStatusCode = ex.httpResponseStatusCode;
118
+ }
119
+ TelemetryHelper.logLoadingEvent(LogLevel.WARN, {
120
+ Event: TelemetryEvent.WidgetLoadComplete,
121
+ Description: "Widget load complete with error",
122
+ ExceptionDetails: exDetails,
123
+ ElapsedTimeInMilliseconds: TelemetryTimers === null || TelemetryTimers === void 0 ? void 0 : (_TelemetryTimers$Widg3 = TelemetryTimers.WidgetLoadTimer) === null || _TelemetryTimers$Widg3 === void 0 ? void 0 : _TelemetryTimers$Widg3.milliSecondsElapsed
124
+ });
125
+ };
126
+
127
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
128
+ const forceEndChat = chatSDK => {
129
+ TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
130
+ Event: TelemetryEvent.WidgetLoadFailed,
131
+ ExceptionDetails: {
132
+ Exception: "SessionInit was successful, but widget load failed."
133
+ }
134
+ });
135
+ chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.endChat();
136
+ };
137
+ const handleWidgetUseOutsideOperatingHour = dispatch => {
138
+ dispatch({
139
+ type: LiveChatWidgetActionType.SET_OUTSIDE_OPERATING_HOURS,
140
+ payload: true
141
+ });
142
+ dispatch({
143
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
144
+ payload: ConversationState.OutOfOffice
145
+ });
146
+ logWidgetLoadComplete(WidgetLoadTelemetryMessage.OOOHMessage);
147
+ };
148
+
149
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
150
+ const handlePersistentChatConversationRetrievalFailure = ex => {
151
+ if (ex.httpResponseStatusCode === 400) {
152
+ logWidgetLoadFailed(ex);
153
+ } else {
154
+ logWidgetLoadCompleteWithError(ex);
155
+ }
156
+ };
157
+
158
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
159
+ const handleConversationInitializationFailure = ex => {
160
+ if (ex.httpResponseStatusCode === 400) {
161
+ logWidgetLoadFailed(ex);
162
+ } else {
163
+ logWidgetLoadCompleteWithError(ex);
164
+ }
165
+ };
166
+
167
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
168
+ const handleChatTokenRetrievalFailure = ex => {
169
+ if (ex.httpResponseStatusCode === 400) {
170
+ logWidgetLoadFailed(ex);
171
+ } else {
172
+ logWidgetLoadCompleteWithError(ex);
173
+ }
174
+ };
175
+
176
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
177
+ const handleUninitializedChatSDK = ex => {
178
+ logWidgetLoadCompleteWithError(ex);
179
+ };
180
+
181
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
182
+ const handleInvalidOrClosedConversation = (dispatch, chatSDK, props, ex) => {
183
+ var _DataStoreManager$cli;
184
+ logWidgetLoadCompleteWithError(ex);
185
+
186
+ // Reset all internal states
187
+ callingStateCleanUp(dispatch);
188
+ endChatStateCleanUp(dispatch);
189
+ closeChatStateCleanUp(dispatch);
190
+ chatSDKStateCleanUp(chatSDK);
191
+ (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.removeData(getWidgetCacheIdfromProps(props));
192
+
193
+ // Starts new chat
194
+ dispatch({
195
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
196
+ payload: ConversationState.Closed
197
+ });
198
+ };