From 2a80118931756c72b5cb5d1b728117ddb6749ffc Mon Sep 17 00:00:00 2001 From: Mario Santos <34552881+SantosGuillamot@users.noreply.github.com> Date: Tue, 24 Sep 2024 11:06:11 +0200 Subject: [PATCH] Block Bindings: Fix passing bindings context to `canUserEditValue` (#65599) * Pass updated context as `context` prop * Use `updatedContext` in pattern overrides Co-authored-by: SantosGuillamot Co-authored-by: gziolo --- .../src/hooks/use-bindings-attributes.js | 53 +++++++++---------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/packages/block-editor/src/hooks/use-bindings-attributes.js b/packages/block-editor/src/hooks/use-bindings-attributes.js index ac045004cc654..9f9234ad47d10 100644 --- a/packages/block-editor/src/hooks/use-bindings-attributes.js +++ b/packages/block-editor/src/hooks/use-bindings-attributes.js @@ -103,11 +103,7 @@ export const withBlockBindingSupport = createHigherOrderComponent( const sources = useSelect( ( select ) => unlock( select( blocksStore ) ).getAllBlockBindingsSources() ); - const { name, clientId } = props; - const hasParentPattern = !! props.context[ 'pattern/overrides' ]; - const hasPatternOverridesDefaultBinding = - props.attributes.metadata?.bindings?.[ DEFAULT_ATTRIBUTE ] - ?.source === 'core/pattern-overrides'; + const { name, clientId, context, setAttributes } = props; const blockBindings = useMemo( () => replacePatternOverrideDefaultBindings( @@ -121,6 +117,7 @@ export const withBlockBindingSupport = createHigherOrderComponent( // used purposely here to ensure `boundAttributes` is updated whenever // there are attribute updates. // `source.getValues` may also call a selector via `registry.select`. + const updatedContext = { ...context }; const boundAttributes = useSelect( () => { if ( ! blockBindings ) { return; @@ -139,6 +136,11 @@ export const withBlockBindingSupport = createHigherOrderComponent( continue; } + // Populate context. + for ( const key of source.usesContext || [] ) { + updatedContext[ key ] = blockContext[ key ]; + } + blockBindingsBySource.set( source, { ...blockBindingsBySource.get( source ), [ attributeName ]: { @@ -149,15 +151,6 @@ export const withBlockBindingSupport = createHigherOrderComponent( if ( blockBindingsBySource.size ) { for ( const [ source, bindings ] of blockBindingsBySource ) { - // Populate context. - const context = {}; - - if ( source.usesContext?.length ) { - for ( const key of source.usesContext ) { - context[ key ] = blockContext[ key ]; - } - } - // Get values in batch if the source supports it. let values = {}; if ( ! source.getValues ) { @@ -168,7 +161,7 @@ export const withBlockBindingSupport = createHigherOrderComponent( } else { values = source.getValues( { registry, - context, + context: updatedContext, clientId, bindings, } ); @@ -190,9 +183,19 @@ export const withBlockBindingSupport = createHigherOrderComponent( } return attributes; - }, [ blockBindings, name, clientId, blockContext, registry, sources ] ); - - const { setAttributes } = props; + }, [ + blockBindings, + name, + clientId, + updatedContext, + registry, + sources, + ] ); + + const hasParentPattern = !! updatedContext[ 'pattern/overrides' ]; + const hasPatternOverridesDefaultBinding = + props.attributes.metadata?.bindings?.[ DEFAULT_ATTRIBUTE ] + ?.source === 'core/pattern-overrides'; const _setAttributes = useCallback( ( nextAttributes ) => { @@ -236,18 +239,9 @@ export const withBlockBindingSupport = createHigherOrderComponent( source, bindings, ] of blockBindingsBySource ) { - // Populate context. - const context = {}; - - if ( source.usesContext?.length ) { - for ( const key of source.usesContext ) { - context[ key ] = blockContext[ key ]; - } - } - source.setValues( { registry, - context, + context: updatedContext, clientId, bindings, } ); @@ -277,7 +271,7 @@ export const withBlockBindingSupport = createHigherOrderComponent( blockBindings, name, clientId, - blockContext, + updatedContext, setAttributes, sources, hasPatternOverridesDefaultBinding, @@ -291,6 +285,7 @@ export const withBlockBindingSupport = createHigherOrderComponent( { ...props } attributes={ { ...props.attributes, ...boundAttributes } } setAttributes={ _setAttributes } + context={ updatedContext } /> );