From 09b59e7acb32f11de6dcd6ded0a24e52cca8dca3 Mon Sep 17 00:00:00 2001 From: Yufan Sheng Date: Wed, 16 Oct 2024 02:17:58 +0800 Subject: [PATCH] feat: dynamic feature posts. --- options.ts | 3 +- src/components/page/post/FeaturePosts.astro | 57 ++++++++++++++------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/options.ts b/options.ts index da1346c..d6ac9ad 100644 --- a/options.ts +++ b/options.ts @@ -46,7 +46,7 @@ const Options = z .readonly(), post: z.object({ sort: z.enum(['asc', 'desc']), - feature: z.array(z.string()).optional(), + feature: z.array(z.string()).min(3).optional(), category: z.array(z.string()).optional(), }), pagination: z.object({ @@ -163,7 +163,6 @@ const options: z.input = { assetPrefix: 'https://cat.yufan.me', post: { sort: 'desc', - feature: ['we-are-stranger', 'secret-of-boys-mind', 'my-darling'], category: ['article', 'think', 'gossip', 'coding'], }, pagination: { diff --git a/src/components/page/post/FeaturePosts.astro b/src/components/page/post/FeaturePosts.astro index 9e6c4ea..c923e6c 100644 --- a/src/components/page/post/FeaturePosts.astro +++ b/src/components/page/post/FeaturePosts.astro @@ -8,29 +8,50 @@ interface Props { } const { posts } = Astro.props; +const historicalPosts = (): Post[] => { + // Skip the first 6 pages. + const offset = options.settings.pagination.posts * 6; + if (posts.length - offset < 43 * 3 + 2) { + // Can't generate historical posts. + return []; + } + + const now = new Date(); + const radical = now.getMonth() + now.getDate(); + + return [posts[offset + radical - 1], posts[offset + radical + 43 - 1], posts[offset + radical + 43 * 2 - 1]]; +}; const featurePosts = options.settings.post.feature ?? []; -const metas: Post[] = featurePosts - .map((slug) => posts.find((post) => post.slug === slug)) - .flatMap((post) => (post == null ? [] : [post])) - .slice(0, 3); + +const metas: Post[] = + featurePosts.length < 3 + ? historicalPosts() + : featurePosts + .map((slug) => posts.find((post) => post.slug === slug)) + .flatMap((post) => (post == null ? [] : [post])) + .slice(0, 3); --- -
-
-
-
- -
-
-
-
- +{ + metas.length === 3 && ( +
+
+
+
+
-
- +
+
+
+ +
+
+ +
+
-
-
+ ) +}