import type { SpreeApiConfig, SpreeApiProvider } from '../index'; import type { GetProductOperation } from '@commerce/types/product'; import type { OperationContext, OperationOptions } from '@commerce/api/operations'; import type { IProduct } from '@spree/storefront-api-v2-sdk/types/interfaces/Product'; import type { SpreeSdkVariables } from '../../types'; import MissingSlugVariableError from '../../errors/MissingSlugVariableError'; import normalizeProduct from '../../utils/normalizations/normalize-product'; import { requireConfigValue } from '../../isomorphic-config'; const imagesSize = requireConfigValue('imagesSize') as string; const imagesQuality = requireConfigValue('imagesQuality') as number; export default function getProductOperation({ commerce }: OperationContext) { async function getProduct(opts: { variables: T['variables']; config?: Partial; preview?: boolean; }): Promise; async function getProduct( opts: { variables: T['variables']; config?: Partial; preview?: boolean; } & OperationOptions ): Promise; async function getProduct({ query = '', variables: getProductVariables, config: userConfig }: { query?: string; variables?: T['variables']; config?: Partial; preview?: boolean; }): Promise { console.log( 'getProduct called. Configuration: ', 'getProductVariables: ', getProductVariables, 'config: ', userConfig ); if (!getProductVariables?.slug) { throw new MissingSlugVariableError(); } const variables: SpreeSdkVariables = { methodPath: 'products.show', arguments: [ getProductVariables.slug, {}, { include: 'primary_variant,variants,images,option_types,variants.option_values', 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 } ); return { product: normalizeProduct(spreeSuccessResponse, spreeSuccessResponse.data) }; } return getProduct; }