import * as React from 'react'; import type { DerivativeFunc } from '@ant-design/cssinjs'; import type { RequiredMark } from '../form/Form'; import type { Locale } from '../locale'; import type { AliasToken, MapToken, OverrideToken, SeedToken } from '../theme/interface'; import type { RenderEmptyHandler } from './defaultRenderEmpty'; import type { SizeType } from './SizeContext'; export const defaultIconPrefixCls = 'anticon'; export interface Theme { primaryColor?: string; infoColor?: string; successColor?: string; processingColor?: string; errorColor?: string; warningColor?: string; } export interface CSPConfig { nonce?: string; } export type DirectionType = 'ltr' | 'rtl' | undefined; export type MappingAlgorithm = DerivativeFunc; export interface ThemeConfig { token?: Partial; components?: OverrideToken; algorithm?: MappingAlgorithm | MappingAlgorithm[]; hashed?: boolean; inherit?: boolean; } export interface ConfigConsumerProps { getTargetContainer?: () => HTMLElement; getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement; rootPrefixCls?: string; iconPrefixCls: string; getPrefixCls: (suffixCls?: string, customizePrefixCls?: string) => string; renderEmpty?: RenderEmptyHandler; csp?: CSPConfig; autoInsertSpaceInButton?: boolean; input?: { autoComplete?: string; }; pagination?: { showSizeChanger?: boolean; }; locale?: Locale; pageHeader?: { ghost: boolean; }; direction?: DirectionType; space?: { size?: SizeType | number; }; virtual?: boolean; dropdownMatchSelectWidth?: boolean; form?: { requiredMark?: RequiredMark; colon?: boolean; }; theme?: ThemeConfig; select?: { showSearch?: boolean; }; } const defaultGetPrefixCls = (suffixCls?: string, customizePrefixCls?: string) => { if (customizePrefixCls) return customizePrefixCls; return suffixCls ? `ant-${suffixCls}` : 'ant'; }; // zombieJ: 🚨 Do not pass `defaultRenderEmpty` here since it will cause circular dependency. export const ConfigContext = React.createContext({ // We provide a default function for Context without provider getPrefixCls: defaultGetPrefixCls, iconPrefixCls: defaultIconPrefixCls, }); export const ConfigConsumer = ConfigContext.Consumer; // =========================== withConfigConsumer =========================== interface BasicExportProps { prefixCls?: string; } interface ConsumerConfig { prefixCls: string; } interface ConstructorProps { displayName?: string; } /** @deprecated Use hooks instead. This is a legacy function */ export function withConfigConsumer(config: ConsumerConfig) { return function withConfigConsumerFunc( Component: React.ComponentType, ): React.FC & ComponentDef { // Wrap with ConfigConsumer. Since we need compatible with react 15, be careful when using ref methods const SFC: React.FC & ComponentDef = ((props) => { const configProps = React.useContext(ConfigContext); const { getPrefixCls } = configProps; const { prefixCls: basicPrefixCls } = config; 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'; if (process.env.NODE_ENV !== 'production') { SFC.displayName = `withConfigConsumer(${name})`; } return SFC; }; }