"use client" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Alert, AlertDescription } from "@/components/ui/alert" import { Badge } from "@/components/ui/badge" import { Checkbox } from "@/components/ui/checkbox" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Edit2, Plus, Save, X, Loader2, RefreshCw, Users, Shield, Trash2 } from "lucide-react" import { isAdmin, getCurrentUserEmail } from "@/lib/auth" const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:5000/api/v1" interface User { _id: { $oid: string } email: string roles: string[] } interface UsersResponse { success: boolean data: User[] } interface UserResponse { success: boolean user: User } interface CreateUserRequest { email: string password: string roles: string[] } interface UpdateUserRequest { email: string password?: string roles: string[] } interface DeleteUserResponse { success: boolean message: string } interface UpdateUserResponse { success: boolean message: string } // Roles disponíveis no sistema const AVAILABLE_ROLES = [ { id: "admin", label: "Administrador", description: "Acesso total ao sistema" }, { id: "user", label: "Usuário", description: "Acesso parcial, não pode gerenciar usuários" }, ] export default function UserManagement() { const [users, setUsers] = useState([]) const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState("") const [success, setSuccess] = useState("") // Estados para criação de usuário const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false) const [isCreating, setIsCreating] = useState(false) const [createForm, setCreateForm] = useState({ email: "", password: "", roles: [], }) // Estados para edição de usuário const [editingUser, setEditingUser] = useState(null) const [editForm, setEditForm] = useState({ email: "", password: "", roles: [], }) const [isUpdating, setIsUpdating] = useState(false) // Estados para exclusão const [isDeleting, setIsDeleting] = useState(null) const getAuthHeaders = () => { const token = localStorage.getItem("access_token") return { Authorization: `Bearer ${token}`, "Content-Type": "application/json", } } const fetchUsers = async () => { setIsLoading(true) setError("") try { const response = await fetch(`${API_BASE_URL}/users`, { method: "GET", headers: getAuthHeaders(), }) if (response.ok) { const result: UsersResponse = await response.json() setUsers(result.data || []) } else { const errorData = await response.json() setError(errorData.message || "Erro ao buscar usuários") } } catch (err) { setError("Erro de conexão com o servidor") } finally { setIsLoading(false) } } const createUser = async () => { if (!createForm.email || !createForm.password || createForm.roles.length === 0) { setError("Preencha todos os campos obrigatórios") return } setIsCreating(true) setError("") setSuccess("") try { const response = await fetch(`${API_BASE_URL}/auth/signup`, { method: "POST", headers: getAuthHeaders(), body: JSON.stringify(createForm), }) if (response.ok) { const result = await response.json() setSuccess("Usuário criado com sucesso!") setCreateForm({ email: "", password: "", roles: [] }) setIsCreateDialogOpen(false) await fetchUsers() } else { const errorData = await response.json() setError(errorData.message || "Erro ao criar usuário") } } catch (err) { setError("Erro de conexão com o servidor") } finally { setIsCreating(false) } } const updateUser = async (userId: string) => { if (!editForm.email || editForm.roles.length === 0) { setError("Preencha todos os campos obrigatórios") return } setIsUpdating(true) setError("") setSuccess("") try { const updateData: UpdateUserRequest = { email: editForm.email, roles: editForm.roles, } // Só incluir password se foi preenchido if (editForm.password && editForm.password.trim() !== "") { updateData.password = editForm.password } const response = await fetch(`${API_BASE_URL}/users/${userId}`, { method: "PATCH", headers: getAuthHeaders(), body: JSON.stringify(updateData), }) if (response.ok) { const result: UpdateUserResponse = await response.json() setSuccess("Usuário atualizado com sucesso!") setEditingUser(null) setEditForm({ email: "", password: "", roles: [] }) await fetchUsers() } else { const errorData = await response.json() setError(errorData.message || "Erro ao atualizar usuário") } } catch (err) { setError("Erro de conexão com o servidor") } finally { setIsUpdating(false) } } const deleteUser = async (userId: string) => { if (!confirm("Tem certeza que deseja excluir este usuário? Esta ação não pode ser desfeita.")) { return } setIsDeleting(userId) setError("") setSuccess("") try { const response = await fetch(`${API_BASE_URL}/users/${userId}`, { method: "DELETE", headers: getAuthHeaders(), }) if (response.ok) { const result: DeleteUserResponse = await response.json() setSuccess("Usuário excluído com sucesso!") await fetchUsers() } else { const errorData = await response.json() setError(errorData.message || "Erro ao excluir usuário") } } catch (err) { setError("Erro de conexão com o servidor") } finally { setIsDeleting(null) } } const startEditUser = (user: User) => { setEditingUser(user._id.$oid) setEditForm({ email: user.email, password: "", // Deixar vazio para não alterar a senha roles: [...user.roles], }) } const cancelEditUser = () => { setEditingUser(null) setEditForm({ email: "", password: "", roles: [] }) } const handleEditRoleChange = (roleId: string, checked: boolean | "indeterminate") => { if (checked === true) { setEditForm((prev) => ({ ...prev, roles: [...prev.roles, roleId] })) } else { setEditForm((prev) => ({ ...prev, roles: prev.roles.filter((role) => role !== roleId) })) } } const handleCreateRoleChange = (roleId: string, checked: boolean | "indeterminate") => { if (checked === true) { setCreateForm((prev) => ({ ...prev, roles: [...prev.roles, roleId] })) } else { setCreateForm((prev) => ({ ...prev, roles: prev.roles.filter((role) => role !== roleId) })) } } const getRoleBadgeVariant = (role: string) => { switch (role) { case "admin": return "destructive" as const case "financeiro": return "default" as const case "user": return "secondary" as const default: return "outline" as const } } const getRoleLabel = (roleId: string) => { const role = AVAILABLE_ROLES.find((r) => r.id === roleId) return role ? role.label : roleId } const canDeleteUser = (user: User) => { const currentUserEmail = getCurrentUserEmail() // Não permitir que o usuário delete a si mesmo return user.email !== currentUserEmail } useEffect(() => { fetchUsers() }, []) // Verificar se o usuário tem permissão para gerenciar usuários if (!isAdmin()) { return (

Acesso Negado

Você não tem permissão para acessar o gerenciamento de usuários. Entre em contato com um administrador.

) } return (
{/* Cabeçalho com botão de criar */}
Criar Novo Usuário Preencha as informações do novo usuário e suas permissões
setCreateForm((prev) => ({ ...prev, email: e.target.value }))} placeholder="usuario@exemplo.com" />
setCreateForm((prev) => ({ ...prev, password: e.target.value }))} placeholder="Senha do usuário" minLength={8} />
{AVAILABLE_ROLES.map((role) => (
handleCreateRoleChange(role.id, checked as boolean)} />

{role.description}

))}
{error && ( {error} )} {success && ( {success} )} {/* Tabela de Usuários */} Lista de Usuários ({users.length} usuários) {users.length > 0 ? (
Email Permissões Ações {users.map((user) => ( {editingUser === user._id.$oid ? ( setEditForm((prev) => ({ ...prev, email: e.target.value }))} placeholder="Email do usuário" /> ) : (
{user.email}
)} {editingUser === user._id.$oid && (
setEditForm((prev) => ({ ...prev, password: e.target.value }))} placeholder="Nova senha (deixe vazio para não alterar)" />
)}
{editingUser === user._id.$oid ? (
{AVAILABLE_ROLES.map((role) => (
handleEditRoleChange(role.id, checked as boolean)} />
))}
) : (
{user.roles.map((role) => ( {getRoleLabel(role)} ))}
)}
{editingUser === user._id.$oid ? ( <> ) : ( <> {canDeleteUser(user) && ( )} )}
))}
) : (
{isLoading ? "Carregando..." : "Nenhum usuário encontrado."}
)}
) }