diff --git a/src/shared/components/common/theme-toggle.tsx b/src/shared/components/common/theme-toggle.tsx new file mode 100644 index 0000000..e7a44fe --- /dev/null +++ b/src/shared/components/common/theme-toggle.tsx @@ -0,0 +1,100 @@ +"use client"; + +import { useTheme } from "next-themes"; +import { useEffect, useState } from "react"; +import { cn } from "@/shared/lib/utils"; + +export function ThemeToggle() { + const { resolvedTheme, setTheme } = useTheme(); + const [mounted, setMounted] = useState(false); + + useEffect(() => setMounted(true), []); + + if (!mounted) { + // Prevent hydration mismatch — render placeholder + return
; + } + + const isDark = resolvedTheme === "dark"; + + return ( + + ); +} diff --git a/src/shared/components/layout/header.tsx b/src/shared/components/layout/header.tsx index 732180d..9473164 100644 --- a/src/shared/components/layout/header.tsx +++ b/src/shared/components/layout/header.tsx @@ -1,9 +1,6 @@ "use client"; -import { useTheme } from "next-themes"; import { - Moon, - Sun, PanelLeft, User as UserIcon, LogOut, @@ -20,13 +17,13 @@ import { } from "@/shared/components/ui/dropdown-menu"; import { useAuth } from "@/core/auth"; import { signIn, signOut } from "next-auth/react"; +import { ThemeToggle } from "@/shared/components/common/theme-toggle"; interface HeaderProps { onToggleSidebar?: () => void; } export function Header({ onToggleSidebar }: HeaderProps) { - const { setTheme } = useTheme(); const { user, isAuthenticated } = useAuth(); return ( @@ -42,27 +39,8 @@ export function Header({ onToggleSidebar }: HeaderProps) { -