import { Divider, Stack, Typography } from '@mui/material'; import { useLocaleContext } from '@arcblock/ux/lib/Locale/context'; import { useSessionContext, usePaymentMethodContext, useSubmitFeature, useCustomerFormFeature, } from '@blocklet/payment-react-headless'; import StripeForm from '../../../payment/form/stripe'; import ConfirmDialog from '../../../components/confirm'; import PriceChangeConfirm from '../../../components/price-change-confirm'; import ServiceSuspendedDialog from '../../../components/service-suspended-dialog'; import { formatTokenAmount } from '../../utils/format'; function getRedirectUrl(session: any): string | undefined { try { const params = new URLSearchParams(window.location.search); const redirect = params.get('redirect'); if (redirect) return decodeURIComponent(redirect); } catch { // ignore } if (session?.success_url) return session.success_url; if (session?.payment_link?.after_completion?.redirect?.url) { return session.payment_link.after_completion.redirect.url; } return undefined; } export default function CheckoutDialogs() { const { t } = useLocaleContext(); const { session } = useSessionContext(); const { currency, stripe } = usePaymentMethodContext(); const submit = useSubmitFeature(); const form = useCustomerFormFeature(); const mode = session?.mode || 'payment'; // Stripe dialog const stripeContext = submit.context?.type === 'stripe' ? submit.context : null; const showStripeDialog = submit.status === 'waiting_stripe' && stripeContext?.clientSecret; return ( <> {/* Stripe Payment Dialog */} {showStripeDialog && ( )?.allow_skip_payment_method}` === 'true' ? submit.stripeSkip : undefined } /> )} {/* Price Change Confirmation Dialog — reuse V1's PriceChangeConfirm component */} {submit.status === 'confirming_price' && submit.context?.type === 'price_change' && ( )} {/* Fast Pay Confirmation Dialog */} {submit.status === 'confirming_fast_pay' && submit.context?.type === 'fast_pay' && ( {t('payment.checkout.fastPay.credit.meteringSubscriptionMessage', { available: `${formatTokenAmount(submit.context.amount || '0', currency)} ${currency?.symbol || ''}`, })} ) : ( {t('payment.checkout.fastPay.autoPaymentReason')} {t('payment.checkout.fastPay.payer')} {submit.context.payer ? `${submit.context.payer.slice(0, 10)}...${submit.context.payer.slice(-6)}` : ''} {t('payment.checkout.fastPay.amount')} {formatTokenAmount(submit.context.amount || '0', currency)} {currency?.symbol || ''} ) } loading={false} color="primary" /> )} {/* Service Suspended Dialog */} {(submit.context as any)?.type === 'service_suspended' && } {/* Credit Insufficient Dialog (matches V1 ConfirmDialog) */} {submit.status === 'credit_insufficient' && submit.context?.type === 'credit_insufficient' && ( {t('payment.checkout.fastPay.credit.insufficientMessage')}} confirm={t('common.confirm')} /> )} ); }