1import NetInfo, { NetInfoState } from '@react-native-community/netinfo'; 2 3type ConnectivityListener = (available: boolean) => void; 4 5class Connectivity { 6 _isAvailable = true; 7 _listeners = new Set<ConnectivityListener>(); 8 9 constructor() { 10 NetInfo.addEventListener(this._handleConnectivityChange); 11 this.isAvailableAsync(); 12 } 13 14 isAvailable(): boolean { 15 return this._isAvailable; 16 } 17 18 async isAvailableAsync(): Promise<boolean> { 19 if (this._isAvailable) { 20 return this._isAvailable; 21 } 22 23 try { 24 const netInfo = await NetInfo.fetch(); 25 this._isAvailable = netInfo.isConnected ?? false; 26 } catch (e) { 27 this._isAvailable = false; 28 console.warn(`Uncaught error when fetching connectivity status: ${e}`); 29 } 30 31 return this._isAvailable; 32 } 33 34 _handleConnectivityChange = (netInfo: NetInfoState) => { 35 this._isAvailable = netInfo.isConnected ?? false; 36 this._listeners.forEach((listener) => { 37 listener(this._isAvailable); 38 }); 39 }; 40 41 addListener(listener: ConnectivityListener): void { 42 this._listeners.add(listener); 43 } 44 45 removeListener(listener: ConnectivityListener): void { 46 this._listeners.delete(listener); 47 } 48} 49 50export default new Connectivity(); 51