@gravity-ui/uikit
Version:
Gravity UI base styling and components
48 lines (47 loc) • 1.61 kB
JavaScript
export const FILE_REJECTION_REASONS = {
INVALID_TYPE: 'invalid-type',
TOO_MANY_FILES: 'too-many-files',
};
function typeMatchesPattern(actualMimeType, expectedMimeTypePattern) {
const actualMimeTypeParts = actualMimeType.split('/');
if (actualMimeTypeParts.length !== 2) {
return false;
}
const [actualType] = actualMimeTypeParts;
const [expectedType, expectedSubtype] = expectedMimeTypePattern.split('/');
if (expectedSubtype === '*') {
return actualType === expectedType;
}
return actualMimeType === expectedMimeTypePattern;
}
function getItemInvalidType(item, { accept }) {
const reasons = [];
if (accept?.length && !accept.some((pattern) => typeMatchesPattern(item.type, pattern))) {
reasons.push(FILE_REJECTION_REASONS.INVALID_TYPE);
}
return reasons;
}
export function getSeparatedItems(dataTransfer, options) {
const items = Array.from(dataTransfer.items);
const accepted = [];
const rejected = [];
for (const item of items) {
const invalidType = getItemInvalidType(item, options);
const tooManyFiles = !options.multiple && accepted.length === 1;
if (invalidType.length || tooManyFiles) {
const reasons = [...invalidType];
if (tooManyFiles) {
reasons.push(FILE_REJECTION_REASONS.TOO_MANY_FILES);
}
rejected.push({
item,
reasons,
});
}
else {
accepted.push(item);
}
}
return { accepted, rejected };
}
//# sourceMappingURL=utils.js.map