import { FormikHelpers } from 'formik' import _identity from 'lodash/identity' import { handlePaymentMiddleWare } from '../../paymentContainer/handlePayment' interface PaymentData { attributes: any isFreeTickets: boolean updatedOrderData: any eventId: string } interface UseStripePaymentProps { stripeRef: any elementsRef: React.MutableRefObject setError: (error: string | null) => void isBrowser: boolean } export const useStripePayment = ({ stripeRef, elementsRef, setError, isBrowser, }: UseStripePaymentProps) => { const processPayment = async ( paymentDataResponse: any, values: any, formikHelpers: FormikHelpers, checkoutResponse: any, checkoutUpdateResponse: any, paymentData: PaymentData ) => { const { attributes, isFreeTickets, updatedOrderData, eventId } = paymentData if (!isFreeTickets) { if (!stripeRef.current) { setError('Stripe is not ready') return null } // Step 1: Submit elements first const { error: submitError } = await elementsRef.current.submit() if (submitError) { setError('' + submitError?.message) return null } // Step 2: Store payment context before potential redirect const paymentContext = { attributes, isFreeTickets, updatedOrderData, eventId, values, formikHelpers, checkoutResponse, checkoutUpdateResponse, timestamp: Date.now(), } localStorage.setItem('stripe_payment_context', JSON.stringify(paymentContext)) // Step 3: Confirm payment with current page return URL const confirmParams: any = { return_url: window.location.href + (window.location.href.includes('?') ? '&' : '?') + 'payment_return=true', } if (values?.phone) { const rawPhone = String(values.phone).replace(/[\s\-().]/g, '') const e164Phone = rawPhone.startsWith('+') ? rawPhone : `+${rawPhone}` confirmParams.payment_method_data = { billing_details: { phone: e164Phone }, } } const { error: confirmError } = await stripeRef.current.confirmPayment({ clientSecret: paymentDataResponse.data.attributes.payment_method.stripe_client_secret, elements: elementsRef.current, confirmParams, redirect: 'if_required', }) if (confirmError) { setError('' + confirmError?.message) return null } } // Handle payment middleware for non-redirect payments let paymentResponse = null await handlePaymentMiddleWare( null, {}, { reviewData: attributes, isFreeTickets, paymentPlanIsAvailable: false, showPaymentPlanSection: false, handlePayment: (data: any) => { paymentResponse = data }, setPaymentIsLoading: _identity, setError: _identity, orderData: updatedOrderData, eventId, isBrowser, onPaymentError: (error: any) => { throw error }, } ) return paymentResponse } return { processPayment } }