Skip to content
Snippets Groups Projects
user-nav.tsx 2.16 KiB
Newer Older
Yusuf Akgül's avatar
Yusuf Akgül committed
"use client"

import { User } from "next-auth"
import { signOut } from "next-auth/react"

import {
    DropdownMenu,
    DropdownMenuContent,
    DropdownMenuItem,
    DropdownMenuSeparator,
    DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import { UserAvatar } from "@/components/user-avatar"
Yusuf Akgül's avatar
Yusuf Akgül committed
import { cn } from "@/lib/utils"
import { buttonVariants } from "./ui/button"
Yusuf Akgül's avatar
Yusuf Akgül committed

type UserUsername = string | null | undefined

interface UserAccountNavProps extends React.HTMLAttributes<HTMLDivElement> {
    user: Pick<User & { username: UserUsername }, "name" | "image" | "username">
}

Yusuf Akgül's avatar
Yusuf Akgül committed
export function UserAccountDropdown({ user }: UserAccountNavProps) {
Yusuf Akgül's avatar
Yusuf Akgül committed
    return (
        <DropdownMenu>
Yusuf Akgül's avatar
Yusuf Akgül committed
            <DropdownMenuTrigger>
Yusuf Akgül's avatar
Yusuf Akgül committed
                <div className={cn(buttonVariants({ variant: "ghost", size: "logo" }))}>
Yusuf Akgül's avatar
Yusuf Akgül committed
                    <UserAvatar
                        user={{ username: user.username ? user.username : "", image: user.image || null }}
                        className="h-8 w-8 shadow-none focus:shadow-none"
                    />
                </div>
Yusuf Akgül's avatar
Yusuf Akgül committed
            </DropdownMenuTrigger>
Yusuf Akgül's avatar
Yusuf Akgül committed
            <DropdownMenuContent align="end">
Yusuf Akgül's avatar
Yusuf Akgül committed
                <div className="flex items-center justify-start gap-2 p-2">
                    <div className="flex flex-col space-y-1 leading-none">
                        {user.name && <p className="font-medium">{user.name}</p>}
                        {user.username && (
                            <p className="w-[200px] truncate text-sm text-muted-foreground">
                                @{user.username}
                            </p>
                        )}
                    </div>
                </div>
                <DropdownMenuSeparator />
                <DropdownMenuItem
                    className="cursor-pointer"
                    onSelect={(event) => {
                        event.preventDefault()
                        signOut({
                            callbackUrl: `${window.location.origin}/login`,
                        })
                    }}
                >
                    Sign out
                </DropdownMenuItem>
            </DropdownMenuContent>
        </DropdownMenu>
    )
}