UNPKG

@novin-dev/formalite

Version:

Generate MUI form with few line of code

187 lines (184 loc) 9.78 kB
import { __spreadArray, __assign } from 'tslib'; import React, { useState, useRef, useLayoutEffect, useCallback, useEffect } from 'react'; import { useTheme, Grid, FormLabel, FormControl, FormHelperText } from '@mui/material'; import { getData, checkIsMin } from '../../../config/utils.js'; import { styled, alpha } from '@mui/material/styles'; import { useDropzone } from 'react-dropzone'; import BlockContent from '../Components/BlockContent.js'; import RejectionFiles from '../Components/RejectionFiles.js'; import { TextViewSkeleton } from '../../Bases/SkeletonBase.js'; import { baseMemo } from '../../Bases/functions/memo.js'; import { getNameFromUrl } from '../../../../../config/utils.js'; var DropZoneStyle = styled("div")(function (_a) { var theme = _a.theme; return ({ outline: "none", overflow: "hidden", position: "relative", padding: theme.spacing(4, 1), borderRadius: theme.shape.borderRadius, transition: theme.transitions.create("padding"), backgroundColor: theme.palette.grey[theme.palette.mode === "light" ? 200 : 800], border: "1px dashed ".concat(alpha(theme.palette.grey["500"], 0.32)), "&:hover": { background: alpha(theme.palette.grey[theme.palette.mode === "light" ? 200 : 800], 0.72), cursor: "pointer", }, }); }); var SingleDropZoneView = function (props) { var allData = props.allData, name = props.name, formik = props.formik, loading = props.loading, validationSchema = props.validationSchema, translator = props.translator; var onUpload = allData.onUpload, inputProps = allData.inputProps, layoutProps = allData.layoutProps, onDelete = allData.onDelete, imageDownloader = allData.imageDownloader; var _a = inputProps.dropZoneOptions, dropZoneOptions = _a === void 0 ? {} : _a, helperText = inputProps.helperText; var _b = useState([]), file = _b[0], setFile = _b[1]; var _c = useState(false), preventDrop = _c[0], setPreventDefault = _c[1]; var uploadController = new AbortController(); var ref = useRef(null); var theme = useTheme(); var _d = useState(false), isLessMd = _d[0], setIsLessMd = _d[1]; useLayoutEffect(function () { var _a; setIsLessMd((((_a = ref.current) === null || _a === void 0 ? void 0 : _a.offsetWidth) || 0) < theme.breakpoints.values.sm); }, []); var uploadFunction = useCallback(function (item) { onUpload(item, function (progress) { setFile(function (pre) { var tempArray = __spreadArray([], pre, true); if (tempArray.length && tempArray[0].status && tempArray[0].original === "selected") { tempArray[0].progress = progress; tempArray[0].status = "uploading"; } return tempArray; }); }, uploadController) .then(function (resId) { setFile(function (pre) { var tempArray = __spreadArray([], pre, true); if (tempArray.length && tempArray[0].original === "selected") { tempArray[0].uid = resId; tempArray[0].status = "done"; tempArray[0].progress = 100; } formik.setFieldValue(String(name), tempArray); return tempArray; }); }) .catch(function (e) { setFile(function (pre) { var tempArray = __spreadArray([], pre, true); if (tempArray.length && tempArray[0].status && tempArray[0].original === "selected") { tempArray[0].status = "error"; tempArray[0].errorText = e.message; } return tempArray; }); }); }, []); useEffect(function () { if (getData({ source: formik.values, key: name }) && getData({ source: formik.values, key: name }).length) { var firstData_1 = getData({ source: formik.values, key: name })[0]; var controller_1 = new AbortController(); if (firstData_1.original !== "selected" && !!firstData_1.preview) { setPreventDefault(true); if (imageDownloader) { imageDownloader(firstData_1.preview, controller_1) .then(function (res) { var data = Object.assign(firstData_1, { original: "default", status: "done", base64: res.base64, preview: res.base64, originalName: res.originalName, size: res.size, errorText: "", controller: controller_1, }); setFile([data]); setPreventDefault(false); }) .catch(function (e) { var data = Object.assign(firstData_1, { original: "default", status: "error", errorText: e.message, }); setFile([data]); setPreventDefault(false); }); } else { var data = Object.assign(firstData_1, { original: "default", status: "done", base64: firstData_1.preview, preview: firstData_1.preview, originalName: getNameFromUrl(firstData_1.preview), size: 0, errorText: "", controller: controller_1, }); setFile([data]); setPreventDefault(false); } } } }, [formik.values]); var _e = useDropzone(__assign(__assign({ multiple: false }, dropZoneOptions), { disabled: preventDrop, onDrop: function (acceptedFiles) { var tempFile = Object.assign(acceptedFiles[0], { original: "selected", status: "uploading", progress: 0, uid: new Date().getTime().toString(), preview: URL.createObjectURL(acceptedFiles[0]), errorText: "", controller: new AbortController(), }); setFile([tempFile]); uploadFunction(tempFile); } })), inputRef = _e.inputRef, getRootProps = _e.getRootProps, getInputProps = _e.getInputProps, isDragActive = _e.isDragActive, isDragReject = _e.isDragReject, fileRejections = _e.fileRejections; if (loading) { return (React.createElement(Grid, __assign({ item: true }, allData.layoutProps), React.createElement(TextViewSkeleton, { height: 253, hasHelper: !!helperText }))); } return (React.createElement(Grid, __assign({ item: true }, layoutProps, { id: String(name), ref: ref }), inputProps.label && (React.createElement(FormLabel, { component: "legend", required: checkIsMin({ schema: validationSchema, formikValues: formik.values, key: String(name), }) }, inputProps.label)), React.createElement(DropZoneStyle, __assign({}, getRootProps(), { sx: __assign(__assign({}, (isDragActive && { opacity: 0.72 })), ((isDragReject || (!!getData({ source: formik.errors, key: name }) && getData({ source: formik.touched, key: name }))) && { color: "error.main", borderColor: "error.light", bgcolor: "error.lighter", })) }), React.createElement("input", __assign({}, getInputProps(), { ref: inputRef, "data-testid": "drop-input" })), React.createElement(BlockContent, { isLessMd: isLessMd, file: file[0], onDelete: onDelete, setFile: setFile, resetDropZone: function () { formik.setFieldValue(String(name), []); }, required: checkIsMin({ schema: validationSchema, formikValues: formik.values, key: String(name), }), uploadFunction: uploadFunction, uploadController: uploadController })), (fileRejections.length > 0 || (typeof file[0] === "object" && file[0].status === "error")) && (React.createElement(RejectionFiles, { fileRejections: fileRejections, fileState: file[0] })), helperText || (getData({ source: formik.touched, key: name }) && Boolean(getData({ source: formik.errors, key: name }))) ? (React.createElement(FormControl, null, React.createElement(FormHelperText, { error: getData({ source: formik.touched, key: name }) && Boolean(getData({ source: formik.errors, key: name })) }, getData({ source: formik.touched, key: name }) && getData({ source: formik.errors, key: name }) ? translator(getData({ source: formik.errors, key: name })) : helperText))) : null)); }; var SingleDropZoneView$1 = React.memo(SingleDropZoneView, function (prevProps, nextProps) { return baseMemo(prevProps, nextProps); }); export { SingleDropZoneView$1 as default }; //# sourceMappingURL=SingleDropZoneView.js.map