import { Download, Loader2 } from 'lucide-react'; import { useState, useRef, useEffect } from 'react'; import { LayoutType, CanvasSize } from '../../types/canvas.types'; interface ExportButtonProps { onExport: (filename: string) => void; isExporting?: boolean; currentLayout: LayoutType | null; canvasSize: CanvasSize; } export default function ExportButton({ onExport, isExporting = false, currentLayout, canvasSize }: ExportButtonProps) { // Map canvas size to friendly name const getCanvasSizeName = (size: CanvasSize): string => { switch (size) { case '1200x675': return 'Twitter'; case 'linkedin': return 'LinkedIn'; case 'hf': return 'HF'; default: return 'Twitter'; } }; // Generate smart default filename const generateDefaultFilename = () => { const sizeName = getCanvasSizeName(canvasSize); if (currentLayout) { return `${currentLayout}_${sizeName}`; } return `thumbnail_${sizeName}`; }; const [filename, setFilename] = useState(generateDefaultFilename()); const [isFocused, setIsFocused] = useState(false); const [inputWidth, setInputWidth] = useState(0); const [isHoveringButton, setIsHoveringButton] = useState(false); const spanRef = useRef(null); // Update filename when layout or canvas size changes useEffect(() => { setFilename(generateDefaultFilename()); }, [currentLayout, canvasSize]); // Calculate input width based on text content useEffect(() => { if (spanRef.current) { setInputWidth(spanRef.current.offsetWidth); } }, [filename]); const handleExport = () => { if (isExporting) return; onExport(filename); }; return (
{/* Download/Loading Icon with Blue Background - Clickable */} {/* Filename Container */}
{/* Hidden span to measure text width */} {filename || 'thumbnail_name'} setFilename(e.target.value)} onFocus={() => setIsFocused(true)} onBlur={() => setIsFocused(false)} disabled={isExporting} placeholder="thumbnail_name" className="bg-white/5 text-white text-[14px] lg:text-[16px] font-normal outline-none border-none p-[4px] lg:p-[5px] rounded" style={{ fontFamily: 'Inter, sans-serif', width: `${inputWidth}px`, cursor: isExporting ? 'not-allowed' : 'text', opacity: isFocused ? 1 : 0.5, transition: 'all 0.2s ease-in-out', backgroundColor: isFocused ? 'rgba(255, 255, 255, 0.1)' : 'rgba(255, 255, 255, 0.05)' }} onClick={(e) => e.stopPropagation()} /> .png
); }