store/src/web-env.ts
2025-03-01 17:35:43 +08:00

101 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { getPathKey } from './utils/path-key.ts';
import { BaseLoad } from '@kevisual/load';
type GlobalEnv = {
name?: string;
[key: string]: any;
};
// 从window对象中获取全局的环境变量如果没有则初始化一个
export const useEnv = (initEnv?: GlobalEnv, initKey = 'config') => {
const env: GlobalEnv = (window as any)[initKey];
const _env = env || initEnv;
if (!env) {
if (_env) {
(window as any)[initKey] = _env;
} else {
(window as any)[initKey] = {};
}
}
return window[initKey] as GlobalEnv;
};
// 从全局环境变量中获取指定的key值如果没有则初始化一个, key不存在返回Env对象
export const useEnvKey = <T = any>(key: string, init?: () => T | null, initKey = 'config'): T => {
const _env = useEnv({}, initKey);
// 已经存在,直接返回
if (key && typeof _env[key] !== 'undefined') {
return _env[key];
}
// 不存在,但是有初始化函数,初始化的返回,同步函数,删除了重新加载?
if (key && init) {
_env[key] = init();
return _env[key];
}
if (key) {
// 加载
const baseLoad = new BaseLoad();
const voidFn = async () => {
return _env[key];
};
const checkFn = async () => {
const loadRes = await baseLoad.load(voidFn, {
key,
isReRun: true,
checkSuccess: () => _env[key],
timeout: 5 * 60 * 1000,
interval: 1000,
//
});
if (loadRes.code !== 200) {
console.error('load key error');
return null;
}
return _env[key];
};
return checkFn() as T;
}
// 不存在,没有初始化函数
console.error('key is empty ');
return null;
};
export const usePageEnv = (init?: () => {}, initKey = 'conifg') => {
const { id } = getPathKey();
return useEnvKey(id, init, initKey);
};
type GlobalContext = {
name?: string;
[key: string]: any;
};
export const useContext = (initContext?: GlobalContext) => {
return useEnv(initContext, 'context');
};
export const useContextKey = <T = any>(key: string, init?: () => T): T => {
return useEnvKey(key, init, 'context');
};
export const usePageContext = (init?: () => {}) => {
const { id } = getPathKey();
return useContextKey(id, init);
};
type GlobalConfig = {
name?: string;
[key: string]: any;
};
export const useConfig = (initConfig?: GlobalConfig) => {
return useEnv(initConfig, 'config');
};
export const useConfigKey = <T = any>(key: string, init?: () => T): T => {
return useEnvKey(key, init, 'config');
};
export const usePageConfig = (init?: () => {}) => {
const { id } = getPathKey();
return useConfigKey(id, init);
};