"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Loader2, Save } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; const formSchema = z.object({ name: z.string().min(1, "Name is required"), email: z.string().email("Invalid email address"), role: z.enum(["super-admin", "admin", "user"]), }); type FormData = z.infer; interface User { id: string; name: string; email: string; role: string; } interface UserFormProps { user?: User; isCurrentUser?: boolean; } export function UserForm({ user, isCurrentUser }: UserFormProps) { const router = useRouter(); const [isLoading, setIsLoading] = useState(false); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: user?.name || "", email: user?.email || "", role: (user?.role as "super-admin" | "admin" | "user") || "user", }, }); async function onSubmit(data: FormData) { setIsLoading(true); try { const response = await fetch(`/api/admin/users/${user?.id}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data), }); if (!response.ok) { const result = await response.json(); throw new Error(result.error || "Failed to update user"); } toast.success("User updated successfully"); router.push("/admin/users"); router.refresh(); } catch (error) { toast.error(error instanceof Error ? error.message : "An error occurred"); } finally { setIsLoading(false); } } return (
( Name )} /> ( Email )} /> ( Role {isCurrentUser && ( You cannot change your own role )} )} />
); }