"use client"; import { Fragment, useState } from "react"; import { Icon } from "@iconify/react"; import { Accept, useDropzone } from "react-dropzone"; import { Button } from "@/components/ui/button"; import Image from "next/image"; import { CloudUpload } from "lucide-react"; interface FileWithPreview extends File { preview: string; } interface FileUploaderProps { onDrop: (files: FileWithPreview[]) => void; accept: Accept; maxSize: number; label: string; className?: string; isMultiple?: boolean; } const FileUploader = ({ onDrop, accept, maxSize, label, className = "", isMultiple = true, }: FileUploaderProps) => { const [files, setFiles] = useState([]); const { getRootProps, getInputProps } = useDropzone({ accept: accept, maxSize: maxSize * 1024 * 1024, onDrop: (acceptedFiles) => { const mappedFiles = acceptedFiles.map((file) => Object.assign(file)); setFiles((prevFiles) => [...prevFiles, ...mappedFiles]); onDrop(mappedFiles); }, }); const renderFilePreview = (file: FileWithPreview) => { if (file.type.startsWith("image")) { return ( {file.name} ); } else { return ; } }; const handleRemoveFile = (file: FileWithPreview) => { const uploadedFiles = files; const filtered = uploadedFiles.filter((i) => i.name !== file.name); setFiles([...filtered]); }; const handleRemoveAllFiles = () => { setFiles([]); onDrop([]); }; const fileList = files.map((file) => (
{renderFilePreview(file)}
{file.name}
{Math.round(file.size / 100) / 10 > 1000 ? ( <>{(Math.round(file.size / 100) / 10000).toFixed(1)} ) : ( <>{(Math.round(file.size / 100) / 10).toFixed(1)} )} {" kb"}
)); return (

{/* Drop files here or click to upload. */} Tarik file disini atau klik untuk upload.

( {label} Ukuran maksimal {maxSize} MB.)
{files.length ? (
{fileList}
) : null}
); }; export default FileUploader;