UNPKG

react-network-detect

Version:
2 lines (1 loc) 2.25 kB
"use strict";function e(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("react"));const{useEffect:n,useState:i}=t,o=/Windows.*Chrome|Windows.*Firefox|Linux.*Chrome/,r={enabled:!0,url:"https://ipv4.icanhazip.com/",timeout:5e3,interval:5e3};class a{pollingConfigs;static instance;intervalId;constructor(e=r){this.pollingConfigs=e}setIntervalId(e){this.intervalId=e}getIntervalId(){return this.intervalId}static getInstance(e){return a.instance||(a.instance=new a),a.instance.setPollingConfigs(e),a.instance}setPollingConfigs(e){o.test(global.navigator?.userAgent)?"object"==typeof e?this.pollingConfigs={...r,...e}:e&&(this.pollingConfigs=r):this.pollingConfigs={...r,enabled:!1}}ping({url:e,timeout:t}){return new Promise(((n,i)=>{const o=new XMLHttpRequest;o.onerror=i,o.ontimeout=i,o.onreadystatechange=()=>{o.readyState===o.HEADERS_RECEIVED&&(o.status?n():i())},o.open("HEAD",e),o.timeout=t,o.send()}))}}let s=!1;exports.useNetworkStatus=e=>{s=global.navigator&&"connection"in global.navigator&&"effectiveType"in global.navigator.connection;const t={supported:s,effectiveConnectionType:s?global.navigator.connection.effectiveType:e},[o,r]=i(t);return n((()=>{if(s){const e=global.navigator.connection,t=()=>{r({supported:s,effectiveConnectionType:e.effectiveType})};return e.addEventListener("change",t),()=>{e.removeEventListener("change",t)}}}),[]),{...o,setNetworkStatus:e=>{r({supported:s,...e})}}},exports.useOnlineEffect=(e=!0)=>{const[t,o]=i(!0),r=a.getInstance(e),s=()=>{o(!0)},l=()=>{o(!1)};return n((()=>{window.addEventListener("online",s),window.addEventListener("offline",l);let e=r.getIntervalId();const{enabled:t,url:n,timeout:i,interval:a}=r.pollingConfigs;return t&&n&&(e&&clearInterval(e),e=window.setInterval((async()=>{try{await r.ping({url:n,timeout:i}),o(!0)}catch(e){o(!1)}}),a),r.setIntervalId(e)),()=>{window.removeEventListener("online",s),window.removeEventListener("offline",l),t&&clearInterval(e)}}),[]),{isOnline:t}};