'use client'; import { SubscribeBilling } from '@/components/subscribe/billing'; import CouponInput from '@/components/subscribe/coupon-input'; import { SubscribeDetail } from '@/components/subscribe/detail'; import DurationSelector from '@/components/subscribe/duration-selector'; import PaymentMethods from '@/components/subscribe/payment-methods'; import useGlobalStore from '@/config/use-global'; import { prePurchaseOrder, purchase } from '@/services/user/portal'; import { useQuery } from '@tanstack/react-query'; import { Button } from '@workspace/ui/components/button'; import { Card, CardContent, CardHeader } from '@workspace/ui/components/card'; import { Separator } from '@workspace/ui/components/separator'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { Icon } from '@workspace/ui/custom-components/icon'; import { cn } from '@workspace/ui/lib/utils'; import { LoaderCircle } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { useRouter } from 'next/navigation'; import { useCallback, useEffect, useState, useTransition } from 'react'; export default function Content({ subscription }: { subscription?: API.Subscribe }) { const t = useTranslations('subscribe'); const { common } = useGlobalStore(); const router = useRouter(); const [params, setParams] = useState({ quantity: 1, subscribe_id: 0, payment: -1, coupon: '', auth_type: 'email', identifier: '', password: '', }); const [loading, startTransition] = useTransition(); const [isEmailValid, setIsEmailValid] = useState({ valid: false, message: '', }); const { data: order } = useQuery({ enabled: !!subscription?.id && !!params.payment, queryKey: ['preCreateOrder', params.coupon, params.quantity, params.payment], queryFn: async () => { const { data } = await prePurchaseOrder({ ...params, subscribe_id: subscription?.id as number, } as API.PrePurchaseOrderRequest); return data.data; }, }); useEffect(() => { if (subscription) { setParams((prev) => ({ ...prev, quantity: 1, subscribe_id: subscription?.id, })); } }, [subscription]); const handleChange = useCallback((field: keyof typeof params, value: string | number) => { setParams((prev) => ({ ...prev, [field]: value, })); }, []); const handleSubmit = useCallback(async () => { startTransition(async () => { try { const { data } = await purchase(params); const { order_no } = data.data!; if (order_no) { localStorage.setItem( order_no, JSON.stringify({ auth_type: params.auth_type, identifier: params.identifier, }), ); router.push(`/purchasing/order?order_no=${order_no}`); } } catch (error) { console.log(error); } }); }, [params, router]); if (!subscription) { return
{t('subscriptionNotFound')}
; } return (
输入要用于 {common.site.site_name} 账户的电子邮件地址
{ const email = value as string; setParams((prev) => ({ ...prev, identifier: email, })); const reg = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!reg.test(email)) { setIsEmailValid({ valid: false, message: '请输入有效的邮箱地址', }); } else if (common.auth.email.enable_domain_suffix) { const domain = email.split('@')[1]; const isValid = common.auth.email?.domain_suffix_list .split('\n') .includes(domain || ''); if (!isValid) { setIsEmailValid({ valid: false, message: '邮箱域名不在白名单中', }); return; } } else { setIsEmailValid({ valid: true, message: '', }); } }} required />

{isEmailValid.message || '请填写您的电子邮件地址。'}

{params.identifier && isEmailValid.valid && (
handleChange('password', value)} />

如果您不填写密码,我们将会自动生成密码并发送到您的邮箱。

)} {/*
*/}

{subscription.name}

    {(() => { let parsedDescription; try { parsedDescription = JSON.parse(subscription.description); } catch { parsedDescription = { description: '', features: [] }; } const { description, features } = parsedDescription; return ( <> {description &&
  • {description}
  • } {features?.map( ( feature: { icon: string; label: string; type: 'default' | 'success' | 'destructive'; }, index: number, ) => (
  • {feature.icon && ( )} {feature.label}
  • ), )} ); })()}
handleChange('quantity', value)} /> handleChange('coupon', value)} /> handleChange('payment', value)} />
); }