import { zodResolver } from "@hookform/resolvers/zod"; import { useMutation } from "@tanstack/react-query"; import { Plus, UserPlus } from "lucide-react"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; import { Button } from "~/client/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "~/client/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "~/client/components/ui/form"; import { Input } from "~/client/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~/client/components/ui/select"; import { authClient } from "~/client/lib/auth-client"; const createUserSchema = z.object({ name: z.string().min(1), username: z.string().min(1), email: z.string().email(), password: z.string().min(8), role: z.enum(["user", "admin"]), }); type CreateUserFormValues = z.infer; interface CreateUserDialogProps { onUserCreated?: () => void; } export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) { const [isOpen, setIsOpen] = useState(false); const form = useForm({ resolver: zodResolver(createUserSchema), defaultValues: { name: "", username: "", email: "", password: "", role: "user", }, }); const createUserMutation = useMutation({ mutationFn: async (values: CreateUserFormValues) => { const { error } = await authClient.admin.createUser({ email: values.email, password: values.password, name: values.name, role: values.role, data: { username: values.username }, }); if (error) { throw new Error(error.message); } }, onSuccess: () => { toast.success("User created successfully"); setIsOpen(false); form.reset(); onUserCreated?.(); }, onError: (error: Error) => { toast.error("Failed to create user", { description: error.message }); }, }); return (
createUserMutation.mutate(values))} className="space-y-6"> Create New User Fill in the details to create a new user account.
( Full Name )} /> ( Username )} /> ( Email )} /> ( Password )} /> ( Role )} />
); }