@wordpress/block-library
Version:
Block library for the WordPress editor.
126 lines (107 loc) • 3.24 kB
JavaScript
/**
* 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,
};
}