@modern-kit/react
Version:
68 lines (64 loc) • 1.85 kB
JavaScript
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