UNPKG

@wordpress/block-library

Version:
126 lines (107 loc) 3.24 kB
/** * WordPress dependencies */ import { store as coreStore, useResourcePermissions, } from '@wordpress/core-data'; import { useSelect } from '@wordpress/data'; export default function useNavigationMenu( ref ) { const permissions = useResourcePermissions( 'navigation', ref ); return useSelect( ( select ) => { const { canCreate, canUpdate, canDelete, isResolving, hasResolved, } = permissions; const { navigationMenus, isResolvingNavigationMenus, hasResolvedNavigationMenus, } = selectNavigationMenus( select, ref ); const { navigationMenu, isNavigationMenuResolved, isNavigationMenuMissing, } = selectExistingMenu( select, ref ); return { navigationMenus, isResolvingNavigationMenus, hasResolvedNavigationMenus, navigationMenu, isNavigationMenuResolved, isNavigationMenuMissing, canSwitchNavigationMenu: ref ? navigationMenus?.length > 1 : navigationMenus?.length > 0, canUserCreateNavigationMenu: canCreate, isResolvingCanUserCreateNavigationMenu: isResolving, hasResolvedCanUserCreateNavigationMenu: hasResolved, canUserUpdateNavigationMenu: canUpdate, hasResolvedCanUserUpdateNavigationMenu: ref ? hasResolved : undefined, canUserDeleteNavigationMenu: canDelete, hasResolvedCanUserDeleteNavigationMenu: ref ? hasResolved : undefined, }; }, [ ref, permissions ] ); } function selectNavigationMenus( select ) { const { getEntityRecords, hasFinishedResolution, isResolving } = select( coreStore ); const args = [ 'postType', 'wp_navigation', { per_page: -1, status: [ 'publish', 'draft' ] }, ]; return { navigationMenus: getEntityRecords( ...args ), isResolvingNavigationMenus: isResolving( 'getEntityRecords', args ), hasResolvedNavigationMenus: hasFinishedResolution( 'getEntityRecords', args ), }; } function selectExistingMenu( select, ref ) { if ( ! ref ) { return { isNavigationMenuResolved: false, isNavigationMenuMissing: true, }; } const { getEntityRecord, getEditedEntityRecord, hasFinishedResolution } = select( coreStore ); const args = [ 'postType', 'wp_navigation', ref ]; const navigationMenu = getEntityRecord( ...args ); const editedNavigationMenu = getEditedEntityRecord( ...args ); const hasResolvedNavigationMenu = hasFinishedResolution( 'getEditedEntityRecord', args ); // Only published Navigation posts are considered valid. // Draft Navigation posts are valid only on the editor, // requiring a post update to publish to show in frontend. // To achieve that, index.php must reflect this validation only for published. const isNavigationMenuPublishedOrDraft = editedNavigationMenu.status === 'publish' || editedNavigationMenu.status === 'draft'; return { isNavigationMenuResolved: hasResolvedNavigationMenu, isNavigationMenuMissing: hasResolvedNavigationMenu && ( ! navigationMenu || ! isNavigationMenuPublishedOrDraft ), // getEditedEntityRecord will return the post regardless of status. // Therefore if the found post is not published then we should ignore it. navigationMenu: isNavigationMenuPublishedOrDraft ? editedNavigationMenu : null, }; }