UNPKG

@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
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 };