From 3969c06c36fe5f554204a0b24891473f8be456cf Mon Sep 17 00:00:00 2001 From: Stella Walker <301200801+interview35@users.noreply.github.com> Date: Mon, 31 Aug 2026 02:23:36 +0800 Subject: [PATCH] fix: persist preferences to localStorage --- frontend/src/pages/Settings/Preferences.tsx | 90 ++++++++++++++------- 1 file changed, 63 insertions(+), 27 deletions(-) diff --git a/frontend/src/pages/Settings/Preferences.tsx b/frontend/src/pages/Settings/Preferences.tsx index 6423301a..ab1c6ed6 100644 --- a/frontend/src/pages/Settings/Preferences.tsx +++ b/frontend/src/pages/Settings/Preferences.tsx @@ -5,18 +5,54 @@ import { Button } from '@/components/ui/button' import { CheckCircle2 } from 'lucide-react' import { useTheme } from '@/lib/hooks/use-theme' +const STORAGE_KEY = 'faros.preferences' + +interface PreferencesData { + density: 'comfortable' | 'compact' + tableRowSize: number + enableNotifications: boolean + autoSaveDrafts: boolean + showLineNumbers: boolean +} + +const defaultPreferences: PreferencesData = { + density: 'comfortable', + tableRowSize: 48, + enableNotifications: true, + autoSaveDrafts: true, + showLineNumbers: false, +} + +function loadPreferences(): PreferencesData { + try { + const stored = localStorage.getItem(STORAGE_KEY) + if (stored) { + const parsed = JSON.parse(stored) + return { ...defaultPreferences, ...parsed } + } + } catch { + // corrupted data — fall through to defaults + } + return { ...defaultPreferences } +} + export function Preferences() { const { theme, setTheme } = useTheme() - const [density, setDensity] = useState<'comfortable' | 'compact'>('comfortable') - const [tableRowSize, setTableRowSize] = useState(48) - const [enableNotifications, setEnableNotifications] = useState(true) - const [autoSaveDrafts, setAutoSaveDrafts] = useState(true) - const [showLineNumbers, setShowLineNumbers] = useState(false) + const [prefs, setPrefs] = useState(loadPreferences) const [showToast, setShowToast] = useState(false) + const updatePref = (key: K, value: PreferencesData[K]) => { + setPrefs((prev) => ({ ...prev, [key]: value })) + } + const handleSave = () => { - setShowToast(true) - setTimeout(() => setShowToast(false), 3000) + try { + localStorage.setItem(STORAGE_KEY, JSON.stringify(prefs)) + setShowToast(true) + setTimeout(() => setShowToast(false), 3000) + } catch { + // localStorage unavailable (private browsing, quota exceeded) + } } return ( @@ -25,7 +61,7 @@ export function Preferences() { {showToast && (
- Preferences saved locally (mock) + Preferences saved
)} @@ -56,8 +92,8 @@ export function Preferences() {
@@ -149,13 +185,13 @@ export function Preferences() { @@ -169,13 +205,13 @@ export function Preferences() {