'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, renewal } 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, DialogTrigger, } 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 RenewalProps { id: number; subscribe: API.Subscribe; } export default function Renewal({ id, subscribe }: Readonly) { const t = useTranslations('subscribe'); const { getUserInfo } = useGlobalStore(); const [open, setOpen] = useState(false); const router = useRouter(); const [params, setParams] = useState>({ quantity: 1, payment: -1, coupon: '', user_subscribe_id: id, }); const [loading, startTransition] = useTransition(); const lastSuccessOrderRef = useRef(null); const { data: order } = useQuery({ enabled: !!subscribe.id && open, queryKey: ['preCreateOrder', params], queryFn: async () => { try { const { data } = await preCreateOrder({ ...params, subscribe_id: subscribe.id, } as API.PurchaseOrderRequest); const result = data.data; if (result) { lastSuccessOrderRef.current = result; } return result; } catch (error) { if (lastSuccessOrderRef.current) { return lastSuccessOrderRef.current; } } }, }); useEffect(() => { if (subscribe.id && id) { setParams((prev) => ({ ...prev, quantity: 1, subscribe_id: subscribe.id, user_subscribe_id: id, })); } }, [subscribe.id, id]); 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 renewal(params as API.RenewalOrderRequest); const orderNo = response.data.data?.order_no; if (orderNo) { getUserInfo(); router.push(`/payment?order_no=${orderNo}`); } } catch (error) { /* empty */ } }); }, [params, router, getUserInfo]); return ( {t('renewSubscription')}
{ handleChange('quantity', value); }} /> handleChange('coupon', value)} /> { handleChange('payment', value); }} />
); }