import { useState, useEffect, useRef, useCallback } 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(null); const dismissTimer = useRef | null>(null); const updateBanner = useCallback((prev: ConnectionStatus | null, current: ConnectionStatus) => { if (dismissTimer.current) { clearTimeout(dismissTimer.current); dismissTimer.current = null; } if (current === 'disconnected' || current === 'connecting') { if (prev === 'connected') { setBanner('reconnecting'); } } else if (current === 'connected' && prev !== null && prev !== 'connected') { setBanner('reconnected'); dismissTimer.current = setTimeout(() => setBanner('hidden'), 3000); } }, []); useEffect(() => { const prev = prevStatus.current; prevStatus.current = status; updateBanner(prev, status); return () => { if (dismissTimer.current) clearTimeout(dismissTimer.current); }; }, [status, updateBanner]); if (banner === 'hidden') return null; const isReconnecting = banner === 'reconnecting'; return (
{isReconnecting ? ( <> {t('connection.reconnecting')} ) : ( <> {t('connection.reconnected')} )}
); }