@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
JavaScript
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),
};
}