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}; }