teecup/frontend/app/velkommen/page.tsx
Erol Haagenrud 2562e20ec3 13-årsgrense — håndhevet server-side (eneste vei inn i appen, ADR-051) og med umiddelbar rød feilmelding klientside i begge profil-skjemaer. Testet på nøyaktig dagsgrensen.
PWA-installasjonstekst — skiller nå Safari/Chrome på iOS, ikke lenger feilaktig Safari-only.
Beskrivelsestekst — "golfklubber" fjernet, nytt punkt om at turneringsadmin/-presentasjon fungerer godt på PC.
Dette krever både teecup_api og teecup_frontend (ingen migrasjon).
2026-08-10 07:00:11 +02:00

59 lines
2.2 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { Metadata } from "next"
import { cookies } from "next/headers"
import { redirect } from "next/navigation"
import { Velkommen } from "@/components/teecup/velkommen"
export const metadata: Metadata = {
title: "Velkommen TeeCup",
description: "Fullfør profilen din for å komme i gang med TeeCup.",
}
// Server-side, IKKE nettleser-fetch -- går derfor IKKE gjennom
// next.config.mjs sin rewrites() (samme mønster som /logg-inn/page.tsx og
// den tidligere app/page.tsx). Peker direkte på API-et.
const API_ORIGIN = process.env.TEECUP_API_ORIGIN || "http://localhost:8000"
// Må matche SESSION_COOKIE_NAME i app/auth.py -- ingen delt konstant på
// tvers av Python/TypeScript, samme mønster som andre API-kontrakt-felt
// som dupliseres bevisst i frontend-koden.
const SESSION_COOKIE_NAME = "teecup_session"
export default async function VelkommenPage() {
const cookieStore = await cookies()
const session = cookieStore.get(SESSION_COOKIE_NAME)
let authenticated = false
let profileComplete = true
let firstName: string | null = null
let displayName = ""
if (session) {
try {
const res = await fetch(`${API_ORIGIN}/auth/me`, {
headers: { Cookie: `${SESSION_COOKIE_NAME}=${session.value}` },
cache: "no-store",
})
authenticated = res.ok
if (res.ok) {
const data = await res.json()
profileComplete = Boolean(data.profile_complete)
firstName = data.first_name ?? null
displayName = data.display_name ?? ""
}
} catch {
// API utilgjengelig -- send til innlogging i stedet for å henge.
authenticated = false
}
}
// redirect() kaster en egen NEXT_REDIRECT-kontrollflyt-exception som MÅ
// boble videre til Next.js -- må derfor stå UTENFOR try/catch-en over
// (reell bug funnet 2026-08-08 i /logg-inn/page.tsx av nøyaktig denne
// fallgruven, se CHANGELOG.md -- unngås her fra start).
if (!authenticated) {
redirect("/logg-inn")
}
// Denne siden finnes KUN for innlogget-men-ikke-fullført-profil -- en
// bruker med komplett profil skal aldri se den (send rett til dashbordet).
if (profileComplete) {
redirect("/dashboard")
}
return <Velkommen firstName={firstName} displayName={displayName} />
}