react-use
Version:
Collection of React Hooks
67 lines (66 loc) • 2.23 kB
JavaScript
import { __assign } from "tslib";
import { useEffect, useState } from 'react';
import { off, on } from './util';
var getConnection = function () {
if (typeof navigator !== 'object') {
return null;
}
var nav = navigator;
return nav.connection || nav.mozConnection || nav.webkitConnection;
};
var getConnectionState = function () {
var connection = getConnection();
if (!connection) {
return {};
}
var downlink = connection.downlink, downlinkMax = connection.downlinkMax, effectiveType = connection.effectiveType, type = connection.type, rtt = connection.rtt;
return {
downlink: downlink,
downlinkMax: downlinkMax,
effectiveType: effectiveType,
type: type,
rtt: rtt,
};
};
var useNetwork = function (initialState) {
if (initialState === void 0) { initialState = {}; }
var _a = useState(initialState), state = _a[0], setState = _a[1];
useEffect(function () {
var localState = state;
var localSetState = function (patch) {
localState = __assign(__assign({}, localState), patch);
setState(localState);
};
var connection = getConnection();
var onOnline = function () {
localSetState({
online: true,
since: new Date(),
});
};
var onOffline = function () {
localSetState({
online: false,
since: new Date(),
});
};
var onConnectionChange = function () {
localSetState(getConnectionState());
};
on(window, 'online', onOnline);
on(window, 'offline', onOffline);
if (connection) {
on(connection, 'change', onConnectionChange);
localSetState(__assign(__assign(__assign({}, state), { online: navigator.onLine, since: undefined }), getConnectionState()));
}
return function () {
off(window, 'online', onOnline);
off(window, 'offline', onOffline);
if (connection) {
off(connection, 'change', onConnectionChange);
}
};
}, []);
return state;
};
export default useNetwork;