import type { LoaderFunction, ActionFunction } from "remix"; import { redirect } from "remix"; import { json, useLoaderData, useCatch, Form } from "remix"; import invariant from "tiny-invariant"; import type { Note } from "~/models/note.server"; import { deleteNote } from "~/models/note.server"; import { getNote } from "~/models/note.server"; import { requireUserId } from "~/session.server"; type LoaderData = { note: Note; }; export const loader: LoaderFunction = async ({ request, params }) => { const userId = await requireUserId(request); invariant(params.noteId, "noteId not found"); const note = await getNote({ userId, id: params.noteId }); if (!note) { throw new Response("Not Found", { status: 404 }); } return json({ note }); }; export const action: ActionFunction = async ({ request, params }) => { const userId = await requireUserId(request); invariant(params.noteId, "noteId not found"); await deleteNote({ userId, id: params.noteId }); return redirect("/notes"); }; export default function NoteDetailsPage() { const data = useLoaderData() as LoaderData; return (

{data.note.title}

{data.note.body}


); } export function ErrorBoundary({ error }: { error: Error }) { console.error(error); return
An unexpected error occurred: {error.message}
; } export function CatchBoundary() { const caught = useCatch(); if (caught.status === 404) { return
Note not found
; } throw new Error(`Unexpected caught response with status: ${caught.status}`); }