From 7a16546d6f755aea9bf41bbab3230b4a02f0dcd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Wed, 4 Nov 2020 15:31:42 +0100 Subject: [PATCH] add try command --- packages/core/src/Editor.ts | 11 ++++-- packages/core/src/extensions/baseKeymap.ts | 45 ++++++++++------------ packages/core/src/extensions/index.ts | 3 +- packages/core/src/extensions/try.ts | 26 +++++++++++++ 4 files changed, 57 insertions(+), 28 deletions(-) create mode 100644 packages/core/src/extensions/try.ts diff --git a/packages/core/src/Editor.ts b/packages/core/src/Editor.ts index 062418e2..aebc7d97 100644 --- a/packages/core/src/Editor.ts +++ b/packages/core/src/Editor.ts @@ -261,15 +261,20 @@ export class Editor extends EventEmitter { */ private createView() { this.view = new EditorView(this.options.element, { + dispatchTransaction: this.dispatchTransaction.bind(this), state: EditorState.create({ doc: this.createDocument(this.options.content), - plugins: this.extensionManager.plugins, }), - dispatchTransaction: this.dispatchTransaction.bind(this), }) // `editor.view` is not yet available at this time. - // Therefore we will add all node views directly afterwards. + // Therefore we will add all plugins and node views directly afterwards. + const newState = this.state.reconfigure({ + plugins: this.extensionManager.plugins, + }) + + this.view.updateState(newState) + this.view.setProps({ nodeViews: this.extensionManager.nodeViews, }) diff --git a/packages/core/src/extensions/baseKeymap.ts b/packages/core/src/extensions/baseKeymap.ts index 5411d87c..77f121c1 100644 --- a/packages/core/src/extensions/baseKeymap.ts +++ b/packages/core/src/extensions/baseKeymap.ts @@ -1,5 +1,4 @@ import { - chainCommands, newlineInCode, createParagraphNear, liftEmptyBlock, @@ -16,33 +15,31 @@ import { createExtension } from '../Extension' export const BaseKeymap = createExtension({ addKeyboardShortcuts() { - const enter = chainCommands( - newlineInCode, - createParagraphNear, - liftEmptyBlock, - splitBlockKeepMarks, - ) + const handleBackspace = () => this.editor.try(({ state, dispatch }) => [ + () => undoInputRule(state, dispatch), + () => deleteSelection(state, dispatch), + () => joinBackward(state, dispatch), + () => selectNodeBackward(state, dispatch), + ]) - const backspace = chainCommands( - undoInputRule, - deleteSelection, - joinBackward, - selectNodeBackward, - ) - - const del = chainCommands( - deleteSelection, - joinForward, - selectNodeForward, - ) + const handleDelete = () => this.editor.try(({ state, dispatch }) => [ + () => deleteSelection(state, dispatch), + () => joinForward(state, dispatch), + () => selectNodeForward(state, dispatch), + ]) return { - Enter: enter, + Enter: () => this.editor.try(({ state, dispatch }) => [ + () => newlineInCode(state, dispatch), + () => createParagraphNear(state, dispatch), + () => liftEmptyBlock(state, dispatch), + () => splitBlockKeepMarks(state, dispatch), + ]), 'Mod-Enter': exitCode, - Backspace: backspace, - 'Mod-Backspace': backspace, - Delete: del, - 'Mod-Delete': del, + Backspace: () => handleBackspace(), + 'Mod-Backspace': () => handleBackspace(), + Delete: () => handleDelete(), + 'Mod-Delete': () => handleDelete(), // we don’t need a custom `selectAll` for now // 'Mod-a': () => this.editor.selectAll(), } diff --git a/packages/core/src/extensions/index.ts b/packages/core/src/extensions/index.ts index 3670658d..5dfad4d3 100644 --- a/packages/core/src/extensions/index.ts +++ b/packages/core/src/extensions/index.ts @@ -24,6 +24,7 @@ export { SplitListItem } from './splitListItem' export { ToggleBlockType } from './toggleBlockType' export { ToggleList } from './toggleList' export { ToggleMark } from './toggleMark' -export { UpdateMark } from './updateMark' export { ToggleWrap } from './toggleWrap' +export { Try } from './try' +export { UpdateMark } from './updateMark' export { WrapInList } from './wrapInList' diff --git a/packages/core/src/extensions/try.ts b/packages/core/src/extensions/try.ts new file mode 100644 index 00000000..c7fa428b --- /dev/null +++ b/packages/core/src/extensions/try.ts @@ -0,0 +1,26 @@ +import { Command } from '../Editor' +import { createExtension } from '../Extension' + +export const Try = createExtension({ + addCommands() { + return { + try: (fn: (props: Parameters[0]) => Command[]): Command => props => { + const commands = fn(props) + + for (let i = 0; i < commands.length; i += 1) { + if (commands[i](props)) { + return true + } + } + + return false + }, + } + }, +}) + +declare module '../Editor' { + interface AllExtensions { + Try: typeof Try, + } +}