import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import { Users, Plus, Mail, Search, X, Edit, Trash2, Loader2, AlertTriangle } from 'lucide-react'; import { getUsers, getTeams, createMember, deleteUser, updateUser, getUserById, getTenants } from '../services/dataService'; import { User, Tenant } from '../types'; export const TeamManagement: React.FC = () => { const [users, setUsers] = useState([]); const [teams, setTeams] = useState([]); const [tenants, setTenants] = useState([]); const [loading, setLoading] = useState(true); const [isSaving, setIsSaving] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [tenantFilter, setTenantFilter] = useState('all'); const [currentUser, setCurrentUser] = useState(null); const [userToDelete, setUserToDelete] = useState(null); const [deleteConfirmName, setDeleteConfirmName] = useState(''); const [editingUser, setEditingUser] = useState(null); const [formData, setFormData] = useState({ name: '', email: '', role: 'agent' as any, team_id: '', status: 'active' as any, tenant_id: '' }); const loadData = async () => { const tid = localStorage.getItem('ctms_tenant_id'); const uid = localStorage.getItem('ctms_user_id'); if (!tid) return; setLoading(true); try { const me = uid ? await getUserById(uid) : null; const isSuperAdmin = me?.role === 'super_admin'; const effectiveTid = isSuperAdmin ? 'all' : tid; const promises: Promise[] = [ getUsers(effectiveTid), getTeams(effectiveTid) ]; if (isSuperAdmin) { promises.push(getTenants()); } const results = await Promise.all(promises); setUsers(isSuperAdmin ? results[0] : results[0].filter((u: User) => u.role !== 'super_admin')); setTeams(results[1]); if (isSuperAdmin && results[2]) { setTenants(results[2]); } if (me) setCurrentUser(me); } catch (err) { console.error(err); } finally { setLoading(false); } }; useEffect(() => { loadData(); }, []); const handleSave = async (e: React.FormEvent) => { e.preventDefault(); setIsSaving(true); try { const tid = localStorage.getItem('ctms_tenant_id') || ''; const finalTenantId = currentUser?.role === 'super_admin' ? formData.tenant_id : tid; if (editingUser) { const success = await updateUser(editingUser.id, { ...formData, tenant_id: finalTenantId }); if (success) { setIsModalOpen(false); loadData(); } } else { await createMember({ ...formData, tenant_id: finalTenantId }); setIsModalOpen(false); loadData(); } } catch (err: any) { alert(err.message || 'Erro ao salvar membro. Verifique se o e-mail já não está cadastrado.'); } finally { setIsSaving(false); } }; const handleConfirmDelete = async () => { if (!userToDelete || deleteConfirmName !== userToDelete.name) return; setIsSaving(true); try { if (await deleteUser(userToDelete.id)) { setIsDeleteModalOpen(false); loadData(); } } catch (err) { alert('Erro ao excluir'); } finally { setIsSaving(false); } }; if (loading && users.length === 0) return
Carregando...
; const canManage = currentUser?.role === 'admin' || currentUser?.role === 'super_admin' || currentUser?.role === 'manager'; const filtered = users.filter(u => (u.name.toLowerCase().includes(searchTerm.toLowerCase()) || u.email.toLowerCase().includes(searchTerm.toLowerCase())) && (tenantFilter === 'all' || u.tenant_id === tenantFilter) ); const getRoleLabel = (role: string) => { if (role === 'super_admin') return 'Super Admin'; if (role === 'admin') return 'Admin'; if (role === 'manager') return 'Gerente'; return 'Agente'; }; const getRoleBadge = (role: string) => { switch (role) { case 'admin': return 'bg-purple-100 text-purple-700 border-purple-200 dark:bg-purple-900/30 dark:text-purple-400 dark:border-purple-800'; case 'manager': return 'bg-blue-100 text-blue-700 border-blue-200 dark:bg-blue-900/30 dark:text-blue-400 dark:border-blue-800'; default: return 'bg-zinc-100 text-zinc-700 border-zinc-200 dark:bg-dark-input dark:text-dark-muted dark:border-dark-border'; } }; return (

Membros

Visualize e gerencie as funções dos membros da sua organização.

{canManage && ( )}
setSearchTerm(e.target.value)} className="w-full pl-9 pr-4 py-2 bg-white dark:bg-dark-bg border border-zinc-200 dark:border-dark-border rounded-lg text-sm text-zinc-900 dark:text-dark-text outline-none focus:ring-2 focus:ring-brand-yellow/20 transition-all" />
{currentUser?.role === 'super_admin' && ( )}
{currentUser?.role === 'super_admin' && } {canManage && } {filtered.map(user => ( {currentUser?.role === 'super_admin' && ( )} {canManage && ( )} ))}
UsuárioOrganizaçãoFunção Time StatusAções
{user.name}
{user.email}
{tenants.find(t => t.id === user.tenant_id)?.name || user.tenant_id} {getRoleLabel(user.role)} {teams.find(t => t.id === user.team_id)?.name || '-'} {user.status === 'active' ? 'Ativo' : 'Inativo'}
{isModalOpen && (

{editingUser ? 'Editar Usuário' : 'Novo Membro'}

setFormData({...formData, name:e.target.value})} className="w-full bg-white dark:bg-dark-input border border-zinc-200 dark:border-dark-border p-3 rounded-lg text-sm text-zinc-900 dark:text-dark-text outline-none focus:ring-2 focus:ring-brand-yellow/20" required />
setFormData({...formData, email:e.target.value})} className="w-full bg-white dark:bg-dark-input border border-zinc-200 dark:border-dark-border p-3 rounded-lg text-sm text-zinc-900 dark:text-dark-text disabled:bg-zinc-50 dark:disabled:bg-dark-bg/50 dark:disabled:text-dark-muted" disabled={!!editingUser} required />
{currentUser?.role === 'super_admin' && (
)}
)} {isDeleteModalOpen && userToDelete && (

Excluir {userToDelete.name}?

Esta ação é permanente. Para confirmar, digite o nome completo dele abaixo:

setDeleteConfirmName(e.target.value)} className="w-full bg-white dark:bg-dark-input border-2 border-red-50 dark:border-red-900/20 p-3 rounded-xl mb-8 text-center font-bold text-base text-zinc-900 dark:text-dark-text outline-none focus:ring-2 focus:ring-red-100 dark:focus:ring-red-900/40 transition-all" placeholder="Nome completo" />
)}
); };