add avatar menu in side bar

This commit is contained in:
KMKoushik
2025-05-07 23:05:46 +10:00
parent 065e0518fb
commit a47e524f4c
6 changed files with 253 additions and 12 deletions

View File

@@ -19,6 +19,13 @@ import {
BookOpenText,
ChartColumnBig,
ChartArea,
BellIcon,
CreditCardIcon,
LogOutIcon,
MoreVerticalIcon,
UserCircleIcon,
UsersIcon,
GaugeIcon,
} from "lucide-react";
import { signOut } from "next-auth/react";
@@ -41,6 +48,16 @@ import { useSession } from "next-auth/react";
import { isSelfHosted } from "~/utils/common";
import { usePathname } from "next/navigation";
import { Badge } from "@unsend/ui/src/badge";
import { Avatar, AvatarFallback, AvatarImage } from "@unsend/ui/src/avatar";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@unsend/ui/src/dropdown-menu";
// General items
const generalItems = [
@@ -211,12 +228,6 @@ export function AppSidebar() {
<SidebarFooter>
<SidebarGroupContent>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton onClick={() => signOut()} tooltip="Logout">
<LogOut />
<span>Logout</span>
</SidebarMenuButton>
</SidebarMenuItem>
<SidebarMenuItem>
<SidebarMenuButton asChild tooltip="Docs">
<Link href="https://docs.unsend.dev" target="_blank">
@@ -225,12 +236,116 @@ export function AppSidebar() {
</Link>
</SidebarMenuButton>
</SidebarMenuItem>
<SidebarMenuItem className="px-2">
<ThemeSwitcher />
</SidebarMenuItem>
</SidebarMenu>
</SidebarGroupContent>
<NavUser
user={{
name: session?.user.name || "",
email: session?.user.email || "",
avatar: session?.user.image || "",
}}
/>
</SidebarFooter>
</Sidebar>
);
}
export function NavUser({
user,
}: {
user: {
name?: string | null;
email?: string | null;
avatar?: string | null;
};
}) {
const { isMobile } = useSidebar();
return (
<SidebarMenu>
<SidebarMenuItem>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<SidebarMenuButton
size="lg"
className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground"
>
<Avatar className="h-8 w-8 rounded-lg">
{user.avatar ? (
<AvatarImage
src={user.avatar}
alt={user.name ?? user.email ?? ""}
/>
) : null}
<AvatarFallback className="rounded-lg capitalize">
{user.name?.charAt(0) ?? user.email?.charAt(0) ?? ""}
</AvatarFallback>
</Avatar>
<div className="grid flex-1 text-left text-sm leading-tight">
<span className="truncate font-medium">
{user.name ?? user.email ?? ""}
</span>
<span className="truncate text-xs text-muted-foreground">
{user.name ? user.email : ""}
</span>
</div>
<MoreVerticalIcon className="ml-auto size-4" />
</SidebarMenuButton>
</DropdownMenuTrigger>
<DropdownMenuContent
className="w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-xl"
side={isMobile ? "bottom" : "top"}
sideOffset={4}
>
<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">
{user.avatar ? (
<AvatarImage
src={user.avatar}
alt={user.name ?? user.email ?? ""}
/>
) : null}
<AvatarFallback className="rounded-lg capitalize">
{user.name?.charAt(0) ?? user.email?.charAt(0) ?? ""}
</AvatarFallback>
</Avatar>
<div className="grid flex-1 text-left text-sm leading-tight">
<span className="truncate font-medium">
{user.name ?? user.email ?? ""}
</span>
<span className="truncate text-xs text-muted-foreground">
{user.name ? user.email : ""}
</span>
</div>
</div>
</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem asChild>
<Link href="/settings/team">
<UsersIcon />
Team
</Link>
</DropdownMenuItem>
<DropdownMenuItem asChild>
<Link href="/settings">
<GaugeIcon />
Usage
</Link>
</DropdownMenuItem>
<div className="px-2 py-0.5">
<ThemeSwitcher />
</div>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuItem onClick={() => signOut()}>
<LogOutIcon />
Log out
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</SidebarMenuItem>
</SidebarMenu>
);
}

View File

@@ -7,7 +7,7 @@ export const ThemeSwitcher = () => {
return (
<div className="flex gap-2 items-center justify-between">
<p className="text-sm text-sidebar-foreground flex items-center gap-2">
<p className="text-sm text-popover-foreground flex items-center gap-2">
<SunMoonIcon className="h-4 w-4" />
Theme
</p>