Skip to content
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

Template Parts: Fix the template part replace flow #59883

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/block-editor/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1028,6 +1028,10 @@ _Returns_

- `any[]`: Returns the values defined for the settings.

### useZoomOut

A hook used to set the editor mode to zoomed out mode, invoking the hook sets the mode.

### Warning

_Related_
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import PatternsExplorerModal from '../block-patterns-explorer';
import MobileTabNavigation from '../mobile-tab-navigation';
import { PatternCategoryPreviews } from './pattern-category-previews';
import { usePatternCategories } from './use-pattern-categories';
import { useZoomOut } from '../../../hooks/use-zoom-out';

function BlockPatternsTab( {
onSelectCategory,
Expand All @@ -33,6 +34,11 @@ function BlockPatternsTab( {

const initialCategory = selectedCategory || categories[ 0 ];
const isMobile = useViewportMatch( 'medium', '<' );

// Move to zoom out mode when this component is mounted
// and back to the previous mode when unmounted.
useZoomOut();

return (
<>
{ ! isMobile && (
Expand Down
1 change: 1 addition & 0 deletions packages/block-editor/src/hooks/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,4 @@ export { getSpacingClassesAndStyles } from './use-spacing-props';
export { getTypographyClassesAndStyles } from './use-typography-props';
export { getGapCSSValue } from './gap';
export { useCachedTruthy } from './use-cached-truthy';
export { useZoomOut } from './use-zoom-out';
47 changes: 47 additions & 0 deletions packages/block-editor/src/hooks/use-zoom-out.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/**
* WordPress dependencies
*/
import { useSelect, useDispatch } from '@wordpress/data';
import { useEffect, useRef } from '@wordpress/element';

/**
* Internal dependencies
*/
import { store as blockEditorStore } from '../store';

/**
* A hook used to set the editor mode to zoomed out mode, invoking the hook sets the mode.
*/
export function useZoomOut() {
const { __unstableSetEditorMode } = useDispatch( blockEditorStore );
const { mode } = useSelect( ( select ) => {
return {
mode: select( blockEditorStore ).__unstableGetEditorMode(),
};
}, [] );

const shouldRevertInitialMode = useRef( null );
useEffect( () => {
// ignore changes to zoom-out mode as we explictily change to it on mount.
if ( mode !== 'zoom-out' ) {
shouldRevertInitialMode.current = false;
}
}, [ mode ] );

// Intentionality left without any dependency.
// This effect should only run the first time the component is rendered.
// The effect opens the zoom-out view if it is not open before when applying a style variation.
useEffect( () => {
if ( mode !== 'zoom-out' ) {
__unstableSetEditorMode( 'zoom-out' );
shouldRevertInitialMode.current = true;
return () => {
// if there were not mode changes revert to the initial mode when unmounting.
if ( shouldRevertInitialMode.current ) {
__unstableSetEditorMode( mode );
}
};
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [] );
}
1 change: 1 addition & 0 deletions packages/block-editor/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export {
getGapCSSValue as __experimentalGetGapCSSValue,
getShadowClassesAndStyles as __experimentalGetShadowClassesAndStyles,
useCachedTruthy,
useZoomOut,
} from './hooks';
export * from './components';
export * from './elements';
Expand Down
23 changes: 14 additions & 9 deletions packages/block-library/src/template-part/edit/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/**
* WordPress dependencies
*/
import { serialize } from '@wordpress/blocks';
import { useSelect, useDispatch } from '@wordpress/data';
import {
BlockSettingsMenuControls,
Expand Down Expand Up @@ -94,6 +95,7 @@ export default function TemplatePartEdit( {
clientId,
} ) {
const { createSuccessNotice } = useDispatch( noticesStore );
const { editEntityRecord } = useDispatch( coreStore );
const currentTheme = useSelect(
( select ) => select( coreStore ).getCurrentTheme()?.stylesheet,
[]
Expand Down Expand Up @@ -196,12 +198,17 @@ export default function TemplatePartEdit( {
mapTemplatePartToBlockPattern( templatePart )
);

const onTemplatePartSelect = ( templatePart ) => {
setAttributes( {
slug: templatePart.slug,
theme: templatePart.theme,
area: undefined,
} );
const onTemplatePartSelect = async ( templatePart ) => {
await editEntityRecord(
'postType',
'wp_template_part',
templatePartId,
{
blocks: templatePart.blocks,
content: serialize( templatePart.blocks ),
}
);

createSuccessNotice(
sprintf(
/* translators: %s: template part title. */
Expand Down Expand Up @@ -276,9 +283,7 @@ export default function TemplatePartEdit( {
<TemplatesList
availableTemplates={ partsAsPatterns }
onSelect={ ( pattern ) => {
onTemplatePartSelect(
pattern.templatePart
);
onTemplatePartSelect( pattern );
} }
/>
<TemplatesList
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
/**
* WordPress dependencies
*/
import { serialize } from '@wordpress/blocks';
import { useMemo, useState } from '@wordpress/element';
import { __, sprintf } from '@wordpress/i18n';
import { store as noticesStore } from '@wordpress/notices';
import { useDispatch } from '@wordpress/data';
import { useAsyncList } from '@wordpress/compose';
import { store as coreStore } from '@wordpress/core-data';
import { __experimentalBlockPatternsList as BlockPatternsList } from '@wordpress/block-editor';
import {
SearchControl,
Expand Down Expand Up @@ -52,13 +54,19 @@ export default function TemplatePartSelectionModal( {
const shownBlockPatterns = useAsyncList( filteredBlockPatterns );

const { createSuccessNotice } = useDispatch( noticesStore );
const { editEntityRecord } = useDispatch( coreStore );

const onTemplatePartSelect = async ( templatePart ) => {
await editEntityRecord(
'postType',
'wp_template_part',
templatePartId,
{
blocks: templatePart.blocks,
content: serialize( templatePart.blocks ),
}
);

const onTemplatePartSelect = ( templatePart ) => {
setAttributes( {
slug: templatePart.slug,
theme: templatePart.theme,
area: undefined,
} );
createSuccessNotice(
sprintf(
/* translators: %s: template part title. */
Expand Down Expand Up @@ -98,7 +106,7 @@ export default function TemplatePartSelectionModal( {
blockPatterns={ filteredTemplateParts }
shownPatterns={ shownTemplateParts }
onClickPattern={ ( pattern ) => {
onTemplatePartSelect( pattern.templatePart );
onTemplatePartSelect( pattern );
} }
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
*/
import { Card, CardBody } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import { store as blockEditorStore } from '@wordpress/block-editor';
import { useEffect, useRef } from '@wordpress/element';
import { useSelect, useDispatch } from '@wordpress/data';
import { useZoomOut } from '@wordpress/block-editor';

/**
* Internal dependencies
Expand All @@ -14,38 +12,9 @@ import ScreenHeader from './header';
import StyleVariationsContainer from './style-variations-container';

function ScreenStyleVariations() {
const { mode } = useSelect( ( select ) => {
return {
mode: select( blockEditorStore ).__unstableGetEditorMode(),
};
}, [] );

const shouldRevertInitialMode = useRef( null );
useEffect( () => {
// ignore changes to zoom-out mode as we explictily change to it on mount.
if ( mode !== 'zoom-out' ) {
shouldRevertInitialMode.current = false;
}
}, [ mode ] );

// Intentionality left without any dependency.
// This effect should only run the first time the component is rendered.
// The effect opens the zoom-out view if it is not open before when applying a style variation.
useEffect( () => {
if ( mode !== 'zoom-out' ) {
__unstableSetEditorMode( 'zoom-out' );
shouldRevertInitialMode.current = true;
return () => {
// if there were not mode changes revert to the initial mode when unmounting.
if ( shouldRevertInitialMode.current ) {
__unstableSetEditorMode( mode );
}
};
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [] );

const { __unstableSetEditorMode } = useDispatch( blockEditorStore );
// Move to zoom out mode when this component is mounted
// and back to the previous mode when unmounted.
useZoomOut();

return (
<>
Expand Down
Loading