miinventario-mobile-v2/src/hooks/useNetworkStatus.ts
rckrdmrd eb718a95aa Sincronización desde miinventario/apps/mobile - Estándar multi-repo v2
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:29:24 -06:00

74 lines
1.9 KiB
TypeScript

import { useState, useEffect } from 'react';
import NetInfo, { NetInfoState, NetInfoStateType } from '@react-native-community/netinfo';
export interface NetworkStatus {
isConnected: boolean;
isInternetReachable: boolean | null;
type: NetInfoStateType;
isWifi: boolean;
isCellular: boolean;
}
/**
* Hook para detectar el estado de la conexión de red
*/
export function useNetworkStatus(): NetworkStatus {
const [networkStatus, setNetworkStatus] = useState<NetworkStatus>({
isConnected: true,
isInternetReachable: true,
type: NetInfoStateType.unknown,
isWifi: false,
isCellular: false,
});
useEffect(() => {
const unsubscribe = NetInfo.addEventListener((state: NetInfoState) => {
setNetworkStatus({
isConnected: state.isConnected ?? false,
isInternetReachable: state.isInternetReachable,
type: state.type,
isWifi: state.type === NetInfoStateType.wifi,
isCellular: state.type === NetInfoStateType.cellular,
});
});
// Obtener estado inicial
NetInfo.fetch().then((state) => {
setNetworkStatus({
isConnected: state.isConnected ?? false,
isInternetReachable: state.isInternetReachable,
type: state.type,
isWifi: state.type === NetInfoStateType.wifi,
isCellular: state.type === NetInfoStateType.cellular,
});
});
return () => {
unsubscribe();
};
}, []);
return networkStatus;
}
/**
* Hook simplificado para verificar si hay conexión
*/
export function useIsOnline(): boolean {
const { isConnected, isInternetReachable } = useNetworkStatus();
// isInternetReachable puede ser null mientras se determina
if (isInternetReachable === null) {
return isConnected;
}
return isConnected && isInternetReachable;
}
/**
* Hook simplificado para verificar si está offline
*/
export function useIsOffline(): boolean {
return !useIsOnline();
}