From e0a2d10eaedd835e47bf4e1aad0c5a172d727896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zieli=C5=84ski?= Date: Tue, 16 Aug 2022 13:13:25 +0200 Subject: [PATCH 1/7] Stabilize the useResourcePermissions hook --- packages/block-library/src/navigation/use-navigation-menu.js | 2 +- packages/core-data/src/hooks/use-resource-permissions.ts | 2 +- packages/core-data/src/index.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/block-library/src/navigation/use-navigation-menu.js b/packages/block-library/src/navigation/use-navigation-menu.js index f4f0cd05686478..2c83295bb3e5a3 100644 --- a/packages/block-library/src/navigation/use-navigation-menu.js +++ b/packages/block-library/src/navigation/use-navigation-menu.js @@ -3,7 +3,7 @@ */ import { store as coreStore, - __experimentalUseResourcePermissions as useResourcePermissions, + useResourcePermissions, } from '@wordpress/core-data'; import { useSelect } from '@wordpress/data'; diff --git a/packages/core-data/src/hooks/use-resource-permissions.ts b/packages/core-data/src/hooks/use-resource-permissions.ts index a6b5ca8d1506bd..caac84c363153d 100644 --- a/packages/core-data/src/hooks/use-resource-permissions.ts +++ b/packages/core-data/src/hooks/use-resource-permissions.ts @@ -72,7 +72,7 @@ type ResourcePermissionsResolution< IdType > = [ * @return Entity records data. * @template IdType */ -export default function __experimentalUseResourcePermissions< IdType = void >( +export default function useResourcePermissions< IdType = void >( resource: string, id?: IdType ): ResourcePermissionsResolution< IdType > { diff --git a/packages/core-data/src/index.js b/packages/core-data/src/index.js index c73deb6b4d532d..6914f376d72e43 100644 --- a/packages/core-data/src/index.js +++ b/packages/core-data/src/index.js @@ -70,7 +70,7 @@ register( store ); export { default as EntityProvider } from './entity-provider'; export { default as useEntityRecord } from './hooks/use-entity-record'; export { default as useEntityRecords } from './hooks/use-entity-records'; -export { default as __experimentalUseResourcePermissions } from './hooks/use-resource-permissions'; +export { default as useResourcePermissions } from './hooks/use-resource-permissions'; export * from './entity-provider'; export * from './entity-types'; export * from './fetch'; From 01c84b97aa42f00cad0d10d21d1bcbcd247c4cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zieli=C5=84ski?= Date: Tue, 16 Aug 2022 14:00:59 +0200 Subject: [PATCH 2/7] Add useResourcePermissions to README.md --- packages/core-data/README.md | 41 +++++++++++++++++++++++++++ packages/core-data/src/hooks/index.ts | 1 + 2 files changed, 42 insertions(+) diff --git a/packages/core-data/README.md b/packages/core-data/README.md index 6ccdf605cc7774..2c0c2d400c587b 100644 --- a/packages/core-data/README.md +++ b/packages/core-data/README.md @@ -875,6 +875,47 @@ _Returns_ - `EntityRecordsResolution< RecordType >`: Entity records data. +### useResourcePermissions + +Resolves resource permissions. + +_Usage_ + +```js +import { useResourcePermissions } from '@wordpress/core-data'; + +function PagesList() { + const { canCreate, isResolving } = useResourcePermissions( 'pages' ); + + if ( isResolving ) { + return 'Loading ...'; + } + + return ( +
+ { canCreate ? : false } + // ... +
+ ); +} + +// Rendered in the application: +// +``` + +In the above example, when `PagesList` is rendered into an +application, the appropriate permissions and the resolution details will be retrieved from +the store state using `canUser()`, or resolved if missing. + +_Parameters_ + +- _resource_ `string`: The resource in question, e.g. media. +- _id_ `IdType`: ID of a specific resource entry, if needed, e.g. 10. + +_Returns_ + +- `ResourcePermissionsResolution< IdType >`: Entity records data. + ## Contributing to this package diff --git a/packages/core-data/src/hooks/index.ts b/packages/core-data/src/hooks/index.ts index ea1aa1c49c9b99..5df801641b3ab4 100644 --- a/packages/core-data/src/hooks/index.ts +++ b/packages/core-data/src/hooks/index.ts @@ -6,3 +6,4 @@ export { default as useEntityRecords, __experimentalUseEntityRecords, } from './use-entity-records'; +export { default as useResourcePermissions } from './use-resource-permissions'; From 92e3dadbee8b15179524ae3236cfac160304dec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zieli=C5=84ski?= Date: Wed, 17 Aug 2022 11:29:39 +0200 Subject: [PATCH 3/7] Add a changelog entry --- packages/core-data/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core-data/CHANGELOG.md b/packages/core-data/CHANGELOG.md index 262839c2a0b0e7..2db58200cb35cb 100644 --- a/packages/core-data/CHANGELOG.md +++ b/packages/core-data/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### New Features + +- Stabilized the `useResourcePermissions` hook ([#43268](https://github.com/WordPress/gutenberg/pull/43268)) + ## 4.13.0 (2022-08-10) ## 4.12.0 (2022-07-27) From a2798895fd105b48152090dc1927db7397e4b77e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zieli=C5=84ski?= Date: Tue, 16 Aug 2022 14:26:43 +0200 Subject: [PATCH 4/7] Re-export the hooks from ./hooks --- packages/core-data/src/index.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/core-data/src/index.js b/packages/core-data/src/index.js index 6914f376d72e43..05cace07c992b4 100644 --- a/packages/core-data/src/index.js +++ b/packages/core-data/src/index.js @@ -68,9 +68,6 @@ export const store = createReduxStore( STORE_NAME, storeConfig() ); register( store ); export { default as EntityProvider } from './entity-provider'; -export { default as useEntityRecord } from './hooks/use-entity-record'; -export { default as useEntityRecords } from './hooks/use-entity-records'; -export { default as useResourcePermissions } from './hooks/use-resource-permissions'; export * from './entity-provider'; export * from './entity-types'; export * from './fetch'; From c4739a2a61aa0223dc59f1c7ada87721b949f773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zieli=C5=84ski?= Date: Fri, 19 Aug 2022 10:02:47 +0200 Subject: [PATCH 5/7] Replace the remaining __experimentalUseResourcePermissions with just useResourcePermissions --- .../block-library/src/navigation-link/edit.js | 2 +- .../src/navigation-submenu/edit.js | 2 +- packages/core-data/README.md | 25 ++++++++++++++++ .../src/hooks/use-resource-permissions.ts | 30 +++++++++++++++++++ .../index.js | 2 +- 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/packages/block-library/src/navigation-link/edit.js b/packages/block-library/src/navigation-link/edit.js index afaf146ae54791..57cea79ac78efb 100644 --- a/packages/block-library/src/navigation-link/edit.js +++ b/packages/block-library/src/navigation-link/edit.js @@ -44,7 +44,7 @@ import { placeCaretAtHorizontalEdge } from '@wordpress/dom'; import { link as linkIcon, addSubmenu } from '@wordpress/icons'; import { store as coreStore, - __experimentalUseResourcePermissions as useResourcePermissions, + useResourcePermissions, } from '@wordpress/core-data'; import { decodeEntities } from '@wordpress/html-entities'; diff --git a/packages/block-library/src/navigation-submenu/edit.js b/packages/block-library/src/navigation-submenu/edit.js index 9f1901613d064e..12ee3d193f7496 100644 --- a/packages/block-library/src/navigation-submenu/edit.js +++ b/packages/block-library/src/navigation-submenu/edit.js @@ -40,7 +40,7 @@ import { import { placeCaretAtHorizontalEdge } from '@wordpress/dom'; import { link as linkIcon, removeSubmenu } from '@wordpress/icons'; import { - __experimentalUseResourcePermissions as useResourcePermissions, + useResourcePermissions, store as coreStore, } from '@wordpress/core-data'; import { speak } from '@wordpress/a11y'; diff --git a/packages/core-data/README.md b/packages/core-data/README.md index 2c0c2d400c587b..8925e6cb4375eb 100644 --- a/packages/core-data/README.md +++ b/packages/core-data/README.md @@ -903,6 +903,31 @@ function PagesList() { // ``` +```js +import { useResourcePermissions } from '@wordpress/core-data'; + +function Page( { pageId } ) { + const { canCreate, canUpdate, canDelete, isResolving } = + useResourcePermissions( 'page', pageId ); + + if ( isResolving ) { + return 'Loading ...'; + } + + return ( +
+ { canCreate ? : false } + { canUpdate ? : false } + { canDelete ? : false } + // ... +
+ ); +} + +// Rendered in the application: +// +``` + In the above example, when `PagesList` is rendered into an application, the appropriate permissions and the resolution details will be retrieved from the store state using `canUser()`, or resolved if missing. diff --git a/packages/core-data/src/hooks/use-resource-permissions.ts b/packages/core-data/src/hooks/use-resource-permissions.ts index caac84c363153d..3d78718a97890d 100644 --- a/packages/core-data/src/hooks/use-resource-permissions.ts +++ b/packages/core-data/src/hooks/use-resource-permissions.ts @@ -65,6 +65,36 @@ type ResourcePermissionsResolution< IdType > = [ * // * ``` * + * @example + * ```js + * import { useResourcePermissions } from '@wordpress/core-data'; + * + * function Page({ pageId }) { + * const { + * canCreate, + * canUpdate, + * canDelete, + * isResolving + * } = useResourcePermissions( 'page', pageId ); + * + * if ( isResolving ) { + * return 'Loading ...'; + * } + * + * return ( + *
+ * {canCreate ? () : false} + * {canUpdate ? () : false} + * {canDelete ? () : false} + * // ... + *
+ * ); + * } + * + * // Rendered in the application: + * // + * ``` + * * In the above example, when `PagesList` is rendered into an * application, the appropriate permissions and the resolution details will be retrieved from * the store state using `canUser()`, or resolved if missing. diff --git a/packages/edit-widgets/src/components/widget-areas-block-editor-provider/index.js b/packages/edit-widgets/src/components/widget-areas-block-editor-provider/index.js index 7ccf54fb8c4452..8aa616c867473d 100644 --- a/packages/edit-widgets/src/components/widget-areas-block-editor-provider/index.js +++ b/packages/edit-widgets/src/components/widget-areas-block-editor-provider/index.js @@ -7,7 +7,7 @@ import { useDispatch, useSelect } from '@wordpress/data'; import { useEntityBlockEditor, store as coreStore, - __experimentalUseResourcePermissions as useResourcePermissions, + useResourcePermissions, } from '@wordpress/core-data'; import { useMemo } from '@wordpress/element'; import { From 535c60b0b8b2316d8282216d8848c8d9c1b3925f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zieli=C5=84ski?= Date: Fri, 19 Aug 2022 10:06:39 +0200 Subject: [PATCH 6/7] Lint --- packages/core-data/src/hooks/index.ts | 5 ++++- .../src/hooks/use-resource-permissions.ts | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/core-data/src/hooks/index.ts b/packages/core-data/src/hooks/index.ts index 5df801641b3ab4..a12269616b2f0c 100644 --- a/packages/core-data/src/hooks/index.ts +++ b/packages/core-data/src/hooks/index.ts @@ -6,4 +6,7 @@ export { default as useEntityRecords, __experimentalUseEntityRecords, } from './use-entity-records'; -export { default as useResourcePermissions } from './use-resource-permissions'; +export { + default as useResourcePermissions, + __experimentalUseResourcePermissions, +} from './use-resource-permissions'; diff --git a/packages/core-data/src/hooks/use-resource-permissions.ts b/packages/core-data/src/hooks/use-resource-permissions.ts index 3d78718a97890d..4172356fea7c6d 100644 --- a/packages/core-data/src/hooks/use-resource-permissions.ts +++ b/packages/core-data/src/hooks/use-resource-permissions.ts @@ -1,3 +1,8 @@ +/** + * WordPress dependencies + */ +import deprecated from '@wordpress/deprecated'; + /** * Internal dependencies */ @@ -144,3 +149,14 @@ export default function useResourcePermissions< IdType = void >( [ resource, id ] ); } + +export function __experimentalUseResourcePermissions( + resource: string, + id?: IdType +) { + deprecated( `wp.data.__experimentalUseResourcePermissions`, { + alternative: 'wp.data.useResourcePermissions', + since: '6.1', + } ); + return useResourcePermissions( resource, id ); +} From f12d80f83a5c4e050d3dc94370f49c3af99e65ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zieli=C5=84ski?= Date: Fri, 19 Aug 2022 10:33:32 +0200 Subject: [PATCH 7/7] Fix typo in the example --- packages/core-data/README.md | 2 +- packages/core-data/src/hooks/use-resource-permissions.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core-data/README.md b/packages/core-data/README.md index 8925e6cb4375eb..6001ee7a6ba14c 100644 --- a/packages/core-data/README.md +++ b/packages/core-data/README.md @@ -908,7 +908,7 @@ import { useResourcePermissions } from '@wordpress/core-data'; function Page( { pageId } ) { const { canCreate, canUpdate, canDelete, isResolving } = - useResourcePermissions( 'page', pageId ); + useResourcePermissions( 'pages', pageId ); if ( isResolving ) { return 'Loading ...'; diff --git a/packages/core-data/src/hooks/use-resource-permissions.ts b/packages/core-data/src/hooks/use-resource-permissions.ts index 4172356fea7c6d..9defa0d9b12cf0 100644 --- a/packages/core-data/src/hooks/use-resource-permissions.ts +++ b/packages/core-data/src/hooks/use-resource-permissions.ts @@ -80,7 +80,7 @@ type ResourcePermissionsResolution< IdType > = [ * canUpdate, * canDelete, * isResolving - * } = useResourcePermissions( 'page', pageId ); + * } = useResourcePermissions( 'pages', pageId ); * * if ( isResolving ) { * return 'Loading ...';