import { connect } from "react-redux"; import { useState, useEffect, useContext } from "react"; import { actionUserUpdate } from "../../../actions/actionUserUpdate"; import { UIContext } from "../../UIContext"; import Select from "react-select"; import { Box, Button, Grid, IconButton, InputLabel, Stack, TextField } from "@mui/material"; import { useFormik } from "formik"; import * as Yup from "yup"; import { useNavigate } from "react-router-dom"; import { MdVisibility, MdVisibilityOff } from "react-icons/md"; import { aclList } from "../../../helpers"; import { actionUploadFile } from "../../../actions/actionUploadFile"; import { ProfileImageEditor } from "../../common/ProfileImageEditor"; import { actionPromisesClear } from "../../../actions/actionPromisesClear"; const styles = { multiValue: (base, state) => { return state.data.isFixed ? { ...base, backgroundColor: "gray" } : base; }, multiValueLabel: (base, state) => { return state.data.isFixed ? { ...base, fontWeight: "bold", color: "white", paddingRight: 6 } : base; }, multiValueRemove: (base, state) => { return state.data.isFixed ? { ...base, display: "none" } : base; }, }; const CProfileImageEditor = connect(null, { onFileDrop: (acceptedFiles) => actionUploadFile(acceptedFiles[0]), })(ProfileImageEditor); const userSchema = Yup.object().shape({ name: Yup.string(), username: Yup.string().min(3, "Too Short!").max(15, "Too Long!").required("Required"), password: Yup.string().min(3, "Too Short!").max(15, "Too Long!"), nick: Yup.string(), }); export const UserForm = ({ serverErrors = [], onSaveClick, onSave, onClose, onUnmount, promiseStatus, deletePromiseStatus, avatar = null, user = {}, } = {}) => { const { setAlert } = useContext(UIContext); const [promiseTimeOut, setPromiseTimeOut] = useState(null); const [showPassword, setShowPassword] = useState(false); const [acl, setAcl] = useState([]); const navigate = useNavigate(); useEffect(() => { console.log(promiseStatus); }, [promiseStatus]); const formik = useFormik({ initialValues: { name: "", username: "", nick: "", password: "", }, validationSchema: userSchema, validateOnChange: true, onSubmit: () => { let userToSave = {}; userToSave = formik.values; user?._id && (userToSave._id = user._id); userToSave.acl = acl.map(({ value }) => value); avatar ? (userToSave.avatar = avatar) : delete userToSave.avatar; onSaveClick && onSaveClick(); onSave(userToSave); setPromiseTimeOut(setTimeout(() => formik.setSubmitting(false), 3000)); }, }); const orderOptions = (values) => { return values.filter((v) => v.isFixed).concat(values.filter((v) => !v.isFixed)); }; const onChange = (values, actionMeta) => { switch (actionMeta.action) { case "remove-value": case "pop-value": if (actionMeta.removedValue.isFixed) { return; } break; case "clear": values = aclList.filter((acl) => acl.isFixed); break; } values = orderOptions(values); setAcl(values); }; useEffect(() => { return () => { promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); }; }, []); useEffect(() => { if (promiseStatus === "FULFILLED") { formik.setSubmitting(false); promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); setAlert({ show: true, severity: "success", message: "Готово", }); } if (promiseStatus === "REJECTED") { const errorMessage = (serverErrors ? [].concat(serverErrors) : []).reduce((prev, curr) => prev + "\n" + curr.message, ""); formik.setSubmitting(false); promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); setAlert({ show: true, severity: "error", message: errorMessage, }); } }, [promiseStatus]); useEffect(() => { if (deletePromiseStatus === "FULFILLED") { promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); navigate("/admin/users/"); } if (deletePromiseStatus === "REJECTED") { promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); setAlert({ show: true, severity: "error", message: "Помилка", }); } return () => { onUnmount && onUnmount(); }; }, [deletePromiseStatus]); useEffect(() => { setAcl(orderOptions(aclList.filter((item) => user?.acl?.includes(item.value)) || [])); formik.setFieldValue("name", user.name || ""); formik.setFieldValue("username", user.username || ""); formik.setFieldValue("nick", user.nick || ""); formik.setFieldValue("password", user.password || ""); formik.validateForm(); }, [user]); useEffect(() => { return () => { onClose && onClose(); }; }, []); return ( setShowPassword((prev) => !prev)} edge="end"> {showPassword ? : } ), }} fullWidth sx={{ mt: 2 }} /> Permissions