import React, { useState, useRef, DragEvent, ChangeEvent } from 'react'; import { Upload, Image as ImageIcon, X, AlertCircle } from 'lucide-react'; interface ImageDropzoneProps { value: string; onChange: (base64Url: string) => void; onClear: () => void; label?: string; className?: string; } export default function ImageDropzone({ value, onChange, onClear, label = '상품 대표 이미지 업로드', className = '' }: ImageDropzoneProps) { const [isDragActive, setIsDragActive] = useState(false); const [error, setError] = useState(null); const fileInputRef = useRef(null); const processFile = (file: File) => { setError(null); // Validate file type if (!file.type.startsWith('image/')) { setError('이미지 파일(*.png, *.jpg, *.jpeg, *.gif)만 업로드할 수 있습니다.'); return; } // Validate size (e.g., max 4MB for high-fidelity base64 storage) const maxSize = 4 * 1024 * 1024; if (file.size > maxSize) { setError('이미지 최댓값은 4MB입니다. 더 작고 최적화된 이미지를 권장합니다.'); return; } const reader = new FileReader(); reader.onload = (e) => { if (e.target?.result && typeof e.target.result === 'string') { onChange(e.target.result); } else { setError('이미지 해독 과정에 이상이 발생했습니다.'); } }; reader.onerror = () => { setError('파일을 수집하지 못했습니다.'); }; reader.readAsDataURL(file); }; const handleDragOver = (e: DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragActive(true); }; const handleDragLeave = (e: DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragActive(false); }; const handleDrop = (e: DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragActive(false); if (e.dataTransfer.files && e.dataTransfer.files[0]) { processFile(e.dataTransfer.files[0]); } }; const handleFileChange = (e: ChangeEvent) => { if (e.target.files && e.target.files[0]) { processFile(e.target.files[0]); } }; const handleButtonClick = () => { fileInputRef.current?.click(); }; return (
{value ? ( // Preview Mode with image loaded
Uploaded preview {/* Hover overlay control */}
) : ( // Active Dropzone Area
{isDragActive ? ( ) : ( )}

{isDragActive ? '여기에 드롭하여 업로드' : '이지지 드래그 앤 드롭 또는 파일 탐색'}

PNG, JPG, JPEG, GIF 파일 지원 (최대 4MB)

)} {error && (
{error}
)}
); }