diff --git a/browser/lib/confirmDeleteNote.js b/browser/lib/confirmDeleteNote.js new file mode 100644 index 00000000..80d1ffc7 --- /dev/null +++ b/browser/lib/confirmDeleteNote.js @@ -0,0 +1,23 @@ +import electron from 'electron' +import i18n from 'browser/lib/i18n' +const { remote } = electron +const { dialog } = remote + +export function confirmDeleteNote (confirmDeletion, permanent) { + if (confirmDeletion || permanent) { + const alertConfig = { + ype: 'warning', + message: i18n.__('Confirm note deletion'), + detail: i18n.__('This will permanently remove this note.'), + buttons: [i18n.__('Confirm'), i18n.__('Cancel')] + } + + const dialogButtonIndex = dialog.showMessageBox( + remote.getCurrentWindow(), alertConfig + ) + + return dialogButtonIndex === 0 + } + + return true +} diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index 6821bf2f..05883c0e 100755 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -28,6 +28,7 @@ import InfoPanelTrashed from './InfoPanelTrashed' import { formatDate } from 'browser/lib/date-formatter' import { getTodoPercentageOfCompleted } from 'browser/lib/getTodoStatus' import striptags from 'striptags' +import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' class MarkdownNoteDetail extends React.Component { constructor (props) { @@ -181,10 +182,10 @@ class MarkdownNoteDetail extends React.Component { handleTrashButtonClick (e) { const { note } = this.state const { isTrashed } = note - const { confirmDeletion } = this.props + const { confirmDeletion } = this.props.config.ui if (isTrashed) { - if (confirmDeletion(true)) { + if (confirmDeleteNote(confirmDeletion, true)) { const {note, dispatch} = this.props dataApi .deleteNote(note.storage, note.key) @@ -201,7 +202,7 @@ class MarkdownNoteDetail extends React.Component { .then(() => ee.emit('list:next')) } } else { - if (confirmDeletion()) { + if (confirmDeleteNote(confirmDeletion, false)) { note.isTrashed = true this.setState({ @@ -437,8 +438,7 @@ MarkdownNoteDetail.propTypes = { style: PropTypes.shape({ left: PropTypes.number }), - ignorePreviewPointerEvents: PropTypes.bool, - confirmDeletion: PropTypes.bool.isRequired + ignorePreviewPointerEvents: PropTypes.bool } export default CSSModules(MarkdownNoteDetail, styles) diff --git a/browser/main/Detail/SnippetNoteDetail.js b/browser/main/Detail/SnippetNoteDetail.js index 620de512..411027d5 100644 --- a/browser/main/Detail/SnippetNoteDetail.js +++ b/browser/main/Detail/SnippetNoteDetail.js @@ -27,6 +27,7 @@ import InfoPanel from './InfoPanel' import InfoPanelTrashed from './InfoPanelTrashed' import { formatDate } from 'browser/lib/date-formatter' import i18n from 'browser/lib/i18n' +import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' function pass (name) { switch (name) { @@ -197,10 +198,10 @@ class SnippetNoteDetail extends React.Component { handleTrashButtonClick (e) { const { note } = this.state const { isTrashed } = note - const { confirmDeletion } = this.props + const { confirmDeletion } = this.props.config.ui if (isTrashed) { - if (confirmDeletion(true)) { + if (confirmDeleteNote(confirmDeletion, true)) { const {note, dispatch} = this.props dataApi .deleteNote(note.storage, note.key) @@ -217,7 +218,7 @@ class SnippetNoteDetail extends React.Component { .then(() => ee.emit('list:next')) } } else { - if (confirmDeletion()) { + if (confirmDeleteNote(confirmDeletion, false)) { note.isTrashed = true this.setState({ @@ -883,8 +884,7 @@ SnippetNoteDetail.propTypes = { style: PropTypes.shape({ left: PropTypes.number }), - ignorePreviewPointerEvents: PropTypes.bool, - confirmDeletion: PropTypes.bool.isRequired + ignorePreviewPointerEvents: PropTypes.bool } export default CSSModules(SnippetNoteDetail, styles) diff --git a/browser/main/Detail/index.js b/browser/main/Detail/index.js index df38132c..7d2b4cba 100644 --- a/browser/main/Detail/index.js +++ b/browser/main/Detail/index.js @@ -33,26 +33,6 @@ class Detail extends React.Component { ee.off('detail:delete', this.deleteHandler) } - confirmDeletion (permanent) { - if (this.props.config.ui.confirmDeletion || permanent) { - const electron = require('electron') - const { remote } = electron - const { dialog } = remote - - const alertConfig = { - type: 'warning', - message: i18n.__('Confirm note deletion'), - detail: i18n.__('This will permanently remove this note.'), - buttons: [i18n.__('Confirm'), i18n.__('Cancel')] - } - - const dialogueButtonIndex = dialog.showMessageBox(remote.getCurrentWindow(), alertConfig) - return dialogueButtonIndex === 0 - } - - return true - } - render () { const { location, data, config } = this.props let note = null @@ -82,7 +62,6 @@ class Detail extends React.Component { this.confirmDeletion(permanent)} ref='root' {..._.pick(this.props, [ 'dispatch', @@ -99,7 +78,6 @@ class Detail extends React.Component { this.confirmDeletion(permanent)} ref='root' {..._.pick(this.props, [ 'dispatch', diff --git a/browser/main/NoteList/index.js b/browser/main/NoteList/index.js index cfb5491b..ae018c9e 100644 --- a/browser/main/NoteList/index.js +++ b/browser/main/NoteList/index.js @@ -18,6 +18,7 @@ import copy from 'copy-to-clipboard' import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig' import Markdown from '../../lib/markdown' import i18n from 'browser/lib/i18n' +import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' const { remote } = require('electron') const { Menu, MenuItem, dialog } = remote @@ -585,16 +586,11 @@ class NoteList extends React.Component { const notes = this.notes.map((note) => Object.assign({}, note)) const selectedNotes = findNotesByKeys(notes, selectedNoteKeys) const firstNote = selectedNotes[0] + const { confirmDeletion } = this.props.config.ui if (firstNote.isTrashed) { - const noteExp = selectedNotes.length > 1 ? 'notes' : 'note' - const dialogueButtonIndex = dialog.showMessageBox(remote.getCurrentWindow(), { - type: 'warning', - message: i18n.__('Confirm note deletion'), - detail: `This will permanently remove ${selectedNotes.length} ${noteExp}.`, - buttons: [i18n.__('Confirm'), i18n.__('Cancel')] - }) - if (dialogueButtonIndex === 1) return + if (!confirmDeleteNote(confirmDeletion, true)) return + Promise.all( selectedNotes.map((note) => { return dataApi @@ -615,6 +611,8 @@ class NoteList extends React.Component { }) console.log('Notes were all deleted') } else { + if (!confirmDeleteNote(confirmDeletion, false)) return + Promise.all( selectedNotes.map((note) => { note.isTrashed = true