@wordpress/block-library
Version:
Block library for the WordPress editor.
8 lines (7 loc) • 8.65 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/list-item/hooks/use-merge.js"],
"sourcesContent": ["import { useRegistry } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { isUnmodifiedBlock, switchToBlockType } from '@wordpress/blocks';\nimport { outdentListItems, getOutdentTarget } from '../utils';\n\nexport default function useMerge( clientId, onMerge ) {\n\tconst registry = useRegistry();\n\n\treturn ( forward ) => {\n\t\tconst select = registry.select( blockEditorStore );\n\t\tconst {\n\t\t\tgetPreviousBlockClientId,\n\t\t\tgetNextBlockClientId,\n\t\t\tgetBlockOrder,\n\t\t\tgetBlockIndex,\n\t\t\tgetBlockRootClientId,\n\t\t\tgetBlockName,\n\t\t\tgetBlock,\n\t\t} = select;\n\t\tconst { mergeBlocks, moveBlocksToPosition, removeBlock, insertBlocks } =\n\t\t\tregistry.dispatch( blockEditorStore );\n\n\t\tfunction getTrailingId( id ) {\n\t\t\tconst order = getBlockOrder( id );\n\n\t\t\tif ( ! order.length ) {\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\treturn getTrailingId( order[ order.length - 1 ] );\n\t\t}\n\n\t\tfunction mergeWithNested( clientIdA, clientIdB ) {\n\t\t\tregistry.batch( () => {\n\t\t\t\t// When merging a sub list item with a higher next list item, we\n\t\t\t\t// also need to move any nested list items. Check if there's a\n\t\t\t\t// listed list, and append its nested list items to the current\n\t\t\t\t// list.\n\t\t\t\tconst [ nestedListClientId ] = getBlockOrder( clientIdB );\n\t\t\t\tif ( nestedListClientId ) {\n\t\t\t\t\t// If we are merging with the previous list item, and the\n\t\t\t\t\t// previous list item does not have nested list, move the\n\t\t\t\t\t// nested list to the previous list item.\n\t\t\t\t\tif (\n\t\t\t\t\t\tgetPreviousBlockClientId( clientIdB ) === clientIdA &&\n\t\t\t\t\t\t! getBlockOrder( clientIdA ).length\n\t\t\t\t\t) {\n\t\t\t\t\t\tmoveBlocksToPosition(\n\t\t\t\t\t\t\t[ nestedListClientId ],\n\t\t\t\t\t\t\tclientIdB,\n\t\t\t\t\t\t\tclientIdA\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tgetOutdentTarget( select, clientIdB ) === clientIdA\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Merging into the parent item's own line: the\n\t\t\t\t\t\t// children take the item's place in its list, one\n\t\t\t\t\t\t// level up, since their line moved there.\n\t\t\t\t\t\tmoveBlocksToPosition(\n\t\t\t\t\t\t\tgetBlockOrder( nestedListClientId ),\n\t\t\t\t\t\t\tnestedListClientId,\n\t\t\t\t\t\t\tgetBlockRootClientId( clientIdB ),\n\t\t\t\t\t\t\tgetBlockIndex( clientIdB ) + 1\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmoveBlocksToPosition(\n\t\t\t\t\t\t\tgetBlockOrder( nestedListClientId ),\n\t\t\t\t\t\t\tnestedListClientId,\n\t\t\t\t\t\t\tgetBlockRootClientId( clientIdA )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst listId = getBlockRootClientId( clientIdB );\n\t\t\t\tmergeBlocks( clientIdA, clientIdB );\n\t\t\t\t// Merging the last item of a nested list into its parent\n\t\t\t\t// line leaves the list block empty.\n\t\t\t\tif ( ! getBlockOrder( listId ).length ) {\n\t\t\t\t\tremoveBlock( listId, false );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tif ( forward ) {\n\t\t\t// Start by diving into the nested list (if any); otherwise walk up\n\t\t\t// parent list items for a next sibling. `listItemId` ends on the\n\t\t\t// topmost list item if none is found.\n\t\t\tconst innerListId = getBlockOrder( clientId )[ 0 ];\n\t\t\tlet nextBlockClientId;\n\t\t\tlet listItemId = clientId;\n\t\t\tif ( innerListId ) {\n\t\t\t\tnextBlockClientId = getBlockOrder( innerListId )[ 0 ];\n\t\t\t} else {\n\t\t\t\twhile (\n\t\t\t\t\t! ( nextBlockClientId = getNextBlockClientId( listItemId ) )\n\t\t\t\t) {\n\t\t\t\t\tconst parentLi = getOutdentTarget( select, listItemId );\n\t\t\t\t\tif ( ! parentLi ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tlistItemId = parentLi;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! nextBlockClientId ) {\n\t\t\t\tconst outerListId = getBlockRootClientId( listItemId );\n\t\t\t\tconst followingBlockId = getNextBlockClientId( outerListId );\n\n\t\t\t\tif ( followingBlockId ) {\n\t\t\t\t\tif ( getBlockName( followingBlockId ) === 'core/list' ) {\n\t\t\t\t\t\tregistry.batch( () => {\n\t\t\t\t\t\t\tmoveBlocksToPosition(\n\t\t\t\t\t\t\t\tgetBlockOrder( followingBlockId ),\n\t\t\t\t\t\t\t\tfollowingBlockId,\n\t\t\t\t\t\t\t\touterListId\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tremoveBlock( followingBlockId, false );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst transformed = switchToBlockType(\n\t\t\t\t\t\t\tgetBlock( followingBlockId ),\n\t\t\t\t\t\t\t'core/list'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst newInnerBlocks = transformed?.[ 0 ]?.innerBlocks;\n\t\t\t\t\t\tif ( newInnerBlocks?.length ) {\n\t\t\t\t\t\t\tregistry.batch( () => {\n\t\t\t\t\t\t\t\tinsertBlocks(\n\t\t\t\t\t\t\t\t\tnewInnerBlocks,\n\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\touterListId,\n\t\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tremoveBlock( followingBlockId, false );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmergeWithNested( clientId, nextBlockClientId );\n\t\t\t}\n\t\t} else {\n\t\t\t// Merge into the previous line: the trailing item of the\n\t\t\t// previous sibling, or the parent item's own line for a first\n\t\t\t// child.\n\t\t\tconst previousBlockClientId = getPreviousBlockClientId( clientId );\n\t\t\tif ( previousBlockClientId ) {\n\t\t\t\tconst trailingId = getTrailingId( previousBlockClientId );\n\t\t\t\tmergeWithNested( trailingId, clientId );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst parentListItemId = getOutdentTarget( select, clientId );\n\t\t\tif ( parentListItemId ) {\n\t\t\t\tmergeWithNested( parentListItemId, clientId );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst blockOrder = getBlockOrder( clientId );\n\t\t\tif (\n\t\t\t\tisUnmodifiedBlock( getBlock( clientId ), 'content' ) &&\n\t\t\t\tblockOrder.length > 0\n\t\t\t) {\n\t\t\t\tregistry.batch( () => {\n\t\t\t\t\toutdentListItems(\n\t\t\t\t\t\tregistry,\n\t\t\t\t\t\tgetBlockOrder( blockOrder[ 0 ] )\n\t\t\t\t\t);\n\t\t\t\t\tremoveBlock( clientId, true );\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tonMerge( forward );\n\t\t\t}\n\t\t}\n\t};\n}\n"],
"mappings": "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",
"names": ["blockEditorStore"]
}