UNPKG

@wener/console

Version:
104 lines (103 loc) 4.11 kB
function _array_like_to_array(arr, len) { if (len == null || len > arr.length) len = arr.length; for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i]; return arr2; } function _array_without_holes(arr) { if (Array.isArray(arr)) return _array_like_to_array(arr); } function _iterable_to_array(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _non_iterable_spread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _to_consumable_array(arr) { return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread(); } function _unsupported_iterable_to_array(o, minLen) { if (!o) return; if (typeof o === "string") return _array_like_to_array(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen); } /** * `useBlocker` and `usePrompt` is no longer part of react-router for the routers other than `DataRouter`. * * The previous workaround (<v6.4) was to use `block` function in `UNSAFE_NavigationContext` which is now removed. * * We're using a workaround from the gist https://gist.github.com/MarksCode/64e438c82b0b2a1161e01c88ca0d0355 with some modifications * Thanks to @MarksCode(https://github.com/MarksCode) for the workaround. */ import { useCallback, useContext, useEffect } from 'react'; import { UNSAFE_NavigationContext as NavigationContext } from 'react-router'; function useConfirmExit(confirmExit) { var when = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true; var navigator = useContext(NavigationContext).navigator; useEffect(function() { if (!when) { return; } var go = navigator.go; var push = navigator.push; navigator.push = function() { for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ args[_key] = arguments[_key]; } var result = confirmExit(); if (result !== false) { push.apply(void 0, _to_consumable_array(args)); } }; navigator.go = function() { for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ args[_key] = arguments[_key]; } var result = confirmExit(); if (result !== false) { go.apply(void 0, _to_consumable_array(args)); } }; return function() { navigator.push = push; navigator.go = go; }; }, [ navigator, confirmExit, when ]); } export function usePrompt(message) { var when = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true, onConfirm = arguments.length > 2 ? arguments[2] : void 0, legacy = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false; var warnWhenListener = useCallback(function(e) { e.preventDefault(); e.returnValue = message; return e.returnValue; }, [ message ]); useEffect(function() { if (when && !legacy) { window.addEventListener('beforeunload', warnWhenListener); } return function() { window.removeEventListener('beforeunload', warnWhenListener); }; }, [ warnWhenListener, when, legacy ]); var confirmExit = useCallback(function() { var confirm = window.confirm(message); if (confirm && onConfirm) { onConfirm(); } return confirm; }, [ message ]); useConfirmExit(confirmExit, when); }