added change username and pw close #68
All checks were successful
SimcoDash/simcompanies-dashboard/pipeline/head This commit looks good
All checks were successful
SimcoDash/simcompanies-dashboard/pipeline/head This commit looks good
This commit is contained in:
148
frontend/src/components/profile/changePassword.js
Normal file
148
frontend/src/components/profile/changePassword.js
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
import React, { useEffect } from 'react';
|
||||||
|
import Typography from '@material-ui/core/Typography';
|
||||||
|
import Grid from '@material-ui/core/Grid';
|
||||||
|
import Button from '@material-ui/core/Button';
|
||||||
|
import TextField from '@material-ui/core/TextField';
|
||||||
|
import LoginFeedback from '../login/loginfeedback';
|
||||||
|
import Box from '@material-ui/core/Box';
|
||||||
|
|
||||||
|
export default function ChangePassword(props) {
|
||||||
|
const url = "/simcompanies/API/user/setpassword"
|
||||||
|
const [password, setPassword] = React.useState("");
|
||||||
|
const [passwordNew, setPasswordNew] = React.useState("");
|
||||||
|
const [passwordNew2, setPasswordNew2] = React.useState("");
|
||||||
|
const [disabled, setDisabled] = React.useState(false);
|
||||||
|
const [error, setError] = React.useState(false);
|
||||||
|
const [statusText, setStatusText] = React.useState(null);
|
||||||
|
const [status, setStatus] = React.useState(null);
|
||||||
|
|
||||||
|
const postSetPassword = async (url, data) => {
|
||||||
|
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: 'POST',
|
||||||
|
mode: 'cors',
|
||||||
|
cache: 'no-cache',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
redirect: 'follow',
|
||||||
|
referrerPolicy: 'no-referrer',
|
||||||
|
body: JSON.stringify(data)
|
||||||
|
});
|
||||||
|
|
||||||
|
const text = await response.text()
|
||||||
|
await setStatusText(text)
|
||||||
|
setStatus(response.status)
|
||||||
|
setDisabled(false)
|
||||||
|
setTimeout(() => { setStatus(null) }, 2000)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleClick = (e) => {
|
||||||
|
|
||||||
|
if (passwordNew !== "" && password !== "" && passwordNew2 === passwordNew) {
|
||||||
|
setDisabled(true)
|
||||||
|
postSetPassword(url, { oldpassword: password, newpassword: passwordNew })
|
||||||
|
|
||||||
|
setPassword("")
|
||||||
|
setPasswordNew("")
|
||||||
|
setPasswordNew2("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleKeyDown = (e) => {
|
||||||
|
if (e.key === "Enter") {
|
||||||
|
if (passwordNew !== "" && password !== "" && passwordNew2 === passwordNew) {
|
||||||
|
setDisabled(true)
|
||||||
|
postSetPassword(url, { oldpassword: password, newpassword: passwordNew })
|
||||||
|
|
||||||
|
setPassword("")
|
||||||
|
setPasswordNew("")
|
||||||
|
setPasswordNew2("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
useEffect(() => {
|
||||||
|
if (passwordNew2 === passwordNew) {
|
||||||
|
setError(false)
|
||||||
|
} else {
|
||||||
|
setError(true)
|
||||||
|
}
|
||||||
|
}, [passwordNew, passwordNew2, setError])
|
||||||
|
|
||||||
|
const handleChangePWNew = (e) => {
|
||||||
|
setPasswordNew(e.target.value)
|
||||||
|
}
|
||||||
|
const handleChangePWNew2 = (e) => {
|
||||||
|
setPasswordNew2(e.target.value)
|
||||||
|
}
|
||||||
|
const handleChangePW = (e) => {
|
||||||
|
setPassword(e.target.value)
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Grid container spacing={2} >
|
||||||
|
<Grid item xs={12} >
|
||||||
|
<Box display="flex" justifyContent="center">
|
||||||
|
<Typography variant="h5">
|
||||||
|
Change Password
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={12}>
|
||||||
|
<Box display="flex" justifyContent="center">
|
||||||
|
<TextField
|
||||||
|
error={status != null && status !== 200}
|
||||||
|
id="oldPasswordInput"
|
||||||
|
type="password"
|
||||||
|
label="Old Password"
|
||||||
|
autoComplete="current-password"
|
||||||
|
variant="outlined"
|
||||||
|
value={password}
|
||||||
|
onChange={handleChangePW}
|
||||||
|
onKeyDown={handleKeyDown}
|
||||||
|
disabled={disabled}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={12}>
|
||||||
|
<Box display="flex" justifyContent="center">
|
||||||
|
<TextField
|
||||||
|
error={(status != null && status !== 200) || error}
|
||||||
|
id="NewPasswordInput"
|
||||||
|
type="password"
|
||||||
|
label="New Password"
|
||||||
|
autoComplete="current-password"
|
||||||
|
variant="outlined"
|
||||||
|
value={passwordNew}
|
||||||
|
onChange={handleChangePWNew}
|
||||||
|
onKeyDown={handleKeyDown}
|
||||||
|
disabled={disabled}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={12}>
|
||||||
|
<Box display="flex" justifyContent="center">
|
||||||
|
<TextField
|
||||||
|
error={(status != null && status !== 200) || error}
|
||||||
|
id="NewPasswordRepeatInput"
|
||||||
|
type="password"
|
||||||
|
label="Repeat New Password"
|
||||||
|
autoComplete="current-password"
|
||||||
|
variant="outlined"
|
||||||
|
value={passwordNew2}
|
||||||
|
onChange={handleChangePWNew2}
|
||||||
|
onKeyDown={handleKeyDown}
|
||||||
|
disabled={disabled}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={12}>
|
||||||
|
<Box display="flex" justifyContent="center">
|
||||||
|
<Button disabled={disabled} variant="contained" color="secondary" onClick={handleClick}>
|
||||||
|
Change Password
|
||||||
|
</Button>
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
<LoginFeedback login={status} text={statusText}></LoginFeedback>
|
||||||
|
</Grid>
|
||||||
|
);
|
||||||
|
}
|
||||||
117
frontend/src/components/profile/changeUsername.js
Normal file
117
frontend/src/components/profile/changeUsername.js
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Typography from '@material-ui/core/Typography';
|
||||||
|
import Grid from '@material-ui/core/Grid';
|
||||||
|
import Button from '@material-ui/core/Button';
|
||||||
|
import TextField from '@material-ui/core/TextField';
|
||||||
|
import LoginFeedback from '../login/loginfeedback';
|
||||||
|
import Box from '@material-ui/core/Box';
|
||||||
|
|
||||||
|
export default function ChangeUsername(props) {
|
||||||
|
const url = "/simcompanies/API/user/setname"
|
||||||
|
const [username, setUsername] = React.useState("");
|
||||||
|
const [password, setPassword] = React.useState("");
|
||||||
|
const [disabled, setDisabled] = React.useState(false);
|
||||||
|
const [statusText, setStatusText] = React.useState(null);
|
||||||
|
const [status, setStatus] = React.useState(null);
|
||||||
|
|
||||||
|
const postSetName = async (url, data) => {
|
||||||
|
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: 'POST',
|
||||||
|
mode: 'cors',
|
||||||
|
cache: 'no-cache',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
redirect: 'follow',
|
||||||
|
referrerPolicy: 'no-referrer',
|
||||||
|
body: JSON.stringify(data)
|
||||||
|
});
|
||||||
|
|
||||||
|
const text = await response.text()
|
||||||
|
await setStatusText(text)
|
||||||
|
setStatus(response.status)
|
||||||
|
setDisabled(false)
|
||||||
|
setTimeout(() => { setStatus(null) }, 2000)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleClick = (e) => {
|
||||||
|
|
||||||
|
if (username !== "" && password !== "") {
|
||||||
|
setDisabled(true)
|
||||||
|
postSetName(url, { email: username, password: password })
|
||||||
|
|
||||||
|
setUsername("")
|
||||||
|
setPassword("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleKeyDown = (e) => {
|
||||||
|
if (e.key === "Enter") {
|
||||||
|
if (username !== "" && password !== "") {
|
||||||
|
setDisabled(true)
|
||||||
|
postSetName(url, { email: username, password: password })
|
||||||
|
|
||||||
|
setUsername("")
|
||||||
|
setPassword("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleChangeUSR = (e) => {
|
||||||
|
setUsername(e.target.value)
|
||||||
|
}
|
||||||
|
const handleChangePW = (e) => {
|
||||||
|
setPassword(e.target.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Grid container spacing={2} >
|
||||||
|
<Grid item xs={12} >
|
||||||
|
<Box display="flex" justifyContent="center">
|
||||||
|
<Typography variant="h5">
|
||||||
|
Change Username
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={12} >
|
||||||
|
<Box display="flex" justifyContent="center">
|
||||||
|
<TextField
|
||||||
|
error={status != null && status !== 200}
|
||||||
|
id="newUsernameInput"
|
||||||
|
label="New Username"
|
||||||
|
variant="outlined"
|
||||||
|
value={username}
|
||||||
|
onChange={handleChangeUSR}
|
||||||
|
onKeyDown={handleKeyDown}
|
||||||
|
disabled={disabled}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={12}>
|
||||||
|
<Box display="flex" justifyContent="center">
|
||||||
|
<TextField
|
||||||
|
error={status != null && status !== 200}
|
||||||
|
id="passwordInput"
|
||||||
|
type="password"
|
||||||
|
label="Password"
|
||||||
|
autoComplete="current-password"
|
||||||
|
variant="outlined"
|
||||||
|
value={password}
|
||||||
|
onChange={handleChangePW}
|
||||||
|
onKeyDown={handleKeyDown}
|
||||||
|
disabled={disabled}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={12}>
|
||||||
|
<Box display="flex" justifyContent="center">
|
||||||
|
<Button disabled={disabled} variant="contained" color="secondary" onClick={handleClick}>
|
||||||
|
Change Username
|
||||||
|
</Button>
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
<LoginFeedback login={status} text={statusText}></LoginFeedback>
|
||||||
|
</Grid>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,12 +1,47 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Typography from '@material-ui/core/Typography';
|
import Typography from '@material-ui/core/Typography';
|
||||||
|
import Card from '@material-ui/core/Card';
|
||||||
|
import CardContent from '@material-ui/core/CardContent';
|
||||||
|
import { makeStyles } from '@material-ui/core/styles';
|
||||||
|
import Grid from '@material-ui/core/Grid';
|
||||||
|
import ChangeUsername from './changeUsername';
|
||||||
|
import ChangePassword from './changePassword';
|
||||||
|
|
||||||
|
const useStyles = makeStyles((theme) => ({
|
||||||
|
root: {
|
||||||
|
display: 'flex',
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
padding: 20
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
export default function Profile(props) {
|
export default function Profile(props) {
|
||||||
|
const classes = useStyles();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div className={classes.root}>
|
||||||
<Typography variant="h4">
|
<Grid container spacing={2}>
|
||||||
Profile Page
|
<Grid item xs={12}>
|
||||||
</Typography>
|
<Typography variant="h4">
|
||||||
|
Profile Page
|
||||||
|
</Typography>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={12} md={6}>
|
||||||
|
<Card className={classes.card}>
|
||||||
|
<CardContent style={{ padding: 0 }}>
|
||||||
|
<ChangeUsername></ChangeUsername>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={12} md={6}>
|
||||||
|
<Card className={classes.card}>
|
||||||
|
<CardContent style={{ padding: 0 }}>
|
||||||
|
<ChangePassword></ChangePassword>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user