@wordpress/block-library
Version:
Block library for the WordPress editor.
57 lines (51 loc) • 2.54 kB
JavaScript
/**
* WordPress dependencies
*/
import { Disabled } from '@wordpress/components';
import { store as coreStore } from '@wordpress/core-data';
import { useRegistry } from '@wordpress/data';
import { useContext, useCallback } from '@wordpress/element';
import { __, sprintf } from '@wordpress/i18n';
/**
* Internal dependencies
*/
import useTemplatePartAreaLabel from '../use-template-part-area-label';
const DRAFT_MENU_PARAMS = ['postType', 'wp_navigation', {
status: 'draft',
per_page: -1
}];
const PUBLISHED_MENU_PARAMS = ['postType', 'wp_navigation', {
per_page: -1,
status: 'publish'
}];
export default function useGenerateDefaultNavigationTitle(clientId) {
// The block will be disabled in a block preview, use this as a way of
// avoiding the side-effects of this component for block previews.
const isDisabled = useContext(Disabled.Context); // Because we can't conditionally call hooks, pass an undefined client id
// arg to bypass the expensive `useTemplateArea` code. The hook will return
// early.
const area = useTemplatePartAreaLabel(isDisabled ? undefined : clientId);
const registry = useRegistry();
return useCallback(async () => {
// Ensure other navigation menus have loaded so an
// accurate name can be created.
if (isDisabled) {
return '';
}
const {
getEntityRecords
} = registry.resolveSelect(coreStore);
const [draftNavigationMenus, navigationMenus] = await Promise.all([getEntityRecords(...DRAFT_MENU_PARAMS), getEntityRecords(...PUBLISHED_MENU_PARAMS)]);
const title = area ? sprintf( // translators: %s: the name of a menu (e.g. Header navigation).
__('%s navigation'), area) : // translators: 'navigation' as in website navigation.
__('Navigation'); // Determine how many menus start with the automatic title.
const matchingMenuTitleCount = [...draftNavigationMenus, ...navigationMenus].reduce((count, menu) => {
var _menu$title, _menu$title$raw;
return menu !== null && menu !== void 0 && (_menu$title = menu.title) !== null && _menu$title !== void 0 && (_menu$title$raw = _menu$title.raw) !== null && _menu$title$raw !== void 0 && _menu$title$raw.startsWith(title) ? count + 1 : count;
}, 0); // Append a number to the end of the title if a menu with
// the same name exists.
const titleWithCount = matchingMenuTitleCount > 0 ? `${title} ${matchingMenuTitleCount + 1}` : title;
return titleWithCount || '';
}, [isDisabled, area]);
}
//# sourceMappingURL=use-generate-default-navigation-title.js.map