Vue Storefront is now Alokai! Learn More
GetAvailableShippingMethods

GetAvailableShippingMethods

Implements GetAvailableShippingMethods Unified Method.

Source

import { getNormalizers } from "@alokai/connect/integration-kit";
import { HttpStatusCode } from "@alokai/connect/middleware";
import type { Context } from "@vsf-enterprise/magento-api";

import { defineApi, getCartId, query } from "@vsf-enterprise/unified-api-magento";
import type { NormalizersTypes } from "@vsf-enterprise/unified-api-magento";

export const getAvailableShippingMethods = defineApi.getAvailableShippingMethods(
  async (context) => {
    const customerToken = context.config.state.getCustomerToken();

    const getShippingMethodsPromise = customerToken
      ? getCustomerShippingMethods
      : getGuestShippingMethods;

    const shippingMethods = await getShippingMethodsPromise(context);

    if (shippingMethods.length === 0) {
      throw context.createHttpError({
        message: "No shipping methods available",
        statusCode: HttpStatusCode.NOT_FOUND,
      });
    }

    const { normalizeShippingMethod } = getNormalizers(context);

    return {
      methods:
        shippingMethods
          .filter(Boolean)
          .map((method) =>
            normalizeShippingMethod(method as NormalizersTypes.NormalizeShippingMethodInput),
          ) || [],
    };
  },
);

async function getCustomerShippingMethods(context: Context) {
  const { api } = await context.getApiClient();
  const data = await query(api.getAvailableCustomerShippingMethods());
  return data?.customerCart?.shipping_addresses?.[0]?.available_shipping_methods ?? [];
}

async function getGuestShippingMethods(context: Context) {
  const { api } = await context.getApiClient();
  const cartId = getCartId(context);
  const data = await query(api.getAvailableShippingMethods({ cart_id: cartId }));

  return data?.cart?.shipping_addresses?.[0]?.available_shipping_methods || [];
}