--- import { UNCATEGORIZED } from "@constants/constants"; import I18nKey from "../i18n/i18nKey"; import { i18n } from "../i18n/translation"; import { getSortedPosts } from "../utils/content-utils"; import { getPostUrlBySlug } from "../utils/url-utils"; interface Props { keyword?: string; tags?: string[]; categories?: string[]; } const { tags, categories } = Astro.props; let posts = await getSortedPosts(); if (Array.isArray(tags) && tags.length > 0) { posts = posts.filter( (post) => Array.isArray(post.data.tags) && post.data.tags.some((tag) => tags.includes(tag)), ); } if (Array.isArray(categories) && categories.length > 0) { posts = posts.filter( (post) => (post.data.category && categories.includes(post.data.category)) || (!post.data.category && categories.includes(UNCATEGORIZED)), ); } const groups: { year: number; posts: typeof posts }[] = (() => { const groupedPosts = posts.reduce( (grouped: { [year: number]: typeof posts }, post) => { const year = post.data.published.getFullYear(); if (!grouped[year]) { grouped[year] = []; } grouped[year].push(post); return grouped; }, {}, ); // convert the object to an array const groupedPostsArray = Object.keys(groupedPosts).map((key) => ({ year: Number.parseInt(key), posts: groupedPosts[Number.parseInt(key)], })); // sort years by latest first groupedPostsArray.sort((a, b) => b.year - a.year); return groupedPostsArray; })(); function formatDate(date: Date) { const month = (date.getMonth() + 1).toString().padStart(2, "0"); const day = date.getDate().toString().padStart(2, "0"); return `${month}-${day}`; } function formatTag(tag: string[]) { return tag.map((t) => `#${t}`).join(" "); } ---
{ groups.map(group => (
{group.year}
{group.posts.length} {i18n(I18nKey.postsCount)}
{group.posts.map(post => (
{formatDate(post.data.published)}
{post.data.title}
))}
)) }