@lyra/form-builder
Version:
Lyra form builder
77 lines (64 loc) • 2.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _flatten2 = require('lodash/flatten');
var _flatten3 = _interopRequireDefault(_flatten2);
exports.extractPastedFiles = extractPastedFiles;
exports.extractDroppedFiles = extractDroppedFiles;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Utilities for extracting files from dataTransfer in a predictable cross-browser fashion.
* Also recursively extracts files from a directory
* Inspired by https://github.com/component/normalized-upload
* Contains special handling of
*/
function extractPastedFiles(dataTransfer /*: DataTransfer*/) /*: Array<File>*/ {
if (dataTransfer.files && dataTransfer.files.length > 0) {
return Promise.resolve(Array.from(dataTransfer.files || []));
}
return normalizeItems(Array.from(dataTransfer.items || [])).then(_flatten3.default);
}
function extractDroppedFiles(dataTransfer /*: DataTransfer*/) {
const files /*: Array<File>*/ = Array.from(dataTransfer.files || []);
const items /*: Array<DataTransferItem>*/ = Array.from(dataTransfer.items || []);
if (files && files.length > 0) {
return Promise.resolve(files);
}
return normalizeItems(items).then(_flatten3.default);
}
function normalizeItems(items /*: Array<DataTransferItem>*/) /*: Promise<Array<File>>*/ {
return Promise.all(items.map(item => {
// directory
if (item.kind === 'file' && item.webkitGetAsEntry) {
let entry;
// Edge throws
try {
entry = item.webkitGetAsEntry();
} catch (err) {
return [item.getAsFile()];
}
if (!entry) {
return [];
}
return entry.isDirectory ? walk(entry) : [item.getAsFile()];
}
// file
if (item.kind === 'file') {
const file = item.getAsFile();
return Promise.resolve(file ? [file] : []);
}
// others
return new Promise(resolve => item.getAsString(resolve)).then(str => str ? [new File([str], 'unknown.txt', { type: item.type })] : []);
}));
}
function walk(entry /*: WebKitFileEntry*/) /*: Promise<Array<File>>*/ {
if (entry.isFile) {
return new Promise(resolve => entry.file(resolve)).then(file => [file]);
}
if (entry.isDirectory) {
const dir = entry.createReader();
return new Promise(resolve => dir.readEntries(resolve)).then(entries => entries.filter(entr => !entr.name.startsWith('.'))).then(entries => Promise.all(entries.map(walk)).then(_flatten3.default));
}
return Promise.resolve([]);
}