| import React, { useState, useRef, useEffect, useMemo } from "react"; | 
| import { | 
|     useTranslate, | 
|     useNotify, | 
| } from 'react-admin'; | 
| import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form"; | 
| import { | 
|     Stack, | 
|     Box, | 
|     Typography, | 
|     TextField, | 
|     Button, | 
|     CircularProgress, | 
|     InputAdornment, | 
|     IconButton, | 
| } from '@mui/material'; | 
| import { requestResetPassword } from '@/api/auth'; | 
| import Visibility from '@mui/icons-material/Visibility'; | 
| import VisibilityOff from '@mui/icons-material/VisibilityOff'; | 
|   | 
| const SecuritySettings = (props) => { | 
|     const translate = useTranslate(); | 
|     const notify = useNotify(); | 
|     const { userInfo } = props; | 
|   | 
|     const { control, handleSubmit, watch, setValue, getValues, reset, formState: { errors }, setError } = useForm(); | 
|   | 
|     const oldPasswordVal = watch('oldPassword'); | 
|     const newPasswordVal = watch('newPassword'); | 
|     const confirmPasswordVal = watch('confirmPassword'); | 
|   | 
|     const [loading, setLoading] = useState(false); | 
|     const [showOldPassword, setShowOldPassword] = useState(false); | 
|     const [showNewPassword, setShowNewPassword] = useState(false); | 
|   | 
|     useEffect(() => { | 
|         if (userInfo) { | 
|         } | 
|     }, [userInfo, setValue]) | 
|   | 
|     const onSubmit = (params) => { | 
|         setLoading(true); | 
|         requestResetPassword(params).then(res => { | 
|             setLoading(false); | 
|             const { code, msg, data } = res; | 
|             if (code === 200) { | 
|                 notify(msg, { type: 'success', messageArgs: { _: msg } }); | 
|                 reset(); | 
|             } else if (code === 10001) { | 
|                 setError('oldPassword', { | 
|                     message: msg, | 
|                 }); | 
|             } else { | 
|                 notify(msg, { type: 'error', messageArgs: { _: msg } }); | 
|             } | 
|         }).catch((error) => { | 
|             setLoading(false); | 
|             notify(error.message, { type: 'error', messageArgs: { _: error.message } }); | 
|             console.error(error); | 
|         }) | 
|     } | 
|   | 
|     return ( | 
|         <Box | 
|             sx={{ | 
|                 p: 3, | 
|                 flex: 1, | 
|                 overflow: 'auto', | 
|             }} | 
|         > | 
|             <form onSubmit={handleSubmit(onSubmit)} noValidate> | 
|                 <Stack | 
|                     direction='column' | 
|                     spacing={3} | 
|                     sx={{ | 
|                         width: '30%', | 
|                         pt: 1 | 
|                     }} | 
|                 > | 
|                     <Controller | 
|                         name="oldPassword" | 
|                         control={control} | 
|                         defaultValue="" | 
|                         rules={{ required: translate('ra.validation.required') }} | 
|                         render={({ field, fieldState: { error } }) => ( | 
|                             <TextField | 
|                                 {...field} | 
|                                 label={translate('page.settings.resetPwd.currPwd')} | 
|                                 type={showOldPassword ? 'text' : 'password'} | 
|                                 variant="outlined" | 
|                                 autoComplete="off" | 
|                                 error={Boolean(errors.oldPassword)} | 
|                                 helperText={errors.oldPassword?.message || ""} | 
|                                 InputProps={{ | 
|                                     endAdornment: ( | 
|                                         <InputAdornment position="end"> | 
|                                             <IconButton | 
|                                                 aria-label="toggle password visibility" | 
|                                                 onClick={() => setShowOldPassword((show) => !show)} | 
|                                                 onMouseDown={(event) => { event.preventDefault() }} | 
|                                                 edge="end" | 
|                                             > | 
|                                                 {showOldPassword ? <VisibilityOff /> : <Visibility />} | 
|                                             </IconButton> | 
|                                         </InputAdornment> | 
|                                     ), | 
|                                 }} | 
|                             /> | 
|                         )} | 
|                     /> | 
|                     <Controller | 
|                         name="newPassword" | 
|                         control={control} | 
|                         defaultValue="" | 
|                         rules={{ | 
|                             required: translate('ra.validation.required'), | 
|                             pattern: { | 
|                                 value: /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d\.]{6,13}$/, | 
|                                 message: translate('page.settings.resetPwd.tip.pwdInputLimit'), | 
|                             }, | 
|                             validate: (value) => { | 
|                                 if (value === oldPasswordVal) { | 
|                                     return translate('page.settings.resetPwd.tip.pwdNotSameAsOld'); | 
|                                 } | 
|                                 return true; | 
|                             } | 
|                         }} | 
|                         render={({ field, fieldState: { error } }) => ( | 
|                             <TextField | 
|                                 {...field} | 
|                                 label={translate('page.settings.resetPwd.newPwd')} | 
|                                 type={showNewPassword ? 'text' : 'password'} | 
|                                 variant="outlined" | 
|                                 autoComplete="off" | 
|                                 error={Boolean(errors.newPassword)} | 
|                                 helperText={errors.newPassword?.message || ""} | 
|                                 InputProps={{ | 
|                                     endAdornment: ( | 
|                                         <InputAdornment position="end"> | 
|                                             <IconButton | 
|                                                 aria-label="toggle password visibility" | 
|                                                 onClick={() => setShowNewPassword((show) => !show)} | 
|                                                 onMouseDown={(event) => { event.preventDefault() }} | 
|                                                 edge="end" | 
|                                             > | 
|                                                 {showNewPassword ? <VisibilityOff /> : <Visibility />} | 
|                                             </IconButton> | 
|                                         </InputAdornment> | 
|                                     ), | 
|                                 }} | 
|                             /> | 
|                         )} | 
|                     /> | 
|                     <Controller | 
|                         name="confirmPassword" | 
|                         control={control} | 
|                         defaultValue="" | 
|                         rules={{ | 
|                             required: translate('ra.validation.required'), | 
|                             validate: value => | 
|                                 value === newPasswordVal || translate('page.settings.resetPwd.tip.pwdNotMatch'), | 
|                         }} | 
|                         render={({ field, fieldState: { error } }) => ( | 
|                             <TextField | 
|                                 {...field} | 
|                                 label={translate('page.settings.resetPwd.confirmNewPwd')} | 
|                                 type={showNewPassword ? 'text' : 'password'} | 
|                                 variant="outlined" | 
|                                 autoComplete="off" | 
|                                 error={Boolean(errors.confirmPassword)} | 
|                                 helperText={errors.confirmPassword?.message || ""} | 
|                                 InputProps={{ | 
|                                     endAdornment: ( | 
|                                         <InputAdornment position="end"> | 
|                                             <IconButton | 
|                                                 aria-label="toggle password visibility" | 
|                                                 onClick={() => setShowNewPassword((show) => !show)} | 
|                                                 onMouseDown={(event) => { event.preventDefault() }} | 
|                                                 edge="end" | 
|                                             > | 
|                                                 {showNewPassword ? <VisibilityOff /> : <Visibility />} | 
|                                             </IconButton> | 
|                                         </InputAdornment> | 
|                                     ), | 
|                                 }} | 
|                             /> | 
|                         )} | 
|                     /> | 
|                     <Button | 
|                         type="submit" | 
|                         variant="contained" | 
|                         disabled={loading || !(oldPasswordVal && newPasswordVal && confirmPasswordVal)} | 
|                         sx={{ | 
|                             alignSelf: 'flex-start', | 
|                             width: '120px' | 
|                         }} | 
|                     > | 
|                         {loading && <CircularProgress size={25} thickness={2} />} | 
|                         {translate('page.settings.resetPwd.resetBtn')} | 
|                     </Button> | 
|                 </Stack> | 
|             </form> | 
|   | 
|         </Box> | 
|     ) | 
| } | 
|   | 
| export default SecuritySettings; |