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[]; } export const SellersTable: React.FC = ({ data }) => { const navigate = useNavigate(); const [sortKey, setSortKey] = useState('total'); const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc'); const handleSort = (key: keyof SellerStat) => { if (sortKey === key) { setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc'); } else { setSortKey(key); setSortDirection('desc'); } }; const sortedData = useMemo(() => { return [...data].sort((a, b) => { const aVal = a[sortKey]; const bVal = b[sortKey]; if (typeof aVal === 'string' && typeof bVal === 'string') { return sortDirection === 'asc' ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal); } if (typeof aVal === 'number' && typeof bVal === 'number') { return sortDirection === 'asc' ? aVal - bVal : bVal - aVal; } // Handle user object (sort by name) if (sortKey === 'user') { return sortDirection === 'asc' ? a.user.name.localeCompare(b.user.name) : b.user.name.localeCompare(a.user.name); } return 0; }); }, [data, sortKey, sortDirection]); const SortIcon = ({ column }: { column: string }) => { if (sortKey !== column) return ; return sortDirection === 'asc' ? : ; }; return (

Ranking de Vendedores

{sortedData.map((item, idx) => ( navigate(`/users/${item.user.id}`)} > ))} {sortedData.length === 0 && ( )}
handleSort('user')} >
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 dark:bg-green-900/30 dark:text-green-400' : parseFloat(item.avgScore) >= 60 ? 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400' : 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'}`}> {item.avgScore} {item.responseTime} min
{item.conversionRate}%
Nenhum dado disponível para o período selecionado.
); };