71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
import type { LoaderArgs } from "@remix-run/node";
|
|
import { json } from "@remix-run/node";
|
|
import { Form, Link, NavLink, Outlet, useLoaderData } from "@remix-run/react";
|
|
|
|
import { getNoteListItems } from "~/models/note.server";
|
|
import { requireUserId } from "~/session.server";
|
|
import { useUser } from "~/utils";
|
|
|
|
export const loader = async ({ request }: LoaderArgs) => {
|
|
const userId = await requireUserId(request);
|
|
const noteListItems = await getNoteListItems({ userId });
|
|
return json({ noteListItems });
|
|
};
|
|
|
|
export default function NotesPage() {
|
|
const data = useLoaderData<typeof loader>();
|
|
const user = useUser();
|
|
|
|
return (
|
|
<div className="flex h-full min-h-screen flex-col">
|
|
<header className="flex items-center justify-between bg-slate-800 p-4 text-white">
|
|
<h1 className="text-3xl font-bold">
|
|
<Link to=".">Notes</Link>
|
|
</h1>
|
|
<p>{user.email}</p>
|
|
<Form action="/logout" method="post">
|
|
<button
|
|
type="submit"
|
|
className="rounded bg-slate-600 px-4 py-2 text-blue-100 hover:bg-blue-500 active:bg-blue-600"
|
|
>
|
|
Logout
|
|
</button>
|
|
</Form>
|
|
</header>
|
|
|
|
<main className="flex h-full bg-white">
|
|
<div className="h-full w-80 border-r bg-gray-50">
|
|
<Link to="new" className="block p-4 text-xl text-blue-500">
|
|
+ New Note
|
|
</Link>
|
|
|
|
<hr />
|
|
|
|
{data.noteListItems.length === 0 ? (
|
|
<p className="p-4">No notes yet</p>
|
|
) : (
|
|
<ol>
|
|
{data.noteListItems.map((note) => (
|
|
<li key={note.id}>
|
|
<NavLink
|
|
className={({ isActive }) =>
|
|
`block border-b p-4 text-xl ${isActive ? "bg-white" : ""}`
|
|
}
|
|
to={note.id}
|
|
>
|
|
📝 {note.title}
|
|
</NavLink>
|
|
</li>
|
|
))}
|
|
</ol>
|
|
)}
|
|
</div>
|
|
|
|
<div className="flex-1 p-6">
|
|
<Outlet />
|
|
</div>
|
|
</main>
|
|
</div>
|
|
);
|
|
}
|