From 5be431f57ca0f50a9f1790d3647e15ea06c810dc Mon Sep 17 00:00:00 2001 From: Kalidou Diagne Date: Thu, 8 May 2025 15:01:41 +0300 Subject: [PATCH] feat: auto-link to projects page from blog posts (#383) --- app/[lang]/blog/[slug]/page.tsx | 2 +- articles/reflecting-on-maci-platform.md | 1 + components/blog/article-list-card.tsx | 15 ++- .../blog/blog-article-related-projects.tsx | 43 ++++++++ components/blog/blog-content.tsx | 11 +- components/blog/project-blog-articles.tsx | 54 +++++----- components/wiki-side-navigation.tsx | 101 +++++++++++------- hooks/useGetProjectRelatedArticles.ts | 39 +++++++ 8 files changed, 191 insertions(+), 75 deletions(-) create mode 100644 components/blog/blog-article-related-projects.tsx create mode 100644 hooks/useGetProjectRelatedArticles.ts diff --git a/app/[lang]/blog/[slug]/page.tsx b/app/[lang]/blog/[slug]/page.tsx index 3446534..1f251c7 100644 --- a/app/[lang]/blog/[slug]/page.tsx +++ b/app/[lang]/blog/[slug]/page.tsx @@ -150,7 +150,7 @@ export default function BlogArticle({ params }: any) {
- +
) diff --git a/articles/reflecting-on-maci-platform.md b/articles/reflecting-on-maci-platform.md index 4fe56ea..73fe2c1 100644 --- a/articles/reflecting-on-maci-platform.md +++ b/articles/reflecting-on-maci-platform.md @@ -5,6 +5,7 @@ image: "/articles/reflecting-on-maci-platform/reflecting-on-maci-platform.png" tldr: "After a year of development and experimentation, the MACI Platform project is being sunset. In this retrospective, we share what we built, what we learned, and how the work can continue." date: "2025-05-01" canonical: "" +projects: ["maci"] tags: [ "MACI", diff --git a/components/blog/article-list-card.tsx b/components/blog/article-list-card.tsx index 289b1ff..6fea4e5 100644 --- a/components/blog/article-list-card.tsx +++ b/components/blog/article-list-card.tsx @@ -2,6 +2,7 @@ import Link from "next/link" import { Markdown } from "../ui/markdown" import { Article } from "@/lib/blog" +import { useRouter } from "next/navigation" export const ArticleListCard = ({ lang, @@ -18,9 +19,17 @@ export const ArticleListCard = ({ year: "numeric", }) + const router = useRouter() + return (
- +
{ + router.push(url) + }} + rel="noreferrer" + >
- + {article.title} @@ -91,7 +100,7 @@ export const ArticleListCard = ({
- +
) } diff --git a/components/blog/blog-article-related-projects.tsx b/components/blog/blog-article-related-projects.tsx new file mode 100644 index 0000000..717533b --- /dev/null +++ b/components/blog/blog-article-related-projects.tsx @@ -0,0 +1,43 @@ +"use client" + +import { LocaleTypes } from "@/app/i18n/settings" +import { useProjectFiltersState } from "@/state/useProjectFiltersState" +import ProjectCard from "../project/project-card" + +interface BlogArticleRelatedProjectsProps { + projectsIds: string[] + lang: LocaleTypes +} + +export const BlogArticleRelatedProjects = ({ + projectsIds, + lang, +}: BlogArticleRelatedProjectsProps) => { + const { projects: allProjects } = useProjectFiltersState((state) => state) + + const projects = allProjects.filter((project) => + projectsIds.includes(project.id) + ) + + if (projects.length === 0) return null + + return ( +
+

+ Related projects +

+
+ {projects?.map((project) => ( + + ))} +
+
+ ) +} diff --git a/components/blog/blog-content.tsx b/components/blog/blog-content.tsx index b0fc9c4..ba4fc2a 100644 --- a/components/blog/blog-content.tsx +++ b/components/blog/blog-content.tsx @@ -3,8 +3,12 @@ import Link from "next/link" import { AppContent } from "../ui/app-content" import { Markdown } from "../ui/markdown" import { BlogArticleCard } from "./blog-article-card" +import { BlogArticleRelatedProjects } from "./blog-article-related-projects" +import { LocaleTypes } from "@/app/i18n/settings" + interface BlogContentProps { post: Article + lang: LocaleTypes } interface BlogImageProps { @@ -31,7 +35,7 @@ export function BlogImage({ image, alt, description }: BlogImageProps) { ) } -export function BlogContent({ post }: BlogContentProps) { +export function BlogContent({ post, lang }: BlogContentProps) { const articles = getArticles() ?? [] const articleIndex = articles.findIndex((article) => article.id === post.id) @@ -101,6 +105,11 @@ export function BlogContent({ post }: BlogContentProps) {
)} + + ) diff --git a/components/blog/project-blog-articles.tsx b/components/blog/project-blog-articles.tsx index 5ee0a1e..3e2abde 100644 --- a/components/blog/project-blog-articles.tsx +++ b/components/blog/project-blog-articles.tsx @@ -4,14 +4,8 @@ import { LocaleTypes } from "@/app/i18n/settings" import { ProjectInterface } from "@/lib/types" import { AppContent } from "../ui/app-content" import { Article } from "@/lib/blog" -import { useEffect, useState } from "react" import { ArticleListCard } from "./article-list-card" - -async function fetchArticles(project: string) { - const response = await fetch(`/api/articles?project=${project}`) - const data = await response.json() - return data.articles -} +import { useGetProjectRelatedArticles } from "@/hooks/useGetProjectRelatedArticles" export const ProjectBlogArticles = ({ project, @@ -20,28 +14,17 @@ export const ProjectBlogArticles = ({ project: ProjectInterface lang: LocaleTypes }) => { - const [articles, setArticles] = useState([]) - const [loading, setLoading] = useState(true) + const { articles, loading } = useGetProjectRelatedArticles({ + projectId: project.id, + }) - useEffect(() => { - const getArticles = async () => { - try { - const data = await fetchArticles(project.id) - setArticles(data) - } catch (error) { - console.error("Error fetching articles:", error) - } finally { - setLoading(false) - } - } - - getArticles() - }, [project.id]) - - // Show loading state if (loading) { return ( -
+