{"version":3,"file":"ReactNativeOnlineDetector.cjs","sources":["../../../src/connectivity/ReactNativeOnlineDetector.ts"],"sourcesContent":["import NetInfo from '@react-native-community/netinfo'\nimport { AppState } from 'react-native'\nimport type { AppStateStatus, NativeEventSubscription } from 'react-native'\nimport type { OnlineDetector } from '../types'\n\n/**\n * React Native online detector that uses RN APIs.\n * Listens for:\n * - Network connectivity changes via `@react-native-community/netinfo`\n * - App state changes (foreground/background) via `AppState`\n */\nexport class ReactNativeOnlineDetector implements OnlineDetector {\n  private listeners: Set<() => void> = new Set()\n  private netInfoUnsubscribe: (() => void) | null = null\n  private appStateSubscription: NativeEventSubscription | null = null\n  private isListening = false\n  private wasConnected = true\n\n  constructor() {\n    this.startListening()\n  }\n\n  private startListening(): void {\n    if (this.isListening) {\n      return\n    }\n\n    this.isListening = true\n\n    if (typeof NetInfo.fetch === `function`) {\n      void NetInfo.fetch()\n        .then((state) => {\n          this.wasConnected = this.toConnectivityState(state)\n        })\n        .catch(() => {\n          // Ignore initial fetch failures and rely on subscription updates.\n        })\n    }\n\n    // Subscribe to network state changes\n    this.netInfoUnsubscribe = NetInfo.addEventListener((state) => {\n      const isConnected = this.toConnectivityState(state)\n\n      // Only notify when transitioning to online\n      if (isConnected && !this.wasConnected) {\n        this.notifyListeners()\n      }\n\n      this.wasConnected = isConnected\n    })\n\n    // Subscribe to app state changes (foreground/background)\n    this.appStateSubscription = AppState.addEventListener(\n      `change`,\n      this.handleAppStateChange,\n    )\n  }\n\n  private handleAppStateChange = (nextState: AppStateStatus): void => {\n    // Notify when app becomes active (foreground)\n    if (nextState === `active`) {\n      this.notifyListeners()\n    }\n  }\n\n  private stopListening(): void {\n    if (!this.isListening) {\n      return\n    }\n\n    this.isListening = false\n\n    if (this.netInfoUnsubscribe) {\n      this.netInfoUnsubscribe()\n      this.netInfoUnsubscribe = null\n    }\n\n    if (this.appStateSubscription) {\n      this.appStateSubscription.remove()\n      this.appStateSubscription = null\n    }\n  }\n\n  private notifyListeners(): void {\n    for (const listener of this.listeners) {\n      try {\n        listener()\n      } catch (error) {\n        console.warn(`ReactNativeOnlineDetector listener error:`, error)\n      }\n    }\n  }\n\n  subscribe(callback: () => void): () => void {\n    this.listeners.add(callback)\n\n    return () => {\n      this.listeners.delete(callback)\n\n      if (this.listeners.size === 0) {\n        this.stopListening()\n      }\n    }\n  }\n\n  notifyOnline(): void {\n    this.notifyListeners()\n  }\n\n  isOnline(): boolean {\n    return this.wasConnected\n  }\n\n  dispose(): void {\n    this.stopListening()\n    this.listeners.clear()\n  }\n\n  private toConnectivityState(state: {\n    isConnected: boolean | null\n    isInternetReachable: boolean | null\n  }): boolean {\n    return !!state.isConnected && state.isInternetReachable !== false\n  }\n}\n"],"names":["AppState"],"mappings":";;;;AAWO,MAAM,0BAAoD;AAAA,EAO/D,cAAc;AANd,SAAQ,gCAAiC,IAAA;AACzC,SAAQ,qBAA0C;AAClD,SAAQ,uBAAuD;AAC/D,SAAQ,cAAc;AACtB,SAAQ,eAAe;AA0CvB,SAAQ,uBAAuB,CAAC,cAAoC;AAElE,UAAI,cAAc,UAAU;AAC1B,aAAK,gBAAA;AAAA,MACP;AAAA,IACF;AA5CE,SAAK,eAAA;AAAA,EACP;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,SAAK,cAAc;AAEnB,QAAI,OAAO,QAAQ,UAAU,YAAY;AACvC,WAAK,QAAQ,MAAA,EACV,KAAK,CAAC,UAAU;AACf,aAAK,eAAe,KAAK,oBAAoB,KAAK;AAAA,MACpD,CAAC,EACA,MAAM,MAAM;AAAA,MAEb,CAAC;AAAA,IACL;AAGA,SAAK,qBAAqB,QAAQ,iBAAiB,CAAC,UAAU;AAC5D,YAAM,cAAc,KAAK,oBAAoB,KAAK;AAGlD,UAAI,eAAe,CAAC,KAAK,cAAc;AACrC,aAAK,gBAAA;AAAA,MACP;AAEA,WAAK,eAAe;AAAA,IACtB,CAAC;AAGD,SAAK,uBAAuBA,YAAAA,SAAS;AAAA,MACnC;AAAA,MACA,KAAK;AAAA,IAAA;AAAA,EAET;AAAA,EASQ,gBAAsB;AAC5B,QAAI,CAAC,KAAK,aAAa;AACrB;AAAA,IACF;AAEA,SAAK,cAAc;AAEnB,QAAI,KAAK,oBAAoB;AAC3B,WAAK,mBAAA;AACL,WAAK,qBAAqB;AAAA,IAC5B;AAEA,QAAI,KAAK,sBAAsB;AAC7B,WAAK,qBAAqB,OAAA;AAC1B,WAAK,uBAAuB;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AACF,iBAAA;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,KAAK,6CAA6C,KAAK;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,UAAkC;AAC1C,SAAK,UAAU,IAAI,QAAQ;AAE3B,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,QAAQ;AAE9B,UAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,aAAK,cAAA;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAqB;AACnB,SAAK,gBAAA;AAAA,EACP;AAAA,EAEA,WAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAgB;AACd,SAAK,cAAA;AACL,SAAK,UAAU,MAAA;AAAA,EACjB;AAAA,EAEQ,oBAAoB,OAGhB;AACV,WAAO,CAAC,CAAC,MAAM,eAAe,MAAM,wBAAwB;AAAA,EAC9D;AACF;;"}