import { notFound } from 'next/navigation';
import Image from 'next/image';
import Link from 'next/link';
import { productCategories, portfolioProjects } from '@/data/site-config';
import type { ProductCategory, FAQItem } from '@/types';
interface Props {
params: { slug: string[] };
}
// Generate all possible paths from product categories and portfolio projects
export async function generateStaticParams() {
const paths: { slug: string[] }[] = [];
// Add product category paths
productCategories.forEach((product) => {
// Remove leading slash and split the href
const pathParts = product.href.replace(/^\//, '').replace(/\/$/, '').split('/');
paths.push({ slug: pathParts });
});
// Add portfolio project paths
portfolioProjects.forEach((project) => {
const pathParts = project.href.replace(/^\//, '').replace(/\/$/, '').split('/');
paths.push({ slug: pathParts });
});
return paths;
}
type ContentType = 'product' | 'portfolio';
function findContentBySlug(slug: string[]): { type: ContentType; data: ProductCategory | typeof portfolioProjects[0] } | null {
// Decode URL-encoded slug parts
const decodedSlug = slug.map(part => decodeURIComponent(part));
const fullPath = '/' + decodedSlug.join('/') + '/';
// Check products first
const product = productCategories.find((p) => p.href === fullPath);
if (product) {
return { type: 'product', data: product };
}
// Check portfolio projects
const portfolio = portfolioProjects.find((p) => p.href === fullPath);
if (portfolio) {
return { type: 'portfolio', data: portfolio };
}
return null;
}
export async function generateMetadata({ params }: Props) {
const content = findContentBySlug(params.slug);
if (!content) {
return { title: 'ไม่พบหน้า' };
}
const { type, data } = content;
if (type === 'product') {
const product = data as ProductCategory;
const title = product.keywords?.[0]
? `${product.name} | ${product.keywords[0]} - ดีลพลัสเทค`
: `${product.name} - ${product.nameEn} | ดีลพลัสเทค`;
return {
title,
description: product.description,
keywords: product.keywords?.join(', '),
openGraph: {
title: product.name,
description: product.description,
images: [product.image],
type: 'website',
},
};
}
return {
title: data.name,
description: data.description,
};
}
// Schema.org JSON-LD for Products
function ProductSchema({ product }: { product: ProductCategory }) {
const schema = {
'@context': 'https://schema.org',
'@type': 'Product',
name: product.name,
description: product.description,
image: product.image,
brand: {
'@type': 'Brand',
name: product.schemaData?.brand || product.nameEn,
},
manufacturer: {
'@type': 'Organization',
name: product.schemaData?.manufacturer || 'ดีลพลัสเทค',
},
...(product.schemaData?.sku && { sku: product.schemaData.sku }),
...(product.schemaData?.mpn && { mpn: product.schemaData.mpn }),
...(product.schemaData?.material && { material: product.schemaData.material }),
category: product.schemaData?.category || 'Industrial Pipe & Equipment',
offers: {
'@type': 'Offer',
availability: 'https://schema.org/InStock',
priceCurrency: 'THB',
seller: {
'@type': 'Organization',
name: 'ดีลพลัสเทค',
},
},
};
return (
);
}
// FAQ Schema for SEO
function FAQSchema({ faq }: { faq: FAQItem[] }) {
const schema = {
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: faq.map((item) => ({
'@type': 'Question',
name: item.question,
acceptedAnswer: {
'@type': 'Answer',
text: item.answer,
},
})),
};
return (
);
}
export default function DynamicPage({ params }: Props) {
const content = findContentBySlug(params.slug);
if (!content) {
notFound();
}
const { type, data } = content;
// Render portfolio project page
if (type === 'portfolio') {
return
{product.description}
{/* CTA */}| {spec.label} | {spec.value}{spec.unit ? ` ${spec.unit}` : ''} |
{project.description}
{/* CTA */}