import type { Metadata } from "next" import { cookies } from "next/headers" import { redirect } from "next/navigation" import { TeeCupWordmark } from "@/components/teecup/wordmark" import { TeeCupAuth } from "@/components/teecup/teecup-auth" export const metadata: Metadata = { title: "Logg inn – TeeCup", description: "Logg inn på TeeCup for live-scoring og golfturneringer med vennegjengen, klubben eller bedriften.", } // Server-side, IKKE nettleser-fetch -- går derfor IKKE gjennom // next.config.mjs sin rewrites() (samme mønster som generateMetadata i // app/t/[id]/page.tsx og den forrige 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 LoggInnPage() { // Samme allerede-innlogget-sjekk som /-siden hadde (2026-08-08: /logg-inn // overtok rollen som ekte innloggingsside, se CHANGELOG.md) -- en bruker // med gyldig sesjonscookie skal aldri se innloggingsskjemaet på nytt. const cookieStore = await cookies() const session = cookieStore.get(SESSION_COOKIE_NAME) let authenticated = false let profileComplete = true 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) } } catch { // API utilgjengelig -- vis innloggingsskjemaet 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 // (en catch der ville slukt den stille og latt innloggingsskjemaet vises // i stedet for å omdirigere, reell bug funnet under scratch-verifisering // 2026-08-08, se CHANGELOG.md). // Ikke rett til /account -- se ARCHITECTURE_DECISIONS.md-tillegg // 2026-08-09: /velkommen viser kontekst (PWA-installasjon, låste // hurtighandlinger, presentasjon) FØR skjemaet, i stedet for at // skjemaet dukker opp helt uten forklaring rett etter innlogging. if (authenticated) { redirect(profileComplete ? "/dashboard" : "/velkommen") } return (
{/* Quiet turf-horizon backdrop — the one bit of atmosphere, kept subtle. */}
) }