diff --git a/packages/edit-site/src/components/page-patterns/index.js b/packages/edit-site/src/components/page-patterns/index.js index 66d2d25a4b8f04..be3bb7429c32f9 100644 --- a/packages/edit-site/src/components/page-patterns/index.js +++ b/packages/edit-site/src/components/page-patterns/index.js @@ -23,7 +23,7 @@ import { } from '../../utils/constants'; import usePatternSettings from './use-pattern-settings'; import { unlock } from '../../lock-unlock'; -import usePatterns from './use-patterns'; +import usePatterns, { useAugmentPatternsWithPermissions } from './use-patterns'; import PatternsHeader from './header'; import { useEditPostAction } from '../dataviews-actions'; import { @@ -136,6 +136,8 @@ export default function DataviewsPatterns() { return filterSortAndPaginate( patterns, viewWithoutFilters, fields ); }, [ patterns, view, fields, type ] ); + const dataWithPermissions = useAugmentPatternsWithPermissions( data ); + const templatePartActions = usePostActions( { postType: TEMPLATE_PART_POST_TYPE, context: 'list', @@ -175,7 +177,7 @@ export default function DataviewsPatterns() { paginationInfo={ paginationInfo } fields={ fields } actions={ actions } - data={ data || EMPTY_ARRAY } + data={ dataWithPermissions || EMPTY_ARRAY } getItemId={ ( item ) => item.name ?? item.id } isLoading={ isResolving } view={ view } diff --git a/packages/edit-site/src/components/page-patterns/use-patterns.js b/packages/edit-site/src/components/page-patterns/use-patterns.js index 2947088bb19b5f..f32e278e6354f5 100644 --- a/packages/edit-site/src/components/page-patterns/use-patterns.js +++ b/packages/edit-site/src/components/page-patterns/use-patterns.js @@ -256,12 +256,44 @@ const selectUserPatterns = createSelector( ] ); +export function useAugmentPatternsWithPermissions( patterns ) { + const idsAndTypes = useMemo( + () => + patterns + ?.filter( ( record ) => record.type !== PATTERN_TYPES.theme ) + .map( ( record ) => [ record.type, record.id ] ) ?? [], + [ patterns ] + ); + + const permissions = useSelect( + ( select ) => { + const { getEntityRecordPermissions } = unlock( + select( coreStore ) + ); + return idsAndTypes.reduce( ( acc, [ type, id ] ) => { + acc[ id ] = getEntityRecordPermissions( 'postType', type, id ); + return acc; + }, {} ); + }, + [ idsAndTypes ] + ); + + return useMemo( + () => + patterns?.map( ( record ) => ( { + ...record, + permissions: permissions?.[ record.id ] ?? {}, + } ) ) ?? [], + [ patterns, permissions ] + ); +} + export const usePatterns = ( postType, categoryId, { search = '', syncStatus } = {} ) => { - const { patterns, ...rest } = useSelect( + return useSelect( ( select ) => { if ( postType === TEMPLATE_PART_POST_TYPE ) { return selectTemplateParts( select, categoryId, search ); @@ -284,35 +316,6 @@ export const usePatterns = ( }, [ categoryId, postType, search, syncStatus ] ); - - const ids = useMemo( - () => patterns?.map( ( record ) => record.id ) ?? [], - [ patterns ] - ); - - const permissions = useSelect( - ( select ) => { - const { getEntityRecordsPermissions } = unlock( - select( coreStore ) - ); - return getEntityRecordsPermissions( 'postType', postType, ids ); - }, - [ ids, postType ] - ); - - const patternsWithPermissions = useMemo( - () => - patterns?.map( ( record, index ) => ( { - ...record, - permissions: permissions[ index ], - } ) ) ?? [], - [ patterns, permissions ] - ); - - return { - ...rest, - patterns: patternsWithPermissions, - }; }; export default usePatterns;