Spaces:
Sleeping
Sleeping
| import { useEffect, useRef } from 'react' | |
| import type { Message } from '../../types' | |
| import MessageBubble from './MessageBubble' | |
| interface Props { | |
| messages: Message[] | |
| loading: boolean | |
| } | |
| export default function ChatWindow({ messages, loading }: Props) { | |
| const bottomRef = useRef<HTMLDivElement>(null) | |
| useEffect(() => { | |
| bottomRef.current?.scrollIntoView({ behavior: 'smooth' }) | |
| }, [messages, loading]) | |
| return ( | |
| <div className="flex-1 overflow-y-auto px-4 py-4 space-y-3"> | |
| {messages.map((msg, i) => ( | |
| <MessageBubble key={i} message={msg} /> | |
| ))} | |
| {loading && ( | |
| <div className="flex justify-start"> | |
| <div className="bg-gray-800 rounded-2xl rounded-tl-sm px-4 py-3 flex gap-1 items-center"> | |
| <span className="w-2 h-2 bg-gray-400 rounded-full animate-bounce [animation-delay:0ms]" /> | |
| <span className="w-2 h-2 bg-gray-400 rounded-full animate-bounce [animation-delay:150ms]" /> | |
| <span className="w-2 h-2 bg-gray-400 rounded-full animate-bounce [animation-delay:300ms]" /> | |
| </div> | |
| </div> | |
| )} | |
| <div ref={bottomRef} /> | |
| </div> | |
| ) | |
| } | |