Files
livedash-node/components/charts/bar-chart.tsx
Kaj Kowalski 5bfd762e55 fix: comprehensive TypeScript/build fixes and modernization
- Update tsconfig to ES2024 target and bundler moduleResolution
- Add dynamic imports for chart.js and recharts (bundle optimization)
- Consolidate 17 useState into useReducer in sessions page
- Fix 18 .js extension imports across lib files
- Add type declarations for @rapideditor/country-coder
- Fix platform user types (PlatformUserRole enum)
- Fix Calendar component prop types
- Centralize next-auth type augmentation
- Add force-dynamic to all API routes (prevent build-time prerender)
- Fix Prisma JSON null handling with Prisma.DbNull
- Fix various type mismatches (SessionMessage, ImportRecord, etc.)
- Export ButtonProps from button component
- Update next-themes import path
- Replace JSX.Element with React.ReactElement
- Remove obsolete debug scripts and pnpm lockfile
- Downgrade eslint to v8 for next compatibility
2026-01-20 07:28:10 +01:00

72 lines
1.6 KiB
TypeScript

"use client";
import dynamic from "next/dynamic";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
interface BarChartData {
name: string;
value: number;
[key: string]: string | number;
}
interface BarChartProps {
data: BarChartData[];
title?: string;
dataKey?: string;
colors?: string[];
height?: number;
className?: string;
}
const ChartSkeleton = ({ height = 300 }: { height?: number }) => (
<div className="animate-pulse" style={{ height }}>
<div className="h-full w-full bg-muted rounded-md flex items-end justify-around px-4 pb-8">
{[...Array(6)].map((_, i) => (
<div
key={i}
className="bg-muted-foreground/20 rounded-t"
style={{ width: "12%", height: `${20 + Math.random() * 60}%` }}
/>
))}
</div>
</div>
);
const BarChartInner = dynamic(() => import("./bar-chart-inner"), {
ssr: false,
loading: () => <ChartSkeleton />,
});
export default function ModernBarChart({
data,
title,
dataKey = "value",
colors = [
"hsl(var(--chart-1))",
"hsl(var(--chart-2))",
"hsl(var(--chart-3))",
"hsl(var(--chart-4))",
"hsl(var(--chart-5))",
],
height = 300,
className,
}: BarChartProps) {
return (
<Card className={className}>
{title && (
<CardHeader>
<CardTitle className="text-lg font-semibold">{title}</CardTitle>
</CardHeader>
)}
<CardContent>
<BarChartInner
data={data}
dataKey={dataKey}
colors={colors}
height={height}
/>
</CardContent>
</Card>
);
}