repo_description: Professional Antigravity Account Manager & Switcher. One-click seamless account switching for Antigravity Tools. Built with Tauri v2 + React (Rust).专业的 Antigravity 账号管理与切换工具。为 Antigravity 提供一键无缝账号切换功能。
repo_topics: account-manager antigravity
code: import { create } from 'zustand';
  import { AppConfig } from '../types/config';
  import * as configService from '../services/configService';
  
  interface ConfigState {
      config: AppConfig | null;
      loading: boolean;
      error: string | null;
  
      // Actions
      loadConfig: () => Promise<void>;
      saveConfig: (config: AppConfig, silent?: boolean) => Promise<void>;
      updateTheme: (theme: string) => Promise<void>;
      updateLanguage: (language: string) => Promise<void>;
      toggleShowAllQuotas: () => void;
      showAllQuotas: boolean;
      toggleMenuItem: (path: string) => Promise<void>;
      isMenuItemHidden: (path: string) => boolean;
  }
  
  export const useConfigStore = create<ConfigState>((set, get) => ({
      config: null,
      loading: false,
      error: null,
      showAllQuotas: localStorage.getItem('antigravity_show_all_quotas') === 'true',
  
      loadConfig: async () => {
          set({ loading: true, error: null });
          try {
              const config = await configService.loadConfig();
              set({ config, loading: false });
          } catch (error) {
              set({ error: String(error), loading: false });
          }
      },
  
      saveConfig: async (config: AppConfig, silent: boolean = false) => {
          if (!silent) set({ loading: true, error: null });
          try {
              await configService.saveConfig(config);
              set({ config, loading: false });
              const { isTauri } = await import('../utils/env');
              if (isTauri()) {
                  const { invoke } = await import('@tauri-apps/api/core');
                  await invoke('set_window_theme', { theme: config.theme }).catch(() => {
                  });
              }
          } catch (error) {
              set({ error: String(error), loading: false });
              throw error;
          }
      },
  
      updateTheme: async (theme: string) => {
          const { config } = get();
          if (!config || config.theme === theme) return;
  
          const newConfig = { ...config, theme };
          await get().saveConfig(newConfig, true);
      },
  
      updateLanguage: async (language: string) => {
          const { config } = get();
          if (!config || config.language === language) return;
  
          const newConfig = { ...config, language };
          await get().saveConfig(newConfig, true);
      },
  
      toggleShowAllQuotas: () => {
          const current = get().showAllQuotas;
          const next = !current;
          localStorage.setItem('antigravity_show_all_quotas', String(next));
          set({ showAllQuotas: next });
      },
  
      toggleMenuItem: async (path: string) => {
          const { config } = get();
          if (!config) return;
  
          const hiddenItems = config.hidden_menu_items || [];
          const isHidden = hiddenItems.includes(path);
  
          const newHiddenItems = isHidden
              ? hiddenItems.filter(item => item !== path)
              : [...hiddenItems, path];
  
          const newConfig = { ...config, hidden_menu_items: newHiddenItems };
          await get().saveConfig(newConfig, true);
      },
  
      isMenuItemHidden: (path: string) => {
          const { config } = get();
          if (!config) return false;
          return (config.hidden_menu_items || []).includes(path);
      },
  }));
  