import { defineStore } from 'pinia'; export interface PreferencesState { theme: string; language: string; timezone: string; date_format: string; time_format: string; week_start: string; default_module?: string; // preferred module handle like "dashboard" } const defaults: PreferencesState = { theme: 'light', language: 'en', timezone: 'UTC', date_format: 'Y-m-d', time_format: 'H:i', week_start: 'Monday', default_module: '' }; export const usePreferencesStore = defineStore('preferencesStore', { state: () => ({ preferences: { ...defaults } as PreferencesState, locks: [] as string[], // preference keys locked by tenant admin loading: false, error: null as string | null, }), getters: { /** * Check if a specific preference is locked by tenant admin */ isLocked: (state) => (key: string): boolean => { return state.locks.includes(key); }, /** * Get a single preference value */ getPreference: (state) => (key: K): PreferencesState[K] => { return state.preferences[key]; }, }, actions: { /** * Initialize preferences from server data (called on app bootstrap) */ init(prefs: Partial | undefined, locks?: string[]) { this.preferences = { ...defaults, ...(prefs ?? {}) }; this.locks = locks ?? []; }, /** * Set multiple preferences at once (local state only) */ setPreferences(prefs: Partial) { // Filter out locked preferences const unlocked: Partial = {}; for (const [key, value] of Object.entries(prefs)) { if (!this.locks.includes(key)) { (unlocked as Record)[key] = value; } } this.preferences = { ...this.preferences, ...unlocked }; }, /** * Set a single preference (local state only) */ setPreference(key: K, value: PreferencesState[K]) { if (this.locks.includes(key)) { console.warn(`Preference "${key}" is locked by administrator`); return false; } this.preferences[key] = value; return true; }, /** * Set default module preference */ setDefaultModule(handle: string) { if (this.locks.includes('default_module')) { console.warn('Default module preference is locked by administrator'); return false; } this.preferences.default_module = handle || ''; return true; }, /** * Update locks from server response */ setLocks(locks: string[]) { this.locks = locks ?? []; }, /** * Reset preferences to defaults (local state only) */ reset() { this.preferences = { ...defaults }; this.locks = []; this.error = null; }, /** * Set loading state */ setLoading(loading: boolean) { this.loading = loading; }, /** * Set error state */ setError(error: string | null) { this.error = error; }, }, });