diff --git a/js/CommonComponents.js b/js/CommonComponents.js index b8407ae..1ed65ed 100644 --- a/js/CommonComponents.js +++ b/js/CommonComponents.js @@ -15,6 +15,8 @@ import { connect } from 'react-redux' import React from "react"; +import { logout } from './api' + export function BigImage(props) { return (
@@ -74,23 +76,14 @@ function Betabadge() { class InvisibleLoginLogoutButtons extends React.Component { - logoutClick() { - console.log("Logged out."); - - /* - /users/sign_out <- DELETE Token invalidieren - /users/validate_token <- GET Token valide? - */ - } - render() { - const { isSignedIn, username, logout } = this.props + const { isSignedIn, username } = this.props if(isSignedIn) { return ( - + ); } else { diff --git a/js/api.js b/js/api.js index 9f45781..79a686c 100644 --- a/js/api.js +++ b/js/api.js @@ -17,6 +17,8 @@ const actiontypes_userinfo = { 'LOGIN_RESULT_SUCCESS' : 'LOGIN_RESULT_SUCCESS', 'LOGIN_RESULT_ERROR' : 'LOGIN_RESULT_ERROR', + 'LOGOUT' : 'LOGOUT', + 'STORE_AUTH_HEADERS' : 'STORE_AUTH_HEADERS', 'REHYDRATE' : 'USERINFO_REHYDRATE', @@ -34,31 +36,30 @@ const defaultstate_userinfo = { uid : null } -export function postRequest(url, data) { +export function postRequest(state, url, data) { return axios.post(api_url + url, data, { - headers : generateHeaders() + headers : generateHeaders(state) }); } -export function getRequest(url, data) { +export function getRequest(state, url, data) { return axios.get(api_url + url, data, { - headers : generateHeaders() + headers : generateHeaders(state) }); } -export function deleteRequest(url, data) { +export function deleteRequest(state, url, data) { return axios.delete(api_url + url, data, { - headers : generateHeaders() + headers : generateHeaders(state) }); } -function generateHeaders() { - var userinfostate = __store.getState().userinfo; - if(userinfostate.isSignedIn) { +function generateHeaders(state) { + if(state.isSignedIn) { return { - 'access-token' : userinfostate.accesstoken, - 'client' : userinfostate.client, - 'uid' : userinfostate.uid + 'access-token' : state.accesstoken, + 'client' : state.client, + 'uid' : state.uid }; } else { return {}; @@ -81,6 +82,9 @@ function storeOptionalToken(response) { function checkForAuthenticationHeaders(response) { if(response.headers) { + + console.log(response); + const requiredHeaders = [ 'access-token', 'client', 'uid', 'expiry', // TODO: Add last header that is required (I don't remember it right now lol) ]; @@ -97,7 +101,7 @@ function checkForAuthenticationHeaders(response) { const reducer_userinfo = (state = defaultstate_userinfo, action) => { switch(action.type) { case actiontypes_userinfo.REGISTER: - postRequest('/users', { + postRequest(state, '/users', { 'username' : action.parameters.username, 'email' : action.parameters.email, 'password' : action.parameters.password @@ -138,7 +142,7 @@ const reducer_userinfo = (state = defaultstate_userinfo, action) => { errorMessages : action.parameters.errorMessages }); case actiontypes_userinfo.LOGIN: - postRequest('/users/sign_in', { + postRequest(state, '/users/sign_in', { email : action.parameters.email, password : action.parameters.password }).then((resp) => { @@ -180,7 +184,20 @@ const reducer_userinfo = (state = defaultstate_userinfo, action) => { error : true, errorMessages : action.parameters.errorMessages }); + + case actiontypes_userinfo.LOGOUT: + return Object.assign({}, state, { + isSignedIn : false, + username : null, + + accesstoken : null, + client : null, + expiry : null, + uid : null + }); + case actiontypes_userinfo.STORE_AUTH_HEADERS: + console.log("Token has been stored."); return Object.assign({}, state, { accesstoken : action.parameters.accesstoken, client : action.parameters.client, @@ -242,6 +259,10 @@ export function login(email, password) { }) } +export function logout() { + __store.dispatch({ type : actiontypes_userinfo.LOGOUT }); +} + export function getState() { return __store.getState(); } diff --git a/pages/login.js b/pages/login.js index 20fd2cc..2c9ee22 100644 --- a/pages/login.js +++ b/pages/login.js @@ -3,6 +3,8 @@ import '../static/everypage.css' import {Footer, TurniereNavigation} from "../js/CommonComponents"; import React from "react"; import {Button, Card, CardBody, Container, Form, FormGroup, Input, Label} from "reactstrap"; +import { login } from '../js/api' +import { connect } from 'react-redux' export default () => (
@@ -34,18 +36,75 @@ function Login() { ); } -function LoginForm() { - return ( -
- - - - - - - - - -
- ); +class LoginErrorList extends React.Component { + + render() { + const { error, errorMessages } = this.props; + if(error) { + return ( + + ); + } else { + return null; + } + } +} + +const mapStateToErrorMessages = (state) => { + const { errorMessages, error } = state.userinfo; + return { errorMessages, error } +}; + +const VisibleLoginErrorList = connect( + mapStateToErrorMessages +)(LoginErrorList); + + +class LoginForm extends React.Component { + + constructor(props) { + super(props); + + this.state = { + email : '', + password : '' + }; + } + + render() { + return ( +
+ + + + + + + + + + + + ); + } + + handlePasswordInput(input) { + this.setState({ password : input.target.value }); + } + + handleEmailInput(input) { + this.setState({ email : input.target.value }); + } } \ No newline at end of file diff --git a/pages/register.js b/pages/register.js index 4a03dd9..e622716 100644 --- a/pages/register.js +++ b/pages/register.js @@ -3,6 +3,7 @@ import '../static/everypage.css' import {Footer, TurniereNavigation} from "../js/CommonComponents"; import React from "react"; import {Button, Card, CardBody, Container, Form, FormGroup, FormText, Input, Label} from "reactstrap"; +import { register } from '../js/api' export default () => (
@@ -34,30 +35,65 @@ function Register() { ); } -function RegisterForm() { - return ( -
- - - - Wenn du anderen dein Turnier zeigst, können sie deinen Benutzernamen sehen. - - - - - Deine E-Mail-Adresse kann nur von dir gesehen werden. - - - - - Dein Passwort muss mindestens 12 Zeichen lang sein. Alle Zeichen sind erlaubt. - - - Du akzeptierst die Datenschutzbestimmungen, wenn du auf Registrieren klickst. - - -
- ); +class RegisterForm extends React.Component { + + constructor(props) { + super(props); + + this.state = { + username : '', + email : '', + password : '' + }; + } + + handleRegisterClick(state) { + const { username, email, password } = state; + + console.log(state); + + console.log(username); + console.log(email); + console.log(password); + } + + render() { + return ( +
+ + + + Wenn du anderen dein Turnier zeigst, können sie deinen Benutzernamen sehen. + + + + + Deine E-Mail-Adresse kann nur von dir gesehen werden. + + + + + Dein Passwort muss mindestens 12 Zeichen lang sein. Alle Zeichen sind erlaubt. + + + Du akzeptierst die Datenschutzbestimmungen, wenn du auf Registrieren klickst. + + +
+ ); + } + + handlePasswordInput(input) { + this.setState({ password : input.target.value }); + } + + handleEmailInput(input) { + this.setState({ email : input.target.value }); + } + + handleUsernameInput(input) { + this.setState({ username : input.target.value }); + } } function AccountRequirementMarketing() {