import type { User, Team } from "@prisma/client"; import { useEffect, useState } from "react"; import type { LinksFunction, LoaderFunction } from "remix"; import { useLoaderData, Form, redirect, useCatch } from "remix"; import { getUser } from "~/utils/session.server"; import Header from "../components/Header"; export const links: LinksFunction = () => { return []; }; type LoaderData = { user: (User & { team: Team & { members: User[] } }) | null; }; export const loader: LoaderFunction = async ({ request }) => { const user = await getUser(request); if (!user?.id) { return redirect("/login"); } const data: LoaderData = { user, }; return data; }; const themes = [ "light", "dark", "cupcake", "bumblebee", "emerald", "corporate", "synthwave", "retro", "cyberpunk", "valentine", ]; export default function ExpensesRoute() { const data = useLoaderData(); const [activeTab, setActiveTab] = useState<"preferences" | "manage">( "preferences" ); const [activeTheme, setActiveTheme] = useState(data.user?.theme || "dark"); useEffect(() => { document?.querySelector("html")?.setAttribute("data-theme", activeTheme); }, [activeTheme]); return ( <>

Account

Theme

{themes.map((theme) => (
))}
); } export function CatchBoundary() { const caught = useCatch(); if (caught.status === 401) { return redirect("/login"); } if (caught.status === 404) { return (
There are no expenses to display.
); } throw new Error(`Unexpected caught response with status: ${caught.status}`); } export function ErrorBoundary() { return
I did a whoopsies.
; }