Skip to content

Commit 3758122

Browse files
committed
feat: show loader before ai response stream
1 parent d890d91 commit 3758122

File tree

2 files changed

+33
-23
lines changed

2 files changed

+33
-23
lines changed

src/pages/aiAssistant/assistant.js

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export default function openAIAssistantPage() {
7777

7878
const showLoading = () => {
7979
const loadingEl = tag("div", {
80-
className: "loading",
80+
className: "ai_loading",
8181
id: "loading-indicator",
8282
});
8383
const loadingDots = tag("div", {
@@ -91,14 +91,14 @@ export default function openAIAssistantPage() {
9191
loadingDots.appendChild(dot);
9292
}
9393

94-
const text = tag("div", {
94+
const text = tag("span", {
9595
textContent: "AI is thinking...",
9696
});
9797

9898
loadingEl.appendChild(loadingDots);
9999
loadingEl.appendChild(text);
100100

101-
messageContainerRef.append(loadingEl);
101+
messageContainerRef.el.appendChild(loadingEl);
102102
scrollToBottom();
103103
};
104104

@@ -175,7 +175,7 @@ export default function openAIAssistantPage() {
175175

176176
messageEl.appendChild(messageHeader);
177177
messageEl.appendChild(messageContent);
178-
messageContainerRef.append(messageEl);
178+
messageContainerRef.el.appendChild(messageEl);
179179
scrollToBottom();
180180
};
181181

@@ -211,15 +211,8 @@ export default function openAIAssistantPage() {
211211
chatInputRef.value = "";
212212
chatInputRef.style.height = "auto";
213213

214-
// Add assistant message placeholder to UI
215-
const assistantMsgId = generateMessageId();
216-
const assistantMessage = {
217-
id: assistantMsgId,
218-
role: "assistant",
219-
content: "",
220-
timestamp: Date.now(),
221-
};
222-
addMessage(assistantMessage);
214+
// Show loading indicator
215+
showLoading();
223216

224217
// Prepare inputs for agent
225218
let inputs = { messages: [...chatHistory] };
@@ -228,17 +221,31 @@ export default function openAIAssistantPage() {
228221
sendBtnRef.el.style.display = "none";
229222
stopBtnRef.el.style.display = "block";
230223

231-
try {
232-
const messageEl = messageContainerRef.el.querySelector(
233-
`#message-${assistantMsgId} .message-content`,
234-
);
235-
let streamedContent = "";
224+
const assistantMsgId = generateMessageId();
236225

226+
try {
237227
const stream = await agent.stream(inputs, {
238228
streamMode: "messages",
239229
signal: currentController.signal,
240230
});
241231

232+
// Remove loading indicator
233+
removeLoading();
234+
235+
// Add assistant message placeholder
236+
const assistantMessage = {
237+
id: assistantMsgId,
238+
role: "assistant",
239+
content: "",
240+
timestamp: Date.now(),
241+
};
242+
addMessage(assistantMessage);
243+
244+
const messageEl = messageContainerRef.el.querySelector(
245+
`#message-${assistantMsgId} .message-content`,
246+
);
247+
let streamedContent = "";
248+
242249
for await (const [message, _metadata] of stream) {
243250
if (isAIMessageChunk(message) && message.tool_call_chunks?.length) {
244251
streamedContent += message.tool_call_chunks[0].args;
@@ -262,6 +269,7 @@ export default function openAIAssistantPage() {
262269
timeEl.textContent = formatTime(Date.now());
263270
}
264271
} catch (err) {
272+
removeLoading();
265273
if (/abort/i.test(err.message)) {
266274
const messageEl = messageContainerRef.el.querySelector(
267275
`#message-${assistantMsgId} .message-content`,

src/pages/aiAssistant/assistant.module.scss

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -780,11 +780,13 @@
780780
}
781781

782782
/* Loading indicator */
783-
.loading {
783+
.ai_loading {
784784
display: flex;
785785
align-items: center;
786+
justify-content: flex-start;
786787
gap: 0.75rem;
787788
padding: 1rem 1.5rem;
789+
min-height: auto;
788790
color: var(--secondary-text-color);
789791
font-size: 0.875rem;
790792
border-bottom: 1px solid var(--border-color);
@@ -805,18 +807,18 @@
805807
}
806808

807809
.loading-dot:nth-child(1) {
808-
animation: pulse 1.5s infinite;
810+
animation: bounce_dot_loading 1.5s infinite;
809811
}
810812

811813
.loading-dot:nth-child(2) {
812-
animation: pulse 1.5s infinite 0.3s;
814+
animation: bounce_dot_loading 1.5s infinite 0.3s;
813815
}
814816

815817
.loading-dot:nth-child(3) {
816-
animation: pulse 1.5s infinite 0.6s;
818+
animation: bounce_dot_loading 1.5s infinite 0.6s;
817819
}
818820

819-
@keyframes pulse {
821+
@keyframes bounce_dot_loading {
820822
0%,
821823
100% {
822824
opacity: 0.4;

0 commit comments

Comments
 (0)