@godaddy/react
Version:
The `createCheckoutSession` function creates a new checkout session with GoDaddy's commerce API.
138 lines (136 loc) • 5.38 kB
JavaScript
import { O as PaymentMethodType, _ as useConfirmCheckout, g as PaymentProvider, o as useCheckoutContext, u as useBuildPaymentRequest } from "./checkout-CCruxHvk.js";
import { k as GraphQLErrorWithCodes } from "./utils-DWBfAHfx.js";
import { useCallback, useState } from "react";
import { CardElement, useElements, useStripe } from "@stripe/react-stripe-js";
//#region src/components/checkout/payment/utils/use-stripe-checkout.ts
function useStripeCheckout({ mode }) {
const stripe = useStripe();
const elements = useElements();
const confirmCheckout = useConfirmCheckout();
const { setCheckoutErrors } = useCheckoutContext();
const { stripePaymentExpressRequest } = useBuildPaymentRequest();
const [isProcessingPayment, setIsProcessingPayment] = useState(false);
return {
handleSubmit: useCallback(async (expressData) => {
setIsProcessingPayment(true);
try {
if (!stripe || !elements) return;
if (mode === "card") {
const cardElement = elements.getElement(CardElement);
if (!cardElement) return;
const { paymentMethod, error } = await stripe.createPaymentMethod({
card: cardElement,
type: "card"
});
if (error) {
setCheckoutErrors([error.code || "TRANSACTION_PROCESSING_FAILED"]);
return;
}
if (paymentMethod) try {
await confirmCheckout.mutateAsync({
paymentToken: paymentMethod.id,
paymentType: PaymentMethodType.CREDIT_CARD,
paymentProvider: PaymentProvider.STRIPE
});
} catch (err) {
if (err instanceof GraphQLErrorWithCodes) setCheckoutErrors(err.codes);
}
else setCheckoutErrors(["TRANSACTION_PROCESSING_FAILED"]);
}
if (mode === "express") {
const { error, paymentMethod } = await stripe.createPaymentMethod({
elements,
params: stripePaymentExpressRequest
});
if (error) {
setCheckoutErrors([error.code || "TRANSACTION_PROCESSING_FAILED"]);
return;
}
if (paymentMethod) try {
const event = expressData?.event;
const currencyCode = expressData?.shippingTotal?.currencyCode || "USD";
const paymentType = paymentMethod.card?.wallet?.type || event?.expressPaymentType || "card";
const billing = event?.billingDetails ? {
email: event.billingDetails.email || "",
phone: event.billingDetails.phone || "",
firstName: event.billingDetails.name?.split(" ")?.[0] || "",
lastName: event.billingDetails.name?.split(" ").slice(1).join(" ") || "",
address: {
countryCode: event.billingDetails.address?.country || "",
postalCode: event.billingDetails.address?.postal_code || "",
adminArea1: event.billingDetails.address?.state || "",
adminArea2: event.billingDetails.address?.city || "",
addressLine1: event.billingDetails.address?.line1 || "",
addressLine2: event.billingDetails.address?.line2 || ""
}
} : void 0;
const shipping = event?.shippingAddress ? {
email: event.billingDetails?.email || "",
phone: event.billingDetails?.phone || "",
firstName: event.shippingAddress.name?.split(" ")?.[0] || "",
lastName: event.shippingAddress.name?.split(" ").slice(1).join(" ") || "",
address: {
countryCode: event.shippingAddress.address?.country || "",
postalCode: event.shippingAddress.address?.postal_code || "",
adminArea1: event.shippingAddress.address?.state || "",
adminArea2: event.shippingAddress.address?.city || "",
addressLine1: event.shippingAddress.address?.line1 || "",
addressLine2: event.shippingAddress.address?.line2 || ""
}
} : void 0;
const shippingLines = expressData?.selectedShippingMethod ? [{
amount: expressData.shippingTotal || {
currencyCode,
value: 0
},
name: expressData.selectedShippingMethod.displayName || "",
requestedProvider: expressData.selectedShippingMethod.carrierCode || "",
requestedService: expressData.selectedShippingMethod.serviceCode || "",
totals: {
subTotal: expressData.shippingTotal || {
currencyCode,
value: 0
},
taxTotal: {
value: 0,
currencyCode
}
}
}] : void 0;
await confirmCheckout.mutateAsync({
paymentToken: paymentMethod.id,
paymentType,
paymentProvider: PaymentProvider.STRIPE,
isExpress: true,
...expressData?.shippingTotal ? { shippingTotal: expressData.shippingTotal } : {},
...expressData?.calculatedTaxes ? { calculatedTaxes: expressData.calculatedTaxes } : {},
...expressData?.calculatedAdjustments ? { calculatedAdjustments: expressData.calculatedAdjustments } : {},
...billing ? { billing } : {},
...shipping ? { shipping } : {},
...shippingLines ? { shippingLines } : {}
});
} catch (err) {
if (err instanceof GraphQLErrorWithCodes) setCheckoutErrors(err.codes);
throw err;
}
else setCheckoutErrors(["TRANSACTION_PROCESSING_FAILED"]);
}
return {
success: false,
error: `Mode not supported: ${mode}`
};
} finally {
setIsProcessingPayment(false);
}
}, [
mode,
stripe,
elements,
confirmCheckout.mutateAsync,
setCheckoutErrors
]),
isProcessingPayment
};
}
//#endregion
export { useStripeCheckout as t };