"use client"; import * as React from "react"; import { useReactTable, getCoreRowModel, getSortedRowModel, getPaginationRowModel, ColumnDef, flexRender, } from "@tanstack/react-table"; import type { UserProps } from "@/lib/types/UserProps"; import { ArrowUpDown, Edit, Trash2 } from "lucide-react"; import { useRouter } from "next/navigation"; interface UserTableProps { users?: UserProps[] | null; } export default function UserTable({ users }: UserTableProps) { const router = useRouter(); const [sorting, setSorting] = React.useState([] as any); const [filter, setFilter] = React.useState(""); const [deletingId, setDeletingId] = React.useState(null); const [pageSize, setPageSize] = React.useState(10); const data = React.useMemo(() => (Array.isArray(users) ? users : []), [users]); async function handleDelete(id: number) { if (!confirm("Confirmer la suppression de cet utilisateur ?")) return; try { setDeletingId(id); const res = await fetch(`/api/user/${id}`, { method: "DELETE" }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(err.error || "Erreur lors de la suppression."); } router.refresh(); } catch (e: any) { alert(e.message ?? "Erreur interne."); } finally { setDeletingId(null); } } const columns = React.useMemo[]>( () => [ { accessorKey: "icone", header: "", cell: ({ row }) => ( {`${row.original.firstName} ), }, { accessorKey: "firstName", header: ({ column }) => ( ), cell: ({ row }) => row.original.firstName ?? "", }, { accessorKey: "lastName", header: ({ column }) => ( ), cell: ({ row }) => row.original.lastName ?? "", }, { accessorKey: "email", header: "Email", cell: ({ row }) => row.original.email ?? "" }, { accessorKey: "role", header: "Rôle", cell: ({ row }) => row.original.role ?? "" }, { accessorKey: "dob", header: "Date de naissance", cell: ({ row }) => { const d = new Date(row.original.dob as any); return isNaN(d.getTime()) ? "" : d.toLocaleDateString("fr-FR"); }, }, { accessorKey: "createdAt", header: "Créé le", cell: ({ row }) => { const d = new Date(row.original.createdAt as any); return isNaN(d.getTime()) ? "" : d.toLocaleDateString("fr-FR"); }, }, { id: "actions", header: "Actions", cell: ({ row }) => { const user = row.original; return (
); }, }, ], [deletingId, router] ); const filtered = React.useMemo(() => { const q = filter.toLowerCase(); return data.filter( (u) => (u.firstName ?? "").toLowerCase().includes(q) || (u.lastName ?? "").toLowerCase().includes(q) || (u.email ?? "").toLowerCase().includes(q) ); }, [data, filter]); const table = useReactTable({ data: filtered, columns, state: { sorting, pagination: { pageIndex: 0, pageSize, }, }, onSortingChange: setSorting, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getPaginationRowModel: getPaginationRowModel(), }); React.useEffect(() => { table.setPageSize(pageSize); }, [pageSize, table]); return (

Utilisateurs

setFilter(e.target.value)} className="w-60 rounded border px-3 py-2" />
{table.getHeaderGroups().map((hg) => ( {hg.headers.map((header) => ( ))} ))} {table.getRowModel().rows.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( ))} )) ) : ( )}
{header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}
{flexRender(cell.column.columnDef.cell, cell.getContext())}
Aucun utilisateur trouvé.
Page {table.getState().pagination.pageIndex + 1} sur{" "} {table.getPageCount() || 1} — {filtered.length} au total
); }