import React, { Component } from 'react'; import { Chart, Axis, Tooltip, Geom } from 'bizcharts'; import Debounce from 'lodash-decorators/debounce'; import Bind from 'lodash-decorators/bind'; import styles from '../index.less'; import autoHeight from '../autoHeight'; export interface IBarProps { title: React.ReactNode; color?: string; padding?: [number, number, number, number]; height?: number; data: Array<{ x: string; y: number; }>; forceFit?: boolean; autoLabel?: boolean; style?: React.CSSProperties; } class Bar extends Component< IBarProps, { autoHideXLabels: boolean; } > { root: HTMLDivElement | undefined; node: HTMLDivElement | undefined; state = { height: 0, autoHideXLabels: false, }; componentDidMount() { window.addEventListener('resize', this.resize, { passive: true }); } componentWillUnmount() { window.removeEventListener('resize', this.resize); } handleRoot = (n: HTMLDivElement) => { this.root = n; }; handleRef = (n: HTMLDivElement) => { this.node = n; }; @Bind() @Debounce(400) resize() { if (!this.node || !this.node.parentNode) { return; } const canvasWidth = (this.node.parentNode as HTMLDivElement).clientWidth; const { data = [], autoLabel = true } = this.props; if (!autoLabel) { return; } const minWidth = data.length * 30; const { autoHideXLabels } = this.state; if (canvasWidth <= minWidth) { if (!autoHideXLabels) { this.setState({ autoHideXLabels: true, }); } } else if (autoHideXLabels) { this.setState({ autoHideXLabels: false, }); } } render() { const { height: propsHeight = 1, title, forceFit = true, data, color = 'rgba(24, 144, 255, 0.85)', padding, } = this.props; const { autoHideXLabels } = this.state; const scale = { x: { type: 'cat', }, y: { min: 0, }, }; const tooltip: [string, (...args: any[]) => { name?: string; value: string }] = [ 'x*y', (x: string, y: string) => ({ name: x, value: y, }), ]; const { height: stateHeight } = this.state; const height = propsHeight || stateHeight; return (
{title &&

{title}

}
); } } export default autoHeight()(Bar);