UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

52 lines (45 loc) • 1.67 kB
import { useEffect, useState } from 'react' import type { NetworkState, NetworkStateSubscription } from './types' import { assertStateListener } from './validate' export type { NetworkState, NetworkStateSubscription, NetworkStateType } from './types' // web entry. same signatures as the native entry: the published // declarations are built from this file and serve both platforms. // navigator.connection types are unreliable across browsers, so a live // connection reports unknown, matching expo-network on web. function currentState(): NetworkState { const isConnected = typeof navigator === 'undefined' ? false : navigator.onLine !== false return { type: isConnected ? 'unknown' : 'none', isConnected, isInternetReachable: isConnected, } } async function getState(): Promise<NetworkState> { return currentState() } function addStateListener( listener: (state: NetworkState) => void ): NetworkStateSubscription { assertStateListener(listener) if (typeof window === 'undefined') return { remove: () => {} } const onChange = () => listener(currentState()) window.addEventListener('online', onChange) window.addEventListener('offline', onChange) return { remove: () => { window.removeEventListener('online', onChange) window.removeEventListener('offline', onChange) }, } } function useNetworkState(): NetworkState { const [state, setState] = useState<NetworkState>(currentState) useEffect(() => { setState(currentState()) return addStateListener(setState).remove }, []) return state } export const Network = Object.freeze({ getState, addStateListener }) export { useNetworkState }