Spaces:
Sleeping
Sleeping
| "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> | |
| ); | |
| } | |