"use client"; import { useEffect, useState } from "react"; import { fmtDate } from "@/lib/format"; type U = { id: string; email: string; displayName: string | null; status: string; createdAt: string; roles: string[]; nListings: number }; export function AdminUsers() { const [q, setQ] = useState(""); const [rows, setRows] = useState([]); const load = () => fetch(`/api/admin/users?q=${encodeURIComponent(q)}`).then((r) => r.json()).then((j) => setRows(j.items ?? [])); useEffect(() => { const t = setTimeout(load, 250); return () => clearTimeout(t); }, [q]); // eslint-disable-line react-hooks/exhaustive-deps const act = async (id: string, action: string, role?: string) => { await fetch("/api/admin/users", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ id, action, role }) }); load(); }; return (

Utilisateurs

setQ(e.target.value)} placeholder="Rechercher un courriel" className="tv-chip ml-auto !pl-3" />

AGENT_VERIFIED n'est attribué qu'après vérification hors ligne (permis OACIQ, mandat) ; ADMIN exige un TOTP actif.

); }