From 7ce8ae0867e464509c7fdace1723937a6546b18e Mon Sep 17 00:00:00 2001 From: shadcn Date: Fri, 16 Jun 2023 20:38:13 +0400 Subject: [PATCH] fix: dropdown menu --- app/layout.tsx | 4 +- components/header.tsx | 16 ++-- components/login-button.tsx | 20 ++--- components/sidebar-list.tsx | 2 - components/ui/dropdown-menu.tsx | 128 ++++++++++++++++++++++++++++++++ components/ui/icons.tsx | 20 ++++- components/ui/user-menu.tsx | 94 ----------------------- components/user-menu.tsx | 65 ++++++++++++++++ 8 files changed, 230 insertions(+), 119 deletions(-) create mode 100644 components/ui/dropdown-menu.tsx delete mode 100644 components/ui/user-menu.tsx create mode 100644 components/user-menu.tsx diff --git a/app/layout.tsx b/app/layout.tsx index 4305299..0b46bf8 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -43,10 +43,10 @@ export default function RootLayout({ children }: RootLayoutProps) { > -
+
{/* @ts-ignore */}
-
{children}
+
{children}
diff --git a/components/header.tsx b/components/header.tsx index a6e9acd..a8ff321 100644 --- a/components/header.tsx +++ b/components/header.tsx @@ -12,13 +12,13 @@ import { ClearHistory } from '@/components/clear-history' import { clearChats } from '@/app/actions' import Link from 'next/link' import { auth } from '@/auth' -import { UserMenu } from './ui/user-menu' +import { UserMenu } from './user-menu' import { LoginButton } from './login-button' export async function Header() { const session = await auth() return ( -
+
{session?.user ? ( @@ -33,12 +33,16 @@ export async function Header() { ) : ( - + )}
- - {session?.user ? : } + + {session?.user ? ( + + ) : ( + + )}
@@ -49,7 +53,7 @@ export async function Header() { className={cn(buttonVariants({ variant: 'outline' }))} > - GitHub + GitHub { setIsLoading(true) signIn('github') @@ -29,12 +25,8 @@ export function LoginButton({ className={cn(className)} {...props} > - {isLoading ? ( - - ) : ( - - )} - {text} + {isLoading && } + Login ) } diff --git a/components/sidebar-list.tsx b/components/sidebar-list.tsx index 4eb3f66..301e705 100644 --- a/components/sidebar-list.tsx +++ b/components/sidebar-list.tsx @@ -10,8 +10,6 @@ export interface SidebarListProps { export async function SidebarList({ userId }: SidebarListProps) { const chats = await getChats(userId) - console.log(chats) - return (
{chats?.length ? ( diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..184d4e6 --- /dev/null +++ b/components/ui/dropdown-menu.tsx @@ -0,0 +1,128 @@ +'use client' + +import * as React from 'react' +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' + +import { cn } from '@/lib/utils' + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = 'DropdownMenuShortcut' + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuRadioGroup +} diff --git a/components/ui/icons.tsx b/components/ui/icons.tsx index ce59585..52b941a 100644 --- a/components/ui/icons.tsx +++ b/components/ui/icons.tsx @@ -442,6 +442,23 @@ function IconUsers({ className, ...props }: React.ComponentProps<'svg'>) { ) } +function IconExternalLink({ + className, + ...props +}: React.ComponentProps<'svg'>) { + return ( + + + + ) +} + export { IconEdit, IconNextChat, @@ -467,5 +484,6 @@ export { IconDownload, IconClose, IconShare, - IconUsers + IconUsers, + IconExternalLink } diff --git a/components/ui/user-menu.tsx b/components/ui/user-menu.tsx deleted file mode 100644 index a556b2c..0000000 --- a/components/ui/user-menu.tsx +++ /dev/null @@ -1,94 +0,0 @@ -'use client' - -// import { type Session } from 'next-auth' -import * as DropdownMenu from '@radix-ui/react-dropdown-menu' -import { signOut } from 'next-auth/react' - -import Image from 'next/image' - -export interface UserMenuProps { - session: any // Session -} - -export function UserMenu({ session }: UserMenuProps) { - return ( - - ) -} - -UserMenu.displayName = 'UserMenu' diff --git a/components/user-menu.tsx b/components/user-menu.tsx new file mode 100644 index 0000000..c74378e --- /dev/null +++ b/components/user-menu.tsx @@ -0,0 +1,65 @@ +'use client' + +import Image from 'next/image' +import { type Session } from 'next-auth' +import { signOut } from 'next-auth/react' + +import { Button } from '@/components/ui/button' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger +} from '@/components/ui/dropdown-menu' +import { IconExternalLink } from '@/components/ui/icons' + +export interface UserMenuProps { + user: Session['user'] +} + +export function UserMenu({ user }: UserMenuProps) { + return ( +
+ + + + + + +
{user?.name}
+
{user?.email}
+
+ + + + Vercel Homepage + + + + signOut()} className="text-xs"> + Log Out + +
+
+
+ ) +}