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);