'use client'; import type { Attachment, Message } from 'ai'; import { useChat } from 'ai/react'; import { AnimatePresence } from 'framer-motion'; import { useState } from 'react'; import useSWR, { useSWRConfig } from 'swr'; import { useWindowSize } from 'usehooks-ts'; import { ChatHeader } from '@/components/chat-header'; import type { Vote } from '@/lib/db/schema'; import { fetcher } from '@/lib/utils'; import { Block, type UIBlock } from './block'; import { BlockStreamHandler } from './block-stream-handler'; import { MultimodalInput } from './multimodal-input'; import { Messages } from './messages'; import { VisibilityType } from './visibility-selector'; export function Chat({ id, initialMessages, selectedModelId, selectedVisibilityType, isReadonly, }: { id: string; initialMessages: Array; selectedModelId: string; selectedVisibilityType: VisibilityType; isReadonly: boolean; }) { const { mutate } = useSWRConfig(); const { messages, setMessages, handleSubmit, input, setInput, append, isLoading, stop, reload, data: streamingData, } = useChat({ id, body: { id, modelId: selectedModelId }, initialMessages, onFinish: () => { mutate('/api/history'); }, }); const { width: windowWidth = 1920, height: windowHeight = 1080 } = useWindowSize(); const [block, setBlock] = useState({ documentId: 'init', content: '', kind: 'text', title: '', status: 'idle', isVisible: false, boundingBox: { top: windowHeight / 4, left: windowWidth / 4, width: 250, height: 50, }, }); const { data: votes } = useSWR>( `/api/vote?chatId=${id}`, fetcher, ); const [attachments, setAttachments] = useState>([]); return ( <>
{!isReadonly && ( )}
{block?.isVisible && ( )} ); }