import type { Metadata } from "next"; import { notFound } from "next/navigation"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion"; import { MobileAddToCart } from "@/components/product/mobile-add-to-cart"; import { ProductCarousel } from "@/components/product/product-carousel"; import { ProductGallery } from "@/components/product/product-gallery"; import { ProductPurchase } from "@/components/product/product-purchase"; import { getProductBySlug, getProducts } from "@/lib/headless/client"; interface ProductPageProps { params: Promise<{ slug: string }> } // Sin esto, la página queda estática para siempre con los datos del build // (que usa el catálogo mock porque HEADLESS_PROVIDER/MEDUSA_* no existen en // el contexto del Docker build). El listado sí se refresca porque su ruta // es dinámica por searchParams; esta ruta necesita el revalidate explícito // para que el runtime (que sí tiene las env vars de Medusa) la regenere. export const revalidate = 60; export async function generateStaticParams() { const products = await getProducts(); return products.map((product) => ({ slug: product.slug })); } export async function generateMetadata({ params }: ProductPageProps): Promise { const { slug } = await params; const product = await getProductBySlug(slug); return product ? { title: product.name, description: product.shortDescription, openGraph: { images: [product.image] } } : { title: "Producto" }; } export default async function ProductPage({ params }: ProductPageProps) { const { slug } = await params; const product = await getProductBySlug(slug); if (!product) notFound(); const products = await getProducts(); const recommended = products.filter((candidate) => candidate.id !== product.id && (candidate.category === product.category || candidate.collection === product.collection)).slice(0, 8); return <>
{product.category} · {product.collection}

{product.name}

{product.description}

Detalles del productoMarca: {product.brand}. Edad recomendada: {product.ageRange}. La disponibilidad y presentación final se confirman con Ari Shopping.Envíos y entregasCoordinamos envíos nacionales y entrega según ubicación. Los tiempos se confirman durante la cotización.
{recommended.length > 0 &&

También te puede gustar

}; }