import { useEffect, useState, useCallback } from 'react'; import { BarChart, Bar, LineChart, Line, PieChart, Pie, Cell, XAxis, YAxis, Tooltip, ResponsiveContainer, CartesianGrid, Legend, } from 'recharts'; import { Flame, Trophy, TrendingUp, Award, BarChart3 as BarChartIcon, UploadCloud } from 'lucide-react'; import { api } from '../api/client'; import { Spinner, EmptyState } from '../components/Atoms'; import { NavigationHeader } from '../components/NavigationHeader'; import { UploadExcelModal } from '../components/UploadExcelModal'; const PALETTE = ['#e2a33d', '#3f8556', '#8b2e3c', '#2c3e63', '#c2872a']; export function AnalyticsPage() { const [comparison, setComparison] = useState(null); const [comparisonLoading, setComparisonLoading] = useState(true); const [trending, setTrending] = useState([]); const [trendingLoading, setTrendingLoading] = useState(true); const [window_, setWindow] = useState('weekly'); const [topProducts, setTopProducts] = useState([]); const [topBy, setTopBy] = useState('revenue'); const [isUploadOpen, setIsUploadOpen] = useState(false); const reloadData = useCallback(() => { setComparisonLoading(true); api.getStoreComparison().then(setComparison).catch(() => setComparison(null)).finally(() => setComparisonLoading(false)); setTrendingLoading(true); api.getTrending({ window: window_, scope: 'overall', top_k: 10 }).then(setTrending).catch(() => setTrending([])).finally(() => setTrendingLoading(false)); api.getTopProducts({ by: topBy, order: 'top', limit: 8 }).then(setTopProducts).catch(() => setTopProducts([])); }, [window_, topBy]); useEffect(() => { api.getStoreComparison().then(setComparison).catch(() => setComparison(null)).finally(() => setComparisonLoading(false)); }, []); useEffect(() => { setTrendingLoading(true); api.getTrending({ window: window_, scope: 'overall', top_k: 10 }) .then(setTrending).catch(() => setTrending([])).finally(() => setTrendingLoading(false)); }, [window_]); useEffect(() => { api.getTopProducts({ by: topBy, order: 'top', limit: 8 }).then(setTopProducts).catch(() => setTopProducts([])); }, [topBy]); const stores = comparison?.stores || []; return (
{comparisonLoading ? ( ) : !comparison || stores.length === 0 ? ( ) : ( <>
`₹${Number(v).toLocaleString('en-IN')}`} /> `₹${Number(v).toLocaleString('en-IN')}`} />
e.store_id}> {stores.map((_, i) => )}
)}

Trending products

{['today', 'weekly', 'monthly'].map((w) => ( ))}
{trendingLoading ? ( ) : trending.length === 0 ? (

No trending data yet - train the trending model first.

) : (
    {trending.map((t) => (
  1. #{t.rank} {prettify(t.image_id)} {t.brand} {t.trend_score.toFixed(1)}
  2. ))}
)}

Top products

{['revenue', 'units'].map((b) => ( ))}
{topProducts.length === 0 ? (

No sales data yet.

) : (
    {topProducts.map((p, i) => (
  1. #{i + 1} {prettify(p.image_id)} {p.brand} {topBy === 'revenue' ? `₹${Number(p.revenue).toLocaleString('en-IN')}` : `${p.units_sold} units`}
  2. ))}
)}
setIsUploadOpen(false)} tabType="analytics" tabTitle="Sales Analytics Data" onSuccess={() => reloadData()} />
); } function ChartCard({ title, icon: Icon, children }) { return (

{title}

{children}
); } function Badge({ label, value }) { if (!value) return null; return ( {label}: {value} ); } function prettify(imageId) { if (!imageId) return ''; const parts = imageId.split('_').filter((p, i, arr) => !(i > 0 && arr[i - 1] === p)); return parts.join(' ').replace(/\b\w/g, (c) => c.toUpperCase()); }