Skip to content

Commit 9f859a5

Browse files
added the loader to chat
1 parent d89b031 commit 9f859a5

File tree

2 files changed

+55
-8
lines changed

2 files changed

+55
-8
lines changed

frontend/src/App.css

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,34 @@
122122
overflow: hidden;
123123
text-overflow: ellipsis;
124124
white-space: nowrap;
125+
}
126+
127+
.loader {
128+
width: 8px;
129+
height: 8px;
130+
border-radius: 50%;
131+
display: block;
132+
margin: 7px auto;
133+
position: relative;
134+
background: #FFF;
135+
box-shadow: -12px 0 #FFF, 12px 0 #FFF;
136+
box-sizing: border-box;
137+
animation: shadowPulse 2s linear infinite;
138+
}
139+
140+
@keyframes shadowPulse {
141+
33% {
142+
background: #FFF;
143+
box-shadow: -12px 0 rgb(var(--theme-palette-primary-bg-strong)), 12px 0 #FFF;
144+
}
145+
146+
66% {
147+
background: rgb(var(--theme-palette-primary-bg-strong));
148+
box-shadow: -12px 0 #FFF, 12px 0 #FFF;
149+
}
150+
151+
100% {
152+
background: #FFF;
153+
box-shadow: -12px 0 #FFF, 12px 0 rgb(var(--theme-palette-primary-bg-strong));
154+
}
125155
}

frontend/src/components/Chatbot.tsx

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,34 @@ export default function Chatbot(props: ChatbotProps) {
2525
if (index < responseText.length) {
2626
const nextIndex = index + 1;
2727
const currentTypedText = responseText.substring(0, nextIndex);
28-
2928
if (index === 0) {
3029
const date = new Date();
3130
const datetime = `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
32-
setListMessages((msgs) => [
33-
...msgs,
34-
{ id: Date.now(), user: 'chatbot', message: currentTypedText, datetime: datetime, isTyping: true },
35-
]);
31+
if (responseText.length <= 1) {
32+
setListMessages((msgs) => [
33+
...msgs,
34+
{ id: Date.now(), user: 'chatbot', message: currentTypedText, datetime: datetime, isTyping: true },
35+
]);
36+
} else {
37+
setListMessages((msgs) => {
38+
const lastmsg = { ...msgs[msgs.length - 1] };
39+
lastmsg.id = Date.now();
40+
lastmsg.user = "chatbot";
41+
lastmsg.message = currentTypedText;
42+
lastmsg.datetime = datetime;
43+
lastmsg.isTyping = true;
44+
return msgs.map((msg, index) => {
45+
if (index === msgs.length - 1) {
46+
return lastmsg
47+
} else {
48+
return msg;
49+
}
50+
})
51+
});
52+
}
3653
} else {
3754
setListMessages((msgs) => msgs.map((msg) => (msg.isTyping ? { ...msg, message: currentTypedText } : msg)));
3855
}
39-
4056
setTimeout(() => simulateTypingEffect(responseText, nextIndex), 20);
4157
} else {
4258
setListMessages((msgs) => msgs.map((msg) => (msg.isTyping ? { ...msg, isTyping: false } : msg)));
@@ -56,6 +72,7 @@ export default function Chatbot(props: ChatbotProps) {
5672
try {
5773
setLoading(true)
5874
setInputMessage('');
75+
simulateTypingEffect(" ");
5976
const chatresponse = await chatBotAPI(userCredentials, model, inputMessage);
6077
chatbotReply = chatresponse?.data?.message;
6178
simulateTypingEffect(chatbotReply);
@@ -81,7 +98,7 @@ export default function Chatbot(props: ChatbotProps) {
8198
<div className='flex overflow-y-auto pb-12 min-w-full' style={{ scrollbarWidth: 'thin', overflowX: 'hidden' }}>
8299
<Widget className='n-bg-palette-neutral-bg-weak' header='' isElevated={false}>
83100
<div className='flex flex-col gap-4 gap-y-4'>
84-
{listMessages.map((chat) => (
101+
{listMessages.map((chat, index) => (
85102
<div
86103
ref={messagesEndRef}
87104
key={chat.id}
@@ -118,7 +135,7 @@ export default function Chatbot(props: ChatbotProps) {
118135
className={`p-4 self-start ${chat.user === 'chatbot' ? 'n-bg-palette-neutral-bg-strong' : 'n-bg-palette-primary-bg-weak'
119136
}`}
120137
>
121-
<div>
138+
<div className={`${(loading && index === listMessages.length - 1 && chat.user == "chatbot") ? "loader" : ""}`}>
122139
{chat.message.split(/`(.+?)`/).map((part, index) =>
123140
index % 2 === 1 ? (
124141
<span key={index} style={formattedTextStyle}>

0 commit comments

Comments
 (0)