fix: check response.ok before parsing JSON in fetch calls

Fix JSON parsing errors when server returns non-JSON responses:
- Check response.ok before calling response.json()
- Add fallback error messages using status text
- Apply fix to all fetch calls across 12 components

This prevents 'JSON.parse: unexpected character' errors when
server returns HTML error pages or other non-JSON responses.
This commit is contained in:
2026-04-03 19:27:10 -07:00
parent 9b15d7e61f
commit 37eb1f8e21
12 changed files with 812 additions and 226 deletions
+31 -13
View File
@@ -93,13 +93,15 @@ export default function UploadMatchesPage() {
eventDate: new Date().toISOString(),
}),
})
const data = await response.json()
if (response.ok && data.tournament) {
const newTournaments = [data.tournament]
setTournaments(newTournaments)
setSelectedTournament(data.tournament.id.toString())
setManualTournament(data.tournament.id.toString())
return data.tournament
if (response.ok) {
const data = await response.json()
if (data.tournament) {
const newTournaments = [data.tournament]
setTournaments(newTournaments)
setSelectedTournament(data.tournament.id.toString())
setManualTournament(data.tournament.id.toString())
return data.tournament
}
}
return null
} catch (err) {
@@ -155,12 +157,20 @@ export default function UploadMatchesPage() {
body: formData,
})
const data = await response.json()
if (!response.ok) {
throw new Error(data.error || "Failed to upload CSV")
try {
const errorData = await response.json()
throw new Error(errorData.error || "Failed to upload CSV")
} catch (jsonError) {
if (jsonError instanceof Error && jsonError.message !== "Failed to upload CSV") {
throw jsonError
}
throw new Error(`Failed to upload CSV: ${response.status} ${response.statusText}`)
}
}
const data = await response.json()
setCsvSuccess(
`Successfully imported ${data.importedCount} matches. ` +
`${data.errorCount || 0} errors occurred.` +
@@ -262,12 +272,20 @@ export default function UploadMatchesPage() {
body: JSON.stringify({ matches: matchesData }),
})
const data = await response.json()
if (!response.ok) {
throw new Error(data.error || "Failed to create matches")
try {
const errorData = await response.json()
throw new Error(errorData.error || "Failed to create matches")
} catch (jsonError) {
if (jsonError instanceof Error && jsonError.message !== "Failed to create matches") {
throw jsonError
}
throw new Error(`Failed to create matches: ${response.status} ${response.statusText}`)
}
}
const data = await response.json()
setManualSuccess(
`Successfully created ${data.importedCount} matches. ` +
`${data.errorCount || 0} errors occurred.` +