import React, { useMemo } from 'react' import useTheme from '../use-theme' import withDefaults from '../utils/with-defaults' import { NormalSizes, NormalTypes } from '../utils/prop-types' import { HuiThemesPalette } from '../themes' interface Props { size?: NormalSizes type?: NormalTypes color?: string } const defaultProps = { size: 'medium' as NormalSizes, type: 'default' as NormalTypes } type NativeAttrs = Omit, keyof Props> export type LoadingProps = Props & typeof defaultProps & NativeAttrs const getIconSize = (size: NormalSizes) => { const sizes: { [key in NormalSizes]: string } = { mini: '2px', small: '3px', medium: '4px', large: '5px' } return sizes[size] } const getIconBgColor = (type: NormalTypes, palette: HuiThemesPalette, color?: string) => { const colors: { [key in NormalTypes]: string } = { default: palette.accents_10, secondary: palette.secondary, success: palette.success, warning: palette.warning, error: palette.error } return color ? color : colors[type] } const Loading: React.FC> = ({ children, size, type, color }) => { const theme = useTheme() const width = useMemo(() => getIconSize(size), [size]) const bgColor = useMemo( () => getIconBgColor(type, theme.palette, color), [type, theme.palette, color] ) return (
{children && }
) } const MemoLoading = React.memo(Loading) export default withDefaults(MemoLoading, defaultProps)