//
// SPDX-License-Identifier: AGPL-3.0
-import * as React from 'react';
+import React from 'react';
import { useState, useEffect, useRef } from 'react';
import { withStyles, WithStyles, StyleRulesCallback } from '@material-ui/core/styles';
import CircularProgress from '@material-ui/core/CircularProgress';
import { Button, Card, CardContent, TextField, CardActions } from '@material-ui/core';
import { green } from '@material-ui/core/colors';
import { AxiosPromise } from 'axios';
+import { DispatchProp } from 'react-redux';
+import { saveApiToken } from 'store/auth/auth-action';
+import { navigateToRootProject } from 'store/navigation/navigation-action';
+import { replace } from 'react-router-redux';
type CssRules = 'root' | 'loginBtn' | 'card' | 'wrapper' | 'progress';
},
});
-interface LoginFormProps {
+type LoginFormProps = DispatchProp<any> & WithStyles<CssRules> & {
handleSubmit: (username: string, password: string) => AxiosPromise;
-}
+ loginLabel?: string,
+};
export const LoginForm = withStyles(styles)(
- ({ handleSubmit, classes }: LoginFormProps & WithStyles<CssRules>) => {
+ ({ handleSubmit, loginLabel, dispatch, classes }: LoginFormProps) => {
const userInput = useRef<HTMLInputElement>(null);
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
}
}, [username, password]);
- // This only run once after render.
+ // This only runs once after render.
useEffect(() => {
- userInput.current!.focus();
+ setFocus();
}, []);
+ const setFocus = () => {
+ userInput.current!.focus();
+ };
+
const handleLogin = () => {
+ setError(false);
+ setHelperText('');
setSubmitting(true);
handleSubmit(username, password)
- .then((response) => {
- setError(false);
- console.log("LOGIN SUCESSFUL: ", response);
- setSubmitting(false);
- })
- .catch((err) => {
- setError(true);
- console.log("ERROR: ", err.response);
- setHelperText(`${err.response && err.response.data && err.response.data.errors[0] || 'Error logging in: '+err}`);
- setSubmitting(false);
- });
+ .then((response) => {
+ setSubmitting(false);
+ if (response.data.uuid && response.data.api_token) {
+ const apiToken = `v2/${response.data.uuid}/${response.data.api_token}`;
+ const rd = new URL(window.location.href);
+ const rdUrl = rd.pathname + rd.search;
+ dispatch<any>(saveApiToken(apiToken)).finally(
+ () => {
+ if ((new URL(window.location.href).pathname) !== '/my-account') {
+ rdUrl === '/' ? dispatch(navigateToRootProject) : dispatch(replace(rdUrl))
+ }
+ }
+ );
+ } else {
+ setError(true);
+ setHelperText(response.data.message || 'Please try again');
+ setFocus();
+ }
+ })
+ .catch((err) => {
+ setError(true);
+ setSubmitting(false);
+ setHelperText(`${(err.response && err.response.data && err.response.data.errors[0]) || 'Error logging in: ' + err}`);
+ setFocus();
+ });
};
const handleKeyPress = (e: any) => {
<React.Fragment>
<form className={classes.root} noValidate autoComplete="off">
<Card className={classes.card}>
- <div className={classes.wrapper}>
- <CardContent>
- <div>
+ <div className={classes.wrapper}>
+ <CardContent>
<TextField
inputRef={userInput}
disabled={isSubmitting}
onChange={(e) => setPassword(e.target.value)}
onKeyPress={(e) => handleKeyPress(e)}
/>
- </div>
- </CardContent>
- <CardActions>
- <Button variant="contained" size="large" color="primary"
- className={classes.loginBtn} onClick={() => handleLogin()}
- disabled={isSubmitting || isButtonDisabled}>
- Log in
- </Button>
- </CardActions>
- { isSubmitting && <CircularProgress color='secondary' className={classes.progress} />}
- </div>
+ </CardContent>
+ <CardActions>
+ <Button variant="contained" size="large" color="primary"
+ className={classes.loginBtn} onClick={() => handleLogin()}
+ disabled={isSubmitting || isButtonDisabled}>
+ {loginLabel || 'Log in'}
+ </Button>
+ </CardActions>
+ {isSubmitting && <CircularProgress color='secondary' className={classes.progress} />}
+ </div>
</Card>
</form>
</React.Fragment>