"use client"; import { useState } from "react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; import MemberDialog, { Member } from "./member-dialog"; import { useApi } from "@/hooks/use-api"; import request from "@/lib/request"; import { Loader2, MoreHorizontal, UserRoundPlus } from "lucide-react"; import IUser from "@/interfaces/IUser"; import hasPermissions from "@/lib/hasPermissions"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "./ui/dropdown-menu"; export default function MembersTable({ user }: { user: IUser }) { const { data: members, error, mutate, success, isLoading, } = useApi("/users", undefined, true, false); const [dialogOpen, setDialogOpen] = useState(false); const [currentMember, setCurrentMember] = useState(null); const { users } = hasPermissions(user.roles, { users: ["delete", "update", "insert"], } as const); const handleOpenDialog = (member: Member | null) => { setCurrentMember(member); setDialogOpen(true); }; const handleSaveMember = async (savedMember: Member) => { if (savedMember.userId) { const dif = DiffUtils.getDifferences(currentMember!, savedMember); if (DiffUtils.isEmpty(dif)) return; const res = await request( `/users/${savedMember.userId}/update`, { body: dif, requiresAuth: true, method: "PATCH", }, ); if (res.status === "Success") mutate(); // Update existing member // setMembers((prev) => // prev.map((m) => // m.user_id === savedMember.user_id ? savedMember : m, // ), // ); } else { delete savedMember.userId; const res = await request("/users/new", { body: savedMember, method: "POST", requiresAuth: true, }); if (res.status === "Success") mutate(); } }; const handleDelete = async (userId: string) => { const res = await request(`/users/${userId}/delete`, { method: "DELETE", requiresAuth: true, }); if (res.status === "Success") mutate(); }; return (
{users.insert && ( )}
{isLoading && } Prénom Nom Email Téléphone Rôles Actions {members && members.map((_member) => ( {_member.firstname} {_member.lastname} {_member.email} {_member.phone} {_member.roles ?.map((r) => r.name) .join(", ")} {users.update && ( handleOpenDialog( _member, ) } > Mettre à jour )} {users.delete && ( handleDelete( _member.userId!, ) } > Supprimer )} ))}
setDialogOpen(false)} member={currentMember} onSave={handleSaveMember} />
); }