@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.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:
|
|
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:
|
|
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'
|
|
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
|
|
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
|
|
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
|
|
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()
|
|
11253
|
+
if (message.trim()) {
|
|
11250
11254
|
onSendMessage(message.trim());
|
|
11251
11255
|
}
|
|
11252
|
-
}, [onSendMessage
|
|
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
|
-
|
|
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
|
-
|
|
11461
|
-
|
|
11462
|
-
|
|
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
|
-
|
|
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);
|