"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import Header from "@/components/Header"; interface Usuario { id: string; identificador: string; nome: string; email: string; telefone?: string; cpf?: string; ativo: boolean; superadmin: boolean; nivel: string; registro_completo: boolean; enderecos: string[]; empresas_dados: string[]; createdAt: string; updatedAt: string; } interface Endereco { id: string; cep: string; logradouro: string; numero: string; complemento?: string; bairro: string; cidade: string; estado: string; } interface EmpresaDados { id: string; cnpj: string; "razao-social": string; "nome-fantasia": string; "data-abertura": string; situacao: string; "natureza-juridica": string; porte: string; "capital-social": number; telefone: string; email: string; "atividade-principal-codigo": string; "atividade-principal-desc": string; enderecos: string[]; } interface UsuarioCompleto extends Usuario { enderecoData?: Endereco; empresaData?: EmpresaDados; } const UsuariosPendentesPage = () => { const router = useRouter(); const [usuarios, setUsuarios] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [selectedUser, setSelectedUser] = useState(null); const [showDetailsModal, setShowDetailsModal] = useState(false); const [activatingUserId, setActivatingUserId] = useState(null); const [currentUser, setCurrentUser] = useState(null); // Usuário logado // Carregar dados do usuário logado useEffect(() => { const userData = localStorage.getItem('user'); if (userData) { try { setCurrentUser(JSON.parse(userData)); } catch (error) { console.error('Erro ao parsing dos dados do usuário:', error); } } }, []); // Buscar usuários pendentes const fetchUsuarios = async (pageNum: number = 1) => { try { setLoading(true); const token = localStorage.getItem('access_token'); if (!token) { router.push('/login'); return; } const response = await fetch( `${process.env.NEXT_PUBLIC_BFF_API_URL}/users?page=${pageNum}`, { method: 'GET', headers: { 'accept': 'application/json', 'Authorization': `Bearer ${token}`, }, } ); if (!response.ok) { throw new Error('Erro ao buscar usuários pendentes'); } const data = await response.json(); const rawUsuariosData = data.data || data.items || data || []; const usuariosData = Array.isArray(rawUsuariosData) ? rawUsuariosData.filter((usuario: any) => usuario?.ativo === false) : []; // Para cada usuário, buscar dados do endereço e empresa const usuariosCompletos = await Promise.all( usuariosData.map(async (usuario: Usuario) => { const usuarioCompleto: UsuarioCompleto = { ...usuario }; // Buscar dados do endereço if (usuario.enderecos && usuario.enderecos.length > 0) { try { const enderecoResponse = await fetch( `${process.env.NEXT_PUBLIC_BFF_API_URL}/enderecos/${usuario.enderecos[0]}`, { headers: { 'accept': 'application/json', 'Authorization': `Bearer ${token}`, }, } ); if (enderecoResponse.ok) { usuarioCompleto.enderecoData = await enderecoResponse.json(); } } catch (error) { console.error('Erro ao buscar endereço:', error); } } // Buscar dados da empresa if (usuario.empresas_dados && usuario.empresas_dados.length > 0) { try { const empresaResponse = await fetch( `${process.env.NEXT_PUBLIC_BFF_API_URL}/empresas/${usuario.empresas_dados[0]}`, { headers: { 'accept': 'application/json', 'Authorization': `Bearer ${token}`, }, } ); if (empresaResponse.ok) { usuarioCompleto.empresaData = await empresaResponse.json(); } } catch (error) { console.error('Erro ao buscar empresa:', error); } } return usuarioCompleto; }) ); setUsuarios(usuariosCompletos); // Se há paginação na resposta if (data.pagination) { setTotalPages(data.pagination.totalPages || 1); } } catch (error: any) { console.error('❌ Erro ao carregar usuários:', error); setError(error.message || 'Erro ao carregar usuários pendentes'); } finally { setLoading(false); } }; // Ativar usuário const ativarUsuario = async (usuarioId: string) => { try { setActivatingUserId(usuarioId); const token = localStorage.getItem('access_token'); const response = await fetch( `${process.env.NEXT_PUBLIC_BFF_API_URL}/users/${usuarioId}`, { method: 'PATCH', headers: { 'accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}`, }, body: JSON.stringify({ ativo: true }), } ); if (!response.ok) { throw new Error('Erro ao ativar usuário'); } // Recarregar lista await fetchUsuarios(page); // Fechar modal se estiver aberto if (showDetailsModal && selectedUser?.id === usuarioId) { setShowDetailsModal(false); setSelectedUser(null); } } catch (error: any) { console.error('❌ Erro ao ativar usuário:', error); setError(error.message || 'Erro ao ativar usuário'); } finally { setActivatingUserId(null); } }; // Ver detalhes do usuário const verDetalhes = (usuario: UsuarioCompleto) => { setSelectedUser(usuario); setShowDetailsModal(true); }; // Fechar modal de detalhes const closeDetailsModal = () => { setShowDetailsModal(false); setSelectedUser(null); }; // Carregar usuários ao montar componente useEffect(() => { fetchUsuarios(page); }, [page]); return (
{/* Cabeçalho da página */}

Usuários Pendentes

Gerencie usuários aguardando aprovação de cadastro

{/* Conteúdo */} {loading ? (

Carregando usuários pendentes...

) : error ? (

{error}

) : usuarios.length === 0 ? (

Nenhum usuário pendente

Todos os usuários foram processados ou não há cadastros aguardando aprovação.

) : (
{/* Tabela de usuários */}
{usuarios.map((usuario) => ( ))}
Usuário Empresa Data do Cadastro Status Ações
{usuario.nome?.charAt(0)?.toUpperCase() || 'U'}
{usuario.nome}
{usuario.email}
{usuario.empresaData?.['razao-social'] || 'Não informado'}
{usuario.empresaData?.cnpj || ''}
{new Date(usuario.createdAt).toLocaleDateString('pt-BR')}
{new Date(usuario.createdAt).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })}
Pendente
{/* Paginação */} {totalPages > 1 && (

Página {page} de{' '} {totalPages}

)}
)}
{/* Modal de Detalhes do Usuário */} {showDetailsModal && selectedUser && (
{/* Header do Modal (sticky para não sumir ao rolar) */}

Detalhes do Usuário

{/* Conteúdo do Modal - scrollable */}
{/* Informações Pessoais */}

Informações Pessoais

{selectedUser.nome}

{selectedUser.email}

{selectedUser.cpf || 'Não informado'}

{selectedUser.telefone || 'Não informado'}

{selectedUser.nivel}

{new Date(selectedUser.createdAt).toLocaleString('pt-BR')}

{/* Endereço */} {selectedUser.enderecoData && (

Endereço

{selectedUser.enderecoData.cep}

{selectedUser.enderecoData.logradouro}, {selectedUser.enderecoData.numero}

{selectedUser.enderecoData.complemento || 'Não informado'}

{selectedUser.enderecoData.bairro}

{selectedUser.enderecoData.cidade}

{selectedUser.enderecoData.estado}

)} {/* Empresa */} {selectedUser.empresaData && (

Dados da Empresa

{selectedUser.empresaData['razao-social']}

{selectedUser.empresaData['nome-fantasia'] || 'Não informado'}

{selectedUser.empresaData.cnpj}

{selectedUser.empresaData['data-abertura'] || 'Não informado'}

{selectedUser.empresaData.situacao || 'Não informado'}

{selectedUser.empresaData['natureza-juridica'] || 'Não informado'}

{selectedUser.empresaData.porte || 'Não informado'}

{selectedUser.empresaData['capital-social'] ? `R$ ${selectedUser.empresaData['capital-social'].toLocaleString('pt-BR')}` : 'Não informado'}

{selectedUser.empresaData.telefone || 'Não informado'}

{selectedUser.empresaData.email || 'Não informado'}

{selectedUser.empresaData['atividade-principal-codigo'] || selectedUser.empresaData['atividade-principal-desc'] ? `${selectedUser.empresaData['atividade-principal-codigo']} - ${selectedUser.empresaData['atividade-principal-desc']}` : 'Não informado'}

)}
{/* Footer do Modal (sticky para ficar visível) */}
)}
); }; export default UsuariosPendentesPage;