UNPKG

@wordpress/block-library

Version:
8 lines (7 loc) 7.1 kB
{ "version": 3, "sources": ["../../../src/list-item/hooks/use-merge.js"], "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useRegistry, useDispatch, useSelect } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { isUnmodifiedBlock } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport useOutdentListItem from './use-outdent-list-item';\n\nexport default function useMerge( clientId, onMerge ) {\n\tconst registry = useRegistry();\n\tconst {\n\t\tgetPreviousBlockClientId,\n\t\tgetNextBlockClientId,\n\t\tgetBlockOrder,\n\t\tgetBlockRootClientId,\n\t\tgetBlockName,\n\t\tgetBlock,\n\t} = useSelect( blockEditorStore );\n\tconst { mergeBlocks, moveBlocksToPosition, removeBlock } =\n\t\tuseDispatch( blockEditorStore );\n\tconst outdentListItem = useOutdentListItem();\n\n\tfunction getTrailingId( id ) {\n\t\tconst order = getBlockOrder( id );\n\n\t\tif ( ! order.length ) {\n\t\t\treturn id;\n\t\t}\n\n\t\treturn getTrailingId( order[ order.length - 1 ] );\n\t}\n\n\tfunction getParentListItemId( id ) {\n\t\tconst listId = getBlockRootClientId( id );\n\t\tconst parentListItemId = getBlockRootClientId( listId );\n\t\tif ( ! parentListItemId ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( getBlockName( parentListItemId ) !== 'core/list-item' ) {\n\t\t\treturn;\n\t\t}\n\t\treturn parentListItemId;\n\t}\n\n\t/**\n\t * Return the next list item with respect to the given list item. If none,\n\t * return the next list item of the parent list item if it exists.\n\t *\n\t * @param {string} id A list item client ID.\n\t * @return {?string} The client ID of the next list item.\n\t */\n\tfunction _getNextId( id ) {\n\t\tconst next = getNextBlockClientId( id );\n\t\tif ( next ) {\n\t\t\treturn next;\n\t\t}\n\t\tconst parentListItemId = getParentListItemId( id );\n\t\tif ( ! parentListItemId ) {\n\t\t\treturn;\n\t\t}\n\t\treturn _getNextId( parentListItemId );\n\t}\n\n\t/**\n\t * Given a client ID, return the client ID of the list item on the next\n\t * line, regardless of indentation level.\n\t *\n\t * @param {string} id The client ID of the current list item.\n\t * @return {?string} The client ID of the next list item.\n\t */\n\tfunction getNextId( id ) {\n\t\tconst order = getBlockOrder( id );\n\n\t\t// If the list item does not have a nested list, return the next list\n\t\t// item.\n\t\tif ( ! order.length ) {\n\t\t\treturn _getNextId( id );\n\t\t}\n\n\t\t// Get the first list item in the nested list.\n\t\treturn getBlockOrder( order[ 0 ] )[ 0 ];\n\t}\n\n\treturn ( forward ) => {\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 {\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\tmergeBlocks( clientIdA, clientIdB );\n\t\t\t} );\n\t\t}\n\n\t\tif ( forward ) {\n\t\t\tconst nextBlockClientId = getNextId( clientId );\n\n\t\t\tif ( ! nextBlockClientId ) {\n\t\t\t\tonMerge( forward );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( getParentListItemId( nextBlockClientId ) ) {\n\t\t\t\toutdentListItem( nextBlockClientId );\n\t\t\t} else {\n\t\t\t\tmergeWithNested( clientId, nextBlockClientId );\n\t\t\t}\n\t\t} else {\n\t\t\t// Merging is only done from the top level. For lowel levels, the\n\t\t\t// list item is outdented instead.\n\t\t\tif ( getParentListItemId( clientId ) ) {\n\t\t\t\toutdentListItem( clientId );\n\t\t\t\treturn;\n\t\t\t}\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\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\toutdentListItem( getBlockOrder( blockOrder[ 0 ] ) );\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": [] }