import type { OperationContext, OperationOptions } from '@commerce/api/operations'; import type { Product } from '@commerce/types/product'; import type { GetAllProductPathsOperation } from '@commerce/types/product'; import { requireConfigValue } from '../../isomorphic-config'; import type { IProductsSlugs, SpreeSdkVariables } from '../../types'; import getProductPath from '../../utils/get-product-path'; import type { SpreeApiConfig, SpreeApiProvider } from '..'; const imagesSize = requireConfigValue('imagesSize') as string; const imagesQuality = requireConfigValue('imagesQuality') as number; export default function getAllProductPathsOperation({ commerce }: OperationContext) { async function getAllProductPaths(opts?: { variables?: T['variables']; config?: Partial; }): Promise; async function getAllProductPaths( opts: { variables?: T['variables']; config?: Partial; } & OperationOptions ): Promise; async function getAllProductPaths({ query, variables: getAllProductPathsVariables = {}, config: userConfig }: { query?: string; variables?: T['variables']; config?: Partial; } = {}): Promise { console.info( 'getAllProductPaths called. Configuration: ', 'query: ', query, 'getAllProductPathsVariables: ', getAllProductPathsVariables, 'config: ', userConfig ); const productsCount = requireConfigValue('lastUpdatedProductsPrerenderCount'); if (productsCount === 0) { return { products: [] }; } const variables: SpreeSdkVariables = { methodPath: 'products.list', arguments: [ {}, { fields: { product: 'slug' }, per_page: productsCount, image_transformation: { quality: imagesQuality, size: imagesSize } } ] }; const config = commerce.getConfig(userConfig); const { fetch: apiFetch } = config; // TODO: Send config.locale to Spree. const { data: spreeSuccessResponse } = await apiFetch( '__UNUSED__', { variables } ); const normalizedProductsPaths: Pick[] = spreeSuccessResponse.data.map( (spreeProduct) => ({ path: getProductPath(spreeProduct) }) ); return { products: normalizedProductsPaths }; } return getAllProductPaths; }