import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts' import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, } from '@/components/ui/chart' import { useMemo } from 'react' import { useYAxisWidth, chartTimeData, cn, formatShortDate, decimalString, chartMargin, } from '@/lib/utils' // import Spinner from '../spinner' import { useStore } from '@nanostores/react' import { $chartTime, $containerFilter } from '@/lib/stores' export default function ContainerCpuChart({ chartData, ticks, }: { chartData: Record[] ticks: number[] }) { const chartTime = useStore($chartTime) const filter = useStore($containerFilter) const { yAxisWidth, updateYAxisWidth } = useYAxisWidth() const chartConfig = useMemo(() => { let config = {} as Record< string, { label: string color: string } > const totalUsage = {} as Record for (let stats of chartData) { for (let key in stats) { if (key === 'time') { continue } if (!(key in totalUsage)) { totalUsage[key] = 0 } // @ts-ignore totalUsage[key] += stats[key] } } let keys = Object.keys(totalUsage) keys.sort((a, b) => (totalUsage[a] > totalUsage[b] ? -1 : 1)) const length = keys.length for (let i = 0; i < length; i++) { const key = keys[i] const hue = ((i * 360) / length) % 360 config[key] = { label: key, color: `hsl(${hue}, 60%, 55%)`, } } return config satisfies ChartConfig }, [chartData]) // if (!chartData.length || !ticks.length) { // return // } return (
{/* {!yAxisSet && } */} Math.max(Math.ceil(max), 0.4)]} width={yAxisWidth} tickLine={false} axisLine={false} tickFormatter={(x) => { const val = (x % 1 === 0 ? x : x.toFixed(1)) + '%' return updateYAxisWidth(val) }} /> formatShortDate(data[0].payload.time)} // @ts-ignore itemSorter={(a, b) => b.value - a.value} content={ decimalString(item.value) + '%'} indicator="line" /> } /> {Object.keys(chartConfig).map((key) => { const filtered = filter && !key.includes(filter) let fillOpacity = filtered ? 0.05 : 0.4 let strokeOpacity = filtered ? 0.1 : 1 return ( ) })}
) }