fix: await params in Next.js 16 routes and pages for TypeScript compatibility

This commit is contained in:
2026-03-31 00:50:56 -07:00
parent 42217e182e
commit b8d90897a4
13 changed files with 85 additions and 32 deletions
+25 -7
View File
@@ -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<Tournament | null>(null)
const [tournamentId, setTournamentId] = useState<number | null>(null)
const [gameText, setGameText] = useState("")
const [parsedGames, setParsedGames] = useState<GameEntry[]>([])
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 }
<div className="px-4 py-6 sm:px-0">
<div className="mb-6">
<button
onClick={() => router.push(`/admin/tournaments/${params.id}`)}
onClick={() => router.push(`/admin/tournaments/${tournamentId}`)}
className="text-green-600 hover:text-green-800 mb-4"
>
Back to Tournament
@@ -281,7 +299,7 @@ export default function TournamentEntryPage({ params }: { params: { id: string }
<div className="flex justify-end space-x-3">
<button
onClick={() => router.push(`/admin/tournaments/${params.id}`)}
onClick={() => router.push(`/admin/tournaments/${tournamentId}`)}
className="px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500"
>
Cancel