UNPKG

@wordpress/block-library

Version:
121 lines (120 loc) • 3.59 kB
// packages/block-library/src/navigation-link/shared/use-block-suggestions.js import { __, sprintf } from "@wordpress/i18n"; import { speak } from "@wordpress/a11y"; import { createElement, useCallback } from "@wordpress/element"; import { useDispatch, useSelect } from "@wordpress/data"; import { createBlock, createBlocksFromInnerBlocksTemplate } from "@wordpress/blocks"; import { BlockIcon, store as blockEditorStore, privateApis as blockEditorPrivateApis } from "@wordpress/block-editor"; import { unlock } from "../../lock-unlock.mjs"; var { searchItems, normalizeString } = unlock(blockEditorPrivateApis); var BLOCK_SUGGESTION_TYPE = "block"; function isBlockSuggestion(suggestion) { return suggestion?.type === BLOCK_SUGGESTION_TYPE && typeof suggestion.blockItemId === "string"; } var EXCLUDED_BLOCK_NAMES = ["core/navigation-link"]; var SEARCH_FIELDS = [ { get: (item) => item.title }, { get: (item) => item.keywords } ]; function addBlockSuggestions(suggestions, blockItems, searchTerm) { if (!searchTerm?.trim()) { return suggestions; } const matches = searchItems(blockItems, searchTerm, { fields: SEARCH_FIELDS, filter: (item) => !item.isDisabled && !EXCLUDED_BLOCK_NAMES.includes(item.name) }); if (!matches.length) { return suggestions; } const search = normalizeString(searchTerm.trim()); const before = []; const after = []; for (const item of matches) { const suggestion = { id: item.id, blockItemId: item.id, type: BLOCK_SUGGESTION_TYPE, title: item.title, icon: createElement(BlockIcon, { icon: item.icon }), typeLabel: __("Block") }; if (normalizeString(item.title).startsWith(search)) { before.push(suggestion); } else { after.push(suggestion); } } return [...before, ...suggestions, ...after]; } function useBlockSuggestions({ clientId, isEnabled, onBlockInsert, onClose }) { const { getBlockIndex, getBlockOrder, getBlockRootClientId, getInserterItems } = useSelect(blockEditorStore); const { insertBlock, replaceBlock } = useDispatch(blockEditorStore); const transformSuggestions = useCallback( (suggestions, { isInitialSuggestions, searchTerm }) => isInitialSuggestions ? suggestions : addBlockSuggestions( suggestions, getInserterItems(getBlockRootClientId(clientId)), searchTerm ), [clientId, getBlockRootClientId, getInserterItems] ); const insertBlockFromSuggestion = (itemId) => { const rootClientId = getBlockRootClientId(clientId); const item = getInserterItems(rootClientId).find( ({ id }) => id === itemId ); if (!item) { return; } const block = createBlock( item.name, item.initialAttributes, createBlocksFromInnerBlocksTemplate(item.innerBlocks) ); const index = getBlockIndex(clientId); if (onBlockInsert) { insertBlock(block, index, rootClientId, false); onBlockInsert(block); } else if (getBlockOrder(clientId).length) { insertBlock(block, index, rootClientId); onClose?.(); } else { replaceBlock(clientId, block); } speak( sprintf( /* translators: %s: The title of the block that was added. */ __("%s block added."), item.title ) ); }; return { transformSuggestions: isEnabled ? transformSuggestions : void 0, insertBlockFromSuggestion }; } export { BLOCK_SUGGESTION_TYPE, addBlockSuggestions, isBlockSuggestion, useBlockSuggestions }; //# sourceMappingURL=use-block-suggestions.mjs.map