import React, { useMemo } from 'react' import useTheme from '../use-theme' import { NormalTypes } from '../utils/prop-types' import { GeistUIThemesPalette } from '../themes/presets' import useScaleable, { withScaleable } from '../use-scaleable' export type LoadingTypes = NormalTypes interface Props { type?: LoadingTypes color?: string className?: string spaceRatio?: number } const defaultProps = { type: 'default' as LoadingTypes, className: '', spaceRatio: 1, } type NativeAttrs = Omit, keyof Props> export type LoadingProps = Props & NativeAttrs const getIconBgColor = ( type: LoadingTypes, palette: GeistUIThemesPalette, color?: string, ) => { const colors: { [key in LoadingTypes]: string } = { default: palette.accents_6, secondary: palette.secondary, success: palette.success, warning: palette.warning, error: palette.error, } return color ? color : colors[type] } const LoadingComponent: React.FC> = ({ children, type, color, className, spaceRatio, ...props }: React.PropsWithChildren & typeof defaultProps) => { const theme = useTheme() const { SCALES } = useScaleable() const bgColor = useMemo( () => getIconBgColor(type, theme.palette, color), [type, theme.palette, color], ) return (
{children && }
) } LoadingComponent.defaultProps = defaultProps LoadingComponent.displayName = 'GeistLoading' const Loading = withScaleable(LoadingComponent) export default Loading