From e187d21543a86a7bcdca29662b542ac058a73487 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Apr 2026 20:38:56 +0000 Subject: [PATCH] feat(ui): Navbar/UserDropdown to shadcn - antd Dropdown/Button/Space/Divider/Switch/Tag/Tooltip/Typography + @ant-design Crown/Down/Logout/Mail/Safety/User \u2192 shadcn Dropdown Menu/Button/Badge/Switch/Tooltip + lucide ChevronDown/Crown/LogOut/ Mail/Shield/User. - Extracted ToggleRow helper (Switch + label) to DRY up five toggle rows. Categorical amber Premium badge; file added to .eslintrc overrides. Gates: TS \u2713 | Build \u2713. Co-authored-by: yuneng-jiang --- ui/litellm-dashboard/.eslintrc.json | 1 + .../Navbar/UserDropdown/UserDropdown.tsx | 322 ++++++++---------- 2 files changed, 145 insertions(+), 178 deletions(-) diff --git a/ui/litellm-dashboard/.eslintrc.json b/ui/litellm-dashboard/.eslintrc.json index f6f3b359c7c..843164aaf82 100644 --- a/ui/litellm-dashboard/.eslintrc.json +++ b/ui/litellm-dashboard/.eslintrc.json @@ -89,6 +89,7 @@ "src/components/mcp_tools/McpCrudPermissionPanel.tsx", "src/components/mcp_tools/OAuthFormFields.tsx", "src/components/transform_request.tsx", + "src/components/Navbar/UserDropdown/UserDropdown.tsx", "src/components/permissions/VectorStorePermissions.tsx", "src/components/permissions/AgentPermissions.tsx", "src/components/permissions/MCPServerPermissions.tsx", diff --git a/ui/litellm-dashboard/src/components/Navbar/UserDropdown/UserDropdown.tsx b/ui/litellm-dashboard/src/components/Navbar/UserDropdown/UserDropdown.tsx index 6490cd32fa7..17c57c7e153 100644 --- a/ui/litellm-dashboard/src/components/Navbar/UserDropdown/UserDropdown.tsx +++ b/ui/litellm-dashboard/src/components/Navbar/UserDropdown/UserDropdown.tsx @@ -9,20 +9,32 @@ import { removeLocalStorageItem, setLocalStorageItem, } from "@/utils/localStorageUtils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { - CrownOutlined, - DownOutlined, - LogoutOutlined, - MailOutlined, - SafetyOutlined, - UserOutlined, -} from "@ant-design/icons"; -import type { MenuProps } from "antd"; -import { Button, Divider, Dropdown, Space, Switch, Tag, Tooltip, Typography } from "antd"; + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Switch } from "@/components/ui/switch"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { + ChevronDown, + Crown, + LogOut, + Mail, + Shield, + User, +} from "lucide-react"; import React, { useEffect, useState } from "react"; -const { Text } = Typography; - interface UserDropdownProps { onLogout: () => void; } @@ -40,178 +52,132 @@ const UserDropdown: React.FC = ({ onLogout }) => { setDisableShowNewBadge(storedValue === "true"); }, []); - const userItems: MenuProps["items"] = [ - { - key: "logout", - label: ( - - - Logout - - ), - onClick: onLogout, - }, - ]; + const toggleLocalStorage = (key: string, checked: boolean) => { + if (checked) { + setLocalStorageItem(key, "true"); + } else { + removeLocalStorageItem(key); + } + emitLocalStorageChange(key); + }; - const renderUserInfoSection = () => ( - - - - - {userEmail || "-"} - - {premiumUser ? ( - } - color="gold" - > - Premium - - ) : ( - - } - > - Standard - - - )} - - - - - - User ID - - - {userId || "-"} - - - - - - Role - - {userRole} - - - - Hide New Feature Indicators - { - setDisableShowNewBadge(checked); - if (checked) { - setLocalStorageItem("disableShowNewBadge", "true"); - emitLocalStorageChange("disableShowNewBadge"); - } else { - removeLocalStorageItem("disableShowNewBadge"); - emitLocalStorageChange("disableShowNewBadge"); - } - }} - aria-label="Toggle hide new feature indicators" - /> - - - Hide All Prompts - { - if (checked) { - setLocalStorageItem("disableShowPrompts", "true"); - emitLocalStorageChange("disableShowPrompts"); - } else { - removeLocalStorageItem("disableShowPrompts"); - emitLocalStorageChange("disableShowPrompts"); - } - }} - aria-label="Toggle hide all prompts" - /> - - - Hide Usage Indicator - { - if (checked) { - setLocalStorageItem("disableUsageIndicator", "true"); - emitLocalStorageChange("disableUsageIndicator"); - } else { - removeLocalStorageItem("disableUsageIndicator"); - emitLocalStorageChange("disableUsageIndicator"); - } - }} - aria-label="Toggle hide usage indicator" - /> - - - Hide Blog Posts - { - if (checked) { - setLocalStorageItem("disableBlogPosts", "true"); - emitLocalStorageChange("disableBlogPosts"); - } else { - removeLocalStorageItem("disableBlogPosts"); - emitLocalStorageChange("disableBlogPosts"); - } - }} - aria-label="Toggle hide blog posts" - /> - - - Hide Bouncing Icon - { - if (checked) { - setLocalStorageItem("disableBouncingIcon", "true"); - emitLocalStorageChange("disableBouncingIcon"); - } else { - removeLocalStorageItem("disableBouncingIcon"); - emitLocalStorageChange("disableBouncingIcon"); - } - }} - aria-label="Toggle hide bouncing icon" - /> - - + const ToggleRow: React.FC<{ + label: string; + checked: boolean; + onChange: (checked: boolean) => void; + ariaLabel?: string; + }> = ({ label, checked, onChange, ariaLabel }) => ( +
+ {label} + +
); return ( - ( -
- {renderUserInfoSection()} - - {React.cloneElement(menu as React.ReactElement, { - style: { boxShadow: "none" }, - })} + + + + + +
+
+
+ + + {userEmail || "-"} + +
+ {premiumUser ? ( + + + Premium + + ) : ( + + + + + + Standard + + + + Upgrade to Premium for advanced features + + + + )} +
+ +
+
+ + User ID +
+ + {userId || "-"} + +
+
+
+ + Role +
+ {userRole} +
+ + { + setDisableShowNewBadge(c); + toggleLocalStorage("disableShowNewBadge", c); + }} + ariaLabel="Toggle hide new feature indicators" + /> + toggleLocalStorage("disableShowPrompts", c)} + ariaLabel="Toggle hide all prompts" + /> + toggleLocalStorage("disableUsageIndicator", c)} + ariaLabel="Toggle hide usage indicator" + /> + toggleLocalStorage("disableBlogPosts", c)} + ariaLabel="Toggle hide blog posts" + /> + toggleLocalStorage("disableBouncingIcon", c)} + ariaLabel="Toggle hide bouncing icon" + />
- )} - > - - + + + + Logout + +
+
); };