Implement hybrid preferences system - use database for authenticated users, localStorage for non-authenticated users

This commit is contained in:
Ryderjj89
2025-09-13 18:07:20 -04:00
parent a616cb08c7
commit d8e0544d4d

View File

@@ -82,7 +82,7 @@ function App() {
const [user, setUser] = useState<any>(null); const [user, setUser] = useState<any>(null);
const [authAvailable, setAuthAvailable] = useState(false); const [authAvailable, setAuthAvailable] = useState(false);
const [darkMode, setDarkMode] = useState(() => { const [darkMode, setDarkMode] = useState(() => {
// Load dark mode preference from localStorage // Load dark mode preference from localStorage as fallback
const saved = localStorage.getItem('darkMode'); const saved = localStorage.getItem('darkMode');
return saved ? JSON.parse(saved) : false; return saved ? JSON.parse(saved) : false;
}); });
@@ -99,6 +99,46 @@ function App() {
checkAuthStatus(); checkAuthStatus();
}, []); }, []);
// Load user preferences from database
const loadUserPreferences = async () => {
if (!user) return;
try {
const response = await fetch('/api/preferences', {
credentials: 'include'
});
if (response.ok) {
const preferences = await response.json();
console.log('Loaded user preferences:', preferences);
setDarkMode(preferences.dark_mode);
}
} catch (error) {
console.error('Failed to load user preferences:', error);
}
};
// Save user preferences to database
const saveUserPreferences = async (newDarkMode: boolean) => {
if (!user) return;
try {
await fetch('/api/preferences', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
credentials: 'include',
body: JSON.stringify({
dark_mode: newDarkMode
})
});
console.log('Saved user preferences to database');
} catch (error) {
console.error('Failed to save user preferences:', error);
}
};
const checkAuthStatus = async () => { const checkAuthStatus = async () => {
try { try {
const response = await fetch('/auth/user', { const response = await fetch('/auth/user', {
@@ -109,6 +149,8 @@ function App() {
const userData = await response.json(); const userData = await response.json();
setUser(userData.user); setUser(userData.user);
setAuthAvailable(true); setAuthAvailable(true);
// Load user preferences after setting user
setTimeout(() => loadUserPreferences(), 100);
} else if (response.status === 501) { } else if (response.status === 501) {
// Authentication not configured // Authentication not configured
setAuthAvailable(false); setAuthAvailable(false);
@@ -144,15 +186,33 @@ function App() {
} }
}; };
// Handle dark mode toggle with hybrid storage
const handleDarkModeToggle = async () => {
const newDarkMode = !darkMode;
setDarkMode(newDarkMode);
if (user) {
// Save to database for authenticated users
await saveUserPreferences(newDarkMode);
} else {
// Save to localStorage for non-authenticated users
localStorage.setItem('darkMode', JSON.stringify(newDarkMode));
}
};
useEffect(() => { useEffect(() => {
// Apply dark mode and save preference // Apply dark mode
if (darkMode) { if (darkMode) {
document.documentElement.classList.add('dark'); document.documentElement.classList.add('dark');
} else { } else {
document.documentElement.classList.remove('dark'); document.documentElement.classList.remove('dark');
} }
localStorage.setItem('darkMode', JSON.stringify(darkMode));
}, [darkMode]); // Save to localStorage as backup (for non-authenticated users)
if (!user) {
localStorage.setItem('darkMode', JSON.stringify(darkMode));
}
}, [darkMode, user]);
// Helper function to format book names for display // Helper function to format book names for display
const formatBookName = (bookName: string): string => { const formatBookName = (bookName: string): string => {
@@ -322,7 +382,7 @@ function App() {
{/* Dark Mode Toggle */} {/* Dark Mode Toggle */}
<button <button
onClick={() => setDarkMode(!darkMode)} onClick={handleDarkModeToggle}
className="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors" className="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"
> >
{darkMode ? ( {darkMode ? (