'use client' import {use, useEffect, useRef, useState} from 'react' import Link from 'next/link' import {useFormContext, useWatch} from 'react-hook-form' import {Card} from '@/components/ui/card' import {buttonVariants} from '@/components/ui/button' import {useProfileStore} from '@/components/stores/profile' import Pay from '@/components/composites/purchase/pay' import {FieldPayment} from './field-payment' import {buildPurchaseResource, PurchaseKind, PurchaseSelection} from './resource' import {getPrice, getPriceHome} from '@/actions/resource' import {ExtraResp} from '@/lib/api' import {formatPurchaseLiveLabel} from './sku' import {User} from '@/lib/models' import {PurchaseFormValues} from './form-values' import {IdCard} from 'lucide-react' const emptyPrice: ExtraResp = { price: '0.00', actual: '0.00', discounted: '0.00', } export type PurchaseSidePanelProps = { kind: PurchaseKind } export function PurchaseSidePanel(props: PurchaseSidePanelProps) { const {control} = useFormContext() const method = useWatch({control, name: 'pay_type'}) as PurchaseFormValues['pay_type'] const mode = useWatch({control, name: 'type'}) as PurchaseFormValues['type'] const live = useWatch({control, name: 'live'}) as PurchaseFormValues['live'] const quota = useWatch({control, name: 'quota'}) as PurchaseFormValues['quota'] const expire = useWatch({control, name: 'expire'}) as PurchaseFormValues['expire'] const dailyLimit = useWatch({control, name: 'daily_limit'}) as PurchaseFormValues['daily_limit'] const profile = use(useProfileStore(store => store.profile)) const selection: PurchaseSelection = { kind: props.kind, mode, live, quota, expire, dailyLimit, } const priceData = usePurchasePrice(profile, selection) const {price, actual: discountedPrice = '0.00'} = priceData const totalDiscount = getTotalDiscount(price, discountedPrice) const hasDiscount = Number(totalDiscount) > 0 const liveLabel = formatPurchaseLiveLabel(live, props.kind) const resource = buildPurchaseResource(selection) return (

订单详情

  • 套餐名称 {mode === '2' ? '包量套餐' : '包时套餐'}
  • IP 时效 {liveLabel}
  • {mode === '2' ? ( <>
  • 购买 IP 量 {quota} 个
  • 原价 ¥{price}
  • {hasDiscount && (
  • 总折扣 -¥{totalDiscount}
  • )} ) : ( <>
  • 套餐时长 {expire} 天
  • 每日限额 {dailyLimit} 个
  • 原价 ¥{price}
  • {hasDiscount && (
  • 总折扣 -¥{totalDiscount}
  • )} )}

实付价格 ¥{discountedPrice}

{profile ? ( profile.id_type !== 0 ? ( <> ) : (

根据监管要求,您需要完成实名认证后才能支付。

去实名认证
) ) : ( 登录后支付 )}
) } function usePurchasePrice(profile: User | null, selection: PurchaseSelection) { const [priceData, setPriceData] = useState>(emptyPrice) const requestIdRef = useRef(0) const {kind, mode, live, quota, expire, dailyLimit} = selection useEffect(() => { const requestId = ++requestIdRef.current const loadPrice = async () => { try { const resource = buildPurchaseResource({ kind, mode, live, quota, expire, dailyLimit, }) const response = profile ? await getPrice(resource) : await getPriceHome(resource) if (requestId !== requestIdRef.current) { return } if (!response.success) { throw new Error(response.message || '获取价格失败') } setPriceData({ price: response.data.price, actual: response.data.actual ?? response.data.price ?? '0.00', discounted: response.data.discounted ?? '0.00', }) } catch (error) { if (requestId !== requestIdRef.current) { return } console.error('获取价格失败:', error) setPriceData(emptyPrice) } } loadPrice() }, [dailyLimit, expire, kind, live, mode, profile, quota]) return priceData } function getTotalDiscount(price: string, discountedPrice: string) { const originalPrice = Number.parseFloat(price) const actualPrice = Number.parseFloat(discountedPrice) if (Number.isNaN(originalPrice) || Number.isNaN(actualPrice)) { return '0.00' } return (originalPrice - actualPrice).toFixed(2) }