--- import {UNCATEGORIZED} from "@constants/constants"; interface Props { keyword: string; tags: string[]; categories: string[]; } const { keyword, tags, categories} = Astro.props; import Button from "./control/Button.astro"; import {getSortedPosts} from "../utils/content-utils"; import {getPostUrlBySlug} from "../utils/url-utils"; import {i18n} from "../i18n/translation"; import I18nKey from "../i18n/i18nKey"; 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 = function () { const groupedPosts = posts.reduce((grouped, 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: key, posts: groupedPosts[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 => ( ))}
)) }