Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 57 additions & 7 deletions portal-ui/src/screens/LoginPage/LoginPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,26 @@ import Button from "@material-ui/core/Button";
import TextField from "@material-ui/core/TextField";
import Grid from "@material-ui/core/Grid";
import Typography from "@material-ui/core/Typography";
import { CircularProgress, Paper } from "@material-ui/core";
import { createStyles, Theme, withStyles } from "@material-ui/core/styles";
import {
CircularProgress,
LinearProgress,
Paper,
TextFieldProps,
} from "@material-ui/core";
import {
createStyles,
makeStyles,
Theme,
withStyles,
} from "@material-ui/core/styles";
import { SystemState } from "../../types";
import { userLoggedIn } from "../../actions";
import api from "../../common/api";
import { ILoginDetails, loginStrategyType } from "./types";
import { setSession } from "../../common/utils";
import history from "../../history";
import { isBoolean } from "util";
import { OutlinedInputProps } from "@material-ui/core/OutlinedInput";

const styles = (theme: Theme) =>
createStyles({
Expand Down Expand Up @@ -121,8 +133,33 @@ const styles = (theme: Theme) =>
jwtInput: {
marginTop: 45,
},
linearPredef: {
height: 10,
},
});

const inputStyles = makeStyles((theme: Theme) =>
createStyles({
disabled: {
"&.MuiInput-underline::before": {
borderColor: "#eaeaea",
borderBottomStyle: "solid",
},
},
})
);

function LoginField(props: TextFieldProps) {
const classes = inputStyles();

return (
<TextField
InputProps={{ classes } as Partial<OutlinedInputProps>}
{...props}
/>
);
}

const mapState = (state: SystemState) => ({
loggedIn: state.loggedIn,
});
Expand Down Expand Up @@ -156,6 +193,7 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {
loginStrategy: loginStrategyType.unknown,
redirect: "",
});
const [loginSending, setLoginSending] = useState<boolean>(false);

const loginStrategyEndpoints: LoginStrategyRoutes = {
form: "/api/v1/login",
Expand All @@ -180,6 +218,7 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {

const formSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
setLoginSending(true);
request
.post(
loginStrategyEndpoints[loginStrategy.loginStrategy] || "/api/v1/login"
Expand All @@ -191,6 +230,7 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {
// store the jwt token
setSession(bodyResponse.sessionId);
} else if (bodyResponse.error) {
setLoginSending(false);
// throw will be moved to catch block once bad login returns 403
throw bodyResponse.error;
}
Expand All @@ -201,6 +241,7 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {
history.push("/");
})
.catch((err) => {
setLoginSending(false);
setError(err.message);
});
};
Expand All @@ -225,7 +266,7 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {
<form className={classes.form} noValidate onSubmit={formSubmit}>
<Grid container spacing={2}>
<Grid item xs={12}>
<TextField
<LoginField
fullWidth
id="accessKey"
value={accessKey}
Expand All @@ -235,10 +276,11 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {
label="Enter Access Key"
name="accessKey"
autoComplete="username"
disabled={loginSending}
/>
</Grid>
<Grid item xs={12}>
<TextField
<LoginField
fullWidth
value={secretKey}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
Expand All @@ -249,6 +291,7 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {
type="password"
id="secretKey"
autoComplete="current-password"
disabled={loginSending}
/>
</Grid>
</Grid>
Expand All @@ -258,11 +301,14 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {
variant="contained"
color="primary"
className={classes.submit}
disabled={secretKey === "" || accessKey === ""}
disabled={secretKey === "" || accessKey === "" || loginSending}
>
Login
</Button>
</Grid>
<Grid item xs={12} className={classes.linearPredef}>
{loginSending && <LinearProgress />}
</Grid>
<Grid item xs={12} className={classes.disclaimer}>
<strong>Don't have an access key?</strong>
<br />
Expand Down Expand Up @@ -314,7 +360,7 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {
<form className={classes.form} noValidate onSubmit={formSubmit}>
<Grid container spacing={2}>
<Grid item xs={12} className={classes.jwtInput}>
<TextField
<LoginField
required
fullWidth
id="jwt"
Expand All @@ -325,6 +371,7 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {
label="JWT"
name="jwt"
autoComplete="Service Account JWT Token"
disabled={loginSending}
/>
</Grid>
</Grid>
Expand All @@ -334,11 +381,14 @@ const Login = ({ classes, userLoggedIn }: ILoginProps) => {
variant="contained"
color="primary"
className={classes.submit}
disabled={jwt === ""}
disabled={jwt === "" || loginSending}
>
Login
</Button>
</Grid>
<Grid item xs={12} className={classes.linearPredef}>
{loginSending && <LinearProgress />}
</Grid>
<Grid item xs={12} className={classes.disclaimer}>
<strong>Don't have an access key?</strong>
<br />
Expand Down