303 lines
11 KiB
JavaScript
303 lines
11 KiB
JavaScript
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
||
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
||
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
|
||
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
||
var _excluded = ["locale", "getPrefixCls"],
|
||
_excluded2 = ["locale", "theme"];
|
||
import { useCacheToken } from '@ant-design/cssinjs';
|
||
import { ConfigProvider as AntdConfigProvider } from 'antd';
|
||
import zh_CN from "antd/es/locale/zh_CN";
|
||
import React, { useContext, useEffect, useMemo } from 'react';
|
||
import { SWRConfig, useSWRConfig } from 'swr';
|
||
import { findIntlKeyByAntdLocaleKey, intlMap, zhCNIntl } from "./intl";
|
||
import dayjs from 'dayjs';
|
||
import { getLayoutDesignToken } from "./typing/layoutToken";
|
||
import { proTheme } from "./useStyle";
|
||
import { defaultToken, emptyTheme } from "./useStyle/token";
|
||
import { merge } from "./utils/merge";
|
||
import 'dayjs/locale/zh-cn';
|
||
import { jsx as _jsx } from "react/jsx-runtime";
|
||
import { Fragment as _Fragment } from "react/jsx-runtime";
|
||
import { jsxs as _jsxs } from "react/jsx-runtime";
|
||
export * from "./intl";
|
||
export * from "./useStyle";
|
||
var omitUndefined = function omitUndefined(obj) {
|
||
var newObj = {};
|
||
Object.keys(obj || {}).forEach(function (key) {
|
||
if (obj[key] !== undefined) {
|
||
newObj[key] = obj[key];
|
||
}
|
||
});
|
||
if (Object.keys(newObj).length < 1) {
|
||
return undefined;
|
||
}
|
||
return newObj;
|
||
};
|
||
|
||
/**
|
||
* 用于判断当前是否需要开启哈希(Hash)模式。
|
||
* 首先也会判断当前是否处于测试环境中(通过 process.env.NODE_ENV === 'TEST' 判断),
|
||
* 如果是,则返回 false。否则,直接返回 true 表示需要打开。
|
||
* @returns
|
||
*/
|
||
export var isNeedOpenHash = function isNeedOpenHash() {
|
||
var _process$env$NODE_ENV, _process$env$NODE_ENV2;
|
||
if (typeof process !== 'undefined' && (((_process$env$NODE_ENV = process.env.NODE_ENV) === null || _process$env$NODE_ENV === void 0 ? void 0 : _process$env$NODE_ENV.toUpperCase()) === 'TEST' || ((_process$env$NODE_ENV2 = process.env.NODE_ENV) === null || _process$env$NODE_ENV2 === void 0 ? void 0 : _process$env$NODE_ENV2.toUpperCase()) === 'DEV')) {
|
||
return false;
|
||
}
|
||
return true;
|
||
};
|
||
|
||
/**
|
||
* 用于配置 ValueEnum 的通用配置
|
||
*/
|
||
|
||
/**
|
||
* 支持 Map 和 Object
|
||
*
|
||
* @name ValueEnum 的类型
|
||
*/
|
||
|
||
/**
|
||
* 支持 Map 和 Object
|
||
*/
|
||
|
||
/**
|
||
* BaseProFieldFC 的类型设置
|
||
*/
|
||
|
||
/** Render 第二个参数,里面包含了一些常用的参数 */
|
||
|
||
/**
|
||
* 自带的token 配置
|
||
*/
|
||
|
||
/* Creating a context object with the default values. */
|
||
var ProConfigContext = /*#__PURE__*/React.createContext({
|
||
intl: _objectSpread(_objectSpread({}, zhCNIntl), {}, {
|
||
locale: 'default'
|
||
}),
|
||
valueTypeMap: {},
|
||
theme: emptyTheme,
|
||
hashed: true,
|
||
dark: false,
|
||
token: defaultToken
|
||
});
|
||
var ConfigConsumer = ProConfigContext.Consumer;
|
||
|
||
/**
|
||
* 组件解除挂载后清空一下 cache
|
||
* @date 2022-11-28
|
||
* @returns null
|
||
*/
|
||
export { ConfigConsumer };
|
||
var CacheClean = function CacheClean() {
|
||
var _useSWRConfig = useSWRConfig(),
|
||
cache = _useSWRConfig.cache;
|
||
useEffect(function () {
|
||
return function () {
|
||
// is a map
|
||
// @ts-ignore
|
||
cache.clear();
|
||
};
|
||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||
}, []);
|
||
return null;
|
||
};
|
||
|
||
/**
|
||
* 用于配置 Pro 的组件,分装之后会简单一些
|
||
* @param props
|
||
* @returns
|
||
*/
|
||
var ConfigProviderContainer = function ConfigProviderContainer(props) {
|
||
var _proTheme$useToken;
|
||
var children = props.children,
|
||
dark = props.dark,
|
||
valueTypeMap = props.valueTypeMap,
|
||
_props$autoClearCache = props.autoClearCache,
|
||
autoClearCache = _props$autoClearCache === void 0 ? false : _props$autoClearCache,
|
||
propsToken = props.token,
|
||
prefixCls = props.prefixCls,
|
||
intl = props.intl;
|
||
var _useContext = useContext(AntdConfigProvider.ConfigContext),
|
||
locale = _useContext.locale,
|
||
getPrefixCls = _useContext.getPrefixCls,
|
||
restConfig = _objectWithoutProperties(_useContext, _excluded);
|
||
var tokenContext = (_proTheme$useToken = proTheme.useToken) === null || _proTheme$useToken === void 0 ? void 0 : _proTheme$useToken.call(proTheme);
|
||
var proProvide = useContext(ProConfigContext);
|
||
|
||
/**
|
||
* pro 的 类
|
||
* @type {string}
|
||
* @example .ant-pro
|
||
*/
|
||
|
||
var proComponentsCls = prefixCls ? ".".concat(prefixCls) : ".".concat(getPrefixCls(), "-pro");
|
||
var antCls = '.' + getPrefixCls();
|
||
var salt = "".concat(proComponentsCls);
|
||
/**
|
||
* 合并一下token,不然导致嵌套 token 失效
|
||
*/
|
||
var proLayoutTokenMerge = useMemo(function () {
|
||
return getLayoutDesignToken(propsToken || {}, tokenContext.token || defaultToken);
|
||
}, [propsToken, tokenContext.token]);
|
||
var proProvideValue = useMemo(function () {
|
||
var _proProvide$intl;
|
||
var localeName = locale === null || locale === void 0 ? void 0 : locale.locale;
|
||
var key = findIntlKeyByAntdLocaleKey(localeName);
|
||
// antd 的 key 存在的时候以 antd 的为主
|
||
var resolvedIntl = intl !== null && intl !== void 0 ? intl : localeName && ((_proProvide$intl = proProvide.intl) === null || _proProvide$intl === void 0 ? void 0 : _proProvide$intl.locale) === 'default' ? intlMap[key] : proProvide.intl || intlMap[key];
|
||
return _objectSpread(_objectSpread({}, proProvide), {}, {
|
||
dark: dark !== null && dark !== void 0 ? dark : proProvide.dark,
|
||
token: merge(proProvide.token, tokenContext.token, {
|
||
proComponentsCls: proComponentsCls,
|
||
antCls: antCls,
|
||
themeId: tokenContext.theme.id,
|
||
layout: proLayoutTokenMerge
|
||
}),
|
||
intl: resolvedIntl || zhCNIntl
|
||
});
|
||
}, [locale === null || locale === void 0 ? void 0 : locale.locale, proProvide, dark, tokenContext.token, tokenContext.theme.id, proComponentsCls, antCls, proLayoutTokenMerge, intl]);
|
||
var finalToken = _objectSpread(_objectSpread({}, proProvideValue.token || {}), {}, {
|
||
proComponentsCls: proComponentsCls
|
||
});
|
||
var _useCacheToken = useCacheToken(tokenContext.theme, [tokenContext.token, finalToken !== null && finalToken !== void 0 ? finalToken : {}], {
|
||
salt: salt,
|
||
override: finalToken
|
||
}),
|
||
_useCacheToken2 = _slicedToArray(_useCacheToken, 2),
|
||
token = _useCacheToken2[0],
|
||
nativeHashId = _useCacheToken2[1];
|
||
var hashed = useMemo(function () {
|
||
if (props.hashed === false) {
|
||
return false;
|
||
}
|
||
if (proProvide.hashed === false) return false;
|
||
return true;
|
||
}, [proProvide.hashed, props.hashed]);
|
||
var hashId = useMemo(function () {
|
||
if (props.hashed === false) {
|
||
return '';
|
||
}
|
||
if (proProvide.hashed === false) return '';
|
||
//Fix issue with hashId code
|
||
if (isNeedOpenHash() === false) {
|
||
return '';
|
||
} else if (tokenContext.hashId) {
|
||
return tokenContext.hashId;
|
||
} else {
|
||
// 生产环境或其他环境
|
||
return nativeHashId;
|
||
}
|
||
}, [nativeHashId, proProvide.hashed, props.hashed]);
|
||
useEffect(function () {
|
||
dayjs.locale((locale === null || locale === void 0 ? void 0 : locale.locale) || 'zh-cn');
|
||
}, [locale === null || locale === void 0 ? void 0 : locale.locale]);
|
||
var themeConfig = useMemo(function () {
|
||
return _objectSpread(_objectSpread({}, restConfig.theme), {}, {
|
||
hashId: hashId,
|
||
hashed: hashed && isNeedOpenHash()
|
||
});
|
||
}, [restConfig.theme, hashId, hashed, isNeedOpenHash()]);
|
||
var proConfigContextValue = useMemo(function () {
|
||
return _objectSpread(_objectSpread({}, proProvideValue), {}, {
|
||
valueTypeMap: valueTypeMap || (proProvideValue === null || proProvideValue === void 0 ? void 0 : proProvideValue.valueTypeMap),
|
||
token: token,
|
||
theme: tokenContext.theme,
|
||
hashed: hashed,
|
||
hashId: hashId
|
||
});
|
||
}, [proProvideValue, valueTypeMap, token, tokenContext.theme, hashed, hashId]);
|
||
var configProviderDom = useMemo(function () {
|
||
return /*#__PURE__*/_jsx(AntdConfigProvider, _objectSpread(_objectSpread({}, restConfig), {}, {
|
||
theme: themeConfig,
|
||
children: /*#__PURE__*/_jsx(ProConfigContext.Provider, {
|
||
value: proConfigContextValue,
|
||
children: /*#__PURE__*/_jsxs(_Fragment, {
|
||
children: [autoClearCache && /*#__PURE__*/_jsx(CacheClean, {}), children]
|
||
})
|
||
})
|
||
}));
|
||
|
||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||
}, [restConfig, themeConfig, proConfigContextValue, autoClearCache, children]);
|
||
if (!autoClearCache) return configProviderDom;
|
||
return /*#__PURE__*/_jsx(SWRConfig, {
|
||
value: {
|
||
provider: function provider() {
|
||
return new Map();
|
||
}
|
||
},
|
||
children: configProviderDom
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 用于配置 Pro 的一些全局性的东西
|
||
* @param props
|
||
* @returns
|
||
*/
|
||
export var ProConfigProvider = function ProConfigProvider(props) {
|
||
var needDeps = props.needDeps,
|
||
dark = props.dark,
|
||
token = props.token;
|
||
var proProvide = useContext(ProConfigContext);
|
||
var _useContext2 = useContext(AntdConfigProvider.ConfigContext),
|
||
locale = _useContext2.locale,
|
||
theme = _useContext2.theme,
|
||
rest = _objectWithoutProperties(_useContext2, _excluded2);
|
||
|
||
// 是不是不需要渲染 provide
|
||
var isNullProvide = needDeps && proProvide.hashId !== undefined && Object.keys(props).sort().join('-') === 'children-needDeps';
|
||
if (isNullProvide) return /*#__PURE__*/_jsx(_Fragment, {
|
||
children: props.children
|
||
});
|
||
var mergeAlgorithm = function mergeAlgorithm() {
|
||
var isDark = dark !== null && dark !== void 0 ? dark : proProvide.dark;
|
||
if (isDark && !Array.isArray(theme === null || theme === void 0 ? void 0 : theme.algorithm)) {
|
||
return [theme === null || theme === void 0 ? void 0 : theme.algorithm, proTheme.darkAlgorithm].filter(Boolean);
|
||
}
|
||
if (isDark && Array.isArray(theme === null || theme === void 0 ? void 0 : theme.algorithm)) {
|
||
return [].concat(_toConsumableArray((theme === null || theme === void 0 ? void 0 : theme.algorithm) || []), [proTheme.darkAlgorithm]).filter(Boolean);
|
||
}
|
||
return theme === null || theme === void 0 ? void 0 : theme.algorithm;
|
||
};
|
||
// 自动注入 antd 的配置
|
||
var configProvider = _objectSpread(_objectSpread({}, rest), {}, {
|
||
locale: locale || zh_CN,
|
||
theme: omitUndefined(_objectSpread(_objectSpread({}, theme), {}, {
|
||
algorithm: mergeAlgorithm()
|
||
}))
|
||
});
|
||
return /*#__PURE__*/_jsx(AntdConfigProvider, _objectSpread(_objectSpread({}, configProvider), {}, {
|
||
children: /*#__PURE__*/_jsx(ConfigProviderContainer, _objectSpread(_objectSpread({}, props), {}, {
|
||
token: token
|
||
}))
|
||
}));
|
||
};
|
||
|
||
/**
|
||
* It returns the intl object from the context if it exists, otherwise it returns the intl object for
|
||
* 获取国际化的方法
|
||
* @param locale
|
||
* @param localeMap
|
||
* the current locale
|
||
* @returns The return value of the function is the intl object.
|
||
*/
|
||
export function useIntl() {
|
||
var _useContext3 = useContext(AntdConfigProvider.ConfigContext),
|
||
locale = _useContext3.locale;
|
||
var _useContext4 = useContext(ProConfigContext),
|
||
intl = _useContext4.intl;
|
||
if (intl && intl.locale !== 'default') {
|
||
return intl || zhCNIntl;
|
||
}
|
||
if (locale !== null && locale !== void 0 && locale.locale) {
|
||
return intlMap[findIntlKeyByAntdLocaleKey(locale.locale)] || zhCNIntl;
|
||
}
|
||
return zhCNIntl;
|
||
}
|
||
ProConfigContext.displayName = 'ProProvider';
|
||
export var ProProvider = ProConfigContext;
|
||
export default ProConfigContext; |