import { useEffect, useState } from 'react'; import { useParams, Link, useOutletContext } from 'react-router-dom'; import { ArrowLeft, Package, DollarSign } from 'lucide-react'; import { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'; import DateRangePicker from '../components/DateRangePicker'; import RefreshStatus from '../components/RefreshStatus'; import type { DateRange, ProductDetailsAnalytics } from '../types'; import { fetchProductDetailsAnalytics } from '../dataService'; const CHART_GRID_COLOR = 'var(--chart-grid)'; const CHART_AXIS_COLOR = 'var(--chart-axis)'; const CHART_CURSOR_COLOR = 'var(--chart-cursor)'; const CHART_DETAIL_BAR_COLOR = 'var(--chart-detail-bar)'; const formatDateKey = (date: Date) => { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; }; type CustomTooltipProps = { active?: boolean; payload?: Array<{ value: number }>; label?: string; }; const CustomTooltip = ({ active, payload, label }: CustomTooltipProps) => { if (active && payload && payload.length) { return (

{label}

Vendas: {payload[0].value}

); } return null; }; const ProductDetailsSkeleton = () => (
{[0, 1].map(item => (
))}
); const ProductDetails = () => { const { id } = useParams<{ id: string }>(); const { dateRange, setDateRange } = useOutletContext<{ dateRange: DateRange, setDateRange: (range: DateRange) => void }>(); const [details, setDetails] = useState(null); const [isLoading, setIsLoading] = useState(true); useEffect(() => { let isMounted = true; const loadProductDetails = async () => { if (!id) { if (isMounted) { setDetails(null); setIsLoading(false); } return; } setIsLoading(true); const productDetails = await fetchProductDetailsAnalytics(id, dateRange); if (isMounted) { setDetails(productDetails); setIsLoading(false); } }; void loadProductDetails(); return () => { isMounted = false; }; }, [dateRange, id]); const formatCurrency = (value: number) => { return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(value); }; if (isLoading && !details) { return ; } if (!details?.productInfo) { return (

Produto não encontrado.

Voltar para produtos
); } const { productInfo, chartData, totalSold, totalRevenue } = details; const isRefreshing = isLoading && Boolean(details); const isSingleDayRange = formatDateKey(dateRange.start) === formatDateKey(dateRange.end); return (
Voltar
ID: #{productInfo.id}

{productInfo.name}

Unidades Vendidas

{totalSold}

Receita Total

{formatCurrency(totalRevenue)}

Volume de Vendas por {isSingleDayRange ? 'Horário' : 'Data'}

} cursor={{ fill: CHART_CURSOR_COLOR }} />
); }; export default ProductDetails;