58 lines
2.3 KiB
JavaScript
Raw Permalink Normal View History

2024-01-29 09:26:07 +08:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
2024-08-02 18:19:39 +08:00
exports.useThemeClass = useThemeClass;
2024-01-29 09:26:07 +08:00
const vue_1 = require("vue");
const css_render_1 = require("css-render");
const vue3_ssr_1 = require("@css-render/vue3-ssr");
const context_1 = require("../config-provider/src/context");
const _utils_1 = require("../_utils");
const cssr_1 = require("../_utils/cssr");
function useThemeClass(componentName, hashRef, cssVarsRef, props) {
var _a;
if (!cssVarsRef)
(0, _utils_1.throwError)('useThemeClass', 'cssVarsRef is not passed');
const mergedThemeHashRef = (_a = (0, vue_1.inject)(context_1.configProviderInjectionKey, null)) === null || _a === void 0 ? void 0 : _a.mergedThemeHashRef;
const themeClassRef = (0, vue_1.ref)('');
const ssrAdapter = (0, vue3_ssr_1.useSsrAdapter)();
let renderCallback;
const hashClassPrefix = `__${componentName}`;
const mountStyle = () => {
let finalThemeHash = hashClassPrefix;
const hashValue = hashRef ? hashRef.value : undefined;
const themeHash = mergedThemeHashRef === null || mergedThemeHashRef === void 0 ? void 0 : mergedThemeHashRef.value;
if (themeHash)
2024-08-02 18:19:39 +08:00
finalThemeHash += `-${themeHash}`;
2024-01-29 09:26:07 +08:00
if (hashValue)
2024-08-02 18:19:39 +08:00
finalThemeHash += `-${hashValue}`;
2024-01-29 09:26:07 +08:00
const { themeOverrides, builtinThemeOverrides } = props;
if (themeOverrides) {
2024-08-02 18:19:39 +08:00
finalThemeHash += `-${(0, css_render_1.hash)(JSON.stringify(themeOverrides))}`;
2024-01-29 09:26:07 +08:00
}
if (builtinThemeOverrides) {
2024-08-02 18:19:39 +08:00
finalThemeHash += `-${(0, css_render_1.hash)(JSON.stringify(builtinThemeOverrides))}`;
2024-01-29 09:26:07 +08:00
}
themeClassRef.value = finalThemeHash;
renderCallback = () => {
const cssVars = cssVarsRef.value;
let style = '';
for (const key in cssVars) {
style += `${key}: ${cssVars[key]};`;
}
(0, cssr_1.c)(`.${finalThemeHash}`, style).mount({
id: finalThemeHash,
ssr: ssrAdapter
});
renderCallback = undefined;
};
};
(0, vue_1.watchEffect)(() => {
mountStyle();
});
return {
themeClass: themeClassRef,
onRender: () => {
renderCallback === null || renderCallback === void 0 ? void 0 : renderCallback();
}
};
}