@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
8 lines (7 loc) • 4.5 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/components/visual-editor/use-select-nearest-editable-block.js"],
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useRefEffect } from '@wordpress/compose';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../../lock-unlock';\n\nconst DISTANCE_THRESHOLD = 500;\n\nfunction clamp( value, min, max ) {\n\treturn Math.min( Math.max( value, min ), max );\n}\n\nfunction distanceFromRect( x, y, rect ) {\n\tconst dx = x - clamp( x, rect.left, rect.right );\n\tconst dy = y - clamp( y, rect.top, rect.bottom );\n\treturn Math.sqrt( dx * dx + dy * dy );\n}\n\nexport default function useSelectNearestEditableBlock( {\n\tisEnabled = true,\n} = {} ) {\n\tconst { getEnabledClientIdsTree, getBlockName, getBlockOrder } = unlock(\n\t\tuseSelect( blockEditorStore )\n\t);\n\tconst { selectBlock } = useDispatch( blockEditorStore );\n\n\treturn useRefEffect(\n\t\t( element ) => {\n\t\t\tif ( ! isEnabled ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectNearestEditableBlock = ( x, y ) => {\n\t\t\t\tconst editableBlockClientIds =\n\t\t\t\t\tgetEnabledClientIdsTree().flatMap( ( { clientId } ) => {\n\t\t\t\t\t\tconst blockName = getBlockName( clientId );\n\t\t\t\t\t\tif ( blockName === 'core/template-part' ) {\n\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( blockName === 'core/post-content' ) {\n\t\t\t\t\t\t\tconst innerBlocks = getBlockOrder( clientId );\n\t\t\t\t\t\t\tif ( innerBlocks.length ) {\n\t\t\t\t\t\t\t\treturn innerBlocks;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [ clientId ];\n\t\t\t\t\t} );\n\n\t\t\t\tlet nearestDistance = Infinity,\n\t\t\t\t\tnearestClientId = null;\n\n\t\t\t\tfor ( const clientId of editableBlockClientIds ) {\n\t\t\t\t\tconst block = element.querySelector(\n\t\t\t\t\t\t`[data-block=\"${ clientId }\"]`\n\t\t\t\t\t);\n\t\t\t\t\tif ( ! block ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst rect = block.getBoundingClientRect();\n\t\t\t\t\tconst distance = distanceFromRect( x, y, rect );\n\t\t\t\t\tif (\n\t\t\t\t\t\tdistance < nearestDistance &&\n\t\t\t\t\t\tdistance < DISTANCE_THRESHOLD\n\t\t\t\t\t) {\n\t\t\t\t\t\tnearestDistance = distance;\n\t\t\t\t\t\tnearestClientId = clientId;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( nearestClientId ) {\n\t\t\t\t\tselectBlock( nearestClientId );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleClick = ( event ) => {\n\t\t\t\tconst shouldSelect =\n\t\t\t\t\tevent.target === element ||\n\t\t\t\t\tevent.target.classList.contains( 'is-root-container' );\n\t\t\t\tif ( shouldSelect ) {\n\t\t\t\t\tselectNearestEditableBlock( event.clientX, event.clientY );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\telement.addEventListener( 'click', handleClick );\n\t\t\treturn () => element.removeEventListener( 'click', handleClick );\n\t\t},\n\t\t[ isEnabled ]\n\t);\n}\n"],
"mappings": ";AAGA,SAAS,oBAAoB;AAC7B,SAAS,WAAW,mBAAmB;AACvC,SAAS,SAAS,wBAAwB;AAK1C,SAAS,cAAc;AAEvB,IAAM,qBAAqB;AAE3B,SAAS,MAAO,OAAO,KAAK,KAAM;AACjC,SAAO,KAAK,IAAK,KAAK,IAAK,OAAO,GAAI,GAAG,GAAI;AAC9C;AAEA,SAAS,iBAAkB,GAAG,GAAG,MAAO;AACvC,QAAM,KAAK,IAAI,MAAO,GAAG,KAAK,MAAM,KAAK,KAAM;AAC/C,QAAM,KAAK,IAAI,MAAO,GAAG,KAAK,KAAK,KAAK,MAAO;AAC/C,SAAO,KAAK,KAAM,KAAK,KAAK,KAAK,EAAG;AACrC;AAEe,SAAR,8BAAgD;AAAA,EACtD,YAAY;AACb,IAAI,CAAC,GAAI;AACR,QAAM,EAAE,yBAAyB,cAAc,cAAc,IAAI;AAAA,IAChE,UAAW,gBAAiB;AAAA,EAC7B;AACA,QAAM,EAAE,YAAY,IAAI,YAAa,gBAAiB;AAEtD,SAAO;AAAA,IACN,CAAE,YAAa;AACd,UAAK,CAAE,WAAY;AAClB;AAAA,MACD;AAEA,YAAM,6BAA6B,CAAE,GAAG,MAAO;AAC9C,cAAM,yBACL,wBAAwB,EAAE,QAAS,CAAE,EAAE,SAAS,MAAO;AACtD,gBAAM,YAAY,aAAc,QAAS;AACzC,cAAK,cAAc,sBAAuB;AACzC,mBAAO,CAAC;AAAA,UACT;AACA,cAAK,cAAc,qBAAsB;AACxC,kBAAM,cAAc,cAAe,QAAS;AAC5C,gBAAK,YAAY,QAAS;AACzB,qBAAO;AAAA,YACR;AAAA,UACD;AACA,iBAAO,CAAE,QAAS;AAAA,QACnB,CAAE;AAEH,YAAI,kBAAkB,UACrB,kBAAkB;AAEnB,mBAAY,YAAY,wBAAyB;AAChD,gBAAM,QAAQ,QAAQ;AAAA,YACrB,gBAAiB,QAAS;AAAA,UAC3B;AACA,cAAK,CAAE,OAAQ;AACd;AAAA,UACD;AACA,gBAAM,OAAO,MAAM,sBAAsB;AACzC,gBAAM,WAAW,iBAAkB,GAAG,GAAG,IAAK;AAC9C,cACC,WAAW,mBACX,WAAW,oBACV;AACD,8BAAkB;AAClB,8BAAkB;AAAA,UACnB;AAAA,QACD;AAEA,YAAK,iBAAkB;AACtB,sBAAa,eAAgB;AAAA,QAC9B;AAAA,MACD;AAEA,YAAM,cAAc,CAAE,UAAW;AAChC,cAAM,eACL,MAAM,WAAW,WACjB,MAAM,OAAO,UAAU,SAAU,mBAAoB;AACtD,YAAK,cAAe;AACnB,qCAA4B,MAAM,SAAS,MAAM,OAAQ;AAAA,QAC1D;AAAA,MACD;AAEA,cAAQ,iBAAkB,SAAS,WAAY;AAC/C,aAAO,MAAM,QAAQ,oBAAqB,SAAS,WAAY;AAAA,IAChE;AAAA,IACA,CAAE,SAAU;AAAA,EACb;AACD;",
"names": []
}