UNPKG

@wordpress/core-data

Version:
163 lines (159 loc) 5.35 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.__experimentalUseResourcePermissions = __experimentalUseResourcePermissions; exports.default = void 0; var _deprecated = _interopRequireDefault(require("@wordpress/deprecated")); var _warning = _interopRequireDefault(require("@wordpress/warning")); var _ = require("../"); var _constants = require("./constants"); var _useQuerySelect = _interopRequireDefault(require("./use-query-select")); /** * WordPress dependencies */ /** * Internal dependencies */ /** * Is the data resolved by now? */ /** * Resolves resource permissions. * * @since 6.1.0 Introduced in WordPress core. * * @param resource Entity resource to check. Accepts entity object `{ kind: 'postType', name: 'attachment', id: 1 }` * or REST base as a string - `media`. * @param id Optional ID of the resource to check, e.g. 10. Note: This argument is discouraged * when using an entity object as a resource to check permissions and will be ignored. * * @example * ```js * import { useResourcePermissions } from '@wordpress/core-data'; * * function PagesList() { * const { canCreate, isResolving } = useResourcePermissions( { kind: 'postType', name: 'page' } ); * * if ( isResolving ) { * return 'Loading ...'; * } * * return ( * <div> * {canCreate ? (<button>+ Create a new page</button>) : false} * // ... * </div> * ); * } * * // Rendered in the application: * // <PagesList /> * ``` * * @example * ```js * import { useResourcePermissions } from '@wordpress/core-data'; * * function Page({ pageId }) { * const { * canCreate, * canUpdate, * canDelete, * isResolving * } = useResourcePermissions( { kind: 'postType', name: 'page', id: pageId } ); * * if ( isResolving ) { * return 'Loading ...'; * } * * return ( * <div> * {canCreate ? (<button>+ Create a new page</button>) : false} * {canUpdate ? (<button>Edit page</button>) : false} * {canDelete ? (<button>Delete page</button>) : false} * // ... * </div> * ); * } * * // Rendered in the application: * // <Page pageId={ 15 } /> * ``` * * 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. * * @return Entity records data. * @template IdType */ function useResourcePermissions(resource, id) { // Serialize `resource` to a string that can be safely used as a React dep. // We can't just pass `resource` as one of the deps, because if it is passed // as an object literal, then it will be a different object on each call even // if the values remain the same. const isEntity = typeof resource === 'object'; const resourceAsString = isEntity ? JSON.stringify(resource) : resource; if (isEntity && typeof id !== 'undefined') { globalThis.SCRIPT_DEBUG === true ? (0, _warning.default)(`When 'resource' is an entity object, passing 'id' as a separate argument isn't supported.`) : void 0; } return (0, _useQuerySelect.default)(resolve => { const hasId = isEntity ? !!resource.id : !!id; const { canUser } = resolve(_.store); const create = canUser('create', isEntity ? { kind: resource.kind, name: resource.name } : resource); if (!hasId) { const read = canUser('read', resource); const isResolving = create.isResolving || read.isResolving; const hasResolved = create.hasResolved && read.hasResolved; let status = _constants.Status.Idle; if (isResolving) { status = _constants.Status.Resolving; } else if (hasResolved) { status = _constants.Status.Success; } return { status, isResolving, hasResolved, canCreate: create.hasResolved && create.data, canRead: read.hasResolved && read.data }; } const read = canUser('read', resource, id); const update = canUser('update', resource, id); const _delete = canUser('delete', resource, id); const isResolving = read.isResolving || create.isResolving || update.isResolving || _delete.isResolving; const hasResolved = read.hasResolved && create.hasResolved && update.hasResolved && _delete.hasResolved; let status = _constants.Status.Idle; if (isResolving) { status = _constants.Status.Resolving; } else if (hasResolved) { status = _constants.Status.Success; } return { status, isResolving, hasResolved, canRead: hasResolved && read.data, canCreate: hasResolved && create.data, canUpdate: hasResolved && update.data, canDelete: hasResolved && _delete.data }; }, [resourceAsString, id]); } var _default = exports.default = useResourcePermissions; function __experimentalUseResourcePermissions(resource, id) { (0, _deprecated.default)(`wp.data.__experimentalUseResourcePermissions`, { alternative: 'wp.data.useResourcePermissions', since: '6.1' }); return useResourcePermissions(resource, id); } //# sourceMappingURL=use-resource-permissions.js.map