From c162258c99752fd0680d0741daab8d3a76eea844 Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Mon, 13 Oct 2025 09:44:59 -0700 Subject: [PATCH] feat: add admin navigation link for authenticated admin users --- app/components/navbar.tsx | 22 +++++++++++++++++++++- app/root.tsx | 16 +++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/app/components/navbar.tsx b/app/components/navbar.tsx index 39f25e6..1a53726 100644 --- a/app/components/navbar.tsx +++ b/app/components/navbar.tsx @@ -17,7 +17,11 @@ import { import { SignedIn, SignedOut, SignInButton, UserButton } from "@clerk/react-router"; import { MenuIcon } from "lucide-react"; -export function Navbar() { +interface NavbarProps { + isAdmin: boolean; +} + +export function Navbar({ isAdmin }: NavbarProps) { const [open, setOpen] = useState(false); return ( @@ -41,6 +45,13 @@ export function Navbar() { How To Play + {isAdmin && ( + + + Admin + + + )} @@ -99,6 +110,15 @@ export function Navbar() { > How To Play + {isAdmin && ( + setOpen(false)} + > + Admin + + )} diff --git a/app/root.tsx b/app/root.tsx index 5ad269c..9b462aa 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -9,15 +9,25 @@ import { import type { Route } from "./+types/root"; import "./app.css"; -import { clerkMiddleware, rootAuthLoader } from "@clerk/react-router/server"; +import { clerkMiddleware, rootAuthLoader, getAuth } from "@clerk/react-router/server"; import { Navbar } from "~/components/navbar"; import { ClerkProvider } from "@clerk/react-router"; import { Toaster } from "~/components/ui/sonner"; +import { isUserAdminByClerkId } from "~/models/user"; export const middleware: Route.MiddlewareFunction[] = [clerkMiddleware()]; export async function loader(args: Route.LoaderArgs) { - return rootAuthLoader(args); + return rootAuthLoader(args, async () => { + const { userId } = await getAuth(args); + + let isAdmin = false; + if (userId) { + isAdmin = await isUserAdminByClerkId(userId); + } + + return { isAdmin }; + }); } export const links: Route.LinksFunction = () => [ @@ -54,7 +64,7 @@ export function Layout({ children }: { children: React.ReactNode }) { export default function App({ loaderData }: Route.ComponentProps) { return ( - +