From 9ee6ad33aecce663ffce256f69cb23ba5030382c Mon Sep 17 00:00:00 2001 From: Daniel Richards Date: Wed, 26 Jun 2024 19:42:35 +0800 Subject: [PATCH] Use block context to detect presence of parent pattern for overrides (#62861) * Use block context to detect presence of parent pattern * Regenerate fixtures * Update image block to use context for checking a parent pattern block exists * Rename context to `pattern/overrides` to be consistent with php code * Move pattern overrides context shim to pattern overrides hooks * Remove shim Co-authored-by: talldan Co-authored-by: ellatrix Co-authored-by: SantosGuillamot --- .../src/hooks/use-bindings-attributes.js | 32 ++++++------------- packages/block-library/src/block/block.json | 6 +++- packages/block-library/src/image/image.js | 13 ++++---- .../editor/src/bindings/pattern-overrides.js | 19 ++++++----- .../editor/src/hooks/pattern-overrides.js | 5 ++- .../fixtures/blocks/core__block.json | 3 +- 6 files changed, 37 insertions(+), 41 deletions(-) diff --git a/packages/block-editor/src/hooks/use-bindings-attributes.js b/packages/block-editor/src/hooks/use-bindings-attributes.js index a0757bbb6d386..e3ff6436ebea3 100644 --- a/packages/block-editor/src/hooks/use-bindings-attributes.js +++ b/packages/block-editor/src/hooks/use-bindings-attributes.js @@ -11,7 +11,6 @@ import { addFilter } from '@wordpress/hooks'; * Internal dependencies */ import { unlock } from '../lock-unlock'; -import { store as blockEditorStore } from '../store'; /** @typedef {import('@wordpress/compose').WPHigherOrderComponent} WPHigherOrderComponent */ /** @typedef {import('@wordpress/blocks').WPBlockSettings} WPBlockSettings */ @@ -95,24 +94,12 @@ export const withBlockBindingSupport = createHigherOrderComponent( ( BlockEdit ) => ( props ) => { const registry = useRegistry(); const { name, clientId, context } = props; - const { sources, hasParentPattern } = useSelect( - ( select ) => { - const { getAllBlockBindingsSources } = unlock( - select( blocksStore ) - ); - const { getBlockParentsByBlockName } = unlock( - select( blockEditorStore ) - ); - - return { - sources: getAllBlockBindingsSources(), - hasParentPattern: - getBlockParentsByBlockName( clientId, 'core/block' ) - .length > 0, - }; - }, - [ clientId ] + const sources = useSelect( + ( select ) => + unlock( select( blocksStore ) ).getAllBlockBindingsSources(), + [] ); + const hasParentPattern = !! props.context[ 'pattern/overrides' ]; const hasPatternOverridesDefaultBinding = props.attributes.metadata?.bindings?.[ DEFAULT_ATTRIBUTE ] ?.source === 'core/pattern-overrides'; @@ -254,12 +241,13 @@ export const withBlockBindingSupport = createHigherOrderComponent( [ registry, bindings, - name, - clientId, - context, + hasPatternOverridesDefaultBinding, + hasParentPattern, setAttributes, + name, sources, - hasPatternOverridesDefaultBinding, + context, + clientId, ] ); diff --git a/packages/block-library/src/block/block.json b/packages/block-library/src/block/block.json index 34dcb9a396ac6..fdce3bcc02e07 100644 --- a/packages/block-library/src/block/block.json +++ b/packages/block-library/src/block/block.json @@ -12,9 +12,13 @@ "type": "number" }, "content": { - "type": "object" + "type": "object", + "default": {} } }, + "providesContext": { + "pattern/overrides": "content" + }, "supports": { "customClassName": false, "html": false, diff --git a/packages/block-library/src/image/image.js b/packages/block-library/src/image/image.js index c96eb4e45117d..abddd724f4705 100644 --- a/packages/block-library/src/image/image.js +++ b/packages/block-library/src/image/image.js @@ -443,16 +443,12 @@ export default function Image( { return {}; } const { getBlockBindingsSource } = unlock( select( blocksStore ) ); - const { getBlockParentsByBlockName } = unlock( - select( blockEditorStore ) - ); const { url: urlBinding, alt: altBinding, title: titleBinding, } = metadata?.bindings || {}; - const hasParentPattern = - getBlockParentsByBlockName( clientId, 'core/block' ).length > 0; + const hasParentPattern = !! context[ 'pattern/overrides' ]; const urlBindingSource = getBlockBindingsSource( urlBinding?.source ); @@ -508,7 +504,12 @@ export default function Image( { : __( 'Connected to dynamic data' ), }; }, - [ clientId, isSingleSelected, metadata?.bindings ] + [ + arePatternOverridesEnabled, + context, + isSingleSelected, + metadata?.bindings, + ] ); const showUrlInput = diff --git a/packages/editor/src/bindings/pattern-overrides.js b/packages/editor/src/bindings/pattern-overrides.js index 107ed72e722ba..54ca77650a5fe 100644 --- a/packages/editor/src/bindings/pattern-overrides.js +++ b/packages/editor/src/bindings/pattern-overrides.js @@ -9,23 +9,22 @@ const CONTENT = 'content'; export default { name: 'core/pattern-overrides', label: _x( 'Pattern Overrides', 'block bindings source' ), - getValue( { registry, clientId, attributeName } ) { - const { getBlockAttributes, getBlockParentsByBlockName } = - registry.select( blockEditorStore ); + getValue( { registry, clientId, context, attributeName } ) { + const patternOverridesContent = context[ 'pattern/overrides' ]; + const { getBlockAttributes } = registry.select( blockEditorStore ); const currentBlockAttributes = getBlockAttributes( clientId ); - const [ patternClientId ] = getBlockParentsByBlockName( - clientId, - 'core/block', - true - ); + + if ( ! patternOverridesContent ) { + return currentBlockAttributes[ attributeName ]; + } const overridableValue = - getBlockAttributes( patternClientId )?.[ CONTENT ]?.[ + patternOverridesContent?.[ currentBlockAttributes?.metadata?.name ]?.[ attributeName ]; // If there is no pattern client ID, or it is not overwritten, return the default value. - if ( ! patternClientId || overridableValue === undefined ) { + if ( overridableValue === undefined ) { return currentBlockAttributes[ attributeName ]; } diff --git a/packages/editor/src/hooks/pattern-overrides.js b/packages/editor/src/hooks/pattern-overrides.js index 36a67bb9c5d24..426bc4d357f0b 100644 --- a/packages/editor/src/hooks/pattern-overrides.js +++ b/packages/editor/src/hooks/pattern-overrides.js @@ -14,6 +14,8 @@ import { store as blocksStore } from '@wordpress/blocks'; import { store as editorStore } from '../store'; import { unlock } from '../lock-unlock'; +/** @typedef {import('@wordpress/blocks').WPBlockSettings} WPBlockSettings */ + const { PatternOverridesControls, ResetOverridesControl, @@ -46,7 +48,8 @@ const withPatternOverrideControls = createHigherOrderComponent( { isSupportedBlock && } ); - } + }, + 'withPatternOverrideControls' ); // Split into a separate component to avoid a store subscription diff --git a/test/integration/fixtures/blocks/core__block.json b/test/integration/fixtures/blocks/core__block.json index a4ce0bf8c9545..d7c28bacfe137 100644 --- a/test/integration/fixtures/blocks/core__block.json +++ b/test/integration/fixtures/blocks/core__block.json @@ -3,7 +3,8 @@ "name": "core/block", "isValid": true, "attributes": { - "ref": 123 + "ref": 123, + "content": {} }, "innerBlocks": [] }