"use client" import * as React from "react" import { useState } from "react" import { toast } from "sonner" import { Coins } from "lucide-react" import { Button } from "@/components/ui/button" import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { Spinner } from "@/components/ui/spinner" import { MerchantService, type MerchantAPIKey } from "@/lib/services" interface DistributeDialogProps { /** 自定义触发器 */ trigger?: React.ReactNode /** 商户凭证 */ apiKey?: Pick } /** * 商户分发对话框 * 商户向用户分发积分 */ export function DistributeDialog({ trigger, apiKey }: DistributeDialogProps) { const [open, setOpen] = useState(false) const [loading, setLoading] = useState(false) const [userId, setUserId] = useState("") const [username, setUsername] = useState("") const [amount, setAmount] = useState("") const [remark, setRemark] = useState("") const resetForm = () => { setUserId("") setUsername("") setAmount("") setRemark("") } const handleOpenChange = (newOpen: boolean) => { if (newOpen && !loading) { resetForm() } setOpen(newOpen) } const handleSubmit = async () => { if (!userId.trim()) { toast.error('表单验证失败', { description: '请填写用户 ID' }) return } if (!username.trim()) { toast.error('表单验证失败', { description: '请填写用户名' }) return } if (!amount.trim()) { toast.error('表单验证失败', { description: '请填写分发金额' }) return } const amountNum = parseFloat(amount) if (isNaN(amountNum) || amountNum <= 0) { toast.error('表单验证失败', { description: '分发金额必须大于 0' }) return } if (amountNum > 999999.99) { toast.error('表单验证失败', { description: '分发金额不能超过 999999.99' }) return } if (remark.length > 100) { toast.error('表单验证失败', { description: '备注不能超过 100 个字符' }) return } try { setLoading(true) if (!apiKey?.client_id || !apiKey?.client_secret) { toast.error('缺少应用凭证', { description: '请先创建应用并确认凭证可用' }) return } const result = await MerchantService.distribute({ user_id: Number(userId.trim()), username: username.trim(), amount: amountNum, remark: remark.trim() || undefined, }, { client_id: apiKey.client_id, client_secret: apiKey.client_secret, }) toast.success('分发成功', { description: `订单号: ${ result.trade_no }` }) setOpen(false) resetForm() } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : '分发失败' toast.error('分发失败', { description: errorMessage }) } finally { setLoading(false) } } return ( {trigger || ( )} 积分分发 向指定用户分发积分。您的积分将被扣除,对方收到的积分会扣除分发费率。
setUserId(e.target.value)} disabled={loading} className="h-8 text-xs" />
setUsername(e.target.value)} disabled={loading} className="h-8 text-xs" />
setAmount(e.target.value)} disabled={loading} className="h-8 text-xs" />