diff --git a/frontend/components/tournament-presentation.tsx b/frontend/components/tournament-presentation.tsx index 2a17ccd..73ae4a8 100644 --- a/frontend/components/tournament-presentation.tsx +++ b/frontend/components/tournament-presentation.tsx @@ -15,6 +15,7 @@ import { ArrowLeft, Camera, Check, + Copy, ExternalLink, Globe, Lock, @@ -105,6 +106,21 @@ export function TournamentPresentationPanel({ const [sponsorName, setSponsorName] = useState("") const [sponsorUrl, setSponsorUrl] = useState("") const [addingSponsor, setAddingSponsor] = useState(false) + + // Kopier-lenke (2026-08-21) -- fant reell forvirring: organisator delte + // sin egen administrator-URL (/tournaments/{id}?org=...) i stedet for + // denne, siden lenken under kun var ren, ikke-kopierbar tekst. Samme + // kopier-mønster som JoinCodeChip i individual-tournament-detail.tsx. + const [linkCopied, setLinkCopied] = useState(false) + async function copyPublicLink() { + try { + await navigator.clipboard.writeText(`${window.location.origin}/t/${tournamentId}`) + setLinkCopied(true) + setTimeout(() => setLinkCopied(false), 1500) + } catch { + // stille -- ikke kritisk + } + } const [sponsorError, setSponsorError] = useState(null) const [logoTargetId, setLogoTargetId] = useState(null) const [uploadingLogoFor, setUploadingLogoFor] = useState(null) @@ -282,7 +298,7 @@ export function TournamentPresentationPanel({ return (
-
+

Hvordan turneringen vises på sin offentlige side ( ) og klubbsiden.

+
diff --git a/frontend/components/tournament-router.tsx b/frontend/components/tournament-router.tsx index f42ec98..36dbb6c 100644 --- a/frontend/components/tournament-router.tsx +++ b/frontend/components/tournament-router.tsx @@ -8,6 +8,7 @@ // egen rad"-mønster som tournament-detail.tsx allerede bruker for join_code. import { useEffect, useState } from "react" +import { useRouter } from "next/navigation" import { TournamentDetail } from "@/components/tournament-detail" import { IndividualTournamentDetail } from "@/components/individual-tournament-detail" @@ -20,13 +21,30 @@ export function TournamentRouter({ tournamentId: string tournamentName: string }) { + const router = useRouter() const [formatType, setFormatType] = useState<"team" | "individual" | null>(null) const [error, setError] = useState(false) + // Ikke-innlogget besøkende på denne organisator-URL-en (f.eks. en delt + // /tournaments/{id}?org=...-lenke) -- funnet 2026-08-21: den generiske + // feil-fallback-en under viste tidligere ALLTID Cup/lag-format- + // administrasjonsskjermen (samme "trygt mot krasj"-begrunnelse som før), + // helt uavhengig av turneringens faktiske format og helt uavhengig av + // ÅRSAKEN til feilen -- en anonym besøkende på en individuell turnering + // fikk et forvirrende, ødelagt Ryder Cup-oppsett-skjermbilde i stedet for + // en ren "logg inn"-beskjed. Skiller nå eksplisitt 401 (ikke innlogget) + // fra andre feil, og sender i stedet videre til den ekte offentlige siden. + const [notAuthenticated, setNotAuthenticated] = useState(false) useEffect(() => { let cancelled = false fetch(`/orgs/${organizationId}/tournaments`, { credentials: "include" }) - .then((res) => (res.ok ? res.json() : Promise.reject())) + .then((res) => { + if (res.status === 401) { + if (!cancelled) setNotAuthenticated(true) + return Promise.reject() + } + return res.ok ? res.json() : Promise.reject() + }) .then((list: { id: string; format_type: string }[]) => { if (cancelled) return const mine = list.find((t) => t.id === tournamentId) @@ -40,10 +58,27 @@ export function TournamentRouter({ } }, [organizationId, tournamentId]) + useEffect(() => { + if (notAuthenticated) router.replace(`/t/${tournamentId}`) + }, [notAuthenticated, tournamentId, router]) + + if (notAuthenticated) { + return ( +
+ + ) + } + if (error) { // Samme trygge fallback som resten av appen: en ukjent/util­gjengelig // turnering skal ikke krasje -- TournamentDetail sin egen feilhåndtering // (join_code/teams/players) tar over og viser en tydelig feilmelding. + // (Denne grenen er nå kun for EKTE feil hos en innlogget bruker -- + // 401/ikke-innlogget håndteres over, IKKE lenger her.) return ( )