import * as React from 'react'; import defaultRenderEmpty, { RenderEmptyHandler } from './renderEmpty'; import { Locale } from '../locale-provider'; import { SizeType } from './SizeContext'; export interface CSPConfig { nonce?: string; } export interface ConfigConsumerProps { getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement; rootPrefixCls?: string; getPrefixCls: (suffixCls: string, customizePrefixCls?: string) => string; renderEmpty: RenderEmptyHandler; csp?: CSPConfig; autoInsertSpaceInButton?: boolean; locale?: Locale; pageHeader?: { ghost: boolean; }; direction?: 'ltr' | 'rtl'; space?: { size?: SizeType | number; }; } export const ConfigContext = React.createContext({ // We provide a default function for Context without provider getPrefixCls: (suffixCls: string, customizePrefixCls?: string) => { if (customizePrefixCls) return customizePrefixCls; return suffixCls ? `ant-${suffixCls}` : 'ant'; }, renderEmpty: defaultRenderEmpty, }); export const ConfigConsumer = ConfigContext.Consumer; // =========================== 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.FC & 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.FC & ComponentDef; const cons: ConstructorProps = Component.constructor as ConstructorProps; const name = (cons && cons.displayName) || Component.name || 'Component'; SFC.displayName = `withConfigConsumer(${name})`; return SFC; }; }