"use client" import type React from "react" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Loader2, UserPlus } from "lucide-react" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import * as z from "zod" // 表单验证模式 const formSchema = z.object({ name: z .string() .min(2, { message: "用户名至少需要2个字符", }) .max(30, { message: "用户名不能超过30个字符", }), email: z.string().email({ message: "请输入有效的邮箱地址", }), phone: z.string().optional(), role: z.string({ required_error: "请选择用户角色", }), status: z.enum(["活跃", "未激活", "已禁用"], { required_error: "请选择用户状态", }), address: z.string().optional(), }) type UserFormDialogProps = { open?: boolean onOpenChange?: (open: boolean) => void onSubmit: (data: z.infer) => Promise defaultValues?: Partial> mode: "add" | "edit" roles: Array<{ id: string; name: string }> trigger?: React.ReactNode } export function UserFormDialog({ open, onOpenChange, onSubmit, defaultValues, mode, roles, trigger, }: UserFormDialogProps) { const [isSubmitting, setIsSubmitting] = useState(false) const [dialogOpen, setDialogOpen] = useState(open || false) const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { name: "", email: "", phone: "", role: "", status: "未激活", address: "", ...defaultValues, }, }) // 当defaultValues改变时重置表单 useEffect(() => { if (defaultValues) { form.reset({ name: defaultValues.name || "", email: defaultValues.email || "", phone: defaultValues.phone || "", role: defaultValues.role || "", status: defaultValues.status || "未激活", address: defaultValues.address || "", }) } }, [defaultValues, form]) // 同步内部状态和外部状态 useEffect(() => { if (open !== undefined) { setDialogOpen(open) } }, [open]) const handleOpenChange = (newOpen: boolean) => { setDialogOpen(newOpen) if (onOpenChange) { onOpenChange(newOpen) } // 如果对话框关闭,重置表单 if (!newOpen) { form.reset() } } const handleSubmit = async (data: z.infer) => { setIsSubmitting(true) try { await onSubmit(data) handleOpenChange(false) } catch (error) { console.error("提交失败:", error) } finally { setIsSubmitting(false) } } return ( {trigger || ( )} {mode === "add" ? "添加用户" : "编辑用户"} {mode === "add" ? "创建新的系统用户" : "修改用户信息"}
( 用户名 )} /> ( 邮箱地址 )} />
( 电话号码 )} /> ( 用户角色 )} />
( 用户状态 未激活的用户需要完成邮箱验证,已禁用的用户无法登录系统 )} /> ( 地址 )} /> {mode === "add" && (

注意事项

创建用户后,系统将自动发送邮件通知用户设置密码。

)}
) }