feat: dynamic feature posts.

This commit is contained in:
Yufan Sheng 2024-10-16 02:17:58 +08:00
parent c1b3f54161
commit 09b59e7acb
Signed by: syhily
GPG Key ID: 9D18A22A7DCD5A9B
2 changed files with 40 additions and 20 deletions

View File

@ -46,7 +46,7 @@ const Options = z
.readonly(), .readonly(),
post: z.object({ post: z.object({
sort: z.enum(['asc', 'desc']), 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(), category: z.array(z.string()).optional(),
}), }),
pagination: z.object({ pagination: z.object({
@ -163,7 +163,6 @@ const options: z.input<typeof Options> = {
assetPrefix: 'https://cat.yufan.me', assetPrefix: 'https://cat.yufan.me',
post: { post: {
sort: 'desc', sort: 'desc',
feature: ['we-are-stranger', 'secret-of-boys-mind', 'my-darling'],
category: ['article', 'think', 'gossip', 'coding'], category: ['article', 'think', 'gossip', 'coding'],
}, },
pagination: { pagination: {

View File

@ -8,13 +8,32 @@ interface Props {
} }
const { posts } = Astro.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 featurePosts = options.settings.post.feature ?? [];
const metas: Post[] = featurePosts
const metas: Post[] =
featurePosts.length < 3
? historicalPosts()
: featurePosts
.map((slug) => posts.find((post) => post.slug === slug)) .map((slug) => posts.find((post) => post.slug === slug))
.flatMap((post) => (post == null ? [] : [post])) .flatMap((post) => (post == null ? [] : [post]))
.slice(0, 3); .slice(0, 3);
--- ---
{
metas.length === 3 && (
<div class="list-top-pushes mb-3 mb-md-4 mb-lg-5"> <div class="list-top-pushes mb-3 mb-md-4 mb-lg-5">
<div class="container"> <div class="container">
<div class="row gx-2 gx-md-3 list-grouped"> <div class="row gx-2 gx-md-3 list-grouped">
@ -34,3 +53,5 @@ const metas: Post[] = featurePosts
</div> </div>
</div> </div>
</div> </div>
)
}