import React from 'react' import useTheme from '../use-theme' import { useProportions } from '../utils/calculations' import { NormalTypes } from '../utils/prop-types' import withDefaults from '../utils/with-defaults' export type ProgressColors = { [key: number]: string } interface Props { value?: number max?: number fixedTop?: boolean fixedBottom?: boolean colors?: ProgressColors color?: string type?: NormalTypes className?: '' } const defaultProps = { value: 0, max: 100, type: 'default' as NormalTypes, fixedTop: false, fixedBottom: false, className: '' } type NativeAttrs = Omit, keyof Props> export type ProgressProps = Props & typeof defaultProps & NativeAttrs const getCurrentColor = (ratio: number, type: NormalTypes, colors: ProgressColors = {}): string => { const defaultColors: { [key in NormalTypes]: string } = { default: 'var(--token-color-global-grayscale-11)', success: 'var(--token-color-system-success-10)', secondary: 'var(--token-color-global-grayscale-10)', warning: 'var(--token-color-system-warn-10)', error: 'var(--token-color-system-error-10)' } const colorKeys = Object.keys(colors) if (colorKeys.length === 0) return defaultColors[type] const customColorKey = colorKeys.find((key) => ratio <= +key) if (!customColorKey || Number.isNaN(+customColorKey)) return defaultColors[type] return colors[+customColorKey] } const Progress: React.FC = ({ value, max, className, type, colors, color, fixedTop, fixedBottom, ...props }) => { const theme = useTheme() const percentValue = useProportions(value, max) const currentColor = color ? color : getCurrentColor(percentValue, type, colors) const fixed = fixedTop || fixedBottom return (
) } export default withDefaults(Progress, defaultProps)