Skip to content

Commit 9c6ce38

Browse files
Merge pull request #142 from neo4j-labs/chatbot-bug-fixes
fixed input text ,initial greeting, time display on bot message
2 parents 5e8ddb8 + 915c0e2 commit 9c6ce38

File tree

5 files changed

+81
-27
lines changed

5 files changed

+81
-27
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
}
Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
{
2-
"listMessages": [
1+
{
2+
"listMessages": [
33
{
44
"id": 1,
55
"message": "Hi, I need help with creating a Cypher query for Neo4j.",
@@ -8,7 +8,7 @@
88
},
99
{
1010
"id": 2,
11-
"message": "Hi there! Welcome to Neo4j Chat! Your insights are just a click away from completed files",
11+
"message": " Welcome to the Neo4j Knowledge Graph Chat. You can ask questions related to documents which have been completely processed.",
1212
"user": "chatbot",
1313
"datetime": "01/01/2024 00:00:00"
1414
},
@@ -20,8 +20,7 @@
2020
},
2121
{
2222
"id": 4,
23-
"message":
24-
"Alright, you can use the following query: `MATCH (e:Employee)-[:WORKS_IN]->(d:Department {name: 'IT'}) RETURN e.name`. This query matches nodes labeled 'Employee' related to the 'IT' department and returns their names.",
23+
"message": "Alright, you can use the following query: `MATCH (e:Employee)-[:WORKS_IN]->(d:Department {name: 'IT'}) RETURN e.name`. This query matches nodes labeled 'Employee' related to the 'IT' department and returns their names.",
2524
"user": "chatbot",
2625
"datetime": "01/01/2024 00:00:00"
2726
},
@@ -33,10 +32,9 @@
3332
},
3433
{
3534
"id": 6,
36-
"message":
37-
"To get the count, use: `MATCH (e:Employee)-[:WORKS_IN]->(d:Department {name: 'IT'}) RETURN count(e)`. This counts all the distinct 'Employee' nodes related to the 'IT' department.",
35+
"message": "To get the count, use: `MATCH (e:Employee)-[:WORKS_IN]->(d:Department {name: 'IT'}) RETURN count(e)`. This counts all the distinct 'Employee' nodes related to the 'IT' department.",
3836
"user": "chatbot",
3937
"datetime": "01/01/2024 00:00:00"
4038
}
41-
]
42-
}
39+
]
40+
}

frontend/src/components/Chatbot.tsx

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default function Chatbot(props: ChatbotProps) {
1212
const { messages: listMessages, setMessages: setListMessages } = props;
1313
const [inputMessage, setInputMessage] = useState('');
1414
const formattedTextStyle = { color: 'rgb(var(--theme-palette-discovery-bg-strong))' };
15-
const [loading, setLoading] = useState<boolean>(false)
15+
const [loading, setLoading] = useState<boolean>(false);
1616
const { userCredentials } = useCredentials();
1717
const { model } = useFileContext();
1818
const messagesEndRef = useRef<HTMLDivElement>(null);
@@ -25,18 +25,33 @@ 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+
}
48+
return msg;
49+
});
50+
});
51+
}
3652
} else {
3753
setListMessages((msgs) => msgs.map((msg) => (msg.isTyping ? { ...msg, message: currentTypedText } : msg)));
3854
}
39-
4055
setTimeout(() => simulateTypingEffect(responseText, nextIndex), 20);
4156
} else {
4257
setListMessages((msgs) => msgs.map((msg) => (msg.isTyping ? { ...msg, isTyping: false } : msg)));
@@ -54,17 +69,18 @@ export default function Chatbot(props: ChatbotProps) {
5469
const userMessage = { id: Date.now(), user: 'user', message: inputMessage, datetime: datetime };
5570
setListMessages((listMessages) => [...listMessages, userMessage]);
5671
try {
57-
setLoading(true)
72+
setLoading(true);
73+
setInputMessage('');
74+
simulateTypingEffect(' ');
5875
const chatresponse = await chatBotAPI(userCredentials, model, inputMessage);
5976
chatbotReply = chatresponse?.data?.message;
60-
setInputMessage('');
6177
simulateTypingEffect(chatbotReply);
62-
setLoading(false)
78+
setLoading(false);
6379
} catch (error) {
6480
chatbotReply = "Oops! It seems we couldn't retrieve the answer. Please try again later";
6581
setInputMessage('');
6682
simulateTypingEffect(chatbotReply);
67-
setLoading(false)
83+
setLoading(false);
6884
}
6985
};
7086

@@ -81,7 +97,7 @@ export default function Chatbot(props: ChatbotProps) {
8197
<div className='flex overflow-y-auto pb-12 min-w-full' style={{ scrollbarWidth: 'thin', overflowX: 'hidden' }}>
8298
<Widget className='n-bg-palette-neutral-bg-weak' header='' isElevated={false}>
8399
<div className='flex flex-col gap-4 gap-y-4'>
84-
{listMessages.map((chat) => (
100+
{listMessages.map((chat, index) => (
85101
<div
86102
ref={messagesEndRef}
87103
key={chat.id}
@@ -115,10 +131,15 @@ export default function Chatbot(props: ChatbotProps) {
115131
<Widget
116132
header=''
117133
isElevated={true}
118-
className={`p-4 self-start ${chat.user === 'chatbot' ? 'n-bg-palette-neutral-bg-strong' : 'n-bg-palette-primary-bg-weak'
119-
}`}
134+
className={`p-4 self-start ${
135+
chat.user === 'chatbot' ? 'n-bg-palette-neutral-bg-strong' : 'n-bg-palette-primary-bg-weak'
136+
}`}
120137
>
121-
<div>
138+
<div
139+
className={`${
140+
loading && index === listMessages.length - 1 && chat.user == 'chatbot' ? 'loader' : ''
141+
}`}
142+
>
122143
{chat.message.split(/`(.+?)`/).map((part, index) =>
123144
index % 2 === 1 ? (
124145
<span key={index} style={formattedTextStyle}>
@@ -147,7 +168,9 @@ export default function Chatbot(props: ChatbotProps) {
147168
fluid
148169
onChange={handleInputChange}
149170
/>
150-
<Button type='submit' disabled={loading}>Submit</Button>
171+
<Button type='submit' loading={loading}>
172+
Submit
173+
</Button>
151174
</form>
152175
</div>
153176
</div>

frontend/src/components/Dropdown.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const LlmDropdown: React.FC<DropdownProps> = ({ onSelect, isDisabled }) => {
55
const handleChange = (selectedOption: OptionType | null | void) => {
66
onSelect(selectedOption);
77
};
8-
const allOptions = ['OpenAI GPT 3.5','Diffbot'];
8+
const allOptions = ['OpenAI GPT 3.5', 'Diffbot'];
99
return (
1010
<>
1111
<div style={{ width: '150px' }}>

frontend/src/components/RightSideBar.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ interface RightSideBarProps {
99
}
1010

1111
const RightSideBar: React.FC<RightSideBarProps> = ({ showChatBot, closeChatBot }) => {
12-
const [messages, setMessages] = useState<messages[]>([chatbotmessages.listMessages[1]]);
12+
const date = new Date();
13+
const [messages, setMessages] = useState<messages[]>([
14+
{ ...chatbotmessages.listMessages[1], datetime: `${date.toLocaleDateString()} ${date.toLocaleTimeString()}` },
15+
]);
1316
return (
1417
<Drawer
1518
expanded={showChatBot}

0 commit comments

Comments
 (0)