import { useState, useEffect, useRef } from 'react'; import { Wifi, Loader2 } from 'lucide-react'; import type { ConnectionStatus } from '../types'; import { useT } from '../hooks/useLocale'; interface Props { status: ConnectionStatus; } type BannerState = 'hidden' | 'reconnecting' | 'reconnected'; export function ConnectionBanner({ status }: Props) { const t = useT(); const [banner, setBanner] = useState('hidden'); const prevStatus = useRef(status); const dismissTimer = useRef | null>(null); useEffect(() => { const prev = prevStatus.current; prevStatus.current = status; if (dismissTimer.current) { clearTimeout(dismissTimer.current); dismissTimer.current = null; } if (status === 'disconnected' || status === 'connecting') { // Only show reconnecting if we were previously connected (not initial load) if (prev === 'connected') { setBanner('reconnecting'); } } else if (status === 'connected' && prev !== 'connected') { // Just reconnected — flash success only if we were showing the banner if (banner === 'reconnecting' || prev === 'disconnected' || prev === 'connecting') { setBanner('reconnected'); dismissTimer.current = setTimeout(() => setBanner('hidden'), 3000); } } return () => { if (dismissTimer.current) clearTimeout(dismissTimer.current); }; }, [status]); if (banner === 'hidden') return null; const isReconnecting = banner === 'reconnecting'; return (
{isReconnecting ? ( <> {t('connection.reconnecting')} ) : ( <> {t('connection.reconnected')} )}
); }