From f2ced6971d60c555ce1e6bc7116fe0168f018bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20K=C3=BChn?= Date: Mon, 13 Dec 2021 13:40:33 +0100 Subject: [PATCH] fix: improve `setNode` behavior for list items, fix #2261 --- packages/core/src/commands/setNode.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/core/src/commands/setNode.ts b/packages/core/src/commands/setNode.ts index 587a098cc..faa569a5a 100644 --- a/packages/core/src/commands/setNode.ts +++ b/packages/core/src/commands/setNode.ts @@ -14,8 +14,26 @@ declare module '@tiptap/core' { } } -export const setNode: RawCommands['setNode'] = (typeOrName, attributes = {}) => ({ state, dispatch }) => { +export const setNode: RawCommands['setNode'] = (typeOrName, attributes = {}) => ({ state, dispatch, chain }) => { const type = getNodeType(typeOrName, state.schema) - return setBlockType(type, attributes)(state, dispatch) + // TODO: use a fallback like insertContent? + if (!type.isTextblock) { + console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.') + + return false + } + + const canSetBlock = setBlockType(type, attributes)(state) + + if (canSetBlock) { + return setBlockType(type, attributes)(state, dispatch) + } + + return chain() + .clearNodes() + .command(({ state: updatedState }) => { + return setBlockType(type, attributes)(updatedState, dispatch) + }) + .run() }