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 { 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 ( {children} ); } export default function App({ loaderData }: Route.ComponentProps) { const location = useLocation(); const isDraftRoute = location.pathname.includes('/draft'); return ( {!isDraftRoute && } {isDraftRoute ? ( ) : (
)}
); } export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { let status = 500; let title = "Something Went Wrong"; let message = "An unexpected error occurred. Please try again later."; let stack: string | undefined; let showSignInHint = false; if (isRouteErrorResponse(error)) { status = error.status; switch (error.status) { case 401: title = "Sign In Required"; message = "You need to be signed in to access this page."; showSignInHint = true; break; case 403: title = "Access Denied"; message = "You don't have permission to view this page."; break; case 404: title = "Page Not Found"; message = "The page you're looking for doesn't exist or has been moved."; break; default: title = `Error ${error.status}`; message = typeof error.data === "string" && error.data ? error.data : error.statusText || "Something went wrong."; } } else if (error instanceof Error) { title = "Unexpected Error"; message = import.meta.env.DEV ? error.message : "An unexpected error occurred. Please try again later."; stack = import.meta.env.DEV ? error.stack : undefined; } return (
{status}
{statusIcon(status)}

{title}

{message}

{stack && (
Stack trace (development only)
                {stack}
              
)}
); } function statusIcon(status: number) { const cls = "h-14 w-14 text-muted-foreground"; if (status === 401) return ; if (status === 403) return ; if (status === 404) return ; if (status >= 500) return ; return ; }