import { Box, Button, Grid, IconButton, Table, TableBody, TableCell, TableRow, TextField } from "@mui/material"; import { useContext, useEffect, useState } from "react"; import { connect } from "react-redux"; import { actionUpdateAvatar } from "../../../actions/actionUpdateAvatar"; import { actionUserUpdate } from "../../../actions/actionUserUpdate"; import { useFormik } from "formik"; import * as Yup from "yup"; import { UIContext } from "../../UIContext"; import { MdVisibility, MdVisibilityOff } from "react-icons/md"; import { ProfileImageEditor } from "../../common/ProfileImageEditor"; const CProfileImageEditor = connect((state) => ({ avatar: state.promise?.aboutMe?.payload?.avatar || null }), { onFileDrop: (acceptedFiles) => actionUpdateAvatar(acceptedFiles[0]), })(ProfileImageEditor); const profileSchema = 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 ProfileForm = ({ profile = {}, promiseStatus, onProfileSave, serverErrors = [] } = {}) => { const [editMod, setEditMod] = useState(false); const [showPassword, setShowPassword] = useState(false); const { setAlert } = useContext(UIContext); const [promiseTimeOut, setPromiseTimeOut] = useState(null); const formik = useFormik({ initialValues: { username: "", password: "", name: "", nick: "", }, validationSchema: profileSchema, validateOnChange: true, validateOnMount: true, onSubmit: () => { onProfileSave(formik.values); setPromiseTimeOut(setTimeout(() => formik.setSubmitting(false), 3000)); }, }); useEffect(() => { return () => { promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); }; }, []); useEffect(() => { profile._id && formik.setFieldValue("_id", profile?._id || ""); formik.setFieldValue("username", profile?.username || ""); formik.setFieldValue("nick", profile?.nick || ""); formik.setFieldValue("name", profile?.name || ""); }, [profile]); useEffect(() => { if (promiseStatus === "FULFILLED") { formik.setSubmitting(false); promiseTimeOut && clearTimeout(promiseTimeOut); setPromiseTimeOut(null); setAlert({ show: true, severity: "success", message: "Готово", }); setEditMod(false); } 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]); return ( Username {editMod ? ( ) : ( formik.values.username )} Nick {editMod ? ( ) : ( formik.values.nick )} Name {editMod ? ( ) : ( formik.values.name )} Password {editMod ? ( setShowPassword((prev) => !prev)} edge="end"> {showPassword ? : } ), }} /> ) : ( "****************" )} {editMod ? ( ) : ( )}
); }; export const CProfileForm = connect( (state) => ({ profile: state.promise?.aboutMe?.payload || {}, promiseStatus: state.promise.userUpsert?.status || null, serverErrors: state.promise?.userUpsert?.error || [], }), { onProfileSave: (profile = {}) => actionUserUpdate(profile), } )(ProfileForm);