import { client, urlFor } from "@/sanity/lib/client"; import { PortableText } from "@portabletext/react"; import Image from "next/image"; import Link from "next/link"; import { ArrowLeft, Rss } from "lucide-react"; import { notFound } from "next/navigation"; import { format } from "date-fns"; import PrismLoader from "@/components/PrismLoader"; import Prism from "prismjs"; import "prismjs/components/prism-javascript"; import "prismjs/components/prism-python"; import "prismjs/components/prism-php"; import "prismjs/components/prism-bash"; import "prismjs/components/prism-sql"; import "prismjs/components/prism-yaml"; import "prismjs/components/prism-markdown"; import "prismjs/components/prism-json"; import "prismjs/components/prism-perl"; import "prismjs/components/prism-nginx"; import "./_styles/prism-twilight.css"; import "./_styles/prism.twilight.min.css"; async function getData(slug) { const query = ` *[_type == "blog" && slug.current == '${slug.replace(/'/g, "\\'")}'] { "currentSlug": slug.current, title, content, smallDescription, titleImage, _createdAt }[0]`; const data = await client.fetch(query, {}, { cache: "no-store" }); return data; } export const dynamic = "force-static"; export async function generateMetadata(props) { const params = await props.params; const data = await getData(params.slug); if (!data) { return { title: "404 Not Found - MERNMail", openGraph: { title: "404 Not Found - MERNMail" }, twitter: { title: "404 Not Found - MERNMail" } }; } return { title: `${data.title} - MERNMail`, description: data.smallDescription, openGraph: { title: `${data.title} - MERNMail`, description: data.smallDescription, url: `${process.env.NEXT_PUBLIC_WEBSITE_URL}/blog/${data.currentSlug}`, type: "website", images: [ { url: data.titleImage ? urlFor(data.titleImage).url() : `${process.env.NEXT_PUBLIC_WEBSITE_URL}/blog-missing.png`, width: 2560, height: 1440, alt: `${data.title} - MERNMail` } ] }, twitter: { card: "summary_large_image", site: "@MERNMail", title: `${data.title} - MERNMail`, description: data.smallDescription, images: [ data.titleImage ? urlFor(data.titleImage).url() : `${process.env.NEXT_PUBLIC_WEBSITE_URL}/blog-missing.png` ], creator: "@MERNMail" } }; } const customPortableTextComponents = { types: { image: ({ value }) => { return (
{value.alt {value.caption && (

{value.caption}

)}
); }, code: ({ value }) => { const language = value.language || "none"; const grammar = Prism.languages[language]; if (language != "none" && !grammar) { console.error(`No grammar found for language: "${language}"`); } return (
            {value.code}
          
{language == "none" ? "" : }
); } } }; export default async function BlogSlugArticle(props) { const params = await props.params; const data = await getData(params.slug); if (!data) { notFound(); } const formattedDate = format(new Date(data._createdAt), "MMMM d, yyyy"); return ( <>
Back Subscribe to RSS

{data.title}

{data.title}

Published on: {formattedDate}

); } export async function generateStaticParams() { const query = `*[_type == 'blog']{ "slug": slug.current, }`; const slugsRaw = await client.fetch(query); return slugsRaw; }