app.ts
1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { defineStore } from "pinia";
import { ref } from "vue";
import i18n from "@/locales/index";
export const useAppStore = defineStore("app", () => {
// State
const language = ref(localStorage.getItem("language") || "zh-CN");
const theme = ref(localStorage.getItem("theme") || "light"); // 默认亮色主题
const sidebarCollapsed = ref(true);
const refreshFileHierarchySignal = ref(0);
const lastCreatedFolderId = ref<string | number | null>(null);
const globalModalVisible = ref(false);
// Actions
function setGlobalModalVisible(visible: boolean) {
globalModalVisible.value = visible;
}
function triggerRefreshFileHierarchy(folderId?: string | number) {
if (folderId) {
lastCreatedFolderId.value = folderId;
}
refreshFileHierarchySignal.value++;
}
function setLanguage(lang: string) {
language.value = lang;
localStorage.setItem("language", lang);
// 同步设置 i18n 实例的 locale
// @ts-ignore
i18n.global.locale.value = lang;
// 同步设置 HTML lang 属性,确保全局 i18n 样式(如 Affine 菜单)生效
document.documentElement.setAttribute("lang", lang);
}
function setTheme(newTheme: string) {
theme.value = newTheme;
localStorage.setItem("theme", newTheme);
// 切换主题类名
document.documentElement.setAttribute("data-theme", newTheme);
}
function toggleSidebar() {
sidebarCollapsed.value = !sidebarCollapsed.value;
}
return {
// state
language,
theme,
sidebarCollapsed,
refreshFileHierarchySignal,
lastCreatedFolderId,
globalModalVisible,
// actions
setLanguage,
setTheme,
toggleSidebar,
triggerRefreshFileHierarchy,
setGlobalModalVisible,
};
});