import TabPanel from "@mui/lab/TabPanel"; import { useState } from "react"; import { useTheme } from "@emotion/react"; import { Box, Stack, Typography, Button } from "@mui/material"; import { PasswordEndAdornment } from "../../../Components/Inputs/TextInput/Adornments"; import TextInput from "../../../Components/Inputs/TextInput"; import { newOrChangedCredentials } from "../../../Validation/validation"; import Alert from "../../../Components/Alert"; import { update } from "../../../Features/Auth/authSlice"; import { useDispatch, useSelector } from "react-redux"; import { createToast } from "../../../Utils/toastUtils"; import { getTouchedFieldErrors } from "../../../Validation/error"; import { useTranslation } from "react-i18next"; const defaultPasswordsState = { password: "", newPassword: "", confirm: "", }; /** * PasswordPanel component manages the form for editing password. * * @returns {JSX.Element} */ const PasswordPanel = () => { const theme = useTheme(); const dispatch = useDispatch(); const { t } = useTranslation(); const SPACING_GAP = theme.spacing(12); //redux state const { isLoading } = useSelector((state) => state.auth); const idToName = { "edit-current-password": "password", "edit-new-password": "newPassword", "edit-confirm-password": "confirm", }; const [localData, setLocalData] = useState(defaultPasswordsState); const [errors, setErrors] = useState(defaultPasswordsState); const [touchedFields, setTouchedFields] = useState({ password: false, newPassword: false, confirm: false, }); const handleChange = (event) => { const { value, id } = event.target; const name = idToName[id]; const updatedData = { ...localData, [name]: value, }; const updatedTouchedFields = { ...touchedFields, [name]: true, }; const validation = newOrChangedCredentials.validate( { ...updatedData }, { abortEarly: false, context: { password: updatedData.newPassword } } ); const updatedErrors = getTouchedFieldErrors(validation, updatedTouchedFields); if (!touchedFields[name]) { setTouchedFields(updatedTouchedFields); } setLocalData(updatedData); setErrors(updatedErrors); }; const handleSubmit = async (event) => { event.preventDefault(); const { error } = newOrChangedCredentials.validate(localData, { abortEarly: false, context: { password: localData.newPassword }, }); if (error) { const newErrors = {}; error.details.forEach((err) => { newErrors[err.path[0]] = err.message; }); setErrors(newErrors); } else { const action = await dispatch(update({ localData })); if (action.payload.success) { createToast({ body: t( "passwordPanel.passwordChangedSuccess", "Your password was changed successfully." ), }); setLocalData({ password: "", newPassword: "", confirm: "", }); } else { // TODO: Check for other errors? createToast({ body: t( "passwordPanel.passwordInputIncorrect", "Your password input was incorrect." ), }); setErrors({ password: "*" + action.payload.msg + "." }); } } }; return ( ); }; PasswordPanel.propTypes = { // No props are being passed to this component, hence no specific PropTypes are defined. }; export default PasswordPanel;