Add Error Normalization for Axios Blob Responses in ApiServerContext
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good

- Introduced normalizeAxiosBlobError function to handle and normalize errors from Axios when the response data is a Blob.
- Updated error handling in the ApiServerProvider to utilize the new normalization function, improving error reporting and user feedback.
- Enhanced the Accept header in API requests to support both image and JSON responses, ensuring better compatibility with different content types.
This commit is contained in:
Tom Butcher 2026-08-23 21:02:37 +01:00
parent 39908c811a
commit b925518e69

View File

@ -45,6 +45,26 @@ const normalizeUserSettingsCategory = (category) =>
? category ? category
: {} : {}
const normalizeAxiosBlobError = async (error) => {
const blob = error?.response?.data
if (!(blob instanceof Blob)) {
return error
}
try {
const text = await blob.text()
try {
error.response.data = JSON.parse(text)
} catch {
error.response.data = { error: text || 'Unknown error' }
}
} catch {
error.response.data = { error: 'Unknown error' }
}
return error
}
const normalizeUserSettings = (settings = {}) => ({ const normalizeUserSettings = (settings = {}) => ({
viewMode: normalizeUserSettingsCategory(settings?.viewMode), viewMode: normalizeUserSettingsCategory(settings?.viewMode),
filterSidebarVisibility: normalizeUserSettingsCategory( filterSidebarVisibility: normalizeUserSettingsCategory(
@ -1717,7 +1737,7 @@ const ApiServerProvider = ({ children }) => {
{ {
params: { size }, params: { size },
headers: { headers: {
Accept: 'image/jpeg', Accept: 'image/jpeg, application/json',
Authorization: `Bearer ${token}` Authorization: `Bearer ${token}`
}, },
responseType: 'blob' responseType: 'blob'
@ -1728,12 +1748,13 @@ const ApiServerProvider = ({ children }) => {
}) })
return window.URL.createObjectURL(blob) return window.URL.createObjectURL(blob)
} catch (err) { } catch (err) {
if (err.response.status === 404 && show404Error == false) { if (err.response?.status === 404 && show404Error == false) {
return null return null
} }
console.error(err) console.error(err)
await normalizeAxiosBlobError(err)
showError(err, () => { showError(err, () => {
fetchFileThumbnail(file, size) fetchFileThumbnail(file, size, show404Error)
}) })
} }
} }