import type { CSSProperties, ReactElement } from 'react';
import { useMemo } from 'react';
import type { Position } from '../../types.js';
import type { Scales, TicksType } from './types.js';
interface VerticalAxisGridlinesProps {
plotWidth: number;
primaryTicks: TicksType[];
position: Position;
style?: CSSProperties;
scale?: Scales;
primaryGrid?: boolean;
secondaryGrid?: boolean;
secondaryStyle?: CSSProperties;
}
export default function VerticalAxisGridlines(
props: VerticalAxisGridlinesProps,
) {
const {
plotWidth,
style,
primaryTicks,
position: axisPosition,
primaryGrid,
secondaryGrid,
scale,
secondaryStyle,
} = props;
const Grid = useMemo(() => {
const Grid: ReactElement[] = [];
if (primaryGrid) {
for (const { position } of primaryTicks) {
Grid.push(
,
);
}
}
if (secondaryGrid) {
const density = 5;
const secondaryGridPosition =
scale?.ticks(primaryTicks.length * density) || [];
for (const tick of secondaryGridPosition) {
const position = scale?.(tick) || 0; // exclude the main ticks
if (primaryTicks.map((tick) => tick.position).includes(position)) {
return null;
}
Grid.push(
,
);
}
}
return Grid;
}, [
axisPosition,
plotWidth,
primaryGrid,
primaryTicks,
scale,
secondaryGrid,
secondaryStyle,
style,
]);
return {Grid};
}