"use client"; import { useMemo, useState, useTransition } from "react"; import { useRouter } from "next/navigation"; import { Search, ShieldCheck, User as UserIcon } from "lucide-react"; import { Panel, PanelHeader } from "@/components/ui/panel"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Pill } from "@/components/ui/pill"; import { EmptyState, TBody, TD, TH, THead, TR, Table } from "@/components/ui/table"; import { formatDateTime } from "@/lib/format"; import type { PlatformUser } from "@/lib/platform-types"; import { updateUserStatus } from "./actions"; export function UsuariosView({ users }: { users: PlatformUser[] }) { const [query, setQuery] = useState(""); const rows = useMemo(() => { const q = query.trim().toLowerCase(); if (!q) return users; return users.filter((u) => u.email.toLowerCase().includes(q) || u.name.toLowerCase().includes(q)); }, [users, query]); return (

Usuários

Todos os usuários da plataforma, cross-tenant (agente.md secao 148, 168) — criar usuário novo continua só junto com um tenant (Clientes > Tenants) ou via a tela do próprio tenant; aqui só visão + desabilitar.

setQuery(e.target.value)} placeholder="Buscar usuário…" className="pl-8" aria-label="Buscar usuário" />
{rows.length === 0 ? ( ) : ( {rows.map((u) => ( ))}
Nome E-mail Tipo Status Criado Ações
)}
); } function UserRow({ user }: { user: PlatformUser }) { const router = useRouter(); const [pending, startTransition] = useTransition(); const [error, setError] = useState(null); function toggle() { setError(null); const next = user.status === "ACTIVE" ? "DISABLED" : "ACTIVE"; startTransition(async () => { const result = await updateUserStatus(user.id, next); if (!result.ok) { setError(result.error); return; } router.refresh(); }); } return ( {user.name} {user.email} {user.isPlatformUser ? ( Platform admin ) : ( Tenant )} {user.status === "ACTIVE" ? "Ativo" : "Desabilitado"} {formatDateTime(user.createdAt)}
{error && {error}}
); }