Spaces:
Sleeping
Sleeping
File size: 1,948 Bytes
ba76bdd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
"use client";
import { useRef, useEffect } from 'react';
import type { Message } from '@/lib/types';
import { ScrollArea } from '@/components/ui/scroll-area';
import MessageBubble from './message-bubble';
import { Avatar, AvatarFallback } from './ui/avatar';
import { Bot } from 'lucide-react';
interface MessageListProps {
messages: Message[];
isLoading: boolean;
}
export default function MessageList({ messages, isLoading }: MessageListProps) {
const messagesEndRef = useRef<HTMLDivElement>(null);
const scrollToBottom = () => {
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
};
useEffect(() => {
scrollToBottom();
}, [messages, isLoading]);
return (
<ScrollArea className="h-full w-full">
<div className="container max-w-4xl mx-auto">
{messages.map((message) => (
<MessageBubble key={message.id} message={message} />
))}
{isLoading && (
<div className="flex items-start gap-4 my-4 justify-start">
<Avatar className="h-8 w-8 shrink-0">
<AvatarFallback className="bg-primary text-primary-foreground">
<Bot className="h-5 w-5" />
</AvatarFallback>
</Avatar>
<div className="bg-muted rounded-lg p-3 flex items-center h-[42px] shadow-md">
<div className="flex items-center gap-1.5">
<span className="h-2 w-2 rounded-full bg-muted-foreground animate-typing-indicator" style={{ animationDelay: '0s' }} />
<span className="h-2 w-2 rounded-full bg-muted-foreground animate-typing-indicator" style={{ animationDelay: '0.2s' }} />
<span className="h-2 w-2 rounded-full bg-muted-foreground animate-typing-indicator" style={{ animationDelay: '0.4s' }} />
</div>
</div>
</div>
)}
<div ref={messagesEndRef} />
</div>
</ScrollArea>
);
}
|