meetup-web-mocks
Version:
Meetup Web Mocks
78 lines (57 loc) • 2.49 kB
JavaScript
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;
;