From b8d90897a4b5ce0c06aec55466a4c3aabd0c5770 Mon Sep 17 00:00:00 2001 From: David Gwilliam Date: Tue, 31 Mar 2026 00:50:56 -0700 Subject: [PATCH] fix: await params in Next.js 16 routes and pages for TypeScript compatibility --- src/app/admin/tournaments/[id]/edit/page.tsx | 4 ++- src/app/admin/tournaments/[id]/entry/page.tsx | 32 +++++++++++++++---- src/app/admin/tournaments/[id]/page.tsx | 4 ++- .../admin/tournaments/[id]/results/page.tsx | 4 ++- src/app/api/admin/players/[id]/route.ts | 5 +-- .../api/tournaments/[id]/games/bulk/route.ts | 5 +-- .../tournaments/[id]/participants/route.ts | 5 +-- src/app/api/tournaments/[id]/route.ts | 13 +++++--- src/app/api/users/[id]/role/route.ts | 10 +++--- src/app/api/users/[id]/route.ts | 10 +++--- src/app/players/[id]/profile/page.tsx | 4 ++- src/app/players/[id]/schedule/page.tsx | 4 ++- src/lib/prisma.ts | 17 +++++++++- 13 files changed, 85 insertions(+), 32 deletions(-) diff --git a/src/app/admin/tournaments/[id]/edit/page.tsx b/src/app/admin/tournaments/[id]/edit/page.tsx index 82461a2..d1f6d63 100644 --- a/src/app/admin/tournaments/[id]/edit/page.tsx +++ b/src/app/admin/tournaments/[id]/edit/page.tsx @@ -12,7 +12,9 @@ interface PageProps { } export default async function EditTournamentPage({ params }: PageProps) { - const tournamentId = parseInt(params.id, 10) + // Next.js 16 requires awaiting params + const { id } = await params + const tournamentId = parseInt(id, 10) if (isNaN(tournamentId)) { notFound() diff --git a/src/app/admin/tournaments/[id]/entry/page.tsx b/src/app/admin/tournaments/[id]/entry/page.tsx index 0a5161b..550c286 100644 --- a/src/app/admin/tournaments/[id]/entry/page.tsx +++ b/src/app/admin/tournaments/[id]/entry/page.tsx @@ -31,23 +31,41 @@ interface GameEntry { score2: number } -export default function TournamentEntryPage({ params }: { params: { id: string } }) { +export default function TournamentEntryPage({ params }: { params: Promise<{ id: string }> }) { const router = useRouter() const [tournament, setTournament] = useState(null) + const [tournamentId, setTournamentId] = useState(null) const [gameText, setGameText] = useState("") const [parsedGames, setParsedGames] = useState([]) const [error, setError] = useState("") const [success, setSuccess] = useState("") const [isLoading, setIsLoading] = useState(false) + // Parse params and validate tournamentId useEffect(() => { - loadTournament() + async function parseParams() { + const { id } = await params + const parsedId = parseInt(id, 10) + if (isNaN(parsedId)) { + router.push('/admin/tournaments') + } else { + setTournamentId(parsedId) + } + } + parseParams() + }, [params, router]) + + // Load tournament when tournamentId is available + useEffect(() => { + if (tournamentId) { + loadTournament() + } // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) + }, [tournamentId]) const loadTournament = async () => { try { - const response = await fetch(`/api/tournaments/${params.id}`) + const response = await fetch(`/api/tournaments/${tournamentId}`) const data = await response.json() if (response.ok) { setTournament(data.tournament) @@ -103,7 +121,7 @@ export default function TournamentEntryPage({ params }: { params: { id: string } setIsLoading(true) try { - const response = await fetch(`/api/tournaments/${params.id}/games/bulk`, { + const response = await fetch(`/api/tournaments/${tournamentId}/games/bulk`, { method: "POST", headers: { "Content-Type": "application/json", @@ -154,7 +172,7 @@ export default function TournamentEntryPage({ params }: { params: { id: string }