UNPKG

@nutui/nutui-react

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

73 lines (72 loc) 2.54 kB
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 };