import { useEffect } from "react"; import type { ReactNode } from "react"; import { LinksFunction, LoaderFunction, MetaFunction, useLoaderData, } from "remix"; import type { User, Team } from "@prisma/client"; import { Links, LiveReload, Outlet, useCatch, Meta, Scripts, ScrollRestoration, useLocation, useMatches, } from "remix"; import { getUser } from "./utils/session.server"; import styles from "./tailwind.css"; import headerStyles from "./styles/header.css"; export const links: LinksFunction = () => { return [ { rel: "stylesheet", href: styles }, { rel: "stylesheet", href: headerStyles }, ]; }; export const meta: MetaFunction = () => { const description = `Track and split shared expenses with friends and family.`; return { description, keywords: "Explit,expenses,split,flatmate,friends,family,payments,debts,money", "twitter:creator": "@rawmaterial_it", "twitter:site": "@rawmaterial_it", "twitter:title": "Explit", "twitter:description": description, }; }; type LoaderData = { user: (User & { team: Team & { members: User[] } }) | null; }; export const loader: LoaderFunction = async ({ request }) => { const user = await getUser(request); const data: LoaderData = { user, }; return data; }; let isMount = true; function Document({ children, title = `Explit`, }: { children: ReactNode; title?: string; }) { const data = useLoaderData(); let location = useLocation(); let matches = useMatches(); useEffect(() => { let mounted = isMount; isMount = false; if ("serviceWorker" in navigator) { if (navigator.serviceWorker.controller) { navigator.serviceWorker.controller?.postMessage({ type: "REMIX_NAVIGATION", isMount: mounted, location, matches, manifest: window.__remixManifest, }); } else { let listener = async () => { await navigator.serviceWorker.ready; navigator.serviceWorker.controller?.postMessage({ type: "REMIX_NAVIGATION", isMount: mounted, location, matches, manifest: window.__remixManifest, }); }; navigator.serviceWorker.addEventListener("controllerchange", listener); return () => { navigator.serviceWorker.removeEventListener( "controllerchange", listener ); }; } } }, [location]); return ( {title} {children} {process.env.NODE_ENV === "development" ? : null} ); } export default function App() { return ( ); } export function CatchBoundary() { const caught = useCatch(); return (

{caught.status} {caught.statusText}

); } export function ErrorBoundary({ error }: { error: Error }) { console.error(error); return (

App Error

{error.message}
); }