"use client" import { zodResolver } from "@hookform/resolvers/zod" import { useEffect, useState } from "react" import { useForm } from "react-hook-form" import { toast } from "sonner" import { z } from "zod" import { getBalance } from "@/actions/cust" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Field, FieldError, FieldLabel } from "@/components/ui/field" import { Input } from "@/components/ui/input" import type { Cust } from "@/models/cust" const balanceSchema = z.object({ balance: z .string() .min(1, "请输入余额") .refine(val => !Number.isNaN(Number(val)), "请输入有效的数字") .refine(val => Number(val) >= 0, "余额不能为负数"), }) type BalanceFormValues = z.infer interface UpdateBalanceDialogProps { open: boolean onOpenChange: (open: boolean) => void currentUser: Cust | null onSuccess: () => void } export function BalanceDialog({ open, onOpenChange, currentUser, onSuccess, }: UpdateBalanceDialogProps) { const [isLoading, setIsLoading] = useState(false) const { register, handleSubmit, reset, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(balanceSchema), defaultValues: { balance: "", }, }) useEffect(() => { if (open && currentUser) { const currentBalance = currentUser.balance?.toString() || "0" const formattedBalance = Number(currentBalance).toFixed(2) setValue("balance", formattedBalance) } }, [open, currentUser, setValue]) const onSubmit = async (data: BalanceFormValues) => { if (!currentUser) return setIsLoading(true) try { const result = await getBalance({ user_id: currentUser.id, balance: data.balance, }) if (result.success) { toast.success("修改余额成功") onOpenChange(false) reset() onSuccess() } else { toast.error(result.message || "修改余额失败") } } catch (error) { const message = error instanceof Error ? error.message : error toast.error(`网络错误,请稍后重试: ${message}`) } finally { setIsLoading(false) } } const handleOpenChange = (open: boolean) => { if (!open) { reset() } onOpenChange(open) } return ( 修改余额 修改用户 {currentUser?.name || currentUser?.username} 的余额
余额(元) { if (!value) return "" const num = Number(value) if (Number.isNaN(num)) return value return num.toFixed(2) }, })} onInput={(e: React.ChangeEvent) => { let value = e.target.value if (value.startsWith("-")) { value = value.replace("-", "") } if (value.includes(".")) { const parts = value.split(".") if (parts[1] && parts[1].length > 2) { value = `${parts[0]}.${parts[1].slice(0, 2)}` } } setValue("balance", value) }} /> {errors.balance?.message}
) }