import { useEffect, useState } 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 { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from "./ui/select"; import { useApi } from "@/hooks/use-api"; import { Role, User } from "@/types/types"; import { Badge } from "./ui/badge"; import { Building, X } from "lucide-react"; // Define the Role schema based on assumed Role type const roleSchema = z.object({ id: z.string().min(1, "Role ID is required"), name: z.string().min(1, "Role name is required"), }); 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."), roles: z .array(roleSchema) .min(1, "At least one role is required") .optional(), }); 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 { data: availableRoles = [] } = useApi("/roles", {}, true); // Fetch roles const form = useForm({ resolver: zodResolver(schema), defaultValues: member?.userId ? member : { userId: "", firstname: "", lastname: "", email: "", password: "", phone: "", roles: [], // Default to empty array }, }); useEffect(() => { if (member) { form.reset(member); } else { form.reset({ userId: "", firstname: "", lastname: "", email: "", password: "", phone: "", roles: [], }); } }, [member, form]); const [selectedRole, setSelectedRole] = useState(null); const addRole = () => { if (selectedRole) { const currentRoles = form.getValues("roles"); if (!currentRoles?.some((role) => role.id === selectedRole.id)) { form.setValue( "roles", [...(currentRoles || []), selectedRole], { shouldValidate: true, }, ); } setSelectedRole(null); // Reset selection } }; const removeRole = (roleToRemove: Role) => { const currentRoles = form.getValues("roles"); form.setValue( "roles", currentRoles?.filter((role) => role.id !== roleToRemove.id), { shouldValidate: true }, ); }; const onSubmit = (data: Member) => { onSave(data); onClose(); }; return ( {member ? "Mise à jour du membre" : "Créer un nouveau membre"}
{/* Firstname Field */} ( Prénom )} /> {/* Lastname Field */} ( Nom )} /> {/* Email Field */} ( Email )} /> {/* Password Field (only for new members) */} {!member?.userId && ( ( Mot de passe )} /> )} {/* Phone Field */} ( Phone number )} /> {/* Roles Field */} ( Roles
{field.value?.map((role) => ( {role.name} ))}
)} />
); }