"use client"; import { useEffect, useRef } from "react"; import Link from "next/link"; import FavoriteToggle from "./FavoriteToggle"; type PublicMaker = { id: string; slug: string; business_name: string; }; type PublicWork = { id: string; slug: string; title: string; summary: string; technology: string; material: string; image_url: string | null; gallery_urls: string[] | null; maker_id: string; maker_slug: string; maker_name: string; avg_rating: number | string; review_count: number; }; type DiscoverCategory = "all" | "fdm" | "resin" | "design-3d" | "repuestos" | "ingenieria"; const discoverReturnKey = "makers3d:discover:return-position"; function getRating(value: number | string) { const parsed = typeof value === "number" ? value : Number(value); return Number.isFinite(parsed) ? parsed : 0; } function workImages(work: PublicWork) { const images = [work.image_url, ...(work.gallery_urls || [])] .filter((image): image is string => Boolean(image)); return Array.from(new Set(images)).slice(0, 8); } function getWorkTags(work: PublicWork) { return [work.technology, work.material].filter(Boolean).slice(0, 3); } function matchesCategory(work: PublicWork, category: DiscoverCategory) { if (category === "all") { return true; } const haystack = [work.title, work.summary, work.technology, work.material, work.maker_name] .join(" ") .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") .toLowerCase(); if (category === "fdm") { return haystack.includes("fdm"); } if (category === "resin") { return haystack.includes("resina") || haystack.includes("resin"); } if (category === "design-3d") { return haystack.includes("diseno") || haystack.includes("diseƱo") || haystack.includes("cad"); } if (category === "repuestos") { return haystack.includes("repuesto") || haystack.includes("restauracion") || haystack.includes("pieza"); } return haystack.includes("ingenieria") || haystack.includes("industrial") || haystack.includes("tecnic"); } function orderWorks(works: PublicWork[]) { return [...works].sort((left, right) => { if (getRating(right.avg_rating) !== getRating(left.avg_rating)) { return getRating(right.avg_rating) - getRating(left.avg_rating); } return right.review_count - left.review_count; }); } function SearchIcon() { return ( ); } export default function DiscoverExperienceClient({ initialWorks, initialQuery, initialCategory }: { initialMakers: PublicMaker[]; initialWorks: PublicWork[]; initialQuery: string; initialCategory: DiscoverCategory; }) { const scrollRef = useRef(null); const works = orderWorks(initialWorks.filter((work) => matchesCategory(work, initialCategory))); useEffect(() => { const storedPosition = window.sessionStorage.getItem(discoverReturnKey); if (!storedPosition) { return; } try { const position = JSON.parse(storedPosition) as { scrollTop?: number; query?: string; category?: DiscoverCategory; }; if (position.query !== initialQuery || position.category !== initialCategory) { return; } const restore = () => { scrollRef.current?.scrollTo({ top: position.scrollTop || 0, behavior: "auto" }); }; requestAnimationFrame(restore); window.setTimeout(restore, 120); } catch { window.sessionStorage.removeItem(discoverReturnKey); } }, [initialCategory, initialQuery, works.length]); function rememberReturnPosition(workId: string) { window.sessionStorage.setItem( discoverReturnKey, JSON.stringify({ category: initialCategory, query: initialQuery, scrollTop: scrollRef.current?.scrollTop || 0, workId }) ); } return (
{initialCategory !== "all" ? : null}
{works.map((work, index) => { const images = workImages(work); return (
{images.map((image, imageIndex) => (
{`${work.title}
))}
{images.length > 1 ? ( ) : null} {images.length === 1 ? "1 foto" : `${images.length} fotos | desliza`}
rememberReturnPosition(work.id)} aria-label="Ver trabajo completo" >
{work.maker_name.slice(0, 2).toUpperCase()} {work.maker_name}
* {getRating(work.avg_rating).toFixed(1)} ({Math.max(work.review_count * 32, 12)})

{work.title}

rememberReturnPosition(work.id)} > Ver trabajo

{work.summary}

{getWorkTags(work).map((tag) => ( {tag} ))}
); })} {works.length === 0 ? (
Descubrir

No encontramos trabajos

Prueba otra busqueda para volver a explorar el portfolio de makers.

Ver todos
) : null}
); }