@wordpress/core-data
Version:
Access to and manipulation of core WordPress entities.
118 lines (117 loc) • 3.32 kB
JavaScript
// packages/core-data/src/hooks/use-entity-records.ts
import { addQueryArgs } from "@wordpress/url";
import deprecated from "@wordpress/deprecated";
import { useSelect } from "@wordpress/data";
import { useMemo } from "@wordpress/element";
import useQuerySelect from "./use-query-select";
import { store as coreStore } from "../";
import { unlock } from "../lock-unlock";
import { getNormalizedCommaSeparable } from "../utils";
var EMPTY_ARRAY = [];
function useEntityRecords(kind, name, queryArgs = {}, options = { enabled: true }) {
const queryAsString = addQueryArgs("", queryArgs);
const { data: records, ...rest } = useQuerySelect(
(query) => {
if (!options.enabled) {
return {
// Avoiding returning a new reference on every execution.
data: EMPTY_ARRAY
};
}
return query(coreStore).getEntityRecords(kind, name, queryArgs);
},
[kind, name, queryAsString, options.enabled]
);
const { totalItems, totalPages } = useSelect(
(select) => {
if (!options.enabled) {
return {
totalItems: null,
totalPages: null
};
}
return {
totalItems: select(coreStore).getEntityRecordsTotalItems(
kind,
name,
queryArgs
),
totalPages: select(coreStore).getEntityRecordsTotalPages(
kind,
name,
queryArgs
)
};
},
[kind, name, queryAsString, options.enabled]
);
return {
records,
totalItems,
totalPages,
...rest
};
}
function __experimentalUseEntityRecords(kind, name, queryArgs, options) {
deprecated(`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 = useSelect(
(select) => select(coreStore).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: [
.../* @__PURE__ */ new Set([
...getNormalizedCommaSeparable(
queryArgs._fields
) || [],
"_links"
])
].join()
} : {}
},
options
);
const ids = useMemo(
() => data?.map(
// @ts-ignore
(record) => record[entityConfig?.key ?? "id"]
) ?? [],
[data, entityConfig?.key]
);
const permissions = useSelect(
(select) => {
const { getEntityRecordsPermissions } = unlock(
select(coreStore)
);
return getEntityRecordsPermissions(kind, name, ids);
},
[ids, kind, name]
);
const dataWithPermissions = useMemo(
() => data?.map((record, index) => ({
// @ts-ignore
...record,
permissions: permissions[index]
})) ?? [],
[data, permissions]
);
return { records: dataWithPermissions, ...ret };
}
export {
__experimentalUseEntityRecords,
useEntityRecords as default,
useEntityRecordsWithPermissions
};
//# sourceMappingURL=use-entity-records.js.map