explit/app/routes/expenses.tsx

57 lines
1.3 KiB
TypeScript
Raw Normal View History

2022-02-13 21:25:00 +01:00
import type { User, Team } from "@prisma/client";
import type { LinksFunction, LoaderFunction } from "remix";
2022-02-13 21:25:00 +01:00
import { Outlet, useLoaderData, Form, redirect, useCatch } from "remix";
import { getUser } from "~/utils/session.server";
2022-02-13 21:25:00 +01:00
import Header from "../components/Header";
export const links: LinksFunction = () => {
return [];
};
type LoaderData = {
2022-02-13 21:25:00 +01:00
user: (User & { team: Team & { members: User[] } }) | null;
};
export const loader: LoaderFunction = async ({ request }) => {
const user = await getUser(request);
2022-02-13 21:25:00 +01:00
if (!user?.id) {
return redirect("/login");
}
const data: LoaderData = {
user,
};
return data;
};
export default function ExpensesRoute() {
const data = useLoaderData<LoaderData>();
return (
2022-02-13 21:25:00 +01:00
<>
<Header user={data.user} route="/expenses" />
2022-02-22 01:06:31 +01:00
<main className="container mx-auto px-2">
2022-02-13 21:25:00 +01:00
<Outlet />
</main>
2022-02-13 21:25:00 +01:00
</>
);
}
2022-02-13 21:25:00 +01:00
export function CatchBoundary() {
const caught = useCatch();
if (caught.status === 401) {
return redirect("/login");
}
if (caught.status === 404) {
return (
<div className="error-container">There are no expenses to display.</div>
);
}
throw new Error(`Unexpected caught response with status: ${caught.status}`);
}
export function ErrorBoundary() {
return <div className="error-container">I did a whoopsies.</div>;
}