Skip to content

Commit a48d515

Browse files
committed
Add browser window beforeunload alert support
1 parent fd4208f commit a48d515

File tree

3 files changed

+61
-15
lines changed

3 files changed

+61
-15
lines changed

package.json

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
"deploy": "gh-pages -d example/build"
2727
},
2828
"dependencies": {
29-
"invariant": "^2.2.4"
29+
"invariant": "^2.2.4",
30+
"prop-types": "^15.6.1"
3031
},
3132
"peerDependencies": {
3233
"react": ">=16.3.0",
@@ -62,12 +63,21 @@
6263
"rollup-plugin-postcss": "^1.1.0",
6364
"rollup-plugin-url": "^1.3.0"
6465
},
65-
"files": ["dist"],
66+
"files": [
67+
"dist"
68+
],
6669
"jest": {
6770
"setupTestFrameworkScriptFile": "<rootDir>/scripts/jest.setup.js",
68-
"testMatch": ["<rootDir>/__tests__/*.spec.js"],
69-
"collectCoverageFrom": ["src/**/*.{js,jsx}"],
71+
"testMatch": [
72+
"<rootDir>/__tests__/*.spec.js"
73+
],
74+
"collectCoverageFrom": [
75+
"src/**/*.{js,jsx}"
76+
],
7077
"coverageDirectory": "coverage",
71-
"coverageReporters": ["html", "lcov"]
78+
"coverageReporters": [
79+
"html",
80+
"lcov"
81+
]
7282
}
7383
}

src/index.js

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { Fragment, createFactory } from 'react';
2+
import PropTypes from 'prop-types';
23
import { Prompt as ReactRouterPrompt } from 'react-router';
34
import invariant from 'invariant';
45

@@ -76,13 +77,48 @@ export const withGoodBye = BaseRouterComponent => {
7677
return WithGoodBye;
7778
};
7879

79-
export default ({ when = false, children }) => {
80-
return (
81-
<Fragment>
82-
<ReactRouterPrompt when={when} message="" />
83-
<GoodByeContext.Consumer>
84-
{renderProps => children({ ...renderProps })}
85-
</GoodByeContext.Consumer>
86-
</Fragment>
87-
);
80+
class GoodBye extends React.Component {
81+
handleBeforeUnload = evt => {
82+
const { alertMessage } = this.props;
83+
evt.returnValue = alertMessage;
84+
return alertMessage;
85+
};
86+
87+
componentDidUpdate() {
88+
const { when, alertBeforeUnload } = this.props;
89+
window.onbeforeunload = when && alertBeforeUnload
90+
? this.handleBeforeUnload
91+
: null;
92+
}
93+
94+
componentWillUnmount() {
95+
window.onbeforeunload = null;
96+
}
97+
98+
render() {
99+
const { when, children } = this.props;
100+
return (
101+
<Fragment>
102+
<ReactRouterPrompt when={when} message="" />
103+
<GoodByeContext.Consumer>
104+
{renderProps => children({ ...renderProps })}
105+
</GoodByeContext.Consumer>
106+
</Fragment>
107+
);
108+
}
109+
}
110+
111+
GoodBye.propTypes = {
112+
when: PropTypes.bool,
113+
alertBeforeUnload: PropTypes.bool,
114+
alertMessage: PropTypes.string,
115+
children: PropTypes.func.isRequired,
116+
};
117+
118+
GoodBye.defaultProps = {
119+
when: false,
120+
alertBeforeUnload: false,
121+
alertMessage: '' // only work for IE
88122
};
123+
124+
export default GoodBye;

yarn.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4204,7 +4204,7 @@ promise@^7.1.1:
42044204
dependencies:
42054205
asap "~2.0.3"
42064206

4207-
prop-types@^15.5.4, prop-types@^15.6.0:
4207+
prop-types@^15.5.4, prop-types@^15.6.0, prop-types@^15.6.1:
42084208
version "15.6.1"
42094209
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
42104210
dependencies:

0 commit comments

Comments
 (0)