import Link from "next/link"; import FavoriteToggle from "../../components/FavoriteToggle"; import { serverFetch } from "../../lib/api"; function toText(value: unknown, fallback = "") { return typeof value === "string" && value ? value : fallback; } function toNumber(value: unknown, fallback = 0) { return typeof value === "number" ? value : Number(value) || fallback; } function asArray(value: unknown): string[] { return Array.isArray(value) ? value.map((item) => String(item)) : []; } function availabilityLabel(value: string) { if (value === "available") { return "Aceptando trabajos"; } if (value === "limited") { return "Disponibilidad limitada"; } if (value === "unavailable") { return "No acepta trabajos"; } return value || "Aceptando trabajos"; } function workImage(work: Record | undefined, fallback = "/demo/work-custom.svg") { return work ? toText(work.image_url, fallback) : fallback; } export default async function MakerPage({ params }: { params: Promise<{ slug: string }> }) { const { slug } = await params; const data = await serverFetch<{ maker: Record; services: Array>; showcases: Array>; works: Array>; reviews: Array>; }>(`/makers/${slug}`); const { maker, services, showcases, works, reviews } = data; const makerName = toText(maker.business_name, "Maker"); const makerImage = toText(maker.main_image_url, workImage(works[0], "/demo/maker-hero-1.svg")); const rating = toNumber(maker.avg_rating, 4.9).toFixed(1); const allowVerifiedReviews = maker.allow_verified_reviews !== false; const showSatisfactionScore = maker.show_satisfaction_score !== false; const showReviewTags = maker.show_review_tags !== false; const showPastReviews = maker.show_past_reviews !== false; const visibleReviews = showPastReviews ? reviews : []; const reviewCount = showPastReviews ? Math.max(toNumber(maker.review_count, reviews.length), reviews.length) : 0; const contactHref = `/consultas/nueva?makerId=${encodeURIComponent(String(maker.id))}&sourceType=profile&makerName=${encodeURIComponent(makerName)}&contextTitle=${encodeURIComponent(makerName)}&returnTo=${encodeURIComponent(`/makers/${slug}`)}`; const tabs = [ "Destacado", `Trabajos (${works.length})`, `Servicios (${services.length})`, `Escaparates (${showcases.length})`, `Opiniones (${visibleReviews.length})`, "Informacion" ]; const statCards = [ { value: rating, label: "Reputacion", icon: "*" }, ...(showSatisfactionScore ? [{ value: "96%", label: "Satisfaccion", icon: "ok" }] : []), { value: "~1 h", label: "Respuesta", icon: "rz" }, { value: "Alta", label: "Confianza", icon: "cf" } ]; const publicBadges = [ ...(reviewCount ? ["Trabajo verificado"] : []), ...(reviewCount >= 2 ? ["Cliente recurrente"] : []), "Respuesta rapida", "Confianza + Transparencia" ]; const socialLinks = [ ["Web", toText(maker.website_url)], ["Instagram", toText(maker.instagram_url)], ["TikTok", toText(maker.tiktok_url)], ["X", toText(maker.twitter_url)], ["Facebook", toText(maker.facebook_url)], ["YouTube", toText(maker.youtube_url)], ["LinkedIn", toText(maker.linkedin_url)] ].filter(([, href]) => href); return (
{makerName}
<
1/6
{makerName.slice(0, 2).toUpperCase()}

{makerName}

{availabilityLabel(toText(maker.availability, "available"))}
* {rating} ({reviewCount} resenas verificadas)

{toText(maker.city, "Cordoba")}, {toText(maker.province, "Argentina")} | 1,2 km

{statCards.map((stat) => (
{stat.value} {stat.label} {stat.icon}
))}
{showReviewTags ? (
{publicBadges.map((badge) => {badge})}
) : null}
{services.slice(0, 5).map((service) => ( {toText(service.category, "Servicio")} ))} {services.length === 0 ? Impresion 3D : null}
i
Por que te lo recomendamos?
  • A 1,2 km de tu ubicacion
  • Especialista en trabajos funcionales
  • {works.length} trabajos verificados
  • Excelente calidad/precio
Destacado

Especialidades

{["Repuestos", "Ingenieria", "Automotor", "Diseno CAD", "Prototipos"].map((item) => ( {item} ))}

Escaparates

Ver todos
{showcases.slice(0, 4).map((showcase) => ( {toText(showcase.title, "Escaparate")} {Array.isArray(showcase.selected_work_ids) ? showcase.selected_work_ids.length : 0} trabajos ))} {showcases.length === 0 ? ( Trabajos destacados {Math.max(works.length, 1)} trabajos ) : null}

Trabajos destacados

Ver todos
{works.map((work) => ( {toText(work.title)} {toText(work.title)} {toText(work.technology, "FDM")} | {toText(work.material, "PLA")} * {rating} ))}

Servicios y precios

Ver todos
{services.map((service) => ( {toText(service.title)}
{toText(service.title)} {asArray(service.materials).slice(0, 3).join(" | ") || toText(service.category)} Desde ${Math.round(toNumber(service.price_from_cents, 0) / 100).toLocaleString("es-AR")}
> ))}

Opinion destacada

Ver todas
{!allowVerifiedReviews ? (
Este maker pauso temporalmente las nuevas reseƱas verificadas.
) : null} {!showPastReviews ? (
Este maker mantiene privadas sus resenas anteriores.
) : null} {showPastReviews ? visibleReviews.slice(0, 2).map((review) => (
Trabajo verificado {toNumber(review.rating_overall, 5).toFixed(1)} / 5

{toText(review.comment, "Excelente comunicacion y calidad. Cumplio con el plazo y el resultado fue perfecto.")}

)) : null} {showPastReviews && visibleReviews.length === 0 ?
Todavia no hay opiniones publicadas.
: null}

Informacion del maker

{toText(maker.description, "Especialista en piezas funcionales, prototipos y trabajos con contexto real.")}

{socialLinks.length ? (
{socialLinks.map(([label, href]) => { const safeHref = href.startsWith("http") ? href : `https://${href}`; return ( {label} ); })}
) : null}
); }