diff --git a/components/dashboard/ExportModal.tsx b/components/dashboard/ExportModal.tsx index 87f3fc1..8993ab9 100644 --- a/components/dashboard/ExportModal.tsx +++ b/components/dashboard/ExportModal.tsx @@ -51,6 +51,7 @@ export default function ExportModal({ isOpen, onClose, data, stats, topPages, to const [filename, setFilename] = useState(`pulse_export_${formatDateISO(new Date())}`) const [includeHeader, setIncludeHeader] = useState(true) const [isExporting, setIsExporting] = useState(false) + const [exportDone, setExportDone] = useState(false) const [exportProgress, setExportProgress] = useState({ step: 0, total: 1, label: '' }) const [selectedFields, setSelectedFields] = useState>({ date: true, @@ -64,6 +65,15 @@ export default function ExportModal({ isOpen, onClose, data, stats, topPages, to setSelectedFields((prev) => ({ ...prev, [field]: checked })) } + const finishExport = useCallback(() => { + setExportDone(true) + setIsExporting(false) + setTimeout(() => { + setExportDone(false) + onClose() + }, 600) + }, [onClose]) + // Yield to the UI thread so the browser can paint progress updates const updateProgress = useCallback(async (step: number, total: number, label: string) => { setExportProgress({ step, total, label }) @@ -134,7 +144,7 @@ export default function ExportModal({ isOpen, onClose, data, stats, topPages, to document.body.appendChild(link) link.click() document.body.removeChild(link) - onClose() + finishExport() return } else if (format === 'pdf') { const totalSteps = 3 + (topPages?.length ? 1 : 0) + (topReferrers?.length ? 1 : 0) + (campaigns?.length ? 1 : 0) @@ -359,7 +369,7 @@ export default function ExportModal({ isOpen, onClose, data, stats, topPages, to await updateProgress(totalSteps, totalSteps, 'Saving PDF...') doc.save(`${filename || 'export'}.pdf`) - onClose() + finishExport() return } else { content = JSON.stringify(exportData, null, 2) @@ -376,7 +386,7 @@ export default function ExportModal({ isOpen, onClose, data, stats, topPages, to link.click() document.body.removeChild(link) - onClose() + finishExport() } catch (e) { console.error('Export failed:', e) } finally { @@ -468,16 +478,16 @@ export default function ExportModal({ isOpen, onClose, data, stats, topPages, to )} {/* Progress Bar */} - {isExporting && ( + {(isExporting || exportDone) && (
- {exportProgress.label} - {Math.round((exportProgress.step / exportProgress.total) * 100)}% + {exportDone ? 'Export complete' : exportProgress.label} + {exportDone ? '100%' : `${Math.round((exportProgress.step / exportProgress.total) * 100)}%`}
@@ -488,8 +498,8 @@ export default function ExportModal({ isOpen, onClose, data, stats, topPages, to -