{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "user-profile-dropdown", "type": "registry:component", "title": "User Profile Dropdown", "description": "A dropdown menu for user profile actions", "dependencies": [ "lucide-react" ], "registryDependencies": [ "dropdown-menu", "avatar", "badge", "select", "utils" ], "files": [ { "path": "registry/default/components/dropdown-menu/user-profile-dropdown.tsx", "content": "'use client'\r\n\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuTrigger,\r\n} from '@/registry/default/ui/dropdown-menu'\r\nimport { Avatar, AvatarFallback, AvatarImage } from '@/registry/default/ui/avatar'\r\nimport {\r\n BellRingIcon,\r\n BoltIcon,\r\n BookOpenIcon,\r\n ChevronsUpDownIcon,\r\n CircleArrowOutUpRightIcon,\r\n CircleFadingArrowUpIcon,\r\n CloudSunIcon,\r\n CreditCardIcon,\r\n GiftIcon,\r\n KeyboardIcon,\r\n LifeBuoyIcon,\r\n LogOutIcon,\r\n StarIcon,\r\n UserRoundIcon,\r\n} from 'lucide-react'\r\nimport { DropdownMenuGroup } from '@radix-ui/react-dropdown-menu'\r\nimport { Badge } from '@/registry/default/ui/badge'\r\nimport { Select, SelectContent, SelectItem } from '@/registry/default/ui/select'\r\nimport { SelectTrigger } from '@radix-ui/react-select'\r\nimport React from 'react'\r\nimport { cn } from '@/lib/utils'\r\n\r\ntype UserProfileDropdownProps = {\r\n align?: 'start' | 'end' | 'center'\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n size?: number\r\n}\r\n\r\ntype Item = {\r\n id: string\r\n subItems: {\r\n label: string\r\n shortcut: string\r\n icon: React.ReactNode\r\n url: string\r\n badge?: React.ReactNode\r\n external?: boolean\r\n }[]\r\n}\r\n\r\nconst items: Item[] = [\r\n {\r\n id: 'general',\r\n subItems: [\r\n {\r\n label: 'Profile',\r\n shortcut: 'P',\r\n icon: ,\r\n url: '#',\r\n },\r\n {\r\n label: 'Appearance',\r\n shortcut: 'A',\r\n icon: ,\r\n url: '#',\r\n },\r\n {\r\n label: 'Settings',\r\n shortcut: 'S',\r\n icon: ,\r\n url: '#',\r\n },\r\n {\r\n label: 'Billing',\r\n shortcut: 'B',\r\n icon: ,\r\n url: '#',\r\n },\r\n {\r\n label: 'Keyboard Shortcuts',\r\n shortcut: 'K',\r\n icon: ,\r\n url: '#',\r\n },\r\n {\r\n label: 'Notifications',\r\n shortcut: 'N',\r\n icon: ,\r\n url: '#',\r\n },\r\n ],\r\n },\r\n {\r\n id: 'premium',\r\n subItems: [\r\n {\r\n label: 'Upgrade to Premium',\r\n shortcut: 'U',\r\n icon: ,\r\n badge: (\r\n \r\n 15% off\r\n \r\n ),\r\n url: '#',\r\n },\r\n {\r\n label: 'Referral',\r\n shortcut: 'R',\r\n icon: ,\r\n url: '#',\r\n },\r\n ],\r\n },\r\n {\r\n id: 'help',\r\n subItems: [\r\n {\r\n label: 'Github',\r\n shortcut: 'G',\r\n icon: (\r\n \r\n \r\n \r\n ),\r\n url: '#',\r\n external: true,\r\n },\r\n {\r\n label: 'Documentation',\r\n shortcut: 'D',\r\n icon: ,\r\n url: '#',\r\n external: true,\r\n },\r\n {\r\n label: 'Support',\r\n shortcut: 'S',\r\n icon: ,\r\n url: '#',\r\n external: true,\r\n },\r\n ],\r\n },\r\n] as const\r\n\r\nconst dummyAccounts = [\r\n {\r\n id: '1',\r\n name: 'ShadCN',\r\n email: 'shad@example.com',\r\n imageUrl: 'https://github.com/shadcn.png',\r\n initials: 'CN',\r\n },\r\n\r\n {\r\n id: '2',\r\n name: 'Lee Robinson',\r\n email: 'lee@example.com',\r\n imageUrl: 'https://github.com/leerob.png',\r\n initials: 'LR',\r\n },\r\n {\r\n id: '3',\r\n name: 'Ali Farooq',\r\n email: 'ali@example.com',\r\n imageUrl: 'https://github.com/alifarooq9.png',\r\n initials: 'AF',\r\n },\r\n]\r\n\r\nexport default function UserProfileDropdown({\r\n align = 'start',\r\n side = 'bottom',\r\n size = 8,\r\n}: UserProfileDropdownProps) {\r\n const [open, setOpen] = React.useState(false)\r\n\r\n const [selectedAccount, setSelectedAccount] = React.useState(\r\n dummyAccounts[0].id\r\n )\r\n\r\n const handleSelect = (value: string) => {\r\n setSelectedAccount(value)\r\n }\r\n\r\n const selectedAccountData = dummyAccounts.find(\r\n (account) => account.id === selectedAccount\r\n )\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {selectedAccountData?.initials}\r\n \r\n \r\n\r\n Open user menu\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n {selectedAccountData?.initials}\r\n \r\n \r\n\r\n
\r\n

\r\n {selectedAccountData?.name}\r\n

\r\n

\r\n {selectedAccountData?.email}\r\n

\r\n
\r\n
\r\n \r\n {items.map((item, index) => (\r\n \r\n {item.subItems.map((subItem) => (\r\n \r\n \r\n {subItem.icon}\r\n {subItem.label}\r\n {subItem.badge ??\r\n (subItem.external ? (\r\n \r\n ) : (\r\n \r\n {subItem.shortcut}\r\n \r\n ))}\r\n \r\n \r\n ))}\r\n\r\n {index !== items.length - 1 && (\r\n \r\n )}\r\n \r\n ))}\r\n
\r\n\r\n \r\n \r\n e.preventDefault()}\r\n >\r\n \r\n \r\n Switch Account\r\n\r\n \r\n \r\n \r\n\r\n \r\n {dummyAccounts.map((acc) => (\r\n \r\n \r\n \r\n \r\n {acc.initials}\r\n \r\n \r\n\r\n
\r\n

\r\n {acc.name}\r\n

\r\n

\r\n {acc.email}\r\n

\r\n
\r\n \r\n ))}\r\n
\r\n \r\n\r\n \r\n \r\n Sign out\r\n \r\n
\r\n \r\n
\r\n )\r\n}\r\n", "type": "registry:component", "target": "components/user-profile-dropdown.tsx" } ] }