@chayns-components/core
Version:
A set of beautiful React components for developing your own applications with chayns.
184 lines (183 loc) • 7.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.TSIMG_FILE_TYPES = exports.STREAMINGSERVICE_FILE_TYPES = void 0;
var _react = _interopRequireWildcard(require("react"));
var _file = require("../../utils/file");
var _FileInput = require("./FileInput.styles");
var _FileList = _interopRequireDefault(require("../file-list/FileList"));
var _FileSelect = _interopRequireDefault(require("../file-select/FileSelect"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
const TSIMG_FILE_TYPES = exports.TSIMG_FILE_TYPES = 'image/png, image/jpg, image/jpeg, image/gif, image/webp, image/svg+xml, image/avif';
const STREAMINGSERVICE_FILE_TYPES = exports.STREAMINGSERVICE_FILE_TYPES = 'video/mp4, video/webm, video/avi, video/flv, video/wmv, video/mpg, video/quicktime';
const FileInput = /*#__PURE__*/(0, _react.forwardRef)(({
fileSelectionIcons = ['fa fa-upload'],
imageSelectIcons = ['ts-image'],
fileTypes,
onMaxFilesReached,
maxFiles,
onRemove,
files,
isDisabled,
maxFileSizeInMB,
onAdd,
fileSelectionPlaceholder = 'Dateien hochladen',
imageSelectPlaceholder,
shouldPreventImageUpload = false,
shouldAllowDownload,
shouldEnableKeyboardHighlighting
}, ref) => {
const [internalFiles, setInternalFiles] = (0, _react.useState)([]);
const [internalImages, setInternalImages] = (0, _react.useState)([]);
const handleInputClear = () => {
setInternalFiles([]);
setInternalImages([]);
};
(0, _react.useImperativeHandle)(ref, () => ({
clear: handleInputClear
}), []);
const handleAddImages = (0, _react.useCallback)(images => {
const newImages = [];
images.forEach(image => {
if (!(0, _file.filterDuplicateFileUrls)({
files: internalImages,
newFile: image
})) {
newImages.push(image);
}
});
let tmp = newImages;
if (maxFiles) {
tmp = newImages.slice(0, maxFiles - (internalFiles.length + internalImages.length + ((files === null || files === void 0 ? void 0 : files.length) ?? 0)));
}
if (tmp.length > 0 && typeof onAdd === 'function') {
onAdd(tmp);
}
setInternalImages(prevState => [...prevState, ...tmp]);
}, [files === null || files === void 0 ? void 0 : files.length, internalFiles.length, internalImages, maxFiles, onAdd]);
const handleAddFiles = (0, _react.useCallback)(newFiles => {
const newFileItems = [];
newFiles.forEach(file => {
if (fileTypes && !(0, _file.isValidFileType)({
file,
types: fileTypes
})) {
return;
}
if (file && !(0, _file.filterDuplicateFile)({
files: internalFiles,
newFile: file
})) {
newFileItems.push(file);
}
});
let tmp = newFileItems;
if (maxFiles) {
tmp = newFileItems.slice(0, maxFiles - (internalFiles.length + ((files === null || files === void 0 ? void 0 : files.length) ?? 0)));
}
if (tmp.length > 0 && typeof onAdd === 'function') {
onAdd(tmp);
}
setInternalFiles(prevState => [...prevState, ...tmp]);
}, [fileTypes, files === null || files === void 0 ? void 0 : files.length, internalFiles, maxFiles, onAdd]);
const handleAdd = (0, _react.useCallback)(newFiles => {
if (Array.isArray(newFiles) && newFiles.length > 0) {
if (newFiles[0] && 'url' in newFiles[0]) {
handleAddImages(newFiles);
} else {
handleAddFiles(newFiles);
}
}
}, [handleAddFiles, handleAddImages]);
const handleDeleteFile = (0, _react.useCallback)(id => {
let fileToDelete;
const filteredFiles = internalFiles.filter(file => {
const {
name
} = file;
if (name === id) {
fileToDelete = file;
}
return name !== id;
});
setInternalFiles(filteredFiles);
if (!fileToDelete) {
const filteredImages = internalImages.filter(image => {
if (image.name === id) {
fileToDelete = image;
}
return image.name !== id;
});
setInternalImages(filteredImages);
}
if (!fileToDelete) {
files === null || files === void 0 || files.forEach(file => {
if (file.id === id || file.name === id) {
fileToDelete = file;
}
});
}
if (!fileToDelete || typeof onRemove !== 'function') {
return;
}
onRemove(fileToDelete);
}, [files, internalFiles, internalImages, onRemove]);
const internalIsDisabled = (0, _react.useMemo)(() => {
if (isDisabled) {
return true;
}
if (maxFiles) {
if (internalFiles.length + internalImages.length >= maxFiles) {
if (typeof onMaxFilesReached === 'function') {
onMaxFilesReached();
}
return true;
}
}
return false;
}, [internalFiles.length, internalImages.length, isDisabled, maxFiles, onMaxFilesReached]);
const filesToDisplay = (0, _react.useMemo)(() => {
const items = internalFiles.map(file => ({
id: file.name,
name: file.name,
size: file.size,
mimeType: file.type,
source: file
}));
internalImages.forEach(image => {
items.push({
id: image.name ?? image.url,
name: image.name ?? image.url,
size: image.size ?? 0,
mimeType: 'image/png',
source: image.url
});
});
files === null || files === void 0 || files.forEach(file => {
items.push(file);
});
return items;
}, [files, internalFiles, internalImages]);
return (0, _react.useMemo)(() => /*#__PURE__*/_react.default.createElement(_FileInput.StyledFileInput, null, /*#__PURE__*/_react.default.createElement(_FileSelect.default, {
shouldPreventImageUpload: shouldPreventImageUpload,
shouldEnableKeyboardHighlighting: shouldEnableKeyboardHighlighting,
maxFiles: maxFiles,
fileTypes: fileTypes,
fileSelectionIcons: fileSelectionIcons,
fileSelectionPlaceholder: fileSelectionPlaceholder,
imageSelectIcons: imageSelectIcons,
imageSelectPlaceholder: imageSelectPlaceholder,
maxFileSizeInMB: maxFileSizeInMB,
isDisabled: internalIsDisabled,
onAdd: handleAdd
}), /*#__PURE__*/_react.default.createElement(_FileList.default, {
files: filesToDisplay,
onRemove: handleDeleteFile,
shouldAllowDownload: shouldAllowDownload
})), [shouldPreventImageUpload, shouldEnableKeyboardHighlighting, maxFiles, fileTypes, fileSelectionIcons, fileSelectionPlaceholder, imageSelectIcons, imageSelectPlaceholder, maxFileSizeInMB, internalIsDisabled, handleAdd, filesToDisplay, handleDeleteFile, shouldAllowDownload]);
});
FileInput.displayName = 'FileInput';
var _default = exports.default = FileInput;
//# sourceMappingURL=FileInput.js.map