import React from 'react'; import { ThemeContext, ThemeType } from '../theme'; import { DefaultProps, VariantPropsType } from '../types'; export function withDefaultProps< Props extends object, Defaults extends DefaultProps = {} >( WrappedComponent: React.ComponentClass, componentName: keyof NonNullable, defaultProps: Defaults ) { type Variant = Props & VariantPropsType; return class extends React.PureComponent { static contextType = ThemeContext; // using `declare` requires babel plugin which doesn't seem to work // class related components & HOC's should be refactored anyway // @ts-ignore context!: React.ContextType; render() { const theme = this.context.theme; if (!componentName) { return ; } let propsFromTheme = { ...(theme.components?.[componentName] ?? {}), ...(this.props.variant && //@ts-ignore (theme.components?.[componentName]?.variants?.[this.props.variant] ?? {})), }; delete propsFromTheme.variants; const mergedProps = { ...defaultProps, ...propsFromTheme, ...this.props, }; return ; } }; }