"use client"; import React from "react"; import Image from "next/image"; import { X, CirclePlus, FileText, FileSpreadsheet, FileType, FileImage, } from "lucide-react"; import clsx from "clsx"; import { PropsUploadMultipleFile, UploadFileItem } from "./interface"; export default function UploadMultipleFile({ images = [], setImages, isDisableDelete = false, }: PropsUploadMultipleFile) { /* ========================= CHECK IMAGE FILE ========================= */ const isImageFile = (item: UploadFileItem) => { const type = item?.fileType || ""; return ( type.startsWith("image/") || /\.(jpg|jpeg|png|gif|webp)$/i.test(item?.path || "") ); }; /* ========================= GET FILE ICON ========================= */ const renderFileIcon = (item: UploadFileItem) => { const fileName = item?.fileName || item?.path?.split("/").pop() || ""; const ext = fileName.split(".").pop()?.toLowerCase(); switch (ext) { case "jpg": case "jpeg": case "png": case "gif": case "webp": return ; case "pdf": return ; case "xls": case "xlsx": return ; case "doc": case "docx": return ; case "ppt": case "pptx": return ; case "txt": return ; default: return ; } }; /* ========================= UPLOAD FILES ========================= */ const handleFileChange = (event: React.ChangeEvent) => { const files = event.target.files; if (!files) return; const newFiles: UploadFileItem[] = Array.from(files).map((file) => ({ file, url: URL.createObjectURL(file), fileName: file.name, fileType: file.type, })); setImages((prev) => [...prev, ...newFiles]); }; /* ========================= DELETE FILE ========================= */ const handleDelete = (index: number) => { setImages((prev) => { const target = prev[index]; if (target?.url) { URL.revokeObjectURL(target.url); } return prev.filter((_, i) => i !== index); }); }; return (
{/* FILE LIST */} {images?.length > 0 && (
{images.map((item, index) => { const fileUrl = item?.url || (item?.path ? `${process.env.NEXT_PUBLIC_IMAGE}${item.path}` : ""); return (
{/* IMAGE */} {isImageFile(item) ? ( file ) : ( {renderFileIcon(item)} {item?.fileName || item?.path?.split("/").pop()} )} {/* DELETE */} {isDisableDelete && !item?.file && item?.img ? null : ( )}
); })}
)} {/* UPLOAD BUTTON */}

Upload file

JPG, PNG, PDF, Word, Excel, PPT (≤ 50MB)

); }