/** * useConnectionStatus — объединённое состояние подключения клиента к сети. * * Определяет один из трёх стейтов: * - 'offline' — нет интернета по данным NetInfo * - 'connecting' — интернет есть, но WebSocket к ноде не подключён * - 'online' — WebSocket к ноде активен * * Используется в headers (например Messages → "Connecting...", * "Waiting for internet") и на profile-avatar'ах как индикатор * живости. * * NetInfo использует connected + internetReachable для детекта * настоящего Internet (не просто Wi-Fi SSID без доступа); fallback * на `connected`-only когда internetReachable неопределён (некоторые * корпоративные сети или Android в первые секунды). */ import { useEffect, useState } from 'react'; import NetInfo from '@react-native-community/netinfo'; import { getWSClient } from '@/lib/ws'; export type ConnectionStatus = 'online' | 'connecting' | 'offline'; export function useConnectionStatus(): ConnectionStatus { const [wsLive, setWsLive] = useState(false); const [hasNet, setHasNet] = useState(true); // WS live-state: subscribe к его onConnectionChange. useEffect(() => { const ws = getWSClient(); setWsLive(ws.isConnected()); return ws.onConnectionChange(setWsLive); }, []); // Internet reachability: через NetInfo. useEffect(() => { const unsub = NetInfo.addEventListener((state) => { // internetReachable = null значит "ещё не проверили" — считаем // что есть, чтобы не ложно отображать "offline" на старте. const reachable = state.isInternetReachable === false ? false : state.isConnected === false ? false : true; setHasNet(reachable); }); return unsub; }, []); if (!hasNet) return 'offline'; if (wsLive) return 'online'; return 'connecting'; }