@mantine/hooks
Version:
A collection of 50+ hooks for state and UI management
1 lines • 3.19 kB
Source Map (JSON)
{"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"}