@microsoft/omnichannel-chat-widget 1.5.1-main.132e1c6 → 1.5.1-main.b37ad3d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/common/Constants.js +10 -8
- package/lib/cjs/common/telemetry/TelemetryConstants.js +0 -2
- package/lib/cjs/common/utils.js +2 -1
- package/lib/cjs/components/livechatwidget/common/chatDisconnectHelper.js +31 -16
- package/lib/cjs/components/livechatwidget/common/endChat.js +16 -4
- package/lib/cjs/components/livechatwidget/common/startChat.js +19 -80
- package/lib/cjs/components/livechatwidget/common/startChatErrorHandler.js +198 -0
- package/lib/cjs/components/livechatwidget/common/startChatErrorHandler.spec.js +282 -0
- package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +2 -10
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +0 -8
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.spec.js +1 -1
- package/lib/esm/common/Constants.js +7 -6
- package/lib/esm/common/telemetry/TelemetryConstants.js +0 -2
- package/lib/esm/common/utils.js +3 -2
- package/lib/esm/components/livechatwidget/common/chatDisconnectHelper.js +31 -16
- package/lib/esm/components/livechatwidget/common/endChat.js +14 -3
- package/lib/esm/components/livechatwidget/common/startChat.js +20 -81
- package/lib/esm/components/livechatwidget/common/startChatErrorHandler.js +191 -0
- package/lib/esm/components/livechatwidget/common/startChatErrorHandler.spec.js +280 -0
- package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +3 -11
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +0 -8
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.spec.js +1 -1
- package/lib/types/common/Constants.d.ts +8 -4
- package/lib/types/common/telemetry/TelemetryConstants.d.ts +0 -1
- package/lib/types/components/livechatwidget/common/endChat.d.ts +4 -3
- package/lib/types/components/livechatwidget/common/startChatErrorHandler.d.ts +5 -0
- package/lib/types/components/livechatwidget/common/startChatErrorHandler.spec.d.ts +1 -0
- package/package.json +3 -3
|
@@ -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
|
-
|
|
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
|
-
|
|
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(
|
|
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:
|
package/lib/esm/common/utils.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
var _this = this;
|
|
2
|
-
import { AriaTelemetryConstants,
|
|
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) ===
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 = "";
|