fix(ecommerce): detalle de producto en dynamic render, no SSG+ISR stale #8

Merged
devops merged 1 commits from fix/product-detail-static-mock-price into main 2026-08-13 07:02:12 +00:00
+11 -11
View File
@@ -9,17 +9,17 @@ import { getProductBySlug, getProducts } from "@/lib/headless/client";
interface ProductPageProps { params: Promise<{ slug: string }> } interface ProductPageProps { params: Promise<{ slug: string }> }
// Sin esto, la página queda estática para siempre con los datos del build // generateStaticParams + revalidate quedaban aquí para pre-renderizar en
// (que usa el catálogo mock porque HEADLESS_PROVIDER/MEDUSA_* no existen en // build time, pero HEADLESS_PROVIDER/MEDUSA_* no existen en el contexto del
// el contexto del Docker build). El listado sí se refresca porque su ruta // Docker build: el snapshot estático quedaba congelado con el catálogo mock
// es dinámica por searchParams; esta ruta necesita el revalidate explícito // (todos los productos con price: null) hasta que ISR lo revalidara. Con
// para que el runtime (que sí tiene las env vars de Medusa) la regenere. // frontend-deploy corriendo 2 réplicas y sin cacheHandler compartido, cada
export const revalidate = 60; // pod revalida su propia caché de forma independiente, así que un producto
// podía mostrar "Consultar precio" en un pod y el precio real en el otro
export async function generateStaticParams() { // según cuál hubiera sido "calentado". force-dynamic elimina esa caché por
const products = await getProducts(); // pod y deja esta ruta en vivo contra Medusa, igual que el listado
return products.map((product) => ({ slug: product.slug })); // (dinámico por searchParams).
} export const dynamic = "force-dynamic";
export async function generateMetadata({ params }: ProductPageProps): Promise<Metadata> { export async function generateMetadata({ params }: ProductPageProps): Promise<Metadata> {
const { slug } = await params; const { slug } = await params;