electron-react-boilerplate
Version:
Electron application boilerplate based on React, React Router, Webpack, React Hot Loader for rapid application development
111 lines (83 loc) • 3.67 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; };
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _warning = require('warning');
var _warning2 = _interopRequireDefault(_warning);
var _ExecutionEnvironment = require('./ExecutionEnvironment');
var _DOMUtils = require('./DOMUtils');
var _deprecate = require('./deprecate');
var _deprecate2 = _interopRequireDefault(_deprecate);
function startBeforeUnloadListener(getBeforeUnloadPromptMessage) {
function listener(event) {
var message = getBeforeUnloadPromptMessage();
if (typeof message === 'string') {
(event || window.event).returnValue = message;
return message;
}
}
_DOMUtils.addEventListener(window, 'beforeunload', listener);
return function () {
_DOMUtils.removeEventListener(window, 'beforeunload', listener);
};
}
/**
* 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.
*/
function useBeforeUnload(createHistory) {
return function (options) {
var history = createHistory(options);
var stopBeforeUnloadListener = undefined;
var beforeUnloadHooks = [];
function getBeforeUnloadPromptMessage() {
var message = undefined;
for (var i = 0, len = beforeUnloadHooks.length; message == null && i < len; ++i) {
message = beforeUnloadHooks[i].call();
}return message;
}
function listenBeforeUnload(hook) {
beforeUnloadHooks.push(hook);
if (beforeUnloadHooks.length === 1) {
if (_ExecutionEnvironment.canUseDOM) {
stopBeforeUnloadListener = startBeforeUnloadListener(getBeforeUnloadPromptMessage);
} else {
process.env.NODE_ENV !== 'production' ? _warning2['default'](false, 'listenBeforeUnload only works in DOM environments') : undefined;
}
}
return function () {
beforeUnloadHooks = beforeUnloadHooks.filter(function (item) {
return item !== hook;
});
if (beforeUnloadHooks.length === 0 && stopBeforeUnloadListener) {
stopBeforeUnloadListener();
stopBeforeUnloadListener = null;
}
};
}
// deprecated
function registerBeforeUnloadHook(hook) {
if (_ExecutionEnvironment.canUseDOM && beforeUnloadHooks.indexOf(hook) === -1) {
beforeUnloadHooks.push(hook);
if (beforeUnloadHooks.length === 1) stopBeforeUnloadListener = startBeforeUnloadListener(getBeforeUnloadPromptMessage);
}
}
// deprecated
function unregisterBeforeUnloadHook(hook) {
if (beforeUnloadHooks.length > 0) {
beforeUnloadHooks = beforeUnloadHooks.filter(function (item) {
return item !== hook;
});
if (beforeUnloadHooks.length === 0) stopBeforeUnloadListener();
}
}
return _extends({}, history, {
listenBeforeUnload: listenBeforeUnload,
registerBeforeUnloadHook: _deprecate2['default'](registerBeforeUnloadHook, 'registerBeforeUnloadHook is deprecated; use listenBeforeUnload instead'),
unregisterBeforeUnloadHook: _deprecate2['default'](unregisterBeforeUnloadHook, 'unregisterBeforeUnloadHook is deprecated; use the callback returned from listenBeforeUnload instead')
});
};
}
exports['default'] = useBeforeUnload;
module.exports = exports['default'];
;