import type { Domain, ScaleType } from '@h5web/shared'; import { useMeasure } from '@react-hookz/web'; import { AxisBottom, AxisLeft } from '@visx/axis'; import { scaleLinear } from '@visx/scale'; import { useSafeDomain } from '../../../vis/heatmap/hooks'; import { useToArray, useCombinedDomain, useDomain } from '../../../vis/hooks'; import type { HistogramParams } from '../../../vis/models'; import { H5WEB_SCALES } from '../../../vis/scales'; import Tick from '../../../vis/shared/Tick'; import { adaptedNumTicks, DEFAULT_DOMAIN } from '../../../vis/utils'; import styles from './Histogram.module.css'; import HistogramColorBar from './HistogramColorBar'; import HistogramIndicators from './HistogramIndicators'; interface Props extends HistogramParams { scaleType: ScaleType; dataDomain: Domain; sliderDomain: Domain; } function Histogram(props: Props) { const { values, bins, scaleType, sliderDomain, dataDomain } = props; const { colorMap, invertColorMap } = props; const binDomain = useDomain(bins, scaleType) || DEFAULT_DOMAIN; const [safeSliderDomain] = useSafeDomain(sliderDomain, dataDomain, scaleType); const xDomain = useCombinedDomain([binDomain, safeSliderDomain, dataDomain]); const barDomain = useDomain(values); const yMax = barDomain ? barDomain[1] : DEFAULT_DOMAIN[1]; const yMin = colorMap ? -yMax / 10 : 0; const [size, ref] = useMeasure(); const valuesArray = useToArray(values); if (!size) { return
; } const { width, height } = size; const xScale = H5WEB_SCALES[scaleType].createScale({ domain: xDomain, range: [0, width], }); const yScale = scaleLinear({ domain: [yMin, yMax], range: [0, height], }); const indicatorPositions = safeSliderDomain.map(xScale) as Domain; return (
{valuesArray.map((d, i) => ( ))} {colorMap && ( )}
); } export default Histogram;