UNPKG

@wordpress/block-library

Version:
78 lines (77 loc) 2.44 kB
// packages/block-library/src/list-item/hooks/use-enter.js import { createBlock, getDefaultBlockName, cloneBlock } from "@wordpress/blocks"; import { useRefEffect } from "@wordpress/compose"; import { privateApis as richTextPrivateApis } from "@wordpress/rich-text"; import { ENTER } from "@wordpress/keycodes"; import { useSelect, useDispatch } from "@wordpress/data"; import { store as blockEditorStore } from "@wordpress/block-editor"; import useOutdentListItem from "./use-outdent-list-item.mjs"; import { unlock } from "../../lock-unlock.mjs"; var { subscribeOwnedListener } = unlock(richTextPrivateApis); function useEnter(clientId) { const { replaceBlocks, selectionChange } = useDispatch(blockEditorStore); const { getBlock, getBlockAttributes, getBlockRootClientId, getBlockIndex, getBlockName } = useSelect(blockEditorStore); const outdentListItem = useOutdentListItem(); return useRefEffect((element) => { function onKeyDown(event) { if (event.defaultPrevented || event.keyCode !== ENTER) { return; } const { content } = getBlockAttributes(clientId) ?? {}; if (content?.length) { return; } event.preventDefault(); const canOutdent = getBlockName( getBlockRootClientId(getBlockRootClientId(clientId)) ) === "core/list-item"; if (canOutdent) { outdentListItem(); return; } const topParentListBlock = getBlock( getBlockRootClientId(clientId) ); const blockIndex = getBlockIndex(clientId); const head = cloneBlock({ ...topParentListBlock, innerBlocks: topParentListBlock.innerBlocks.slice( 0, blockIndex ) }); const middle = createBlock(getDefaultBlockName()); const after = [ ...topParentListBlock.innerBlocks[blockIndex].innerBlocks[0]?.innerBlocks || [], ...topParentListBlock.innerBlocks.slice(blockIndex + 1) ]; const tail = after.length ? [ cloneBlock({ ...topParentListBlock, innerBlocks: after }) ] : []; replaceBlocks( topParentListBlock.clientId, [head, middle, ...tail], 1 ); selectionChange(middle.clientId); } return subscribeOwnedListener(element, "keydown", onKeyDown, true); }, []); } export { useEnter as default }; //# sourceMappingURL=use-enter.mjs.map