import { cn } from '@/lib/utils'; import { Popover, PopoverButton, PopoverPanel, Transition, } from '@headlessui/react'; import { CopyPlus, File, Link, LoaderCircle, Paperclip, Plus, Trash, } from 'lucide-react'; import { Fragment, useRef, useState } from 'react'; import { useChat } from '@/lib/hooks/useChat'; import { AnimatePresence } from 'motion/react'; import { motion } from 'framer-motion'; import { toast } from 'sonner'; const Attach = () => { const { files, setFiles, setFileIds, fileIds } = useChat(); const [loading, setLoading] = useState(false); const fileInputRef = useRef(); const handleChange = async (e: React.ChangeEvent) => { const selectedFiles = e.target.files; if (!selectedFiles?.length) { return; } setLoading(true); try { const data = new FormData(); for (let i = 0; i < selectedFiles.length; i++) { data.append('files', selectedFiles[i]); } const embeddingModelProvider = localStorage.getItem( 'embeddingModelProviderId', ); const embeddingModel = localStorage.getItem('embeddingModelKey'); if (!embeddingModelProvider || !embeddingModel) { throw new Error('Please select an embedding model before uploading.'); } data.append('embedding_model_provider_id', embeddingModelProvider); data.append('embedding_model_key', embeddingModel); const res = await fetch(`/api/uploads`, { method: 'POST', body: data, }); const resData = await res.json().catch(() => ({})); if (!res.ok) { throw new Error(resData.message || 'Failed to upload file(s).'); } if (!Array.isArray(resData.files)) { throw new Error('Invalid upload response from server.'); } setFiles([...files, ...resData.files]); setFileIds([ ...fileIds, ...resData.files.map((file: any) => file.fileId), ]); } catch (err: any) { toast(err?.message || 'Failed to upload file(s).'); } finally { setLoading(false); e.target.value = ''; } }; return loading ? (
) : files.length > 0 ? ( {({ open }) => ( <> {open && (

Attached files

{files.map((file, i) => (

{file.fileName.length > 25 ? file.fileName .replace(/\.\w+$/, '') .substring(0, 25) + '...' + file.fileExtension : file.fileName}

))}
)} )} ) : ( ); }; export default Attach;