User
User Dropdown
The <UserDropdown /> offers a simple and intuitive interface for users to logout and access the settings.
Installation
Copy and paste the following code into your project.
"use client"
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar"
import { authClient } from "@/lib/auth-client"
import { useRouter } from "next/navigation"
import { toast } from "sonner"
import { ReactNode } from "react"
interface UserDropdownProps {
children: ReactNode
}
export function UserDropdown({ children }: UserDropdownProps) {
const router = useRouter()
const { data: session } = authClient.useSession()
const user = session?.user
const handleSignOut = async () => {
toast.promise(
() =>
authClient.signOut({
fetchOptions: {
onSuccess: () => {
router.push("/login");
},
},
}),
{
loading: "Signing out...",
success: "Signed out successfully",
error: "Failed to sign out",
}
);
}
if (!user) return null
return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
{children}
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56" align="start">
<DropdownMenuLabel className="p-0 font-normal">
<div className="flex items-center gap-2 px-1 py-1.5 text-left text-sm">
<Avatar className="h-8 w-8 rounded-lg">
<AvatarImage src={user.avatar} alt={user.name} />
<AvatarFallback className="rounded-lg">CN</AvatarFallback>
</Avatar>
<div className="grid flex-1 text-left text-sm leading-tight">
<span className="truncate font-medium">{user.name}</span>
<span className="truncate text-xs">{user.email}</span>
</div>
</div>
</DropdownMenuLabel>
<DropdownMenuGroup>
<DropdownMenuItem>
Profile
</DropdownMenuItem>
<DropdownMenuItem>
Billing
</DropdownMenuItem>
<DropdownMenuItem>
Settings
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuItem>Support</DropdownMenuItem>
<DropdownMenuItem disabled>API</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem onClick={handleSignOut}>
Log out
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
)
}Usage
Here's how you can include the <UserDropdown /> in your project
<UserDropdown>
<Avatar className="h-8 w-8 rounded-lg cursor-pointer">
<AvatarImage src="/avatar.png" alt="John Doe" />
<AvatarFallback>JD</AvatarFallback>
</Avatar>
</UserDropdown>