@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.
@@ -1,7 +1,8 @@
1
- import { TokenResponse } from '../lib/types';
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?: string, body?: any, options?: {
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('API module not initialized. Call initializeAPI(getToken) first.');
113
+ throw new Error("API module not initialized. Call initializeAPI(getToken) first.");
114
114
  }
115
- var storedToken = localStorage.getItem('chatbot-token');
116
- var storedExpiry = localStorage.getItem('chatbot-token-expiry');
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('chatbot-token', storedToken);
127
- localStorage.setItem('chatbot-token-expiry', storedExpiry);
126
+ localStorage.setItem("chatbot-token", storedToken);
127
+ localStorage.setItem("chatbot-token-expiry", storedExpiry);
128
128
  } catch (error) {
129
- console.error('Failed to refresh token:', 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('Authorization', "Bearer ".concat(token));
146
+ headers.set("Authorization", "Bearer ".concat(token));
147
147
  // Add performance optimizations
148
- headers.set('Accept', 'application/json');
149
- headers.set('Accept-Encoding', 'gzip, deflate, br');
150
- headers.set('Connection', 'keep-alive');
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: 'no-cache',
160
- mode: 'cors'
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('Token expired, refreshing...');
165
+ console.warn("Token expired, refreshing...");
166
166
  var newToken = yield getValidToken(true);
167
- headers.set('Authorization', "Bearer ".concat(newToken));
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 === 'AbortError') {
176
- throw new Error('Request timeout - please try again');
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('Fetch error:', 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] : 'GET';
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 && arguments[3] !== undefined ? arguments[3] : {};
224
- if (!baseUrl) throw new Error('API not initialized');
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 === 'GET' && options.cache !== false && !endpoint.includes('/send-message')) {
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
- 'Content-Type': 'application/json',
243
- 'Cache-Control': method === 'GET' ? 'max-age=30' : 'no-cache'
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 = 'API request failed';
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 === 'GET' && options.cache !== false) {
262
- var responseData = yield response.clone();
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('idle');
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('idle');
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('idle');
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('idle');
35103
- var response = yield apiRequest("Client/ClientChatSession/".concat(sessionId, "/close"), 'POST');
35104
- if (!response.ok) throw new Error('Failed to close chat session');
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('Error ending chat:', error);
35114
- setError('Failed to end chat session');
35115
- setAssistantStatus('idle');
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"), 'POST', payload);
35139
- if (!response.ok) throw new Error('Failed to send chat review');
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('Error sending chat review:', error);
35143
- setError('Failed to send chat review');
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('succeeded');
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('loading');
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('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto);
35192
+ var response = yield apiRequest("Client/ClientChatSession/create-session", "POST", chatSessionCreateDto, {
35193
+ language
35194
+ });
35187
35195
  if (!response.ok) {
35188
- throw new Error('Failed to create chat session');
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('Ably connection failed to establish properly');
35204
+ throw new Error("Ably connection failed to establish properly");
35197
35205
  }
35198
35206
  setIsAblyConnected(true);
35199
35207
  setIsChatClosed(false);
35200
- setStatus('succeeded');
35208
+ setStatus("succeeded");
35201
35209
  return newSessionId; // Return the session ID
35202
35210
  } catch (error) {
35203
- setError(error instanceof Error ? error.message : 'Failed to start chat session');
35204
- setStatus('failed');
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('typing');
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('No active session available');
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"), 'POST', messageDto);
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('Failed to send message');
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('Error in handleSendMessage:', error);
35247
- setAssistantStatus('idle');
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: 'Failed to send the message. Please try again.\n لم يتم إرسال الرسالة. يرجى المحاولة مرة أخرى.',
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('loading');
35266
- apiRequest("client/clientHelpScreen/".concat(helpScreenId)).then(res => res.json()).then(data => {
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('succeeded');
35269
- setError('');
35280
+ setStatus("succeeded");
35281
+ setError("");
35270
35282
  }).catch(err => {
35271
35283
  setError(err.message);
35272
- setStatus('failed');
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: 'babylai-help-center-container mb-4',
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('homeSdk.needAssistance')
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,