xref: /expo/home/api/Connectivity.ts (revision a394466c)
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