From 206571627b0628eb09c2aa4121208004ac81f795 Mon Sep 17 00:00:00 2001 From: Cristian Felipe Cruz Buitron Date: Mon, 24 Aug 2026 23:42:57 -0500 Subject: [PATCH] fix(ecommerce): forzar renderizado dinamico en home y layout raiz MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug preexistente (no introducido en esta sesion, solo expuesto): "/" se prerenderizaba en build time dentro del Dockerfile, donde HEADLESS_PROVIDER/MEDUSA_* no existen todavia (solo se inyectan en runtime via el Deployment de k8s) -- el provider caia a "mock" y ese HTML quedaba cacheado 1 año (confirmado en vivo: x-nextjs-prerender:1, Cache-Control: s-maxage=31536000, x-nextjs-cache:HIT). El carrusel de "Novedades" del home ya mostraba productos mock desde antes; recien se noto con el nav data-driven de la sub-fase 2 porque las categorias mock ("Figuras"/"Peluches"/"Mochilas") son obviamente distintas a las reales. /catalog y /product/[slug] no sufren esto porque ya son dinamicos (searchParams / params fuerzan SSR). export const dynamic = "force-dynamic" en app/page.tsx y app/layout.tsx (el layout comparte el fetch del Navbar con TODAS las rutas -- forzarlo ahi tambien protege contra que una pagina futura reintroduzca el mismo bug). Decision del usuario: priorizar datos reales sobre el cacheo estatico de 1 año. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_013dunTcReWMKhWgCPkvAVHD --- workloads/ecommerce/app/layout.tsx | 7 +++++++ workloads/ecommerce/app/page.tsx | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/workloads/ecommerce/app/layout.tsx b/workloads/ecommerce/app/layout.tsx index 6b490b4..2293db6 100644 --- a/workloads/ecommerce/app/layout.tsx +++ b/workloads/ecommerce/app/layout.tsx @@ -6,6 +6,13 @@ import { Navbar } from "@/components/layout/navbar"; import { WishlistDrawer } from "@/components/wishlist/wishlist-drawer"; import { getCategories, getProducts } from "@/lib/headless/client"; +// El Navbar (categorias/colecciones/predictive search) vive en este layout +// compartido -- si alguna pagina futura queda estatica, este fetch se +// congelaria con datos de build time (mock) igual que le paso al home +// (ver app/page.tsx). Forzarlo aca protege el nav en cualquier ruta, no +// solo en las que hoy ya son dinamicas por otro motivo (searchParams, etc.). +export const dynamic = "force-dynamic"; + export const metadata: Metadata = { metadataBase: new URL(process.env.NEXT_PUBLIC_SITE_URL ?? "https://shop.cruzcloud.net"), title: { default: "ARI Shopping | Juguetes, regalos y variedades", template: "%s | ARI Shopping" }, diff --git a/workloads/ecommerce/app/page.tsx b/workloads/ecommerce/app/page.tsx index 138d724..0e91d18 100644 --- a/workloads/ecommerce/app/page.tsx +++ b/workloads/ecommerce/app/page.tsx @@ -7,6 +7,13 @@ import { ProductCarousel } from "@/components/product/product-carousel"; import { Button } from "@/components/ui/button"; import { getCategories, getProducts } from "@/lib/headless/client"; +// Sin esto, Next.js prerenderiza "/" en build time dentro del Dockerfile, +// donde HEADLESS_PROVIDER/MEDUSA_* todavia no existen (solo se inyectan en +// runtime via el Deployment) -- cae al provider mock y ese HTML queda +// cacheado 1 año (visto en vivo: x-nextjs-prerender:1, s-maxage=31536000), +// violando el flujo Admin -> revalidate del ADR 0005 justo en el home. +export const dynamic = "force-dynamic"; + export default async function HomePage() { const [products, categories] = await Promise.all([getProducts(), getCategories()]); const treasures = products.filter((product) => product.isNew || product.featured).slice(0, 8);