59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import { Extension, Compartment } from '@codemirror/state';
|
|
import { EditorView } from '@codemirror/view';
|
|
import { SystemThemeType } from '@/../bindings/voidraft/internal/models/models';
|
|
import { createDarkTheme } from '@/views/editor/theme/dark';
|
|
import { createLightTheme } from '@/views/editor/theme/light';
|
|
import { useThemeStore } from '@/stores/themeStore';
|
|
|
|
// 主题区间 - 用于动态切换主题
|
|
export const themeCompartment = new Compartment();
|
|
|
|
/**
|
|
* 根据主题类型获取主题扩展
|
|
*/
|
|
const getThemeExtension = (themeType: SystemThemeType): Extension => {
|
|
const themeStore = useThemeStore();
|
|
|
|
// 处理 auto 主题类型
|
|
let actualTheme: SystemThemeType = themeType;
|
|
if (themeType === SystemThemeType.SystemThemeAuto) {
|
|
actualTheme = window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
? SystemThemeType.SystemThemeDark
|
|
: SystemThemeType.SystemThemeLight;
|
|
}
|
|
|
|
// 根据主题类型创建主题
|
|
if (actualTheme === SystemThemeType.SystemThemeLight) {
|
|
return createLightTheme(themeStore.themeColors.lightTheme);
|
|
} else {
|
|
return createDarkTheme(themeStore.themeColors.darkTheme);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 创建主题扩展(用于编辑器初始化)
|
|
*/
|
|
export const createThemeExtension = (themeType: SystemThemeType = SystemThemeType.SystemThemeDark): Extension => {
|
|
const extension = getThemeExtension(themeType);
|
|
return themeCompartment.of(extension);
|
|
};
|
|
|
|
/**
|
|
* 更新编辑器主题
|
|
*/
|
|
export const updateEditorTheme = (view: EditorView, themeType: SystemThemeType): void => {
|
|
if (!view?.dispatch) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const extension = getThemeExtension(themeType);
|
|
view.dispatch({
|
|
effects: themeCompartment.reconfigure(extension)
|
|
});
|
|
} catch (error) {
|
|
console.error('Failed to update editor theme:', error);
|
|
}
|
|
};
|
|
|