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 (
No trending data yet - train the trending model first.
) : (No sales data yet.
) : (