| const MAX_FILE_SIZE = 3 * 1024 * 1024; |
| const MAX_TOTAL_SIZE = 3 * 1024 * 1024; |
|
|
| export interface FileValidationResult { |
| isValid: boolean; |
| errorMessage?: string; |
| oversizedFiles?: string[]; |
| } |
|
|
| |
| |
| |
| 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 }; |
| } |
|
|
| |
| |
| |
| 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 }; |
| } |
|
|
| |
| |
| |
| export function validateFiles( |
| newFiles: File[], |
| existingFiles: File[] = [], |
| ): FileValidationResult { |
| |
| const individualValidation = validateIndividualFileSizes(newFiles); |
| if (!individualValidation.isValid) { |
| return individualValidation; |
| } |
|
|
| |
| return validateTotalFileSize(newFiles, existingFiles); |
| } |
|
|