UNPKG

@wordpress/block-library

Version:
80 lines (68 loc) 2.31 kB
/** * 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 menu). __( '%s menu' ), area ) : // translators: 'menu' as in website navigation menu. __( 'Menu' ); // Determine how many menus start with the automatic title. const matchingMenuTitleCount = [ ...draftNavigationMenus, ...navigationMenus, ].reduce( ( count, menu ) => 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, registry ] ); }