'use client'; import { useState, useRef } from 'react'; import styles from './UploadZone.module.css'; const resizeImage = (file, maxSize = 512) => { return new Promise((resolve) => { const img = new Image(); img.onload = () => { let { width, height } = img; if (width > height) { if (width > maxSize) { height = Math.round((height * maxSize) / width); width = maxSize; } } else { if (height > maxSize) { width = Math.round((width * maxSize) / height); height = maxSize; } } const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0, width, height); canvas.toBlob((blob) => { resolve({ blob, preview: URL.createObjectURL(blob) }); }, 'image/png'); }; img.src = URL.createObjectURL(file); }); }; export default function UploadZone({ status, selectedImage, onImageSelect, onSubmit, errorMessage }) { const [isDragging, setIsDragging] = useState(false); const fileInputRef = useRef(null); const handleDragEnter = (e) => { e.preventDefault(); e.stopPropagation(); setIsDragging(true); }; const handleDragOver = (e) => { e.preventDefault(); e.stopPropagation(); setIsDragging(true); }; const handleDragLeave = (e) => { e.preventDefault(); e.stopPropagation(); if (!e.currentTarget.contains(e.relatedTarget)) { setIsDragging(false); } }; const processFile = async (file) => { if (!file) return; const allowed = ['image/png', 'image/jpeg', 'image/webp', 'image/gif']; if (!allowed.includes(file.type)) { onImageSelect(null, "Invalid file type. Use PNG, JPEG, WebP, or GIF."); return; } if (file.size > 10 * 1024 * 1024) { onImageSelect(null, "File is too large. Max 10MB allowed."); return; } try { const resized = await resizeImage(file, 512); onImageSelect(resized.blob, null, resized.preview); } catch (err) { onImageSelect(null, "Failed to process image."); } }; const handleDrop = (e) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { processFile(e.dataTransfer.files[0]); } else if (e.dataTransfer.items && e.dataTransfer.items.length > 0) { const item = e.dataTransfer.items[0]; if (item.kind === 'file') { const file = item.getAsFile(); processFile(file); } } if (e.dataTransfer.clearData) { e.dataTransfer.clearData(); } }; const handleFileChange = (e) => { if (e.target.files && e.target.files.length > 0) { processFile(e.target.files[0]); } }; if (status === 'loading' || status === 'success') { return null; } return (
or click to upload