@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.esm.js CHANGED
@@ -265,6 +265,7 @@ var homeSdk$1 = {
265
265
  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!",
266
266
  rating_label: "Rating:",
267
267
  comment_label: "Comment:",
268
+ comment_placeholder: "Write your comment here...",
268
269
  submit_button: "Submit Review",
269
270
  comment_error: "Comment must be between 10 and 500 characters.",
270
271
  rating_error: "Rating must be between 1 and 5.",
@@ -299,6 +300,7 @@ var homeSdk = {
299
300
  description: "نحن نقدر ملاحظاتك! يُرجى تخصيص لحظة لتقييم تجربتك ومشاركة آرائك في قسم التعليقات أدناه. يساعدنا تقييمك في تحسين خدماتنا ويساعد المستخدمين الآخرين في اتخاذ قرارات مستنيرة. شكرًا لك!",
300
301
  rating_label: "التقييم:",
301
302
  comment_label: "التعليق:",
303
+ comment_placeholder: "اكتب تعليقك هنا...",
302
304
  submit_button: "إرسال التقييم",
303
305
  comment_error: "يجب أن يكون التعليق بين 10 و500 حرف.",
304
306
  rating_error: "يجب أن يكون التقييم بين 1 و5.",
@@ -308,7 +310,9 @@ var homeSdk = {
308
310
  title: "تأكيد",
309
311
  message: "هل أنت متأكد أنك تريد إنهاء المحادثة؟",
310
312
  confirmation_button: "إنهاء",
311
- cancel_button: "إلغاء"
313
+ cancel_button: "إلغاء",
314
+ endAndStartNewChatTitle: "إنهاء وبدء محادثة جديدة",
315
+ endAndStartNewChatMessage: "هل أنت متأكد أنك تريد إنهاء هذه المحادثة وبدء محادثة جديدة؟"
312
316
  }
313
317
  };
314
318
  var ar = {
@@ -398,7 +402,7 @@ const ReviewDialog = (props) => {
398
402
  React__default.createElement("span", { className: `babylai-text-sm babylai-text-red-500 transition-opacity duration-300 ${error.rating ? 'opacity-100' : 'opacity-0'}` }, error.rating)),
399
403
  React__default.createElement("div", { className: "babylai-flex babylai-flex-col babylai-gap-2" },
400
404
  React__default.createElement("label", { htmlFor: 'comment', className: "babylai-text-base babylai-font-medium dark:babylai-text-white" }, t('homeSdk.ReviewDialog.comment_label')),
401
- React__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) }),
405
+ React__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) }),
402
406
  React__default.createElement("span", { className: `babylai-text-sm babylai-text-red-500 transition-opacity duration-300 ${error.comment ? 'opacity-100' : 'opacity-0'}` }, error.comment))),
403
407
  React__default.createElement("footer", { className: "babylai-flex babylai-justify-between babylai-gap-4 babylai-border-t babylai-pt-4" },
404
408
  React__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')),
@@ -10798,7 +10802,7 @@ const ChatWindowFooter = (props) => {
10798
10802
  const { t, dir } = useLocalTranslation();
10799
10803
  return (React__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' },
10800
10804
  React__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' }),
10801
- React__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' },
10805
+ React__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' },
10802
10806
  React__default.createElement(SvgEnvelope, { className: `babylai-w-4 babylai-h-4 ${dir === 'rtl' ? 'babylai-rotate-270' : ''}` }))));
10803
10807
  };
10804
10808
 
@@ -10862,7 +10866,7 @@ const TypingIndicator = React__default.memo(({ firstHumanAgentIndex }) => {
10862
10866
  React__default.createElement("p", { className: 'babylai-text-sm babylai-opacity-70 dark:babylai-text-white' }, "..."))));
10863
10867
  });
10864
10868
  TypingIndicator.displayName = 'TypingIndicator';
10865
- const ChatWindow = React__default.memo(({ onSendMessage, messages, assistantStatus = 'loading', isAblyConnected }) => {
10869
+ const ChatWindow = React__default.memo(({ onSendMessage, messages, assistantStatus = 'loading' }) => {
10866
10870
  const [inputMessage, setInputMessage] = useState('');
10867
10871
  const messagesEndRef = useRef(null);
10868
10872
  const scrollTimeoutRef = useRef(null);
@@ -10902,14 +10906,14 @@ const ChatWindow = React__default.memo(({ onSendMessage, messages, assistantStat
10902
10906
  }
10903
10907
  }, [inputMessage, onSendMessage]);
10904
10908
  const handleKeyDown = useCallback((e) => {
10905
- if (e.key === 'Enter' && !e.shiftKey && isAblyConnected) {
10909
+ if (e.key === 'Enter' && !e.shiftKey) {
10906
10910
  e.preventDefault();
10907
10911
  if (inputMessage.trim() && assistantStatus !== 'typing') {
10908
10912
  onSendMessage(inputMessage);
10909
10913
  setInputMessage('');
10910
10914
  }
10911
10915
  }
10912
- }, [inputMessage, onSendMessage, assistantStatus, isAblyConnected]);
10916
+ }, [inputMessage, onSendMessage, assistantStatus]);
10913
10917
  // Memoize the first human agent index calculation
10914
10918
  const firstHumanAgentIndex = useMemo(() => {
10915
10919
  return messages.findIndex((message) => message.senderType === 2);
@@ -10930,7 +10934,7 @@ const ChatWindow = React__default.memo(({ onSendMessage, messages, assistantStat
10930
10934
  messagesList,
10931
10935
  assistantStatus === 'typing' && React__default.createElement(TypingIndicator, { firstHumanAgentIndex: firstHumanAgentIndex }),
10932
10936
  React__default.createElement("div", { ref: messagesEndRef })),
10933
- React__default.createElement(ChatWindowFooter, { inputMessage: inputMessage, handleKeyDown: handleKeyDown, handleSendMessage: handleSendMessage, setInputMessage: setInputMessage, isLoading: isLoading, isAblyConnected: isAblyConnected })));
10937
+ React__default.createElement(ChatWindowFooter, { inputMessage: inputMessage, handleKeyDown: handleKeyDown, handleSendMessage: handleSendMessage, setInputMessage: setInputMessage, isLoading: isLoading })));
10934
10938
  });
10935
10939
  ChatWindow.displayName = 'ChatWindow';
10936
10940
 
@@ -11246,10 +11250,10 @@ function HelpPopup({ onClose, helpScreen, status, error, onStartChat, onSendMess
11246
11250
  }
11247
11251
  }, [onStartChat, setSelectedOption, sessionId, setStartNewChatConfirmation, setTempSelectedOption]);
11248
11252
  const handleSendMessage = useCallback((message) => {
11249
- if (message.trim() && isAblyConnected) {
11253
+ if (message.trim()) {
11250
11254
  onSendMessage(message.trim());
11251
11255
  }
11252
- }, [onSendMessage, isAblyConnected]);
11256
+ }, [onSendMessage]);
11253
11257
  const hideEndChatConfirmation = useCallback(() => {
11254
11258
  setEndChatConfirmation(false);
11255
11259
  }, []);
@@ -11433,14 +11437,23 @@ function HelpCenter({ helpScreenId, user, showArrow = true, language = 'en', mes
11433
11437
  setReviewSessionId(null);
11434
11438
  };
11435
11439
  const handleStartChat = async (option) => {
11436
- await startNewChatSession(option);
11440
+ var _a;
11441
+ setMessages([
11442
+ {
11443
+ id: Date.now(),
11444
+ senderType: 3,
11445
+ messageContent: ((_a = option === null || option === void 0 ? void 0 : option.assistant) === null || _a === void 0 ? void 0 : _a.greeting) || 'مرحباً! كيف يمكنني مساعدتك اليوم؟',
11446
+ sentAt: new Date(),
11447
+ isSeen: true,
11448
+ },
11449
+ ]);
11450
+ setIsChatClosed(false);
11451
+ setStatus('succeeded');
11437
11452
  };
11438
11453
  const startNewChatSession = async (option) => {
11439
- var _a;
11440
11454
  try {
11441
11455
  setStatus('loading');
11442
11456
  setError('');
11443
- setMessages([]);
11444
11457
  const chatSessionCreateDto = {
11445
11458
  helpScreenId: helpScreenId,
11446
11459
  optionId: option.id,
@@ -11457,30 +11470,9 @@ function HelpCenter({ helpScreenId, user, showArrow = true, language = 'en', mes
11457
11470
  throw new Error('Failed to create chat session');
11458
11471
  }
11459
11472
  const responseData = await response.json();
11460
- setSessionId(responseData.chatSession.id);
11461
- if ((_a = responseData.chatSession.assistant) === null || _a === void 0 ? void 0 : _a.greeting) {
11462
- setMessages([
11463
- {
11464
- id: Date.now(),
11465
- senderType: 3,
11466
- messageContent: responseData.chatSession.assistant.greeting,
11467
- sentAt: new Date(),
11468
- isSeen: true,
11469
- },
11470
- ]);
11471
- }
11472
- else {
11473
- setMessages([
11474
- {
11475
- id: Date.now(),
11476
- senderType: 3,
11477
- messageContent: 'Hello! How can I assist you today?\nمرحباً! كيف يمكنني مساعدتك اليوم؟',
11478
- sentAt: new Date(),
11479
- isSeen: true,
11480
- },
11481
- ]);
11482
- }
11483
- await ClientAblyService.startConnection(responseData.chatSession.id, responseData.ablyToken, handleReceiveMessage, responseData.chatSession.tenantId);
11473
+ const newSessionId = responseData.chatSession.id;
11474
+ setSessionId(newSessionId);
11475
+ await ClientAblyService.startConnection(newSessionId, responseData.ablyToken, handleReceiveMessage, responseData.chatSession.tenantId);
11484
11476
  // Verify the connection is actually active
11485
11477
  if (!ClientAblyService.isConnectionActive()) {
11486
11478
  throw new Error('Ably connection failed to establish properly');
@@ -11488,19 +11480,15 @@ function HelpCenter({ helpScreenId, user, showArrow = true, language = 'en', mes
11488
11480
  setIsAblyConnected(true);
11489
11481
  setIsChatClosed(false);
11490
11482
  setStatus('succeeded');
11483
+ return newSessionId; // Return the session ID
11491
11484
  }
11492
11485
  catch (error) {
11493
11486
  setError(error instanceof Error ? error.message : 'Failed to start chat session');
11494
11487
  setStatus('failed');
11488
+ throw error; // Re-throw to handle in calling function
11495
11489
  }
11496
11490
  };
11497
11491
  const handleSendMessage = async (message) => {
11498
- // Only send message if Ably is connected
11499
- if (!isAblyConnected) {
11500
- setError('Connection lost. Please try again.');
11501
- return;
11502
- }
11503
- let currentSessionId = sessionId;
11504
11492
  if (message.trim() !== '') {
11505
11493
  try {
11506
11494
  setAssistantStatus('typing');
@@ -11512,25 +11500,13 @@ function HelpCenter({ helpScreenId, user, showArrow = true, language = 'en', mes
11512
11500
  isSeen: false,
11513
11501
  };
11514
11502
  setMessages((prevMessages) => [...prevMessages, userMessage]);
11503
+ // Handle session creation if needed
11504
+ let currentSessionId = sessionId;
11505
+ if (!isAblyConnected && selectedOption) {
11506
+ currentSessionId = await startNewChatSession(selectedOption);
11507
+ }
11515
11508
  if (!currentSessionId) {
11516
- const chatSessionCreateDto = {
11517
- helpScreenId: helpScreenId,
11518
- optionId: selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.id,
11519
- user: {
11520
- id: user === null || user === void 0 ? void 0 : user.id,
11521
- name: user === null || user === void 0 ? void 0 : user.name,
11522
- email: user === null || user === void 0 ? void 0 : user.email,
11523
- },
11524
- };
11525
- const response = await apiRequest('Client/ClientChatSession/create-session', 'POST', chatSessionCreateDto);
11526
- if (!response.ok) {
11527
- throw new Error('Failed to create chat session');
11528
- }
11529
- const responseData = await response.json();
11530
- setSessionId(responseData.chatSession.id);
11531
- currentSessionId = responseData.chatSession.id;
11532
- await ClientAblyService.startConnection(responseData.chatSession.id, responseData.ablyToken, handleReceiveMessage, responseData.chatSession.tenantId);
11533
- setIsAblyConnected(true);
11509
+ throw new Error('No active session available');
11534
11510
  }
11535
11511
  const messageDto = { messageContent: message };
11536
11512
  const response = await apiRequest(`Client/ClientChatSession/${currentSessionId}/send-message`, 'POST', messageDto);