X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/3072cd4bffd6c761c7c0ad760fc85efc7bc9ff6f..3c7e3cdc547ad5468421e1c049daa94b0d4b8bc0:/src/views-components/login-form/login-form.tsx diff --git a/src/views-components/login-form/login-form.tsx b/src/views-components/login-form/login-form.tsx index 80d59995..e4ede79b 100644 --- a/src/views-components/login-form/login-form.tsx +++ b/src/views-components/login-form/login-form.tsx @@ -2,13 +2,16 @@ // // 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'; type CssRules = 'root' | 'loginBtn' | 'card' | 'wrapper' | 'progress'; @@ -41,12 +44,13 @@ const styles: StyleRulesCallback = theme => ({ }, }); -interface LoginFormProps { +type LoginFormProps = DispatchProp & WithStyles & { handleSubmit: (username: string, password: string) => AxiosPromise; -} + loginLabel?: string, +}; export const LoginForm = withStyles(styles)( - ({ handleSubmit, classes }: LoginFormProps & WithStyles) => { + ({ handleSubmit, loginLabel, dispatch, classes }: LoginFormProps) => { const userInput = useRef(null); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); @@ -65,24 +69,37 @@ export const LoginForm = withStyles(styles)( } }, [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); + if (response.data.uuid && response.data.api_token) { + const apiToken = `v2/${response.data.uuid}/${response.data.api_token}`; + dispatch(saveApiToken(apiToken)).finally( + () => dispatch(navigateToRootProject)); + } else { + setError(true); + setHelperText(response.data.message || 'Please try again'); + setFocus(); + } }) .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); + setHelperText(`${err.response && err.response.data && err.response.data.errors[0] || 'Error logging in: '+err}`); + setFocus(); }); }; @@ -96,40 +113,38 @@ export const LoginForm = withStyles(styles)( return ( -
- + +
- -
- setUsername(e.target.value)} - onKeyPress={(e) => handleKeyPress(e)} - /> - setPassword(e.target.value)} - onKeyPress={(e) => handleKeyPress(e)} - /> -
-
- - - - { isSubmitting && } + + setUsername(e.target.value)} + onKeyPress={(e) => handleKeyPress(e)} + /> + setPassword(e.target.value)} + onKeyPress={(e) => handleKeyPress(e)} + /> + + + + + { isSubmitting && }
-
- +
+
); });