import { memo, useRef } from 'react'; import { Form } from 'antd'; import { useTranslation } from 'react-i18next'; import { useResponsive } from '@/hooks/useSize'; import OrderSummary from './components/OrderSummary'; import PayMethodCard from './components/PayMethodCard'; import PlanCard from './components/PlanCard'; import UserInfo from './components/UserInfo'; import { useAction } from './useAction'; import { usePlanCardsHeightSync } from './usePlanCardsHeightSync'; import { useService } from './useService'; import type { Plan } from './useService'; const PRICING_FORM_ID = 'pricing-form'; export interface PlanSelectorProps { value?: string; onChange?: (planId: string) => void; plans: Plan[]; planCardsContainerRef: React.RefObject; isMobile: boolean; } function PlanSelector({ value, onChange, plans, planCardsContainerRef, isMobile, }: PlanSelectorProps) { return (
} data-count={plans.length} className={ isMobile ? 'flex-col-c gap-5' : 'grid grid-cols-4 gap-x-8 gap-y-4 [&[data-count="1"]]:grid-cols-3 [&[data-count="2"]]:grid-cols-3 [&[data-count="3"]]:grid-cols-3' } > {plans.map((plan) => ( onChange?.(plan.id)} /> ))}
); } export interface PayMethodSelectorProps { value?: string; onChange?: (payType: string) => void; payMethods: API.PayTypeItem[]; isMobile: boolean; } function PayMethodSelector({ value, onChange, payMethods, isMobile }: PayMethodSelectorProps) { return (
*]:flex-[1_1_calc(50%-1rem)] [&>*]:max-w-[calc(50%-1rem)]' } > {payMethods.map((item) => ( onChange?.(item.payType)} /> ))}
); } const Pricing = memo(() => { const { t } = useTranslation(); const { isMobile } = useResponsive(); const [form] = Form.useForm<{ planId: string; payMethod: string }>(); const planCardsContainerRef = useRef(null); const { plans, payMethods } = useService(); const { handlePayNow } = useAction(); const planId = Form.useWatch('planId', form); const payMethod = Form.useWatch('payMethod', form); const selectedPlan = plans.find((p) => p.id === planId) ?? null; const selectedPayMethod = payMethod ?? null; usePlanCardsHeightSync(planCardsContainerRef, isMobile, plans.length); const onFinish = (values: { planId: string; payMethod: string }) => { const plan = plans.find((p) => p.id === values.planId); if (!plan || !values.payMethod) return; handlePayNow(plan, values.payMethod); }; return (
{t('pages.pricing.title')}
{t('pages.pricing.selecPlan')}
{t('pages.pricing.selectPayMethod')}
); }); Pricing.displayName = 'Pricing'; export default Pricing;