import React, { Component } from 'react'; import { Redirect } from 'react-router-dom'; import { Brand, Button, Level, LevelItem, Login, LoginBox, LoginBoxHeader, LoginBoxBody, LoginFooter, LoginHeaderBrand, TextInput, } from '@patternfly/react-core'; import TowerLogo from '../components/TowerLogo'; import api from '../api'; const LOGIN_ERROR_MESSAGE = 'Invalid username or password. Please try again.'; class LoginPage extends Component { constructor (props) { super(props); this.state = { username: '', password: '', error: '', loading: false, }; } componentWillUnmount () { this.unmounting = true; // todo: state management } safeSetState = obj => !this.unmounting && this.setState(obj); handleUsernameChange = value => this.safeSetState({ username: value, error: '' }); handlePasswordChange = value => this.safeSetState({ password: value, error: '' }); handleSubmit = async event => { const { username, password, loading } = this.state; event.preventDefault(); if (!loading) { this.safeSetState({ loading: true }); try { await api.login(username, password); } catch (error) { if (error.response.status === 401) { this.safeSetState({ error: LOGIN_ERROR_MESSAGE }); } } finally { this.safeSetState({ loading: false }); } } } render () { const { username, password, loading, error } = this.state; const { logo, loginInfo } = this.props; if (api.isAuthenticated()) { return (); } return ( {logo ? : } )} footer={{ loginInfo }} > Welcome to Ansible Tower! Please Sign In.

{ error }

); } } export default LoginPage;