diff --git a/src/app/product/[id]/page.tsx b/src/app/product/[id]/page.tsx index 7fa0105..6190d65 100644 --- a/src/app/product/[id]/page.tsx +++ b/src/app/product/[id]/page.tsx @@ -1,4 +1,3 @@ -// src/app/product/[id]/page.tsx import { notFound } from "next/navigation"; import Link from "next/link"; import { ArrowLeft, Truck, ShieldCheck } from "lucide-react"; @@ -7,37 +6,51 @@ import { Product } from "@/types"; import ProductCard from "@/components/ui/ProductCard"; import ProductActions from "@/components/product/ProductActions"; -// 1. Función para obtener el producto actual +// 1. Función para obtener el producto actual + NOMBRE de categoría async function getProduct(id: string) { + // Solicitamos el producto y hacemos JOIN con la tabla categories const { data, error } = await supabase .from('products') - .select('*') + .select(` + *, + categories ( + name + ) + `) .eq('id', id) .single(); if (error || !data) return null; - return data as Product; + + const categoryName = data.categories?.name || "General"; + + const productWithCategory = { + ...data, + category: categoryName, // Llenamos el campo visual con el nombre real + }; + + return productWithCategory as unknown as Product; } -// 2. Función para obtener productos relacionados -async function getRelatedProducts(category: string, currentId: string) { +// 2. Función para obtener productos relacionados (por ID de categoría) +async function getRelatedProducts(categoryId: string, currentId: string) { const { data } = await supabase .from('products') .select('*') - .eq('category', category) + .eq('category_id', categoryId) // Filtramos por ID, es más seguro .neq('id', currentId) .eq('is_active', true) .limit(3); + // Como estos son para tarjetas pequeñas, si no tienen el nombre de la categoría mapeado + // no es crítico, pero idealmente haríamos el mismo join si quisiéramos mostrarlo. return (data as Product[]) || []; } -// 3. DEFINICIÓN DEL COMPONENTE (Aquí estaba el error de tipos) -// En lugar de una interfaz separada, tipamos inline para evitar conflictos con Next.js 15 +// 3. DEFINICIÓN DEL COMPONENTE export default async function ProductPage(props: { params: Promise<{ id: string }> }) { - // Await obligatorio en Next.js 15 antes de acceder a params const params = await props.params; const { id } = params; @@ -47,14 +60,18 @@ export default async function ProductPage(props: { notFound(); } - const relatedProducts = await getRelatedProducts(product.category, product.id); + // Usamos category_id para buscar relacionados + const relatedProducts = await getRelatedProducts(product.category_id, product.id); const imageUrl = getProductImageUrl(product.image_url); + // Fallback visual por si la categoría vino vacía + const displayCategory = product.category || "Colección"; + return (
{product.description || "Sin descripción disponible para este producto."}