'use client' import {Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle} from '@/components/ui/dialog' import {Button} from '@/components/ui/button' import balance from './_assets/balance.svg' import Image from 'next/image' import {useState} from 'react' import {useProfileStore} from '@/components/stores-provider' import {Alert, AlertTitle} from '@/components/ui/alert' import {toast} from 'sonner' import {useRouter} from 'next/navigation' import {completeResource, createResource, prepareResource} from '@/actions/resource' import { TradeMethod, TradeMethodDecoration, } from '@/lib/models/trade' import {PaymentModal} from '@/components/composites/payment/payment-modal' import {PaymentProps} from '@/components/composites/payment/type' import {usePlatformType} from '@/lib/hooks' export type PayProps = { method: 'alipay' | 'wechat' | 'balance' amount: string resource: Parameters[0] } export default function Pay(props: PayProps) { const profile = useProfileStore(store => store.profile) const refreshProfile = useProfileStore(store => store.refreshProfile) const [open, setOpen] = useState(false) const [trade, setTrade] = useState(null) const router = useRouter() const platform = usePlatformType() const onOpen = async () => { setOpen(true) if (props.method === 'balance') return const method = props.method === 'alipay' ? TradeMethod.SftAlipay : TradeMethod.SftWechat const req = { ...props.resource, payment_method: method, payment_platform: platform, } const resp = await prepareResource(req) if (!resp.success) { toast.error(`创建订单失败: ${resp.message}`) setOpen(false) return } setTrade({ inner_no: resp.data.trade_no, pay_url: resp.data.pay_url, amount: Number(props.amount), platform: platform, method: method, decoration: TradeMethodDecoration[props.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 = profile && profile.balance >= Number(props.amount) return ( <> {/* 余额支付对话框 */} {props.method === 'balance' && ( 余额 余额支付 {profile && (
账户余额 {profile.balance} 元
支付金额 - {props.amount} 元

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