"use client"; import React, { useState, useRef } from "react"; import { InboxOutlined } from "@ant-design/icons"; import type { GetProp, UploadFile, UploadProps } from "antd"; import { message, Upload, Image } from "antd"; const { Dragger } = Upload; interface FileUploadToBlobProps extends UploadProps { onFileUpload: (file: any) => void; accept?: string; multiple?: boolean; disabled?: boolean; uploadText?: string; action?: string; } type FileType = Parameters>[0]; const getBase64 = (file: FileType): Promise => new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => resolve(reader.result as string); reader.onerror = (error) => reject(error); }); const BADragDropFile: React.FC = ({ onFileUpload, accept = ".jpg, .jpeg, .png, .pdf, .xls, .xlsx", multiple = false, disabled = false, uploadText = "Click or drag file to this area to upload", action, ...rest }) => { const [previewOpen, setPreviewOpen] = useState(false); const [previewImage, setPreviewImage] = useState(""); const [fileList, setFileList] = useState([]); const inputRef = useRef(null); const handleFiles = (files: FileList | null) => { if (!files) return; const fileArr = Array.from(files); const newImages = fileArr.map((file) => ({ file, url: URL.createObjectURL(file), })); const updatedImages: any = [...fileList, ...newImages]; setFileList(updatedImages); onFileUpload(updatedImages.map((img: any) => img.file)); }; const handleRemove = (idx: number) => { const updatedImages = fileList.filter((_, i) => i !== idx); setFileList(updatedImages); onFileUpload(updatedImages.map((img: any) => img.file)); }; const uploadProps: UploadProps = { name: "file", multiple, accept, action, disabled, fileList, showUploadList: true, beforeUpload(file) { if (fileList.length >= 3) { message.error("You can only upload up to 3 files."); return Upload.LIST_IGNORE; } if (onFileUpload) { onFileUpload(file); } setFileList((prev) => [...prev, file]); return false; // Prevents default upload }, onChange(info) { setFileList(info.fileList); if (onFileUpload) { onFileUpload(info.fileList); } }, onDrop(e) { onFileUpload(e); }, onRemove: (file) => { setFileList((prev) => prev.filter((f) => f.uid !== file.uid)); if (onFileUpload) { onFileUpload(fileList.filter((f) => f.uid !== file.uid)); } }, ...rest, }; const handlePreview = async (file: UploadFile) => { if (!file.url && !file.preview) { file.preview = await getBase64(file.originFileObj as FileType); } setPreviewImage(file.url || (file.preview as string)); setPreviewOpen(true); }; return ( <>

{uploadText}

Supports single or bulk upload.

{fileList.length > 0 && (
setFileList((prev) => prev.filter((f) => f.uid !== file.uid)) } openFileDialogOnClick={false} />
)} {previewImage && ( setPreviewOpen(visible), afterOpenChange: (visible) => !visible && setPreviewImage(""), }} src={previewImage} /> )} handleFiles(e.target.files)} />
{fileList.map((img, idx) => (
{`preview-${idx}`}
))}
); }; export default BADragDropFile;