import type { CSSInterpolation, Theme } from '@ant-design/cssinjs'; import { createTheme, useCacheToken, useStyleRegister } from '@ant-design/cssinjs'; import React from 'react'; import version from '../version'; import type { AliasToken, GlobalToken, MapToken, OverrideToken, PresetColorType, SeedToken, } from './interface'; import { PresetColors } from './interface'; import defaultDerivative from './themes/default'; import defaultSeedToken from './themes/seed'; import formatToken from './util/alias'; import type { FullToken } from './util/genComponentStyleHook'; import genComponentStyleHook from './util/genComponentStyleHook'; import statisticToken, { merge as mergeToken, statistic } from './util/statistic'; const defaultTheme = createTheme(defaultDerivative); export { // colors PresetColors, // Statistic statistic, statisticToken, mergeToken, // hooks useStyleRegister, genComponentStyleHook, }; export type { SeedToken, AliasToken, PresetColorType, // FIXME: Remove this type AliasToken as DerivativeToken, FullToken, }; // ================================ Context ================================= // To ensure snapshot stable. We disable hashed in test env. export const defaultConfig = { token: defaultSeedToken, hashed: true, }; export const DesignTokenContext = React.createContext<{ token: Partial; theme?: Theme; components?: OverrideToken; hashed?: string | boolean; }>(defaultConfig); // ================================== Hook ================================== // In dev env, we refresh salt per hour to avoid user use this // Note: Do not modify this to real time update which will make debug harder const saltPrefix = process.env.NODE_ENV === 'production' ? version : `${version}-${new Date().getHours()}`; export function useToken(): [Theme, GlobalToken, string] { const { token: rootDesignToken, hashed, theme, components, } = React.useContext(DesignTokenContext); const salt = `${saltPrefix}-${hashed || ''}`; const mergedTheme = theme || defaultTheme; const [token, hashId] = useCacheToken( mergedTheme, [defaultSeedToken, rootDesignToken], { salt, override: { override: rootDesignToken, ...components }, formatToken, }, ); return [mergedTheme, token, hashed ? hashId : '']; } export type UseComponentStyleResult = [(node: React.ReactNode) => React.ReactElement, string]; export type GenerateStyle< ComponentToken extends object = AliasToken, ReturnType = CSSInterpolation, > = (token: ComponentToken) => ReturnType;