Add loading indicator for in-progress message & fix bug with multiple loaders (#173)
This commit is contained in:
@@ -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} />
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
Reference in New Issue
Block a user