import React, { useState, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { ChevronDown, ChevronUp, ChevronsUpDown } from 'lucide-react'; import { User } from '../types'; interface SellerStat { user: User; total: number; avgScore: string; conversionRate: string; responseTime: string; } interface SellersTableProps { data: SellerStat[]; } type SortKey = keyof SellerStat | 'name'; // 'name' is inside user object export const SellersTable: React.FC = ({ data }) => { const navigate = useNavigate(); const [sortKey, setSortKey] = useState('conversionRate'); const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc'); const handleSort = (key: SortKey) => { if (sortKey === key) { setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc'); } else { setSortKey(key); setSortDirection('desc'); } }; const sortedData = useMemo(() => { return [...data].sort((a, b) => { let aValue: any = a[sortKey as keyof SellerStat]; let bValue: any = b[sortKey as keyof SellerStat]; if (sortKey === 'name') { aValue = a.user.name; bValue = b.user.name; } else { // Convert strings like "85.5" to numbers for sorting aValue = parseFloat(aValue as string); bValue = parseFloat(bValue as string); } if (aValue < bValue) return sortDirection === 'asc' ? -1 : 1; if (aValue > bValue) return sortDirection === 'asc' ? 1 : -1; return 0; }); }, [data, sortKey, sortDirection]); const SortIcon = ({ column }: { column: SortKey }) => { if (sortKey !== column) return ; return sortDirection === 'asc' ? : ; }; return (

Ranking de Vendedores

{sortedData.map((item, idx) => ( navigate(`/users/${item.user.id}`)} > ))} {sortedData.length === 0 && ( )}
handleSort('name')} >
Usuário
handleSort('total')} >
Atendimentos
handleSort('avgScore')} >
Nota Média
handleSort('responseTime')} >
Tempo Resp.
handleSort('conversionRate')} >
Conversão
#{idx + 1}
{item.user.name}
{item.user.email}
{item.total} = 80 ? 'bg-green-100 text-green-700' : parseFloat(item.avgScore) >= 60 ? 'bg-yellow-100 text-yellow-700' : 'bg-red-100 text-red-700'}`}> {item.avgScore} {item.responseTime} min
{item.conversionRate}%
Nenhum dado disponível para o período selecionado.
); };