// TODO: remove this lint // SFC has specified a displayName, but not worked. /* eslint-disable react/display-name */ import * as React from 'react'; import { RenderEmptyHandler } from './renderEmpty'; import LocaleProvider, { Locale, ANT_MARK } from '../locale-provider'; import LocaleReceiver from '../locale-provider/LocaleReceiver'; import { ConfigConsumer, ConfigContext, CSPConfig, ConfigConsumerProps } from './context'; export { RenderEmptyHandler, ConfigConsumer, CSPConfig, ConfigConsumerProps }; export const configConsumerProps = [ 'getPopupContainer', 'rootPrefixCls', 'getPrefixCls', 'renderEmpty', 'csp', 'autoInsertSpaceInButton', 'locale', 'pageHeader', ]; export interface ConfigProviderProps { getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement; prefixCls?: string; children?: React.ReactNode; renderEmpty?: RenderEmptyHandler; csp?: CSPConfig; autoInsertSpaceInButton?: boolean; locale?: Locale; pageHeader?: { ghost: boolean; }; } class ConfigProvider extends React.Component { getPrefixCls = (suffixCls: string, customizePrefixCls?: string) => { const { prefixCls = 'ant' } = this.props; if (customizePrefixCls) return customizePrefixCls; return suffixCls ? `${prefixCls}-${suffixCls}` : prefixCls; }; renderProvider = (context: ConfigConsumerProps, legacyLocale: Locale) => { const { children, getPopupContainer, renderEmpty, csp, autoInsertSpaceInButton, locale, pageHeader, } = this.props; const config: ConfigConsumerProps = { ...context, getPrefixCls: this.getPrefixCls, csp, autoInsertSpaceInButton, }; if (getPopupContainer) { config.getPopupContainer = getPopupContainer; } if (renderEmpty) { config.renderEmpty = renderEmpty; } if (pageHeader) { config.pageHeader = pageHeader; } return ( {children} ); }; render() { return ( {(_, __, legacyLocale) => ( {context => this.renderProvider(context, legacyLocale as Locale)} )} ); } } // =========================== withConfigConsumer =========================== // We need define many types here. So let's put in the block region type IReactComponent

= | React.StatelessComponent

| React.ComponentClass

| React.ClassicComponentClass

; interface BasicExportProps { prefixCls?: string; } interface ConsumerConfig { prefixCls: string; } interface ConstructorProps { displayName?: string; } export function withConfigConsumer(config: ConsumerConfig) { return function withConfigConsumerFunc( Component: IReactComponent, ): React.SFC & ComponentDef { // Wrap with ConfigConsumer. Since we need compatible with react 15, be care when using ref methods const SFC = ((props: ExportProps) => ( {(configProps: ConfigConsumerProps) => { const { prefixCls: basicPrefixCls } = config; const { getPrefixCls } = configProps; const { prefixCls: customizePrefixCls } = props; const prefixCls = getPrefixCls(basicPrefixCls, customizePrefixCls); return ; }} )) as React.SFC & ComponentDef; const cons: ConstructorProps = Component.constructor as ConstructorProps; const name = (cons && cons.displayName) || Component.name || 'Component'; SFC.displayName = `withConfigConsumer(${name})`; return SFC; }; } export default ConfigProvider;