@wordpress/core-data
Version:
Access to and manipulation of core WordPress entities.
143 lines (137 loc) • 4.46 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getQueriedItems = void 0;
exports.getQueriedTotalItems = getQueriedTotalItems;
exports.getQueriedTotalPages = getQueriedTotalPages;
var _equivalentKeyMap = _interopRequireDefault(require("equivalent-key-map"));
var _data = require("@wordpress/data");
var _getQueryParts = _interopRequireDefault(require("./get-query-parts"));
var _utils = require("../utils");
/**
* External dependencies
*/
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
/**
* Cache of state keys to EquivalentKeyMap where the inner map tracks queries
* to their resulting items set. WeakMap allows garbage collection on expired
* state references.
*
* @type {WeakMap<Object,EquivalentKeyMap>}
*/
const queriedItemsCacheByState = new WeakMap();
/**
* Returns items for a given query, or null if the items are not known.
*
* @param {Object} state State object.
* @param {?Object} query Optional query.
*
* @return {?Array} Query items.
*/
function getQueriedItemsUncached(state, query) {
const {
stableKey,
page,
perPage,
include,
fields,
context
} = (0, _getQueryParts.default)(query);
let itemIds;
if (state.queries?.[context]?.[stableKey]) {
itemIds = state.queries[context][stableKey].itemIds;
}
if (!itemIds) {
return null;
}
const startOffset = perPage === -1 ? 0 : (page - 1) * perPage;
const endOffset = perPage === -1 ? itemIds.length : Math.min(startOffset + perPage, itemIds.length);
const items = [];
for (let i = startOffset; i < endOffset; i++) {
const itemId = itemIds[i];
if (Array.isArray(include) && !include.includes(itemId)) {
continue;
}
if (itemId === undefined) {
continue;
}
// Having a target item ID doesn't guarantee that this object has been queried.
if (!state.items[context]?.hasOwnProperty(itemId)) {
return null;
}
const item = state.items[context][itemId];
let filteredItem;
if (Array.isArray(fields)) {
filteredItem = {};
for (let f = 0; f < fields.length; f++) {
const field = fields[f].split('.');
let value = item;
field.forEach(fieldName => {
value = value?.[fieldName];
});
(0, _utils.setNestedValue)(filteredItem, field, value);
}
} else {
// If expecting a complete item, validate that completeness, or
// otherwise abort.
if (!state.itemIsComplete[context]?.[itemId]) {
return null;
}
filteredItem = item;
}
items.push(filteredItem);
}
return items;
}
/**
* Returns items for a given query, or null if the items are not known. Caches
* result both per state (by reference) and per query (by deep equality).
* The caching approach is intended to be durable to query objects which are
* deeply but not referentially equal, since otherwise:
*
* `getQueriedItems( state, {} ) !== getQueriedItems( state, {} )`
*
* @param {Object} state State object.
* @param {?Object} query Optional query.
*
* @return {?Array} Query items.
*/
const getQueriedItems = exports.getQueriedItems = (0, _data.createSelector)((state, query = {}) => {
let queriedItemsCache = queriedItemsCacheByState.get(state);
if (queriedItemsCache) {
const queriedItems = queriedItemsCache.get(query);
if (queriedItems !== undefined) {
return queriedItems;
}
} else {
queriedItemsCache = new _equivalentKeyMap.default();
queriedItemsCacheByState.set(state, queriedItemsCache);
}
const items = getQueriedItemsUncached(state, query);
queriedItemsCache.set(query, items);
return items;
});
function getQueriedTotalItems(state, query = {}) {
var _state$queries$contex;
const {
stableKey,
context
} = (0, _getQueryParts.default)(query);
return (_state$queries$contex = state.queries?.[context]?.[stableKey]?.meta?.totalItems) !== null && _state$queries$contex !== void 0 ? _state$queries$contex : null;
}
function getQueriedTotalPages(state, query = {}) {
var _state$queries$contex2;
const {
stableKey,
context
} = (0, _getQueryParts.default)(query);
return (_state$queries$contex2 = state.queries?.[context]?.[stableKey]?.meta?.totalPages) !== null && _state$queries$contex2 !== void 0 ? _state$queries$contex2 : null;
}
//# sourceMappingURL=selectors.js.map
;