UNPKG

@wordpress/editor

Version:
90 lines (84 loc) 3.63 kB
"use strict"; 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