From 7e239da7d241cdea7f036ab6fe66676883bfc2f7 Mon Sep 17 00:00:00 2001 From: Dunsin <78784850+Dun-sin@users.noreply.github.com> Date: Sun, 1 Dec 2024 20:03:42 +0100 Subject: [PATCH] feat: add recommended blog post depending on current post tags (#514) --- .../src/lib/Blog/BlogListItem.svelte | 45 ++++++++++ apps/classroomio-com/src/lib/types.ts | 5 ++ .../src/routes/blog/+page.svelte | 39 +-------- apps/classroomio-com/src/routes/blog/+page.ts | 1 + .../src/routes/blog/[slug]/+page.svelte | 18 +++- .../src/routes/blog/[slug]/+page.ts | 86 ++++++++++++------- 6 files changed, 125 insertions(+), 69 deletions(-) create mode 100644 apps/classroomio-com/src/lib/Blog/BlogListItem.svelte diff --git a/apps/classroomio-com/src/lib/Blog/BlogListItem.svelte b/apps/classroomio-com/src/lib/Blog/BlogListItem.svelte new file mode 100644 index 00000000..946d4ebd --- /dev/null +++ b/apps/classroomio-com/src/lib/Blog/BlogListItem.svelte @@ -0,0 +1,45 @@ + + +{#if !isRecommended} +
+ +

{formatDate(post.date)}

+ + +
+
+ {#each post.tags as tag} + + {/each} +
+
+
+{/if} + + + {post.title} +

+ {@html post.title} +

+ +

{post.description}

+
+ +
+ avatar + +

{post.author}

+

{post.role}

+
+
diff --git a/apps/classroomio-com/src/lib/types.ts b/apps/classroomio-com/src/lib/types.ts index eb7f00b8..901c7418 100644 --- a/apps/classroomio-com/src/lib/types.ts +++ b/apps/classroomio-com/src/lib/types.ts @@ -1,5 +1,10 @@ export type Categories = 'sveltekit' | 'svelte'; +export type RawBlogPost = { + metadata: BlogPost; + default: any; +}; + export type BlogPost = { title: string; slug: string; diff --git a/apps/classroomio-com/src/routes/blog/+page.svelte b/apps/classroomio-com/src/routes/blog/+page.svelte index 7cbe467b..f4c3f2d8 100644 --- a/apps/classroomio-com/src/routes/blog/+page.svelte +++ b/apps/classroomio-com/src/routes/blog/+page.svelte @@ -1,8 +1,7 @@ @@ -27,41 +26,7 @@ diff --git a/apps/classroomio-com/src/routes/blog/+page.ts b/apps/classroomio-com/src/routes/blog/+page.ts index d8b46c2a..8686d3b4 100644 --- a/apps/classroomio-com/src/routes/blog/+page.ts +++ b/apps/classroomio-com/src/routes/blog/+page.ts @@ -1,5 +1,6 @@ import type { BlogPost } from '$lib/types'; +/** @type {import('./$types').PageLoad} */ export async function load({ fetch }) { const response = await fetch('api/blog'); const posts: BlogPost[] = await response.json(); diff --git a/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte b/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte index 71da3d18..e129c102 100644 --- a/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte +++ b/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte @@ -1,7 +1,8 @@ @@ -24,7 +25,7 @@ -
+
@@ -34,6 +35,19 @@
+ {#if data.relatedPosts.length > 0} +
+

Related Posts

+ +
+ {/if} + post.tags.some((tag) => tags.includes(tag)) && post.slug !== slug) + .map((post) => ({ + ...post, + rank: post.tags.filter((tag) => tags.includes(tag)).length + })) + .sort((a, b) => b.rank - a.rank); + + const topPosts = related.filter((post) => post.rank > 1); + + if (topPosts.length > 2) { + return topPosts.sort(() => Math.random() - 0.5).slice(0, 2); + } + + return related.slice(0, 2); +} + +function getPageMetaTags(blog: RawBlogPost): MetaTagsProps { + return Object.freeze({ + title: blog.metadata.title, + description: blog.metadata.description, + openGraph: { + title: blog.metadata.title, + description: blog.metadata.description, + images: [ + { + url: blog.metadata.imageUrl, + alt: blog.metadata.title, + width: 280, + height: 200, + secureUrl: blog.metadata.imageUrl, + type: 'image/jpeg' + } + ] + }, + twitter: { + handle: '@classroomio', + site: '@classroomio', + cardType: 'summary_large_image' as const, + title: blog.metadata.title, + description: blog.metadata.description, + image: blog.metadata.imageUrl, + imageAlt: `${blog.metadata.title} OG` + } + }) satisfies MetaTagsProps; +}