@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
94 lines (93 loc) • 4.06 kB
JavaScript
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 };