Skip to content

Commit 71bfc9e

Browse files
committed
fix(ui): resolve setState in effect lint rule
1 parent 253e69f commit 71bfc9e

File tree

1 file changed

+12
-22
lines changed

1 file changed

+12
-22
lines changed

src/components/shared/DarkModeToggle.tsx

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,31 @@ const DarkModeToggle = () => {
99
const [isHovered, setIsHovered] = useState(false);
1010

1111
useEffect(() => {
12-
// Sync with localStorage and system preference on mount
1312
const theme = localStorage.getItem('theme');
1413
const prefersDark = window.matchMedia(
1514
'(prefers-color-scheme: dark)',
1615
).matches;
1716

18-
if (theme === 'dark') {
19-
document.documentElement.classList.add('dark');
20-
setIsDarkMode(true);
21-
} else if (theme === 'light') {
22-
document.documentElement.classList.remove('dark');
23-
setIsDarkMode(false);
24-
} else {
25-
// If no preference saved, respect system preference
26-
if (prefersDark) {
17+
setIsDarkMode(() => {
18+
const next = theme === 'dark' || (!theme && prefersDark);
19+
20+
if (next) {
2721
document.documentElement.classList.add('dark');
28-
setIsDarkMode(true);
2922
} else {
3023
document.documentElement.classList.remove('dark');
31-
setIsDarkMode(false);
3224
}
33-
}
3425

35-
// Listen for system theme changes (only if no manual preference is set)
26+
return next;
27+
});
28+
3629
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
3730
const handleThemeChange = (e: MediaQueryListEvent) => {
38-
// Only update if user hasn't set a manual preference
3931
if (!localStorage.getItem('theme')) {
40-
if (e.matches) {
41-
document.documentElement.classList.add('dark');
42-
setIsDarkMode(true);
43-
} else {
44-
document.documentElement.classList.remove('dark');
45-
setIsDarkMode(false);
46-
}
32+
setIsDarkMode(() => {
33+
const next = e.matches;
34+
document.documentElement.classList.toggle('dark', next);
35+
return next;
36+
});
4737
}
4838
};
4939

0 commit comments

Comments
 (0)