From 2498437f25a68a71322b1feccfdfeb6640361dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Faleiros?= Date: Tue, 4 Aug 2026 10:30:50 -0300 Subject: [PATCH] Paginate seller revenue trend --- src/pages/SellerDetails.tsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/pages/SellerDetails.tsx b/src/pages/SellerDetails.tsx index 869e352..71bd885 100644 --- a/src/pages/SellerDetails.tsx +++ b/src/pages/SellerDetails.tsx @@ -2,6 +2,7 @@ import { useEffect, useMemo, useState } from 'react'; import { Link, useOutletContext, useParams } from 'react-router-dom'; import { ArrowLeft } from 'lucide-react'; import DateRangePicker from '../components/DateRangePicker'; +import PaginationControls from '../components/PaginationControls'; import { fetchSellerDetailsAnalytics } from '../dataService'; import { formatDisplayName, removeTrailingSellerId } from '../displayFormatters'; import type { DateRange, SellerDetailsAnalytics } from '../types'; @@ -14,6 +15,8 @@ const SellerDetails = () => { const { dateRange, setDateRange } = useOutletContext<{ dateRange: DateRange; setDateRange: (range: DateRange) => void }>(); const [details, setDetails] = useState(null); const [isLoading, setIsLoading] = useState(true); + const [trendPage, setTrendPage] = useState(1); + const trendPageSize = 14; useEffect(() => { let isMounted = true; @@ -27,6 +30,10 @@ const SellerDetails = () => { }, [dateRange, sellerId]); const maxRevenue = useMemo(() => Math.max(...(details?.chartData.map(item => item.revenue) || [1]), 1), [details]); + const trendTotalPages = Math.ceil((details?.chartData.length || 0) / trendPageSize); + const safeTrendPage = Math.min(trendPage, trendTotalPages || 1); + const trendStartIndex = (safeTrendPage - 1) * trendPageSize; + const paginatedTrend = details?.chartData.slice(trendStartIndex, trendStartIndex + trendPageSize) || []; if (isLoading && !details) return
{[1, 2, 3, 4].map(item =>
)}
; if (!details) return

Vendedor não encontrado no período.

Voltar para vendedores
; const { seller } = details; @@ -39,13 +46,19 @@ const SellerDetails = () => {

{formatDisplayName(removeTrailingSellerId(seller.name))}

Carteira, produtos e resultado comercial no período selecionado.

- + { setDateRange(range); setTrendPage(1); }} />
{[['Receita', formatCurrency(seller.revenue), 'text-brand-primary'], ['Pedidos', formatNumber(seller.orderCount), 'text-dark-text'], ['Clientes', formatNumber(seller.customerCount), 'text-dark-text'], ['Ticket médio', formatCurrency(seller.averageTicket), 'text-dark-text']].map(([label, value, color]) =>

{label}

{value}

)}
-

Evolução da receita

Vendas por dia no período.

{details.chartData.length ? details.chartData.map(point =>
{new Date(`${point.date}T12:00:00`).toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit' })}
{formatCurrency(point.revenue)}
) :

Sem vendas no período.

}
+
+

Evolução da receita

Vendas por dia no período.

+ {details.chartData.length ? <> +
{paginatedTrend.map(point =>
{new Date(`${point.date}T12:00:00`).toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit' })}
{formatCurrency(point.revenue)}
)}
+ setTrendPage(1)} className="border-t border-dark-border px-4 py-3" /> + :

Sem vendas no período.

} +

Canais

Receita por marketplace.

{details.marketplaces.map(item =>

{item.name}

{formatCurrency(item.revenue)} · {formatNumber(item.orderCount)} pedidos

)}