{
  "name": "use-network",
  "author": "Brendan Dash (https://shadcn-hooks.com)",
  "description": "A hook to get the network state",
  "registryDependencies": [
    "@shadcnhooks/use-network"
  ],
  "files": [
    {
      "path": "registry/hooks/use-network.ts",
      "content": "import { useCallback, useRef, useSyncExternalStore } from 'react'\n\nexport interface NetworkState {\n  since?: Date\n  online?: boolean\n  rtt?: number\n  type?: string\n  downlink?: number\n  saveData?: boolean\n  downlinkMax?: number\n  effectiveType?: string\n}\n\nfunction getConnection() {\n  const nav = navigator as any\n  if (typeof nav !== 'object') {\n    return null\n  }\n  return nav.connection || nav.mozConnection || nav.webkitConnection\n}\n\nfunction getConnectionProperty(): NetworkState {\n  const c = getConnection()\n  if (!c) {\n    return {}\n  }\n  return {\n    rtt: c.rtt,\n    type: c.type,\n    saveData: c.saveData,\n    downlink: c.downlink,\n    downlinkMax: c.downlinkMax,\n    effectiveType: c.effectiveType,\n  }\n}\n\nfunction serverSnapshot() {\n  return {\n    since: undefined,\n    online: true,\n    ...getConnectionProperty(),\n  }\n}\n\nfunction getInitialOnlineState(): boolean {\n  if (typeof navigator !== 'object') {\n    return true\n  }\n  return navigator.onLine\n}\n\nexport function useNetwork() {\n  const networkState = useRef<NetworkState>({\n    since: undefined,\n    online: getInitialOnlineState(),\n    ...getConnectionProperty(),\n  })\n\n  const subscribe = useCallback((onStoreChange: () => void) => {\n    const onOnline = () => {\n      networkState.current = {\n        ...networkState.current,\n        since: new Date(),\n        online: true,\n        ...getConnectionProperty(),\n      }\n      onStoreChange()\n    }\n\n    const onOffline = () => {\n      networkState.current = {\n        ...networkState.current,\n        since: new Date(),\n        online: false,\n        ...getConnectionProperty(),\n      }\n      onStoreChange()\n    }\n\n    const onConnectionChange = () => {\n      networkState.current = {\n        ...networkState.current,\n        since: new Date(),\n        ...getConnectionProperty(),\n      }\n      onStoreChange()\n    }\n\n    window.addEventListener('online', onOnline)\n    window.addEventListener('offline', onOffline)\n\n    const connection = getConnection()\n    connection?.addEventListener('change', onConnectionChange)\n\n    return () => {\n      window.removeEventListener('online', onOnline)\n      window.removeEventListener('offline', onOffline)\n      connection?.removeEventListener('change', onConnectionChange)\n    }\n  }, [])\n\n  const snapshot = useCallback(() => networkState.current, [])\n\n  return useSyncExternalStore(subscribe, snapshot, serverSnapshot)\n}\n",
      "type": "registry:hook"
    }
  ],
  "type": "registry:hook"
}
