"use client"; import { FileIcon, FileImageIcon, FileSpreadsheetIcon, FileTextIcon, UploadIcon, XIcon } from "lucide-react"; import Image from "next/image"; import { useEffect, useState } from "react"; import { DropzoneOptions } from "react-dropzone"; import { cn } from "../../utils"; import { FileInput, FileUploader } from "./FileUploader"; type MultiFileUploaderProps = { files: File[]; setFiles: (files: File[]) => void; }; const dropzone = { multiple: false, maxSize: 100 * 1024 * 1024, preventDropOnDocument: false, accept: { "application/images": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg", ".docx", ".xslx", ".pdf", ".txt", ".md"], }, } satisfies DropzoneOptions; export default function MultiFileUploader({ files, setFiles }: MultiFileUploaderProps) { const uploadFiles = (newFiles: File[] | null) => { if (!newFiles) return; setFiles([...files, ...newFiles]); }; const handleRemoveFile = (indexToRemove: number) => { setFiles(files.filter((_, index) => index !== indexToRemove)); }; return (
{files.map((file, index) => ( handleRemoveFile(index)} /> ))}
); } const FilePreviewItem = ({ file, onRemoveClick }: { file: File; onRemoveClick: () => void }) => { const [objectUrl, setObjectUrl] = useState(null); useEffect(() => { if (file.type.startsWith("image/")) { const url = URL.createObjectURL(file); setObjectUrl(url); return () => URL.revokeObjectURL(url); } setObjectUrl(null); }, [file]); const getFileIcon = () => { const extension = file.name.split(".").pop()?.toLowerCase(); if (file.type.startsWith("image/")) { return ; } if (file.type === "application/pdf") { return ; } if (file.type.includes("wordprocessingml") || extension === "docx" || extension === "doc") { return ; } if (file.type.includes("spreadsheetml") || extension === "xlsx" || extension === "xls") { return ; } if (file.type.startsWith("text/")) { return ; } return ; }; return (
{objectUrl ? ( {file.name} ) : (
{getFileIcon()} {file.name}
)}
); };