import type { Metadata } from 'next'; import { notFound } from 'next/navigation'; import { AddToCart } from 'components/cart/add-to-cart'; import { Gallery } from 'components/product/gallery'; import { ProductProvider } from 'components/product/product-context'; import { ProductDescription } from 'components/product/product-description'; import { VariantSelector } from 'components/product/variant-selector'; import Prose from 'components/prose'; import { HIDDEN_PRODUCT_TAG } from 'lib/constants'; import { isStrinInteger } from 'lib/utils'; import { Image } from 'lib/woocomerce/models/base'; import { Product, ProductVariations } from 'lib/woocomerce/models/product'; import { woocommerce } from 'lib/woocomerce/woocommerce'; import Link from 'next/link'; import { Suspense } from 'react'; export async function generateMetadata(props: { params: Promise<{ name: string }>; }): Promise { const params = await props.params; let product: Product | undefined = undefined; if (isStrinInteger(params.name)) { product = await woocommerce.get(`products/${params.name}`); } else { product = (await woocommerce.get('products', { slug: params.name }))?.[0]; } if (!product) return notFound(); const indexable = !product.tags.find((tag) => tag.name?.includes(HIDDEN_PRODUCT_TAG)); return { title: product.name, description: product.description, robots: { index: indexable, follow: indexable, googleBot: { index: indexable, follow: indexable } } }; } async function RelatedProducts({ product }: { product: Product }) { const relatedProducts = await Promise.all( product.related_ids?.map(async (id) => woocommerce.get(`products/${id}`)) || [] ); return ( <> {relatedProducts.length > 0 && (

Related Products

{relatedProducts.map((relatedProduct) => { return ( {relatedProduct.name}

{relatedProduct.name}

); })}
)} ); } export default async function ProductPage(props: { params: Promise<{ name: string }> }) { const params = await props.params; let product: Product | undefined = undefined; if (isStrinInteger(params.name)) { product = await woocommerce.get(`products/${params.name}`); } else { product = (await woocommerce.get('products', { slug: params.name }))?.[0]; } let variations: ProductVariations[] = []; if (product?.variations?.length) { variations = await woocommerce.get(`products/${product?.id}/variations`); } if (!product) return notFound(); const productJsonLd = { '@context': 'https://schema.org', '@type': 'Product', name: product.name, description: product.description, image: product.images?.[0]?.src, offers: { '@type': 'AggregateOffer', availability: product.stock_quantity > 0 ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock', priceCurrency: product.price, highPrice: product.max_price, lowPrice: product.min_price } }; return (