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 <[email protected]> Claude-Session: https://claude.ai/code/session_013dunTcReWMKhWgCPkvAVHD
This commit is contained in:
1 parent
0508c6328e
commit
8742ce714c
11 files changed
+323
-130
No files matched your search
@@ -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<string, string[]> = {};
|
||||
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 (
|
||||
<CatalogClient
|
||||
key={`${category}:${collection}:${query}:${section}`}
|
||||
key={`${category}:${collection}:${query}`}
|
||||
products={products}
|
||||
categoryGroups={categoryGroups}
|
||||
initialCategory={category}
|
||||
initialCollection={collection}
|
||||
initialQuery={query}
|
||||
|
||||
Reference in new issue
Block a user