import React, { useState, useEffect } from 'react'; import { Wifi, WifiOff } from 'lucide-react'; import { connectionService, type ConnectionStatus } from '../services/connectionService'; export const ConnectionIndicator: React.FC = () => { const [status, setStatus] = useState(connectionService.getStatus()); const [apiBaseUrl] = useState(import.meta.env.VITE_API_BASE_URL || ''); const [showIndicator, setShowIndicator] = useState(false); useEffect(() => { const unsubscribe = connectionService.subscribe((newStatus) => { setStatus(newStatus); }); // Не показываем индикатор сразу при загрузке, даём время на проверку подключения const timer = setTimeout(() => { setShowIndicator(true); }, 2000); // 2 секунды задержка return () => { unsubscribe(); clearTimeout(timer); }; }, []); // Если API не настроен, не показываем индикатор (используется только localStorage) if (!apiBaseUrl) { return null; } // Не показываем индикатор сразу при загрузке if (!showIndicator) { return null; } // На ПК показываем индикатор только если есть проблема с подключением // На мобильных показываем всегда для информативности const isDesktop = typeof window !== 'undefined' && window.innerWidth >= 768; if (isDesktop && status === 'connected') { return null; } const getStatusColor = () => { switch (status) { case 'connected': return 'text-emerald-500'; case 'connecting': return 'text-amber-500'; case 'disconnected': return 'text-red-500'; default: return 'text-slate-400'; } }; const getStatusBg = () => { switch (status) { case 'connected': return 'bg-emerald-50'; case 'connecting': return 'bg-amber-50'; case 'disconnected': return 'bg-red-50'; default: return 'bg-slate-50'; } }; const getStatusText = () => { switch (status) { case 'connected': return 'Подключено'; case 'connecting': return 'Подключение...'; case 'disconnected': return 'Нет подключения'; default: return 'Неизвестно'; } }; return (
{status === 'disconnected' ? ( ) : ( )}
); };