'use client'; // import { ChatList } from '@/components/chat/ChatList'; import Composer from '@/components/chat/Composer'; import useVisionAgent from '@/lib/hooks/useVisionAgent'; import { useScrollAnchor } from '@/lib/hooks/useScrollAnchor'; import { Session } from 'next-auth'; import { useEffect } from 'react'; import { ChatWithMessages, MessageUserInput } from '@/lib/types'; import { ChatMessage } from './ChatMessage'; import { Button } from '../ui/Button'; import { cn } from '@/lib/utils'; import { IconArrowDown } from '../ui/Icons'; import { dbPostCreateMessage } from '@/lib/db/functions'; import { Card } from '../ui/Card'; import { useSetAtom } from 'jotai'; import { selectedMessageId } from '@/state/chat'; export interface ChatListProps { chat: ChatWithMessages; userId?: string | null; } export const SCROLL_BOTTOM = 120; const ChatList: React.FC = ({ chat, userId }) => { const { id, messages: dbMessages, userId: chatUserId } = chat; const { messages, append, isLoading } = useVisionAgent(chat); // Only login and chat owner can compose const canCompose = !chatUserId || userId === chatUserId; const lastMessage = messages[messages.length - 1]; const lastDbMessage = dbMessages[dbMessages.length - 1]; const setMessageId = useSetAtom(selectedMessageId); const { messagesRef, scrollRef, visibilityRef, isVisible, scrollToBottom } = useScrollAnchor(SCROLL_BOTTOM); // Scroll to bottom on init and highlight last message useEffect(() => { scrollToBottom(); if (lastDbMessage.result) { setMessageId(lastDbMessage.id); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // Scroll to bottom when messages are loading useEffect(() => { if (isLoading && messages.length) { scrollToBottom(); } }, [isLoading, scrollToBottom, messages]); return (
{dbMessages.map((message, index) => { const isLastMessage = index === dbMessages.length - 1; return ( ); })}
{canCompose && (
{ const messageInput = { prompt: input, mediaUrl: newMediaUrl, }; const resp = await dbPostCreateMessage(id, messageInput); append(resp); }} />
)} {/* Scroll to bottom Icon */} ); }; export default ChatList;