import React, { useState, useEffect, useMemo } from 'react'; import { Building2, Users, Plus, Search, Target, ArrowUpRight, Loader2, CheckCircle2, AlertCircle, Edit2, X } from 'lucide-react'; import { getTeams, getUsers, getAttendances, createTeam, updateTeam } from '../services/dataService'; import { User, Attendance } from '../types'; export const Teams: React.FC = () => { const [teams, setTeams] = useState([]); const [users, setUsers] = useState([]); const [attendances, setAttendances] = useState([]); const [loading, setLoading] = useState(true); const [isSaving, setIsSaving] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const [editingTeam, setEditingTeam] = useState(null); const [searchTerm, setSearchTerm] = useState(''); const [toast, setToast] = useState<{message: string, type: 'success' | 'error'} | null>(null); const [formData, setFormData] = useState({ name: '', description: '' }); const showToast = (message: string, type: 'success' | 'error') => { setToast({ message, type }); setTimeout(() => setToast(null), 4000); }; const loadData = async () => { const tid = localStorage.getItem('ctms_tenant_id'); if (!tid) return; setLoading(true); try { const [ft, fu, fa] = await Promise.all([ getTeams(tid), getUsers(tid), getAttendances(tid, { dateRange: { start: new Date(0), end: new Date() }, userId: 'all', teamId: 'all' }) ]); setTeams(ft); setUsers(fu); setAttendances(fa); } catch (e) { console.error(e); } finally { setLoading(false); } }; useEffect(() => { loadData(); }, []); const stats = useMemo(() => teams.map(t => { const tu = users.filter(u => u.team_id === t.id); const ta = attendances.filter(a => tu.some(u => u.id === a.user_id)); const wins = ta.filter(a => a.converted).length; const rate = ta.length > 0 ? (wins / ta.length) * 100 : 0; return { ...t, memberCount: tu.length, leads: ta.length, rate: rate.toFixed(1) }; }), [teams, users, attendances]); const filtered = stats.filter(t => t.name.toLowerCase().includes(searchTerm.toLowerCase())); const handleSave = async (e: React.FormEvent) => { e.preventDefault(); setIsSaving(true); try { const tid = localStorage.getItem('ctms_tenant_id') || ''; if (editingTeam) { if (await updateTeam(editingTeam.id, formData)) { showToast('Atualizado!', 'success'); setIsModalOpen(false); loadData(); } } else { if (await createTeam({ ...formData, tenantId: tid })) { showToast('Criado!', 'success'); setIsModalOpen(false); loadData(); } } } catch (e) { showToast('Erro', 'error'); } finally { setIsSaving(false); } }; if (loading && teams.length === 0) return
Carregando...
; return (

Times

Desempenho por grupo.

{filtered.map(t => (

{t.name}

{t.description || 'Sem descrição'}

Membros{t.memberCount}
Conversão{t.rate}%
))}
{isModalOpen && (

{editingTeam ? 'Editar' : 'Novo'} Time

setFormData({...formData, name:e.target.value})} className="w-full border p-2 rounded-lg" required />