import { ref, unref } from 'vue'; import { DEFAULT_TIME_ZONE_OPTIONS } from '@vben-core/preferences'; import { getTimezone, setDefaultTimezone } from '@vben-core/shared/utils'; import { acceptHMRUpdate, defineStore } from 'pinia'; interface TimezoneHandler { getTimezone?: () => Promise; getTimezoneOptions?: () => Promise< { label: string; value: string; }[] >; setTimezone?: (timezone: string) => Promise; } /** * 默认时区处理模块 * 时区存储基于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 = null; const setTimezoneHandler = (handler: Partial) => { customTimezoneHandler = handler; }; /** * 获取时区处理模块 */ const getTimezoneHandler = () => { return { ...getDefaultTimezoneHandler(), ...customTimezoneHandler, }; }; /** * timezone支持模块 */ const useTimezoneStore = defineStore( 'core-timezone', () => { const timezoneRef = ref( getTimezone() || new Intl.DateTimeFormat().resolvedOptions().timeZone, ); /** * 初始化时区 * Initialize the timezone */ async function initTimezone() { const timezoneHandler = getTimezoneHandler(); const timezone = await timezoneHandler.getTimezone?.(); if (timezone) { timezoneRef.value = timezone; } // 设置dayjs默认时区 setDefaultTimezone(unref(timezoneRef)); } /** * 设置时区 * Set the timezone * @param timezone 时区字符串 */ async function setTimezone(timezone: string) { const timezoneHandler = getTimezoneHandler(); await timezoneHandler.setTimezone?.(timezone); timezoneRef.value = timezone; // 设置dayjs默认时区 setDefaultTimezone(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); }); return { timezone: timezoneRef, setTimezone, getTimezoneOptions, }; }, { persist: { // 持久化 pick: ['timezone'], }, }, ); export { setTimezoneHandler, useTimezoneStore }; // 解决热更新问题 const hot = import.meta.hot; if (hot) { hot.accept(acceptHMRUpdate(useTimezoneStore, hot)); }