import React, { useState, useEffect, useMemo } from 'react'; import { Building2, Users, Plus, Search, Target, ArrowUpRight, Loader2, 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 [formData, setFormData] = useState({ name: '', description: '' }); 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, rate: rate.toFixed(1) }; }), [teams, users, attendances]); const handleSave = async (e: React.FormEvent) => { e.preventDefault(); setIsSaving(true); try { const tid = localStorage.getItem('ctms_tenant_id') || ''; const success = editingTeam ? await updateTeam(editingTeam.id, formData) : await createTeam({ ...formData, tenantId: tid }); if (success) { setIsModalOpen(false); loadData(); } } catch (err) { alert('Erro ao salvar'); } finally { setIsSaving(false); } }; if (loading && teams.length === 0) return
Carregando...
; return (

Times

Visualize o desempenho e gerencie seus grupos de vendas.

{stats.map(t => (

{t.name}

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

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

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

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-zinc-100 outline-none focus:ring-2 focus:ring-brand-yellow/20 transition-all" required />