Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
export * from './access';
|
||||
export * from './dict';
|
||||
export * from './tabbar';
|
||||
export * from './timezone';
|
||||
export * from './user';
|
||||
|
||||
132
packages/stores/src/modules/timezone.ts
Normal file
132
packages/stores/src/modules/timezone.ts
Normal file
@@ -0,0 +1,132 @@
|
||||
import { ref, unref } from 'vue';
|
||||
|
||||
import { DEFAULT_TIME_ZONE_OPTIONS } from '@vben-core/preferences';
|
||||
import {
|
||||
getCurrentTimezone,
|
||||
setCurrentTimezone,
|
||||
} from '@vben-core/shared/utils';
|
||||
|
||||
import { acceptHMRUpdate, defineStore } from 'pinia';
|
||||
|
||||
interface TimezoneHandler {
|
||||
getTimezone?: () => Promise<null | string | undefined>;
|
||||
getTimezoneOptions?: () => Promise<
|
||||
{
|
||||
label: string;
|
||||
value: string;
|
||||
}[]
|
||||
>;
|
||||
setTimezone?: (timezone: string) => Promise<void>;
|
||||
}
|
||||
|
||||
/**
|
||||
* 默认时区处理模块
|
||||
* 时区存储基于pinia存储插件
|
||||
*/
|
||||
const getDefaultTimezoneHandler = (): TimezoneHandler => {
|
||||
return {
|
||||
getTimezoneOptions: () => {
|
||||
return Promise.resolve(
|
||||
DEFAULT_TIME_ZONE_OPTIONS.map((item) => {
|
||||
return {
|
||||
label: item.label,
|
||||
value: item.timezone,
|
||||
};
|
||||
}),
|
||||
);
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* 自定义时区处理模块
|
||||
*/
|
||||
let customTimezoneHandler: null | Partial<TimezoneHandler> = null;
|
||||
const setTimezoneHandler = (handler: Partial<TimezoneHandler>) => {
|
||||
customTimezoneHandler = handler;
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取时区处理模块
|
||||
*/
|
||||
const getTimezoneHandler = () => {
|
||||
return {
|
||||
...getDefaultTimezoneHandler(),
|
||||
...customTimezoneHandler,
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* timezone支持模块
|
||||
*/
|
||||
const useTimezoneStore = defineStore(
|
||||
'core-timezone',
|
||||
() => {
|
||||
const timezoneRef = ref(getCurrentTimezone());
|
||||
|
||||
/**
|
||||
* 初始化时区
|
||||
* Initialize the timezone
|
||||
*/
|
||||
async function initTimezone() {
|
||||
const timezoneHandler = getTimezoneHandler();
|
||||
const timezone = await timezoneHandler.getTimezone?.();
|
||||
if (timezone) {
|
||||
timezoneRef.value = timezone;
|
||||
}
|
||||
// 设置dayjs默认时区
|
||||
setCurrentTimezone(unref(timezoneRef));
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置时区
|
||||
* Set the timezone
|
||||
* @param timezone 时区字符串
|
||||
*/
|
||||
async function setTimezone(timezone: string) {
|
||||
const timezoneHandler = getTimezoneHandler();
|
||||
await timezoneHandler.setTimezone?.(timezone);
|
||||
timezoneRef.value = timezone;
|
||||
// 设置dayjs默认时区
|
||||
setCurrentTimezone(timezone);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取时区选项
|
||||
* Get the timezone options
|
||||
*/
|
||||
async function getTimezoneOptions() {
|
||||
const timezoneHandler = getTimezoneHandler();
|
||||
return (await timezoneHandler.getTimezoneOptions?.()) || [];
|
||||
}
|
||||
|
||||
initTimezone().catch((error) => {
|
||||
console.error('Failed to initialize timezone during store setup:', error);
|
||||
});
|
||||
|
||||
function $reset() {
|
||||
timezoneRef.value = getCurrentTimezone();
|
||||
}
|
||||
|
||||
return {
|
||||
timezone: timezoneRef,
|
||||
setTimezone,
|
||||
getTimezoneOptions,
|
||||
$reset,
|
||||
};
|
||||
},
|
||||
{
|
||||
persist: {
|
||||
// 持久化
|
||||
pick: ['timezone'],
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
export { setTimezoneHandler, useTimezoneStore };
|
||||
|
||||
// 解决热更新问题
|
||||
const hot = import.meta.hot;
|
||||
if (hot) {
|
||||
hot.accept(acceptHMRUpdate(useTimezoneStore, hot));
|
||||
}
|
||||
Reference in New Issue
Block a user