@nish1896/rhf-mui-components
Version:
A suite of 20+ production-ready react-hook-form components built with material-ui. Fully typed, tree-shakable, and optimized for enterprise-grade forms.
60 lines (59 loc) • 2.37 kB
JavaScript
import { FileUploadError } from "../types/file-uploader.js";
//#region src/utils/file.ts
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;
const format = (value, unit) => {
const formattedValue = value.toFixed(precision).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");
return format(mb / conversionFactor, "GB");
}
function validateFileList(fileList, accept, maxSize, maxFiles) {
const files = Array.from(fileList);
const acceptedFiles = [];
const rejectedFiles = [];
const errorsSet = /* @__PURE__ */ new Set();
const acceptedTypes = accept ? 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)
};
}
//#endregion
export { getFileSize, validateFileList };