import React, { useState, useEffect } from "react"; import { useAuth } from "../contexts/AuthContext"; import { getPendingUsers, approveUser as apiApproveUser, rejectUser as apiRejectUser, } from "../services/apiService"; import { UserApprovalStatus } from "../types"; import { CheckCircle, XCircle, Clock, Search, Filter, Users, Briefcase, } from "lucide-react"; import { Button } from "../components/Button"; interface UserApprovalProps { onNavigate?: (page: string) => void; } export const UserApproval: React.FC = ({ onNavigate }) => { const { token } = useAuth(); const [users, setUsers] = useState([]); const [isLoading, setIsLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(""); const [statusFilter, setStatusFilter] = useState<"ALL" | UserApprovalStatus>( "ALL" ); const [activeTab, setActiveTab] = useState<"cliente" | "profissional">( "cliente" ); const [isProcessing, setIsProcessing] = useState(null); const fetchUsers = async () => { if (!token) { setIsLoading(false); return; } setIsLoading(true); try { const result = await getPendingUsers(token); if (result.data) { // Mapear dados do backend para o formato esperado pelo componente, se necessário // Supondo que o backend retorna estrutura compatível ou fazemos o map aqui const mappedUsers = result.data.map((u: any) => ({ ...u, approvalStatus: u.ativo ? UserApprovalStatus.APPROVED : UserApprovalStatus.PENDING, // Simplificação, backend deve retornar status real se houver rejected // Se o backend não retornar status explícito, assumimos pendente se !ativo // Mas idealmente o backend retornaria um status enum })); setUsers(mappedUsers); } } catch (error) { console.error("Erro ao buscar usuários:", error); } finally { setIsLoading(false); } }; useEffect(() => { fetchUsers(); }, [token]); const handleApprove = async (userId: string) => { if (!token) return; setIsProcessing(userId); try { await apiApproveUser(userId, token); // Atualizar lista após aprovação await fetchUsers(); } catch (error) { console.error("Erro ao aprovar usuário:", error); alert("Erro ao aprovar usuário"); } finally { setIsProcessing(null); } }; const handleReject = async (userId: string) => { if (!token) return; setIsProcessing(userId); try { await apiRejectUser(userId, token); await fetchUsers(); } catch (error) { console.error("Erro ao rejeitar usuário:", error); alert("Erro ao rejeitar usuário"); } finally { setIsProcessing(null); } }; // Separar usuários Clientes (EVENT_OWNER) e Profissionais (PHOTOGRAPHER) // Backend roles: PHOTOGRAPHER, EVENT_OWNER, BUSINESS_OWNER, SUPERADMIN const clientUsers = users.filter( (user) => user.role === "EVENT_OWNER" ); const professionalUsers = users.filter( (user) => user.role === "PHOTOGRAPHER" ); // Filtrar usuários baseado na aba ativa const currentUsers = activeTab === "cliente" ? clientUsers : professionalUsers; const filteredUsers = currentUsers.filter((user) => { const matchesSearch = (user.name || "").toLowerCase().includes(searchTerm.toLowerCase()) || (user.email || "").toLowerCase().includes(searchTerm.toLowerCase()); // Remover filtro por registeredInstitution se não vier do backend ainda // Por enquanto, como o backend retorna apenas pendentes na rota /pending (conforme nome da rota), // o statusFilter pode ser redundante se a rota só traz pendentes. // Mas se o backend trouxer todos, o filtro funciona. // Se a rota for /users/pending, assumimos que todos são pendentes. // VAMOS ASSUMIR QUE O BACKEND SÓ RETORNA PENDENTES POR ENQUANTO. // Mas para manter a UI, vamos considerar todos como Pendentes se status não vier. return matchesSearch; }); const getStatusBadge = (status: UserApprovalStatus) => { // Se status undefined, assume pendente para visualização const s = status || UserApprovalStatus.PENDING; switch (s) { case UserApprovalStatus.PENDING: return ( Pendente ); case UserApprovalStatus.APPROVED: return ( Aprovado ); case UserApprovalStatus.REJECTED: return ( Rejeitado ); default: return null; } }; return (
{/* Header */}

Aprovação de Cadastros

Gerencie os cadastros pendentes de aprovação

{/* Tabs */}
{/* Filters */}
{/* Search */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-brand-gold focus:border-transparent" />
{/* Table */}
{isLoading ? (
Carregando solicitações...
) : ( {activeTab === "cliente" && ( )} {filteredUsers.length === 0 ? ( ) : ( filteredUsers.map((user, index) => ( {activeTab === "cliente" && ( )} )) )}
Nome Empresa Email Telefone Data de Cadastro Status Ações
{activeTab === "cliente" ? ( ) : ( )}

{activeTab === "cliente" ? "Nenhum cadastro de empresa encontrado" : "Nenhum cadastro profissional encontrado"}

{user.name || user.email}
{user.company_name || "-"}
{user.email}
{user.phone || "-"}
{user.created_at ? new Date(user.created_at).toLocaleDateString( "pt-BR" ) : "-"}
{getStatusBadge( user.approvalStatus || UserApprovalStatus.PENDING )}
) }
); };