From 31498754fba05b905d3a9ef985de09565132bc62 Mon Sep 17 00:00:00 2001 From: xfy Date: Mon, 19 May 2025 19:12:32 +0800 Subject: [PATCH] feat: add tags page --- app/tags/layout.tsx | 27 ++++++++++++ app/tags/page.tsx | 60 +++++++++++++++++++++++++++ {app => backup}/g/[id]/page.tsx | 0 {app => backup}/g/layout.tsx | 0 {app => backup}/g/loading.tsx | 0 {app => backup}/gists/[page]/page.tsx | 0 {app => backup}/gists/layout.tsx | 0 {app => backup}/gists/loading.tsx | 0 {app => backup}/gists/page.tsx | 0 components/pages/nav-bar.tsx | 4 +- 10 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 app/tags/layout.tsx create mode 100644 app/tags/page.tsx rename {app => backup}/g/[id]/page.tsx (100%) rename {app => backup}/g/layout.tsx (100%) rename {app => backup}/g/loading.tsx (100%) rename {app => backup}/gists/[page]/page.tsx (100%) rename {app => backup}/gists/layout.tsx (100%) rename {app => backup}/gists/loading.tsx (100%) rename {app => backup}/gists/page.tsx (100%) diff --git a/app/tags/layout.tsx b/app/tags/layout.tsx new file mode 100644 index 0000000..bc49698 --- /dev/null +++ b/app/tags/layout.tsx @@ -0,0 +1,27 @@ +import clsx from 'clsx'; +import { ReactNode } from 'react'; + +const Layout = ({ children }: { children: ReactNode }) => { + return ( + <> +
+

+ Tags +

+ {children} +
+ + ); +}; + +export default Layout; diff --git a/app/tags/page.tsx b/app/tags/page.tsx new file mode 100644 index 0000000..492dad0 --- /dev/null +++ b/app/tags/page.tsx @@ -0,0 +1,60 @@ +import clsx from 'clsx'; +import { postLists } from 'lib/posts'; +import { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'RUA - Tags', +}; + +const Page = async () => { + const posts = await postLists(); + // tag ["Rust", "React"] or "Rust" + // tag object {"Rust": 1, "React": 1} + const tags = posts.reduce<{ + [key: string]: number; + }>((prev, cur) => { + if (cur.tags?.length <= 0) { + return prev; + } + if (typeof cur.tags === 'string') { + const tag = prev[cur.tags]; + if (tag) { + prev[cur.tags] += 1; + } else { + prev[cur.tags] = 1; + } + } + if (Array.isArray(cur.tags)) { + cur.tags.forEach((tag) => { + const tagCount = prev[tag]; + if (tagCount) { + prev[tag] += 1; + } else { + prev[tag] = 1; + } + }); + } + return prev; + }, {}); + + return ( +
+ {Object.entries(tags).map(([tag, count]) => ( +
+
{tag}
+
{count}
+
+ ))} +
+ ); +}; + +export default Page; diff --git a/app/g/[id]/page.tsx b/backup/g/[id]/page.tsx similarity index 100% rename from app/g/[id]/page.tsx rename to backup/g/[id]/page.tsx diff --git a/app/g/layout.tsx b/backup/g/layout.tsx similarity index 100% rename from app/g/layout.tsx rename to backup/g/layout.tsx diff --git a/app/g/loading.tsx b/backup/g/loading.tsx similarity index 100% rename from app/g/loading.tsx rename to backup/g/loading.tsx diff --git a/app/gists/[page]/page.tsx b/backup/gists/[page]/page.tsx similarity index 100% rename from app/gists/[page]/page.tsx rename to backup/gists/[page]/page.tsx diff --git a/app/gists/layout.tsx b/backup/gists/layout.tsx similarity index 100% rename from app/gists/layout.tsx rename to backup/gists/layout.tsx diff --git a/app/gists/loading.tsx b/backup/gists/loading.tsx similarity index 100% rename from app/gists/loading.tsx rename to backup/gists/loading.tsx diff --git a/app/gists/page.tsx b/backup/gists/page.tsx similarity index 100% rename from app/gists/page.tsx rename to backup/gists/page.tsx diff --git a/components/pages/nav-bar.tsx b/components/pages/nav-bar.tsx index a669b92..4147cdb 100644 --- a/components/pages/nav-bar.tsx +++ b/components/pages/nav-bar.tsx @@ -25,8 +25,8 @@ const txtMenu = [ }, { id: 3, - name: 'Gists', - path: '/gists', + name: 'Tags', + path: '/tags', }, { id: 4,