From aed648fed514b2412ff316b449ad20b77e0b57d5 Mon Sep 17 00:00:00 2001 From: wood chen Date: Sat, 22 Feb 2025 00:49:22 +0800 Subject: [PATCH] refactor: Remove AuthStateSync component and update layout --- src/app/()/page.tsx | 4 +- src/app/(auth)/layout.tsx | 2 - src/components/auth/auth-state-sync.tsx | 20 --- src/components/layout/header-client.tsx | 191 ++++++++++++++++++++++++ src/components/layout/header.tsx | 26 ++++ 5 files changed, 219 insertions(+), 24 deletions(-) delete mode 100644 src/components/auth/auth-state-sync.tsx create mode 100644 src/components/layout/header-client.tsx create mode 100644 src/components/layout/header.tsx diff --git a/src/app/()/page.tsx b/src/app/()/page.tsx index afc01bf..ac4bb3d 100644 --- a/src/app/()/page.tsx +++ b/src/app/()/page.tsx @@ -18,12 +18,12 @@ import { TypographyLead, TypographyMuted, } from "@/components/ui/typography"; -import { NavBar } from "@/components/layout/nav-bar"; +import { Header } from "@/components/layout/header"; export default function HomePage() { return (
- +
diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx index 7b7afd1..591fd82 100644 --- a/src/app/(auth)/layout.tsx +++ b/src/app/(auth)/layout.tsx @@ -1,7 +1,6 @@ import { redirect } from "next/navigation"; import { getCurrentUser } from "@/lib/session"; -import { AuthStateSync } from "@/components/auth/auth-state-sync"; export default async function AuthLayout({ children, @@ -17,7 +16,6 @@ export default async function AuthLayout({ return ( <> -
{children} diff --git a/src/components/auth/auth-state-sync.tsx b/src/components/auth/auth-state-sync.tsx deleted file mode 100644 index 04f7a54..0000000 --- a/src/components/auth/auth-state-sync.tsx +++ /dev/null @@ -1,20 +0,0 @@ -"use client"; - -import { useEffect } from "react"; -import { usePathname, useRouter } from "next/navigation"; -import { useSession } from "next-auth/react"; - -export function AuthStateSync() { - const { data: session, status, update } = useSession(); - const router = useRouter(); - const pathname = usePathname(); - - useEffect(() => { - // 当状态从"loading"变为"authenticated"时,强制刷新路由 - if (status === "authenticated" && session?.user) { - router.refresh(); - } - }, [status, session]); - - return null; -} diff --git a/src/components/layout/header-client.tsx b/src/components/layout/header-client.tsx new file mode 100644 index 0000000..a05ddab --- /dev/null +++ b/src/components/layout/header-client.tsx @@ -0,0 +1,191 @@ +"use client"; + +import { useEffect, useState } from "react"; +import Link from "next/link"; +import { usePathname, useRouter } from "next/navigation"; +import { ChevronDown, User } from "lucide-react"; +import { signOut } from "next-auth/react"; + +import { cn } from "@/lib/utils"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +import { ThemeToggle } from "../theme-toggle"; + +interface HeaderClientProps { + initialUser: any; +} + +export function HeaderClient({ initialUser }: HeaderClientProps) { + const [user, setUser] = useState(initialUser); + const router = useRouter(); + const pathname = usePathname(); + + const handleSignOut = async () => { + await signOut({ redirect: false }); + setUser(null); + router.refresh(); + router.push("/"); + }; + + const renderNavLinks = () => { + if (!user) return null; + + return ( +
+ + 控制台 + + + 应用管理 + + + 设置 + + {user.role === "ADMIN" && ( + <> +
+ + 管理后台 + + + + + + + + + 用户列表 + + + + + 应用管理 + + + + + 授权管理 + + + + + 系统日志 + + + + + + )} +
+ ); + }; + + return ( +
+ {renderNavLinks()} + + {user ? ( +
+ + + + {user.name?.charAt(0) || user.username?.charAt(0)} + + + +
+ ) : ( + + )} +
+ ); +} diff --git a/src/components/layout/header.tsx b/src/components/layout/header.tsx new file mode 100644 index 0000000..b9b9397 --- /dev/null +++ b/src/components/layout/header.tsx @@ -0,0 +1,26 @@ +import Link from "next/link"; + +import { getCurrentUser } from "@/lib/session"; +import { HeaderClient } from "@/components/layout/header-client"; + +export async function Header() { + const user = await getCurrentUser(); + + return ( +
+
+
+
+ +

+ Q58 Connect +

+ +
+ + +
+
+
+ ); +}