import React, { useMemo } from 'react' import withDefaults from '../utils/with-defaults' import Progress from '../progress' import useTheme from '../use-theme' import { ProgressColors } from '../progress/progress' export interface MetricCardBarGaugeProps { value: number min?: number max?: number average?: number className?: string color?: string colors?: ProgressColors loading: boolean } const defaultProps = { min: 0, max: 100, className: '', loading: false } type NativeAttrs = Omit, keyof MetricCardBarGaugeProps> export type MetricCardBarGaugeComponentProps = MetricCardBarGaugeProps & typeof defaultProps & NativeAttrs const MetricCardBarGauge: React.FC = ({ value, min, max, average, className, color, colors, loading }) => { const theme = useTheme() const hasAverage = average !== undefined && average !== null const { percentage, percentageAverage } = useMemo( () => ({ percentage: ((value - min) / max) * 100, percentageAverage: average ? ((average - min) / max) * 100 : 0 }), [value, min, max, average] ) const margin = hasAverage ? '-10px 0' : '0' const chartColor = color || 'var(--token-color-system-success-10)' const colorProps = useMemo(() => { if (colors) { return { colors } } return { color: loading ? 'transparent' : chartColor } }, [colors, chartColor]) return (
{hasAverage &&
} {hasAverage &&
}
) } const MemoCardContent = React.memo(MetricCardBarGauge) export default withDefaults(MemoCardContent, defaultProps)