@aslaluroba/help-center-react 3.0.2 → 3.0.4

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/index.js CHANGED
@@ -294,6 +294,7 @@ var homeSdk$1 = {
294
294
  description: "We appreciate your feedback! Please take a moment to rate your experience and share your thoughts in the comment section below. Your review helps us improve our services and assists other users in making informed decisions. Thank you!",
295
295
  rating_label: "Rating:",
296
296
  comment_label: "Comment:",
297
+ comment_placeholder: "Write your comment here...",
297
298
  submit_button: "Submit Review",
298
299
  comment_error: "Comment must be between 10 and 500 characters.",
299
300
  rating_error: "Rating must be between 1 and 5.",
@@ -328,6 +329,7 @@ var homeSdk = {
328
329
  description: "نحن نقدر ملاحظاتك! يُرجى تخصيص لحظة لتقييم تجربتك ومشاركة آرائك في قسم التعليقات أدناه. يساعدنا تقييمك في تحسين خدماتنا ويساعد المستخدمين الآخرين في اتخاذ قرارات مستنيرة. شكرًا لك!",
329
330
  rating_label: "التقييم:",
330
331
  comment_label: "التعليق:",
332
+ comment_placeholder: "اكتب تعليقك هنا...",
331
333
  submit_button: "إرسال التقييم",
332
334
  comment_error: "يجب أن يكون التعليق بين 10 و500 حرف.",
333
335
  rating_error: "يجب أن يكون التقييم بين 1 و5.",
@@ -337,7 +339,9 @@ var homeSdk = {
337
339
  title: "تأكيد",
338
340
  message: "هل أنت متأكد أنك تريد إنهاء المحادثة؟",
339
341
  confirmation_button: "إنهاء",
340
- cancel_button: "إلغاء"
342
+ cancel_button: "إلغاء",
343
+ endAndStartNewChatTitle: "إنهاء وبدء محادثة جديدة",
344
+ endAndStartNewChatMessage: "هل أنت متأكد أنك تريد إنهاء هذه المحادثة وبدء محادثة جديدة؟"
341
345
  }
342
346
  };
343
347
  var ar = {
@@ -427,7 +431,7 @@ const ReviewDialog = (props) => {
427
431
  React__default["default"].createElement("span", { className: `babylai-text-sm babylai-text-red-500 transition-opacity duration-300 ${error.rating ? 'opacity-100' : 'opacity-0'}` }, error.rating)),
428
432
  React__default["default"].createElement("div", { className: "babylai-flex babylai-flex-col babylai-gap-2" },
429
433
  React__default["default"].createElement("label", { htmlFor: 'comment', className: "babylai-text-base babylai-font-medium dark:babylai-text-white" }, t('homeSdk.ReviewDialog.comment_label')),
430
- React__default["default"].createElement("textarea", { id: 'comment', className: "babylai-bg-black-white-100 babylai-p-6 babylai-rounded-xl babylai-resize-none dark:babylai-bg-storm-dust-900 dark:babylai-text-white", rows: 4, placeholder: "Write your comment here...", value: comment, onChange: (e) => handleCommentChange(e.target.value) }),
434
+ React__default["default"].createElement("textarea", { id: 'comment', className: "babylai-bg-black-white-100 babylai-p-6 babylai-rounded-xl babylai-resize-none dark:babylai-bg-storm-dust-900 dark:babylai-text-white", rows: 4, placeholder: t('homeSdk.ReviewDialog.comment_placeholder'), value: comment, onChange: (e) => handleCommentChange(e.target.value) }),
431
435
  React__default["default"].createElement("span", { className: `babylai-text-sm babylai-text-red-500 transition-opacity duration-300 ${error.comment ? 'opacity-100' : 'opacity-0'}` }, error.comment))),
432
436
  React__default["default"].createElement("footer", { className: "babylai-flex babylai-justify-between babylai-gap-4 babylai-border-t babylai-pt-4" },
433
437
  React__default["default"].createElement("button", { className: "babylai-px-4 babylai-py-2 babylai-rounded-lg babylai-bg-gray-200 babylai-text-gray-700 hover:babylai-bg-gray-300 transition-all", onClick: props.onClose }, t('homeSdk.ReviewDialog.skip_button')),
@@ -10827,7 +10831,7 @@ const ChatWindowFooter = (props) => {
10827
10831
  const { t, dir } = useLocalTranslation();
10828
10832
  return (React__default["default"].createElement("footer", { className: 'babylai-flex babylai-items-center babylai-gap-2 babylai-relative babylai-rounded-full babylai-bg-white dark:!babylai-bg-storm-dust-900 babylai-m-4 md:babylai-m-6 md:babylai-py-3 md:babylai-px-4' },
10829
10833
  React__default["default"].createElement("input", { type: 'text', value: props.inputMessage, onChange: (e) => props.setInputMessage(e.target.value), onKeyDown: props.handleKeyDown, placeholder: t('homeSdk.placeholder'), className: 'babylai-flex-1 babylai-py-2 babylai-px-4 babylai-bg-transparent babylai-outline-none babylai-text-sm dark:babylai-text-white' }),
10830
- React__default["default"].createElement(Button, { variant: 'default', size: 'icon', onClick: props.handleSendMessage, disabled: (props === null || props === void 0 ? void 0 : props.isLoading) || !props.isAblyConnected, className: 'babylai-rounded-full babylai-bg-purple-500 babylai-hover:babylai-bg-purple-600 babylai-w-8 babylai-h-8 babylai-disabled:babylai-opacity-50' },
10834
+ React__default["default"].createElement(Button, { variant: 'default', size: 'icon', onClick: props.handleSendMessage, disabled: props === null || props === void 0 ? void 0 : props.isLoading, className: 'babylai-rounded-full babylai-bg-purple-500 babylai-hover:babylai-bg-purple-600 babylai-w-8 babylai-h-8 babylai-disabled:babylai-opacity-50' },
10831
10835
  React__default["default"].createElement(SvgEnvelope, { className: `babylai-w-4 babylai-h-4 ${dir === 'rtl' ? 'babylai-rotate-270' : ''}` }))));
10832
10836
  };
10833
10837
 
@@ -10891,7 +10895,7 @@ const TypingIndicator = React__default["default"].memo(({ firstHumanAgentIndex }
10891
10895
  React__default["default"].createElement("p", { className: 'babylai-text-sm babylai-opacity-70 dark:babylai-text-white' }, "..."))));
10892
10896
  });
10893
10897
  TypingIndicator.displayName = 'TypingIndicator';
10894
- const ChatWindow = React__default["default"].memo(({ onSendMessage, messages, assistantStatus = 'loading', isAblyConnected }) => {
10898
+ const ChatWindow = React__default["default"].memo(({ onSendMessage, messages, assistantStatus = 'loading' }) => {
10895
10899
  const [inputMessage, setInputMessage] = React.useState('');
10896
10900
  const messagesEndRef = React.useRef(null);
10897
10901
  const scrollTimeoutRef = React.useRef(null);
@@ -10931,14 +10935,14 @@ const ChatWindow = React__default["default"].memo(({ onSendMessage, messages, as
10931
10935
  }
10932
10936
  }, [inputMessage, onSendMessage]);
10933
10937
  const handleKeyDown = React.useCallback((e) => {
10934
- if (e.key === 'Enter' && !e.shiftKey && isAblyConnected) {
10938
+ if (e.key === 'Enter' && !e.shiftKey) {
10935
10939
  e.preventDefault();
10936
10940
  if (inputMessage.trim() && assistantStatus !== 'typing') {
10937
10941
  onSendMessage(inputMessage);
10938
10942
  setInputMessage('');
10939
10943
  }
10940
10944
  }
10941
- }, [inputMessage, onSendMessage, assistantStatus, isAblyConnected]);
10945
+ }, [inputMessage, onSendMessage, assistantStatus]);
10942
10946
  // Memoize the first human agent index calculation
10943
10947
  const firstHumanAgentIndex = React.useMemo(() => {
10944
10948
  return messages.findIndex((message) => message.senderType === 2);
@@ -10959,7 +10963,7 @@ const ChatWindow = React__default["default"].memo(({ onSendMessage, messages, as
10959
10963
  messagesList,
10960
10964
  assistantStatus === 'typing' && React__default["default"].createElement(TypingIndicator, { firstHumanAgentIndex: firstHumanAgentIndex }),
10961
10965
  React__default["default"].createElement("div", { ref: messagesEndRef })),
10962
- React__default["default"].createElement(ChatWindowFooter, { inputMessage: inputMessage, handleKeyDown: handleKeyDown, handleSendMessage: handleSendMessage, setInputMessage: setInputMessage, isLoading: isLoading, isAblyConnected: isAblyConnected })));
10966
+ React__default["default"].createElement(ChatWindowFooter, { inputMessage: inputMessage, handleKeyDown: handleKeyDown, handleSendMessage: handleSendMessage, setInputMessage: setInputMessage, isLoading: isLoading })));
10963
10967
  });
10964
10968
  ChatWindow.displayName = 'ChatWindow';
10965
10969
 
@@ -11275,10 +11279,10 @@ function HelpPopup({ onClose, helpScreen, status, error, onStartChat, onSendMess
11275
11279
  }
11276
11280
  }, [onStartChat, setSelectedOption, sessionId, setStartNewChatConfirmation, setTempSelectedOption]);
11277
11281
  const handleSendMessage = React.useCallback((message) => {
11278
- if (message.trim() && isAblyConnected) {
11282
+ if (message.trim()) {
11279
11283
  onSendMessage(message.trim());
11280
11284
  }
11281
- }, [onSendMessage, isAblyConnected]);
11285
+ }, [onSendMessage]);
11282
11286
  const hideEndChatConfirmation = React.useCallback(() => {
11283
11287
  setEndChatConfirmation(false);
11284
11288
  }, []);
@@ -11462,14 +11466,23 @@ function HelpCenter({ helpScreenId, user, showArrow = true, language = 'en', mes
11462
11466
  setReviewSessionId(null);
11463
11467
  };
11464
11468
  const handleStartChat = async (option) => {
11465
- await startNewChatSession(option);
11469
+ var _a;
11470
+ setMessages([
11471
+ {
11472
+ id: Date.now(),
11473
+ senderType: 3,
11474
+ messageContent: ((_a = option === null || option === void 0 ? void 0 : option.assistant) === null || _a === void 0 ? void 0 : _a.greeting) || 'مرحباً! كيف يمكنني مساعدتك اليوم؟',
11475
+ sentAt: new Date(),
11476
+ isSeen: true,
11477
+ },
11478
+ ]);
11479
+ setIsChatClosed(false);
11480
+ setStatus('succeeded');
11466
11481
  };
11467
11482
  const startNewChatSession = async (option) => {
11468
- var _a;
11469
11483
  try {
11470
11484
  setStatus('loading');
11471
11485
  setError('');
11472
- setMessages([]);
11473
11486
  const chatSessionCreateDto = {
11474
11487
  helpScreenId: helpScreenId,
11475
11488
  optionId: option.id,
@@ -11486,30 +11499,9 @@ function HelpCenter({ helpScreenId, user, showArrow = true, language = 'en', mes
11486
11499
  throw new Error('Failed to create chat session');
11487
11500
  }
11488
11501
  const responseData = await response.json();
11489
- setSessionId(responseData.chatSession.id);
11490
- if ((_a = responseData.chatSession.assistant) === null || _a === void 0 ? void 0 : _a.greeting) {
11491
- setMessages([
11492
- {
11493
- id: Date.now(),
11494
- senderType: 3,
11495
- messageContent: responseData.chatSession.assistant.greeting,
11496
- sentAt: new Date(),
11497
- isSeen: true,
11498
- },
11499
- ]);
11500
- }
11501
- else {
11502
- setMessages([
11503
- {
11504
- id: Date.now(),
11505
- senderType: 3,
11506
- messageContent: 'Hello! How can I assist you today?\nمرحباً! كيف يمكنني مساعدتك اليوم؟',
11507
- sentAt: new Date(),
11508
- isSeen: true,
11509
- },
11510
- ]);
11511
- }
11512
- await ClientAblyService.startConnection(responseData.chatSession.id, responseData.ablyToken, handleReceiveMessage, responseData.chatSession.tenantId);
11502
+ const newSessionId = responseData.chatSession.id;
11503
+ setSessionId(newSessionId);
11504
+ await ClientAblyService.startConnection(newSessionId, responseData.ablyToken, handleReceiveMessage, responseData.chatSession.tenantId);
11513
11505
  // Verify the connection is actually active
11514
11506
  if (!ClientAblyService.isConnectionActive()) {
11515
11507
  throw new Error('Ably connection failed to establish properly');
@@ -11517,19 +11509,15 @@ function HelpCenter({ helpScreenId, user, showArrow = true, language = 'en', mes
11517
11509
  setIsAblyConnected(true);
11518
11510
  setIsChatClosed(false);
11519
11511
  setStatus('succeeded');
11512
+ return newSessionId; // Return the session ID
11520
11513
  }
11521
11514
  catch (error) {
11522
11515
  setError(error instanceof Error ? error.message : 'Failed to start chat session');
11523
11516
  setStatus('failed');
11517
+ throw error; // Re-throw to handle in calling function
11524
11518
  }
11525
11519
  };
11526
11520
  const handleSendMessage = async (message) => {
11527
- // Only send message if Ably is connected
11528
- if (!isAblyConnected) {
11529
- setError('Connection lost. Please try again.');
11530
- return;
11531
- }
11532
- let currentSessionId = sessionId;
11533
11521
  if (message.trim() !== '') {
11534
11522
  try {
11535
11523
  setAssistantStatus('typing');
@@ -11541,25 +11529,13 @@ function HelpCenter({ helpScreenId, user, showArrow = true, language = 'en', mes
11541
11529
  isSeen: false,
11542
11530
  };
11543
11531
  setMessages((prevMessages) => [...prevMessages, userMessage]);
11532
+ // Handle session creation if needed
11533
+ let currentSessionId = sessionId;
11534
+ if (!isAblyConnected && selectedOption) {
11535
+ currentSessionId = await startNewChatSession(selectedOption);
11536
+ }
11544
11537
  if (!currentSessionId) {
11545
- const chatSessionCreateDto = {
11546
- helpScreenId: helpScreenId,
11547
- optionId: selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.id,
11548
- user: {
11549
- id: user === null || user === void 0 ? void 0 : user.id,
11550
- name: user === null || user === void 0 ? void 0 : user.name,
11551
- email: user === null || user === void 0 ? void 0 : user.email,
11552
- },
11553
- };
11554
- const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto);
11555
- if (!response.ok) {
11556
- throw new Error('Failed to create chat session');
11557
- }
11558
- const responseData = await response.json();
11559
- setSessionId(responseData.chatSession.id);
11560
- currentSessionId = responseData.chatSession.id;
11561
- await ClientAblyService.startConnection(responseData.chatSession.id, responseData.ablyToken, handleReceiveMessage, responseData.chatSession.tenantId);
11562
- setIsAblyConnected(true);
11538
+ throw new Error('No active session available');
11563
11539
  }
11564
11540
  const messageDto = { messageContent: message };
11565
11541
  const response = await apiRequest(`Client/ClientChatSession/${currentSessionId}/send-message`, 'POST', messageDto);