UNPKG

@wordpress/block-editor

Version:
8 lines (7 loc) 3.06 kB
{ "version": 3, "sources": ["../../../../src/components/block-list/use-block-props/use-block-refs.js"], "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useContext, useState, useLayoutEffect } from '@wordpress/element';\nimport { useRefEffect } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { BlockRefs } from '../../provider/block-refs-provider';\n\n/** @typedef {import('@wordpress/element').RefCallback} RefCallback */\n/** @typedef {import('@wordpress/element').Ref} Ref */\n\n/**\n * Provides a ref to the BlockRefs context.\n *\n * @param {string} clientId The client ID of the element ref.\n *\n * @return {RefCallback} Ref callback.\n */\nexport function useBlockRefProvider( clientId ) {\n\tconst { refsMap } = useContext( BlockRefs );\n\treturn useRefEffect(\n\t\t( element ) => {\n\t\t\trefsMap.set( clientId, element );\n\t\t\treturn () => refsMap.delete( clientId );\n\t\t},\n\t\t[ clientId ]\n\t);\n}\n\nfunction assignRef( ref, value ) {\n\tif ( typeof ref === 'function' ) {\n\t\tref( value );\n\t} else if ( ref ) {\n\t\tref.current = value;\n\t}\n}\n\n/**\n * Tracks the DOM element for the block identified by `clientId` and assigns it to the `ref`\n * whenever it changes.\n *\n * @param {string} clientId The client ID to track.\n * @param {Ref} ref The ref object/callback to assign to.\n */\nexport function useBlockElementRef( clientId, ref ) {\n\tconst { refsMap } = useContext( BlockRefs );\n\tuseLayoutEffect( () => {\n\t\tassignRef( ref, refsMap.get( clientId ) );\n\t\tconst unsubscribe = refsMap.subscribe( clientId, () =>\n\t\t\tassignRef( ref, refsMap.get( clientId ) )\n\t\t);\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\tassignRef( ref, null );\n\t\t};\n\t}, [ refsMap, clientId, ref ] );\n}\n\n/**\n * Return the element for a given client ID. Updates whenever the element\n * changes, becomes available, or disappears.\n *\n * @param {string} clientId The client ID to an element for.\n *\n * @return {Element|null} The block's wrapper element.\n */\nexport function useBlockElement( clientId ) {\n\tconst [ blockElement, setBlockElement ] = useState( null );\n\tuseBlockElementRef( clientId, setBlockElement );\n\treturn blockElement;\n}\n"], "mappings": ";AAGA,SAAS,YAAY,UAAU,uBAAuB;AACtD,SAAS,oBAAoB;AAK7B,SAAS,iBAAiB;AAYnB,SAAS,oBAAqB,UAAW;AAC/C,QAAM,EAAE,QAAQ,IAAI,WAAY,SAAU;AAC1C,SAAO;AAAA,IACN,CAAE,YAAa;AACd,cAAQ,IAAK,UAAU,OAAQ;AAC/B,aAAO,MAAM,QAAQ,OAAQ,QAAS;AAAA,IACvC;AAAA,IACA,CAAE,QAAS;AAAA,EACZ;AACD;AAEA,SAAS,UAAW,KAAK,OAAQ;AAChC,MAAK,OAAO,QAAQ,YAAa;AAChC,QAAK,KAAM;AAAA,EACZ,WAAY,KAAM;AACjB,QAAI,UAAU;AAAA,EACf;AACD;AASO,SAAS,mBAAoB,UAAU,KAAM;AACnD,QAAM,EAAE,QAAQ,IAAI,WAAY,SAAU;AAC1C,kBAAiB,MAAM;AACtB,cAAW,KAAK,QAAQ,IAAK,QAAS,CAAE;AACxC,UAAM,cAAc,QAAQ;AAAA,MAAW;AAAA,MAAU,MAChD,UAAW,KAAK,QAAQ,IAAK,QAAS,CAAE;AAAA,IACzC;AACA,WAAO,MAAM;AACZ,kBAAY;AACZ,gBAAW,KAAK,IAAK;AAAA,IACtB;AAAA,EACD,GAAG,CAAE,SAAS,UAAU,GAAI,CAAE;AAC/B;AAUO,SAAS,gBAAiB,UAAW;AAC3C,QAAM,CAAE,cAAc,eAAgB,IAAI,SAAU,IAAK;AACzD,qBAAoB,UAAU,eAAgB;AAC9C,SAAO;AACR;", "names": [] }