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}
+
+
+
+
+ {@html post.title}
+
+
+ {post.description}
+
+
+
+

+
+ {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 @@
-
+
+ {#if data.relatedPosts.length > 0}
+
+ {/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;
+}