UNPKG

@wordpress/block-editor

Version:
197 lines (192 loc) 7.63 kB
import { createElement, Fragment } from "@wordpress/element"; /** * External dependencies */ import classnames from 'classnames'; /** * WordPress dependencies */ import { forwardRef, useState, useCallback, useMemo, useImperativeHandle, useRef } from '@wordpress/element'; import { VisuallyHidden, SearchControl } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import { useSelect } from '@wordpress/data'; /** * Internal dependencies */ import Tips from './tips'; import InserterPreviewPanel from './preview-panel'; import BlockTypesTab from './block-types-tab'; import BlockPatternsTabs, { BlockPatternsCategoryDialog } from './block-patterns-tab'; import ReusableBlocksTab from './reusable-blocks-tab'; import { MediaTab, MediaCategoryDialog, useMediaCategories } from './media-tab'; import InserterSearchResults from './search-results'; import useDebouncedInput from './hooks/use-debounced-input'; 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, prioritizePatterns }, ref) { const [filterValue, setFilterValue, delayedFilterValue] = useDebouncedInput(__experimentalFilterValue); const [hoveredItem, setHoveredItem] = useState(null); const [selectedPatternCategory, setSelectedPatternCategory] = useState(null); const [selectedMediaCategory, setSelectedMediaCategory] = useState(null); const [selectedTab, setSelectedTab] = useState(null); const [destinationRootClientId, onInsertBlocks, onToggleInsertionPoint] = useInsertionPoint({ rootClientId, clientId, isAppender, insertionIndex: __experimentalInsertionIndex, shouldFocusBlock }); const { showPatterns, inserterItems } = useSelect(select => { const { __experimentalGetAllowedPatterns, getInserterItems } = select(blockEditorStore); return { showPatterns: !!__experimentalGetAllowedPatterns(destinationRootClientId).length, inserterItems: getInserterItems(destinationRootClientId) }; }, [destinationRootClientId]); const hasReusableBlocks = useMemo(() => { return inserterItems.some(({ category }) => category === 'reusable'); }, [inserterItems]); const mediaCategories = useMediaCategories(destinationRootClientId); const showMedia = !!mediaCategories.length; 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 onHoverPattern = useCallback(item => { onToggleInsertionPoint(!!item); }, [onToggleInsertionPoint]); const onClickPatternCategory = useCallback(patternCategory => { setSelectedPatternCategory(patternCategory); }, [setSelectedPatternCategory]); const blocksTab = useMemo(() => createElement(Fragment, null, createElement("div", { className: "block-editor-inserter__block-list" }, createElement(BlockTypesTab, { rootClientId: destinationRootClientId, onInsert: onInsert, onHover: onHover, showMostUsedBlocks: showMostUsedBlocks })), showInserterHelpPanel && createElement("div", { className: "block-editor-inserter__tips" }, createElement(VisuallyHidden, { as: "h2" }, __('A tip for using the block editor')), createElement(Tips, null))), [destinationRootClientId, onInsert, onHover, showMostUsedBlocks, showInserterHelpPanel]); const patternsTab = useMemo(() => createElement(BlockPatternsTabs, { rootClientId: destinationRootClientId, onInsert: onInsertPattern, onSelectCategory: onClickPatternCategory, selectedCategory: selectedPatternCategory }), [destinationRootClientId, onInsertPattern, onClickPatternCategory, selectedPatternCategory]); const reusableBlocksTab = useMemo(() => createElement(ReusableBlocksTab, { rootClientId: destinationRootClientId, onInsert: onInsert, onHover: onHover }), [destinationRootClientId, onInsert, onHover]); const mediaTab = useMemo(() => createElement(MediaTab, { rootClientId: destinationRootClientId, selectedCategory: selectedMediaCategory, onSelectCategory: setSelectedMediaCategory, onInsert: onInsert }), [destinationRootClientId, onInsert, selectedMediaCategory, setSelectedMediaCategory]); const getCurrentTab = useCallback(tab => { if (tab.name === 'blocks') { return blocksTab; } else if (tab.name === 'patterns') { return patternsTab; } else if (tab.name === 'reusable') { return reusableBlocksTab; } else if (tab.name === 'media') { return mediaTab; } }, [blocksTab, patternsTab, reusableBlocksTab, mediaTab]); const searchRef = useRef(); useImperativeHandle(ref, () => ({ focusSearch: () => { searchRef.current.focus(); } })); const showPatternPanel = selectedTab === 'patterns' && !delayedFilterValue && selectedPatternCategory; const showAsTabs = !delayedFilterValue && (showPatterns || hasReusableBlocks || showMedia); const showMediaPanel = selectedTab === 'media' && !delayedFilterValue && selectedMediaCategory; return createElement("div", { className: "block-editor-inserter__menu" }, createElement("div", { className: classnames('block-editor-inserter__main-area', { 'show-as-tabs': showAsTabs }) }, createElement(SearchControl, { __nextHasNoMarginBottom: true, className: "block-editor-inserter__search", onChange: value => { if (hoveredItem) setHoveredItem(null); setFilterValue(value); }, value: filterValue, label: __('Search for blocks and patterns'), placeholder: __('Search'), ref: searchRef }), !!delayedFilterValue && createElement("div", { className: "block-editor-inserter__no-tab-container" }, createElement(InserterSearchResults, { filterValue: delayedFilterValue, onSelect: onSelect, onHover: onHover, rootClientId: rootClientId, clientId: clientId, isAppender: isAppender, __experimentalInsertionIndex: __experimentalInsertionIndex, showBlockDirectory: true, shouldFocusBlock: shouldFocusBlock })), showAsTabs && createElement(InserterTabs, { showPatterns: showPatterns, showReusableBlocks: hasReusableBlocks, showMedia: showMedia, prioritizePatterns: prioritizePatterns, onSelect: setSelectedTab }, getCurrentTab), !delayedFilterValue && !showAsTabs && createElement("div", { className: "block-editor-inserter__no-tab-container" }, blocksTab)), showMediaPanel && createElement(MediaCategoryDialog, { rootClientId: destinationRootClientId, onInsert: onInsert, category: selectedMediaCategory }), showInserterHelpPanel && hoveredItem && createElement(InserterPreviewPanel, { item: hoveredItem }), showPatternPanel && createElement(BlockPatternsCategoryDialog, { rootClientId: destinationRootClientId, onInsert: onInsertPattern, onHover: onHoverPattern, category: selectedPatternCategory, showTitlesAsTooltip: true })); } export default forwardRef(InserterMenu); //# sourceMappingURL=menu.js.map