mirror of
https://github.com/kjanat/livedash-node.git
synced 2026-02-13 18:55:43 +01:00
- 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
72 lines
1.6 KiB
TypeScript
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>
|
|
);
|
|
}
|