import * as React from 'react'; import createReactContext, { Context } from 'create-react-context'; import defaultRenderEmpty, { RenderEmptyHandler } from './renderEmpty'; export { RenderEmptyHandler }; export interface ConfigConsumerProps { getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement; rootPrefixCls?: string; getPrefixCls: (suffixCls: string, customizePrefixCls?: string) => string; renderEmpty: RenderEmptyHandler; } interface ConfigProviderProps { getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement; prefixCls?: string; children?: React.ReactNode; renderEmpty?: RenderEmptyHandler; } const ConfigContext: Context = createReactContext({ // We provide a default function for Context without provider getPrefixCls: (suffixCls: string, customizePrefixCls?: string) => { if (customizePrefixCls) return customizePrefixCls; return `ant-${suffixCls}`; }, renderEmpty: defaultRenderEmpty, }); export const ConfigConsumer = ConfigContext.Consumer; 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) => { const { children, getPopupContainer, renderEmpty } = this.props; const config: ConfigConsumerProps = { ...context, getPrefixCls: this.getPrefixCls, }; if (getPopupContainer) { config.getPopupContainer = getPopupContainer; } if (renderEmpty) { config.renderEmpty = renderEmpty; } return {children}; }; render() { return {this.renderProvider}; } } // =========================== 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; } export function withConfigConsumer(config: ConsumerConfig) { return function(Component: IReactComponent): React.SFC { // Wrap with ConfigConsumer. Since we need compatible with react 15, be care when using ref methods return (props: ExportProps) => ( {(configProps: ConfigConsumerProps) => { const { prefixCls: basicPrefixCls } = config; const { getPrefixCls } = configProps; const { prefixCls: customizePrefixCls } = props; const prefixCls = getPrefixCls(basicPrefixCls, customizePrefixCls); return ; }} ); }; } export default ConfigProvider;