@sanity/form-builder
Version:
Sanity form builder
76 lines (72 loc) • 2.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.extractDroppedFiles = extractDroppedFiles;
exports.extractPastedFiles = extractPastedFiles;
var _flatten2 = _interopRequireDefault(require("lodash/flatten"));
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
*/
function extractPastedFiles(dataTransfer) {
if (dataTransfer.files && dataTransfer.files.length > 0) {
return Promise.resolve(Array.from(dataTransfer.files || []));
}
return normalizeItems(Array.from(dataTransfer.items || [])).then(_flatten2.default);
}
function extractDroppedFiles(dataTransfer) {
var files = Array.from(dataTransfer.files || []);
var items = Array.from(dataTransfer.items || []);
if (files && files.length > 0) {
return Promise.resolve(files);
}
return normalizeItems(items).then(_flatten2.default);
}
function toArray(v) {
return v === null ? [] : [v];
}
function normalizeItems(items) {
return Promise.all(items.map(item => {
// directory
if (item.kind === 'file' && item.webkitGetAsEntry) {
var entry;
// Edge throws
try {
entry = item.webkitGetAsEntry();
} catch (err) {
return toArray(item.getAsFile());
}
if (!entry) {
return [];
}
return entry.isDirectory ? walk(entry) : toArray(item.getAsFile());
}
if (item.kind === 'file') {
var _file = item.getAsFile();
return Promise.resolve(_file ? [_file] : []);
}
if (item.kind === 'string') {
// We previously had support for reading datatransfer of strings here but decided to remove it since we don't handle it in higher up in the stack yet.
// If one day we want to support data transfer from a string value (e.g. copy+paste from a field to another), an earlier
// version of this file includes an implementation that uses DataTransferItem.getAsString to read the string value into a File
console.warn('DataTransfer with kind="string" is currently not supported');
return Promise.resolve([]);
}
console.warn('Unknown DataTransferItem.kind: %s', item.kind);
return Promise.resolve([]);
}));
}
// Warning: experimental API: https://wicg.github.io/entries-api
function walk(entry) {
if (entry.isFile) {
return new Promise((resolve, reject) => entry.file(resolve, reject)).then(file => [file]);
}
if (entry.isDirectory) {
var dir = entry.createReader();
return new Promise((resolve, reject) => dir.readEntries(resolve, reject)).then(entries => entries.filter(entr => !entr.name.startsWith('.'))).then(entries => Promise.all(entries.map(walk)).then(_flatten2.default));
}
return Promise.resolve([]);
}