95 lines
2.8 KiB
TypeScript
95 lines
2.8 KiB
TypeScript
/**
|
|
* Settings State Store
|
|
* Manages application settings
|
|
*/
|
|
import { create } from 'zustand';
|
|
import { persist } from 'zustand/middleware';
|
|
import i18n from '@/i18n';
|
|
|
|
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;
|
|
|
|
// Update
|
|
updateChannel: UpdateChannel;
|
|
autoCheckUpdate: boolean;
|
|
autoDownloadUpdate: boolean;
|
|
|
|
// UI State
|
|
sidebarCollapsed: boolean;
|
|
devModeUnlocked: boolean;
|
|
|
|
// Setup
|
|
setupComplete: boolean;
|
|
|
|
// Actions
|
|
setTheme: (theme: Theme) => void;
|
|
setLanguage: (language: string) => void;
|
|
setStartMinimized: (value: boolean) => void;
|
|
setLaunchAtStartup: (value: boolean) => void;
|
|
setGatewayAutoStart: (value: boolean) => void;
|
|
setGatewayPort: (port: number) => 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,
|
|
updateChannel: 'stable' as UpdateChannel,
|
|
autoCheckUpdate: true,
|
|
autoDownloadUpdate: false,
|
|
sidebarCollapsed: false,
|
|
devModeUnlocked: false,
|
|
setupComplete: false,
|
|
};
|
|
|
|
export const useSettingsStore = create<SettingsState>()(
|
|
persist(
|
|
(set) => ({
|
|
...defaultSettings,
|
|
|
|
setTheme: (theme) => set({ theme }),
|
|
setLanguage: (language) => { i18n.changeLanguage(language); set({ language }); },
|
|
setStartMinimized: (startMinimized) => set({ startMinimized }),
|
|
setLaunchAtStartup: (launchAtStartup) => set({ launchAtStartup }),
|
|
setGatewayAutoStart: (gatewayAutoStart) => set({ gatewayAutoStart }),
|
|
setGatewayPort: (gatewayPort) => set({ gatewayPort }),
|
|
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',
|
|
}
|
|
)
|
|
);
|