import React, { useState, useEffect } from 'react'; import { Users, Plus, Mail, Search, X, Edit, Trash2, Loader2, AlertTriangle } from 'lucide-react'; import { getUsers, getTeams, createMember, deleteUser, updateUser, getUserById } from '../services/dataService'; import { User } from '../types'; export const TeamManagement: React.FC = () => { const [users, setUsers] = useState([]); const [teams, setTeams] = 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 [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 }); const loadData = async () => { const tid = localStorage.getItem('ctms_tenant_id'); const uid = localStorage.getItem('ctms_user_id'); if (!tid) return; setLoading(true); try { const [fu, ft, me] = await Promise.all([getUsers(tid), getTeams(tid), uid ? getUserById(uid) : null]); setUsers(fu.filter(u => u.role !== 'super_admin')); setTeams(ft); 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 success = editingUser ? await updateUser(editingUser.id, formData) : await createMember({ ...formData, tenant_id: tid }); if (success) { setIsModalOpen(false); loadData(); } } catch (err) { alert('Erro ao salvar'); } 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'; const filtered = users.filter(u => u.name.toLowerCase().includes(searchTerm.toLowerCase()) || u.email.toLowerCase().includes(searchTerm.toLowerCase())); const getRoleLabel = (role: string) => { 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" />
{canManage && } {filtered.map(user => ( {canManage && ( )} ))}
Usuário Função Time StatusAções
{user.name}
{user.email}
{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 />
)} {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" />
)}
); };