'use client'; import useGlobalStore from '@/config/use-global'; import { preCreateOrder, purchase } from '@/services/user/order'; import { useQuery } from '@tanstack/react-query'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@workspace/airo-ui/components/dialog'; import { Button } from '@workspace/ui/components/button'; import { Separator } from '@workspace/ui/components/separator'; import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; import { LoaderCircle } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { useRouter } from 'next/navigation'; import { forwardRef, useCallback, useImperativeHandle, useRef, useState, useTransition, } from 'react'; import { SubscribeBilling } from './billing'; import { SubscribeDetail } from './detail'; interface PurchaseProps { subscribe?: API.Subscribe; } interface PurchaseDialogRef { show: (subscribe: API.Subscribe, tabValue: string) => void; hide: () => void; } const Purchase = forwardRef((props, ref) => { const t = useTranslations('subscribe'); const { getUserInfo } = useGlobalStore(); const router = useRouter(); const [params, setParams] = useState>({ quantity: 1, subscribe_id: 0, payment: -1, coupon: '', }); const [subscribe, setSubscribe] = useState(props.subscribe); const [loading, startTransition] = useTransition(); const [open, setOpen] = useState(false); const lastSuccessOrderRef = useRef(null); const [tabValue, setTabValue] = useState('year'); useImperativeHandle(ref, () => ({ show: (newSubscribe: API.Subscribe, tabValue: string) => { setSubscribe(newSubscribe); setParams((prev) => ({ ...prev, subscribe_id: newSubscribe.id, quantity: tabValue === 'year' ? 12 : 1, })); setTabValue(tabValue); setOpen(true); }, hide: () => { setOpen(false); setSubscribe(undefined); setParams({ quantity: 1, subscribe_id: 0, payment: -1, coupon: '' }); }, })); const { data: order } = useQuery({ enabled: !!subscribe?.id && params.quantity !== undefined, queryKey: ['preCreateOrder', subscribe?.id, params.quantity], queryFn: async () => { try { const { data } = await preCreateOrder({ ...params, subscribe_id: subscribe?.id as number, quantity: params.quantity as number, } as API.PurchaseOrderRequest); const result = data.data; if (result) { lastSuccessOrderRef.current = result; } return result; } catch (error) { if (lastSuccessOrderRef.current) { return lastSuccessOrderRef.current; } throw error; } }, }); const handleChange = useCallback((field: keyof typeof params, value: string | number) => { setParams((prev) => ({ ...prev, [field]: value, })); }, []); const handleSubmit = useCallback(async () => { startTransition(async () => { try { const response = await purchase(params as API.PurchaseOrderRequest); const orderNo = response.data.data?.order_no; if (orderNo) { await getUserInfo(); router.push(`/dashboard`); } } catch (error) { /* empty */ } }); }, [params, router, getUserInfo]); return ( {t('buySubscription')}
{t('purchaseTitle')}
{ if (val === 'year') { handleChange('quantity', 12); } else if (val === 'month') { handleChange('quantity', 1); } setTabValue(val); }} > {tabValue === 'year' ? ( {t('discount20')} {/* 小三角箭头 */} {/* */} ) : null} {t('yearlyPlan')} {t('monthlyPlan')}
{t('paymentMethod')}
{t('walletBalance')}
); }); Purchase.displayName = 'Purchase'; export default Purchase;