import React, { useState, useEffect } from "react"; import { useAuth } from "../contexts/AuthContext"; import { getPendingUsers, approveUser as apiApproveUser, rejectUser as apiRejectUser, updateUserRole, } from "../services/apiService"; import { UserApprovalStatus, UserRole } from "../types"; import { CheckCircle, XCircle, Clock, Search, Filter, Users, Briefcase, Edit2, } 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) { const mappedUsers = result.data.map((u: any) => ({ ...u, approvalStatus: u.ativo ? UserApprovalStatus.APPROVED : UserApprovalStatus.PENDING, })); 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); await fetchUsers(); } catch (error) { console.error("Erro ao aprovar usuário:", error); alert("Erro ao aprovar usuário"); } finally { setIsProcessing(null); } }; const handleRoleChange = async (userId: string, newRole: string) => { if (!token) return; try { // Optimistic update setUsers(prev => prev.map(u => u.id === userId ? {...u, role: newRole} : u)); await updateUserRole(userId, newRole, token); // Refresh to be sure // await fetchUsers(); // Optional if we trust optimistic } catch (error) { console.error("Erro ao atualizar role:", error); alert("Erro ao atualizar função do usuário"); // Revert? simpler to just fetch fetchUsers(); } }; // Separar usuários Clientes (EVENT_OWNER) e Profissionais (PHOTOGRAPHER) // Backend roles: PHOTOGRAPHER, EVENT_OWNER, BUSINESS_OWNER, SUPERADMIN, RESEARCHER const clientUsers = users.filter( (user) => user.role === "EVENT_OWNER" ); const professionalUsers = users.filter( (user) => user.role === "PHOTOGRAPHER" || user.role === "RESEARCHER" || user.role === "BUSINESS_OWNER" // Include BUSINESS_OWNER if relevant for professional list? Usually Business owner is client-side but maybe here it's treated differently. based on login.tsx business owner is "Dono do Negócio". Let's stick to PHOTOGRAPHER + RESEARCHER as per request, but user explicitly mentioned "admin ter liberdade de editar role". ); // 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()); return matchesSearch; }); const getStatusBadge = (status: UserApprovalStatus) => { 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" && ( )} {/* Role Column */} {filteredUsers.length === 0 ? ( ) : ( filteredUsers.map((user, index) => ( {activeTab === "cliente" && ( )} {/* Role Editor */} )) )}
Nome Empresa Email Telefone Função 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 )}
) }
); };