import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; const memberSchema = z.object({ userId: z.string().optional(), firstname: z.string().min(1, "Prénom est requis."), lastname: z.string().min(1, "Nom de famille est requis."), email: z.string().email("Adresse email invalide."), password: z .string() .min(6, "Le mot de passe doit avoir au moins 6 caractères.") .optional(), phone: z.string().regex(/^\d{10}$/, "Le numéro doit avoir 10 chiffres."), role: z.string().min(1, "Le rôle est requis."), }); const updateMemberSchema = memberSchema.partial(); export type Member = z.infer; interface MemberDialogProps { isOpen: boolean; onClose: () => void; member: Member | null; onSave: (member: Member) => void; } export default function MemberDialog({ isOpen, onClose, member, onSave, }: MemberDialogProps) { const schema = member?.userId ? updateMemberSchema : memberSchema; const form = useForm({ resolver: zodResolver(schema), defaultValues: member?.userId ? member : { userId: "", firstname: "", lastname: "", email: "", password: "", phone: "", role: "", }, }); useEffect(() => { if (member) { form.reset(member); } else { form.reset({ userId: "", firstname: "", lastname: "", email: "", password: "", phone: "", role: "", }); } }, [member, form]); const onSubmit = (data: Member) => { onSave(data); onClose(); }; return ( {member ? "Mis à jour du membre" : "Créer un nouveau membre"}
{( [ "userId", "firstname", "lastname", "email", "password", "phone", "role", ] as const ).map((field) => ( ( {field.name .charAt(0) .toUpperCase() + field.name.slice(1)} )} /> ))}
); }