Spaces:
Runtime error
Runtime error
| "use client"; | |
| import { useSession, authClient } from "@/lib/auth-client"; | |
| import { useRouter } from "next/navigation"; | |
| import { | |
| DropdownMenu, | |
| DropdownMenuContent, | |
| DropdownMenuItem, | |
| DropdownMenuLabel, | |
| DropdownMenuSeparator, | |
| DropdownMenuTrigger, | |
| } from "@/components/ui/dropdown-menu"; | |
| import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; | |
| import { Button } from "@/components/ui/button"; | |
| import { LogOut, User, LayoutDashboard, Settings } from "lucide-react"; | |
| import Link from "next/link"; | |
| import { ModeToggle } from "@/components/mode-toggle"; | |
| export function UserNav() { | |
| const { data: session } = useSession(); | |
| const router = useRouter(); | |
| if (!session) return null; | |
| const handleSignOut = async () => { | |
| await authClient.signOut({ | |
| fetchOptions: { | |
| onSuccess: () => { | |
| router.push("/"); | |
| }, | |
| }, | |
| }); | |
| }; | |
| const user = session.user; | |
| const initials = user.name | |
| ?.split(" ") | |
| .map((n) => n[0]) | |
| .join("") | |
| .toUpperCase() || "U"; | |
| return ( | |
| <div className="flex items-center gap-3"> | |
| <ModeToggle /> | |
| <DropdownMenu> | |
| <DropdownMenuTrigger asChild> | |
| <Button variant="ghost" className="relative h-8 w-8 rounded-full hover:bg-transparent p-0"> | |
| <Avatar className="h-8 w-8 border-2 border-primary/50 transition-all hover:border-primary ring-2 ring-primary/10"> | |
| <AvatarImage src={user.image || ""} alt={user.name || "User"} /> | |
| <AvatarFallback className="bg-primary text-primary-foreground font-bold"> | |
| {initials} | |
| </AvatarFallback> | |
| </Avatar> | |
| </Button> | |
| </DropdownMenuTrigger> | |
| <DropdownMenuContent className="w-56 glass border-white/10" align="end" forceMount> | |
| <DropdownMenuLabel className="font-normal"> | |
| <div className="flex flex-col space-y-1"> | |
| <p className="text-sm font-medium leading-none">{user.name}</p> | |
| <p className="text-xs leading-none text-muted-foreground"> | |
| {user.email} | |
| </p> | |
| </div> | |
| </DropdownMenuLabel> | |
| <DropdownMenuSeparator className="bg-white/10" /> | |
| <DropdownMenuItem asChild className="focus:bg-white/10 cursor-pointer"> | |
| <Link href="/dashboard" className="flex w-full items-center"> | |
| <LayoutDashboard className="mr-2 h-4 w-4" /> | |
| <span>Dashboard</span> | |
| </Link> | |
| </DropdownMenuItem> | |
| <DropdownMenuItem asChild className="focus:bg-white/10 cursor-pointer"> | |
| <Link href="/dashboard/settings" className="flex w-full items-center"> | |
| <Settings className="mr-2 h-4 w-4" /> | |
| <span>Settings</span> | |
| </Link> | |
| </DropdownMenuItem> | |
| <DropdownMenuSeparator className="bg-white/10" /> | |
| <DropdownMenuItem | |
| onClick={handleSignOut} | |
| className="focus:bg-red-500/10 text-red-500 focus:text-red-500 cursor-pointer" | |
| > | |
| <LogOut className="mr-2 h-4 w-4" /> | |
| <span>Log out</span> | |
| </DropdownMenuItem> | |
| </DropdownMenuContent> | |
| </DropdownMenu> | |
| </div> | |
| ); | |
| } | |