UNPKG

@wordpress/core-data

Version:
218 lines (216 loc) 7.14 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // packages/core-data/src/queried-data/reducer.js var reducer_exports = {}; __export(reducer_exports, { default: () => reducer_default, getMergedItemIds: () => getMergedItemIds, itemIsComplete: () => itemIsComplete, items: () => items }); module.exports = __toCommonJS(reducer_exports); var import_data = require("@wordpress/data"); var import_compose = require("@wordpress/compose"); var import_utils = require("../utils"); var import_entities = require("../entities"); var import_get_query_parts = __toESM(require("./get-query-parts")); function getContextFromAction(action) { const { query } = action; if (!query) { return "default"; } const queryParts = (0, import_get_query_parts.default)(query); return queryParts.context; } function getMergedItemIds(itemIds, nextItemIds, page, perPage) { const receivedAllIds = page === 1 && perPage === -1; if (receivedAllIds) { return nextItemIds; } const nextItemIdsStartIndex = (page - 1) * perPage; const size = Math.max( itemIds?.length ?? 0, nextItemIdsStartIndex + nextItemIds.length ); const mergedItemIds = new Array(size); for (let i = 0; i < size; i++) { const isInNextItemsRange = i >= nextItemIdsStartIndex && i < nextItemIdsStartIndex + perPage; mergedItemIds[i] = isInNextItemsRange ? nextItemIds[i - nextItemIdsStartIndex] : itemIds?.[i]; } return mergedItemIds; } function removeEntitiesById(entities, ids) { return Object.fromEntries( Object.entries(entities).filter( ([id]) => !ids.some((itemId) => { if (Number.isInteger(itemId)) { return itemId === +id; } return itemId === id; }) ) ); } function items(state = {}, action) { switch (action.type) { case "RECEIVE_ITEMS": { const context = getContextFromAction(action); const key = action.key || import_entities.DEFAULT_ENTITY_KEY; return { ...state, [context]: { ...state[context], ...action.items.reduce((accumulator, value) => { const itemId = value?.[key]; accumulator[itemId] = (0, import_utils.conservativeMapItem)( state?.[context]?.[itemId], value ); return accumulator; }, {}) } }; } case "REMOVE_ITEMS": return Object.fromEntries( Object.entries(state).map(([itemId, contextState]) => [ itemId, removeEntitiesById(contextState, action.itemIds) ]) ); } return state; } function itemIsComplete(state = {}, action) { switch (action.type) { case "RECEIVE_ITEMS": { const context = getContextFromAction(action); const { query, key = import_entities.DEFAULT_ENTITY_KEY } = action; const queryParts = query ? (0, import_get_query_parts.default)(query) : {}; const isCompleteQuery = !query || !Array.isArray(queryParts.fields); return { ...state, [context]: { ...state[context], ...action.items.reduce((result, item) => { const itemId = item?.[key]; result[itemId] = state?.[context]?.[itemId] || isCompleteQuery; return result; }, {}) } }; } case "REMOVE_ITEMS": return Object.fromEntries( Object.entries(state).map(([itemId, contextState]) => [ itemId, removeEntitiesById(contextState, action.itemIds) ]) ); } return state; } var receiveQueries = (0, import_compose.compose)([ // Limit to matching action type so we don't attempt to replace action on // an unhandled action. (0, import_utils.ifMatchingAction)((action) => "query" in action), // Inject query parts into action for use both in `onSubKey` and reducer. (0, import_utils.replaceAction)((action) => { if (action.query) { return { ...action, ...(0, import_get_query_parts.default)(action.query) }; } return action; }), (0, import_utils.onSubKey)("context"), // Queries shape is shared, but keyed by query `stableKey` part. Original // reducer tracks only a single query object. (0, import_utils.onSubKey)("stableKey") ])((state = {}, action) => { const { type, page, perPage, key = import_entities.DEFAULT_ENTITY_KEY } = action; if (type !== "RECEIVE_ITEMS") { return state; } return { itemIds: getMergedItemIds( state?.itemIds || [], action.items.map((item) => item?.[key]).filter(Boolean), page, perPage ), meta: action.meta }; }); var queries = (state = {}, action) => { switch (action.type) { case "RECEIVE_ITEMS": return receiveQueries(state, action); case "REMOVE_ITEMS": const removedItems = action.itemIds.reduce((result, itemId) => { result[itemId] = true; return result; }, {}); return Object.fromEntries( Object.entries(state).map( ([queryGroup, contextQueries]) => [ queryGroup, Object.fromEntries( Object.entries(contextQueries).map( ([query, queryItems]) => [ query, { ...queryItems, itemIds: queryItems.itemIds.filter( (queryId) => !removedItems[queryId] ) } ] ) ) ] ) ); default: return state; } }; var reducer_default = (0, import_data.combineReducers)({ items, itemIsComplete, queries }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getMergedItemIds, itemIsComplete, items }); //# sourceMappingURL=reducer.js.map