From 8f4abb720ae38d91fb31a8b7b936eac8faa76d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Mon, 2 Nov 2020 14:29:58 +0100 Subject: [PATCH] add can method --- packages/core/src/CommandManager.ts | 25 +++++++++++++++++----- packages/core/src/Editor.ts | 1 + packages/core/src/extensions/toggleList.ts | 7 +++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/core/src/CommandManager.ts b/packages/core/src/CommandManager.ts index c9352af2..7d5fb89f 100644 --- a/packages/core/src/CommandManager.ts +++ b/packages/core/src/CommandManager.ts @@ -57,7 +57,7 @@ export default class CommandManager { } } - public createChain(startTr?: Transaction) { + public createChain(startTr?: Transaction, shouldDispatch = true) { const { commands, editor } = this const { state, view } = editor const callbacks: boolean[] = [] @@ -71,7 +71,7 @@ export default class CommandManager { return new Proxy({}, { get: (_, name: string, proxy) => { if (name === 'run') { - if (!hasStartTransaction) { + if (!hasStartTransaction && shouldDispatch) { view.dispatch(tr) } @@ -85,7 +85,7 @@ export default class CommandManager { } return (...args: any) => { - const props = this.buildProps(tr) + const props = this.buildProps(tr, shouldDispatch) const callback = command(...args)(props) callbacks.push(callback) @@ -95,7 +95,7 @@ export default class CommandManager { }) as ChainedCommands } - public buildProps(tr: Transaction) { + public buildProps(tr: Transaction, shouldDispatch = true) { const { editor, commands } = this const { state, view } = editor @@ -104,8 +104,23 @@ export default class CommandManager { editor, view, state: this.chainableState(tr, state), - dispatch: () => false, + dispatch: shouldDispatch + ? () => true + : undefined, chain: () => this.createChain(tr), + can: () => { + const dispatch = false + const formattedCommands = Object.fromEntries(Object + .entries(commands) + .map(([name, command]) => { + return [name, (...args: any[]) => command(...args)({ ...props, dispatch })] + })) + + return { + ...formattedCommands, + chain: () => this.createChain(tr, dispatch), + } + }, get commands() { return Object.fromEntries(Object .entries(commands) diff --git a/packages/core/src/Editor.ts b/packages/core/src/Editor.ts index 238140df..91fa36e9 100644 --- a/packages/core/src/Editor.ts +++ b/packages/core/src/Editor.ts @@ -23,6 +23,7 @@ export type Command = (props: { editor: Editor, tr: Transaction, commands: SingleCommands, + can: () => SingleCommands & { chain: () => ChainedCommands }, chain: () => ChainedCommands, state: EditorState, view: EditorView, diff --git a/packages/core/src/extensions/toggleList.ts b/packages/core/src/extensions/toggleList.ts index ccf302ce..64d3167e 100644 --- a/packages/core/src/extensions/toggleList.ts +++ b/packages/core/src/extensions/toggleList.ts @@ -10,7 +10,7 @@ export const ToggleList = createExtension({ addCommands() { return { toggleList: (listTypeOrName: string | NodeType, itemTypeOrName: string | NodeType): Command => ({ - tr, state, dispatch, chain, + tr, state, dispatch, chain, commands, can, }) => { const { extensions } = this.editor.options const listType = getNodeType(listTypeOrName, state.schema) @@ -39,18 +39,17 @@ export const ToggleList = createExtension({ } } - const canWrapInList = wrapInList(listType)(state) + const canWrapInList = can().wrapInList(listType) // try to convert node to paragraph if needed if (!canWrapInList) { return chain() - // .setBlockType('paragraph') .clearNodes() .wrapInList(listType) .run() } - return wrapInList(listType)(state, dispatch) + return commands.wrapInList(listType) }, } },