use one x axis component for all charts

This commit is contained in:
Henry Dollman
2024-10-17 16:05:20 -04:00
parent 12239808fc
commit 71aa9946f5
8 changed files with 45 additions and 93 deletions

View File

@@ -1,9 +1,8 @@
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts' import { Area, AreaChart, CartesianGrid, YAxis } from 'recharts'
import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart' import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from '@/components/ui/chart'
import { import {
useYAxisWidth, useYAxisWidth,
chartTimeData,
cn, cn,
formatShortDate, formatShortDate,
toFixedWithoutTrailingZeros, toFixedWithoutTrailingZeros,
@@ -88,18 +87,7 @@ export default memo(function AreaChartDefault({
tickLine={false} tickLine={false}
axisLine={false} axisLine={false}
/> />
<XAxis {xAxis(chartData)}
dataKey="created"
domain={chartData.domain}
ticks={chartData.ticks}
allowDataOverflow
type="number"
scale="time"
minTickGap={30}
tickMargin={8}
axisLine={false}
tickFormatter={chartTimeData[chartTime].format}
/>
<ChartTooltip <ChartTooltip
animationEasing="ease-out" animationEasing="ease-out"
animationDuration={150} animationDuration={150}

View File

@@ -1,14 +1,14 @@
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts' import { Area, AreaChart, CartesianGrid, YAxis } from 'recharts'
import { import {
ChartConfig, ChartConfig,
ChartContainer, ChartContainer,
ChartTooltip, ChartTooltip,
ChartTooltipContent, ChartTooltipContent,
xAxis,
} from '@/components/ui/chart' } from '@/components/ui/chart'
import { memo, useMemo } from 'react' import { memo, useMemo } from 'react'
import { import {
useYAxisWidth, useYAxisWidth,
chartTimeData,
cn, cn,
formatShortDate, formatShortDate,
decimalString, decimalString,
@@ -37,7 +37,7 @@ export default memo(function ContainerChart({
const filter = useStore($containerFilter) const filter = useStore($containerFilter)
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth() const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
const { containerData, ticks, domain, chartTime } = chartData const { containerData } = chartData
const isNetChart = chartName === 'net' const isNetChart = chartName === 'net'
@@ -153,18 +153,7 @@ export default memo(function ContainerChart({
tickLine={false} tickLine={false}
axisLine={false} axisLine={false}
/> />
<XAxis {xAxis(chartData)}
dataKey="created"
domain={domain}
allowDataOverflow
ticks={ticks}
type="number"
scale="time"
minTickGap={35}
tickMargin={8}
axisLine={false}
tickFormatter={chartTimeData[chartTime].format}
/>
<ChartTooltip <ChartTooltip
animationEasing="ease-out" animationEasing="ease-out"
animationDuration={150} animationDuration={150}

View File

@@ -1,9 +1,8 @@
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts' import { Area, AreaChart, CartesianGrid, YAxis } from 'recharts'
import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart' import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from '@/components/ui/chart'
import { import {
useYAxisWidth, useYAxisWidth,
chartTimeData,
cn, cn,
formatShortDate, formatShortDate,
decimalString, decimalString,
@@ -25,8 +24,6 @@ export default memo(function DiskChart({
}) { }) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth() const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
// console.log('rendered at', new Date())
return ( return (
<div> <div>
<ChartContainer <ChartContainer
@@ -49,18 +46,7 @@ export default memo(function DiskChart({
return updateYAxisWidth(toFixedFloat(v, 2) + u) return updateYAxisWidth(toFixedFloat(v, 2) + u)
}} }}
/> />
<XAxis {xAxis(chartData)}
dataKey="created"
domain={chartData.domain}
ticks={chartData.ticks}
allowDataOverflow
type="number"
scale="time"
minTickGap={30}
tickMargin={8}
axisLine={false}
tickFormatter={chartTimeData[chartData.chartTime].format}
/>
<ChartTooltip <ChartTooltip
animationEasing="ease-out" animationEasing="ease-out"
animationDuration={150} animationDuration={150}

View File

@@ -1,9 +1,8 @@
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts' import { Area, AreaChart, CartesianGrid, YAxis } from 'recharts'
import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart' import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from '@/components/ui/chart'
import { import {
useYAxisWidth, useYAxisWidth,
chartTimeData,
cn, cn,
toFixedFloat, toFixedFloat,
decimalString, decimalString,
@@ -45,18 +44,7 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
}} }}
/> />
)} )}
<XAxis {xAxis(chartData)}
dataKey="created"
domain={chartData.domain}
ticks={chartData.ticks}
allowDataOverflow
type="number"
scale="time"
minTickGap={30}
tickMargin={8}
axisLine={false}
tickFormatter={chartTimeData[chartData.chartTime].format}
/>
<ChartTooltip <ChartTooltip
// cursor={false} // cursor={false}
animationEasing="ease-out" animationEasing="ease-out"

View File

@@ -1,9 +1,8 @@
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts' import { Area, AreaChart, CartesianGrid, YAxis } from 'recharts'
import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart' import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from '@/components/ui/chart'
import { import {
useYAxisWidth, useYAxisWidth,
chartTimeData,
cn, cn,
formatShortDate, formatShortDate,
toFixedWithoutTrailingZeros, toFixedWithoutTrailingZeros,
@@ -36,18 +35,7 @@ export default memo(function SwapChart({ chartData }: { chartData: ChartData })
axisLine={false} axisLine={false}
tickFormatter={(value) => updateYAxisWidth(value + ' GB')} tickFormatter={(value) => updateYAxisWidth(value + ' GB')}
/> />
<XAxis {xAxis(chartData)}
dataKey="created"
domain={chartData.domain}
ticks={chartData.ticks}
allowDataOverflow
type="number"
scale="time"
minTickGap={30}
tickMargin={8}
axisLine={false}
tickFormatter={chartTimeData[chartData.chartTime].format}
/>
<ChartTooltip <ChartTooltip
animationEasing="ease-out" animationEasing="ease-out"
animationDuration={150} animationDuration={150}

View File

@@ -1,4 +1,4 @@
import { CartesianGrid, Line, LineChart, XAxis, YAxis } from 'recharts' import { CartesianGrid, Line, LineChart, YAxis } from 'recharts'
import { import {
ChartContainer, ChartContainer,
@@ -6,10 +6,10 @@ import {
ChartLegendContent, ChartLegendContent,
ChartTooltip, ChartTooltip,
ChartTooltipContent, ChartTooltipContent,
xAxis,
} from '@/components/ui/chart' } from '@/components/ui/chart'
import { import {
useYAxisWidth, useYAxisWidth,
chartTimeData,
cn, cn,
formatShortDate, formatShortDate,
toFixedWithoutTrailingZeros, toFixedWithoutTrailingZeros,
@@ -70,18 +70,7 @@ export default memo(function TemperatureChart({ chartData }: { chartData: ChartD
tickLine={false} tickLine={false}
axisLine={false} axisLine={false}
/> />
<XAxis {xAxis(chartData)}
dataKey="created"
domain={chartData.domain}
ticks={chartData.ticks}
allowDataOverflow
type="number"
scale="time"
minTickGap={30}
tickMargin={8}
axisLine={false}
tickFormatter={chartTimeData[chartData.chartTime].format}
/>
<ChartTooltip <ChartTooltip
animationEasing="ease-out" animationEasing="ease-out"
animationDuration={150} animationDuration={150}

View File

@@ -612,7 +612,7 @@ function ChartCard({
</CardHeader> </CardHeader>
<div className="pl-0 w-[calc(100%-1.6em)] h-52 relative"> <div className="pl-0 w-[calc(100%-1.6em)] h-52 relative">
{<Spinner />} {<Spinner />}
{isIntersecting && <Suspense>{children}</Suspense>} {isIntersecting && children}
</div> </div>
</Card> </Card>
) )

View File

@@ -1,7 +1,8 @@
import * as React from 'react' import * as React from 'react'
import * as RechartsPrimitive from 'recharts' import * as RechartsPrimitive from 'recharts'
import { cn } from '@/lib/utils' import { chartTimeData, cn } from '@/lib/utils'
import { ChartData } from '@/types'
// Format: { THEME_NAME: CSS_SELECTOR } // Format: { THEME_NAME: CSS_SELECTOR }
const THEMES = { light: '', dark: '.dark' } as const const THEMES = { light: '', dark: '.dark' } as const
@@ -331,11 +332,34 @@ function getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key:
return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config] return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config]
} }
let cachedAxis: JSX.Element
const xAxis = function ({ domain, ticks, chartTime }: ChartData) {
if (cachedAxis && domain[0] === cachedAxis.props.domain[0]) {
return cachedAxis
}
cachedAxis = (
<RechartsPrimitive.XAxis
dataKey="created"
domain={domain}
ticks={ticks}
allowDataOverflow
type="number"
scale="time"
minTickGap={15}
tickMargin={8}
axisLine={false}
tickFormatter={chartTimeData[chartTime].format}
/>
)
return cachedAxis
}
export { export {
ChartContainer, ChartContainer,
ChartTooltip, ChartTooltip,
ChartTooltipContent, ChartTooltipContent,
ChartLegend, ChartLegend,
ChartLegendContent, ChartLegendContent,
xAxis,
// ChartStyle, // ChartStyle,
} }