@@ -4,11 +4,6 @@ import * as React from "react";
import * as HttpUtils from "utils/HttpUtils";
import * as UrlUtils from "utils/ApiPathConst";
import { useNavigate } from "react-router-dom";
import { useDispatch } from "react-redux";
import { handleLogoutFunction,
// handleLogin
} from 'auth/index';
import useJwt from "auth/jwt/useJwt";
import {
Grid,
@@ -34,96 +29,41 @@ import {PNSPS_LONG_BUTTON_THEME} from "themes/buttonConst";
import {ThemeProvider} from "@emotion/react";
import {FormattedMessage, useIntl} from "react-intl";
import { EyeInvisibleOutlined, EyeOutlined } from '@ant-design/icons';
import axios from 'axios';
import { useParams,Link } from 'react-router-dom';
import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';
// import LocaleContext from "components/I18nProvider";
import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline';
import { useDispatch } from "react-redux";
import { handleLogoutFunction} from 'auth/index';
import { isPasswordExpiry } from "utils/Utils";
// ==============================|| DASHBOARD - DEFAULT ||============================== //
const Index = () => {
const dispatch = useDispatch()
const navigate = useNavigate()
const [showPassword, setShowPassword] = React.useState(false);
const [showNewPassword, setShowNewPassword] = React.useState(false);
const [showConfirmPassword, setshowConfirmPassword] = React.useState(false);
const [isLoading, setLoding] = React.useState(true);
const [verifyState, setVerifyState] = React.useState(null)
const [enterUseEffect, setEnterUseEffect] = React.useState(false)
const [username, setUsername] = React.useState("")
// const { setLocale } = React.useContext(LocaleContext);
const params = useParams()
const [isChanged, setIsChanged] = React.useState(false);
const intl = useIntl();
React.useEffect(() => {
console.log(params);
setEnterUseEffect(true)
setLoding(false)
}, []);
React.useEffect(() => {
// console.log("if (enterUseEffect) handleVerify()");
if (enterUseEffect){
handleVerify()
}
}, [enterUseEffect])
const handleVerify = async () => {
console.log(params);
await axios.get(UrlUtils.GET_FORGOT_PASSWORD_VERIFY_USER_ACCOUNT, {
params: {
email: decodeURIComponent(params.email),
emailVerifyHash: decodeURIComponent(params.verifyCode)
}
}).then(
(response)=>{
if (response.status === 200 && response.data) {
console.log(response)
setUsername(response.data.username)
setVerifyState(true)
} else {
setVerifyState(false)
}
setLoding(false)
}
).catch(error => {
console.log(error)
setVerifyState(false)
setLoding(false)
});
}
const goLogin = async (values) =>{
dispatch(handleLogoutFunction());
const goLogin = (values) =>{
console.log(values)
HttpUtils.post({
url: UrlUtils.POST_FORGOT_PASSWORD_NEW _PASSWORD,
url: UrlUtils.PATCH_CHANGE_PASSWORD,
params:{
username: username,
newPassword: values.password
},
onSuccess: () => {
useJwt
.login({ username: username, password: values.password })
.then((
// response
) => {
// console.log(response)
navigate('/forgot/password/success');
location.reload()
// setSumitting(false)
})
.catch((error) => {
console.error(error)
});
password: values.password,
newPassword: values.newPassword
},
onFail: (response)=>{
console.log("Fail");
console.log(response);
// window.location.assign("/iamsmart/loginFail");
onSuccess: function (){
setIsChanged(true);
},
onError:(error)=> {
console.log(error);
onError:function (error) {
console.log(error.response.data);
// window.location.assign("/iamsmart/loginFail");
}
});
@@ -143,6 +83,10 @@ const Index = () => {
setShowPassword(!showPassword);
};
const handleClickShowNewPassword = () => {
setShowNewPassword(!showNewPassword);
};
const handleClickShowConfirmPassword = () => {
setshowConfirmPassword(!showConfirmPassword);
};
@@ -151,6 +95,10 @@ const Index = () => {
event.preventDefault();
};
const handleMouseDownNewPassword = (event) => {
event.preventDefault();
};
const changePassword = (
// value
) => {
@@ -158,11 +106,17 @@ const Index = () => {
// setLevel(strengthColorChi(temp));
};
const logout = () => {
dispatch(handleLogoutFunction());
navigate('/login');
};
const formik = useFormik({
enableReinitialize: true,
initialValues: {
// username: '',
password: '',
newPassword: '',
confirmPassword: '',
// emailVerifyHash: '',
},
@@ -176,9 +130,16 @@ const Index = () => {
.matches(/^(?=.*[A-Z])/, { message: intl.formatMessage({id: 'atLeastOneCapLetter'})})
.matches(/^(?=.*[0-9])/, { message: intl.formatMessage({id: 'atLeast1Number'})})
.matches(/^(?=.*[!@#%&])/, { message: intl.formatMessage({id: 'atLeast1SpecialChar'})}),
newPassword: yup.string().min(8, intl.formatMessage({id: 'atLeast8CharPassword'}))
.required(intl.formatMessage({id: 'requirePassword'}))
.matches(/^\S*$/, { message: (intl.formatMessage({id: 'noSpacePassword'}))})
.matches(/^(?=.*[a-z])/, { message: intl.formatMessage({id: 'atLeastOneSmallLetter'})})
.matches(/^(?=.*[A-Z])/, { message: intl.formatMessage({id: 'atLeastOneCapLetter'})})
.matches(/^(?=.*[0-9])/, { message: intl.formatMessage({id: 'atLeast1Number'})})
.matches(/^(?=.*[!@#%&])/, { message: intl.formatMessage({id: 'atLeast1SpecialChar'})}),
confirmPassword: yup.string().min(8, intl.formatMessage({id: 'atLeast8CharPassword'}))
.required(intl.formatMessage({id: 'pleaseConfirmPassword'}))
.oneOf([yup.ref('password'), null], intl.formatMessage({id: 'samePassword'})),
.oneOf([yup.ref('newP assword'), null], intl.formatMessage({id: 'samePassword'})),
}),
onSubmit: values => {
// console.log(values)
@@ -187,7 +148,7 @@ const Index = () => {
});
return (
isLoading || verifyState == null ?
isLoading ?
<Grid container sx={{ minHeight: '87vh', mb: 3 }} direction="column" justifyContent="center" alignItems="center">
<Grid item>
<LoadingComponent />
@@ -199,23 +160,11 @@ const Index = () => {
<div style={BackgroundHead}>
<Stack direction="row" height='70px' justifyContent="flex-start" alignItems="center">
<Typography ml={15} color='#FFF' variant="h4" sx={{display: { xs: 'none', sm: 'none', md: 'block' }}}>
<FormattedMessage id="forgotUser Password"/>
<FormattedMessage id="userChange Password"/>
</Typography>
</Stack>
</div>
</Grid>
{/* <Grid item xs={12} width={{xs:"90%", sm:"90%", md:"60%", lg:"60%"}}>
<Button
aria-label={intl.formatMessage({id: 'back'})}
title={intl.formatMessage({id: 'back'})}
sx={{ ml: 0, mt: 2.5 }} style={{ border: '2px solid' }} variant="outlined" onClick={() => { navigate(-1) }}
>
<ForwardIcon style={{ height: 30, width: 50, transform: "rotate(180deg)" }} />
</Button>
</Grid> */}
{/* <Grid item xs={12}>
<Typography variant="pnspsFormParagraphBold">申請公共啟事</Typography>
</Grid> */}
<Grid item xs={12} md={12} width={{ sx:"90%", sm:"90%",md: "60%", xs: "90%" }}>
<MainCard
sx={{
@@ -230,16 +179,20 @@ const Index = () => {
border={false}
boxShadow
>
<form onSubmit= {formik.handleSubmit}>
{verifyState ?
// SUCCESS page
{
!isChanged ?
<form onSubmit={formik.handleSubmit}>
<Grid container spacing={4} sx={{ minHeight: {xs:"80vh", sm:"50vh", md: "50vh", lg:"70vh", xl:"50vh"} }} direction="column" justifyContent="flex-start" alignItems="center">
<Grid container direction="column" alignItems="center">
<Grid item xs={12} md={12} lg={12} sx={{ mb: 1, mt:5, }}>
<Typography display="inline" variant="h4">
<FormattedMessage id="verifySuccess"/>
</Typography>
{isPasswordExpiry()?
<Grid container direction="column" alignItems="center">
<Grid item xs={12} md={12} lg={12} sx={{ mb: 1, mt:5, }}>
<Typography display="inline" variant="h4">
<FormattedMessage id="passwordExpired"/>
</Typography>
</Grid>
</Grid>
:
<Grid item xs={12} md={12} lg={12} sx={{ mb: 1,}}>
<InputLabel htmlFor="email-login-title3">
<Typography variant="h5" >
@@ -247,23 +200,27 @@ const Index = () => {
</Typography>
</InputLabel>
</Grid>
</Grid>
{/* <Grid item xs={12} md={12} lg={12} width={{xs:"70%", sm:"60%",md:"50%", lg:"50%"}}>
}
<Grid item xs={12} md={12} lg={12} width={{xs:"70%", sm:"60%",md:"50%", lg:"50%"}}>
<Grid container direction="row" justifyContent="flex-start">
<Grid item xs={12} md={12} lg={12}>
<TextField
fullWidth
onChange={formik.handleChange}
id="emailVerifyHash"
name="emailVerifyHash"
label={intl.formatMessage({id: 'securityCode'}) + ":"}
placeholder={intl.formatMessage({id: 'securityCode'})}
defaultValue={formik.values.emailVerifyHash}
value={formik.values.emailVerifyHash}
error={Boolean(formik.touched.emailVerifyHash && formik.errors.emailVerifyHash)}
autoFocus
onChange={(e) => {
formik.handleChange(e);
changePassword(e.target.value);
}}
id="password"
type={showPassword ? 'text' : 'password'}
name="password"
label={intl.formatMessage({id: 'oldPassword'}) + ":"}
placeholder={intl.formatMessage({id: 'oldPassword'})}
// defaultValue={formik.values.password.trim()}
value={formik.values.password.trim()}
error={Boolean(formik.touched.password && formik.errors.password)}
onBlur={formik.handleBlur}
inputProps={{
maxLength: 50,
onKeyDown: (e) => {
if (e.key === 'Enter') {
e.preventDefault();
@@ -273,29 +230,29 @@ const Index = () => {
InputLabelProps={{
shrink: true
}}
InputProps={{
endAdornment:(
<InputAdornment position="end">
<IconButton
aria-label="toggle password visibility"
onClick={handleClickShowPassword}
onMouseDown={handleMouseDownPassword}
edge="end"
size="large"
>
{showPassword ? <EyeOutlined /> : <EyeInvisibleOutlined />}
</IconButton>
</InputAdornment>
)
}}
/>
</Grid>
{formik.touched.emailVerifyHash && formik.errors.emailVerifyHash && (
<FormHelperText error id="standard-weight-helper-text-username-login">
{formik.errors.emailVerifyHash}
{formik.touched.password && formik.errors.password && (
<FormHelperText error id="helper-text-password-signup ">
{formik.errors.password }
</FormHelperText>
)}
</Grid>
</Grid> */}
<Grid item xs={12} md={12} lg={12} width={{xs:"70%", sm:"60%",md:"50%", lg:"50%"}}>
<Grid container direction="row" justifyContent="flex-start">
<Grid item xs={12} md={12} lg={12}>
<TextField
fullWidth
id="username"
name="username"
label={intl.formatMessage({id: 'userLoginName'}) + ":"}
placeholder={intl.formatMessage({id: 'userLoginName'})}
// defaultValue={username}
value={username}
disabled={true} />
</Grid>
</Grid>
</Grid>
<Grid item xs={12} md={12} lg={12} width={{xs:"70%", sm:"60%",md:"50%", lg:"50%"}}>
<Grid container direction="row" justifyContent="flex-start">
@@ -307,14 +264,14 @@ const Index = () => {
formik.handleChange(e);
changePassword(e.target.value);
}}
id="p assword"
type={showPassword ? 'text' : 'password'}
name="p assword"
id="newP assword"
type={showNew Password ? 'text' : 'password'}
name="newP assword"
label={intl.formatMessage({id: 'newPassword'}) + ":"}
placeholder={intl.formatMessage({id: 'newPassword'})}
// defaultValue={formik.values.password.trim()}
value={formik.values.p assword.trim()}
error={Boolean(formik.touched.password && formik.errors.p assword)}
value={formik.values.newP assword.trim()}
error={Boolean(formik.touched.newPassword && formik.errors.newP assword)}
onBlur={formik.handleBlur}
inputProps={{
onKeyDown: (e) => {
@@ -330,34 +287,22 @@ const Index = () => {
endAdornment:(
<InputAdornment position="end">
<IconButton
aria-label="toggle password visibility"
onClick={handleClickShowPassword}
onMouseDown={handleMouseDownPassword}
aria-label="toggle new password visibility"
onClick={handleClickShowNew Password}
onMouseDown={handleMouseDownNew Password}
edge="end"
size="large"
>
{showPassword ? <EyeOutlined /> : <EyeInvisibleOutlined />}
{showNew Password ? <EyeOutlined /> : <EyeInvisibleOutlined />}
</IconButton>
</InputAdornment>
)
}}
/>
</Grid>
{/* <FormControl fullWidth sx={{ mt: 2 }}>
<Grid container spacing={2} alignItems="center">
<Grid item>
<Box sx={{ bgcolor: level?.color, width: 85, height: 8, borderRadius: '7px' }} />
</Grid>
<Grid item>
<Typography variant="subtitle1">
<FormattedMessage id={level ? level?.label : "pwWeak" }/>
</Typography>
</Grid>
</Grid>
</FormControl> */}
{formik.touched.password && formik.errors.password && (
<FormHelperText error id="helper-text-password-signup">
{formik.errors.password}
{formik.touched.newPassword && formik.errors.newPassword && (
<FormHelperText error id="helper-text-newPassword-signup">
{formik.errors.newPassword}
</FormHelperText>
)}
</Grid>
@@ -374,8 +319,8 @@ const Index = () => {
id="confirmPassword"
type={showConfirmPassword ? 'text' : 'password'}
name="confirmPassword"
label={intl.formatMessage({id: 'confirmPassword'}) + ":"}
placeholder={intl.formatMessage({id: 'confirmPassword'})}
label={intl.formatMessage({id: 'confirmOld Password'}) + ":"}
placeholder={intl.formatMessage({id: 'confirmOld Password'})}
// defaultValue={formik.values.confirmPassword.trim()}
value={formik.values.confirmPassword.trim()}
error={Boolean(formik.touched.confirmPassword && formik.errors.confirmPassword)}
@@ -428,28 +373,28 @@ const Index = () => {
</ThemeProvider>
</Grid>
</Grid>
:
// ERROR page
<Grid container spacing={4} sx={{ minHeight: {xs:"80vh", sm:"70vh", md: "70vh", lg:"70vh", xl:"50vh"} }} direction="column" justifyContent="flex-start" alignItems="center">
<Grid item xs={12} md={12} lg={12} sx={{ mb: 1, mt:5,}}>
{/* <Button disabled={true} hidden={true} variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> */}
<CancelOutlinedIcon color="error" sx={{ width: "200px", height: "200px" }} />
</Grid>
<Grid item xs={12} md={12} lg={12} sx={{ mb: 1, mt:5,}}>
<Typography display="inline" variant="h4">
<FormattedMessage id="verifyFail"/>
</form>
:
<Grid container spacing={4} sx={{ minHeight: {xs:"80vh", sm:"70vh", md: "70vh", lg:"70vh", xl:"50vh"} }} direction="column" justifyContent="flex-start" alignItems="center">
<Grid item xs={12} md={12} lg={12} sx={{ mb: 1, mt:5, }}>
{/* <Button disabled={true} hidden={true} variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> */}
<CheckCircleOutlineIcon color="success" sx={{ width: "200px", height: "200px" }} />
</Grid>
<Grid item xs={12} md={12} lg={12} sx={{ mb: 1, mt:5,}}>
<Typography display="inline" variant="h4">
<FormattedMessage id="resetPasswordSuccess"/>
</Typography>
</Grid>
<Grid item xs={12} md={12} lg={12} sx={{ mb: 1, mt:5,}}>
<Button color="success" variant="outlined" onClick={()=>logout()}>
<Typography variant="h5">
<FormattedMessage id="backToLogin"/>
</Typography>
</Grid>
<Grid item xs={12} md={12} lg={12} sx={{ mb: 1, mt:5,}}>
<Button color="error" variant="outlined" component={Link} to="/login">
<Typography variant="h5">
<FormattedMessage id="backToLogin"/>
</Typography>
</Button>
</Grid>
</Button>
</Grid>
}
</form>
</Grid>
}
</MainCard>
</Grid>
</Grid>