"use client"; import { Dialog, DialogContent, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { cn } from "@/lib/utils"; import { Expand, Loader2, RotateCcw, Trash2, UploadCloud } from "lucide-react"; import Image from "next/image"; import { useEffect, useState } from "react"; export default function UploadComponent() { const [files, setFiles] = useState([]); const [loadingState, setLoadingState] = useState({}); const [previewImage, setPreviewImage] = useState(null); const [imagePreviews, setImagePreviews] = useState<{ [key: string]: string }>( {} ); const [dragOver, setDragOver] = useState(false); const [fileDropError, setFileDropError] = useState(""); const onDragOver = (e: React.SyntheticEvent) => { e.preventDefault(); setDragOver(true); }; const onDragLeave = () => setDragOver(false); const onDrop = (e: React.DragEvent) => { e.preventDefault(); setDragOver(false); const selectedFiles = Array.from(e.dataTransfer.files); if (selectedFiles.some((file) => file.type.split("/")[0] !== "image")) { return setFileDropError("Please provide only image files to upload!"); } setFiles((prevFiles) => [...prevFiles, ...selectedFiles]); setFileDropError(""); }; const fileSelect = (e: React.ChangeEvent) => { const selectedFiles = Array.from(e.target.files as FileList); if (selectedFiles.some((file) => file.type.split("/")[0] !== "image")) { return setFileDropError("Please provide only image files to upload!"); } setFiles((prevFiles) => [...prevFiles, ...selectedFiles]); setFileDropError(""); }; const simulateLoading = (file: File) => { // Calcula la duración del temporizador en milisegundos const duration = Math.max(1000, Math.min(file.size / 750, 4000)); setLoadingState((prev: any) => ({ ...prev, [file.name]: true })); setTimeout(() => { setLoadingState((prev: any) => ({ ...prev, [file.name]: false })); }, duration); }; const handleDelete = (fileName: string) => { // Filtrar los archivos para eliminar el seleccionado setFiles(files.filter((file) => file.name !== fileName)); }; const formatNumberWithDots = (number: number): string => { const numStr = number.toString(); const reversedStr = numStr.split("").reverse().join(""); const withDots = reversedStr.replace(/(\d{3})(?=\d)/g, "$1."); return withDots.split("").reverse().join(""); }; const handlePreview = (file: File) => { const reader = new FileReader(); reader.onload = (e: any) => { setPreviewImage(e.target.result); }; reader.readAsDataURL(file); }; const generatePreview = (file: File) => { const reader = new FileReader(); reader.onloadend = () => { setImagePreviews((prev) => ({ ...prev, [file.name]: reader.result as string })); }; reader.readAsDataURL(file); }; useEffect(() => { files.forEach((file) => { if (loadingState[file.name] === undefined) { generatePreview(file); simulateLoading(file); } }); }, [files]); return ( <>

Upload files

Drag and drop your files. Will not be saved.

{files.length > 0 && (
{files.map((file, index) => { const isLoading = loadingState[file.name]; const preview = imagePreviews[file.name]; return (
{isLoading ? (
) : ( preview && (
Preview
) )}

{file.name}

{!isLoading && (

Uploaded

)}

{formatNumberWithDots(file.size)} Bytes

{file.name}
{previewImage ? ( Preview ) : ( )}
); })}
)} {fileDropError &&

{fileDropError}

}
{files.length > 0 && (

setFiles([])} > Reset

)} ); }