--- import type { CollectionEntry } from "astro:content"; import type { GetStaticPaths, Page } from "astro"; import { Icon } from "astro-icon/components"; import PostPreview from "@/components/blog/PostPreview.astro"; import Pagination from "@/components/Paginator.astro"; import { getAllExperience } from "@/data/experience"; import { getAllPosts, groupPostsByYear } from "@/data/post"; import PageLayout from "@/layouts/Base.astro"; import { collectionDateSort } from "@/utils/date"; import { breadcrumbList, collectionPageSchema } from "@/utils/seo"; export const getStaticPaths = (async ({ paginate }) => { const MAX_POSTS_PER_PAGE = 10; const MAX_PINNED_POSTS = 3; const allPosts = await getAllPosts(); const allPostsByDate = allPosts.sort(collectionDateSort); const experiences = await getAllExperience(); const pinnedPosts = allPostsByDate .values() .filter((p) => p.data.pinned) .take(MAX_PINNED_POSTS) .toArray(); return paginate(allPostsByDate, { pageSize: MAX_POSTS_PER_PAGE, props: { experiences, pinnedPosts }, }); }) satisfies GetStaticPaths; interface Props { page: Page>; experiences: CollectionEntry<"experience">[]; pinnedPosts: CollectionEntry<"writing">[]; } const { page, experiences, pinnedPosts } = Astro.props; const meta = { description: "Essays, notes and articles I've written", schema: [ breadcrumbList([ { name: "Home", path: "/" }, { name: "Writing", path: "/writing/" }, ]), collectionPageSchema({ name: "Writing", description: "Essays, notes and articles I've written", path: page.url.current, items: page.data.map((p) => ({ name: p.data.title, path: `/writing/${p.id}/` })), }), ], title: "Writing", }; const paginationProps = { ...(page.url.prev && { prevUrl: { text: "← Previous Page", url: page.url.prev, }, }), ...(page.url.next && { nextUrl: { text: "Next Page →", url: page.url.next, }, }), }; const groupedByYear = groupPostsByYear(page.data); const descYearKeys = Object.keys(groupedByYear).sort((a, b) => +b - +a); ---

Writing

RSS feed
{ pinnedPosts.length > 0 && (

Pinned

    {pinnedPosts.map((p) => (
  • ))}
) } { descYearKeys.map((yearKey) => (

Posts in {yearKey}

    {groupedByYear[yearKey]?.map((p) => (
  • ))}
)) }
{ !!experiences.length && ( ) }