UNPKG

@nish1896/rhf-mui-components

Version:

A suite of 25+ production-ready react-hook-form components built with material-ui. Fully typed, tree-shakable, and optimized for enterprise-grade forms.

62 lines (61 loc) 2.31 kB
import "../mui/file-uploader/index.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, options) { const { accept, maxFiles, maxSize } = options ?? {}; const files = Array.from(fileList); const acceptedFiles = []; const rejectedFiles = []; 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 validationErrors = []; if (maxSize && file.size > maxSize) validationErrors.push("FILE_SIZE_EXCEEDED"); if (!isTypeAllowed(file)) validationErrors.push("FILE_TYPE_NOT_ALLOWED"); if (validationErrors.length > 0) rejectedFiles.push({ file, errors: validationErrors }); else acceptedFiles.push(file); }); if (maxFiles && acceptedFiles.length > maxFiles) { const excessFiles = acceptedFiles.slice(maxFiles); acceptedFiles.splice(maxFiles); rejectedFiles.push(...excessFiles.map((file) => ({ file, errors: ["FILE_LIMIT_EXCEEDED"] }))); } return { acceptedFiles, rejectedFiles }; } //#endregion export { getFileSize, validateFileList };