-
Notifications
You must be signed in to change notification settings - Fork 4.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Block Bindings: Fix passing bindings context to canUserEditValue
#65599
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this should be passing const { boundAttributes, updatedContext } = useSelect( () => { There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It seems moving
I can take a look at the solutions suggested there, but I was wondering first: Would it be safe to directly modify the context prop? Instead of doing There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's probably bad idea to mutate anything that React controls - props, context, etc. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've started exploring moving the updatedContext to a |
||
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 } | ||
/> | ||
</> | ||
); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With https://github.com/WordPress/gutenberg/pull/65599/files#r1772886078 applied, this can be refactored to: