I'm trying to achieve the following with Gatsby
- The user is on a form page, if they hit the browser back button, a pop up would appear, asking if they want to leave.
- If the user selects
ok
, then it would go back. - If the user selects
cancel
, then it would stay on this page
I was able to "almost" make it happen by doing the following
useEffect(() => {
const confirmExit = e => {
const leaveThisPage = window.confirm("Would you like to leave this page?")
if (!leaveThisPage) {
window.history.forward()
}
}
window.addEventListener("popstate", confirmExit)
return () => {
window.removeEventListener("popstate", confirmExit)
}
}, [])
There is one issue, if the user selects cancel
, then the browser would go to the previous page. Then window.history.forward()
would fire and sends them back.
I noticed that popstate
event cannot be cancelled, so e.preventDefault()
won't work.
Note: I also tried to test with window.onbeforeunload
, but it only triggers if I close to window, or if my previous is from outside my app. Is there a work around for my issue?