@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
90 lines (84 loc) • 3.63 kB
JavaScript
;
var _data = require("@wordpress/data");
var _coreData = require("@wordpress/core-data");
var _element = require("@wordpress/element");
var _compose = require("@wordpress/compose");
var _hooks = require("@wordpress/hooks");
var _store = require("../store");
var _jsxRuntime = require("react/jsx-runtime");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
/** @typedef {import('@wordpress/compose').WPHigherOrderComponent} WPHigherOrderComponent */
/** @typedef {import('@wordpress/blocks').WPBlockSettings} WPBlockSettings */
/**
* Object whose keys are the names of block attributes, where each value
* represents the meta key to which the block attribute is intended to save.
*
* @see https://developer.wordpress.org/reference/functions/register_meta/
*
* @typedef {Object<string,string>} WPMetaAttributeMapping
*/
/**
* Given a mapping of attribute names (meta source attributes) to their
* associated meta key, returns a higher order component that overrides its
* `attributes` and `setAttributes` props to sync any changes with the edited
* post's meta keys.
*
* @param {WPMetaAttributeMapping} metaAttributes Meta attribute mapping.
*
* @return {WPHigherOrderComponent} Higher-order component.
*/const createWithMetaAttributeSource = metaAttributes => (0, _compose.createHigherOrderComponent)(BlockEdit => ({
attributes,
setAttributes,
...props
}) => {
const postType = (0, _data.useSelect)(select => select(_store.store).getCurrentPostType(), []);
const [meta, setMeta] = (0, _coreData.useEntityProp)('postType', postType, 'meta');
const mergedAttributes = (0, _element.useMemo)(() => ({
...attributes,
...Object.fromEntries(Object.entries(metaAttributes).map(([attributeKey, metaKey]) => [attributeKey, meta[metaKey]]))
}), [attributes, meta]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(BlockEdit, {
attributes: mergedAttributes,
setAttributes: nextAttributes => {
const nextMeta = Object.fromEntries(Object.entries(nextAttributes !== null && nextAttributes !== void 0 ? nextAttributes : {}).filter(
// Filter to intersection of keys between the updated
// attributes and those with an associated meta key.
([key]) => key in metaAttributes).map(([attributeKey, value]) => [
// Rename the keys to the expected meta key name.
metaAttributes[attributeKey], value]));
if (Object.entries(nextMeta).length) {
setMeta(nextMeta);
}
setAttributes(nextAttributes);
},
...props
});
}, 'withMetaAttributeSource');
/**
* Filters a registered block's settings to enhance a block's `edit` component
* to upgrade meta-sourced attributes to use the post's meta entity property.
*
* @param {WPBlockSettings} settings Registered block settings.
*
* @return {WPBlockSettings} Filtered block settings.
*/
function shimAttributeSource(settings) {
var _settings$attributes;
/** @type {WPMetaAttributeMapping} */
const metaAttributes = Object.fromEntries(Object.entries((_settings$attributes = settings.attributes) !== null && _settings$attributes !== void 0 ? _settings$attributes : {}).filter(([, {
source
}]) => source === 'meta').map(([attributeKey, {
meta
}]) => [attributeKey, meta]));
if (Object.entries(metaAttributes).length) {
settings.edit = createWithMetaAttributeSource(metaAttributes)(settings.edit);
}
return settings;
}
(0, _hooks.addFilter)('blocks.registerBlockType', 'core/editor/custom-sources-backwards-compatibility/shim-attribute-source', shimAttributeSource);
//# sourceMappingURL=custom-sources-backwards-compatibility.js.map