@nutui/nutui-react
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
73 lines (72 loc) • 2.54 kB
JavaScript
import { _ as __rest } from "./tslib.es6.js";
import * as React from "react";
import React__default, { createContext, useContext } from "react";
import classNames from "classnames";
import kebabCase from "lodash.kebabcase";
import isequal from "lodash.isequal";
import { z as zhCN } from "./zh-CN.js";
import { i as inBrowser } from "./raf.js";
function useMemo(getValue, condition, shouldUpdate) {
const cacheRef = React.useRef({});
if (!("value" in cacheRef.current) || shouldUpdate(cacheRef.current.condition, condition)) {
cacheRef.current.value = getValue();
cacheRef.current.condition = condition;
}
return cacheRef.current.value;
}
const classPrefix = "nut-configprovider";
const defaultConfigRef = {
current: {
locale: zhCN
}
};
const setDefaultConfig = (config) => {
defaultConfigRef.current = config;
};
const getDefaultConfig = () => {
return defaultConfigRef.current;
};
const ConfigContext = createContext(null);
const useConfig = () => {
var _a;
return (_a = useContext(ConfigContext)) !== null && _a !== void 0 ? _a : getDefaultConfig();
};
function convertThemeVarsToCSSVars(themeVars) {
const cssVars = {};
Object.keys(themeVars).forEach((key) => {
cssVars[`--${kebabCase(key)}`] = themeVars[key];
});
return cssVars;
}
const useRtl = () => {
const { direction } = useConfig();
if (direction) {
return direction === "rtl";
}
return inBrowser && document.dir === "rtl";
};
const ConfigProvider = (props) => {
const { style, className, children, direction } = props, config = __rest(props, ["style", "className", "children", "direction"]);
const mergedConfig = useMemo(() => {
return Object.assign(Object.assign(Object.assign({}, getDefaultConfig()), config), { direction });
}, [config, direction], (prev, next) => prev.some((prevTheme, index) => {
const nextTheme = next[index];
return !isequal(prevTheme, nextTheme);
}));
const cssVarStyle = React__default.useMemo(() => {
return convertThemeVarsToCSSVars(mergedConfig.theme || {});
}, [mergedConfig.theme]);
return React__default.createElement(
ConfigContext.Provider,
{ value: mergedConfig },
React__default.createElement("div", { className: classNames(classPrefix, className), style: Object.assign(Object.assign(Object.assign({}, cssVarStyle), style), { direction }), dir: direction }, children)
);
};
ConfigProvider.displayName = "NutConfigProvider";
export {
ConfigProvider as C,
useRtl as a,
getDefaultConfig as g,
setDefaultConfig as s,
useConfig as u
};