fix: implement working theme selector with localStorage persistence
This commit is contained in:
1 parent
5afc5d754c
commit
6425c155ce
2 files changed
+31
-4
No files matched your search
@@ -10,7 +10,7 @@ export default function ClientLayout({
|
|||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem>
|
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem storageKey="theme">
|
||||||
<AuthProvider>
|
<AuthProvider>
|
||||||
{children}
|
{children}
|
||||||
<Toaster
|
<Toaster
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import React, { useState } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { useAuth } from '@/context/AuthContext';
|
import { useAuth } from '@/context/AuthContext';
|
||||||
import { useTheme } from 'next-themes';
|
import { useTheme } from 'next-themes';
|
||||||
|
|
||||||
@@ -12,6 +12,33 @@ export default function SettingsPage({ userEmail }: SettingsPageProps) {
|
|||||||
const { logout } = useAuth();
|
const { logout } = useAuth();
|
||||||
const { theme, setTheme } = useTheme();
|
const { theme, setTheme } = useTheme();
|
||||||
const [showConfirm, setShowConfirm] = useState(false);
|
const [showConfirm, setShowConfirm] = useState(false);
|
||||||
|
const [mounted, setMounted] = useState(false);
|
||||||
|
const [currentTheme, setCurrentTheme] = useState<string>('dark');
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setMounted(true);
|
||||||
|
// Get the current theme from localStorage or system preference
|
||||||
|
const stored = localStorage.getItem('theme');
|
||||||
|
if (stored) {
|
||||||
|
setCurrentTheme(stored);
|
||||||
|
} else if (theme) {
|
||||||
|
setCurrentTheme(theme);
|
||||||
|
}
|
||||||
|
}, [theme]);
|
||||||
|
|
||||||
|
const handleThemeChange = (newTheme: string) => {
|
||||||
|
setCurrentTheme(newTheme);
|
||||||
|
localStorage.setItem('theme', newTheme);
|
||||||
|
setTheme(newTheme);
|
||||||
|
|
||||||
|
// Update the HTML element immediately
|
||||||
|
const html = document.documentElement;
|
||||||
|
if (newTheme === 'dark' || (newTheme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
||||||
|
html.classList.add('dark');
|
||||||
|
} else {
|
||||||
|
html.classList.remove('dark');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-gradient-to-b from-slate-50 to-slate-100 dark:from-slate-900 dark:to-slate-800 p-4 pb-32 pt-8">
|
<div className="min-h-screen bg-gradient-to-b from-slate-50 to-slate-100 dark:from-slate-900 dark:to-slate-800 p-4 pb-32 pt-8">
|
||||||
@@ -54,9 +81,9 @@ export default function SettingsPage({ userEmail }: SettingsPageProps) {
|
|||||||
{['light', 'dark', 'system'].map(t => (
|
{['light', 'dark', 'system'].map(t => (
|
||||||
<button
|
<button
|
||||||
key={t}
|
key={t}
|
||||||
onClick={() => setTheme(t)}
|
onClick={() => handleThemeChange(t)}
|
||||||
className={`px-4 py-2 rounded-lg font-medium transition-colors capitalize ${
|
className={`px-4 py-2 rounded-lg font-medium transition-colors capitalize ${
|
||||||
theme === t
|
currentTheme === t
|
||||||
? 'bg-blue-600 text-white'
|
? 'bg-blue-600 text-white'
|
||||||
: 'bg-slate-100 dark:bg-slate-700 text-slate-900 dark:text-white hover:bg-slate-200 dark:hover:bg-slate-600'
|
: 'bg-slate-100 dark:bg-slate-700 text-slate-900 dark:text-white hover:bg-slate-200 dark:hover:bg-slate-600'
|
||||||
}`}
|
}`}
|
||||||
|
|||||||
Reference in new issue
Block a user