mirror of
https://github.com/QuivrHQ/quivr.git
synced 2024-12-15 09:32:22 +03:00
feat: 🎸 blog
added link to rollback
This commit is contained in:
parent
623b4f0a52
commit
4024d2c05c
@ -41,6 +41,7 @@ type BlogPostAttributes = {
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
publishedAt: string;
|
||||
slug: string;
|
||||
seo: SeoAttributes;
|
||||
};
|
||||
|
||||
@ -56,7 +57,7 @@ export const getStaticPaths: GetStaticPaths = async () => {
|
||||
throw new Error('Network response was not ok');
|
||||
}
|
||||
const data: { data: BlogPost[] } = await response.json();
|
||||
const paths = data.data.map(post => ({ params: { id: post.id.toString() } }));
|
||||
const paths = data.data.map(post => ({ params: { slug: post.attributes.slug } }));
|
||||
|
||||
return {
|
||||
paths,
|
||||
@ -71,14 +72,21 @@ export const getStaticPaths: GetStaticPaths = async () => {
|
||||
}
|
||||
};
|
||||
|
||||
export const getStaticProps = async (context: { params: { id: string } }) => {
|
||||
export const getStaticProps = async (context: { params: { slug: string } }) => {
|
||||
try {
|
||||
const response = await fetch(`https://cms.quivr.app/api/blogs/${context.params.id}?populate=seo,seo.metaImage`);
|
||||
const data: { data: BlogPost } = await response.json();
|
||||
const response = await fetch(`https://cms.quivr.app/api/blogs?slug=${context.params.slug}&populate=seo,seo.metaImage`);
|
||||
const data: { data: BlogPost[] } = await response.json();
|
||||
|
||||
// Find the blog post with the exact slug match
|
||||
const blogPost = data.data.find(post => post.attributes.slug === context.params.slug);
|
||||
|
||||
if (!blogPost) {
|
||||
throw new Error('No blog post found for the provided slug');
|
||||
}
|
||||
|
||||
return {
|
||||
props: {
|
||||
post: data.data,
|
||||
post: blogPost,
|
||||
},
|
||||
};
|
||||
} catch (error) {
|
||||
@ -107,10 +115,11 @@ const BlogPostDetail = ({ post }: InferGetStaticPropsType<typeof getStaticProps>
|
||||
<header className="bg-white text-zinc-900 py-4 border-b">
|
||||
<div className="container mx-auto px-4 md:px-6">
|
||||
<nav className="flex items-center justify-between">
|
||||
<div className="text-2xl font-bold">Quivr - Blog</div>
|
||||
<Link href="/blog">
|
||||
<div className="text-2xl font-bold cursor-pointer">Quivr</div>
|
||||
</Link>
|
||||
<div className="space-x-4">
|
||||
<Link className="text-zinc-900 hover:text-zinc-700" href="https://quivr.app">Try Quivr</Link>
|
||||
<Link className="text-zinc-900 hover:text-zinc-700" href="/blog">Blog</Link>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
@ -12,8 +12,11 @@ type BlogPostAttributes = {
|
||||
imageUrl: string;
|
||||
title: string;
|
||||
description: string;
|
||||
slug: string;
|
||||
publishedAt: string;
|
||||
seo: {
|
||||
metaTitle: string;
|
||||
metaDescription: string;
|
||||
metaImage: {
|
||||
data: {
|
||||
attributes: {
|
||||
@ -36,13 +39,15 @@ type BlogPost = {
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
export const getStaticProps = async () => {
|
||||
try {
|
||||
const resulting = await fetch("https://cms.quivr.app/api/blogs?populate=seo,seo.metaImage");
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
||||
const resulting = await fetch("https://cms.quivr.app/api/blogs?populate=seo,seo.metaImage,slug");
|
||||
const data: { data: BlogPost[] } = await resulting.json();
|
||||
|
||||
// Sort blogs by publishedAt in descending order
|
||||
const sortedBlogs = data.data.sort((a, b) => new Date(b.attributes.publishedAt).getTime() - new Date(a.attributes.publishedAt).getTime());
|
||||
|
||||
return {
|
||||
props: {
|
||||
result: data.data,
|
||||
result: sortedBlogs,
|
||||
},
|
||||
};
|
||||
} catch (error) {
|
||||
@ -67,10 +72,11 @@ const Blog = ({ result }: InferGetStaticPropsType<typeof getStaticProps>) => {
|
||||
<header className="bg-white text-zinc-900 py-4 border-b">
|
||||
<div className="container mx-auto px-4 md:px-6">
|
||||
<nav className="flex items-center justify-between">
|
||||
<div className="text-2xl font-bold">Quivr</div>
|
||||
<Link href="/blog">
|
||||
<div className="text-2xl font-bold cursor-pointer">Quivr</div>
|
||||
</Link>
|
||||
<div className="space-x-4">
|
||||
<Link className="text-zinc-900 hover:text-zinc-700" href="/">Try Quivr</Link>
|
||||
<Link className="text-zinc-900 hover:text-zinc-700" href="/blog">Blog</Link>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
@ -81,16 +87,18 @@ const Blog = ({ result }: InferGetStaticPropsType<typeof getStaticProps>) => {
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
|
||||
{result.map(post => (
|
||||
<div key={post.id}>
|
||||
<Link href={`/blog/${post.attributes.slug}`}>
|
||||
<Image
|
||||
src={`${post.attributes.seo.metaImage.data.attributes.formats.medium.url}`}
|
||||
alt="Blog Post Image"
|
||||
width={600}
|
||||
height={400}
|
||||
className="w-full rounded-lg object-cover"
|
||||
className="w-full rounded-lg object-cover cursor-pointer"
|
||||
/>
|
||||
</Link>
|
||||
<h3 className="text-xl font-bold mb-2 mt-4">{post.attributes.seo.metaTitle}</h3>
|
||||
<p className="text-zinc-500">{post.attributes.description}</p>
|
||||
<Link className="text-blue-500 hover:text-blue-700 mt-4" href={`/blog/${post.id}`}>
|
||||
<p className="text-zinc-500">{post.attributes.seo.metaDescription}</p>
|
||||
<Link className="text-blue-500 hover:text-blue-700 mt-4" href={`/blog/${post.attributes.slug}`}>
|
||||
Read More
|
||||
</Link>
|
||||
</div>
|
||||
|
Loading…
Reference in New Issue
Block a user