import { Upload } from 'lucide-react';
import { useState, useRef, DragEvent } from 'react';
interface FileUploadProps {
onFileSelect: (file: File) => void;
disabled?: boolean;
}
export default function FileUpload({ onFileSelect, disabled }: FileUploadProps) {
const [isDragging, setIsDragging] = useState(false);
const fileInputRef = useRef<HTMLInputElement>(null);
const handleDragEnter = (e: DragEvent<HTMLDivElement>) => {
e.preventDefault();
e.stopPropagation();
if (!disabled) {
setIsDragging(true);
}
};
const handleDragLeave = (e: DragEvent<HTMLDivElement>) => {
e.preventDefault();
e.stopPropagation();
setIsDragging(false);
};
const handleDragOver = (e: DragEvent<HTMLDivElement>) => {
e.preventDefault();
e.stopPropagation();
};
const handleDrop = (e: DragEvent<HTMLDivElement>) => {
e.preventDefault();
e.stopPropagation();
setIsDragging(false);
if (disabled) return;
const files = e.dataTransfer.files;
if (files.length > 0) {
onFileSelect(files[0]);
}
};
const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const files = e.target.files;
if (files && files.length > 0) {
onFileSelect(files[0]);
}
};
const handleClick = () => {
if (!disabled) {
fileInputRef.current?.click();
}
};
return (
<div
onClick={handleClick}
onDragEnter={handleDragEnter}
onDragOver={handleDragOver}
onDragLeave={handleDragLeave}
onDrop={handleDrop}
className={`
relative border-2 border-dashed rounded-lg p-12 text-center cursor-pointer
transition-all duration-200 ease-in-out
${isDragging
? 'border-blue-500 bg-blue-50 scale-105'
: 'border-gray-300 hover:border-gray-400 bg-gray-50 hover:bg-gray-100'
}
${disabled ? 'opacity-50 cursor-not-allowed' : ''}
`}
>
<input
ref={fileInputRef}
type="file"
accept="image/jpeg,image/png,image/webp"
onChange={handleFileInputChange}
className="hidden"
disabled={disabled}
/>
<div className="flex flex-col items-center space-y-4">
<div className={`
p-4 rounded-full transition-colors
${isDragging ? 'bg-blue-100' : 'bg-gray-200'}
`}>
<Upload className={`w-12 h-12 ${isDragging ? 'text-blue-600' : 'text-gray-500'}`} />
</div>
<div>
<p className="text-lg font-semibold text-gray-700 mb-1">
{isDragging ? 'Drop your image here' : 'Drag & drop your image here'}
</p>
<p className="text-sm text-gray-500">
or click to browse
</p>
</div>
<div className="text-xs text-gray-400 space-y-1">
<p>Supported formats: JPG, PNG, WEBP</p>
<p>Maximum file size: 10MB</p>
</div>
</div>
</div>
);
}