Skip to content

Commit 2219faf

Browse files
committed
fix(pro): fix hydration mismatch in theme toggle icon
Defer theme-dependent icon rendering until after mount to prevent server/client mismatch when localStorage theme differs from default.
1 parent 16c42f5 commit 2219faf

1 file changed

Lines changed: 5 additions & 1 deletion

File tree

apps/pro/src/components/layout/site-header.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use client';
22

3+
import { useState, useEffect } from 'react';
34
import Link from 'next/link';
45
import { useTheme } from '@tiny-design/react';
56
import styles from './site-header.module.scss';
@@ -32,6 +33,9 @@ const GitHubIcon = () => (
3233

3334
export function SiteHeader() {
3435
const { resolvedTheme, toggle } = useTheme();
36+
const [mounted, setMounted] = useState(false);
37+
38+
useEffect(() => setMounted(true), []);
3539

3640
return (
3741
<header className={styles.header}>
@@ -40,7 +44,7 @@ export function SiteHeader() {
4044
</Link>
4145
<div className={styles.actions}>
4246
<button className={styles.iconBtn} onClick={toggle} aria-label="Toggle theme">
43-
{resolvedTheme === 'dark' ? <SunIcon /> : <MoonIcon />}
47+
{mounted ? (resolvedTheme === 'dark' ? <SunIcon /> : <MoonIcon />) : <MoonIcon />}
4448
</button>
4549
<a
4650
className={styles.iconBtn}

0 commit comments

Comments
 (0)