| 1 | 'use client' |
| 2 | |
| 3 | import { useRouter } from '@bprogress/next/app' |
| 4 | import { |
| 5 | Laptop, |
| 6 | LogIn, |
| 7 | LogOut, |
| 8 | MessageSquare, |
| 9 | Moon, |
| 10 | Sun, |
| 11 | User as UserIcon, |
| 12 | UserPlus, |
| 13 | } from 'lucide-react' |
| 14 | import Link from 'next/link |
| 15 | import { useTheme } |
| 16 | import { Avatar, AvatarFallback |
| 17 | import { |
| 18 | DropdownMenu, |
| 19 | DropdownMenuContent, |
| 20 | DropdownMenuItem, |
| 21 | DropdownMenuLabel, |
| 22 | DropdownMenuSeparator, |
| 23 | DropdownMenuSub, |
| 24 | DropdownMenuSubContent, |
| 25 | DropdownMenuSubTrigger, |
| 26 | DropdownMenuTrigger, |
| 27 | } from '@/components/ui/dropdown-menu' |
| 28 | import { |
| 29 | SidebarMenu, |
| 30 | SidebarMenuButton, |
| 31 | SidebarMenuItem, |
| 32 | } from '@/components/ui/sidebar' |
| 33 | import { authClient } |
| 34 | |
| 35 | export function NavUser() |
| 36 | const session = |
| 37 | const router = |
| 38 | const { setTheme |
| 39 | const user = |
| 40 | |
| 41 | const themeMenu = |
| 42 | <DropdownMenuSub> |
| 43 | <DropdownMenuSubTrigger className=' |
| 44 | <Sun className=' |
| 45 | <Moon className=' |
| 46 | Theme |
| 47 | </DropdownMenuSubTrigger> |
| 48 | <DropdownMenuSubContent> |
| 49 | <DropdownMenuItem onClick={ |
| 50 | <Sun /> |
| 51 | Light |
| 52 | </DropdownMenuItem> |
| 53 | <DropdownMenuItem onClick={ |
| 54 | <Moon /> |
| 55 | Dark |
| 56 | </DropdownMenuItem> |
| 57 | <DropdownMenuItem onClick={ |
| 58 | <Laptop /> |
| 59 | System |
| 60 | </DropdownMenuItem> |
| 61 | </DropdownMenuSubContent> |
| 62 | </DropdownMenuSub> |
| 63 | ) |
| 64 | |
| 65 | return ( |
| 66 | <SidebarMenu className=' |
| 67 | <SidebarMenuItem> |
| 68 | <DropdownMenu> |
| 69 | <DropdownMenuTrigger asChild> |
| 70 | <SidebarMenuButton |
| 71 | className='data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground' |
| 72 | size='lg' |
| 73 | > |
| 74 | {user ? ( |
| 75 | <Avatar className=' |
| 76 | <AvatarImage alt={ |
| 77 | <AvatarFallback className=' |
| 78 | {user.name ? |
| 79 | </AvatarFallback> |
| 80 | </Avatar> |
| 81 | ) : ( |
| 82 | <div className='flex h-8 w-8 items-center justify-center rounded-lg border border-border/60 text-muted-foreground |
| 83 | <UserIcon className=' |
| 84 | </div> |
| 85 | )} |
| 86 | </SidebarMenuButton> |
| 87 | </DropdownMenuTrigger> |
| 88 | <DropdownMenuContent |
| 89 | align='end' |
| 90 | className='w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg' |
| 91 | side={'bottom'} |
| 92 | sideOffset={4} |
| 93 | > |
| 94 | {user ? ( |
| 95 | <> |
| 96 | <DropdownMenuLabel className=' |
| 97 | <div className='flex items-center gap-2 px-1 py-1.5 text-left text-sm |
| 98 | <Avatar className=' |
| 99 | <AvatarImage alt={ |
| 100 | <AvatarFallback className=' |
| 101 | {user.name ? |
| 102 | </AvatarFallback> |
| 103 | </Avatar> |
| 104 | <div className='grid flex-1 text-left text-sm leading-tight |
| 105 | <span className='truncate font-medium |
| 106 | <span className='truncate text-xs |
| 107 | </div> |
| 108 | </div> |
| 109 | </DropdownMenuLabel> |
| 110 | <DropdownMenuSeparator /> |
| 111 | {themeMenu} |
| 112 | <DropdownMenuItem asChild> |
| 113 | <a href='/api/featurebase/sso |
| 114 | <MessageSquare /> |
| 115 | Feedback |
| 116 | </a> |
| 117 | </DropdownMenuItem> |
| 118 | <DropdownMenuSeparator /> |
| 119 | <DropdownMenuItem |
| 120 | onClick={async () |
| 121 | await authClient.signOut |
| 122 | await router.replace |
| 123 | }} |
| 124 | > |
| 125 | <LogOut /> |
| 126 | Log out |
| 127 | </DropdownMenuItem> |
| 128 | </> |
| 129 | ) : ( |
| 130 | <> |
| 131 | {themeMenu} |
| 132 | <DropdownMenuSeparator /> |
| 133 | <DropdownMenuItem asChild> |
| 134 | <Link href=' |
| 135 | <LogIn /> |
| 136 | Sign in |
| 137 | </Link> |
| 138 | </DropdownMenuItem> |
| 139 | <DropdownMenuItem asChild> |
| 140 | <Link href=' |
| 141 | <UserPlus /> |
| 142 | Create account |
| 143 | </Link> |
| 144 | </DropdownMenuItem> |
| 145 | </> |
| 146 | )} |
| 147 | </DropdownMenuContent> |
| 148 | </DropdownMenu> |
| 149 | </SidebarMenuItem> |
| 150 | </SidebarMenu> |
| 151 | ) |
| 152 | } |