'use client' import {Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle} from '@/components/ui/dialog' import {Button} from '@/components/ui/button' import Image from 'next/image' import imgBalance from './_assets/balance.svg' import {useState} from 'react' import {useProfileStore} from '@/components/stores/profile' import {Alert, AlertTitle} from '@/components/ui/alert' import {toast} from 'sonner' import {useRouter} from 'next/navigation' import {completeResource, createResource, CreateResourceReq, prepareResource} from '@/actions/resource' import { TradeMethod, TradePlatform, } from '@/lib/models/trade' import {PaymentModal} from '@/components/composites/payment/payment-modal' import {PaymentProps} from '@/components/composites/payment/type' export type PayProps = { amount: string resource: CreateResourceReq } & ({ method: 'alipay' | 'wechat' } | { method: 'balance' balance: number }) export default function Pay(props: PayProps) { const refreshProfile = useProfileStore(store => store.refreshProfile) const [open, setOpen] = useState(false) const [trade, setTrade] = useState(null) const router = useRouter() const onOpen = async () => { setOpen(true) if (props.method === 'balance') { return } const method = props.method === 'alipay' ? TradeMethod.SftAlipay : TradeMethod.SftWechat const response = await prepareResource({ ...props.resource, payment_method: method, payment_platform: TradePlatform.Desktop, }) if (!response.success) { toast.error(`创建订单失败: ${response.message}`) setOpen(false) return } setTrade({ inner_no: response.data.trade_no, pay_url: response.data.pay_url, amount: Number(props.amount), platform: TradePlatform.Desktop, method, }) } const purchase = async (showFail: boolean) => { try { let resp: Awaited> | Awaited> if (props.method === 'balance') { resp = await createResource(props.resource) } else if (trade) { resp = await completeResource({ trade_no: trade.inner_no, method: trade.method, }) } else { throw new Error('支付信息不存在') } if (!resp.success) { throw new Error(resp.message) } setOpen(false) setTrade(null) toast.success('购买成功', { action: { label: '去提取', onClick: () => router.push('/admin/extract'), }, }) refreshProfile() } catch (e) { if (showFail) { toast.error('购买失败', { description: (e as Error).message, }) } } } const balanceEnough = props.method == 'balance' && props.balance >= Number(props.amount) return (
{props.method === 'balance' && ( 余额 余额支付
账户余额 {props.balance} 元
支付金额 - {props.amount} 元

支付后余额 {(props.balance - Number(props.amount)).toFixed(2)} 元
{balanceEnough ? ( 检查无误后,点击确认支付按钮完成支付 ) : ( 余额不足,请先充值或选择其他支付方式 )}
)} {props.method !== 'balance' && trade && ( { setTrade(null) setOpen(false) }} /> )}
) }