import { cssBundleHref } from "@remix-run/css-bundle"; import type { LinksFunction, V2_MetaFunction } from "@remix-run/node"; import { isRouteErrorResponse, Links, LiveReload, Meta, Outlet, Scripts, ScrollRestoration, useRouteError } from "@remix-run/react"; import type { ReactNode } from "react"; import stylesheet from "~/tailwind.css"; export const links: LinksFunction = () => [ { rel: "stylesheet", href: stylesheet }, ...(cssBundleHref ? [{ rel: "stylesheet", href: cssBundleHref }] : []) ]; export const meta: V2_MetaFunction = () => [{ title: "Awesome Radio" }]; export type DocumentProps = { children: ReactNode; title?: string; } export function Document({ title, children }: DocumentProps) { return ( <html lang="en" className="h-full"> <head> <meta charSet="utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=1" /> {title ? <title>{title}</title> : null} <Meta /> <Links /> <script defer data-domain="awesome-radio-1ae3.fly.dev" src="https://plausible.io/js/script.tagged-events.js"></script> </head> <body className="h-full"> {children} <ScrollRestoration /> <Scripts /> <LiveReload /> </body> </html> ); } export default function App() { return ( <Document> <Outlet /> </Document> ); } export function ErrorBoundary() { const error = useRouteError(); console.error(error); if (isRouteErrorResponse(error)) { const title = `${error.status} - ${error.statusText}`; return ( <Document title={title}> <div className="container mx-auto p-4 prose w-full"> <h1>{title}</h1> </div> </Document> ); } if (error instanceof Error) { return ( <Document title="Uh-oh!"> <div className="container mx-auto p-4 prose w-full"> <h2>Yikes!</h2> <div className="alert alert-error shadow-lg"> <div> <svg xmlns="http://www.w3.org/2000/svg" className="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24"> <path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z" /> </svg> <span>{error.message}</span> </div> </div> <h2>Stack Trace</h2> <div className="mockup-code"> <pre data-prefix="!!!"><code>{error.stack}</code></pre> </div> </div> </Document> ); } return ( <Document title="Uh-oh!"> <div className="container mx-auto p-4 prose w-full"> <h1>Sorry, something went wrong...</h1> </div> </Document> ); }