UNPKG

@woocommerce/data

Version:
104 lines (103 loc) 3.65 kB
/** * External dependencies */ import { addQueryArgs } from '@wordpress/url'; import apiFetch from '@wordpress/api-fetch'; import { apiFetch as controlsApiFetch, dispatch as deprecatedDispatch, select, } from '@wordpress/data-controls'; import { controls } from '@wordpress/data'; /** * Internal dependencies */ import { STORE_NAME, WC_PRODUCT_NAMESPACE, WC_V3_ENDPOINT_SUGGESTED_PRODUCTS, } from './constants'; import { getProductError, getProductsError, getProductsSuccess, getProductsTotalCountError, getProductsTotalCountSuccess, getProductSuccess, } from './actions'; import { request } from '../utils'; import { createIdFromOptions } from './utils'; const dispatch = controls && controls.dispatch ? controls.dispatch : deprecatedDispatch; const resolveSelect = controls && controls.resolveSelect ? controls.resolveSelect : select; export function* getProducts(query) { // id is always required. const productsQuery = { ...query, }; if (productsQuery && productsQuery._fields && !productsQuery._fields.includes('id')) { productsQuery._fields = ['id', ...productsQuery._fields]; } try { const { items, totalCount } = yield request(WC_PRODUCT_NAMESPACE, productsQuery); yield getProductsTotalCountSuccess(query, totalCount); yield getProductsSuccess(query, items, totalCount); return items; } catch (error) { yield getProductsError(query, error); throw error; } } export function* getProduct(productId) { try { const product = yield controlsApiFetch({ path: addQueryArgs(`${WC_PRODUCT_NAMESPACE}/${productId}`, { context: 'edit', }), method: 'GET', }); yield getProductSuccess(productId, product); yield dispatch(STORE_NAME, 'finishResolution', 'getPermalinkParts', [ productId, ]); return product; } catch (error) { yield getProductError(productId, error); throw error; } } export function* getRelatedProducts(productId) { try { // Get the product. const product = yield resolveSelect(STORE_NAME, 'getProduct', productId); // Pick the related products IDs. const relatedProductsIds = product.related_ids; if (!(relatedProductsIds === null || relatedProductsIds === void 0 ? void 0 : relatedProductsIds.length)) { return []; } // Get the related products. const relatedProducts = yield resolveSelect(STORE_NAME, 'getProducts', { include: relatedProductsIds, }); return relatedProducts; } catch (error) { throw error; } } export function* getProductsTotalCount(query) { try { const totalsQuery = { ...query, page: 1, per_page: 1, }; const { totalCount } = yield request(WC_PRODUCT_NAMESPACE, totalsQuery); yield getProductsTotalCountSuccess(query, totalCount); return totalCount; } catch (error) { yield getProductsTotalCountError(query, error); throw error; } } export function* getPermalinkParts(productId) { yield resolveSelect(STORE_NAME, 'getProduct', [productId]); } export const getSuggestedProducts = (options) => // @ts-expect-error There are no types for this. async ({ dispatch: contextualDispatch }) => { const key = createIdFromOptions(options); const data = await apiFetch({ path: addQueryArgs(WC_V3_ENDPOINT_SUGGESTED_PRODUCTS, options), }); contextualDispatch.setSuggestedProductAction(key, data); };