import { useContext } from 'react';
import { useBBoxObserver } from 'react-d3-utils';
import { bboxContext } from '../../contexts/bboxContext.js';
import HorizontalAxisGridLines from './HorizontalAxisGridLines.js';
import HorizontalAxisLabel from './HorizontalAxisLabel.js';
import HorizontalAxisLine from './HorizontalAxisLine.js';
import { Ticks } from './Ticks.js';
import type { AxisRendererProps } from './types.js';
export default function HorizontalAxis(props: AxisRendererProps) {
const {
primaryTickStyle,
primaryTickLength,
tickPosition,
hiddenTicks,
lineStyle,
hiddenLine,
hidden,
plotWidth,
plotHeight,
displayPrimaryGridLines,
displaySecondaryGridLines,
primaryGridLineStyle,
secondaryGridLineStyle,
label,
labelStyle,
axisRef,
primaryTicks,
position,
tickLabelStyle,
innerOffset,
secondaryTickLength,
scale,
secondaryTickStyle,
} = props;
const isBottom = position === 'bottom';
const textOffset = 0;
const transform = isBottom ? `translate(0, ${plotHeight})` : undefined;
const ticks = useBBoxObserver();
function getTickPosition(value: number, secondary = false) {
const { y1, y2, textPosition } = getTickY(secondary);
return {
line: {
x1: value,
x2: value,
y1,
y2,
},
text: {
x1: value,
y1: isBottom ? textPosition : -textPosition,
},
};
}
function getTickY(secondary = false) {
const tickLength = secondary ? secondaryTickLength : primaryTickLength;
const y = isBottom ? tickLength : -tickLength;
switch (tickPosition) {
case 'center':
return {
y1: y / 2,
y2: -y / 2,
textPosition: textOffset + tickLength / 2,
};
case 'inner':
return {
y1: 0,
y2: -y,
textPosition: textOffset,
};
case 'outer':
return {
y1: 0,
y2: y,
textPosition: textOffset + tickLength,
};
case undefined:
return {
y1: 0,
y: 0,
textPosition: 0,
};
default:
throw new Error(`Invalid tick position ${String(tickPosition)}`);
}
}
const gridLinesElement =
displayPrimaryGridLines || displaySecondaryGridLines ? (
) : null;
const primaryTicksElement =
!hidden && !hiddenTicks ? (
) : null;
const axisLineElement =
!hidden && !hiddenLine ? (
) : null;
const labelElement =
!hidden && label ? (
) : null;
const bboxRef = useContext(bboxContext);
return (
{gridLinesElement}
{primaryTicksElement}
{axisLineElement}
{labelElement}
);
}