"use client"; import { useMemo } from "react"; import { AreaChart, Area, BarChart, Bar, Line, PieChart, Pie, Cell, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, } from "recharts"; type TrendData = Array<{ date: string; count: number }>; type TypeData = Array<{ type: string; count: number }>; type StatusData = Array<{ name: string; count: number }>; const PIE_COLORS: Record = { Uploaded: "hsl(38 92% 50%)", Processing: "hsl(var(--primary))", Analyzed: "hsl(160 84% 39%)", Failed: "hsl(var(--destructive))", }; const FALLBACK_COLORS = [ "hsl(var(--primary))", "hsl(var(--secondary))", "hsl(var(--accent))", "hsl(var(--destructive))", ]; const tooltipStyle = { backgroundColor: "hsl(var(--background))", border: "1px solid hsl(var(--border))", borderRadius: "12px", color: "hsl(var(--foreground))", }; export function TrendChart({ data }: { data: TrendData }) { const trendData = useMemo( () => data.map((point, index) => { const start = Math.max(0, index - 6); const window = data.slice(start, index + 1); const average = window.reduce((sum, item) => sum + item.count, 0) / window.length; return { ...point, movingAverage: Number(average.toFixed(2)), }; }), [data], ); const xAxisInterval = trendData.length > 12 ? Math.floor(trendData.length / 8) : 0; return (
{ const numericValue = Number(value ?? 0); if (name === "movingAverage") { return [numericValue.toFixed(1), "7-day avg"]; } return [numericValue, "Uploads"]; }} />
); } export function ContractTypeChart({ data }: { data: TypeData }) { const sortedData = useMemo( () => [...data].sort((a, b) => b.count - a.count), [data], ); return (
[ Number(value ?? 0), "Files", ]} /> {sortedData.map((item, index) => { const opacity = Math.max(0.35, 0.95 - index * 0.12); return ( ); })}
); } export function ContractStatusChart({ data }: { data: StatusData }) { const total = useMemo( () => data.reduce((sum, item) => sum + item.count, 0), [data], ); return (
{data.map((entry, index) => ( ))} {total > 0 && ( {total} Files )} [ Number(value ?? 0), "Files", ]} />
{data.map((item, index) => { const color = PIE_COLORS[item.name] ?? FALLBACK_COLORS[index % FALLBACK_COLORS.length]; return (
{item.name} {item.count}
); })}
); }