import React, {
createContext,
forwardRef,
useContext,
useEffect,
useState,
} from 'react';
export const ONLINE_STATUS = {
ONLINE: Symbol('ONLINE'),
OFFLINE: Symbol('OFFLINE'),
UNKNOWN: Symbol('UNKNOWN'),
};
const getNetworkState = () => {
if ('onLine' in navigator) {
return navigator.onLine ? ONLINE_STATUS.ONLINE : ONLINE_STATUS.OFFLINE;
}
return ONLINE_STATUS.UNKNOWN;
};
function _useOnline() {
const [online, setOnline] = useState(getNetworkState());
useEffect(() => {
function handleOnlineStatus(event) {
setOnline(getNetworkState());
}
window.addEventListener('online', handleOnlineStatus);
window.addEventListener('offline', handleOnlineStatus);
return () => {
window.removeEventListener('online', handleOnlineStatus);
window.removeEventListener('offline', handleOnlineStatus);
};
}, []);
return online;
}
const OnlineContext = createContext(null);
// provider
export function OnlineProvider({ children }) {
const online = _useOnline();
return (
{children}
);
}
// hook consumer
export function useOnline() {
return useContext(OnlineContext);
}
// hoc consumer
export const withOnline = Component =>
forwardRef((props, ref) => {
return (
{online => }
);
});