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: "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)}
{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 ;
}