UNPKG

@chayns-components/core

Version:

A set of beautiful React components for developing your own applications with chayns.

175 lines (174 loc) • 6.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _file = require("../../utils/file"); var _FileInput = require("./FileInput.styles"); var _index = require("../../index"); 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 FileInput = /*#__PURE__*/(0, _react.forwardRef)(({ fileSelectionIcons = ['fa fa-upload'], imageSelectIcons = ['ts-image'], fileTypes, onMaxFilesReached, maxFiles, onRemove, files, isDisabled, maxFileSizeInMB, onAdd, fileSelectionPlaceholder = 'Dateien hochladen', imageSelectPlaceholder }, 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 (typeof newFiles[0] === 'string') { 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 === id) { fileToDelete = image; } return image !== 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(({ type, name, size }) => ({ id: name, name, size, mimeType: type })); internalImages.forEach(image => { items.push({ id: image, name: image, size: 0, mimeType: 'image/png' }); }); 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(_index.FileSelect, { fileTypes: fileTypes, fileSelectionIcons: fileSelectionIcons, fileSelectionPlaceholder: fileSelectionPlaceholder, imageSelectIcons: imageSelectIcons, imageSelectPlaceholder: imageSelectPlaceholder, maxFileSizeInMB: maxFileSizeInMB, isDisabled: internalIsDisabled, onAdd: handleAdd }), /*#__PURE__*/_react.default.createElement(_index.FileList, { files: filesToDisplay, onRemove: handleDeleteFile })), [fileTypes, fileSelectionIcons, fileSelectionPlaceholder, imageSelectIcons, imageSelectPlaceholder, maxFileSizeInMB, internalIsDisabled, handleAdd, filesToDisplay, handleDeleteFile]); }); FileInput.displayName = 'FileInput'; var _default = exports.default = FileInput; //# sourceMappingURL=FileInput.js.map