woocommerce/plugins/woocommerce-admin/client/lib/async-requests/index.js

86 lines
2.3 KiB
JavaScript

/** @format */
/**
* External dependencies
*/
import { addQueryArgs } from '@wordpress/url';
import apiFetch from '@wordpress/api-fetch';
import { identity } from 'lodash';
/**
* WooCommerce dependencies
*/
import { getIdsFromQuery } from '@woocommerce/navigation';
/**
* Internal dependencies
*/
import { getTaxCode } from 'analytics/report/taxes/utils';
import { NAMESPACE } from 'wc-api/constants';
/**
* Get a function that accepts ids as they are found in url parameter and
* returns a promise with an optional method applied to results
*
* @param {string|function} path - api path string or a function of the query returning api path string
* @param {Function} [handleData] - function applied to each iteration of data
* @returns {Function} - a function of ids returning a promise
*/
export function getRequestByIdString( path, handleData = identity ) {
return function( queryString = '', query ) {
const pathString = 'function' === typeof path ? path( query ) : path;
const idList = getIdsFromQuery( queryString );
if ( idList.length < 1 ) {
return Promise.resolve( [] );
}
const payload = {
include: idList.join( ',' ),
per_page: idList.length,
};
return apiFetch( { path: addQueryArgs( pathString, payload ) } ).then( data =>
data.map( handleData )
);
};
}
export const getCategoryLabels = getRequestByIdString(
NAMESPACE + '/products/categories',
category => ( {
key: category.id,
label: category.name,
} )
);
export const getCouponLabels = getRequestByIdString( NAMESPACE + '/coupons', coupon => ( {
key: coupon.id,
label: coupon.code,
} ) );
export const getCustomerLabels = getRequestByIdString( NAMESPACE + '/customers', customer => ( {
key: customer.id,
label: customer.name,
} ) );
export const getProductLabels = getRequestByIdString( NAMESPACE + '/products', product => ( {
key: product.id,
label: product.name,
} ) );
export const getTaxRateLabels = getRequestByIdString( NAMESPACE + '/taxes', tax_rate => ( {
key: tax_rate.id,
label: getTaxCode( tax_rate ),
} ) );
export const getVariationLabels = getRequestByIdString(
query => NAMESPACE + `/products/${ query.products }/variations`,
variation => {
return {
key: variation.id,
label: variation.attributes.reduce(
( desc, attribute, index, arr ) =>
desc + `${ attribute.option }${ arr.length === index + 1 ? '' : ', ' }`,
''
),
};
}
);