'use client'; import * as React from 'react'; import { Upload, X, FileImage, HardDrive } from 'lucide-react'; import { cn } from '@/lib/utils/cn'; import { Button } from '@/components/ui/button'; export interface FaviconFileUploadProps { onFileSelect: (file: File) => void; onFileRemove: () => void; selectedFile?: File | null; disabled?: boolean; } export function FaviconFileUpload({ onFileSelect, onFileRemove, selectedFile, disabled = false, }: FaviconFileUploadProps) { const [isDragging, setIsDragging] = React.useState(false); const [dimensions, setDimensions] = React.useState(null); const fileInputRef = React.useRef(null); React.useEffect(() => { if (selectedFile) { const img = new Image(); img.onload = () => { setDimensions(`${img.width} × ${img.height}`); URL.revokeObjectURL(img.src); }; img.src = URL.createObjectURL(selectedFile); } else { setDimensions(null); } }, [selectedFile]); const handleDragEnter = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); if (!disabled) setIsDragging(true); }; const handleDragLeave = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); }; const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); if (disabled) return; const files = Array.from(e.dataTransfer.files); if (files.length > 0 && files[0].type.startsWith('image/')) { onFileSelect(files[0]); } }; const handleFileInput = (e: React.ChangeEvent) => { const files = Array.from(e.target.files || []); if (files.length > 0 && files[0].type.startsWith('image/')) { onFileSelect(files[0]); } }; const handleClick = () => { if (!disabled) fileInputRef.current?.click(); }; return (
{selectedFile ? (

{selectedFile.name}

{(selectedFile.size / 1024).toFixed(1)} KB
{dimensions && (
{dimensions}
)}
) : (

Drop icon source here

Recommended: 512x512 PNG or SVG

)}
); }