react-concurrent-router
Version:
Performant routing embracing React concurrent UI patterns
40 lines (37 loc) • 948 B
JavaScript
import { useContext, useCallback, useEffect } from 'react';
import { R as RouterContext } from './RouterContext-Bf2jDrm9.js';
const useBeforeRouteLeave = ({
toggle = true,
unload = true,
message = ''
}) => {
const {
history: {
block
}
} = useContext(RouterContext);
let unblock;
const handleBeforeunload = useCallback(event => {
event.preventDefault();
event.returnValue = '';
}, []);
const register = useCallback(() => {
unblock = block(message);
if (unload) {
window.addEventListener('beforeunload', handleBeforeunload);
}
}, [block]);
const cleanup = useCallback(() => {
unblock();
if (unload) {
window.removeEventListener('beforeunload', handleBeforeunload);
}
}, [unblock]);
useEffect(() => {
if (toggle) register();
return () => {
if (toggle) cleanup();
};
}, [toggle, register, cleanup]);
};
export { useBeforeRouteLeave as default };