--- import type { InferEntrySchema } from "astro:content"; import { compareDesc, formatISO } from "date-fns"; import { setCssColors } from "../colors"; import { imageAttrs } from "../pages/works/media"; import Translated from "./Translated.astro"; import WIPIndicator from "./WIPIndicator.astro"; const EXCLUDED_WORKS = ["calen7drier"]; interface Props { works: InferEntrySchema<"works">[]; } const isoDate = (date: Date) => formatISO(date, { representation: "date" }); const preferredDate = ({ started, finished, additionalMetadata, }: { started: Date | null; finished: Date | null; additionalMetadata?: { created?: Date | null | undefined }; }) => { if (started && !finished && !additionalMetadata?.created) { // Ongoing works return new Date(); } return finished ?? started ?? additionalMetadata?.created; }; function groupBy( items: T[], key: (item: T) => K, ): Record { return items.reduce( (acc, current) => { if (!acc[key(current)]) { acc[key(current)] = []; } acc[key(current)].push(current); return acc; }, {} as Record, ); } function findThumbnailBlock( content: InferEntrySchema<"works">["content"], sourcePath: string, ) { const sourcemap = Object.entries(content) .flatMap(([_, { blocks }]) => blocks) .find( (block) => block.type === "media" && block.relativeSource === sourcePath, ); if (!sourcemap) return Object.values(content) .flatMap(({ blocks }) => blocks) .find(({ type }) => type === "media"); return sourcemap; } --- { Object.entries( groupBy( Astro.props.works.filter( (w) => !w.metadata.private && !EXCLUDED_WORKS.includes(w.id) && findThumbnailBlock(w.content, w.metadata.thumbnail ?? ""), ), ({ metadata }) => preferredDate(metadata)?.getFullYear().toString() ?? "Unknown", ), ) .sort(([a], [b]) => b - a) .map(([year, works]) => ( <>

{year}

{works .sort(({ metadata: a }, { metadata: b }) => compareDesc( preferredDate(a) ?? new Date(), preferredDate(b) ?? new Date(), ), ) .map( ({ id, content, metadata: { wip, colors, started, finished, thumbnail, additionalMetadata, }, }) => { const tagline = additionalMetadata?.tagline; const date = preferredDate({ started, finished }); const thumb = findThumbnailBlock(content, thumbnail ?? "")!; const attrs = imageAttrs(thumb); return ( thumb && (
{ }

{wip && }

{tagline && ( {tagline} )}
) ); }, )}
)) }