app.ts 1.71 KB
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,
  };
});