import { isRouteErrorResponse, Links, Meta, Outlet, Scripts, ScrollRestoration, useLocation, } from "react-router"; import type { Route } from "./+types/root"; import "./app.css"; import { clerkMiddleware, rootAuthLoader, getAuth } from "@clerk/react-router/server"; import { Navbar } from "~/components/navbar"; import { NavigationProgress } from "~/components/NavigationProgress"; import { ClerkProvider } from "@clerk/react-router"; import { dark } from "@clerk/themes"; import { Toaster } from "~/components/ui/sonner"; import { BracktGradients } from "~/components/ui/BracktGradients"; import { Footer } from "~/components/marketing/Footer"; import { isUserAdminByClerkId } from "~/models/user"; import { AlertCircle, FileQuestion, Lock, ShieldOff, ServerCrash } from "lucide-react"; export const middleware: Route.MiddlewareFunction[] = [clerkMiddleware()]; export async function loader(args: Route.LoaderArgs) { 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 = () => [ { rel: "icon", href: "/favicon.ico?v=20260402", sizes: "48x48" }, { rel: "icon", href: "/favicon.svg?v=20260402", type: "image/svg+xml" }, { rel: "icon", href: "/favicon-96x96.png?v=20260402", type: "image/png", sizes: "96x96" }, { rel: "apple-touch-icon", href: "/apple-touch-icon.png?v=20260402" }, { rel: "manifest", href: "/site.webmanifest?v=20260402" }, { rel: "preconnect", href: "https://fonts.googleapis.com" }, { rel: "preconnect", href: "https://fonts.gstatic.com", crossOrigin: "anonymous", }, { rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap", }, ]; export function Layout({ children }: { children: React.ReactNode }) { return (
{message}
{stack}