UNPKG

@woocommerce/data

Version:
128 lines (127 loc) 4.37 kB
/** * External dependencies */ import createSelector from 'rememo'; /** * Internal dependencies */ import { createIdFromOptions, getProductResourceName, getTotalProductCountResourceName, } from './utils'; import { PERMALINK_PRODUCT_REGEX } from './constants'; export const getProduct = (state, productId, defaultValue = undefined) => { return state.data[productId] || defaultValue; }; export const getProducts = createSelector((state, query, defaultValue = undefined) => { const resourceName = getProductResourceName(query); const ids = state.products[resourceName] ? state.products[resourceName].data : undefined; if (!ids) { return defaultValue; } if (query && typeof query._fields !== 'undefined') { const fields = query._fields; return ids.map((id) => { return fields.reduce((product, field) => { return { ...product, [field]: state.data[id][field], }; }, {}); }); } return ids.map((id) => { return state.data[id]; }); }, (state, query) => { const resourceName = getProductResourceName(query); const ids = state.products[resourceName] ? state.products[resourceName].data : undefined; return [ state.products[resourceName], ...(ids || []).map((id) => { return state.data[id]; }), ]; }); export const getProductsTotalCount = (state, query, defaultValue = undefined) => { const resourceName = getTotalProductCountResourceName(query); const totalCount = state.productsCount.hasOwnProperty(resourceName) ? state.productsCount[resourceName] : defaultValue; return totalCount; }; export const getProductsError = (state, query) => { const resourceName = getProductResourceName(query); return state.errors[resourceName]; }; export const getCreateProductError = (state, query) => { const resourceName = getProductResourceName(query); return state.errors[resourceName]; }; export const getUpdateProductError = (state, id, query) => { const resourceName = getProductResourceName(query); return state.errors[`update/${id}/${resourceName}`]; }; export const getDeleteProductError = (state, id) => { return state.errors[`delete/${id}`]; }; export const isPending = (state, action, productId) => { var _a; if (productId !== undefined && action !== 'createProduct') { return ((_a = state.pending[action]) === null || _a === void 0 ? void 0 : _a[productId]) || false; } else if (action === 'createProduct') { return state.pending[action] || false; } return false; }; export const getPermalinkParts = createSelector((state, productId) => { const product = state.data[productId]; if (product && product.permalink_template) { const postName = product.slug || product.generated_slug; const [prefix, suffix] = product.permalink_template.split(PERMALINK_PRODUCT_REGEX); return { prefix, postName, suffix, }; } return null; }, (state, productId) => { return [state.data[productId]]; }); /** * Returns an array of related products for a given product ID. * * @param {ProductState} state - The current state. * @param {number} productId - The product ID. * @return {PartialProduct[]} The related products. */ export const getRelatedProducts = createSelector((state, productId) => { const product = state.data[productId]; if (!(product === null || product === void 0 ? void 0 : product.related_ids)) { return []; } const relatedProducts = getProducts(state, { include: product.related_ids, }); return relatedProducts || []; }, (state, productId) => { return [state.data[productId]]; }); /** * Return an array of suggested products the * given options. * * @param {ProductState} state - The current state. * @param {GetSuggestedProductsOptions} options - The options. * @return {PartialProduct[]} The suggested products. */ export function getSuggestedProducts(state, options) { const key = createIdFromOptions(options); if (!state.suggestedProducts[key]) { return []; } return state.suggestedProducts[key].items; }