const MAX_FILE_SIZE = 3 * 1024 * 1024; // 3MB maximum file size const MAX_TOTAL_SIZE = 3 * 1024 * 1024; // 3MB maximum total size for all files combined export interface FileValidationResult { isValid: boolean; errorMessage?: string; oversizedFiles?: string[]; } /** * Validates individual file sizes */ export function validateIndividualFileSizes( files: File[], ): FileValidationResult { const oversizedFiles = files.filter((file) => file.size > MAX_FILE_SIZE); if (oversizedFiles.length > 0) { const fileNames = oversizedFiles.map((f) => f.name); return { isValid: false, errorMessage: `Files exceeding 3MB are not allowed: ${fileNames.join(", ")}`, oversizedFiles: fileNames, }; } return { isValid: true }; } /** * Validates total file size including existing files */ export function validateTotalFileSize( newFiles: File[], existingFiles: File[] = [], ): FileValidationResult { const currentTotalSize = existingFiles.reduce( (sum, file) => sum + file.size, 0, ); const newFilesSize = newFiles.reduce((sum, file) => sum + file.size, 0); const totalSize = currentTotalSize + newFilesSize; if (totalSize > MAX_TOTAL_SIZE) { const totalSizeMB = (totalSize / (1024 * 1024)).toFixed(1); return { isValid: false, errorMessage: `Total file size would be ${totalSizeMB}MB, exceeding the 3MB limit. Please select fewer or smaller files.`, }; } return { isValid: true }; } /** * Validates both individual and total file sizes */ export function validateFiles( newFiles: File[], existingFiles: File[] = [], ): FileValidationResult { // First check individual file sizes const individualValidation = validateIndividualFileSizes(newFiles); if (!individualValidation.isValid) { return individualValidation; } // Then check total size return validateTotalFileSize(newFiles, existingFiles); }