@gechiui/block-editor
Version:
223 lines (208 loc) • 5.5 kB
JavaScript
/**
* GeChiUI dependencies
*/
import { useState, useCallback, useMemo } from '@gechiui/element';
import { VisuallyHidden, SearchControl } from '@gechiui/components';
import { __ } from '@gechiui/i18n';
import { useSelect } from '@gechiui/data';
/**
* Internal dependencies
*/
import Tips from './tips';
import InserterPreviewPanel from './preview-panel';
import BlockTypesTab from './block-types-tab';
import BlockPatternsTabs from './block-patterns-tab';
import ReusableBlocksTab from './reusable-blocks-tab';
import InserterSearchResults from './search-results';
import useInsertionPoint from './hooks/use-insertion-point';
import InserterTabs from './tabs';
import { store as blockEditorStore } from '../../store';
function InserterMenu( {
rootClientId,
clientId,
isAppender,
__experimentalInsertionIndex,
onSelect,
showInserterHelpPanel,
showMostUsedBlocks,
__experimentalFilterValue = '',
shouldFocusBlock = true,
} ) {
const [ filterValue, setFilterValue ] = useState(
__experimentalFilterValue
);
const [ hoveredItem, setHoveredItem ] = useState( null );
const [ selectedPatternCategory, setSelectedPatternCategory ] = useState(
null
);
const [
destinationRootClientId,
onInsertBlocks,
onToggleInsertionPoint,
] = useInsertionPoint( {
rootClientId,
clientId,
isAppender,
insertionIndex: __experimentalInsertionIndex,
shouldFocusBlock,
} );
const { showPatterns, hasReusableBlocks } = useSelect(
( select ) => {
const { __experimentalGetAllowedPatterns, getSettings } = select(
blockEditorStore
);
return {
showPatterns: !! __experimentalGetAllowedPatterns(
destinationRootClientId
).length,
hasReusableBlocks: !! getSettings().__experimentalReusableBlocks
?.length,
};
},
[ destinationRootClientId ]
);
const onInsert = useCallback(
( blocks, meta, shouldForceFocusBlock ) => {
onInsertBlocks( blocks, meta, shouldForceFocusBlock );
onSelect();
},
[ onInsertBlocks, onSelect ]
);
const onInsertPattern = useCallback(
( blocks, patternName ) => {
onInsertBlocks( blocks, { patternName } );
onSelect();
},
[ onInsertBlocks, onSelect ]
);
const onHover = useCallback(
( item ) => {
onToggleInsertionPoint( !! item );
setHoveredItem( item );
},
[ onToggleInsertionPoint, setHoveredItem ]
);
const onClickPatternCategory = useCallback(
( patternCategory ) => {
setSelectedPatternCategory( patternCategory );
},
[ setSelectedPatternCategory ]
);
const blocksTab = useMemo(
() => (
<>
<div className="block-editor-inserter__block-list">
<BlockTypesTab
rootClientId={ destinationRootClientId }
onInsert={ onInsert }
onHover={ onHover }
showMostUsedBlocks={ showMostUsedBlocks }
/>
</div>
{ showInserterHelpPanel && (
<div className="block-editor-inserter__tips">
<VisuallyHidden as="h2">
{ __( '使用区块编辑器的提示' ) }
</VisuallyHidden>
<Tips />
</div>
) }
</>
),
[
destinationRootClientId,
onInsert,
onHover,
filterValue,
showMostUsedBlocks,
showInserterHelpPanel,
]
);
const patternsTab = useMemo(
() => (
<BlockPatternsTabs
rootClientId={ destinationRootClientId }
onInsert={ onInsertPattern }
onClickCategory={ onClickPatternCategory }
selectedCategory={ selectedPatternCategory }
/>
),
[
destinationRootClientId,
onInsertPattern,
onClickPatternCategory,
selectedPatternCategory,
]
);
const reusableBlocksTab = useMemo(
() => (
<ReusableBlocksTab
rootClientId={ destinationRootClientId }
onInsert={ onInsert }
onHover={ onHover }
/>
),
[ destinationRootClientId, onInsert, onHover ]
);
const getCurrentTab = useCallback(
( tab ) => {
if ( tab.name === 'blocks' ) {
return blocksTab;
} else if ( tab.name === 'patterns' ) {
return patternsTab;
}
return reusableBlocksTab;
},
[ blocksTab, patternsTab, reusableBlocksTab ]
);
return (
<div className="block-editor-inserter__menu">
<div className="block-editor-inserter__main-area">
{ /* the following div is necessary to fix the sticky position of the search form */ }
<div className="block-editor-inserter__content">
<SearchControl
className="block-editor-inserter__search"
onChange={ ( value ) => {
if ( hoveredItem ) setHoveredItem( null );
setFilterValue( value );
} }
value={ filterValue }
label={ __( '搜索区块和区块样板' ) }
placeholder={ __( '搜索' ) }
/>
{ !! filterValue && (
<InserterSearchResults
filterValue={ filterValue }
onSelect={ onSelect }
onHover={ onHover }
rootClientId={ rootClientId }
clientId={ clientId }
isAppender={ isAppender }
__experimentalInsertionIndex={
__experimentalInsertionIndex
}
showBlockDirectory
shouldFocusBlock={ shouldFocusBlock }
/>
) }
{ ! filterValue && ( showPatterns || hasReusableBlocks ) && (
<InserterTabs
showPatterns={ showPatterns }
showReusableBlocks={ hasReusableBlocks }
>
{ getCurrentTab }
</InserterTabs>
) }
{ ! filterValue &&
! showPatterns &&
! hasReusableBlocks &&
blocksTab }
</div>
</div>
{ showInserterHelpPanel && hoveredItem && (
<InserterPreviewPanel item={ hoveredItem } />
) }
</div>
);
}
export default InserterMenu;