nav-user.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { Link } from '@tanstack/react-router'
  2. import {
  3. BadgeCheck,
  4. Bell,
  5. ChevronsUpDown,
  6. CreditCard,
  7. LogOut,
  8. Sparkles,
  9. } from 'lucide-react'
  10. import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
  11. import {
  12. DropdownMenu,
  13. DropdownMenuContent,
  14. DropdownMenuGroup,
  15. DropdownMenuItem,
  16. DropdownMenuLabel,
  17. DropdownMenuSeparator,
  18. DropdownMenuTrigger,
  19. } from '@/components/ui/dropdown-menu'
  20. import {
  21. SidebarMenu,
  22. SidebarMenuButton,
  23. SidebarMenuItem,
  24. useSidebar,
  25. } from '@/components/ui/sidebar'
  26. type NavUserProps = {
  27. user: {
  28. name: string
  29. email: string
  30. avatar: string
  31. }
  32. }
  33. export function NavUser({ user }: NavUserProps) {
  34. const { isMobile } = useSidebar()
  35. return (
  36. <SidebarMenu>
  37. <SidebarMenuItem>
  38. <DropdownMenu>
  39. <DropdownMenuTrigger asChild>
  40. <SidebarMenuButton
  41. size='lg'
  42. className='data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground'
  43. >
  44. <Avatar className='h-8 w-8 rounded-lg'>
  45. <AvatarImage src={user.avatar} alt={user.name} />
  46. <AvatarFallback className='rounded-lg'>SN</AvatarFallback>
  47. </Avatar>
  48. <div className='grid flex-1 text-start text-sm leading-tight'>
  49. <span className='truncate font-semibold'>{user.name}</span>
  50. <span className='truncate text-xs'>{user.email}</span>
  51. </div>
  52. <ChevronsUpDown className='ms-auto size-4' />
  53. </SidebarMenuButton>
  54. </DropdownMenuTrigger>
  55. <DropdownMenuContent
  56. className='w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg'
  57. side={isMobile ? 'bottom' : 'right'}
  58. align='end'
  59. sideOffset={4}
  60. >
  61. <DropdownMenuLabel className='p-0 font-normal'>
  62. <div className='flex items-center gap-2 px-1 py-1.5 text-start text-sm'>
  63. <Avatar className='h-8 w-8 rounded-lg'>
  64. <AvatarImage src={user.avatar} alt={user.name} />
  65. <AvatarFallback className='rounded-lg'>SN</AvatarFallback>
  66. </Avatar>
  67. <div className='grid flex-1 text-start text-sm leading-tight'>
  68. <span className='truncate font-semibold'>{user.name}</span>
  69. <span className='truncate text-xs'>{user.email}</span>
  70. </div>
  71. </div>
  72. </DropdownMenuLabel>
  73. <DropdownMenuSeparator />
  74. <DropdownMenuGroup>
  75. <DropdownMenuItem>
  76. <Sparkles />
  77. Upgrade to Pro
  78. </DropdownMenuItem>
  79. </DropdownMenuGroup>
  80. <DropdownMenuSeparator />
  81. <DropdownMenuGroup>
  82. <DropdownMenuItem asChild>
  83. <Link to='/settings/account'>
  84. <BadgeCheck />
  85. Account
  86. </Link>
  87. </DropdownMenuItem>
  88. <DropdownMenuItem asChild>
  89. <Link to='/settings'>
  90. <CreditCard />
  91. Billing
  92. </Link>
  93. </DropdownMenuItem>
  94. <DropdownMenuItem asChild>
  95. <Link to='/settings/notifications'>
  96. <Bell />
  97. Notifications
  98. </Link>
  99. </DropdownMenuItem>
  100. </DropdownMenuGroup>
  101. <DropdownMenuSeparator />
  102. <DropdownMenuItem>
  103. <LogOut />
  104. Log out
  105. </DropdownMenuItem>
  106. </DropdownMenuContent>
  107. </DropdownMenu>
  108. </SidebarMenuItem>
  109. </SidebarMenu>
  110. )
  111. }