From f140fb53d3dae081d8047d1870761f1cdc92dd17 Mon Sep 17 00:00:00 2001 From: Thuan Bui <9248622+10h30@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:27:26 +0700 Subject: [PATCH] feat: add TypeScript interfaces for blog, category, destination, and tag pages --- src/pages/[...slug].astro | 8 ++++++-- src/pages/blog/[...page].astro | 13 ++++++++++++- src/pages/category/[...rest].astro | 13 ++++++++++++- src/pages/destination/[...rest].astro | 13 ++++++++++++- src/pages/tag/[tag]/[...page].astro | 13 ++++++++++++- 5 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/pages/[...slug].astro b/src/pages/[...slug].astro index 4a38141..0957672 100644 --- a/src/pages/[...slug].astro +++ b/src/pages/[...slug].astro @@ -7,7 +7,11 @@ import Destinations from "@/components/ui/Destinations.astro"; import { toR2Url } from "@/utils/r2"; import Picture from "@/components/ui/Picture.astro"; -import { getCollection, render } from "astro:content"; +import { getCollection, render, type CollectionEntry } from "astro:content"; + +interface Props { + post: CollectionEntry<"blog">; +} export async function getStaticPaths() { const blog = await getCollection("blog"); @@ -17,7 +21,7 @@ export async function getStaticPaths() { })); } -const { post } = Astro.props; +const { post } = Astro.props as Props; const { Content, remarkPluginFrontmatter } = await render(post); const { title, diff --git a/src/pages/blog/[...page].astro b/src/pages/blog/[...page].astro index 79cbddd..851c7d6 100644 --- a/src/pages/blog/[...page].astro +++ b/src/pages/blog/[...page].astro @@ -1,11 +1,22 @@ --- import BaseLayout from "@/layouts/BaseLayout.astro"; import { getCollection } from "astro:content"; +import type { CollectionEntry } from "astro:content"; import Headline from "@/components/ui/Headline.astro"; import Pagination from "@/components/ui/Pagination.astro"; import PostItem from "@/components/blog/PostItem.astro"; import { buildPaginatedPaths } from "@/utils/paginate"; +interface Props { + page: { + data: CollectionEntry<"blog">[]; + total: number; + currentPage: number; + lastPage: number; + url: { prev?: string; next?: string }; + }; +} + export async function getStaticPaths() { const blogEntries = await getCollection("blog"); const sortedPosts = blogEntries @@ -20,7 +31,7 @@ export async function getStaticPaths() { ); } -const { page } = Astro.props; +const { page } = Astro.props as Props; const blog = page.data; const metadata = { diff --git a/src/pages/category/[...rest].astro b/src/pages/category/[...rest].astro index aa89230..dbcd661 100644 --- a/src/pages/category/[...rest].astro +++ b/src/pages/category/[...rest].astro @@ -1,6 +1,7 @@ --- import BaseLayout from "@/layouts/BaseLayout.astro"; import { getCollection } from "astro:content"; +import type { CollectionEntry } from "astro:content"; import Headline from "@/components/ui/Headline.astro"; import PostItem from "@/components/blog/PostItem.astro"; import Pagination from "@/components/ui/Pagination.astro"; @@ -11,6 +12,16 @@ import { } from "@/utils/taxonomy"; import { buildPaginatedPaths } from "@/utils/paginate"; +interface Props { + cat: TaxonomyItem; + posts: CollectionEntry<"blog">[]; + currentPage: number; + lastPage: number; + total: number; + prevUrl?: string; + nextUrl?: string; +} + export async function getStaticPaths() { const allPosts = await getCollection("blog"); const posts = allPosts.filter((post) => post.data && post.data.pubDate); @@ -48,7 +59,7 @@ export async function getStaticPaths() { } const { cat, posts, currentPage, lastPage, total, prevUrl, nextUrl } = - Astro.props; + Astro.props as Props; const page = { currentPage, diff --git a/src/pages/destination/[...rest].astro b/src/pages/destination/[...rest].astro index 1ae0f5a..bc6537a 100644 --- a/src/pages/destination/[...rest].astro +++ b/src/pages/destination/[...rest].astro @@ -1,6 +1,7 @@ --- import BaseLayout from "@/layouts/BaseLayout.astro"; import { getCollection } from "astro:content"; +import type { CollectionEntry } from "astro:content"; import Headline from "@/components/ui/Headline.astro"; import PostItem from "@/components/blog/PostItem.astro"; import Pagination from "@/components/ui/Pagination.astro"; @@ -11,6 +12,16 @@ import { } from "@/utils/taxonomy"; import { buildPaginatedPaths } from "@/utils/paginate"; +interface Props { + dest: TaxonomyItem; + posts: CollectionEntry<"blog">[]; + currentPage: number; + lastPage: number; + total: number; + prevUrl?: string; + nextUrl?: string; +} + export async function getStaticPaths() { const allPosts = await getCollection("blog"); const posts = allPosts.filter((post) => post.data && post.data.pubDate); @@ -48,7 +59,7 @@ export async function getStaticPaths() { } const { dest, posts, currentPage, lastPage, total, prevUrl, nextUrl } = - Astro.props; + Astro.props as Props; const page = { currentPage, diff --git a/src/pages/tag/[tag]/[...page].astro b/src/pages/tag/[tag]/[...page].astro index c063ff9..563bb47 100644 --- a/src/pages/tag/[tag]/[...page].astro +++ b/src/pages/tag/[tag]/[...page].astro @@ -1,12 +1,23 @@ --- import BaseLayout from "@/layouts/BaseLayout.astro"; import { getCollection } from "astro:content"; +import type { CollectionEntry } from "astro:content"; import Headline from "@/components/ui/Headline.astro"; import PostItem from "@/components/blog/PostItem.astro"; import Pagination from "@/components/ui/Pagination.astro"; import { getTaxonomyMap } from "@/utils/taxonomy"; import { buildPaginatedPaths } from "@/utils/paginate"; +interface Props { + page: { + data: CollectionEntry<"blog">[]; + total: number; + currentPage: number; + lastPage: number; + url: { prev?: string; next?: string }; + }; +} + export async function getStaticPaths() { const allPosts = await getCollection("blog"); const posts = allPosts.filter((post) => post.data && post.data.pubDate); @@ -30,7 +41,7 @@ export async function getStaticPaths() { }); } -const { page } = Astro.props; +const { page } = Astro.props as Props; const { tag } = Astro.params; const tagInfo = getTaxonomyMap("tag").get(tag!);