"use client"; import { useCallback, useState, useEffect } from "react"; import { useDropzone } from "react-dropzone"; import { Button } from "./ui/button"; import { Upload as UploadIcon, Image as ImageIcon, X } from "lucide-react"; import Image from "next/image"; interface ImageUploadProps { onImageSelect: (imageData: string) => void; currentImage: string | null; } export function formatFileSize(bytes: number): string { if (bytes === 0) return "0 Bytes"; const k = 1024; const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; const i = Math.floor(Math.log(bytes) / Math.log(k)); return ( Number.parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i] ); } export function ImageUpload({ onImageSelect, currentImage }: ImageUploadProps) { const [selectedFile, setSelectedFile] = useState(null); // Update the selected file when the current image changes useEffect(() => { if (!currentImage) { setSelectedFile(null); } }, [currentImage]); const onDrop = useCallback( (acceptedFiles: File[]) => { const file = acceptedFiles[0]; if (!file) return; setSelectedFile(file); // Convert the file to base64 const reader = new FileReader(); reader.onload = (event) => { if (event.target && event.target.result) { const result = event.target.result as string; console.log("Image loaded, length:", result.length); onImageSelect(result); } }; reader.onerror = (error) => { console.error("Error reading file:", error); }; reader.readAsDataURL(file); }, [onImageSelect] ); const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: { "image/png": [".png"], "image/jpeg": [".jpg", ".jpeg"], }, maxSize: 10 * 1024 * 1024, // 10MB multiple: false, }); const handleRemove = () => { setSelectedFile(null); onImageSelect(""); }; return (
{!currentImage ? (

Drop your image here or click to browse

Maximum file size: 10MB

) : (

{selectedFile?.name || "Current Image"}

{selectedFile && (

{formatFileSize(selectedFile?.size ?? 0)}

)}
Selected
)}
); }