UNPKG

@nish1896/rhf-mui-components

Version:

A suite of 20+ reusable Material UI components for React Hook Form to minimize your time and effort in creating and styling forms

87 lines (86 loc) 2.99 kB
import { FileUploadError } from '../types'; export function getFileSize(size, options) { if (size < 0) { throw new Error('Invalid file size. It must be a positive number.'); } if (size === 0) { return '0 bytes'; } const { valueAsNumber = false, precision = 1 } = options ?? {}; const conversionFactor = 1024; /* Utility to remove .0 if no decimal part exists */ const format = (value, unit) => { const roundedValue = value.toFixed(precision); const formattedValue = roundedValue.replace(/(\.0+|\.0+0+)$/, ''); return valueAsNumber ? `${Math.round(value)} ${unit}` : `${formattedValue} ${unit}`; }; if (size < conversionFactor) { return `${size} bytes`; } const kb = size / conversionFactor; if (kb < conversionFactor) { return format(kb, 'KB'); } const mb = kb / conversionFactor; if (mb < conversionFactor) { return format(mb, 'MB'); } const gb = mb / conversionFactor; return format(gb, 'GB'); } export function validateFileList(fileList, accept, maxSize, maxFiles) { const files = Array.from(fileList); const acceptedFiles = []; const rejectedFiles = []; const errorsSet = new Set(); /* Parse the accept string into an array of acceptable types/extensions */ const acceptedTypes = (accept ?? '') .split(',') .map(type => type.trim().toLowerCase()); const isTypeAllowed = (file) => { if (!accept) { return true; } const fileExtension = file.name.slice(file.name.lastIndexOf('.')).toLowerCase(); const fileType = file.type.toLowerCase(); return acceptedTypes.some(acceptedType => { if (acceptedType.startsWith('.')) { return fileExtension === acceptedType; } else if (acceptedType.endsWith('/*')) { const typePrefix = acceptedType.replace('/*', ''); return fileType.startsWith(typePrefix); } else { return fileType === acceptedType; } }); }; files.forEach(file => { const fileErrors = []; if (maxSize && file.size > maxSize) { fileErrors.push(FileUploadError.sizeExceeded); } if (!isTypeAllowed(file)) { fileErrors.push(FileUploadError.invalidExtension); } if (fileErrors.length > 0) { rejectedFiles.push(file); fileErrors.forEach(err => errorsSet.add(err)); } else { acceptedFiles.push(file); } }); if (maxFiles && acceptedFiles.length > maxFiles) { const excessFiles = acceptedFiles.slice(maxFiles); acceptedFiles.splice(maxFiles); rejectedFiles.push(...excessFiles); errorsSet.add(FileUploadError.limitExceeded); } return { acceptedFiles, rejectedFiles, errors: Array.from(errorsSet), }; }