import React, { useMemo } from 'react' import useTheme from '../use-theme' import withDefaults from '../utils/with-defaults' import { NormalSizes, NormalTypes } from 'components/utils/prop-types' import { GeistUIThemesPalette } from 'components/themes/presets' type LoadingSizes = NormalSizes | string interface Props { size?: LoadingSizes type?: NormalTypes color?: string className?: string spaceRatio?: number } const defaultProps = { size: 'medium' as LoadingSizes, type: 'default' as NormalTypes, className: '', spaceRatio: 1, } type NativeAttrs = Omit, keyof Props> export type LoadingProps = Props & typeof defaultProps & NativeAttrs const getIconSize = (size: LoadingSizes) => { const sizes: { [key in LoadingSizes]: string } = { mini: '2px', small: '3px', medium: '4px', large: '5px', } return sizes[size] || size } const getIconBgColor = ( type: NormalTypes, palette: GeistUIThemesPalette, color?: string, ) => { const colors: { [key in NormalTypes]: string } = { default: palette.accents_6, 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, className, spaceRatio, ...props }) => { 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)