UNPKG

@modern-kit/react

Version:
68 lines (64 loc) 1.85 kB
import { useState } from 'react'; function isFile(file) { return file instanceof File; } function isFileList(file) { return file instanceof FileList; } function inValidFileType(file) { return !isFile(file) && !isFileList(file); } function getFiles(file, accepts) { const files = isFile(file) ? [file] : Array.from(file); return accepts.length > 0 ? files.filter((file2) => accepts.includes(file2.type)) : files; } function getReaderPromise(reader, file) { return new Promise((resolve, reject) => { reader.onload = () => { resolve(reader.result); }; reader.onerror = () => { reject(`Failed to read file ${file.name}`); }; }); } function useFileReader() { const [fileContents, setFileContents] = useState([]); const [isLoading, setIsLoading] = useState(false); const readFile = async ({ file, readType, accepts = [] }) => { if (inValidFileType(file)) { return []; } const files = getFiles(file, accepts); setIsLoading(true); setFileContents([]); const readerPromises = files.map((file2) => { const reader = new FileReader(); try { reader[readType](file2); } catch { return Promise.reject(`Failed to read file ${file2.name}`); } return getReaderPromise(reader, file2); }); const settledPromises = await Promise.allSettled(readerPromises); const contents = settledPromises.map((el, idx) => { const isFulfilled = el.status === "fulfilled"; return { status: el.status, readValue: isFulfilled ? el.value : el.reason, originFile: isFulfilled ? files[idx] : null }; }); setFileContents(contents); setIsLoading(false); return contents; }; return { readFile, fileContents, isLoading }; } export { useFileReader }; //# sourceMappingURL=index.mjs.map