From 2c1d3b2f7fe35f58badc386d77b8fe3592eebbf0 Mon Sep 17 00:00:00 2001 From: Thuan Bui <9248622+10h30@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:27:05 +0700 Subject: [PATCH] feat: refactor taxonomy data handling for categories, destinations, and tags --- src/components/ui/Categories.astro | 6 +++--- src/components/ui/Destinations.astro | 7 ++++--- src/components/ui/Pagination.astro | 10 +++++++--- src/components/ui/Tags.astro | 4 ++-- src/pages/category/[...rest].astro | 12 +++++++----- src/pages/category/[category]/[...page].astro | 4 ++-- src/pages/destination/[...rest].astro | 11 ++++++----- src/pages/tag/[tag]/[...page].astro | 4 ++-- src/utils/taxonomy.ts | 11 ----------- 9 files changed, 33 insertions(+), 36 deletions(-) diff --git a/src/components/ui/Categories.astro b/src/components/ui/Categories.astro index 33d0248..853a874 100644 --- a/src/components/ui/Categories.astro +++ b/src/components/ui/Categories.astro @@ -1,5 +1,5 @@ --- -import { categoryMap, getCategoryPath } from "@/utils/taxonomy"; +import { getTaxonomyMap, getTaxonomyPath } from "@/utils/taxonomy"; export interface Props { categories: string[]; @@ -15,10 +15,10 @@ const { categories, class: className = "text-sm" } = Astro.props; {categories.map((category) => (
  • - {categoryMap.get(category)?.name ?? category} + {getTaxonomyMap("category").get(category)?.name ?? category}
  • ))} diff --git a/src/components/ui/Destinations.astro b/src/components/ui/Destinations.astro index fce439c..e81a224 100644 --- a/src/components/ui/Destinations.astro +++ b/src/components/ui/Destinations.astro @@ -1,5 +1,5 @@ --- -import { destinationMap, getDestinationPath } from "@/utils/taxonomy"; +import { getTaxonomyMap, getTaxonomyPath } from "@/utils/taxonomy"; export interface Props { destinations: string[]; @@ -15,7 +15,7 @@ const { destinations, class: className = "text-sm" } = Astro.props; {destinations.map((destination) => (
  • - {destinationMap.get(destination)?.name ?? destination} + {getTaxonomyMap("destination").get(destination)?.name ?? + destination}
  • ))} diff --git a/src/components/ui/Pagination.astro b/src/components/ui/Pagination.astro index 5ac2532..bd9322e 100644 --- a/src/components/ui/Pagination.astro +++ b/src/components/ui/Pagination.astro @@ -1,10 +1,14 @@ --- -import type { Page } from "astro"; -import type { CollectionEntry } from "astro:content"; import { Icon } from "astro-icon/components"; +export interface SimplePage { + currentPage: number; + lastPage: number; + url: { prev?: string; next?: string }; +} + export interface Props { - page: Page>; + page: SimplePage; class?: string; } diff --git a/src/components/ui/Tags.astro b/src/components/ui/Tags.astro index 889b8b5..1570f36 100644 --- a/src/components/ui/Tags.astro +++ b/src/components/ui/Tags.astro @@ -1,5 +1,5 @@ --- -import { tagMap } from "@/utils/taxonomy"; +import { getTaxonomyMap } from "@/utils/taxonomy"; export interface Props { tags: string[]; @@ -18,7 +18,7 @@ const { tags, class: className = "text-sm" } = Astro.props; href={`/tag/${tag}`} class="inline-block bg-muted/50 hover:bg-muted text-muted-foreground hover:text-foreground px-3 py-1 rounded-full border border-border transition-colors duration-200" > - #{tagMap.get(tag)?.name ?? tag} + #{getTaxonomyMap("tag").get(tag)?.name ?? tag} ))} diff --git a/src/pages/category/[...rest].astro b/src/pages/category/[...rest].astro index 6e0ec49..118df7b 100644 --- a/src/pages/category/[...rest].astro +++ b/src/pages/category/[...rest].astro @@ -7,8 +7,8 @@ import Pagination from "@/components/ui/Pagination.astro"; import type { Page } from "astro"; import type { CollectionEntry } from "astro:content"; import { - categoryMap, - getCategoryPath, + getTaxonomyMap, + getTaxonomyPath, type TaxonomyItem, } from "@/utils/taxonomy"; @@ -27,8 +27,10 @@ export async function getStaticPaths() { .filter((post) => post.data.categories?.includes(slug)) .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()); - const fullPath = getCategoryPath(slug); - const cat = categoryMap.get(slug) ?? ({ slug, name: slug } as TaxonomyItem); + const fullPath = getTaxonomyPath("category", slug); + const cat = + getTaxonomyMap("category").get(slug) ?? + ({ slug, name: slug } as TaxonomyItem); const totalPages = Math.max(1, Math.ceil(catPosts.length / PAGE_SIZE)); return Array.from({ length: totalPages }, (_, i) => { @@ -65,7 +67,7 @@ const page = { currentPage, lastPage, url: { prev: prevUrl, next: nextUrl }, -} as unknown as Page>; +}; const metadata = { title: cat.name, diff --git a/src/pages/category/[category]/[...page].astro b/src/pages/category/[category]/[...page].astro index 8de289f..b083be3 100644 --- a/src/pages/category/[category]/[...page].astro +++ b/src/pages/category/[category]/[...page].astro @@ -5,7 +5,7 @@ import Headline from "@/components/ui/Headline.astro"; import PostItem from "@/components/blog/PostItem.astro"; import Pagination from "@/components/ui/Pagination.astro"; import type { GetStaticPathsOptions } from "astro"; -import { categoryMap } from "@/utils/taxonomy"; +import { getTaxonomyMap } from "@/utils/taxonomy"; export async function getStaticPaths({ paginate }: GetStaticPathsOptions) { const allPosts = await getCollection("blog"); @@ -31,7 +31,7 @@ export async function getStaticPaths({ paginate }: GetStaticPathsOptions) { const { page } = Astro.props; const { category } = Astro.params; -const categoryInfo = categoryMap.get(category!); +const categoryInfo = getTaxonomyMap("category").get(category!); const displayName = categoryInfo?.name ?? category!; const description = categoryInfo?.description; diff --git a/src/pages/destination/[...rest].astro b/src/pages/destination/[...rest].astro index 90521ff..3bfef66 100644 --- a/src/pages/destination/[...rest].astro +++ b/src/pages/destination/[...rest].astro @@ -7,8 +7,8 @@ import Pagination from "@/components/ui/Pagination.astro"; import type { Page } from "astro"; import type { CollectionEntry } from "astro:content"; import { - destinationMap, - getDestinationPath, + getTaxonomyMap, + getTaxonomyPath, type TaxonomyItem, } from "@/utils/taxonomy"; @@ -27,9 +27,10 @@ export async function getStaticPaths() { .filter((post) => post.data.destination?.includes(slug)) .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()); - const fullPath = getDestinationPath(slug); + const fullPath = getTaxonomyPath("destination", slug); const dest = - destinationMap.get(slug) ?? ({ slug, name: slug } as TaxonomyItem); + getTaxonomyMap("destination").get(slug) ?? + ({ slug, name: slug } as TaxonomyItem); const totalPages = Math.max(1, Math.ceil(destPosts.length / PAGE_SIZE)); return Array.from({ length: totalPages }, (_, i) => { @@ -66,7 +67,7 @@ const page = { currentPage, lastPage, url: { prev: prevUrl, next: nextUrl }, -} as unknown as Page>; +}; const metadata = { title: dest.name, diff --git a/src/pages/tag/[tag]/[...page].astro b/src/pages/tag/[tag]/[...page].astro index 2065677..4984bd4 100644 --- a/src/pages/tag/[tag]/[...page].astro +++ b/src/pages/tag/[tag]/[...page].astro @@ -5,7 +5,7 @@ import Headline from "@/components/ui/Headline.astro"; import PostItem from "@/components/blog/PostItem.astro"; import Pagination from "@/components/ui/Pagination.astro"; import type { GetStaticPathsOptions } from "astro"; -import { tagMap } from "@/utils/taxonomy"; +import { getTaxonomyMap } from "@/utils/taxonomy"; export async function getStaticPaths({ paginate }: GetStaticPathsOptions) { const allPosts = await getCollection("blog"); @@ -31,7 +31,7 @@ export async function getStaticPaths({ paginate }: GetStaticPathsOptions) { const { page } = Astro.props; const { tag } = Astro.params; -const tagInfo = tagMap.get(tag!); +const tagInfo = getTaxonomyMap("tag").get(tag!); const displayName = tagInfo?.name ?? tag!; const description = tagInfo?.description; diff --git a/src/utils/taxonomy.ts b/src/utils/taxonomy.ts index 5a496c1..01ddfb1 100644 --- a/src/utils/taxonomy.ts +++ b/src/utils/taxonomy.ts @@ -51,14 +51,3 @@ export function getTaxonomyItem( ): TaxonomyItem | undefined { return getTaxonomyMap(type).get(slug); } - -// Convenience aliases kept for backward compatibility -export const categoryMap = getTaxonomyMap("category"); -export const destinationMap = getTaxonomyMap("destination"); -export const tagMap = getTaxonomyMap("tag"); - -export const getCategoryPath = (slug: string) => - getTaxonomyPath("category", slug); -export const getDestinationPath = (slug: string) => - getTaxonomyPath("destination", slug); -export const getTagPath = (slug: string) => getTaxonomyPath("tag", slug);