@novin-dev/formalite
Version:
Generate MUI form with few line of code
187 lines (184 loc) • 9.78 kB
JavaScript
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