UNPKG

@wordpress/block-editor

Version:
170 lines (166 loc) 7.13 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _element = require("@wordpress/element"); var _i18n = require("@wordpress/i18n"); var _components = require("@wordpress/components"); var _compose = require("@wordpress/compose"); var _a11y = require("@wordpress/a11y"); var _data = require("@wordpress/data"); var _blockTypesList = _interopRequireDefault(require("../block-types-list")); var _blockPatternsList = _interopRequireDefault(require("../block-patterns-list")); var _inserterMenuExtension = _interopRequireDefault(require("../inserter-menu-extension")); var _panel = _interopRequireDefault(require("./panel")); var _noResults = _interopRequireDefault(require("./no-results")); var _useInsertionPoint = _interopRequireDefault(require("./hooks/use-insertion-point")); var _usePatternsState = _interopRequireDefault(require("./hooks/use-patterns-state")); var _useBlockTypesState = _interopRequireDefault(require("./hooks/use-block-types-state")); var _searchItems = require("./search-items"); var _inserterListbox = _interopRequireDefault(require("../inserter-listbox")); var _sorting = require("../../utils/sorting"); var _orderInserterBlockItems = require("../../utils/order-inserter-block-items"); var _store = require("../../store"); var _jsxRuntime = require("react/jsx-runtime"); /** * WordPress dependencies */ /** * Internal dependencies */ const INITIAL_INSERTER_RESULTS = 9; /** * Shared reference to an empty array for cases where it is important to avoid * returning a new array reference on every invocation and rerendering the component. * * @type {Array} */ const EMPTY_ARRAY = []; function InserterSearchResults({ filterValue, onSelect, onHover, onHoverPattern, rootClientId, clientId, isAppender, __experimentalInsertionIndex, maxBlockPatterns, maxBlockTypes, showBlockDirectory = false, isDraggable = true, shouldFocusBlock = true, prioritizePatterns, selectBlockOnInsert, isQuick }) { const debouncedSpeak = (0, _compose.useDebounce)(_a11y.speak, 500); const { prioritizedBlocks } = (0, _data.useSelect)(select => { const blockListSettings = select(_store.store).getBlockListSettings(rootClientId); return { prioritizedBlocks: blockListSettings?.prioritizedInserterBlocks || EMPTY_ARRAY }; }, [rootClientId]); const [destinationRootClientId, onInsertBlocks] = (0, _useInsertionPoint.default)({ onSelect, rootClientId, clientId, isAppender, insertionIndex: __experimentalInsertionIndex, shouldFocusBlock, selectBlockOnInsert }); const [blockTypes, blockTypeCategories, blockTypeCollections, onSelectBlockType] = (0, _useBlockTypesState.default)(destinationRootClientId, onInsertBlocks, isQuick); const [patterns,, onClickPattern] = (0, _usePatternsState.default)(onInsertBlocks, destinationRootClientId, undefined, isQuick); const filteredBlockPatterns = (0, _element.useMemo)(() => { if (maxBlockPatterns === 0) { return []; } const results = (0, _searchItems.searchItems)(patterns, filterValue); return maxBlockPatterns !== undefined ? results.slice(0, maxBlockPatterns) : results; }, [filterValue, patterns, maxBlockPatterns]); let maxBlockTypesToShow = maxBlockTypes; if (prioritizePatterns && filteredBlockPatterns.length > 2) { maxBlockTypesToShow = 0; } const filteredBlockTypes = (0, _element.useMemo)(() => { if (maxBlockTypesToShow === 0) { return []; } const nonPatternBlockTypes = blockTypes.filter(blockType => blockType.name !== 'core/block'); let orderedItems = (0, _sorting.orderBy)(nonPatternBlockTypes, 'frecency', 'desc'); if (!filterValue && prioritizedBlocks.length) { orderedItems = (0, _orderInserterBlockItems.orderInserterBlockItems)(orderedItems, prioritizedBlocks); } const results = (0, _searchItems.searchBlockItems)(orderedItems, blockTypeCategories, blockTypeCollections, filterValue); return maxBlockTypesToShow !== undefined ? results.slice(0, maxBlockTypesToShow) : results; }, [filterValue, blockTypes, blockTypeCategories, blockTypeCollections, maxBlockTypesToShow, prioritizedBlocks]); // Announce search results on change. (0, _element.useEffect)(() => { if (!filterValue) { return; } const count = filteredBlockTypes.length + filteredBlockPatterns.length; const resultsFoundMessage = (0, _i18n.sprintf)(/* translators: %d: number of results. */ (0, _i18n._n)('%d result found.', '%d results found.', count), count); debouncedSpeak(resultsFoundMessage); }, [filterValue, debouncedSpeak, filteredBlockTypes, filteredBlockPatterns]); const currentShownBlockTypes = (0, _compose.useAsyncList)(filteredBlockTypes, { step: INITIAL_INSERTER_RESULTS }); const hasItems = filteredBlockTypes.length > 0 || filteredBlockPatterns.length > 0; const blocksUI = !!filteredBlockTypes.length && /*#__PURE__*/(0, _jsxRuntime.jsx)(_panel.default, { title: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.VisuallyHidden, { children: (0, _i18n.__)('Blocks') }), children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_blockTypesList.default, { items: currentShownBlockTypes, onSelect: onSelectBlockType, onHover: onHover, label: (0, _i18n.__)('Blocks'), isDraggable: isDraggable }) }); const patternsUI = !!filteredBlockPatterns.length && /*#__PURE__*/(0, _jsxRuntime.jsx)(_panel.default, { title: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.VisuallyHidden, { children: (0, _i18n.__)('Block patterns') }), children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: "block-editor-inserter__quick-inserter-patterns", children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_blockPatternsList.default, { blockPatterns: filteredBlockPatterns, onClickPattern: onClickPattern, onHover: onHoverPattern, isDraggable: isDraggable }) }) }); return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_inserterListbox.default, { children: [!showBlockDirectory && !hasItems && /*#__PURE__*/(0, _jsxRuntime.jsx)(_noResults.default, {}), prioritizePatterns ? patternsUI : blocksUI, !!filteredBlockTypes.length && !!filteredBlockPatterns.length && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: "block-editor-inserter__quick-inserter-separator" }), prioritizePatterns ? blocksUI : patternsUI, showBlockDirectory && /*#__PURE__*/(0, _jsxRuntime.jsx)(_inserterMenuExtension.default.Slot, { fillProps: { onSelect: onSelectBlockType, onHover, filterValue, hasItems, rootClientId: destinationRootClientId }, children: fills => { if (fills.length) { return fills; } if (!hasItems) { return /*#__PURE__*/(0, _jsxRuntime.jsx)(_noResults.default, {}); } return null; } })] }); } var _default = exports.default = InserterSearchResults; //# sourceMappingURL=search-results.js.map