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
@@ -9,6 +9,7 @@ import type { Product } from "@/lib/headless/types";
|
||||
|
||||
type CatalogClientProps = {
|
||||
products: Product[];
|
||||
categoryGroups?: Record<string, string[]>;
|
||||
initialCategory?: string;
|
||||
initialCollection?: string;
|
||||
initialQuery?: string;
|
||||
@@ -16,6 +17,7 @@ type CatalogClientProps = {
|
||||
|
||||
export function CatalogClient({
|
||||
products,
|
||||
categoryGroups = {},
|
||||
initialCategory = "Todos",
|
||||
initialCollection = "",
|
||||
initialQuery = "",
|
||||
@@ -48,6 +50,12 @@ export function CatalogClient({
|
||||
setMaxPrice(maxCatalogPrice);
|
||||
}, [initialCategory, initialCollection, initialQuery, maxCatalogPrice]);
|
||||
|
||||
// Si `category` es una raiz con hijos (ej. "Mochilas y morrales"), se
|
||||
// expande a la lista de nombres reales de sus hijos -- ningun producto
|
||||
// tiene la raiz asignada directamente. Si no es una raiz conocida, se
|
||||
// trata como el nombre de categoria exacto de siempre.
|
||||
const allowedCategories = categoryGroups[category] ?? [category];
|
||||
|
||||
const filtered = useMemo(
|
||||
() =>
|
||||
products
|
||||
@@ -63,7 +71,7 @@ export function CatalogClient({
|
||||
|
||||
return (
|
||||
(!query || search.includes(query.toLowerCase())) &&
|
||||
(category === "Todos" || product.category === category) &&
|
||||
(category === "Todos" || allowedCategories.includes(product.category)) &&
|
||||
(!collection || product.collection === collection) &&
|
||||
(brand === "Todas" || product.brand === brand) &&
|
||||
(age === "Todas" || product.ageRange === age) &&
|
||||
@@ -77,7 +85,7 @@ export function CatalogClient({
|
||||
? Number(b.isNew) - Number(a.isNew)
|
||||
: Number(b.featured) - Number(a.featured),
|
||||
),
|
||||
[age, brand, category, collection, maxPrice, products, query, sort],
|
||||
[age, allowedCategories, brand, category, collection, maxPrice, products, query, sort],
|
||||
);
|
||||
|
||||
const reset = () => {
|
||||
|
||||
Reference in new issue
Block a user