{"version":3,"file":"use-network.cjs","names":[],"sources":["../../src/use-network/use-network.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { useWindowEvent } from '../use-window-event/use-window-event';\n\nexport interface UserNetworkReturnValue {\n  online: boolean;\n  downlink?: number;\n  downlinkMax?: number;\n  effectiveType?: 'slow-2g' | '2g' | '3g' | '4g';\n  rtt?: number;\n  saveData?: boolean;\n  type?: 'bluetooth' | 'cellular' | 'ethernet' | 'wifi' | 'wimax' | 'none' | 'other' | 'unknown';\n}\n\nfunction getConnection(): Omit<UserNetworkReturnValue, 'online'> {\n  if (typeof navigator === 'undefined') {\n    return {};\n  }\n\n  const _navigator = navigator as any;\n  const connection: any =\n    _navigator.connection || _navigator.mozConnection || _navigator.webkitConnection;\n\n  if (!connection) {\n    return {};\n  }\n\n  return {\n    downlink: connection?.downlink,\n    downlinkMax: connection?.downlinkMax,\n    effectiveType: connection?.effectiveType,\n    rtt: connection?.rtt,\n    saveData: connection?.saveData,\n    type: connection?.type,\n  };\n}\n\nexport function useNetwork(): UserNetworkReturnValue {\n  const [status, setStatus] = useState<UserNetworkReturnValue>({ online: true });\n\n  const handleConnectionChange = useCallback(\n    () => setStatus((current) => ({ ...current, ...getConnection() })),\n    []\n  );\n\n  useWindowEvent('online', () => setStatus({ online: true, ...getConnection() }));\n  useWindowEvent('offline', () => setStatus({ online: false, ...getConnection() }));\n\n  useEffect(() => {\n    const _navigator = navigator as any;\n\n    if (_navigator.connection) {\n      setStatus({ online: _navigator.onLine, ...getConnection() });\n      _navigator.connection.addEventListener('change', handleConnectionChange);\n      return () => _navigator.connection.removeEventListener('change', handleConnectionChange);\n    }\n\n    if (typeof _navigator.onLine === 'boolean') {\n      // Required for Firefox and other browsers that don't support navigator.connection\n      setStatus((current) => ({ ...current, online: _navigator.onLine }));\n    }\n\n    return undefined;\n  }, []);\n\n  return status;\n}\n\nexport namespace useNetwork {\n  export type ReturnValue = UserNetworkReturnValue;\n}\n"],"mappings":";;;;AAaA,SAAS,gBAAwD;AAC/D,KAAI,OAAO,cAAc,YACvB,QAAO,EAAE;CAGX,MAAM,aAAa;CACnB,MAAM,aACJ,WAAW,cAAc,WAAW,iBAAiB,WAAW;AAElE,KAAI,CAAC,WACH,QAAO,EAAE;AAGX,QAAO;EACL,UAAU,YAAY;EACtB,aAAa,YAAY;EACzB,eAAe,YAAY;EAC3B,KAAK,YAAY;EACjB,UAAU,YAAY;EACtB,MAAM,YAAY;EACnB;;AAGH,SAAgB,aAAqC;CACnD,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAA8C,EAAE,QAAQ,MAAM,CAAC;CAE9E,MAAM,0BAAA,GAAA,MAAA,mBACE,WAAW,aAAa;EAAE,GAAG;EAAS,GAAG,eAAe;EAAE,EAAE,EAClE,EAAE,CACH;AAED,0BAAA,eAAe,gBAAgB,UAAU;EAAE,QAAQ;EAAM,GAAG,eAAe;EAAE,CAAC,CAAC;AAC/E,0BAAA,eAAe,iBAAiB,UAAU;EAAE,QAAQ;EAAO,GAAG,eAAe;EAAE,CAAC,CAAC;AAEjF,EAAA,GAAA,MAAA,iBAAgB;EACd,MAAM,aAAa;AAEnB,MAAI,WAAW,YAAY;AACzB,aAAU;IAAE,QAAQ,WAAW;IAAQ,GAAG,eAAe;IAAE,CAAC;AAC5D,cAAW,WAAW,iBAAiB,UAAU,uBAAuB;AACxE,gBAAa,WAAW,WAAW,oBAAoB,UAAU,uBAAuB;;AAG1F,MAAI,OAAO,WAAW,WAAW,UAE/B,YAAW,aAAa;GAAE,GAAG;GAAS,QAAQ,WAAW;GAAQ,EAAE;IAIpE,EAAE,CAAC;AAEN,QAAO"}