import { useEffect, useRef, useState } from 'react'; import { ChevronDown, Download, Loader2 } from 'lucide-react'; import { downloadEngagementExport, type ExportFormat } from '@/api/exports'; import { useToast } from '@/hooks/useToast'; interface ExportEngagementButtonProps { engagementId: number; } const FORMATS: { label: string; value: ExportFormat }[] = [ { label: 'Markdown', value: 'md' }, { label: 'CSV', value: 'csv' }, { label: 'PDF', value: 'pdf' }, ]; export function ExportEngagementButton({ engagementId }: ExportEngagementButtonProps): JSX.Element { const { push } = useToast(); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(null); const ref = useRef(null); useEffect(() => { if (!open) return; const onPointerDown = (e: PointerEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) { setOpen(false); } }; const onKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); }; document.addEventListener('pointerdown', onPointerDown); document.addEventListener('keydown', onKeyDown); return () => { document.removeEventListener('pointerdown', onPointerDown); document.removeEventListener('keydown', onKeyDown); }; }, [open]); const handleDownload = async (format: ExportFormat) => { setLoading(format); try { await downloadEngagementExport(engagementId, format); setOpen(false); } catch (err) { push(err instanceof Error ? err.message : 'Export failed', 'error'); } finally { setLoading(null); } }; return (
{open ? (
{FORMATS.map(({ label, value }) => ( ))}
) : null}
); }