Skip to content

Commit

Permalink
Use block context to detect presence of parent pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
talldan committed Jun 26, 2024
1 parent e1bdd7e commit 320dcb9
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 33 deletions.
34 changes: 12 additions & 22 deletions packages/block-editor/src/hooks/use-bindings-attributes.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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.patternOverridesContent;
const hasPatternOverridesDefaultBinding =
props.attributes.metadata?.bindings?.[ DEFAULT_ATTRIBUTE ]
?.source === 'core/pattern-overrides';
Expand Down Expand Up @@ -254,12 +241,13 @@ export const withBlockBindingSupport = createHigherOrderComponent(
[
registry,
bindings,
name,
clientId,
context,
hasPatternOverridesDefaultBinding,
hasParentPattern,
setAttributes,
name,
sources,
hasPatternOverridesDefaultBinding,
context,
clientId,
]
);

Expand Down Expand Up @@ -292,6 +280,8 @@ function shimAttributeSource( settings, name ) {
return {
...settings,
edit: withBlockBindingSupport( settings.edit ),
// TODO - move this to be located with pattern overrides code.
usesContext: [ 'patternOverridesContent', ...settings?.usesContext ],
};
}

Expand Down
6 changes: 5 additions & 1 deletion packages/block-library/src/block/block.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,13 @@
"type": "number"
},
"content": {
"type": "object"
"type": "object",
"default": {}
}
},
"providesContext": {
"patternOverridesContent": "content"
},
"supports": {
"customClassName": false,
"html": false,
Expand Down
19 changes: 9 additions & 10 deletions packages/editor/src/bindings/pattern-overrides.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
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 ];
}

Expand Down

0 comments on commit 320dcb9

Please sign in to comment.