UNPKG

@wordpress/block-library

Version:
8 lines (7 loc) 11.2 kB
{ "version": 3, "sources": ["../../src/block/edit.js"], "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRef, useMemo } from '@wordpress/element';\nimport {\n\tuseEntityRecord,\n\tstore as coreStore,\n\tuseEntityBlockEditor,\n} from '@wordpress/core-data';\nimport {\n\tPlaceholder,\n\tSpinner,\n\tToolbarButton,\n\tToolbarGroup,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport {\n\tuseInnerBlocksProps,\n\tRecursionProvider,\n\tuseHasRecursion,\n\tuseBlockProps,\n\tWarning,\n\tprivateApis as blockEditorPrivateApis,\n\tstore as blockEditorStore,\n\tBlockControls,\n\tInnerBlocks,\n} from '@wordpress/block-editor';\nimport { privateApis as patternsPrivateApis } from '@wordpress/patterns';\nimport { getBlockBindingsSource } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../lock-unlock';\n\nconst { useLayoutClasses } = unlock( blockEditorPrivateApis );\nconst { isOverridableBlock } = unlock( patternsPrivateApis );\n\nconst fullAlignments = [ 'full', 'wide', 'left', 'right' ];\n\nconst useInferredLayout = ( blocks, parentLayout ) => {\n\tconst initialInferredAlignmentRef = useRef();\n\n\treturn useMemo( () => {\n\t\t// Exit early if the pattern's blocks haven't loaded yet.\n\t\tif ( ! blocks?.length ) {\n\t\t\treturn {};\n\t\t}\n\n\t\tlet alignment = initialInferredAlignmentRef.current;\n\n\t\t// Only track the initial alignment so that temporarily removed\n\t\t// alignments can be reapplied.\n\t\tif ( alignment === undefined ) {\n\t\t\tconst isConstrained = parentLayout?.type === 'constrained';\n\t\t\tconst hasFullAlignment = blocks.some( ( block ) =>\n\t\t\t\tfullAlignments.includes( block.attributes.align )\n\t\t\t);\n\n\t\t\talignment = isConstrained && hasFullAlignment ? 'full' : null;\n\t\t\tinitialInferredAlignmentRef.current = alignment;\n\t\t}\n\n\t\tconst layout = alignment ? parentLayout : undefined;\n\n\t\treturn { alignment, layout };\n\t}, [ blocks, parentLayout ] );\n};\n\nfunction RecursionWarning() {\n\tconst blockProps = useBlockProps();\n\treturn (\n\t\t<div { ...blockProps }>\n\t\t\t<Warning>\n\t\t\t\t{ __( 'Block cannot be rendered inside itself.' ) }\n\t\t\t</Warning>\n\t\t</div>\n\t);\n}\n\nconst NOOP = () => {};\n\n// Wrap the main Edit function for the pattern block with a recursion wrapper\n// that allows short-circuiting rendering as early as possible, before any\n// of the other effects in the block edit have run.\nexport default function ReusableBlockEditRecursionWrapper( props ) {\n\tconst { ref } = props.attributes;\n\tconst hasAlreadyRendered = useHasRecursion( ref );\n\n\tif ( hasAlreadyRendered ) {\n\t\treturn <RecursionWarning />;\n\t}\n\n\treturn (\n\t\t<RecursionProvider uniqueId={ ref }>\n\t\t\t<ReusableBlockEdit { ...props } />\n\t\t</RecursionProvider>\n\t);\n}\n\nfunction ReusableBlockControl( {\n\trecordId,\n\tcanOverrideBlocks,\n\thasContent,\n\thandleEditOriginal,\n\tresetContent,\n} ) {\n\tconst canUserEdit = useSelect(\n\t\t( select ) =>\n\t\t\t!! select( coreStore ).canUser( 'update', {\n\t\t\t\tkind: 'postType',\n\t\t\t\tname: 'wp_block',\n\t\t\t\tid: recordId,\n\t\t\t} ),\n\t\t[ recordId ]\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t{ canUserEdit && !! handleEditOriginal && (\n\t\t\t\t<BlockControls group=\"other\">\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<ToolbarButton onClick={ handleEditOriginal }>\n\t\t\t\t\t\t\t{ __( 'Edit original' ) }\n\t\t\t\t\t\t</ToolbarButton>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\n\t\t\t{ canOverrideBlocks && (\n\t\t\t\t<BlockControls group=\"other\">\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\t\tonClick={ resetContent }\n\t\t\t\t\t\t\tdisabled={ ! hasContent }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Reset' ) }\n\t\t\t\t\t\t</ToolbarButton>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nconst EMPTY_OBJECT = {};\n\nfunction ReusableBlockEdit( {\n\tname,\n\tattributes: { ref, content },\n\t__unstableParentLayout: parentLayout,\n\tsetAttributes,\n} ) {\n\tconst { record, hasResolved } = useEntityRecord(\n\t\t'postType',\n\t\t'wp_block',\n\t\tref\n\t);\n\tconst [ blocks ] = useEntityBlockEditor( 'postType', 'wp_block', {\n\t\tid: ref,\n\t} );\n\tconst isMissing = hasResolved && ! record;\n\n\tconst { __unstableMarkLastChangeAsPersistent } =\n\t\tuseDispatch( blockEditorStore );\n\n\tconst {\n\t\tonNavigateToEntityRecord,\n\t\thasPatternOverridesSource,\n\t\tsupportedBlockTypesRaw,\n\t} = useSelect( ( select ) => {\n\t\tconst { getSettings } = select( blockEditorStore );\n\t\t// For editing link to the site editor if the theme and user permissions support it.\n\t\treturn {\n\t\t\tonNavigateToEntityRecord: getSettings().onNavigateToEntityRecord,\n\t\t\thasPatternOverridesSource: !! getBlockBindingsSource(\n\t\t\t\t'core/pattern-overrides'\n\t\t\t),\n\t\t\tsupportedBlockTypesRaw:\n\t\t\t\tgetSettings().__experimentalBlockBindingsSupportedAttributes ||\n\t\t\t\tEMPTY_OBJECT,\n\t\t};\n\t}, [] );\n\n\tconst canOverrideBlocks = useMemo( () => {\n\t\tconst supportedBlockTypes = Object.keys( supportedBlockTypesRaw );\n\t\tconst hasOverridableBlocks = ( _blocks ) =>\n\t\t\t_blocks.some( ( block ) => {\n\t\t\t\tif (\n\t\t\t\t\tsupportedBlockTypes.includes( block.name ) &&\n\t\t\t\t\tisOverridableBlock( block )\n\t\t\t\t) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn hasOverridableBlocks( block.innerBlocks );\n\t\t\t} );\n\t\treturn hasPatternOverridesSource && hasOverridableBlocks( blocks );\n\t}, [ hasPatternOverridesSource, blocks, supportedBlockTypesRaw ] );\n\n\tconst { alignment, layout } = useInferredLayout( blocks, parentLayout );\n\tconst layoutClasses = useLayoutClasses( { layout }, name );\n\n\tconst blockProps = useBlockProps( {\n\t\tclassName: clsx(\n\t\t\t'block-library-block__reusable-block-container',\n\t\t\tlayout && layoutClasses,\n\t\t\t{ [ `align${ alignment }` ]: alignment }\n\t\t),\n\t} );\n\n\tconst innerBlocksProps = useInnerBlocksProps( blockProps, {\n\t\tlayout,\n\t\tvalue: blocks,\n\t\tonInput: NOOP,\n\t\tonChange: NOOP,\n\t\trenderAppender: blocks?.length\n\t\t\t? undefined\n\t\t\t: InnerBlocks.ButtonBlockAppender,\n\t} );\n\n\tconst handleEditOriginal = () => {\n\t\tonNavigateToEntityRecord( {\n\t\t\tpostId: ref,\n\t\t\tpostType: 'wp_block',\n\t\t} );\n\t};\n\n\tconst resetContent = () => {\n\t\tif ( content ) {\n\t\t\t// Make sure any previous changes are persisted before resetting.\n\t\t\t__unstableMarkLastChangeAsPersistent();\n\t\t\tsetAttributes( { content: undefined } );\n\t\t}\n\t};\n\n\tlet children = null;\n\n\tif ( isMissing ) {\n\t\tchildren = (\n\t\t\t<Warning>\n\t\t\t\t{ __( 'Block has been deleted or is unavailable.' ) }\n\t\t\t</Warning>\n\t\t);\n\t}\n\n\tif ( ! hasResolved ) {\n\t\tchildren = (\n\t\t\t<Placeholder>\n\t\t\t\t<Spinner />\n\t\t\t</Placeholder>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{ hasResolved && ! isMissing && (\n\t\t\t\t<ReusableBlockControl\n\t\t\t\t\trecordId={ ref }\n\t\t\t\t\tcanOverrideBlocks={ canOverrideBlocks }\n\t\t\t\t\thasContent={ !! content }\n\t\t\t\t\thandleEditOriginal={\n\t\t\t\t\t\tonNavigateToEntityRecord\n\t\t\t\t\t\t\t? handleEditOriginal\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tresetContent={ resetContent }\n\t\t\t\t/>\n\t\t\t) }\n\n\t\t\t{ children === null ? (\n\t\t\t\t<div { ...innerBlocksProps } />\n\t\t\t) : (\n\t\t\t\t<div { ...blockProps }>{ children }</div>\n\t\t\t) }\n\t\t</>\n\t);\n}\n"], "mappings": "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", "names": ["blockEditorPrivateApis", "patternsPrivateApis", "coreStore", "blockEditorStore", "clsx"] }