"use client"; import { useQuery } from "@tanstack/react-query"; import { useRouter } from "@tanstack/react-router"; 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 { preCreateOrder, purchase } from "@workspace/ui/services/user/order"; import { LoaderCircle } from "lucide-react"; import { useCallback, useEffect, useRef, useState, useTransition } from "react"; import { useTranslation } from "react-i18next"; import CouponInput from "@/sections/subscribe/coupon-input"; import DurationSelector from "@/sections/subscribe/duration-selector"; import PaymentMethods from "@/sections/subscribe/payment-methods"; import { PromoInfo } from "@/sections/subscribe/promo-info"; import { useGlobalStore } from "@/stores/global"; 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 } = useTranslation("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( undefined ); const selectedDiscount = subscribe?.discount?.find( (item) => item.quantity === params.quantity ); const { data: order } = useQuery({ enabled: !!subscribe?.id, queryKey: [ "preCreateOrder", subscribe?.id, params.quantity, params.payment, params.coupon, ], 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) { const defaultQuantity = subscribe.show_original_price === false && subscribe.discount?.[0] ? subscribe.discount[0].quantity : 1; setParams((prev) => ({ ...prev, quantity: defaultQuantity, 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.navigate({ to: "/payment", search: { order_no: orderNo } }); } } catch (_error) { /* empty */ } }); }, [params, router, getUserInfo]); return ( { if (!open) setSubscribe(undefined); }} open={!!subscribe?.id} > {t("buySubscription", "Buy Subscription")}
{ handleChange("quantity", value); }} quantity={params.quantity as number} showOriginalPrice={subscribe?.show_original_price} unitTime={subscribe?.unit_time} /> handleChange("coupon", value)} /> { handleChange("payment", value); }} value={params.payment as number} />
); }