import { useEffect, useState } from 'react'; import { Loader2 } from 'lucide-react'; import { Card } from '@/components/ui/card'; import { Progress } from '@/components/ui/progress'; interface RetryStatus { attempt: number; maxAttempts: number; delay: number; type: string; } /** * Global retry status indicator * Shows visual feedback when submissions are being retried due to transient failures */ export function RetryStatusIndicator() { const [retryStatus, setRetryStatus] = useState(null); const [countdown, setCountdown] = useState(0); useEffect(() => { const handleRetry = (event: Event) => { const customEvent = event as CustomEvent; const { attempt, maxAttempts, delay, type } = customEvent.detail; setRetryStatus({ attempt, maxAttempts, delay, type }); setCountdown(delay); }; window.addEventListener('submission-retry', handleRetry); return () => window.removeEventListener('submission-retry', handleRetry); }, []); useEffect(() => { if (countdown > 0) { const timer = setInterval(() => { setCountdown((prev) => { if (prev <= 100) { setRetryStatus(null); return 0; } return prev - 100; }); }, 100); return () => clearInterval(timer); } }, [countdown]); if (!retryStatus) return null; const progress = ((retryStatus.delay - countdown) / retryStatus.delay) * 100; return (

Retrying submission...

{retryStatus.attempt}/{retryStatus.maxAttempts}

Network issue detected. Retrying {retryStatus.type} submission in {Math.ceil(countdown / 1000)}s

); }