{"version":3,"file":"use-network.mjs","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;CAC/D,IAAI,OAAO,cAAc,aACvB,OAAO,CAAC;CAGV,MAAM,aAAa;CACnB,MAAM,aACJ,WAAW,cAAc,WAAW,iBAAiB,WAAW;CAElE,IAAI,CAAC,YACH,OAAO,CAAC;CAGV,OAAO;EACL,UAAU,YAAY;EACtB,aAAa,YAAY;EACzB,eAAe,YAAY;EAC3B,KAAK,YAAY;EACjB,UAAU,YAAY;EACtB,MAAM,YAAY;CACpB;AACF;AAEA,SAAgB,aAAqC;CACnD,MAAM,CAAC,QAAQ,aAAa,SAAiC,EAAE,QAAQ,KAAK,CAAC;CAE7E,MAAM,yBAAyB,kBACvB,WAAW,aAAa;EAAE,GAAG;EAAS,GAAG,cAAc;CAAE,EAAE,GACjE,CAAC,CACH;CAEA,eAAe,gBAAgB,UAAU;EAAE,QAAQ;EAAM,GAAG,cAAc;CAAE,CAAC,CAAC;CAC9E,eAAe,iBAAiB,UAAU;EAAE,QAAQ;EAAO,GAAG,cAAc;CAAE,CAAC,CAAC;CAEhF,gBAAgB;EACd,MAAM,aAAa;EAEnB,IAAI,WAAW,YAAY;GACzB,UAAU;IAAE,QAAQ,WAAW;IAAQ,GAAG,cAAc;GAAE,CAAC;GAC3D,WAAW,WAAW,iBAAiB,UAAU,sBAAsB;GACvE,aAAa,WAAW,WAAW,oBAAoB,UAAU,sBAAsB;EACzF;EAEA,IAAI,OAAO,WAAW,WAAW,WAE/B,WAAW,aAAa;GAAE,GAAG;GAAS,QAAQ,WAAW;EAAO,EAAE;CAItE,GAAG,CAAC,CAAC;CAEL,OAAO;AACT"}