diff --git a/packages/editor/src/components/post-actions/actions.js b/packages/editor/src/components/post-actions/actions.js index 490bab2cc2fa4b..fcad5b97a13002 100644 --- a/packages/editor/src/components/post-actions/actions.js +++ b/packages/editor/src/components/post-actions/actions.js @@ -9,7 +9,6 @@ import { store as coreStore } from '@wordpress/core-data'; import { __, sprintf, _x } from '@wordpress/i18n'; import { store as noticesStore } from '@wordpress/notices'; import { useMemo, useState, useEffect } from '@wordpress/element'; -import { privateApis as patternsPrivateApis } from '@wordpress/patterns'; import { parse } from '@wordpress/blocks'; import { DataForm } from '@wordpress/dataviews'; import { @@ -31,10 +30,6 @@ import { unlock } from '../../lock-unlock'; import { CreateTemplatePartModalContents } from '../create-template-part-modal'; import { getItemTitle } from '../../dataviews/actions/utils'; -// Patterns. -const { CreatePatternModalContents, useDuplicatePatternProps } = - unlock( patternsPrivateApis ); - // TODO: this should be shared with other components (see post-fields in edit-site). const fields = [ { @@ -268,27 +263,6 @@ const useDuplicatePostAction = ( postType ) => { ); }; -export const duplicatePatternAction = { - id: 'duplicate-pattern', - label: _x( 'Duplicate', 'action label' ), - isEligible: ( item ) => item.type !== TEMPLATE_PART_POST_TYPE, - modalHeader: _x( 'Duplicate pattern', 'action label' ), - RenderModal: ( { items, closeModal } ) => { - const [ item ] = items; - const duplicatedProps = useDuplicatePatternProps( { - pattern: item, - onSuccess: () => closeModal(), - } ); - return ( - - ); - }, -}; - export const duplicateTemplatePartAction = { id: 'duplicate-template-part', label: _x( 'Duplicate', 'action label' ), @@ -383,7 +357,6 @@ export function usePostActions( { postType, onActionPerformed, context } ) { isTemplateOrTemplatePart && userCanCreatePostType && duplicateTemplatePartAction, - isPattern && userCanCreatePostType && duplicatePatternAction, ...defaultActions, ].filter( Boolean ); // Filter actions based on provided context. If not provided diff --git a/packages/editor/src/dataviews/actions/duplicate-pattern.tsx b/packages/editor/src/dataviews/actions/duplicate-pattern.tsx new file mode 100644 index 00000000000000..98f43a27c3628c --- /dev/null +++ b/packages/editor/src/dataviews/actions/duplicate-pattern.tsx @@ -0,0 +1,40 @@ +/** + * WordPress dependencies + */ +import { _x } from '@wordpress/i18n'; +// @ts-ignore +import { privateApis as patternsPrivateApis } from '@wordpress/patterns'; +import type { Action } from '@wordpress/dataviews'; + +/** + * Internal dependencies + */ +import { unlock } from '../../lock-unlock'; +import type { Pattern } from '../types'; + +// Patterns. +const { CreatePatternModalContents, useDuplicatePatternProps } = + unlock( patternsPrivateApis ); + +const duplicatePattern: Action< Pattern > = { + id: 'duplicate-pattern', + label: _x( 'Duplicate', 'action label' ), + isEligible: ( item ) => item.type !== 'wp_template_part', + modalHeader: _x( 'Duplicate pattern', 'action label' ), + RenderModal: ( { items, closeModal } ) => { + const [ item ] = items; + const duplicatedProps = useDuplicatePatternProps( { + pattern: item, + onSuccess: () => closeModal?.(), + } ); + return ( + + ); + }, +}; + +export default duplicatePattern; diff --git a/packages/editor/src/dataviews/store/private-actions.ts b/packages/editor/src/dataviews/store/private-actions.ts index a8b1573a528b50..6854c29bb0c4e4 100644 --- a/packages/editor/src/dataviews/store/private-actions.ts +++ b/packages/editor/src/dataviews/store/private-actions.ts @@ -9,6 +9,7 @@ import { doAction } from '@wordpress/hooks'; * Internal dependencies */ import deletePost from '../actions/delete-post'; +import duplicatePattern from '../actions/duplicate-pattern'; import exportPattern from '../actions/export-pattern'; import resetPost from '../actions/reset-post'; import trashPost from '../actions/trash-post'; @@ -74,7 +75,17 @@ export const registerPostTypeActions = .resolveSelect( coreStore ) .getPostType( postType ) ) as PostType; + const canCreate = await registry + .resolveSelect( coreStore ) + .canUser( 'create', { + kind: 'postType', + name: postType, + } ); + const actions = [ + canCreate && postTypeConfig.slug === 'wp_block' + ? duplicatePattern + : undefined, postTypeConfig.supports?.title ? renamePost : undefined, postTypeConfig?.supports?.[ 'page-attributes' ] ? reorderPage