import { router } from '@inertiajs/react'; import { useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; export function RouterProgress() { const [progress, setProgress] = useState(null); useEffect(() => { let timer: ReturnType; const offStart = router.on('start', () => { setProgress(0); // Animate to ~80% quickly, then slow down while waiting for response timer = setTimeout(() => setProgress(30), 50); timer = setTimeout(() => setProgress(60), 300); timer = setTimeout(() => setProgress(80), 800); }); const offFinish = router.on('finish', () => { clearTimeout(timer); setProgress(100); // Remove bar after fade-out setTimeout(() => setProgress(null), 400); }); return () => { offStart(); offFinish(); clearTimeout(timer); }; }, []); if (progress === null) return null; return createPortal(
, document.body ); }