UNPKG

react-dropzone

Version:
89 lines (75 loc) 3.38 kB
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } import accepts from 'attr-accept'; // Firefox versions prior to 53 return a bogus MIME type for every file drag, so dragovers with // that MIME type will always be accepted export function fileAccepted(file, accept) { return file.type === 'application/x-moz-file' || accepts(file, accept); } export function fileMatchSize(file, maxSize, minSize) { return file.size <= maxSize && file.size >= minSize; } export function allFilesAccepted(files, accept) { return files.every(function (file) { return fileAccepted(file, accept); }); } // React's synthetic events has event.isPropagationStopped, // but to remain compatibility with other libs (Preact) fall back // to check event.cancelBubble export function isPropagationStopped(event) { if (typeof event.isPropagationStopped === 'function') { return event.isPropagationStopped(); } else if (typeof event.cancelBubble !== 'undefined') { return event.cancelBubble; } return false; } export function isEvtWithFiles(event) { if (!event.dataTransfer) { return !!event.target && !!event.target.files; } // https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/types // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Recommended_drag_types#file return Array.prototype.some.call(event.dataTransfer.types, function (type) { return type === 'Files' || type === 'application/x-moz-file'; }); } export function isKindFile(item) { return _typeof(item) === 'object' && item !== null && item.kind === 'file'; } // allow the entire document to be a drag target export function onDocumentDragOver(event) { event.preventDefault(); } function isIe(userAgent) { return userAgent.indexOf('MSIE') !== -1 || userAgent.indexOf('Trident/') !== -1; } function isEdge(userAgent) { return userAgent.indexOf('Edge/') !== -1; } export function isIeOrEdge() { var userAgent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.navigator.userAgent; return isIe(userAgent) || isEdge(userAgent); } /** * This is intended to be used to compose event handlers * They are executed in order until one of them calls `event.isPropagationStopped()`. * Note that the check is done on the first invoke too, * meaning that if propagation was stopped before invoking the fns, * no handlers will be executed. * * @param {Function} fns the event hanlder functions * @return {Function} the event handler to add to an element */ export function composeEventHandlers() { for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) { fns[_key] = arguments[_key]; } return function (event) { for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } return fns.some(function (fn) { if (!isPropagationStopped(event) && fn) { fn.apply(void 0, [event].concat(args)); } return isPropagationStopped(event); }); }; }