import { create } from 'zustand'; import { persist } from 'zustand/middleware'; import type { Config, } from './schema'; import { queryLogin } from '@/modules/query'; import { toast } from 'sonner'; type ConfigState = { config: Config; setConfig: (config: Partial) => void; resetConfig: () => void; saveToRemote: () => Promise; loadFromRemote: () => Promise; checkConfig: (opts?: { isUser?: boolean, reload?: boolean }) => Promise; }; const STORAGE_KEY = 'cnb-config'; const DEFAULT_CONFIG = { CNB_API_KEY: '', CNB_COOKIE: '', } const loadInitialConfig = (): Config => { try { const stored = localStorage.getItem(STORAGE_KEY); if (stored) { return JSON.parse(stored); } } catch { // Ignore parse errors } return DEFAULT_CONFIG; }; export const useConfigStore = create()( persist( (set, get) => ({ config: loadInitialConfig(), setConfig: (newConfig) => set((state) => ({ config: { ...state.config, ...newConfig }, })), resetConfig: () => set({ config: DEFAULT_CONFIG, }), saveToRemote: async () => { const _config = get().config; const res = await queryLogin.post({ path: 'config', key: 'update', data: { key: 'cnb_center_config.json', data: _config, } }); if (res.code === 200) { toast.success('保存到远端成功') } else { toast.error('保存到远端失败') } }, loadFromRemote: async () => { const setConfig = (config: Config) => set({ config }); const res = await queryLogin.post({ path: 'config', key: 'get', data: { key: 'cnb_center_config.json', } }) if (res.code === 404) { toast.error('远端配置不存在') return false; } if (res.code === 200) { const config = res.data?.data as typeof config; setConfig(config); toast.success('获取远端配置成功') return true; } return false; }, checkConfig: async (opts?: { isUser?: boolean, reload?: boolean }) => { const { CNB_API_KEY } = get().config; if (!CNB_API_KEY && opts?.isUser) { const res = await get().loadFromRemote(); if (opts?.reload && res) { location.reload(); } return res; } return false } }), { name: STORAGE_KEY, } ) );