From 322c84b389c075e432639174822d1ff39f9e1db1 Mon Sep 17 00:00:00 2001 From: Francisco Pessano Date: Thu, 4 Sep 2025 16:35:58 -0300 Subject: [PATCH] feat: integrate Radix UI dropdown menu components into UserMenu for improved functionality --- apps/web/package.json | 1 + .../src/components/ui/radix-dropdown-menu.tsx | 255 ++++++++++++++++++ apps/web/src/components/user-menu.tsx | 13 +- pnpm-lock.yaml | 3 + 4 files changed, 261 insertions(+), 11 deletions(-) create mode 100644 apps/web/src/components/ui/radix-dropdown-menu.tsx diff --git a/apps/web/package.json b/apps/web/package.json index 0ea2293..352207c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -17,6 +17,7 @@ "dependencies": { "@base-ui-components/react": "1.0.0-beta.3", "@hookform/resolvers": "^5.1.1", + "@radix-ui/react-dropdown-menu": "^2.1.16", "@tailwindcss/vite": "^4.0.15", "@tanstack/react-form": "^1.12.3", "@tanstack/react-query": "^5.85.5", diff --git a/apps/web/src/components/ui/radix-dropdown-menu.tsx b/apps/web/src/components/ui/radix-dropdown-menu.tsx new file mode 100644 index 0000000..0d6741b --- /dev/null +++ b/apps/web/src/components/ui/radix-dropdown-menu.tsx @@ -0,0 +1,255 @@ +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function DropdownMenu({ + ...props +}: React.ComponentProps) { + return +} + +function DropdownMenuPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuContent({ + className, + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function DropdownMenuGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuItem({ + className, + inset, + variant = "default", + ...props +}: React.ComponentProps & { + inset?: boolean + variant?: "default" | "destructive" +}) { + return ( + + ) +} + +function DropdownMenuCheckboxItem({ + className, + children, + checked, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function DropdownMenuRadioGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuRadioItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function DropdownMenuLabel({ + className, + inset, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + ) +} + +function DropdownMenuSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuShortcut({ + className, + ...props +}: React.ComponentProps<"span">) { + return ( + + ) +} + +function DropdownMenuSub({ + ...props +}: React.ComponentProps) { + return +} + +function DropdownMenuSubTrigger({ + className, + inset, + children, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + {children} + + + ) +} + +function DropdownMenuSubContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + DropdownMenu, + DropdownMenuPortal, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuLabel, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubTrigger, + DropdownMenuSubContent, +} diff --git a/apps/web/src/components/user-menu.tsx b/apps/web/src/components/user-menu.tsx index 506a3a8..29c2d70 100644 --- a/apps/web/src/components/user-menu.tsx +++ b/apps/web/src/components/user-menu.tsx @@ -5,9 +5,8 @@ import { DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, - DropdownMenuSeparator, DropdownMenuTrigger, -} from "@/components/ui/base-dropdown-menu"; +} from "@/components/ui/radix-dropdown-menu"; import { authClient } from "@/lib/auth-client"; import { Button } from "./ui/button"; import { Skeleton } from "./ui/skeleton"; @@ -34,16 +33,8 @@ export default function UserMenu() { - + My Account - - {session.email} - - Verify Email - - - Password - { await authClient.signOut(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7bf859b..8046c08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,6 +78,9 @@ importers: '@hookform/resolvers': specifier: ^5.1.1 version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.16 + version: 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tailwindcss/vite': specifier: ^4.0.15 version: 4.1.12(vite@6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))