/** * PaymentCore: orchestrator that fetches payment providers, shows loading/processing * states, and delegates to PaymentFactory. */ import { useState, useCallback, useEffect } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { Card, CardBody, Flex, Notice } from '@wordpress/components'; import { Spinner } from '@woocommerce/components'; import apiFetch from '@wordpress/api-fetch'; import type { PaymentProviders, GenericPaymentResponse, GenericErrorResponse, } from '../../../types'; import PaymentFactory from './payment-factory'; import { PaymentOrderResponse } from '../../../types/payment'; import { captureException } from '../../sentry'; import { getCourierLogo } from '../../utils'; interface PaymentCoreProps { paymentOrder: PaymentOrderResponse; onSuccess: (response: GenericPaymentResponse, paymentOrder: PaymentOrderResponse) => void; } export default function PaymentCore({ paymentOrder, onSuccess, }: PaymentCoreProps) { const [paying, setPaying] = useState(false); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [providers, setProviders] = useState(null); const { orderId, hash } = paymentOrder.orderResult; useEffect(() => { let cancelled = false; const fetchProviders = async () => { setLoading(true); setError(null); try { const data = (await apiFetch({ path: '/parcel2go-shipping/v1/payment/providers', method: 'POST', data: { orderId, hash }, })) as { success: boolean; result: PaymentProviders; validationErrors: GenericErrorResponse[] | null; }; if (!cancelled && data.success && data.result) { setProviders(data.result); } } catch (err: unknown) { captureException( err instanceof Error ? err : new Error(String(err)) ); if ( !cancelled && err && typeof err === 'object' && 'message' in err ) { setError(String((err as { message: string }).message)); } else { setError( __( 'Failed to load payment options.', 'parcel2go-shipping' ) ); } } finally { setLoading(false); } }; fetchProviders(); return () => { cancelled = true; }; }, [orderId, hash]); if (error) { return ( {error} ); } if (loading || !providers) { return ( {__('Loading payment options...', 'parcel2go-shipping')} ); } const p2gLogo = getCourierLogo('p2g'); return ( {/* Price summary */} Parcel2Go {__( 'Secure payment powered by Parcel2Go', 'parcel2go-shipping' )} {__('Net:', 'parcel2go-shipping')} £ {(providers.netTotalInUnits / 100).toFixed( 2 )} {' + '} {__('VAT:', 'parcel2go-shipping')} £ {(providers.vatTotalInUnits / 100).toFixed( 2 )} £{(providers.totalInUnits / 100).toFixed(2)} {__( 'Company Number: 02591405 | VAT Number: 597 8491 61', 'parcel2go-shipping' )} {/* Processing state */} {paying && ( {__('Processing payment...', 'parcel2go-shipping')} {__( 'Please do not close this page or navigate away.', 'parcel2go-shipping' )} )} {/* Payment options (hidden while processing) */}
); }