UNPKG

pompelmi

Version:

Prototipo di scanner di file lato cliente

87 lines (81 loc) 1.94 kB
'use strict'; var react = require('react'); /** * Reads an array of File objects via FileReader and returns their text. */ async function scanFiles(files) { const readText = file => new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.onerror = () => reject(reader.error); reader.readAsText(file); }); const results = []; for (const file of files) { const content = await readText(file); results.push({ file, content }); } return results; } /** * Validates a File by MIME type and size (max 5 MB). */ function validateFile(file) { const maxSize = 5 * 1024 * 1024; const allowedTypes = ['text/plain', 'application/json', 'text/csv']; if (!allowedTypes.includes(file.type)) { return { valid: false, error: 'Unsupported file type' }; } if (file.size > maxSize) { return { valid: false, error: 'File too large (max 5 MB)' }; } return { valid: true }; } /** * React Hook: handles <input type="file" onChange> with validation + scanning. */ function useFileScanner() { const [results, setResults] = react.useState([]); const [errors, setErrors] = react.useState([]); const onChange = react.useCallback(async e => { const fileList = Array.from(e.target.files || []); const good = []; const bad = []; for (const file of fileList) { const { valid, error } = validateFile(file); if (valid) good.push(file);else bad.push({ file, error: error }); } setErrors(bad); if (good.length) { const scanned = await scanFiles(good); setResults(scanned); } else { setResults([]); } }, []); return { results, errors, onChange }; } exports.scanFiles = scanFiles; exports.useFileScanner = useFileScanner; exports.validateFile = validateFile;