UNPKG

@gechiui/block-editor

Version:
123 lines (113 loc) 3.42 kB
/** * GeChiUI dependencies */ import { useMemo, useEffect } from '@gechiui/element'; import { _n, sprintf } from '@gechiui/i18n'; import { useDebounce, useAsyncList } from '@gechiui/compose'; import { __experimentalHeading as Heading } from '@gechiui/components'; import { speak } from '@gechiui/a11y'; /** * Internal dependencies */ import BlockPatternsList from '../../block-patterns-list'; import InserterNoResults from '../no-results'; import useInsertionPoint from '../hooks/use-insertion-point'; import usePatternsState from '../hooks/use-patterns-state'; import InserterListbox from '../../inserter-listbox'; import { searchItems } from '../search-items'; const INITIAL_INSERTER_RESULTS = 2; function PatternsListHeader( { filterValue, filteredBlockPatternsLength } ) { if ( ! filterValue ) { return null; } return ( <Heading level={ 2 } lineHeight={ '48px' } className="block-editor-block-patterns-explorer__search-results-count" > { sprintf( /* translators: %d: number of patterns. %s: block pattern search query */ _n( '为“%2$s”找到了 %1$d 个模式', '%1$d patterns found for "%2$s"', filteredBlockPatternsLength ), filteredBlockPatternsLength, filterValue ) } </Heading> ); } function PatternList( { filterValue, selectedCategory, patternCategories } ) { const debouncedSpeak = useDebounce( speak, 500 ); const [ destinationRootClientId, onInsertBlocks ] = useInsertionPoint( { shouldFocusBlock: true, } ); const [ allPatterns, , onSelectBlockPattern ] = usePatternsState( onInsertBlocks, destinationRootClientId ); const registeredPatternCategories = useMemo( () => patternCategories.map( ( patternCategory ) => patternCategory.name ), [ patternCategories ] ); const filteredBlockPatterns = useMemo( () => { if ( ! filterValue ) { return allPatterns.filter( ( pattern ) => selectedCategory === 'uncategorized' ? ! pattern.categories?.length || pattern.categories.every( ( category ) => ! registeredPatternCategories.includes( category ) ) : pattern.categories?.includes( selectedCategory ) ); } return searchItems( allPatterns, filterValue ); }, [ filterValue, selectedCategory, allPatterns ] ); // Announce search results on change. useEffect( () => { if ( ! filterValue ) { return; } const count = filteredBlockPatterns.length; const resultsFoundMessage = sprintf( /* translators: %d: number of results. */ _n( '%d result found.', '%d results found.', count ), count ); debouncedSpeak( resultsFoundMessage ); }, [ filterValue, debouncedSpeak ] ); const currentShownPatterns = useAsyncList( filteredBlockPatterns, { step: INITIAL_INSERTER_RESULTS, } ); const hasItems = !! filteredBlockPatterns?.length; return ( <div className="block-editor-block-patterns-explorer__list"> { hasItems && ( <PatternsListHeader filterValue={ filterValue } filteredBlockPatternsLength={ filteredBlockPatterns.length } /> ) } <InserterListbox> { ! hasItems && <InserterNoResults /> } { hasItems && ( <BlockPatternsList shownPatterns={ currentShownPatterns } blockPatterns={ filteredBlockPatterns } onClickPattern={ onSelectBlockPattern } isDraggable={ false } /> ) } </InserterListbox> </div> ); } export default PatternList;