@wordpress/core-data
Version:
Access to and manipulation of core WordPress entities.
120 lines (119 loc) • 3.6 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 { store as coreStore } from "../index.mjs";
import { getResolutionStatus } from "./utils.mjs";
import { unlock } from "../lock-unlock.mjs";
import { getNormalizedCommaSeparable } from "../utils/index.mjs";
var EMPTY_ARRAY = [];
function useEntityRecords(kind, name, queryArgs = {}, options = { enabled: true }) {
const queryAsString = addQueryArgs("", queryArgs);
const { records, totalItems, totalPages, ...rest } = useSelect(
(select) => {
if (!options.enabled) {
return {
// Avoiding returning a new reference on every execution.
records: EMPTY_ARRAY,
totalItems: null,
totalPages: null,
...getResolutionStatus()
};
}
const storeSelectors = select(coreStore);
const resolutionStatus = storeSelectors.getResolutionState(
"getEntityRecords",
[kind, name, queryArgs]
)?.status;
return {
records: storeSelectors.getEntityRecords(
kind,
name,
queryArgs
),
totalItems: storeSelectors.getEntityRecordsTotalItems(
kind,
name,
queryArgs
),
totalPages: storeSelectors.getEntityRecordsTotalPages(
kind,
name,
queryArgs
),
...getResolutionStatus(resolutionStatus)
};
},
[kind, name, queryAsString, options.enabled]
);
return {
records,
totalItems,
totalPages,
...rest
};
}
function useDeprecatedEntityRecords(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-expect-error `data` is `unknown[]`, so the callback signature does not line up.
(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-expect-error `record` is `unknown`, which cannot be spread.
...record,
permissions: permissions[index]
})) ?? [],
[data, permissions]
);
return { records: dataWithPermissions, ...ret };
}
export {
useEntityRecords as default,
useDeprecatedEntityRecords,
useEntityRecordsWithPermissions
};
//# sourceMappingURL=use-entity-records.mjs.map