import React from 'react'; import type { Metadata } from 'next'; import Link from 'next/link'; import Image from 'next/image'; import { notFound, permanentRedirect } from 'next/navigation'; import SeoJsonLd from '@/components/SeoJsonLd'; import Breadcrumbs, { BreadcrumbItem } from '@/components/Breadcrumbs'; import { blogPostingSchema, breadcrumbSchema, howToSchema } from '@/lib/schema'; import { Button } from '@/components/ui/Button'; import { Badge } from '@/components/ui/Badge'; import { blogPosts, type BlogPostData } from '@/lib/blog-data'; export function generateStaticParams() { return Object.keys(blogPosts).map((slug) => ({ slug, })); } export function generateMetadata({ params }: { params: { slug: string } }): Metadata { // Prevent soft 404s for missing assets in metadata generation if (params.slug.match(/\.(png|jpg|jpeg|gif|svg|ico|json|txt|xml)$/i)) { return notFound(); } const post = blogPosts[params.slug]; if (!post) { return notFound(); } return { title: post.title, description: post.excerpt, openGraph: { title: post.title, description: post.excerpt, type: 'article', publishedTime: post.datePublished, modifiedTime: post.dateModified, authors: [post.author], images: [ { url: post.image, alt: post.imageAlt, }, ], }, twitter: { card: 'summary_large_image', title: post.title, description: post.excerpt, images: [post.image], }, }; } export default function BlogPostPage({ params }: { params: { slug: string } }) { // Prevent soft 404s for missing assets if (params.slug.match(/\.(png|jpg|jpeg|gif|svg|ico|json|txt|xml)$/i)) { notFound(); } const post = blogPosts[params.slug]; if (!post) { notFound(); } const breadcrumbItems: BreadcrumbItem[] = [ { name: 'Home', url: '/' }, { name: 'Blog', url: '/blog' }, { name: post.title, url: `/blog/${post.slug}` }, ]; const schemas: any[] = [ blogPostingSchema({ title: post.title, description: post.excerpt, slug: post.slug, author: post.author, authorUrl: post.authorUrl, datePublished: post.datePublished, dateModified: post.dateModified, image: post.image, }), breadcrumbSchema(breadcrumbItems), ]; if (post.howTo) { schemas.push(howToSchema(post.howTo)); } return ( <>
{post.category} {post.readTime} read By {post.author} {post.date}

{post.title}

{post.answer && (

Quick Answer

{post.answer}

)}
{post.imageAlt}
{post.howTo && (

{post.howTo.name}

{post.howTo.description}

    {post.howTo.steps.map((step: any, index: number) => (
  1. {index + 1}

    {step.name}

    {step.text}

  2. ))}
)}

Ready to Track Your QR Campaigns?

Start creating professional dynamic QR codes with advanced scan analytics, campaign tracking, and real-time insights.

{/* Related Articles Section */}

Related Articles

{Object.values(blogPosts) .filter((p) => p.slug !== post.slug) .map((relatedPost) => ( {relatedPost.category}

{relatedPost.title}

{relatedPost.excerpt}

Read more → ))}
); }