import { useEffect, useMemo, useState } from 'react'; import { Link, useOutletContext } from 'react-router-dom'; import { BriefcaseBusiness, Eye, Search } from 'lucide-react'; import DateRangePicker from '../components/DateRangePicker'; import PaginationControls from '../components/PaginationControls'; import RefreshStatus from '../components/RefreshStatus'; import { fetchSellerAnalytics } from '../dataService'; import { formatDisplayName, removeTrailingSellerId } from '../displayFormatters'; import type { DateRange, SellerAnalyticsItem } from '../types'; const formatNumber = (value: number) => new Intl.NumberFormat('pt-BR', { maximumFractionDigits: 0 }).format(value); const formatCurrency = (value: number) => new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(value); const SellersTableSkeleton = () => (
{[1, 2, 3, 4, 5, 6, 7, 8].map(item =>
)}
{[1, 2, 3, 4, 5, 6].map(row =>
{[1, 2, 3, 4, 5].map(column =>
)}
)}
); const Sellers = () => { const { dateRange, setDateRange } = useOutletContext<{ dateRange: DateRange; setDateRange: (range: DateRange) => void }>(); const [sellers, setSellers] = useState([]); const [isLoading, setIsLoading] = useState(true); const [search, setSearch] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(10); useEffect(() => { let isMounted = true; const load = async () => { setIsLoading(true); const rows = await fetchSellerAnalytics(dateRange); if (isMounted) { setSellers(rows); setIsLoading(false); } }; void load(); return () => { isMounted = false; }; }, [dateRange]); const visibleSellers = useMemo(() => { const term = search.trim().toLocaleLowerCase('pt-BR'); if (!term) return sellers; return sellers.filter(seller => `${seller.name} ${seller.id}`.toLocaleLowerCase('pt-BR').includes(term)); }, [search, sellers]); const totalPages = Math.ceil(visibleSellers.length / itemsPerPage); const safeCurrentPage = Math.min(currentPage, totalPages || 1); const startIndex = (safeCurrentPage - 1) * itemsPerPage; const paginatedSellers = visibleSellers.slice(startIndex, startIndex + itemsPerPage); return (

Vendedores

Performance comercial, carteira e produtos vendidos por responsável.

0} />

Equipe comercial

Selecione um vendedor para ver carteira, produtos e evolução.

{isLoading && !sellers.length ? ( ) : visibleSellers.length ? ( <>
{paginatedSellers.map((seller, index) => ( ))}
Posição Nome do vendedor Receita Pedidos Clientes Ticket médio Produtos vendidos Ações
{startIndex + index + 1}

{formatDisplayName(removeTrailingSellerId(seller.name))}

{seller.id.startsWith('name:') ? 'Sem ID Tiny' : `ID ${seller.id}`}

{formatCurrency(seller.revenue)} {formatNumber(seller.orderCount)} {formatNumber(seller.customerCount)} {formatCurrency(seller.averageTicket)} {formatNumber(seller.quantitySold)} un. ({formatNumber(seller.orderCount)} {seller.orderCount === 1 ? 'pedido' : 'pedidos'})
{ setItemsPerPage(pageSize); setCurrentPage(1); }} /> ) : (

Nenhum vendedor encontrado.

Ajuste a busca ou o período selecionado.

)}
); }; export default Sellers;