diff --git a/src/components/BlogCard.astro b/src/components/BlogCard.astro index 394fe0f..e2b41c9 100644 --- a/src/components/BlogCard.astro +++ b/src/components/BlogCard.astro @@ -65,7 +65,6 @@ const subpostCount = !isSubpost(entry.id) ? await getSubpostCount(entry.id) : 0 fallback={author.name[0]} className="size-5 rounded-full" /> - {author.name} ))} diff --git a/src/components/notion/Bookmark.astro b/src/components/notion/Bookmark.astro index 893ec82..76b3927 100644 --- a/src/components/notion/Bookmark.astro +++ b/src/components/notion/Bookmark.astro @@ -10,7 +10,7 @@ export interface Props { } const { block } = Astro.props - +console.log(block) const target = block.Bookmark || block.LinkPreview || block.Embed const urlString = target?.Url @@ -37,7 +37,7 @@ try {
-
{target?.Url}
+
{url.hostname}
@@ -51,7 +51,7 @@ try {
- +
)} diff --git a/src/components/ui/pagination.tsx b/src/components/ui/pagination.tsx index a9b189c..9dc777d 100644 --- a/src/components/ui/pagination.tsx +++ b/src/components/ui/pagination.tsx @@ -162,7 +162,7 @@ const PaginationComponent: React.FC = ({ const getPageUrl = (page: number) => { if (page === 1) return baseUrl - return `${baseUrl}${page}` + return `${baseUrl}?p=${page}` } return ( diff --git a/src/lib/data-utils.ts b/src/lib/data-utils.ts index 1bc9eed..0bf347b 100644 --- a/src/lib/data-utils.ts +++ b/src/lib/data-utils.ts @@ -94,16 +94,16 @@ export function normalizePost(post: NotionPost): CollectionEntry<'blog'> { } } -export async function getAllPosts(): Promise[]> { +export async function getAllPosts(page?: Number, size?: Number): Promise[]> { try { - const res = await fetch("https://notion-api.nvme0n1p.dev/v2/posts") + const res = await fetch(`https://notion-api.nvme0n1p.dev/v2/posts?page=${page ?? 1}&length=${size ?? 1000}`) if (!res.ok) throw new Error(`Failed to fetch posts: ${res.status}`) - const payload = (await res.json()) as { posts?: NotionPost[] } + const payload = (await res.json()) as { posts?: NotionPost[], length?: number } const posts = (payload.posts ?? []).filter( (post) => post.Published ?? true, ) - + const length = payload.length; const normalized = posts.map(normalizePost) return normalized @@ -545,7 +545,6 @@ function buildBlocks( i++ continue } - if (current.type === 'bulleted_list' || current.type === 'numbered_list') { const listItems: Block[] = [] const targetType = current.type @@ -748,7 +747,7 @@ function convertBlock( } case 'bookmark': { const url = - block.properties?.link_url?.[0]?.[0] || + block.properties?.link?.[0]?.[0] || block.properties?.source?.[0]?.[0] || block.properties?.title?.[0]?.[0] || '' @@ -758,7 +757,7 @@ function convertBlock( Type: 'bookmark', HasChildren: false, Bookmark: { - Caption: parseRichTexts(block.properties?.caption), + Caption: parseRichTexts(block.properties?.title), Url: url, }, } diff --git a/src/pages/blog/[...id].astro b/src/pages/blog/[...id].astro index 3baf6d7..d5a4209 100644 --- a/src/pages/blog/[...id].astro +++ b/src/pages/blog/[...id].astro @@ -46,10 +46,14 @@ let remoteContent = null const remote = await fetchRemotePostContent(currentPostId) +if(!remote) { + // return Astro.response(null, {status: 404}) + return Astro.rewrite("/404") +} remoteContent = remote ? renderRemoteBlockMap(remote.blockMap, remote.post.id) : null headings = remoteContent?.headings ?? [] const post = remote?.post -const authors = await parseAuthors(post.authors ?? []) +const authors = await parseAuthors(post?.authors ?? []) const isCurrentSubpost = isSubpost(currentPostId) const navigation = await getAdjacentPosts(currentPostId) @@ -71,7 +75,7 @@ const tocSections: TOCSection[] = remoteContent ] : [] : await getTOCSections(currentPostId) -const heroImage = post.data.banner +const heroImage = post?.data?.banner export const prerender = false; --- @@ -232,7 +236,7 @@ export const prerender = false; headings={remoteContent.headingBlocks} /> ) : ( -

Content unavailable.

+

你来到了没有知识的荒原!

) ) : ( Content && diff --git a/src/pages/blog/[...page].astro b/src/pages/blog/index.astro similarity index 56% rename from src/pages/blog/[...page].astro rename to src/pages/blog/index.astro index 3f60dca..80a4950 100644 --- a/src/pages/blog/[...page].astro +++ b/src/pages/blog/index.astro @@ -5,20 +5,42 @@ import PageHead from '@/components/PageHead.astro' import PaginationComponent from '@/components/ui/pagination' import { SITE } from '@/consts' import Layout from '@/layouts/Layout.astro' -import { getAllPosts, groupPostsByYear } from '@/lib/data-utils' +import { getAllPosts, groupPostsByYear, normalizePost } from '@/lib/data-utils' import type { PaginateFunction } from 'astro' -export async function getStaticPaths({ - paginate, -}: { - paginate: PaginateFunction -}) { - const allPosts = await getAllPosts() - return paginate(allPosts, { pageSize: SITE.postsPerPage }) +// export async function getStaticPaths({ +// paginate, +// }: { +// paginate: PaginateFunction +// }) { +// const allPosts = await getAllPosts() +// return paginate(allPosts, { pageSize: SITE.postsPerPage }) +// } +const nowPage = parseInt(new URL(Astro.request.url).searchParams.get("p") || "1"); + +// use url param +// const { page } = Astro.para + +const page = await fetch(`https://notion-api.nvme0n1p.dev/v2/posts/?page=${nowPage}&length=${SITE.postsPerPage}`) + .then((res) => { + if (!res.ok) throw new Error(`Failed to fetch posts: ${res.status}`); + return res.json(); + }) + .then((allPosts) => { + const totalPages = allPosts.length; + const currentPage = nowPage; + return { + data: allPosts.posts.map((post) => normalizePost(post)), + currentPage, + lastPage: totalPages, + }; +}); +console.log(page); +// fetch page +if(page.lastPage < page.currentPage) { + console.log("redirect to 404") + return Astro.rewrite("/404") } - -const { page } = Astro.props - const postsByYear = groupPostsByYear(page.data) const years = Object.keys(postsByYear).sort((a, b) => parseInt(b) - parseInt(a)) export const prerender = false;