|
|
@@ -7,6 +7,7 @@ import {
|
|
|
LogOut,
|
|
|
Sparkles,
|
|
|
} from 'lucide-react'
|
|
|
+import useDialogState from '@/hooks/use-dialog-state'
|
|
|
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
|
|
|
import {
|
|
|
DropdownMenu,
|
|
|
@@ -23,6 +24,7 @@ import {
|
|
|
SidebarMenuItem,
|
|
|
useSidebar,
|
|
|
} from '@/components/ui/sidebar'
|
|
|
+import { SignOutDialog } from '@/components/sign-out-dialog'
|
|
|
|
|
|
type NavUserProps = {
|
|
|
user: {
|
|
|
@@ -34,35 +36,18 @@ type NavUserProps = {
|
|
|
|
|
|
export function NavUser({ user }: NavUserProps) {
|
|
|
const { isMobile } = useSidebar()
|
|
|
+ const [open, setOpen] = useDialogState()
|
|
|
|
|
|
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'>
|
|
|
- <AvatarImage src={user.avatar} alt={user.name} />
|
|
|
- <AvatarFallback className='rounded-lg'>SN</AvatarFallback>
|
|
|
- </Avatar>
|
|
|
- <div className='grid flex-1 text-start text-sm leading-tight'>
|
|
|
- <span className='truncate font-semibold'>{user.name}</span>
|
|
|
- <span className='truncate text-xs'>{user.email}</span>
|
|
|
- </div>
|
|
|
- <ChevronsUpDown className='ms-auto size-4' />
|
|
|
- </SidebarMenuButton>
|
|
|
- </DropdownMenuTrigger>
|
|
|
- <DropdownMenuContent
|
|
|
- className='w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg'
|
|
|
- side={isMobile ? 'bottom' : 'right'}
|
|
|
- align='end'
|
|
|
- sideOffset={4}
|
|
|
- >
|
|
|
- <DropdownMenuLabel className='p-0 font-normal'>
|
|
|
- <div className='flex items-center gap-2 px-1 py-1.5 text-start text-sm'>
|
|
|
+ <>
|
|
|
+ <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'>
|
|
|
<AvatarImage src={user.avatar} alt={user.name} />
|
|
|
<AvatarFallback className='rounded-lg'>SN</AvatarFallback>
|
|
|
@@ -71,44 +56,66 @@ export function NavUser({ user }: NavUserProps) {
|
|
|
<span className='truncate font-semibold'>{user.name}</span>
|
|
|
<span className='truncate text-xs'>{user.email}</span>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </DropdownMenuLabel>
|
|
|
- <DropdownMenuSeparator />
|
|
|
- <DropdownMenuGroup>
|
|
|
- <DropdownMenuItem>
|
|
|
- <Sparkles />
|
|
|
- Upgrade to Pro
|
|
|
- </DropdownMenuItem>
|
|
|
- </DropdownMenuGroup>
|
|
|
- <DropdownMenuSeparator />
|
|
|
- <DropdownMenuGroup>
|
|
|
- <DropdownMenuItem asChild>
|
|
|
- <Link to='/settings/account'>
|
|
|
- <BadgeCheck />
|
|
|
- Account
|
|
|
- </Link>
|
|
|
- </DropdownMenuItem>
|
|
|
- <DropdownMenuItem asChild>
|
|
|
- <Link to='/settings'>
|
|
|
- <CreditCard />
|
|
|
- Billing
|
|
|
- </Link>
|
|
|
- </DropdownMenuItem>
|
|
|
- <DropdownMenuItem asChild>
|
|
|
- <Link to='/settings/notifications'>
|
|
|
- <Bell />
|
|
|
- Notifications
|
|
|
- </Link>
|
|
|
+ <ChevronsUpDown className='ms-auto size-4' />
|
|
|
+ </SidebarMenuButton>
|
|
|
+ </DropdownMenuTrigger>
|
|
|
+ <DropdownMenuContent
|
|
|
+ className='w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg'
|
|
|
+ side={isMobile ? 'bottom' : 'right'}
|
|
|
+ align='end'
|
|
|
+ sideOffset={4}
|
|
|
+ >
|
|
|
+ <DropdownMenuLabel className='p-0 font-normal'>
|
|
|
+ <div className='flex items-center gap-2 px-1 py-1.5 text-start text-sm'>
|
|
|
+ <Avatar className='h-8 w-8 rounded-lg'>
|
|
|
+ <AvatarImage src={user.avatar} alt={user.name} />
|
|
|
+ <AvatarFallback className='rounded-lg'>SN</AvatarFallback>
|
|
|
+ </Avatar>
|
|
|
+ <div className='grid flex-1 text-start text-sm leading-tight'>
|
|
|
+ <span className='truncate font-semibold'>{user.name}</span>
|
|
|
+ <span className='truncate text-xs'>{user.email}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </DropdownMenuLabel>
|
|
|
+ <DropdownMenuSeparator />
|
|
|
+ <DropdownMenuGroup>
|
|
|
+ <DropdownMenuItem>
|
|
|
+ <Sparkles />
|
|
|
+ Upgrade to Pro
|
|
|
+ </DropdownMenuItem>
|
|
|
+ </DropdownMenuGroup>
|
|
|
+ <DropdownMenuSeparator />
|
|
|
+ <DropdownMenuGroup>
|
|
|
+ <DropdownMenuItem asChild>
|
|
|
+ <Link to='/settings/account'>
|
|
|
+ <BadgeCheck />
|
|
|
+ Account
|
|
|
+ </Link>
|
|
|
+ </DropdownMenuItem>
|
|
|
+ <DropdownMenuItem asChild>
|
|
|
+ <Link to='/settings'>
|
|
|
+ <CreditCard />
|
|
|
+ Billing
|
|
|
+ </Link>
|
|
|
+ </DropdownMenuItem>
|
|
|
+ <DropdownMenuItem asChild>
|
|
|
+ <Link to='/settings/notifications'>
|
|
|
+ <Bell />
|
|
|
+ Notifications
|
|
|
+ </Link>
|
|
|
+ </DropdownMenuItem>
|
|
|
+ </DropdownMenuGroup>
|
|
|
+ <DropdownMenuSeparator />
|
|
|
+ <DropdownMenuItem onClick={() => setOpen(true)}>
|
|
|
+ <LogOut />
|
|
|
+ Sign out
|
|
|
</DropdownMenuItem>
|
|
|
- </DropdownMenuGroup>
|
|
|
- <DropdownMenuSeparator />
|
|
|
- <DropdownMenuItem>
|
|
|
- <LogOut />
|
|
|
- Log out
|
|
|
- </DropdownMenuItem>
|
|
|
- </DropdownMenuContent>
|
|
|
- </DropdownMenu>
|
|
|
- </SidebarMenuItem>
|
|
|
- </SidebarMenu>
|
|
|
+ </DropdownMenuContent>
|
|
|
+ </DropdownMenu>
|
|
|
+ </SidebarMenuItem>
|
|
|
+ </SidebarMenu>
|
|
|
+
|
|
|
+ <SignOutDialog open={!!open} onOpenChange={setOpen} />
|
|
|
+ </>
|
|
|
)
|
|
|
}
|