react-leave-page-confirm
v0.0.6
Published
Render modal window to confirm page leave
Downloads
41
Maintainers
Readme
react-leave-page-confirm
The package was written to cover the case when a user try to leave page with changes
that may be lost (e.g forms). It is based on awesome libs React
and Material-UI
The package prevents browser history changes as well as page reload
Unfortunately modal window can be customized only for browser history changes due to some limitations: custom message deprecation
Installation
# with npm
npm install react-leave-page-confirm
# with yarn
yarn add react-leave-page-confirm
Usage
There are two possible options how the package can be used:
ConfirmPageLeave
componentusePageLeaveBlocker
hook
ConfirmPageLeave
is the simplest way to consume package, it contains all necessary UI parts to render modal dialog window. Under the hood it uses usePageLeaveBlocker
hook
Props | Prop | Type | Required | Description | | ----------- | ----------- | ----------- | ----------- | | isActive | boolean | true | active logic to prevent page leave and display confirm modals on history change / page reload | | history | HashHistory | BrowserHistory | MemoryHistory | true | history object created by history package | | title | string | false | optional title for modal dialog (history change only) | | message | string | false | optional message in modal dialog (history change only) |
usePageLeaveBlocker
requires that modal dialog for history change case together with logic to open/close it was written by consumer
Argument (object) | Field | Type | Required | Description | | ----------- | ----------- | ----------- | ----------- | | isActive | boolean | true | active logic to prevent page leave and display confirm modals on history change / page reload | | history | HashHistory | BrowserHistory | MemoryHistory | true | history object created by history package | | onHistoryChange | (event: Transition, isBlocked: boolean) => void | true | callback that fires whenever history change event happened, second argument describes if this change is blocked (useful to trigger logic to open/close modal) |
Examples
import React, { ChangeEvent, } from 'react';
import { createBrowserHistory} from 'history'
import { ConfirmPageLeave } from 'react-leave-page-confirm'
const history = createBrowserHistory();
const initialValues = {
userName: '',
}
export const App = () => {
const [isDataChanged, setIsDataChanged] = React.useState(false);
const [userName, setUserName ] = React.useState('')
const handleUserNameChange = (e: ChangeEvent<HTMLInputElement>) => {
const { value } = e.target
setUserName(value)
if (value !== initialValues.userName) {
setIsDataChanged(true)
} else {
setIsDataChanged(false)
}
}
return (
<div className="App">
<form>
<input value={userName} onChange={handleUserNameChange} />
<button type="submit">submit</button>
</form>
<a href="/test" onClick={(e: React.MouseEvent) => {
e.preventDefault();
history.push(`/test`)}}
>
link to test page
</a>
<ConfirmPageLeave isActive={isDataChanged} history={history} />
</div>
);
}
in the example above neither page refresh nor link won't work without confirmation modal dialog in case value in "input" HTML element is changed (isDataChanged === true
)