@wordpress/core-data
Version:
Access to and manipulation of core WordPress entities.
159 lines (155 loc) • 5.3 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.__experimentalUseEntityRecords = __experimentalUseEntityRecords;
exports.default = useEntityRecords;
exports.useEntityRecordsWithPermissions = useEntityRecordsWithPermissions;
var _url = require("@wordpress/url");
var _deprecated = _interopRequireDefault(require("@wordpress/deprecated"));
var _data = require("@wordpress/data");
var _element = require("@wordpress/element");
var _useQuerySelect = _interopRequireDefault(require("./use-query-select"));
var _ = require("../");
var _lockUnlock = require("../lock-unlock");
var _utils = require("../utils");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
const EMPTY_ARRAY = [];
/**
* Resolves the specified entity records.
*
* @since 6.1.0 Introduced in WordPress core.
*
* @param kind Kind of the entity, e.g. `root` or a `postType`. See rootEntitiesConfig in ../entities.ts for a list of available kinds.
* @param name Name of the entity, e.g. `plugin` or a `post`. See rootEntitiesConfig in ../entities.ts for a list of available names.
* @param queryArgs Optional HTTP query description for how to fetch the data, passed to the requested API endpoint.
* @param options Optional hook options.
* @example
* ```js
* import { useEntityRecords } from '@wordpress/core-data';
*
* function PageTitlesList() {
* const { records, isResolving } = useEntityRecords( 'postType', 'page' );
*
* if ( isResolving ) {
* return 'Loading...';
* }
*
* return (
* <ul>
* {records.map(( page ) => (
* <li>{ page.title }</li>
* ))}
* </ul>
* );
* }
*
* // Rendered in the application:
* // <PageTitlesList />
* ```
*
* In the above example, when `PageTitlesList` is rendered into an
* application, the list of records and the resolution details will be retrieved from
* the store state using `getEntityRecords()`, or resolved if missing.
*
* @return Entity records data.
* @template RecordType
*/
function useEntityRecords(kind, name, queryArgs = {}, options = {
enabled: true
}) {
// Serialize queryArgs to a string that can be safely used as a React dep.
// We can't just pass queryArgs 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 queryAsString = (0, _url.addQueryArgs)('', queryArgs);
const {
data: records,
...rest
} = (0, _useQuerySelect.default)(query => {
if (!options.enabled) {
return {
// Avoiding returning a new reference on every execution.
data: EMPTY_ARRAY
};
}
return query(_.store).getEntityRecords(kind, name, queryArgs);
}, [kind, name, queryAsString, options.enabled]);
const {
totalItems,
totalPages
} = (0, _data.useSelect)(select => {
if (!options.enabled) {
return {
totalItems: null,
totalPages: null
};
}
return {
totalItems: select(_.store).getEntityRecordsTotalItems(kind, name, queryArgs),
totalPages: select(_.store).getEntityRecordsTotalPages(kind, name, queryArgs)
};
}, [kind, name, queryAsString, options.enabled]);
return {
records,
totalItems,
totalPages,
...rest
};
}
function __experimentalUseEntityRecords(kind, name, queryArgs, options) {
(0, _deprecated.default)(`wp.data.__experimentalUseEntityRecords`, {
alternative: 'wp.data.useEntityRecords',
since: '6.1'
});
return useEntityRecords(kind, name, queryArgs, options);
}
function useEntityRecordsWithPermissions(kind, name, queryArgs = {}, options = {
enabled: true
}) {
const entityConfig = (0, _data.useSelect)(select => select(_.store).getEntityConfig(kind, name), [kind, name]);
const {
records: data,
...ret
} = useEntityRecords(kind, name, {
...queryArgs,
// If _fields is provided, we need to include _links in the request for permission caching to work.
...(queryArgs._fields ? {
_fields: [...new Set([...((0, _utils.getNormalizedCommaSeparable)(queryArgs._fields) || []), '_links'])].join()
} : {})
}, options);
const ids = (0, _element.useMemo)(() => {
var _data$map;
return (_data$map = data?.map(
// @ts-ignore
record => {
var _entityConfig$key;
return record[(_entityConfig$key = entityConfig?.key) !== null && _entityConfig$key !== void 0 ? _entityConfig$key : 'id'];
})) !== null && _data$map !== void 0 ? _data$map : [];
}, [data, entityConfig?.key]);
const permissions = (0, _data.useSelect)(select => {
const {
getEntityRecordsPermissions
} = (0, _lockUnlock.unlock)(select(_.store));
return getEntityRecordsPermissions(kind, name, ids);
}, [ids, kind, name]);
const dataWithPermissions = (0, _element.useMemo)(() => {
var _data$map2;
return (_data$map2 = data?.map((record, index) => ({
// @ts-ignore
...record,
permissions: permissions[index]
}))) !== null && _data$map2 !== void 0 ? _data$map2 : [];
}, [data, permissions]);
return {
records: dataWithPermissions,
...ret
};
}
//# sourceMappingURL=use-entity-records.js.map
;