'use client'; import CouponInput from '@/components/subscribe/coupon-input'; import DurationSelector from '@/components/subscribe/duration-selector'; import PaymentMethods from '@/components/subscribe/payment-methods'; import useGlobalStore from '@/config/use-global'; import { preCreateOrder, purchase } from '@/services/user/order'; import { useQuery } from '@tanstack/react-query'; import { Button } from '@workspace/ui/components/button'; import { Card, CardContent } from '@workspace/ui/components/card'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@workspace/ui/components/dialog'; import { Separator } from '@workspace/ui/components/separator'; import { LoaderCircle } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { useRouter } from 'next/navigation'; import { useCallback, useEffect, useRef, useState, useTransition } from 'react'; import { SubscribeBilling } from './billing'; import { SubscribeDetail } from './detail'; interface PurchaseProps { subscribe?: API.Subscribe; setSubscribe: (subscribe?: API.Subscribe) => void; } export default function Purchase({ subscribe, setSubscribe }: Readonly) { const t = useTranslations('subscribe'); const { getUserInfo } = useGlobalStore(); const router = useRouter(); const [params, setParams] = useState>({ quantity: 1, subscribe_id: 0, payment: -1, coupon: '', }); const [loading, startTransition] = useTransition(); const lastSuccessOrderRef = useRef(null); const { data: order } = useQuery({ enabled: !!subscribe?.id, queryKey: ['preCreateOrder', params], queryFn: async () => { try { const { data } = await preCreateOrder({ ...params, subscribe_id: subscribe?.id 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; } }, }); useEffect(() => { if (subscribe) { setParams((prev) => ({ ...prev, quantity: 1, subscribe_id: subscribe?.id, })); } }, [subscribe]); 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) { getUserInfo(); router.push(`/payment?order_no=${orderNo}`); } } catch (error) { /* empty */ } }); }, [params, router, getUserInfo]); return ( { if (!open) setSubscribe(undefined); }} > {t('buySubscription')}
{ handleChange('quantity', value); }} /> handleChange('coupon', value)} /> { handleChange('payment', value); }} />
); }