@gechiui/block-editor
Version:
138 lines (129 loc) • 3.47 kB
JavaScript
/**
* GeChiUI dependencies
*/
import { __ } from '@gechiui/i18n';
import { useState } from '@gechiui/element';
import { useInstanceId } from '@gechiui/compose';
import { chevronRight } from '@gechiui/icons';
import {
MenuGroup,
MenuItem,
Popover,
VisuallyHidden,
__unstableComposite as Composite,
__unstableUseCompositeState as useCompositeState,
__unstableCompositeItem as CompositeItem,
} from '@gechiui/components';
/**
* Internal dependencies
*/
import BlockPreview from '../block-preview';
import useTransformedPatterns from './use-transformed-patterns';
function PatternTransformationsMenu( {
blocks,
patterns: statePatterns,
onSelect,
} ) {
const [ showTransforms, setShowTransforms ] = useState( false );
const patterns = useTransformedPatterns( statePatterns, blocks );
if ( ! patterns.length ) return null;
return (
<MenuGroup className="block-editor-block-switcher__pattern__transforms__menugroup">
{ showTransforms && (
<PreviewPatternsPopover
patterns={ patterns }
onSelect={ onSelect }
/>
) }
<MenuItem
onClick={ ( event ) => {
event.preventDefault();
setShowTransforms( ! showTransforms );
} }
icon={ chevronRight }
>
{ __( '样板' ) }
</MenuItem>
</MenuGroup>
);
}
function PreviewPatternsPopover( { patterns, onSelect } ) {
return (
<div className="block-editor-block-switcher__popover__preview__parent">
<div className="block-editor-block-switcher__popover__preview__container">
<Popover
className="block-editor-block-switcher__preview__popover"
position="bottom right"
>
<div className="block-editor-block-switcher__preview">
<div className="block-editor-block-switcher__preview-title">
{ __( '预览' ) }
</div>
<BlockPatternsList
patterns={ patterns }
onSelect={ onSelect }
/>
</div>
</Popover>
</div>
</div>
);
}
function BlockPatternsList( { patterns, onSelect } ) {
const composite = useCompositeState();
return (
<Composite
{ ...composite }
role="listbox"
className="block-editor-block-switcher__preview-patterns-container"
aria-label={ __( '区块样板列表' ) }
>
{ patterns.map( ( pattern ) => (
<BlockPattern
key={ pattern.name }
pattern={ pattern }
onSelect={ onSelect }
composite={ composite }
/>
) ) }
</Composite>
);
}
function BlockPattern( { pattern, onSelect, composite } ) {
// TODO check pattern/preview width...
const baseClassName =
'block-editor-block-switcher__preview-patterns-container';
const descriptionId = useInstanceId(
BlockPattern,
`${ baseClassName }-list__item-description`
);
return (
<div
className={ `${ baseClassName }-list__list-item` }
aria-label={ pattern.title }
aria-describedby={ pattern.description ? descriptionId : undefined }
>
<CompositeItem
role="option"
as="div"
{ ...composite }
className={ `${ baseClassName }-list__item` }
onClick={ () => onSelect( pattern.transformedBlocks ) }
>
<BlockPreview
blocks={ pattern.transformedBlocks }
viewportWidth={ pattern.viewportWidth || 500 }
/>
<div className={ `${ baseClassName }-list__item-title` }>
{ pattern.title }
</div>
</CompositeItem>
{ !! pattern.description && (
<VisuallyHidden id={ descriptionId }>
{ pattern.description }
</VisuallyHidden>
) }
</div>
);
}
export default PatternTransformationsMenu;