import i18n from '@/i18n/i18n'; import { create } from 'zustand'; import { SystemSettings } from '@/types/settings'; import { EnvConfigType } from '@/services/environment'; import { initDayjs } from '@/utils/time'; export type FontPanelView = 'main-fonts' | 'custom-fonts'; interface SettingsState { settings: SystemSettings; settingsDialogBookKey: string; isSettingsDialogOpen: boolean; fontPanelView: FontPanelView; activeSettingsItemId: string | null; /** * Deep-link target — when set before opening the Settings dialog, the dialog * mounts with this panel pre-selected (instead of the lastConfigPanel from * localStorage). Cleared by the dialog after consumption. */ requestedPanel: string | null; /** * Optional sub-page hint paired with `requestedPanel`. When the requested * panel renders nested sub-pages (e.g. Integrations → KOSync / Readwise / * Hardcover / OPDS), this string tells the panel which one to drill into. * Cleared by the panel after consumption. Format is panel-specific — * Integrations recognises 'kosync' | 'readwise' | 'hardcover' | 'opds'. */ requestedSubPage: string | null; setSettings: (settings: SystemSettings) => void; saveSettings: (envConfig: EnvConfigType, settings: SystemSettings) => Promise; setSettingsDialogBookKey: (bookKey: string) => void; setSettingsDialogOpen: (open: boolean) => void; setFontPanelView: (view: FontPanelView) => void; setActiveSettingsItemId: (id: string | null) => void; setRequestedPanel: (panel: string | null) => void; setRequestedSubPage: (subPage: string | null) => void; applyUILanguage: (uiLanguage?: string) => void; } export const useSettingsStore = create((set) => ({ settings: {} as SystemSettings, settingsDialogBookKey: '', isSettingsDialogOpen: false, fontPanelView: 'main-fonts', activeSettingsItemId: null, requestedPanel: null, requestedSubPage: null, setSettings: (settings) => set({ settings }), saveSettings: async (envConfig: EnvConfigType, settings: SystemSettings) => { const appService = await envConfig.getAppService(); await appService.saveSettings(settings); }, setSettingsDialogBookKey: (bookKey) => set({ settingsDialogBookKey: bookKey }), setSettingsDialogOpen: (open) => set({ isSettingsDialogOpen: open }), setFontPanelView: (view) => set({ fontPanelView: view }), setActiveSettingsItemId: (id) => set({ activeSettingsItemId: id }), setRequestedPanel: (panel) => set({ requestedPanel: panel }), setRequestedSubPage: (subPage) => set({ requestedSubPage: subPage }), applyUILanguage: (uiLanguage?: string) => { const locale = uiLanguage ? uiLanguage : navigator.language; i18n.changeLanguage(locale); initDayjs(locale); }, }));