Skip to content

Commit

Permalink
Show confirmation dialog on leaving WebUI while composing (mastodon#5616
Browse files Browse the repository at this point in the history
)

* Show confirmation dialog on leaving WebUI while composing

Currently, Back button and Back hotkey can cause leaving from WebUI, as well as browser's back button. Users may hit those buttons accidentally, and their composing text will be lost.

So this prevents it by showing confirmation dialog from `onbeforeunload` event.

* Fix message and comments
  • Loading branch information
unarist authored and cobodo committed Dec 6, 2017
1 parent 9ba0171 commit fe815f2
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions app/javascript/mastodon/features/ui/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,19 @@ import {
} from './util/async-components';
import { HotKeys } from 'react-hotkeys';
import { me } from '../../initial_state';
import { defineMessages, injectIntl } from 'react-intl';

// Dummy import, to make sure that <Status /> ends up in the application bundle.
// Without this it ends up in ~8 very commonly used bundles.
import '../../components/status';

const messages = defineMessages({
beforeUnload: { id: 'ui.beforeunload', defaultMessage: 'Your draft will be lost if you leave Mastodon.' },
});

const mapStateToProps = state => ({
isComposing: state.getIn(['compose', 'is_composing']),
hasComposingText: state.getIn(['compose', 'text']) !== '',
});

const keyMap = {
Expand Down Expand Up @@ -75,6 +81,7 @@ const keyMap = {
};

@connect(mapStateToProps)
@injectIntl
@withRouter
export default class UI extends React.Component {

Expand All @@ -86,14 +93,27 @@ export default class UI extends React.Component {
dispatch: PropTypes.func.isRequired,
children: PropTypes.node,
isComposing: PropTypes.bool,
hasComposingText: PropTypes.bool,
location: PropTypes.object,
intl: PropTypes.object.isRequired,
};

state = {
width: window.innerWidth,
draggingOver: false,
};

handleBeforeUnload = (e) => {
const { intl, isComposing, hasComposingText } = this.props;

if (isComposing && hasComposingText) {
// Setting returnValue to any string causes confirmation dialog.
// Many browsers no longer display this text to users,
// but we set user-friendly message for other browsers, e.g. Edge.
e.returnValue = intl.formatMessage(messages.beforeUnload);
}
}

handleResize = debounce(() => {
// The cached heights are no longer accurate, invalidate
this.props.dispatch(clearHeight());
Expand Down Expand Up @@ -168,6 +188,7 @@ export default class UI extends React.Component {
}

componentWillMount () {
window.addEventListener('beforeunload', this.handleBeforeUnload, false);
window.addEventListener('resize', this.handleResize, { passive: true });
document.addEventListener('dragenter', this.handleDragEnter, false);
document.addEventListener('dragover', this.handleDragOver, false);
Expand Down Expand Up @@ -209,6 +230,7 @@ export default class UI extends React.Component {
}

componentWillUnmount () {
window.removeEventListener('beforeunload', this.handleBeforeUnload);
window.removeEventListener('resize', this.handleResize);
document.removeEventListener('dragenter', this.handleDragEnter);
document.removeEventListener('dragover', this.handleDragOver);
Expand Down

0 comments on commit fe815f2

Please sign in to comment.