diff --git a/packages/block-editor/src/components/block-preview/index.js b/packages/block-editor/src/components/block-preview/index.js index cf0937507be095..22b7c460d1f25f 100644 --- a/packages/block-editor/src/components/block-preview/index.js +++ b/packages/block-editor/src/components/block-preview/index.js @@ -7,8 +7,8 @@ import classnames from 'classnames'; * WordPress dependencies */ import { useDisabled, useMergeRefs } from '@wordpress/compose'; -import { useSelect } from '@wordpress/data'; -import { memo, useMemo } from '@wordpress/element'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { memo, useEffect, useMemo } from '@wordpress/element'; import deprecated from '@wordpress/deprecated'; /** @@ -18,6 +18,7 @@ import { ExperimentalBlockEditorProvider } from '../provider'; import AutoHeightBlockPreview from './auto'; import { store as blockEditorStore } from '../../store'; import { BlockListItems } from '../block-list'; +import { unlock } from '../../lock-unlock'; export function BlockPreview( { blocks, @@ -92,6 +93,33 @@ export function BlockPreview( { */ export default memo( BlockPreview ); +/** + * Syncs style overrides with the parent component. This allows a child of + * an `ExperimentalBlockEditorProvider` to sync its internal style overrides with + * the parent store. + * + * @param {Object} props The component props. + * @param {Map} props.parentStyleOverrides The parent style overrides. + * @param {Function} props.setParentStyleOverride The parent's function to set a style override. + */ +function SyncStyleOverridesWithParent( { + parentStyleOverrides, + setParentStyleOverride, +} ) { + const overrides = useSelect( + ( select ) => unlock( select( blockEditorStore ) ).getStyleOverrides(), + [] + ); + + useEffect( () => { + for ( const [ id, override ] of overrides ) { + if ( parentStyleOverrides.get( id ) !== override ) { + setParentStyleOverride( id, override ); + } + } + }, [ overrides, parentStyleOverrides, setParentStyleOverride ] ); +} + /** * This hook is used to lightly mark an element as a block preview wrapper * element. Call this hook and pass the returned props to the element to mark as @@ -108,6 +136,11 @@ export default memo( BlockPreview ); * @param {Object} options.layout Layout settings to be used in the preview. */ export function useBlockPreview( { blocks, props = {}, layout } ) { + const { setStyleOverride } = unlock( useDispatch( blockEditorStore ) ); + const parentStyleOverrides = useSelect( + ( select ) => unlock( select( blockEditorStore ) ).getStyleOverrides(), + [] + ); const originalSettings = useSelect( ( select ) => select( blockEditorStore ).getSettings(), [] @@ -128,6 +161,10 @@ export function useBlockPreview( { blocks, props = {}, layout } ) { value={ renderedBlocks } settings={ settings } > + );