@microsoft/omnichannel-chat-widget 1.5.1-main.76c6a71 → 1.5.1-main.e2be12d

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 (28) hide show
  1. package/lib/cjs/common/Constants.js +10 -8
  2. package/lib/cjs/common/telemetry/TelemetryConstants.js +0 -2
  3. package/lib/cjs/common/utils.js +2 -1
  4. package/lib/cjs/components/livechatwidget/common/chatDisconnectHelper.js +31 -16
  5. package/lib/cjs/components/livechatwidget/common/endChat.js +16 -4
  6. package/lib/cjs/components/livechatwidget/common/startChat.js +16 -84
  7. package/lib/cjs/components/livechatwidget/common/startChatErrorHandler.js +198 -0
  8. package/lib/cjs/components/livechatwidget/common/startChatErrorHandler.spec.js +282 -0
  9. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +2 -10
  10. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +0 -8
  11. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.spec.js +1 -1
  12. package/lib/esm/common/Constants.js +7 -6
  13. package/lib/esm/common/telemetry/TelemetryConstants.js +0 -2
  14. package/lib/esm/common/utils.js +3 -2
  15. package/lib/esm/components/livechatwidget/common/chatDisconnectHelper.js +31 -16
  16. package/lib/esm/components/livechatwidget/common/endChat.js +14 -3
  17. package/lib/esm/components/livechatwidget/common/startChat.js +17 -85
  18. package/lib/esm/components/livechatwidget/common/startChatErrorHandler.js +191 -0
  19. package/lib/esm/components/livechatwidget/common/startChatErrorHandler.spec.js +280 -0
  20. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +3 -11
  21. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +0 -8
  22. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.spec.js +1 -1
  23. package/lib/types/common/Constants.d.ts +8 -4
  24. package/lib/types/common/telemetry/TelemetryConstants.d.ts +0 -1
  25. package/lib/types/components/livechatwidget/common/endChat.d.ts +4 -3
  26. package/lib/types/components/livechatwidget/common/startChatErrorHandler.d.ts +5 -0
  27. package/lib/types/components/livechatwidget/common/startChatErrorHandler.spec.d.ts +1 -0
  28. package/package.json +2 -2
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+
3
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
4
+ var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
5
+ var _startChatErrorHandler = require("./startChatErrorHandler");
6
+ var _Constants = require("../../../common/Constants");
7
+ var _omnichannelChatSdk = require("@microsoft/omnichannel-chat-sdk");
8
+ var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
9
+ var _ConversationState = require("../../../contexts/common/ConversationState");
10
+ describe("startChatErrorHandler unit test", () => {
11
+ it("handleStartChatError should log failed event and return if exception is undefined", () => {
12
+ const dispatch = jest.fn();
13
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
14
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
15
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, undefined, false);
16
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(1);
17
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("ERROR", expect.objectContaining({
18
+ ExceptionDetails: expect.objectContaining({
19
+ Exception: "Widget load complete with error: undefined"
20
+ })
21
+ }));
22
+ expect(dispatch).not.toHaveBeenCalled();
23
+ });
24
+ it("handleStartChatError should log failed with error event for AuthenticationFailedErrorString", () => {
25
+ const dispatch = jest.fn();
26
+ const mockEx = new Error(_Constants.WidgetLoadCustomErrorString.AuthenticationFailedErrorString);
27
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
28
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
29
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
30
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(2);
31
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("WARN", expect.objectContaining({
32
+ ExceptionDetails: expect.objectContaining({
33
+ Exception: `Widget load complete with error: Error: ${_Constants.WidgetLoadCustomErrorString.AuthenticationFailedErrorString}`
34
+ })
35
+ }));
36
+ expect(dispatch).toHaveBeenCalledTimes(2);
37
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
38
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
39
+ }));
40
+ });
41
+ it("handleStartChatError should log failed with error event for NetworkErrorString", () => {
42
+ const dispatch = jest.fn();
43
+ const mockEx = new Error(_Constants.WidgetLoadCustomErrorString.NetworkErrorString);
44
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
45
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
46
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
47
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(2);
48
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("WARN", expect.objectContaining({
49
+ ExceptionDetails: expect.objectContaining({
50
+ Exception: `Widget load complete with error: Error: ${_Constants.WidgetLoadCustomErrorString.NetworkErrorString}`
51
+ })
52
+ }));
53
+ expect(dispatch).toHaveBeenCalledTimes(2);
54
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
55
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
56
+ }));
57
+ });
58
+ it("handleStartChatError should log complete event for WidgetUseOutsideOperatingHour", () => {
59
+ const dispatch = jest.fn();
60
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.WidgetUseOutsideOperatingHour);
61
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
62
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
63
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
64
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(1);
65
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("INFO", expect.objectContaining({
66
+ Description: `Widget load complete. ${_Constants.WidgetLoadTelemetryMessage.OOOHMessage}`
67
+ }));
68
+ expect(dispatch).toHaveBeenCalledTimes(2);
69
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
70
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
71
+ }));
72
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
73
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_OUTSIDE_OPERATING_HOURS
74
+ }));
75
+ });
76
+ it("handleStartChatError should log failed with error event for PersistentChatConversationRetrievalFailure for non-400 status", () => {
77
+ const dispatch = jest.fn();
78
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.PersistentChatConversationRetrievalFailure, 429);
79
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
80
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
81
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
82
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(2);
83
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("WARN", expect.objectContaining({
84
+ Description: "Widget load complete with error",
85
+ ExceptionDetails: expect.objectContaining({
86
+ Exception: `Widget load complete with error: ${_omnichannelChatSdk.ChatSDKErrorName.PersistentChatConversationRetrievalFailure}`,
87
+ HttpResponseStatusCode: 429
88
+ })
89
+ }));
90
+ expect(dispatch).toHaveBeenCalledTimes(2);
91
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
92
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
93
+ }));
94
+ });
95
+ it("handleStartChatError should log failed event for PersistentChatConversationRetrievalFailure for 400 status", () => {
96
+ const dispatch = jest.fn();
97
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.PersistentChatConversationRetrievalFailure, 400);
98
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
99
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
100
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
101
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(2);
102
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("ERROR", expect.objectContaining({
103
+ ExceptionDetails: expect.objectContaining({
104
+ Exception: `Widget load complete with error: ${_omnichannelChatSdk.ChatSDKErrorName.PersistentChatConversationRetrievalFailure}`,
105
+ HttpResponseStatusCode: 400
106
+ })
107
+ }));
108
+ expect(dispatch).toHaveBeenCalledTimes(2);
109
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
110
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
111
+ }));
112
+ });
113
+ it("handleStartChatError should log failed with error event for ConversationInitializationFailure for non-400 status", () => {
114
+ const dispatch = jest.fn();
115
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.ConversationInitializationFailure, 429);
116
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
117
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
118
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
119
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(2);
120
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("WARN", expect.objectContaining({
121
+ Description: "Widget load complete with error",
122
+ ExceptionDetails: expect.objectContaining({
123
+ Exception: `Widget load complete with error: ${_omnichannelChatSdk.ChatSDKErrorName.ConversationInitializationFailure}`,
124
+ HttpResponseStatusCode: 429
125
+ })
126
+ }));
127
+ expect(dispatch).toHaveBeenCalledTimes(2);
128
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
129
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
130
+ }));
131
+ });
132
+ it("handleStartChatError should log failed event for ConversationInitializationFailure for 400 status", () => {
133
+ const dispatch = jest.fn();
134
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.ConversationInitializationFailure, 400);
135
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
136
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
137
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
138
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(2);
139
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("ERROR", expect.objectContaining({
140
+ ExceptionDetails: expect.objectContaining({
141
+ Exception: `Widget load complete with error: ${_omnichannelChatSdk.ChatSDKErrorName.ConversationInitializationFailure}`,
142
+ HttpResponseStatusCode: 400
143
+ })
144
+ }));
145
+ expect(dispatch).toHaveBeenCalledTimes(2);
146
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
147
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
148
+ }));
149
+ });
150
+ it("handleStartChatError should log failed with error event for ChatTokenRetrievalFailure for non-400 status", () => {
151
+ const dispatch = jest.fn();
152
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.ChatTokenRetrievalFailure, 429);
153
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
154
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
155
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
156
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(2);
157
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("WARN", expect.objectContaining({
158
+ Description: "Widget load complete with error",
159
+ ExceptionDetails: expect.objectContaining({
160
+ Exception: `Widget load complete with error: ${_omnichannelChatSdk.ChatSDKErrorName.ChatTokenRetrievalFailure}`,
161
+ HttpResponseStatusCode: 429
162
+ })
163
+ }));
164
+ expect(dispatch).toHaveBeenCalledTimes(2);
165
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
166
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
167
+ }));
168
+ });
169
+ it("handleStartChatError should log failed event for ChatTokenRetrievalFailure for 400 status", () => {
170
+ const dispatch = jest.fn();
171
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.ChatTokenRetrievalFailure, 400);
172
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
173
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
174
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
175
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(2);
176
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("ERROR", expect.objectContaining({
177
+ ExceptionDetails: expect.objectContaining({
178
+ Exception: `Widget load complete with error: ${_omnichannelChatSdk.ChatSDKErrorName.ChatTokenRetrievalFailure}`,
179
+ HttpResponseStatusCode: 400
180
+ })
181
+ }));
182
+ expect(dispatch).toHaveBeenCalledTimes(2);
183
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
184
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
185
+ }));
186
+ });
187
+ it("handleStartChatError should log failed with error event for UninitializedChatSDK", () => {
188
+ const dispatch = jest.fn();
189
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.UninitializedChatSDK);
190
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
191
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
192
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
193
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(2);
194
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("WARN", expect.objectContaining({
195
+ Description: "Widget load complete with error",
196
+ ExceptionDetails: expect.objectContaining({
197
+ Exception: `Widget load complete with error: ${_omnichannelChatSdk.ChatSDKErrorName.UninitializedChatSDK}`
198
+ })
199
+ }));
200
+ expect(dispatch).toHaveBeenCalledTimes(2);
201
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
202
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
203
+ }));
204
+ });
205
+ it("handleStartChatError should log failed with error event for InvalidConversation", () => {
206
+ const dispatch = jest.fn();
207
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.InvalidConversation);
208
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
209
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
210
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
211
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(1);
212
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("WARN", expect.objectContaining({
213
+ Description: "Widget load complete with error",
214
+ ExceptionDetails: expect.objectContaining({
215
+ Exception: `Widget load complete with error: ${_omnichannelChatSdk.ChatSDKErrorName.InvalidConversation}`
216
+ })
217
+ }));
218
+ expect(dispatch).toHaveBeenCalledTimes(16);
219
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
220
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
221
+ payload: _ConversationState.ConversationState.Closed
222
+ }));
223
+ });
224
+ it("handleStartChatError should log failed with error event for ClosedConversation", () => {
225
+ const dispatch = jest.fn();
226
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.ClosedConversation);
227
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
228
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
229
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
230
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(1);
231
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("WARN", expect.objectContaining({
232
+ Description: "Widget load complete with error",
233
+ ExceptionDetails: expect.objectContaining({
234
+ Exception: `Widget load complete with error: ${_omnichannelChatSdk.ChatSDKErrorName.ClosedConversation}`
235
+ })
236
+ }));
237
+ expect(dispatch).toHaveBeenCalledTimes(16);
238
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
239
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
240
+ payload: _ConversationState.ConversationState.Closed
241
+ }));
242
+ });
243
+ it("handleStartChatError should log failed event for any other errors", () => {
244
+ const dispatch = jest.fn();
245
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.ScriptLoadFailure, 405);
246
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
247
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
248
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, {}, {}, mockEx, false);
249
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(2);
250
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("ERROR", expect.objectContaining({
251
+ ExceptionDetails: expect.objectContaining({
252
+ Exception: `Widget load complete with error: ${_omnichannelChatSdk.ChatSDKErrorName.ScriptLoadFailure}`,
253
+ HttpResponseStatusCode: 405
254
+ })
255
+ }));
256
+ expect(dispatch).toHaveBeenCalledTimes(2);
257
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
258
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
259
+ }));
260
+ });
261
+ it("handleStartChatError should force end chat if isStartChatSuccessful is true", () => {
262
+ const dispatch = jest.fn();
263
+ const mockEx = new _omnichannelChatSdk.ChatSDKError(_omnichannelChatSdk.ChatSDKErrorName.ScriptLoadFailure, 405);
264
+ const mockSDK = {
265
+ endChat: jest.fn()
266
+ };
267
+ spyOn(_omnichannelChatComponents.BroadcastService, "postMessage").and.callFake(() => false);
268
+ spyOn(_TelemetryHelper.TelemetryHelper, "logLoadingEvent").and.callFake(() => false);
269
+ (0, _startChatErrorHandler.handleStartChatError)(dispatch, mockSDK, {}, mockEx, true);
270
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledTimes(3);
271
+ expect(_TelemetryHelper.TelemetryHelper.logLoadingEvent).toHaveBeenCalledWith("ERROR", expect.objectContaining({
272
+ ExceptionDetails: expect.objectContaining({
273
+ Exception: "SessionInit was successful, but widget load failed."
274
+ })
275
+ }));
276
+ expect(dispatch).toHaveBeenCalledTimes(2);
277
+ expect(dispatch).toHaveBeenCalledWith(expect.objectContaining({
278
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE
279
+ }));
280
+ expect(mockSDK.endChat).toHaveBeenCalled();
281
+ });
282
+ });
@@ -55,7 +55,6 @@ var _useChatAdapterStore = _interopRequireDefault(require("../../../hooks/useCha
55
55
  var _useChatContextStore = _interopRequireDefault(require("../../../hooks/useChatContextStore"));
56
56
  var _useChatSDKStore = _interopRequireDefault(require("../../../hooks/useChatSDKStore"));
57
57
  var _defaultAdaptiveCardStyles = require("../../webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles");
58
- var _omnichannelChatSdk = require("@microsoft/omnichannel-chat-sdk");
59
58
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
60
59
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
61
60
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -433,12 +432,7 @@ const LiveChatWidgetStateful = props => {
433
432
  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) {
434
433
  (0, _endChat.endChat)(props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter, true, false, false);
435
434
  (0, _endChat.endChatStateCleanUp)(dispatch);
436
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
437
- chatSDK.requestId = (0, _omnichannelChatSdk.uuidv4)();
438
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
439
- chatSDK.chatToken = {};
440
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
441
- chatSDK.reconnectId = null;
435
+ (0, _endChat.chatSDKStateCleanUp)(chatSDK);
442
436
  return;
443
437
  }
444
438
  });
@@ -616,9 +610,7 @@ const LiveChatWidgetStateful = props => {
616
610
 
617
611
  // Handle Chat disconnect cases
618
612
  (0, _react2.useEffect)(() => {
619
- if (state.appStates.chatDisconnectEventReceived) {
620
- (0, _chatDisconnectHelper.handleChatDisconnect)(props, state, setWebChatStyles);
621
- }
613
+ (0, _chatDisconnectHelper.handleChatDisconnect)(props, state, setWebChatStyles);
622
614
  }, [state.appStates.chatDisconnectEventReceived]);
623
615
  const initiateEndChatOnBrowserUnload = () => {
624
616
  var _DataStoreManager$cli;
@@ -8,7 +8,6 @@ var _TelemetryConstants = require("../../../../../common/telemetry/TelemetryCons
8
8
  var _Constants = require("../../../../../common/Constants");
9
9
  var _DirectLineActivityType = require("../../enums/DirectLineActivityType");
10
10
  var _DirectLineSenderRole = require("../../enums/DirectLineSenderRole");
11
- var _MessageType = require("../../enums/MessageType");
12
11
  var _react = _interopRequireDefault(require("react"));
13
12
  var _TelemetryHelper = require("../../../../../common/telemetry/TelemetryHelper");
14
13
  var _defaultSystemMessageStyles = require("./defaultStyles/defaultSystemMessageStyles");
@@ -81,13 +80,6 @@ const createActivityMiddleware = (systemMessageStyleProps, userMessageStyleProps
81
80
  if (card.activity) {
82
81
  var _card$activity$from;
83
82
  if (((_card$activity$from = card.activity.from) === null || _card$activity$from === void 0 ? void 0 : _card$activity$from.role) === _DirectLineSenderRole.DirectLineSenderRole.Channel) {
84
- var _card$activity$channe3;
85
- if (((_card$activity$channe3 = card.activity.channelData) === null || _card$activity$channe3 === void 0 ? void 0 : _card$activity$channe3.type) === _MessageType.MessageTypes.Thread) {
86
- _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
87
- Event: _TelemetryConstants.TelemetryEvent.IC3ThreadUpdateEventReceived,
88
- Description: "IC3 ThreadUpdateEvent Received"
89
- });
90
- }
91
83
  return () => false;
92
84
  }
93
85
  if (isTagIncluded(card, _Constants.Constants.hiddenTag)) {
@@ -22,7 +22,7 @@ describe("activityMiddleware test", () => {
22
22
  };
23
23
  const results = (0, _activityMiddleware.createActivityMiddleware)()()(next)(args);
24
24
  expect(results()).toEqual(false);
25
- expect(_TelemetryHelper.TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(1);
25
+ expect(_TelemetryHelper.TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(0);
26
26
  });
27
27
  it("createActivityMiddleware() with Hidden tag should return nothing", () => {
28
28
  spyOn(_TelemetryHelper.TelemetryHelper, "logActionEvent").and.callFake(() => false);
@@ -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";
@@ -265,4 +260,10 @@ _defineProperty(AriaTelemetryConstants, "MOONCAKE_ENDPOINT", "");
265
260
  _defineProperty(AriaTelemetryConstants, "Public", "Public");
266
261
  _defineProperty(AriaTelemetryConstants, "EU", "Europe");
267
262
  // 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"]);
263
+ _defineProperty(AriaTelemetryConstants, "lcwEUDomainNames", ["crm4.omnichannelengagementhub.com", "crm12.omnichannelengagementhub.com", "crm16.omnichannelengagementhub.com", "crm17.omnichannelengagementhub.com", "crm19.omnichannelengagementhub.com"]);
264
+ export class WidgetLoadTelemetryMessage {}
265
+ _defineProperty(WidgetLoadTelemetryMessage, "OOOHMessage", "Widget is OOOH");
266
+ _defineProperty(WidgetLoadTelemetryMessage, "PersistedStateRetrievedMessage", "Persisted state retrieved");
267
+ export class WidgetLoadCustomErrorString {}
268
+ _defineProperty(WidgetLoadCustomErrorString, "AuthenticationFailedErrorString", "Authentication was not successful");
269
+ _defineProperty(WidgetLoadCustomErrorString, "NetworkErrorString", "Network Error");
@@ -127,7 +127,6 @@ 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";
@@ -244,7 +243,6 @@ export class TelemetryConstants {
244
243
  case TelemetryEvent.EmailTranscriptSent:
245
244
  case TelemetryEvent.EmailTranscriptFailed:
246
245
  case TelemetryEvent.DownloadTranscriptFailed:
247
- case TelemetryEvent.IC3ThreadUpdateEventReceived:
248
246
  case TelemetryEvent.ConfirmationCancelButtonClicked:
249
247
  case TelemetryEvent.ConfirmationConfirmButtonClicked:
250
248
  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: {
@@ -5,23 +5,38 @@ import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryCon
5
5
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
6
6
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
7
  const handleChatDisconnect = (props, state, setWebChatStyles) => {
8
- var _state$appStates;
9
- if (state !== null && state !== void 0 && (_state$appStates = state.appStates) !== null && _state$appStates !== void 0 && _state$appStates.chatDisconnectEventReceived) {
10
- var _state$domainStates, _state$domainStates$m, _props$webChatContain, _props$webChatContain2;
11
- const chatDisconnectMessage = (state === null || state === void 0 ? void 0 : (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : (_state$domainStates$m = _state$domainStates.middlewareLocalizedTexts) === null || _state$domainStates$m === void 0 ? void 0 : _state$domainStates$m.MIDDLEWARE_BANNER_CHAT_DISCONNECT) ?? defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_CHAT_DISCONNECT;
12
- if ((props === null || props === void 0 ? void 0 : (_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : (_props$webChatContain2 = _props$webChatContain.renderingMiddlewareProps) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.hideSendboxOnConversationEnd) !== false) {
13
- setWebChatStyles(styles => {
14
- return {
15
- ...styles,
16
- hideSendBox: true
17
- };
8
+ var _state$appStates, _state$domainStates, _state$domainStates$m, _props$webChatContain, _props$webChatContain2;
9
+ const chatDisconnectState = state === null || state === void 0 ? void 0 : (_state$appStates = state.appStates) === null || _state$appStates === void 0 ? void 0 : _state$appStates.chatDisconnectEventReceived;
10
+ const chatDisconnectMessage = (state === null || state === void 0 ? void 0 : (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : (_state$domainStates$m = _state$domainStates.middlewareLocalizedTexts) === null || _state$domainStates$m === void 0 ? void 0 : _state$domainStates$m.MIDDLEWARE_BANNER_CHAT_DISCONNECT) ?? defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_CHAT_DISCONNECT;
11
+ const hideSendBoxOnConversationEnd = props === null || props === void 0 ? void 0 : (_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : (_props$webChatContain2 = _props$webChatContain.renderingMiddlewareProps) === null || _props$webChatContain2 === void 0 ? void 0 : _props$webChatContain2.hideSendboxOnConversationEnd;
12
+ switch (chatDisconnectState) {
13
+ case true:
14
+ if (hideSendBoxOnConversationEnd !== false) {
15
+ setWebChatStyles(styles => {
16
+ return {
17
+ ...styles,
18
+ hideSendBox: true
19
+ };
20
+ });
21
+ }
22
+ NotificationHandler.notifyWarning(NotificationScenarios.ChatDisconnect, chatDisconnectMessage);
23
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
24
+ Event: TelemetryEvent.ChatDisconnectThreadEventReceived,
25
+ Description: "Chat disconnected due to timeout, left or removed."
18
26
  });
19
- }
20
- NotificationHandler.notifyWarning(NotificationScenarios.ChatDisconnect, chatDisconnectMessage);
21
- TelemetryHelper.logActionEvent(LogLevel.INFO, {
22
- Event: TelemetryEvent.ChatDisconnectThreadEventReceived,
23
- Description: "Chat disconnected due to timeout, left or removed."
24
- });
27
+ break;
28
+ case false:
29
+ if (hideSendBoxOnConversationEnd !== false) {
30
+ setWebChatStyles(styles => {
31
+ return {
32
+ ...styles,
33
+ hideSendBox: false
34
+ };
35
+ });
36
+ }
37
+ break;
38
+ default:
39
+ break;
25
40
  }
26
41
  };
27
42
  export { handleChatDisconnect };
@@ -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 = "";