@aslaluroba/help-center-react 3.0.19 → 3.0.21
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/dist/core/api.d.ts +3 -2
- package/dist/index.esm.js +79 -66
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +79 -66
- package/dist/index.js.map +1 -1
- package/dist/services.esm.js +27 -26
- package/dist/services.esm.js.map +1 -1
- package/dist/services.js +27 -26
- package/dist/services.js.map +1 -1
- package/dist/ui/help-center.d.ts +1 -1
- package/package.json +5 -5
- package/src/core/api.ts +54 -32
- package/src/ui/help-center.tsx +100 -62
package/dist/core/api.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { TokenResponse } from
|
|
1
|
+
import { TokenResponse } from "../lib/types";
|
|
2
2
|
export declare function initializeAPI(url: string, getToken: () => Promise<TokenResponse>): void;
|
|
3
3
|
export declare function getValidToken(forceRefresh?: boolean): Promise<string>;
|
|
4
|
-
export declare function apiRequest(endpoint: string, method
|
|
4
|
+
export declare function apiRequest(endpoint: string, method: string | undefined, body: any | undefined, options: {
|
|
5
5
|
cache?: boolean;
|
|
6
6
|
timeout?: number;
|
|
7
|
+
language: string;
|
|
7
8
|
}): Promise<any>;
|
package/dist/index.esm.js
CHANGED
|
@@ -110,10 +110,10 @@ function _getValidToken() {
|
|
|
110
110
|
var forceRefresh = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
111
111
|
var _a;
|
|
112
112
|
if (!getTokenFunction) {
|
|
113
|
-
throw new Error(
|
|
113
|
+
throw new Error("API module not initialized. Call initializeAPI(getToken) first.");
|
|
114
114
|
}
|
|
115
|
-
var storedToken = localStorage.getItem(
|
|
116
|
-
var storedExpiry = localStorage.getItem(
|
|
115
|
+
var storedToken = localStorage.getItem("chatbot-token");
|
|
116
|
+
var storedExpiry = localStorage.getItem("chatbot-token-expiry");
|
|
117
117
|
var currentTime = Math.floor(Date.now() / 1000);
|
|
118
118
|
// Add buffer time to prevent token expiry during request
|
|
119
119
|
var bufferTime = 60; // 1 minute buffer
|
|
@@ -123,10 +123,10 @@ function _getValidToken() {
|
|
|
123
123
|
var tokenResponse = yield getTokenFunction();
|
|
124
124
|
storedToken = tokenResponse.token;
|
|
125
125
|
storedExpiry = String(currentTime + ((_a = tokenResponse.expiresIn) !== null && _a !== void 0 ? _a : 900));
|
|
126
|
-
localStorage.setItem(
|
|
127
|
-
localStorage.setItem(
|
|
126
|
+
localStorage.setItem("chatbot-token", storedToken);
|
|
127
|
+
localStorage.setItem("chatbot-token-expiry", storedExpiry);
|
|
128
128
|
} catch (error) {
|
|
129
|
-
console.error(
|
|
129
|
+
console.error("Failed to refresh token:", error);
|
|
130
130
|
throw error;
|
|
131
131
|
}
|
|
132
132
|
}
|
|
@@ -143,11 +143,11 @@ function _fetchWithAuth() {
|
|
|
143
143
|
var headers = new Headers(options.headers);
|
|
144
144
|
try {
|
|
145
145
|
var token = yield getValidToken();
|
|
146
|
-
headers.set(
|
|
146
|
+
headers.set("Authorization", "Bearer ".concat(token));
|
|
147
147
|
// Add performance optimizations
|
|
148
|
-
headers.set(
|
|
149
|
-
headers.set(
|
|
150
|
-
headers.set(
|
|
148
|
+
headers.set("Accept", "application/json");
|
|
149
|
+
headers.set("Accept-Encoding", "gzip, deflate, br");
|
|
150
|
+
headers.set("Connection", "keep-alive");
|
|
151
151
|
options.headers = headers;
|
|
152
152
|
// Add timeout to prevent hanging requests
|
|
153
153
|
var controller = new AbortController();
|
|
@@ -156,15 +156,15 @@ function _fetchWithAuth() {
|
|
|
156
156
|
var response = yield fetch(url, _objectSpread2(_objectSpread2({}, options), {}, {
|
|
157
157
|
signal: controller.signal,
|
|
158
158
|
// Add HTTP/2 optimization hints
|
|
159
|
-
cache:
|
|
160
|
-
mode:
|
|
159
|
+
cache: "no-cache",
|
|
160
|
+
mode: "cors"
|
|
161
161
|
}));
|
|
162
162
|
clearTimeout(timeoutId);
|
|
163
163
|
// Handle 401/403 with token refresh
|
|
164
164
|
if ((response.status === 401 || response.status === 403) && retry) {
|
|
165
|
-
console.warn(
|
|
165
|
+
console.warn("Token expired, refreshing...");
|
|
166
166
|
var newToken = yield getValidToken(true);
|
|
167
|
-
headers.set(
|
|
167
|
+
headers.set("Authorization", "Bearer ".concat(newToken));
|
|
168
168
|
options.headers = headers;
|
|
169
169
|
// Retry the request with new token
|
|
170
170
|
return fetchWithAuth(url, options, false);
|
|
@@ -172,13 +172,13 @@ function _fetchWithAuth() {
|
|
|
172
172
|
return response;
|
|
173
173
|
} catch (error) {
|
|
174
174
|
clearTimeout(timeoutId);
|
|
175
|
-
if (error instanceof Error && error.name ===
|
|
176
|
-
throw new Error(
|
|
175
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
176
|
+
throw new Error("Request timeout - please try again");
|
|
177
177
|
}
|
|
178
178
|
throw error;
|
|
179
179
|
}
|
|
180
180
|
} catch (error) {
|
|
181
|
-
console.error(
|
|
181
|
+
console.error("Fetch error:", error);
|
|
182
182
|
throw error;
|
|
183
183
|
}
|
|
184
184
|
});
|
|
@@ -218,10 +218,10 @@ function apiRequest(_x3) {
|
|
|
218
218
|
}
|
|
219
219
|
function _apiRequest() {
|
|
220
220
|
_apiRequest = _asyncToGenerator(function* (endpoint) {
|
|
221
|
-
var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] :
|
|
221
|
+
var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "GET";
|
|
222
222
|
var body = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
223
|
-
var options = arguments.length > 3
|
|
224
|
-
if (!baseUrl) throw new Error(
|
|
223
|
+
var options = arguments.length > 3 ? arguments[3] : undefined;
|
|
224
|
+
if (!baseUrl) throw new Error("API not initialized");
|
|
225
225
|
var url = "".concat(baseUrl, "/").concat(endpoint);
|
|
226
226
|
var requestKey = "".concat(method, ":").concat(endpoint, ":").concat(JSON.stringify(body));
|
|
227
227
|
// Check for duplicate in-flight requests
|
|
@@ -230,7 +230,7 @@ function _apiRequest() {
|
|
|
230
230
|
return duplicateRequest;
|
|
231
231
|
}
|
|
232
232
|
// Check cache for GET requests (except real-time endpoints)
|
|
233
|
-
if (method ===
|
|
233
|
+
if (method === "GET" && options.cache !== false && !endpoint.includes("/send-message")) {
|
|
234
234
|
var cached = getCachedResponse(requestKey);
|
|
235
235
|
if (cached) {
|
|
236
236
|
return Promise.resolve(cached);
|
|
@@ -239,8 +239,9 @@ function _apiRequest() {
|
|
|
239
239
|
var requestOptions = {
|
|
240
240
|
method,
|
|
241
241
|
headers: {
|
|
242
|
-
|
|
243
|
-
|
|
242
|
+
"Content-Type": "application/json",
|
|
243
|
+
"Cache-Control": method === "GET" ? "max-age=30" : "no-cache",
|
|
244
|
+
"Accept-Language": options.language
|
|
244
245
|
},
|
|
245
246
|
body: body ? JSON.stringify(body) : null
|
|
246
247
|
};
|
|
@@ -248,7 +249,7 @@ function _apiRequest() {
|
|
|
248
249
|
try {
|
|
249
250
|
var response = yield fetchWithAuth(url, requestOptions);
|
|
250
251
|
if (!response.ok) {
|
|
251
|
-
var errorMessage =
|
|
252
|
+
var errorMessage = "API request failed";
|
|
252
253
|
try {
|
|
253
254
|
var errorData = yield response.json();
|
|
254
255
|
errorMessage = errorData.message || errorMessage;
|
|
@@ -258,8 +259,8 @@ function _apiRequest() {
|
|
|
258
259
|
throw new Error(errorMessage);
|
|
259
260
|
}
|
|
260
261
|
// Cache successful GET responses
|
|
261
|
-
if (method ===
|
|
262
|
-
var responseData =
|
|
262
|
+
if (method === "GET" && options.cache !== false) {
|
|
263
|
+
var responseData = response.clone();
|
|
263
264
|
var data = yield responseData.json();
|
|
264
265
|
setCachedResponse(requestKey, {
|
|
265
266
|
json: () => Promise.resolve(data)
|
|
@@ -35051,7 +35052,8 @@ var HelpCenterContent = _ref => {
|
|
|
35051
35052
|
showHelpScreen = false,
|
|
35052
35053
|
primaryColor,
|
|
35053
35054
|
secondaryColor,
|
|
35054
|
-
logoUrl
|
|
35055
|
+
logoUrl,
|
|
35056
|
+
language
|
|
35055
35057
|
} = _ref;
|
|
35056
35058
|
var {
|
|
35057
35059
|
t
|
|
@@ -35059,8 +35061,8 @@ var HelpCenterContent = _ref => {
|
|
|
35059
35061
|
var [isOpen, setIsOpen] = useState(false);
|
|
35060
35062
|
var [showArrowAnimation, setShowArrowAnimation] = useState(showArrow);
|
|
35061
35063
|
var [helpScreenData, setHelpScreenData] = useState(null);
|
|
35062
|
-
var [status, setStatus] = useState(
|
|
35063
|
-
var [error, setError] = useState(
|
|
35064
|
+
var [status, setStatus] = useState("idle");
|
|
35065
|
+
var [error, setError] = useState("");
|
|
35064
35066
|
var [selectedOption, setSelectedOption] = useState(null);
|
|
35065
35067
|
var [sessionId, setSessionId] = useState(null);
|
|
35066
35068
|
var [reviewSessionId, setReviewSessionId] = useState(null);
|
|
@@ -35068,7 +35070,7 @@ var HelpCenterContent = _ref => {
|
|
|
35068
35070
|
var [isChatClosed, setIsChatClosed] = useState(false);
|
|
35069
35071
|
var [messages, setMessages] = useState([]);
|
|
35070
35072
|
var [needsAgent, setNeedsAgent] = useState(false);
|
|
35071
|
-
var [assistantStatus, setAssistantStatus] = useState(
|
|
35073
|
+
var [assistantStatus, setAssistantStatus] = useState("idle");
|
|
35072
35074
|
var [isReviewDialogOpen, setIsReviewDialogOpen] = useState(false);
|
|
35073
35075
|
var handleTogglePopup = () => {
|
|
35074
35076
|
setIsOpen(!isOpen);
|
|
@@ -35091,7 +35093,7 @@ var HelpCenterContent = _ref => {
|
|
|
35091
35093
|
};
|
|
35092
35094
|
return [...prevMessages, newMessage];
|
|
35093
35095
|
});
|
|
35094
|
-
setAssistantStatus(
|
|
35096
|
+
setAssistantStatus("idle");
|
|
35095
35097
|
};
|
|
35096
35098
|
var handleEndChat = /*#__PURE__*/function () {
|
|
35097
35099
|
var _ref2 = _asyncToGenerator(function* () {
|
|
@@ -35099,9 +35101,11 @@ var HelpCenterContent = _ref => {
|
|
|
35099
35101
|
try {
|
|
35100
35102
|
yield ClientAblyService.stopConnection();
|
|
35101
35103
|
setIsAblyConnected(false);
|
|
35102
|
-
setAssistantStatus(
|
|
35103
|
-
var response = yield apiRequest("Client/ClientChatSession/".concat(sessionId, "/close"),
|
|
35104
|
-
|
|
35104
|
+
setAssistantStatus("idle");
|
|
35105
|
+
var response = yield apiRequest("Client/ClientChatSession/".concat(sessionId, "/close"), "POST", null, {
|
|
35106
|
+
language: language
|
|
35107
|
+
});
|
|
35108
|
+
if (!response.ok) throw new Error("Failed to close chat session");
|
|
35105
35109
|
// Store sessionId for review before clearing the main sessionId
|
|
35106
35110
|
setReviewSessionId(sessionId);
|
|
35107
35111
|
// Clear the sessionId after successfully closing the session
|
|
@@ -35110,9 +35114,9 @@ var HelpCenterContent = _ref => {
|
|
|
35110
35114
|
setMessages([]);
|
|
35111
35115
|
setIsReviewDialogOpen(true);
|
|
35112
35116
|
} catch (error) {
|
|
35113
|
-
console.error(
|
|
35114
|
-
setError(
|
|
35115
|
-
setAssistantStatus(
|
|
35117
|
+
console.error("Error ending chat:", error);
|
|
35118
|
+
setError("Failed to end chat session");
|
|
35119
|
+
setAssistantStatus("idle");
|
|
35116
35120
|
// Even if there's an error, clear the session state to prevent stuck state
|
|
35117
35121
|
setReviewSessionId(sessionId);
|
|
35118
35122
|
setSessionId(null);
|
|
@@ -35135,12 +35139,14 @@ var HelpCenterContent = _ref => {
|
|
|
35135
35139
|
comment
|
|
35136
35140
|
};
|
|
35137
35141
|
try {
|
|
35138
|
-
var response = yield apiRequest("Client/ClientChatSession/".concat(reviewSessionId, "/review"),
|
|
35139
|
-
|
|
35142
|
+
var response = yield apiRequest("Client/ClientChatSession/".concat(reviewSessionId, "/review"), "POST", payload, {
|
|
35143
|
+
language
|
|
35144
|
+
});
|
|
35145
|
+
if (!response.ok) throw new Error("Failed to send chat review");
|
|
35140
35146
|
handleCloseChatReview();
|
|
35141
35147
|
} catch (error) {
|
|
35142
|
-
console.error(
|
|
35143
|
-
setError(
|
|
35148
|
+
console.error("Error sending chat review:", error);
|
|
35149
|
+
setError("Failed to send chat review");
|
|
35144
35150
|
}
|
|
35145
35151
|
});
|
|
35146
35152
|
return function handleSendChatReview(_x) {
|
|
@@ -35157,12 +35163,12 @@ var HelpCenterContent = _ref => {
|
|
|
35157
35163
|
setMessages([{
|
|
35158
35164
|
id: Date.now(),
|
|
35159
35165
|
senderType: 3,
|
|
35160
|
-
messageContent: ((_a = option === null || option === void 0 ? void 0 : option.assistant) === null || _a === void 0 ? void 0 : _a.greeting) ||
|
|
35166
|
+
messageContent: ((_a = option === null || option === void 0 ? void 0 : option.assistant) === null || _a === void 0 ? void 0 : _a.greeting) || "مرحباً! كيف يمكنني مساعدتك اليوم؟",
|
|
35161
35167
|
sentAt: new Date(),
|
|
35162
35168
|
isSeen: true
|
|
35163
35169
|
}]);
|
|
35164
35170
|
setIsChatClosed(false);
|
|
35165
|
-
setStatus(
|
|
35171
|
+
setStatus("succeeded");
|
|
35166
35172
|
});
|
|
35167
35173
|
return function handleStartChat(_x2) {
|
|
35168
35174
|
return _ref5.apply(this, arguments);
|
|
@@ -35171,8 +35177,8 @@ var HelpCenterContent = _ref => {
|
|
|
35171
35177
|
var startNewChatSession = /*#__PURE__*/function () {
|
|
35172
35178
|
var _ref6 = _asyncToGenerator(function* (option) {
|
|
35173
35179
|
try {
|
|
35174
|
-
setStatus(
|
|
35175
|
-
setError(
|
|
35180
|
+
setStatus("loading");
|
|
35181
|
+
setError("");
|
|
35176
35182
|
var chatSessionCreateDto = _objectSpread2({
|
|
35177
35183
|
helpScreenId: helpScreenId,
|
|
35178
35184
|
optionId: option.id
|
|
@@ -35183,9 +35189,11 @@ var HelpCenterContent = _ref => {
|
|
|
35183
35189
|
email: user.email
|
|
35184
35190
|
}
|
|
35185
35191
|
});
|
|
35186
|
-
var response = yield apiRequest(
|
|
35192
|
+
var response = yield apiRequest("Client/ClientChatSession/create-session", "POST", chatSessionCreateDto, {
|
|
35193
|
+
language
|
|
35194
|
+
});
|
|
35187
35195
|
if (!response.ok) {
|
|
35188
|
-
throw new Error(
|
|
35196
|
+
throw new Error("Failed to create chat session");
|
|
35189
35197
|
}
|
|
35190
35198
|
var responseData = yield response.json();
|
|
35191
35199
|
var newSessionId = responseData.chatSession.id;
|
|
@@ -35193,15 +35201,15 @@ var HelpCenterContent = _ref => {
|
|
|
35193
35201
|
yield ClientAblyService.startConnection(newSessionId, responseData.ablyToken, handleReceiveMessage, responseData.chatSession.tenantId);
|
|
35194
35202
|
// Verify the connection is actually active
|
|
35195
35203
|
if (!ClientAblyService.isConnectionActive()) {
|
|
35196
|
-
throw new Error(
|
|
35204
|
+
throw new Error("Ably connection failed to establish properly");
|
|
35197
35205
|
}
|
|
35198
35206
|
setIsAblyConnected(true);
|
|
35199
35207
|
setIsChatClosed(false);
|
|
35200
|
-
setStatus(
|
|
35208
|
+
setStatus("succeeded");
|
|
35201
35209
|
return newSessionId; // Return the session ID
|
|
35202
35210
|
} catch (error) {
|
|
35203
|
-
setError(error instanceof Error ? error.message :
|
|
35204
|
-
setStatus(
|
|
35211
|
+
setError(error instanceof Error ? error.message : "Failed to start chat session");
|
|
35212
|
+
setStatus("failed");
|
|
35205
35213
|
throw error; // Re-throw to handle in calling function
|
|
35206
35214
|
}
|
|
35207
35215
|
});
|
|
@@ -35211,9 +35219,9 @@ var HelpCenterContent = _ref => {
|
|
|
35211
35219
|
}();
|
|
35212
35220
|
var handleSendMessage = /*#__PURE__*/function () {
|
|
35213
35221
|
var _ref7 = _asyncToGenerator(function* (message) {
|
|
35214
|
-
if (message.trim() !==
|
|
35222
|
+
if (message.trim() !== "") {
|
|
35215
35223
|
try {
|
|
35216
|
-
setAssistantStatus(
|
|
35224
|
+
setAssistantStatus("typing");
|
|
35217
35225
|
var userMessage = {
|
|
35218
35226
|
id: Date.now(),
|
|
35219
35227
|
senderType: 1,
|
|
@@ -35228,14 +35236,16 @@ var HelpCenterContent = _ref => {
|
|
|
35228
35236
|
currentSessionId = yield startNewChatSession(selectedOption);
|
|
35229
35237
|
}
|
|
35230
35238
|
if (!currentSessionId) {
|
|
35231
|
-
throw new Error(
|
|
35239
|
+
throw new Error("No active session available");
|
|
35232
35240
|
}
|
|
35233
35241
|
var messageDto = {
|
|
35234
35242
|
messageContent: message
|
|
35235
35243
|
};
|
|
35236
|
-
var response = yield apiRequest("Client/ClientChatSession/".concat(currentSessionId, "/send-message"),
|
|
35244
|
+
var response = yield apiRequest("Client/ClientChatSession/".concat(currentSessionId, "/send-message"), "POST", messageDto, {
|
|
35245
|
+
language
|
|
35246
|
+
});
|
|
35237
35247
|
if (!response.ok) {
|
|
35238
|
-
throw new Error(
|
|
35248
|
+
throw new Error("Failed to send message");
|
|
35239
35249
|
}
|
|
35240
35250
|
setMessages(prevMessages => {
|
|
35241
35251
|
return prevMessages.map(msg => msg.senderType === 1 && !msg.isSeen ? _objectSpread2(_objectSpread2({}, msg), {}, {
|
|
@@ -35243,12 +35253,12 @@ var HelpCenterContent = _ref => {
|
|
|
35243
35253
|
}) : msg);
|
|
35244
35254
|
});
|
|
35245
35255
|
} catch (error) {
|
|
35246
|
-
console.error(
|
|
35247
|
-
setAssistantStatus(
|
|
35256
|
+
console.error("Error in handleSendMessage:", error);
|
|
35257
|
+
setAssistantStatus("idle");
|
|
35248
35258
|
var errorMessage = {
|
|
35249
35259
|
id: Date.now(),
|
|
35250
35260
|
senderType: 3,
|
|
35251
|
-
messageContent:
|
|
35261
|
+
messageContent: "Failed to send the message. Please try again.\n لم يتم إرسال الرسالة. يرجى المحاولة مرة أخرى.",
|
|
35252
35262
|
sentAt: new Date(),
|
|
35253
35263
|
isSeen: true
|
|
35254
35264
|
};
|
|
@@ -35262,14 +35272,16 @@ var HelpCenterContent = _ref => {
|
|
|
35262
35272
|
}();
|
|
35263
35273
|
useEffect(() => {
|
|
35264
35274
|
if (isOpen && helpScreenId) {
|
|
35265
|
-
setStatus(
|
|
35266
|
-
apiRequest("client/clientHelpScreen/".concat(helpScreenId)
|
|
35275
|
+
setStatus("loading");
|
|
35276
|
+
apiRequest("client/clientHelpScreen/".concat(helpScreenId), "GET", null, {
|
|
35277
|
+
language
|
|
35278
|
+
}).then(res => res.json()).then(data => {
|
|
35267
35279
|
setHelpScreenData(data);
|
|
35268
|
-
setStatus(
|
|
35269
|
-
setError(
|
|
35280
|
+
setStatus("succeeded");
|
|
35281
|
+
setError("");
|
|
35270
35282
|
}).catch(err => {
|
|
35271
35283
|
setError(err.message);
|
|
35272
|
-
setStatus(
|
|
35284
|
+
setStatus("failed");
|
|
35273
35285
|
});
|
|
35274
35286
|
}
|
|
35275
35287
|
}, [isOpen, helpScreenId]);
|
|
@@ -35278,11 +35290,11 @@ var HelpCenterContent = _ref => {
|
|
|
35278
35290
|
secondaryColor
|
|
35279
35291
|
});
|
|
35280
35292
|
return jsxs("div", {
|
|
35281
|
-
className:
|
|
35293
|
+
className: "babylai-help-center-container mb-4",
|
|
35282
35294
|
style: themeStyles,
|
|
35283
35295
|
children: [showArrowAnimation && !isOpen && jsx(FloatingMessage$1, {
|
|
35284
35296
|
onClose: handleCloseArrowAnimation,
|
|
35285
|
-
message: messageLabel || t(
|
|
35297
|
+
message: messageLabel || t("homeSdk.needAssistance")
|
|
35286
35298
|
}), jsx(HelpButton$1, {
|
|
35287
35299
|
onClick: handleTogglePopup
|
|
35288
35300
|
}), isOpen && jsx(HelpPopup$1, {
|
|
@@ -35327,6 +35339,7 @@ var HelpCenter = _ref8 => {
|
|
|
35327
35339
|
return jsx(LanguageProvider, {
|
|
35328
35340
|
language: language,
|
|
35329
35341
|
children: jsx(HelpCenterContent, {
|
|
35342
|
+
language: language,
|
|
35330
35343
|
helpScreenId: helpScreenId,
|
|
35331
35344
|
user: user,
|
|
35332
35345
|
showArrow: showArrow,
|