Co-authored-by: paisley <8197966+su8su@users.noreply.github.com> Co-authored-by: zuolingxuan <zuolingxuan@bytedance.com>
153 lines
4.8 KiB
TypeScript
153 lines
4.8 KiB
TypeScript
/**
|
|
* Settings State Store
|
|
* Manages application settings
|
|
*/
|
|
import { create } from 'zustand';
|
|
import { persist } from 'zustand/middleware';
|
|
import i18n from '@/i18n';
|
|
import { hostApiFetch } from '@/lib/host-api';
|
|
|
|
type Theme = 'light' | 'dark' | 'system';
|
|
type UpdateChannel = 'stable' | 'beta' | 'dev';
|
|
|
|
interface SettingsState {
|
|
// General
|
|
theme: Theme;
|
|
language: string;
|
|
startMinimized: boolean;
|
|
launchAtStartup: boolean;
|
|
|
|
// Gateway
|
|
gatewayAutoStart: boolean;
|
|
gatewayPort: number;
|
|
proxyEnabled: boolean;
|
|
proxyServer: string;
|
|
proxyHttpServer: string;
|
|
proxyHttpsServer: string;
|
|
proxyAllServer: string;
|
|
proxyBypassRules: string;
|
|
|
|
// Update
|
|
updateChannel: UpdateChannel;
|
|
autoCheckUpdate: boolean;
|
|
autoDownloadUpdate: boolean;
|
|
|
|
// UI State
|
|
sidebarCollapsed: boolean;
|
|
devModeUnlocked: boolean;
|
|
|
|
// Setup
|
|
setupComplete: boolean;
|
|
|
|
// Actions
|
|
init: () => Promise<void>;
|
|
setTheme: (theme: Theme) => void;
|
|
setLanguage: (language: string) => void;
|
|
setStartMinimized: (value: boolean) => void;
|
|
setLaunchAtStartup: (value: boolean) => void;
|
|
setGatewayAutoStart: (value: boolean) => void;
|
|
setGatewayPort: (port: number) => void;
|
|
setProxyEnabled: (value: boolean) => void;
|
|
setProxyServer: (value: string) => void;
|
|
setProxyHttpServer: (value: string) => void;
|
|
setProxyHttpsServer: (value: string) => void;
|
|
setProxyAllServer: (value: string) => void;
|
|
setProxyBypassRules: (value: string) => void;
|
|
setUpdateChannel: (channel: UpdateChannel) => void;
|
|
setAutoCheckUpdate: (value: boolean) => void;
|
|
setAutoDownloadUpdate: (value: boolean) => void;
|
|
setSidebarCollapsed: (value: boolean) => void;
|
|
setDevModeUnlocked: (value: boolean) => void;
|
|
markSetupComplete: () => void;
|
|
resetSettings: () => void;
|
|
}
|
|
|
|
const defaultSettings = {
|
|
theme: 'system' as Theme,
|
|
language: (() => {
|
|
const lang = navigator.language.toLowerCase();
|
|
if (lang.startsWith('zh')) return 'zh';
|
|
if (lang.startsWith('ja')) return 'ja';
|
|
return 'en';
|
|
})(),
|
|
startMinimized: false,
|
|
launchAtStartup: false,
|
|
gatewayAutoStart: true,
|
|
gatewayPort: 18789,
|
|
proxyEnabled: false,
|
|
proxyServer: '',
|
|
proxyHttpServer: '',
|
|
proxyHttpsServer: '',
|
|
proxyAllServer: '',
|
|
proxyBypassRules: '<local>;localhost;127.0.0.1;::1',
|
|
updateChannel: 'stable' as UpdateChannel,
|
|
autoCheckUpdate: true,
|
|
autoDownloadUpdate: false,
|
|
sidebarCollapsed: false,
|
|
devModeUnlocked: false,
|
|
setupComplete: false,
|
|
};
|
|
|
|
export const useSettingsStore = create<SettingsState>()(
|
|
persist(
|
|
(set) => ({
|
|
...defaultSettings,
|
|
|
|
init: async () => {
|
|
try {
|
|
const settings = await hostApiFetch<Partial<typeof defaultSettings>>('/api/settings');
|
|
set((state) => ({ ...state, ...settings }));
|
|
if (settings.language) {
|
|
i18n.changeLanguage(settings.language);
|
|
}
|
|
} catch {
|
|
// Keep renderer-persisted settings as a fallback when the main
|
|
// process store is not reachable.
|
|
}
|
|
},
|
|
|
|
setTheme: (theme) => set({ theme }),
|
|
setLanguage: (language) => {
|
|
i18n.changeLanguage(language);
|
|
set({ language });
|
|
void hostApiFetch('/api/settings/language', {
|
|
method: 'PUT',
|
|
body: JSON.stringify({ value: language }),
|
|
}).catch(() => {});
|
|
},
|
|
setStartMinimized: (startMinimized) => set({ startMinimized }),
|
|
setLaunchAtStartup: (launchAtStartup) => set({ launchAtStartup }),
|
|
setGatewayAutoStart: (gatewayAutoStart) => {
|
|
set({ gatewayAutoStart });
|
|
void hostApiFetch('/api/settings/gatewayAutoStart', {
|
|
method: 'PUT',
|
|
body: JSON.stringify({ value: gatewayAutoStart }),
|
|
}).catch(() => {});
|
|
},
|
|
setGatewayPort: (gatewayPort) => {
|
|
set({ gatewayPort });
|
|
void hostApiFetch('/api/settings/gatewayPort', {
|
|
method: 'PUT',
|
|
body: JSON.stringify({ value: gatewayPort }),
|
|
}).catch(() => {});
|
|
},
|
|
setProxyEnabled: (proxyEnabled) => set({ proxyEnabled }),
|
|
setProxyServer: (proxyServer) => set({ proxyServer }),
|
|
setProxyHttpServer: (proxyHttpServer) => set({ proxyHttpServer }),
|
|
setProxyHttpsServer: (proxyHttpsServer) => set({ proxyHttpsServer }),
|
|
setProxyAllServer: (proxyAllServer) => set({ proxyAllServer }),
|
|
setProxyBypassRules: (proxyBypassRules) => set({ proxyBypassRules }),
|
|
setUpdateChannel: (updateChannel) => set({ updateChannel }),
|
|
setAutoCheckUpdate: (autoCheckUpdate) => set({ autoCheckUpdate }),
|
|
setAutoDownloadUpdate: (autoDownloadUpdate) => set({ autoDownloadUpdate }),
|
|
setSidebarCollapsed: (sidebarCollapsed) => set({ sidebarCollapsed }),
|
|
setDevModeUnlocked: (devModeUnlocked) => set({ devModeUnlocked }),
|
|
markSetupComplete: () => set({ setupComplete: true }),
|
|
resetSettings: () => set(defaultSettings),
|
|
}),
|
|
{
|
|
name: 'clawx-settings',
|
|
}
|
|
)
|
|
);
|