From 43d010f7e4724966c8d7215cd4e19541bff6382b Mon Sep 17 00:00:00 2001 From: gib Date: Tue, 13 Jan 2026 11:25:56 -0600 Subject: [PATCH] Header has working auth stuff. Good place to let ai takeover maybe --- .../layout/header/controls/AvatarDropdown.tsx | 75 +++++++++++++++++++ .../layout/header/controls/index.tsx | 21 ++++++ .../src/components/layout/header/index.tsx | 5 +- apps/next/src/middleware.ts | 2 +- 4 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 apps/next/src/components/layout/header/controls/AvatarDropdown.tsx create mode 100644 apps/next/src/components/layout/header/controls/index.tsx diff --git a/apps/next/src/components/layout/header/controls/AvatarDropdown.tsx b/apps/next/src/components/layout/header/controls/AvatarDropdown.tsx new file mode 100644 index 0000000..3aaf7ab --- /dev/null +++ b/apps/next/src/components/layout/header/controls/AvatarDropdown.tsx @@ -0,0 +1,75 @@ +'use client'; +import Link from 'next/link'; +import { useRouter } from 'next/navigation'; +import { + BasedAvatar, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@gib/ui'; +import { useConvexAuth, useQuery } from 'convex/react'; +import { useAuthActions } from '@convex-dev/auth/react'; +import { api } from '@gib/backend/convex/_generated/api.js'; + +export const AvatarDropdown = () => { + const router = useRouter(); + const { isLoading, isAuthenticated } = useConvexAuth(); + const { signOut } = useAuthActions(); + const user = useQuery(api.auth.getUser, {}); + const currentImageUrl = useQuery( + api.files.getImageUrl, + user?.image ? { storageId: user.image } : 'skip', + ); + + if (isLoading) + return ; + if (!isAuthenticated) return
; + + return ( + + + + + + {(user?.name ?? user?.email) && ( + <> + + {user.name?.trim() ?? user.email?.trim()} + + + + )} + + + Edit Profile + + + + + + + + + ); +}; diff --git a/apps/next/src/components/layout/header/controls/index.tsx b/apps/next/src/components/layout/header/controls/index.tsx new file mode 100644 index 0000000..be08a22 --- /dev/null +++ b/apps/next/src/components/layout/header/controls/index.tsx @@ -0,0 +1,21 @@ +'use client'; +import type { ThemeToggleProps } from '@gib/ui'; +import { ThemeToggle } from '@gib/ui'; +import { AvatarDropdown } from './AvatarDropdown'; + +export const Controls = (themeToggleProps?: ThemeToggleProps) => { + return ( +
+ + +
+ ); +}; diff --git a/apps/next/src/components/layout/header/index.tsx b/apps/next/src/components/layout/header/index.tsx index 0c69ad6..c020afc 100644 --- a/apps/next/src/components/layout/header/index.tsx +++ b/apps/next/src/components/layout/header/index.tsx @@ -2,9 +2,8 @@ import Image from 'next/image'; import Link from 'next/link'; -import { cn } from '@gib/ui'; import type { ComponentProps } from 'react'; -//import { Controls } from './controls'; +import { Controls } from './controls'; export default function Header(headerProps: ComponentProps<'header'>) { return ( @@ -40,7 +39,7 @@ export default function Header(headerProps: ComponentProps<'header'>) {
- +
diff --git a/apps/next/src/middleware.ts b/apps/next/src/middleware.ts index cef1b72..773aa68 100644 --- a/apps/next/src/middleware.ts +++ b/apps/next/src/middleware.ts @@ -29,6 +29,6 @@ export const config = { '/((?!_next/static|_next/image|favicon.ico|monitoring-tunnel|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)', '/((?!.*\\..*|_next).*)', '/', - '/(api|trpc)(.*)', + '/(api)(.*)', ], };