@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 +36 -60
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +36 -60
- package/dist/index.js.map +1 -1
- package/dist/ui/chatbot-popup/chat-window-screen/footer.d.ts +0 -1
- package/dist/ui/chatbot-popup/chat-window-screen/index.d.ts +1 -1
- package/package.json +10 -10
- package/src/locales/ar.json +10 -6
- package/src/locales/en.json +1 -0
- package/src/ui/chatbot-popup/chat-window-screen/footer.tsx +1 -2
- package/src/ui/chatbot-popup/chat-window-screen/index.tsx +96 -99
- package/src/ui/help-center.tsx +28 -66
- package/src/ui/help-popup.tsx +3 -3
- package/src/ui/review-dialog/index.tsx +1 -1
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:
|
|
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:
|
|
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'
|
|
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
|
|
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
|
|
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
|
|
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()
|
|
11282
|
+
if (message.trim()) {
|
|
11279
11283
|
onSendMessage(message.trim());
|
|
11280
11284
|
}
|
|
11281
|
-
}, [onSendMessage
|
|
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
|
-
|
|
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
|
-
|
|
11490
|
-
|
|
11491
|
-
|
|
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
|
-
|
|
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);
|