UNPKG

@techsio/storefront-data

Version:

Medusa-first storefront data layer built on TanStack Query.

94 lines (93 loc) • 4.06 kB
const buildCartSelectParams = (fields)=>{ if (!fields) return; return { fields }; }; const resolveInitiatedPaymentSessionId = (paymentCollection, providerId)=>{ const providerSessions = paymentCollection.payment_sessions?.filter((session)=>session.provider_id === providerId); if (!providerSessions?.length) return; const selectedSessions = providerSessions.filter((session)=>true === session.is_selected); let paymentSession; if (1 === selectedSessions.length) paymentSession = selectedSessions[0]; else if (1 === providerSessions.length) paymentSession = providerSessions[0]; return "string" == typeof paymentSession?.id && paymentSession.id ? paymentSession.id : void 0; }; function createMedusaCheckoutService(sdk, config) { const cartQuery = buildCartSelectParams(config?.cartFields); return { async listShippingOptions (cartId, signal) { const response = await sdk.client.fetch("/store/shipping-options", { query: { cart_id: cartId }, signal }); return response.shipping_options ?? []; }, async calculateShippingOption (optionId, input, signal) { const response = await sdk.client.fetch(`/store/shipping-options/${optionId}/calculate`, { method: "POST", body: { cart_id: input.cart_id, data: input.data }, signal }); return response.shipping_option; }, async addShippingMethod (cartId, optionId, data) { const response = cartQuery ? await sdk.store.cart.addShippingMethod(cartId, { option_id: optionId, data }, cartQuery) : await sdk.store.cart.addShippingMethod(cartId, { option_id: optionId, data }); if (!response.cart) throw new Error("Failed to add shipping method"); return response.cart; }, async listPaymentProviders (regionId, signal) { const response = await sdk.client.fetch("/store/payment-providers", { query: { region_id: regionId }, signal }); return response.payment_providers ?? []; }, async initiatePaymentSession (cartId, providerId, cart) { const resolvedCart = cart ?? (cartQuery ? (await sdk.store.cart.retrieve(cartId, cartQuery)).cart : (await sdk.store.cart.retrieve(cartId)).cart); if (!resolvedCart) throw new Error("Failed to load cart for payment"); const paymentSessionData = await config?.buildPaymentSessionData?.({ cart: resolvedCart, cartId, providerId }); const response = await sdk.store.payment.initiatePaymentSession(resolvedCart, { provider_id: providerId, ...paymentSessionData ? { data: paymentSessionData } : {} }); if (!response.payment_collection) throw new Error("Failed to initiate payment session"); if (config?.bindPaymentSessionData) { const paymentSessionId = resolveInitiatedPaymentSessionId(response.payment_collection, providerId); if (!paymentSessionId) throw new Error("Failed to resolve initiated payment session"); await config.bindPaymentSessionData({ cart: resolvedCart, cartId, paymentCollection: response.payment_collection, paymentSessionData, paymentSessionId, providerId }); } return response.payment_collection; }, completeCart (cartId) { return sdk.store.cart.complete(cartId); } }; } export { createMedusaCheckoutService };