Skip to content

Commit 8ea7c65

Browse files
committed
feat: resolve theme toggle hydration mismatch
1 parent 136de98 commit 8ea7c65

2 files changed

Lines changed: 13 additions & 5 deletions

File tree

packages/react/src/html/ui/components/ThemeToggle.jsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ const Toggle = () => {
1010
const [themePreference, setThemePreference] = useTheme();
1111

1212
return (
13-
<ThemeToggle onChange={setThemePreference} currentTheme={themePreference} />
13+
<ThemeToggle
14+
onChange={setThemePreference}
15+
currentTheme={themePreference}
16+
key={themePreference}
17+
/>
1418
);
1519
};
1620

packages/react/src/html/ui/hooks/useTheme.mjs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,14 @@ const applySystemTheme = () => applyTheme('system');
2929
* @returns {['system'|'light'|'dark', (next: 'system'|'light'|'dark') => void]}
3030
*/
3131
export const useTheme = () => {
32-
// Read stored preference once on mount; default to 'system'.
33-
const [pref, setPref] = useState(() =>
34-
server ? 'system' : (localStorage.getItem('theme') ?? 'system')
35-
);
32+
const [pref, setPref] = useState('system');
33+
34+
useEffect(() => {
35+
const stored = localStorage.getItem('theme');
36+
if (stored) {
37+
setPref(stored);
38+
}
39+
}, []);
3640

3741
// Apply theme on every preference change, and if 'system',
3842
// also listen for OS-level color scheme changes.

0 commit comments

Comments
 (0)