import React from 'react' import { AnimationProps, SvgAttributesGetters, DataAccessor, toAccessor, NativeEventHandlers, DataGetter, CartesianScale, } from '../lib/types' import { useCartesianContext } from './internal' import { combineGetters, createDataScale, scaleZero } from '../lib/scales' import { Elements } from './Elements' export type BarsAxesConfig = | DataAccessor | { base?: DataGetter; to: DataGetter } function sanitizeAxisConfig( config: BarsAxesConfig, scale: CartesianScale ): { base: DataAccessor; to: DataAccessor } { if (typeof config === 'function') { return { to: config, base: config } } const { to, base = () => scaleZero(scale) } = config return { to: toAccessor(to), base: toAccessor(base), } } export interface BarsProps extends AnimationProps, SvgAttributesGetters, NativeEventHandlers { data: T[] 'x-data': BarsAxesConfig 'y-data': BarsAxesConfig } export function Bars({ 'x-data': _dataX, 'y-data': _dataY, ...props }: BarsProps) { const { xScale, yScale } = useCartesianContext() const dataX = sanitizeAxisConfig(_dataX, xScale) const dataY = sanitizeAxisConfig(_dataY, yScale) const x1 = createDataScale(dataX.base, xScale, 0, 'start') const y1 = createDataScale(dataY.base, yScale, 0, 'end') const x2 = createDataScale(dataX.to, xScale, 0, 'end') const y2 = createDataScale(dataY.to, yScale, 0, 'start') const x = (d: T) => Math.min(x1(d), x2(d)) const y = (d: T) => Math.min(y1(d), y2(d)) const width = (d: T) => Math.abs(x1(d) - x2(d)) const height = (d: T) => Math.abs(y1(d) - y2(d)) return ( ) }