@wordpress/block-library
Version:
Block library for the WordPress editor.
121 lines (120 loc) • 3.59 kB
JavaScript
// 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