From 8742ce714c6a89c01bd80074e1f64054c17ff45e Mon Sep 17 00:00:00 2001 From: Cristian Felipe Cruz Buitron Date: Mon, 24 Aug 2026 21:21:18 -0500 Subject: [PATCH] fix(ecommerce): nav y tiles data-driven contra la jerarquia real de categorias Sub-fase 2 de Etapa 2 (ADR 0005 seccion 6). Navbar y CategoryTiles usaban arrays hardcodeados (Figuras/Peluches/Mochilas/Marvel) que ya no coinciden con los nombres reales de categoria en Medusa desde que se elimino legacyProductMeta (PR #29) -- todos esos links de navegacion quedaron rotos silenciosamente (0 productos al filtrar). - lib/headless: nuevo tipo Category + metodo getCategories() en CatalogProvider (medusa via /store/product-categories, mock deriva de su catalogo plano, shopify sin implementar como el resto de sus metodos). - Navbar: arbol real de categorias (6 raices/21 nodos), dropdown de hijos por raiz en desktop, lista anidada en el sheet movil. Colecciones del sheet ahora se derivan de los productos reales en vez de un array hardcodeado con 2 nombres obsoletos (Marvel/Frozen vs. los reales Universo Marvel/Reino de Frozen). - CategoryTiles: tiles de home por categoria raiz real; imagen solo donde ya existe asset, gradiente honesto donde no (no hay fotografia para las 6 raices todavia, deuda explicita del ADR). - catalog-client/catalog page: cuando el query param `category` es una raiz con hijos, se expande a los nombres reales de sus hijos para que el filtro (igualdad exacta de producto.category) siga funcionando -- sin esto, tiles/nav apuntando a una raiz mostrarian 0 productos porque ningun producto tiene la raiz asignada directamente. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_013dunTcReWMKhWgCPkvAVHD --- workloads/ecommerce/app/catalog/page.tsx | 22 +- workloads/ecommerce/app/layout.tsx | 6 +- workloads/ecommerce/app/page.tsx | 6 +- .../components/catalog/catalog-client.tsx | 12 +- .../components/home/category-tiles.tsx | 68 ++++- .../ecommerce/components/layout/navbar.tsx | 268 +++++++++++------- workloads/ecommerce/lib/headless/client.ts | 4 + .../lib/headless/providers/medusa.ts | 42 +++ .../ecommerce/lib/headless/providers/mock.ts | 14 +- .../lib/headless/providers/shopify.ts | 3 + workloads/ecommerce/lib/headless/types.ts | 8 + 11 files changed, 323 insertions(+), 130 deletions(-) diff --git a/workloads/ecommerce/app/catalog/page.tsx b/workloads/ecommerce/app/catalog/page.tsx index 5d5c175..deca906 100644 --- a/workloads/ecommerce/app/catalog/page.tsx +++ b/workloads/ecommerce/app/catalog/page.tsx @@ -1,6 +1,6 @@ import type { Metadata } from "next"; import { CatalogClient } from "@/components/catalog/catalog-client"; -import { getProducts } from "@/lib/headless/client"; +import { getCategories, getProducts } from "@/lib/headless/client"; export const metadata: Metadata = { title: "Catálogo", @@ -17,17 +17,31 @@ function single(value: string | string[] | undefined): string { export default async function CatalogPage({ searchParams }: CatalogPageProps) { const params = await searchParams; - const products = await getProducts(); + const [products, categories] = await Promise.all([getProducts(), getCategories()]); const category = single(params.category) || "Todos"; const collection = single(params.collection); const query = single(params.q); - const section = single(params.section); + + // Los links de navbar/tiles apuntan a categorias raiz (ej. "Mochilas y + // morrales"), pero ningun producto tiene esa categoria asignada + // directamente -- solo sus hijos ("Marvel", "Frozen", etc.). Este mapa + // expande cada raiz-con-hijos al nombre real de sus hijos para que el + // filtro siga funcionando por igualdad exacta de `product.category`. + const categoryGroups: Record = {}; + for (const node of categories) { + if (node.parentId) continue; + const children = categories.filter((child) => child.parentId === node.id); + if (children.length > 0) { + categoryGroups[node.name] = children.map((child) => child.name); + } + } return ( ) { - const products = await getProducts(); - return
{children}