Add loading indicator for in-progress message & fix bug with multiple loaders (#173)

This commit is contained in:
Will Chen
2025-05-15 16:12:46 -07:00
committed by GitHub
parent 09fc028f94
commit 0798438621
2 changed files with 21 additions and 4 deletions

View File

@@ -9,9 +9,10 @@ import { CheckCircle, XCircle } from "lucide-react";
interface ChatMessageProps { interface ChatMessageProps {
message: Message; message: Message;
isLastMessage: boolean;
} }
const ChatMessage = ({ message }: ChatMessageProps) => { const ChatMessage = ({ message, isLastMessage }: ChatMessageProps) => {
const { isStreaming } = useStreamChat(); const { isStreaming } = useStreamChat();
return ( return (
<div <div
@@ -26,7 +27,10 @@ const ChatMessage = ({ message }: ChatMessageProps) => {
: "bg-(--sidebar-accent)" : "bg-(--sidebar-accent)"
}`} }`}
> >
{message.role === "assistant" && !message.content && isStreaming ? ( {message.role === "assistant" &&
!message.content &&
isStreaming &&
isLastMessage ? (
<div className="flex h-6 items-center space-x-2 p-2"> <div className="flex h-6 items-center space-x-2 p-2">
<motion.div <motion.div
className="h-3 w-3 rounded-full bg-(--primary) dark:bg-blue-500" className="h-3 w-3 rounded-full bg-(--primary) dark:bg-blue-500"
@@ -67,7 +71,16 @@ const ChatMessage = ({ message }: ChatMessageProps) => {
suppressHydrationWarning suppressHydrationWarning
> >
{message.role === "assistant" ? ( {message.role === "assistant" ? (
<DyadMarkdownParser content={message.content} /> <>
<DyadMarkdownParser content={message.content} />
{isLastMessage && isStreaming && (
<div className="mt-4 ml-4 relative w-5 h-5 animate-spin">
<div className="absolute top-0 left-1/2 transform -translate-x-1/2 w-2 h-2 bg-(--primary) dark:bg-blue-500 rounded-full"></div>
<div className="absolute bottom-0 left-0 w-2 h-2 bg-(--primary) dark:bg-blue-500 rounded-full opacity-80"></div>
<div className="absolute bottom-0 right-0 w-2 h-2 bg-(--primary) dark:bg-blue-500 rounded-full opacity-60"></div>
</div>
)}
</>
) : ( ) : (
<VanillaMarkdownParser content={message.content} /> <VanillaMarkdownParser content={message.content} />
)} )}

View File

@@ -36,7 +36,11 @@ export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(
<div className="flex-1 overflow-y-auto p-4" ref={ref}> <div className="flex-1 overflow-y-auto p-4" ref={ref}>
{messages.length > 0 ? ( {messages.length > 0 ? (
messages.map((message, index) => ( messages.map((message, index) => (
<ChatMessage key={index} message={message} /> <ChatMessage
key={index}
message={message}
isLastMessage={index === messages.length - 1}
/>
)) ))
) : ( ) : (
<div className="flex flex-col items-center justify-center h-full max-w-2xl mx-auto"> <div className="flex flex-col items-center justify-center h-full max-w-2xl mx-auto">