diff --git a/frontend/src/core/uploads/api.ts b/frontend/src/core/uploads/api.ts index 501cfe8c04..769f314979 100644 --- a/frontend/src/core/uploads/api.ts +++ b/frontend/src/core/uploads/api.ts @@ -147,7 +147,10 @@ export async function uploadFiles( const result = (await response.json()) as UploadResponse; if (result.success === false) { - const message = result.message.trim(); + // A gateway or proxy may omit `message`; treat it like an empty one + // instead of throwing a TypeError while handling the failure. + const message = + typeof result.message === "string" ? result.message.trim() : ""; throw new Error( message ? `Upload incomplete: ${message}` : "Upload failed", ); diff --git a/frontend/tests/unit/core/uploads/api.test.ts b/frontend/tests/unit/core/uploads/api.test.ts index 105d307e7d..7b7fe19d6f 100644 --- a/frontend/tests/unit/core/uploads/api.test.ts +++ b/frontend/tests/unit/core/uploads/api.test.ts @@ -94,6 +94,18 @@ describe("uploads api", () => { expect(error.message).toBe("Upload failed"); }); + test("uses the upload fallback when an unsuccessful response omits the message", async () => { + const error = await uploadError( + jsonResponse(200, { + success: false, + files: [], + skipped_files: ["report.pdf"], + }), + ); + + expect(error.message).toBe("Upload failed"); + }); + test("preserves string error details", async () => { const error = await uploadError( jsonResponse(413, { detail: "File exceeds the upload limit" }),