39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
import { create } from 'zustand';
|
|
import { applyTheme } from '../appearance/themes';
|
|
|
|
export interface Settings {
|
|
fontSize: number; // 12-20
|
|
fontFamily: string;
|
|
autoSaveInterval: number; // 秒 1-30,真实生效
|
|
showLineNumbers: boolean; // 代码块行号,真实生效
|
|
wordWrap: boolean; // 自动换行,真实生效
|
|
confirmDelete: boolean; // 删除前确认,真实生效
|
|
}
|
|
|
|
const DEFAULTS: Settings = {
|
|
fontSize: 14,
|
|
fontFamily: 'Consolas, monospace',
|
|
autoSaveInterval: 1,
|
|
showLineNumbers: false,
|
|
wordWrap: true,
|
|
confirmDelete: true,
|
|
};
|
|
|
|
const KEY = 'dsh-settings';
|
|
|
|
function load(): Settings {
|
|
try { const raw = localStorage.getItem(KEY); if (raw) return { ...DEFAULTS, ...JSON.parse(raw) }; } catch {}
|
|
return DEFAULTS;
|
|
}
|
|
|
|
interface SettingsState extends Settings {
|
|
set: <K extends keyof Settings>(key: K, value: Settings[K]) => void;
|
|
persist: () => void;
|
|
}
|
|
|
|
export const useSettings = create<SettingsState>((set, get) => ({
|
|
...load(),
|
|
set: (key, value) => { set({ [key]: value } as any); get().persist(); },
|
|
persist: () => { try { localStorage.setItem(KEY, JSON.stringify({ fontSize: get().fontSize, fontFamily: get().fontFamily, autoSaveInterval: get().autoSaveInterval, showLineNumbers: get().showLineNumbers, wordWrap: get().wordWrap, confirmDelete: get().confirmDelete })); } catch {} },
|
|
}));
|