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 (
-
+