electron-react-boilerplate
Version:
Electron application boilerplate based on React, React Router, Webpack, React Hot Loader for rapid application development
105 lines (84 loc) • 2.92 kB
JavaScript
import warning from 'warning'
import { canUseDOM } from './ExecutionEnvironment'
import { addEventListener, removeEventListener } from './DOMUtils'
import deprecate from './deprecate'
function startBeforeUnloadListener(getBeforeUnloadPromptMessage) {
function listener(event) {
const message = getBeforeUnloadPromptMessage()
if (typeof message === 'string') {
(event || window.event).returnValue = message
return message
}
}
addEventListener(window, 'beforeunload', listener)
return function () {
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) {
const history = createHistory(options)
let stopBeforeUnloadListener
let beforeUnloadHooks = []
function getBeforeUnloadPromptMessage() {
let message
for (let 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 (canUseDOM) {
stopBeforeUnloadListener = startBeforeUnloadListener(getBeforeUnloadPromptMessage)
} else {
warning(
false,
'listenBeforeUnload only works in DOM environments'
)
}
}
return function () {
beforeUnloadHooks = beforeUnloadHooks.filter(item => item !== hook)
if (beforeUnloadHooks.length === 0 && stopBeforeUnloadListener) {
stopBeforeUnloadListener()
stopBeforeUnloadListener = null
}
}
}
// deprecated
function registerBeforeUnloadHook(hook) {
if (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(item => item !== hook)
if (beforeUnloadHooks.length === 0)
stopBeforeUnloadListener()
}
}
return {
...history,
listenBeforeUnload,
registerBeforeUnloadHook: deprecate(
registerBeforeUnloadHook,
'registerBeforeUnloadHook is deprecated; use listenBeforeUnload instead'
),
unregisterBeforeUnloadHook: deprecate(
unregisterBeforeUnloadHook,
'unregisterBeforeUnloadHook is deprecated; use the callback returned from listenBeforeUnload instead'
)
}
}
}
export default useBeforeUnload