"use client" import { useEffect, useState } from "react" import { useRouter } from "next/navigation" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Plus, Search, Trash2, Loader2, RefreshCw, Pencil, Eye, ChevronLeft, ChevronRight, Users, ShieldAlert, UserCheck, Clock } from "lucide-react" import { usersApi, adminCompaniesApi, type ApiUser, type AdminCompany } from "@/lib/api" import { getCurrentUser, isAdminUser } from "@/lib/auth" import { toast } from "sonner" import { Skeleton } from "@/components/ui/skeleton" import { useTranslation } from "@/lib/i18n" import { motion } from "framer-motion" const userDateFormatter = new Intl.DateTimeFormat("pt-BR", { dateStyle: "medium", }) export default function AdminUsersPage() { const router = useRouter() const { t } = useTranslation() const [users, setUsers] = useState([]) const [loading, setLoading] = useState(true) const [searchTerm, setSearchTerm] = useState("") const [page, setPage] = useState(1) const [totalUsers, setTotalUsers] = useState(0) const [isDialogOpen, setIsDialogOpen] = useState(false) const [isEditDialogOpen, setIsEditDialogOpen] = useState(false) const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false) const [creating, setCreating] = useState(false) const [updating, setUpdating] = useState(false) const [deleting, setDeleting] = useState(false) const [viewing, setViewing] = useState(false) const [selectedUser, setSelectedUser] = useState(null) const [companies, setCompanies] = useState([]) const [currentUser, setCurrentUser] = useState(null) const [formData, setFormData] = useState({ name: "", email: "", password: "", role: "candidate", status: "active", companyId: "", }) const [editFormData, setEditFormData] = useState({ name: "", email: "", role: "", status: "", password: "", }) useEffect(() => { const user = getCurrentUser() if (!isAdminUser(user)) { router.push("/dashboard") return } setCurrentUser(user as ApiUser) loadUsers() if (user?.role === 'superadmin') { loadCompanies() } }, [router]) const loadCompanies = async () => { try { const data = await adminCompaniesApi.list(undefined, 1, 100) setCompanies(data.data || []) } catch (error) { } } const limit = 10 const totalPages = Math.max(1, Math.ceil(totalUsers / limit)) const loadUsers = async (targetPage = page) => { const pageNum = typeof targetPage === 'number' ? targetPage : page try { setLoading(true) const data = await usersApi.list({ page: pageNum, limit }) setUsers(data?.data || []) setTotalUsers(data?.pagination?.total || 0) setPage(data?.pagination?.page || pageNum) } catch (error) { toast.error("Erro ao carregar usuários") } finally { setLoading(false) } } const handleCreate = async () => { try { setCreating(true) await usersApi.create({ ...formData, roles: [formData.role] }) toast.success("Usuário criado com sucesso") setIsDialogOpen(false) setFormData({ name: "", email: "", password: "", role: "candidate", status: "active", companyId: "" }) loadUsers(1) } catch (error: any) { toast.error(error.message || "Erro ao criar usuário") } finally { setCreating(false) } } const handleEdit = (user: ApiUser, isViewing = false) => { setSelectedUser(user) setEditFormData({ name: user.name, email: user.email, role: user.role, status: user.status || "active", password: "", }) setViewing(isViewing) setIsEditDialogOpen(true) } const handleUpdate = async () => { if (!selectedUser) return try { setUpdating(true) const payload: any = { ...editFormData, roles: [editFormData.role] } if (!payload.password) delete payload.password await usersApi.update(selectedUser.id, payload) toast.success("Usuário atualizado com sucesso") setIsEditDialogOpen(false) loadUsers() } catch (error) { toast.error("Erro ao atualizar usuário") } finally { setUpdating(false) } } const confirmDelete = async () => { if (!selectedUser) return try { setDeleting(true) await usersApi.delete(selectedUser.id) toast.success("Usuário excluído com sucesso") loadUsers(page) setIsDeleteDialogOpen(false) } catch (error) { toast.error("Erro ao excluir usuário") } finally { setDeleting(false) } } const getRoleBadge = (role: string) => { const variants: any = { superadmin: "destructive", admin: "default", recruiter: "secondary", candidate: "outline" } return {role} } const filteredUsers = users.filter( (user) => user.name?.toLowerCase().includes(searchTerm.toLowerCase()) || user.email?.toLowerCase().includes(searchTerm.toLowerCase()) ) return (
{/* Header */}

Gerenciar Usuários

Controle de acessos e permissões da plataforma

Criar Novo Usuário Preencha os dados para adicionar um novo membro.
setFormData({ ...formData, name: e.target.value })} />
setFormData({ ...formData, email: e.target.value })} />
setFormData({ ...formData, password: e.target.value })} />
{/* Stats */}
Total de Usuários
{totalUsers}
Administradores
{users.filter(u => u.role === "admin" || u.role === "superadmin").length}
Ativos agora
{users.filter(u => u.status === "active").length}
Novos (24h)
--
{/* Main Content */}
setSearchTerm(e.target.value)} className="pl-10 h-11 border-muted-foreground/20" />
{loading ? (
{[...Array(5)].map((_, i) => )}
) : ( Nome E-mail Papel Status Criado em Ações {filteredUsers.length === 0 ? ( Nenhum usuário encontrado ) : ( filteredUsers.map((user) => ( {user.name} {user.email} {getRoleBadge(user.role)} {user.status === "active" ? "Ativo" : "Inativo"} {user.created_at || (user as any).createdAt ? userDateFormatter.format(new Date(user.created_at || (user as any).createdAt)) : "-"}
)) )}
)} {!loading && totalPages > 1 && (

Página {page} de {totalPages}

)}
{/* Edit / View Dialog */} {viewing ? "Detalhes do Usuário" : "Editar Usuário"}
setEditFormData({ ...editFormData, name: e.target.value })} readOnly={viewing} />
setEditFormData({ ...editFormData, email: e.target.value })} readOnly={viewing} />
{!viewing && (
setEditFormData({ ...editFormData, password: e.target.value })} />
)}
{!viewing && ( )}
setIsDeleteDialogOpen(false)} onConfirm={confirmDelete} title="Excluir Usuário" description={`Tem certeza que deseja excluir ${selectedUser?.name}?`} />
) }