import React, { useState, useRef } from 'react'; import { StoredImage } from '../../services/imageStorageService'; interface ImageUploadProps { onImageSelected: (file: File) => void; onImageRemove?: () => void; currentImage?: StoredImage | null; loading?: boolean; error?: string; className?: string; maxSizeMB?: number; acceptedFormats?: string[]; size?: 'small' | 'medium' | 'large'; } const ImageUpload: React.FC = ({ onImageSelected, onImageRemove, currentImage, loading = false, error, className = '', maxSizeMB = 10, acceptedFormats = ['JPEG', 'PNG', 'GIF', 'WebP'], size = 'medium' }) => { const [dragOver, setDragOver] = useState(false); const fileInputRef = useRef(null); const sizeClasses = { small: 'w-12 h-12', medium: 'w-16 h-16', large: 'w-24 h-24' }; const handleFileSelect = (file: File) => { // Basic validation if (!file.type.startsWith('image/')) { return; } if (file.size > maxSizeMB * 1024 * 1024) { return; } onImageSelected(file); }; const handleInputChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { handleFileSelect(file); } // Reset input if (fileInputRef.current) { fileInputRef.current.value = ''; } }; const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); setDragOver(true); }; const handleDragLeave = (e: React.DragEvent) => { e.preventDefault(); setDragOver(false); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); setDragOver(false); const file = e.dataTransfer.files[0]; if (file) { handleFileSelect(file); } }; const handleClick = () => { if (!loading) { fileInputRef.current?.click(); } }; const handleRemove = (e: React.MouseEvent) => { e.stopPropagation(); if (onImageRemove) { onImageRemove(); } }; return (
{currentImage ? ( <> Uploaded {!loading && onImageRemove && ( )} ) : (
{loading ? (
) : ( )}
)} {dragOver && (
Drop image
)}
{error && (
{error}
)}
); }; export default ImageUpload;