@blocknote/core
Version:
A "Notion-style" block-based extensible text editor built on top of Prosemirror and Tiptap.
63 lines (54 loc) • 1.9 kB
text/typescript
import { splitBlockCommand } from "../../api/blockManipulation/commands/splitBlock/splitBlock.js";
import { updateBlockCommand } from "../../api/blockManipulation/commands/updateBlock/updateBlock.js";
import { getBlockInfoFromTransaction } from "../../api/getBlockInfoFromPos.js";
import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
export const handleEnter = (editor: BlockNoteEditor<any, any, any>) => {
const { blockInfo, selectionEmpty } = editor.transact((tr) => {
return {
blockInfo: getBlockInfoFromTransaction(tr),
selectionEmpty: tr.selection.anchor === tr.selection.head,
};
});
if (!blockInfo.isBlockContainer) {
return false;
}
const { bnBlock: blockContainer, blockContent } = blockInfo;
if (
!(
blockContent.node.type.name === "bulletListItem" ||
blockContent.node.type.name === "numberedListItem" ||
blockContent.node.type.name === "checkListItem"
) ||
!selectionEmpty
) {
return false;
}
return editor._tiptapEditor.commands.first(({ state, chain, commands }) => [
() =>
// Changes list item block to a paragraph block if the content is empty.
commands.command(() => {
if (blockContent.node.childCount === 0) {
return commands.command(
updateBlockCommand(blockContainer.beforePos, {
type: "paragraph",
props: {},
}),
);
}
return false;
}),
() =>
// Splits the current block, moving content inside that's after the cursor
// to a new block of the same type below.
commands.command(() => {
if (blockContent.node.childCount > 0) {
chain()
.deleteSelection()
.command(splitBlockCommand(state.selection.from, true))
.run();
return true;
}
return false;
}),
]);
};