UNPKG

meetup-web-mocks

Version:
78 lines (57 loc) 2.49 kB
'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant); var _DOMUtils = require('./DOMUtils'); var _ExecutionEnvironment = require('./ExecutionEnvironment'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var startListener = function startListener(getPromptMessage) { var handleBeforeUnload = function handleBeforeUnload(event) { var message = getPromptMessage(); if (typeof message === 'string') { (event || window.event).returnValue = message; return message; } return undefined; }; (0, _DOMUtils.addEventListener)(window, 'beforeunload', handleBeforeUnload); return function () { return (0, _DOMUtils.removeEventListener)(window, 'beforeunload', handleBeforeUnload); }; }; /** * Returns a new createHistory function that can be used to create * history objects that know how to use the beforeunload event in web * browsers to cancel navigation. */ var useBeforeUnload = function useBeforeUnload(createHistory) { !_ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? (0, _invariant2.default)(false, 'useBeforeUnload only works in DOM environments') : (0, _invariant2.default)(false) : void 0; return function (options) { var history = createHistory(options); var listeners = []; var stopListener = void 0; var getPromptMessage = function getPromptMessage() { var message = void 0; for (var i = 0, len = listeners.length; message == null && i < len; ++i) { message = listeners[i].call(); }return message; }; var listenBeforeUnload = function listenBeforeUnload(listener) { if (listeners.push(listener) === 1) stopListener = startListener(getPromptMessage); return function () { listeners = listeners.filter(function (item) { return item !== listener; }); if (listeners.length === 0 && stopListener) { stopListener(); stopListener = null; } }; }; return _extends({}, history, { listenBeforeUnload: listenBeforeUnload }); }; }; exports.default = useBeforeUnload;