'use client'; /* eslint-disable @next/next/no-img-element */ import { useChat } from '@ai-sdk/react'; import { upload } from '@vercel/blob/client'; import { FileUIPart } from 'ai'; import { useRef, useState } from 'react'; export default function Page() { const [input, setInput] = useState(''); const { messages, sendMessage, status } = useChat(); const [files, setFiles] = useState([]); const [isUploading, setIsUploading] = useState(false); const fileInputRef = useRef(null); return (
{messages.map(message => (
{`${message.role}: `}
{message.parts.map((part, index) => { if (part.type === 'text') { return
{part.text}
; } if ( part.type === 'file' && part.mediaType?.startsWith('image/') ) { return (
{part.filename}
); } })}
))}
{ if (isUploading) { alert('Please wait for the files to finish uploading.'); return; } sendMessage({ text: input, files }); setInput(''); setFiles([]); if (fileInputRef.current) { fileInputRef.current.value = ''; } }} className="fixed bottom-0 flex flex-col w-full gap-2 p-2" >
{Array.from(files) .filter(file => file.mediaType?.startsWith('image/')) .map(file => (
{file.filename} {file.filename}
))}
{ if (event.target.files) { setIsUploading(true); for (const file of Array.from(event.target.files)) { const blob = await upload(file.name, file, { access: 'public', handleUploadUrl: '/api/files', }); setFiles(prevFiles => [ ...prevFiles, { type: 'file' as const, filename: file.name, mediaType: blob.contentType ?? '*/*', url: blob.url, }, ]); } setIsUploading(false); } }} multiple ref={fileInputRef} /> setInput(e.target.value)} className="w-full p-2 bg-zinc-100" disabled={status !== 'ready'} />
); }