import { ChangeEvent } from "react"; import { Link, useLoaderData, useNavigate, useSearchParams } from "@remix-run/react"; import { json, LoaderFunctionArgs, type MetaFunction } from "@remix-run/node"; import Pagination from "~/components/common/pagination"; import { clsn, siteTitle } from "~/utils"; import { getFirstImage, years } from "~/utils/note"; import { StarFill, ThumbUpFill } from "~/components/common/icons"; export const meta: MetaFunction = () => { return [ { title: siteTitle("日记") }, { name: "description", content: "奇趣保罗的日常笔记" }, ]; }; export async function loader({ request }: LoaderFunctionArgs) { const url = new URL(request.url); const year = url.searchParams.get("year") || new Date().getFullYear(); const page = url.searchParams.get("page") || 1; const note = await fetch(`https://paul.ren/api/note/?page=${page}&year=${year}`).then((res) => res.json()) as API.PageResponse; return json({ note, page, year }); } export default function Note() { const navigate = useNavigate(); const [params, setParams] = useSearchParams(); const { note, page, year } = useLoaderData(); const onChangeYear = (ev: ChangeEvent) => { navigate({ search: `?year=${ev.target.value}`, }); }; const onChangePage = (value: number) => { const year = params.get("year"); const nextParams: Record = { page: `${value}`, }; if (year !== null) { nextParams.year = year; } setParams(nextParams); }; return (

日记

{note.data.map((item) => { const year = item.date.substring(0, 4); const cover = getFirstImage(item); return ( {item.starred && ( )}

{item.title}

{item.except}

{item.date}

{item.likes}
{cover && (
)} ); })}
); }