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 { ClerkProvider } from "@clerk/react-router"; import { dark } from "@clerk/themes"; import { Toaster } from "~/components/ui/sonner"; 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", sizes: "48x48" }, { rel: "icon", href: "/favicon.svg", type: "image/svg+xml" }, { rel: "icon", href: "/favicon-96x96.png", type: "image/png", sizes: "96x96" }, { rel: "apple-touch-icon", href: "/apple-touch-icon.png" }, { rel: "manifest", href: "/site.webmanifest" }, { 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=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap", }, ]; export function Layout({ children }: { children: React.ReactNode }) { return (
{message}
{stack}