@@ -0,0 +1,74 @@ | |||||
// material-ui | |||||
import { Button, Grid } from '@mui/material'; | |||||
import { Link } from 'react-router-dom'; | |||||
import Typography from '@mui/material/Typography'; | |||||
// import iAmSmartICon from 'assets/images/icons/icon_iAmSmart.png'; | |||||
// import banner from 'assets/images/bg_ml.jpg'; | |||||
import { Stack } from '../../../node_modules/@mui/material/index'; | |||||
import { useEffect, useState } from 'react'; | |||||
import { useParams } from 'react-router-dom'; | |||||
import axios from 'axios'; | |||||
import { GET_VERIFY_USER_ACCOUNT } from 'utils/ApiPathConst'; | |||||
import Loadable from 'components/Loadable'; | |||||
import { lazy } from 'react'; | |||||
const LoadingComponent = Loadable(lazy(() => import('../extra-pages/LoadingComponent'))); | |||||
const AuthWrapper = Loadable(lazy(() => import('./AuthWrapperCustom'))); | |||||
import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; | |||||
import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined'; | |||||
export default function Verify() { | |||||
const [isLoading, setIsLoading] = useState(true) | |||||
const [verifyState, setVerifyState] = useState(null) | |||||
const params = useParams() | |||||
const handleVerify = async () => { | |||||
const response = await axios.get(GET_VERIFY_USER_ACCOUNT, { | |||||
params: { | |||||
email: decodeURIComponent(params.email), | |||||
emailVerifyHash: decodeURIComponent(params.verifyCode) | |||||
} | |||||
}) | |||||
if (response.status === 200 && response.data) { | |||||
setVerifyState(true) | |||||
} else { | |||||
setVerifyState(false) | |||||
} | |||||
setIsLoading(false) | |||||
} | |||||
let enterUseEffect = false | |||||
useEffect(() => { | |||||
if (enterUseEffect) handleVerify() | |||||
enterUseEffect = true | |||||
}, []) | |||||
return ( | |||||
<Stack sx={{ width: '100%', fontSize: '2rem', paddingTop: '65px' }} alignItems="center"> | |||||
<AuthWrapper> | |||||
{isLoading || verifyState == null ? | |||||
<LoadingComponent /> : | |||||
<Grid item xs={12}> | |||||
{verifyState ? | |||||
// SUCCESS page | |||||
<Stack mt={1} direction="column" justifyContent="flex-start" alignItems="center" spacing={2}> | |||||
<CheckCircleOutlineIcon color="success" sx={{ width: "200px", height: "200px" }} /> | |||||
<Typography display="inline" variant="h4">帳戶已成功驗證。</Typography> | |||||
<Button variant="outlined" component={Link} to="/login" sx={{ fontSize: 20, height: '60px' }}><Typography variant="h5">返回登入頁面</Typography></Button> | |||||
</Stack> | |||||
: | |||||
// ERROR page | |||||
<Stack mt={1} direction="column" justifyContent="flex-start" alignItems="center" spacing={2}> | |||||
{/* <Button disabled={true} hidden={true} variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> */} | |||||
<CancelOutlinedIcon color="error" sx={{ width: "200px", height: "200px" }} /> | |||||
<Typography display="inline" variant="h4">驗證失敗,請聯絡相關的系統管理員協助。</Typography> | |||||
<Button color="error" variant="outlined" component={Link} to="/login" sx={{ fontSize: 20, height: '60px' }}><Typography variant="h5">返回登入頁面</Typography></Button> | |||||
</Stack> | |||||
} | |||||
</Grid> | |||||
} | |||||
</AuthWrapper> | |||||
</Stack> | |||||
) | |||||
} |
@@ -18,42 +18,47 @@ import { | |||||
import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined'; | import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined'; | ||||
const PasswordAlertDialog = (props) => { | const PasswordAlertDialog = (props) => { | ||||
console.log(props) | |||||
return ( | return ( | ||||
<Dialog | |||||
<Dialog | |||||
open={props.open} | open={props.open} | ||||
onClose={props.handleClose} | onClose={props.handleClose} | ||||
aria-labelledby="alert-dialog-title" | aria-labelledby="alert-dialog-title" | ||||
aria-describedby="alert-dialog-description" | aria-describedby="alert-dialog-description" | ||||
> | |||||
<DialogTitle id="alert-dialog-title"> | |||||
<Stack mt={1} mr={4} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | |||||
<CancelOutlinedIcon color="error" sx={{width:"35px",height:"40px"}}/> | |||||
{props.errorMassage==='ACCOUNT_LOCKED_ERROR'? | |||||
<Stack direction="column"> | |||||
<Typography display="inline"> | |||||
帳戶將被封鎖 | |||||
</Typography> | |||||
<Typography display="inline"> | |||||
帳戶連續五次登入錯誤,請與系統管理員聯絡 | |||||
</Typography> | |||||
</Stack>: | |||||
<Typography display="inline"> | |||||
用戶名或密碼錯誤 | |||||
</Typography> | |||||
} | |||||
</Stack> | |||||
</DialogTitle> | |||||
<DialogContent> | |||||
<DialogContentText id="alert-dialog-description"> | |||||
{""} | |||||
</DialogContentText> | |||||
</DialogContent> | |||||
<DialogActions> | |||||
<Button variant="contained" color="error" onClick={props.handleClose} autoFocus> | |||||
關閉 | |||||
</Button> | |||||
</DialogActions> | |||||
</Dialog> | |||||
> | |||||
<DialogTitle id="alert-dialog-title"> | |||||
<Stack mt={1} mr={4} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | |||||
<CancelOutlinedIcon color="error" sx={{ width: "35px", height: "40px" }} /> | |||||
{props.errorMassage === 'ACCOUNT_LOCKED_ERROR' ? | |||||
<Stack direction="column"> | |||||
<Typography display="inline"> | |||||
帳戶將被封鎖 | |||||
</Typography> | |||||
<Typography display="inline"> | |||||
帳戶連續五次登入錯誤,請與系統管理員聯絡 | |||||
</Typography> | |||||
</Stack> : | |||||
props.errorMassage === 'ACCOUNT_VERIFIED_ERROR' ? | |||||
<Typography display="inline"> | |||||
帳戶尚未驗證 | |||||
</Typography> : | |||||
<Typography display="inline"> | |||||
用戶名或密碼錯誤 | |||||
</Typography> | |||||
} | |||||
</Stack> | |||||
</DialogTitle> | |||||
<DialogContent> | |||||
<DialogContentText id="alert-dialog-description"> | |||||
{""} | |||||
</DialogContentText> | |||||
</DialogContent> | |||||
<DialogActions> | |||||
<Button variant="contained" color="error" onClick={props.handleClose} autoFocus> | |||||
關閉 | |||||
</Button> | |||||
</DialogActions> | |||||
</Dialog> | |||||
); | ); | ||||
}; | }; | ||||
@@ -12,6 +12,7 @@ const RegisterForm = Loadable(lazy(() => import('pages/authentication/Register') | |||||
const BusRegisterForm = Loadable(lazy(() => import('pages/authentication/BusRegister'))); | const BusRegisterForm = Loadable(lazy(() => import('pages/authentication/BusRegister'))); | ||||
const ErrorPage = Loadable(lazy(() => import('pages/extra-pages/ErrorPage'))); | const ErrorPage = Loadable(lazy(() => import('pages/extra-pages/ErrorPage'))); | ||||
const TestMailPage = Loadable(lazy(() => import('pages/pnspsNotifyTest'))); | const TestMailPage = Loadable(lazy(() => import('pages/pnspsNotifyTest'))); | ||||
const VerifyPage = Loadable(lazy(() => import('pages/authentication/Verify'))); | |||||
// ==============================|| AUTH ROUTING ||============================== // | // ==============================|| AUTH ROUTING ||============================== // | ||||
@@ -42,6 +43,10 @@ const LoginRoutes = { | |||||
{ | { | ||||
path: 'testMailPage', | path: 'testMailPage', | ||||
element: <TestMailPage/> | element: <TestMailPage/> | ||||
}, | |||||
{ | |||||
path: 'verify/:verifyCode/:email', | |||||
element: <VerifyPage/> | |||||
} | } | ||||
] | ] | ||||
}; | }; | ||||
@@ -45,6 +45,7 @@ export const POST_CAPTCHA = apiPath+'/captcha'; | |||||
export const POST_PUBLIC_USER_REGISTER = apiPath+'/user/register'; | export const POST_PUBLIC_USER_REGISTER = apiPath+'/user/register'; | ||||
export const GET_USERNAME = apiPath+'/user/username'; | export const GET_USERNAME = apiPath+'/user/username'; | ||||
export const GET_USER_EMAIL = apiPath+'/user/email'; | export const GET_USER_EMAIL = apiPath+'/user/email'; | ||||
export const GET_VERIFY_USER_ACCOUNT = apiPath+'/user/verifyEmail'; | |||||
//Public | //Public | ||||
export const GET_PUBLIC_ORG_USER_LIST = apiPath+'/user/listOrg'; | export const GET_PUBLIC_ORG_USER_LIST = apiPath+'/user/listOrg'; | ||||