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' interface Props { size?: NormalSizes type?: NormalTypes color?: string width?: string height?: 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: 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, }) => { 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)