From 1014475c0fa138b6da748d5c50a22c9e3d4f36cb Mon Sep 17 00:00:00 2001 From: Eric Gullickson <16152721+ericgullickson@users.noreply.github.com> Date: Wed, 14 Jan 2026 20:16:17 -0600 Subject: [PATCH] fix: add dynamic timeout for document uploads (refs #33) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document uploads were failing with "timeout of 10000ms exceeded" error because the global axios client timeout (10s) was too short for medium-sized files (1-5MB). Added calculateUploadTimeout() function that calculates timeout based on file size: 30s base + 10s per MB. This allows uploads to complete on slower connections while still having reasonable timeout limits. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../src/features/documents/api/documents.api.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frontend/src/features/documents/api/documents.api.ts b/frontend/src/features/documents/api/documents.api.ts index a6d7ef8..c1a0533 100644 --- a/frontend/src/features/documents/api/documents.api.ts +++ b/frontend/src/features/documents/api/documents.api.ts @@ -1,6 +1,17 @@ import { apiClient } from '../../../core/api/client'; import type { CreateDocumentRequest, DocumentRecord, UpdateDocumentRequest } from '../types/documents.types'; +/** + * Calculate upload timeout based on file size. + * Base: 30 seconds + 10 seconds per MB to accommodate slow connections. + */ +function calculateUploadTimeout(file: File): number { + const fileSizeMB = file.size / (1024 * 1024); + const baseTimeout = 30000; // 30 seconds minimum + const perMBTimeout = 10000; // 10 seconds per MB + return Math.round(baseTimeout + fileSizeMB * perMBTimeout); +} + export const documentsApi = { async list(params?: { vehicleId?: string; type?: string; expiresBefore?: string }) { const res = await apiClient.get('/documents', { params }); @@ -26,6 +37,7 @@ export const documentsApi = { form.append('file', file); const res = await apiClient.post(`/documents/${id}/upload`, form, { headers: { 'Content-Type': 'multipart/form-data' }, + timeout: calculateUploadTimeout(file), }); return res.data; }, @@ -34,6 +46,7 @@ export const documentsApi = { form.append('file', file); const res = await apiClient.post(`/documents/${id}/upload`, form, { headers: { 'Content-Type': 'multipart/form-data' }, + timeout: calculateUploadTimeout(file), onUploadProgress: (evt) => { if (evt.total) { const pct = Math.round((evt.loaded / evt.total) * 100);