import Link from "next/link"; import { notFound } from "next/navigation"; import type { Metadata } from "next"; import { Sparkle } from "@/components/Sparkle"; import { SiteHeader } from "@/components/SiteHeader"; import { SiteFooter } from "@/components/SiteFooter"; import { VitrineImage } from "@/components/VitrineImage"; import { PromoImage } from "@/components/PromoImage"; import { getMemberLivePromotions, getPublicMember } from "@/lib/queries"; export const dynamic = "force-dynamic"; const STRIPE_WARM = "repeating-linear-gradient(45deg,#efe9da,#efe9da 12px,#e6ddc9 12px,#e6ddc9 24px)"; const COVER_STRIPE = "repeating-linear-gradient(45deg,#e9e1cd,#e9e1cd 16px,#e2d8c1 16px,#e2d8c1 32px)"; const TAG_COLORS = [ { bg: "#f6efdc", color: "#9a6638" }, { bg: "#e7f0f3", color: "#3f8aa3" }, { bg: "#eef0ec", color: "#5a7a5a" }, { bg: "#eaf0f6", color: "#2C6FB3" }, ]; function badgeColor(badge: string | null) { if (!badge) return "#1f8a5b"; return badge.includes("%") ? "#d8472b" : "#1f8a5b"; } function initialsOf(name: string) { return name.split(/\s+/).map((w) => w[0]).join("").slice(0, 2).toUpperCase(); } export async function generateMetadata({ params, }: { params: Promise<{ id: string }>; }): Promise { const { id } = await params; const member = await getPublicMember(Number(id)); if (!member) return { title: "Adhérent — Plein R" }; return { title: `${member.name} — Plein R`, description: member.description ?? undefined }; } export default async function FicheAdherentPage({ params, }: { params: Promise<{ id: string }>; }) { const { id } = await params; const memberId = Number(id); if (!memberId) notFound(); const member = await getPublicMember(memberId); if (!member || member.status !== "active") notFound(); const promos = await getMemberLivePromotions(memberId); const accent = member.accent ?? "#E0A63C"; const fullAddress = [member.address, [member.postalCode, member.city].filter(Boolean).join(" ")] .filter(Boolean) .join(" · "); const mapQuery = encodeURIComponent( [member.address, member.postalCode, member.city].filter(Boolean).join(", ") ); const paragraphs = (member.description ?? "").split("\n").map((s) => s.trim()).filter(Boolean); const tags = (member.tags ?? "").split(",").map((s) => s.trim()).filter(Boolean); const hours = (member.hours ?? "") .split("\n") .map((line) => line.split("|").map((s) => s.trim())) .filter((p) => p[0]); const sectionCard: React.CSSProperties = { background: "#fff", border: "1px solid #e6dcc6", borderRadius: 18, padding: "26px 28px", }; const h2: React.CSSProperties = { fontWeight: 700, fontSize: 20, margin: "0 0 12px", color: "#26201a", }; return (
{/* breadcrumb */}
Annuaire {member.categoryLabel && (<>›{member.categoryLabel})} › {member.name}
{/* cover + identity */}
{member.logoUrl ? ( // eslint-disable-next-line @next/next/no-img-element {member.name} ) : ( {initialsOf(member.name)} )}

{member.name}

{member.categoryLabel && ( {member.categoryLabel} )}
{[fullAddress, member.memberSince ? `Adhérent depuis ${member.memberSince}` : null].filter(Boolean).join(" · ")}
{member.phone && ( Appeler )} {mapQuery && ( Itinéraire )}
{/* two columns */}
{/* LEFT */}
{/* about */}

À propos de l'établissement

{paragraphs.length > 0 ? ( paragraphs.map((p, i) => (

{p}

)) ) : (

Présentation à venir.

)} {tags.length > 0 && (
{tags.map((t, i) => { const c = TAG_COLORS[i % TAG_COLORS.length]; return ( {t} ); })}
)}
{/* practical info */}

Informations pratiques

Horaires
{hours.length > 0 ? (
{hours.map(([label, range], i) => { const closed = (range ?? "").toLowerCase().includes("ferm"); return (
{label} {range}
); })}
) : (
Horaires non communiqués.
)}
Contact
{member.phone && (
{member.phone}
)} {member.email && ( {member.email} )} {member.website && ( {member.website.replace(/^https?:\/\//, "")} )} {!member.phone && !member.email && !member.website && (
Coordonnées non communiquées.
)}
{/* map */} {mapQuery && (