2026-07-18 10:58:36 +02:00
|
|
|
import type { Metadata } from "next"
|
Klubb-landingssiden er live på https://teecup.teeoff.no/clubs/{slug} — dermed er ADR-018 sine to planlagte frontend-skjermer komplette.
Én reell komponentkonflikt løst, ikke duplisert bort: TournamentCard var bygget kun for den innloggede dashbord-konteksten. I stedet for å lage en egen kopi for den offentlige klubbsiden, gjorde jeg orgId valgfri — satt gir innlogget lenke, utelatt gir /t/{id} i stedet. Samme kort, to kontekster. Bekreftet dashbordet fortsatt fungerer uendret.
V0 laget selv en rute denne gangen, men kalte parameteren [id] selv om det faktisk er en slug — skrev en egen, riktig navngitt [slug]-rute i stedet.
Verifisert mot ekte scratch-data gjennom en kjørende frontend-dev-server: en org med to turneringer (én offentlig, én org-privat) — klubbsiden viste kun den offentlige, akkurat som filteret i API-et tilsier.
Live, teeoff.no upåvirket. Gjenstår av ADR-018: Open Graph-metadata for delingsforhåndsvisning, og MinIO/bilder som egen runde. Vil du ta Open Graph-metadataen nå, siden det er en liten, avgrenset bit?
2026-07-18 10:48:20 +02:00
|
|
|
import { PublicClub } from "@/components/public-club"
|
|
|
|
|
|
2026-07-18 10:58:36 +02:00
|
|
|
// Server-side -- går IKKE gjennom next.config.mjs sin rewrites() (kun for
|
|
|
|
|
// nettleser-trafikk inn til Next.js-serveren). Peker direkte på API-et.
|
|
|
|
|
const API_ORIGIN = process.env.TEECUP_API_ORIGIN || "http://localhost:8000"
|
|
|
|
|
|
|
|
|
|
type PublicOrgInfo = {
|
|
|
|
|
name: string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function generateMetadata({
|
|
|
|
|
params,
|
|
|
|
|
}: {
|
|
|
|
|
params: Promise<{ slug: string }>
|
|
|
|
|
}): Promise<Metadata> {
|
|
|
|
|
const { slug } = await params
|
|
|
|
|
try {
|
|
|
|
|
const res = await fetch(`${API_ORIGIN}/public/orgs/${slug}`, { cache: "no-store" })
|
|
|
|
|
if (!res.ok) {
|
|
|
|
|
return { title: "Klubb | TeeCup" }
|
|
|
|
|
}
|
|
|
|
|
const data: PublicOrgInfo = await res.json()
|
|
|
|
|
const title = `${data.name} | TeeCup`
|
|
|
|
|
const description = `Se ${data.name} sine turneringer på TeeCup.`
|
|
|
|
|
return {
|
|
|
|
|
title,
|
|
|
|
|
description,
|
|
|
|
|
openGraph: { title, description, siteName: "TeeCup", type: "website" },
|
|
|
|
|
twitter: { card: "summary", title, description },
|
|
|
|
|
}
|
|
|
|
|
} catch {
|
|
|
|
|
return { title: "TeeCup" }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
Klubb-landingssiden er live på https://teecup.teeoff.no/clubs/{slug} — dermed er ADR-018 sine to planlagte frontend-skjermer komplette.
Én reell komponentkonflikt løst, ikke duplisert bort: TournamentCard var bygget kun for den innloggede dashbord-konteksten. I stedet for å lage en egen kopi for den offentlige klubbsiden, gjorde jeg orgId valgfri — satt gir innlogget lenke, utelatt gir /t/{id} i stedet. Samme kort, to kontekster. Bekreftet dashbordet fortsatt fungerer uendret.
V0 laget selv en rute denne gangen, men kalte parameteren [id] selv om det faktisk er en slug — skrev en egen, riktig navngitt [slug]-rute i stedet.
Verifisert mot ekte scratch-data gjennom en kjørende frontend-dev-server: en org med to turneringer (én offentlig, én org-privat) — klubbsiden viste kun den offentlige, akkurat som filteret i API-et tilsier.
Live, teeoff.no upåvirket. Gjenstår av ADR-018: Open Graph-metadata for delingsforhåndsvisning, og MinIO/bilder som egen runde. Vil du ta Open Graph-metadataen nå, siden det er en liten, avgrenset bit?
2026-07-18 10:48:20 +02:00
|
|
|
export default async function ClubPage({
|
|
|
|
|
params,
|
|
|
|
|
}: {
|
|
|
|
|
params: Promise<{ slug: string }>
|
|
|
|
|
}) {
|
|
|
|
|
const { slug } = await params
|
|
|
|
|
return <PublicClub slug={slug} />
|
|
|
|
|
}
|