diff --git a/js/api.js b/js/api.js index 7ee1678..fba72d9 100644 --- a/js/api.js +++ b/js/api.js @@ -30,7 +30,7 @@ const actiontypes_userinfo = { 'STORE_AUTH_HEADERS' : 'STORE_AUTH_HEADERS', 'REHYDRATE' : 'USERINFO_REHYDRATE', - 'CLEAR' : 'USERINFO_CLEAR', + 'CLEAR' : 'USERINFO_CLEAR' }; const defaultstate_userinfo = { @@ -70,6 +70,16 @@ const defaultstate_tournamentinfo = { teams : [] }; +const actiontypes_tournamentlist = { + 'FETCH': 'FETCH', + 'FETCH_SUCCESS': 'FETCH_SUCCESS', + 'REHYDRATE': 'REHYDRATE' +}; + +const defaultstate_tournamentlist = { + tournaments: [] +}; + export function postRequest(state, url, data) { return axios.post(api_url + url, data, { headers : generateHeaders(state) @@ -186,7 +196,8 @@ const reducer_userinfo = (state = defaultstate_userinfo, action) => { __store.dispatch({ type : actiontypes_userinfo.LOGIN_RESULT_SUCCESS, parameters : { - username : resp.data.data.username, + username : resp.data.username, + successCallback: action.parameters.successCallback } }); storeOptionalToken(resp); @@ -210,6 +221,7 @@ const reducer_userinfo = (state = defaultstate_userinfo, action) => { }); return Object.assign({}, state, {}); case actiontypes_userinfo.LOGIN_RESULT_SUCCESS: + action.parameters.successCallback(action.parameters.username); return Object.assign({}, state, { isSignedIn : true, error : false, @@ -223,6 +235,7 @@ const reducer_userinfo = (state = defaultstate_userinfo, action) => { }); case actiontypes_userinfo.LOGOUT: deleteRequest(action.state, '/users/sign_out').then(() => { + action.parameters.successCallback(); __store.dispatch({ type : actiontypes_userinfo.CLEAR }); }).catch(() => { __store.dispatch({ type : actiontypes_userinfo.CLEAR }); @@ -322,14 +335,40 @@ const reducer_tournamentinfo = (state = defaultstate_tournamentinfo, action) => } }; +const reducer_tournamentlist = (state = defaultstate_tournamentlist, action) => { + switch (action.type) { + case actiontypes_tournamentlist.FETCH: + getRequest(action.state, '/tournaments?type=' + action.parameters.type).then((resp) => { + __store.dispatch({ + type: actiontypes_tournamentlist.FETCH_SUCCESS, + parameters: resp.data + }); + storeOptionalToken(resp); + action.parameters.successCallback(resp.data); + }).catch((error) => { + if(error.response) { + storeOptionalToken(error.response); + } + action.parameters.errorCallback(); + }); + return state; + case actiontypes_tournamentlist.FETCH_SUCCESS: + return Object.assign({}, state, {tournaments: action.parameters}); + default: + return state; + } +}; + const reducers = { userinfo: reducer_userinfo, - tournamentinfo: reducer_tournamentinfo + tournamentinfo: reducer_tournamentinfo, + tournamentlist: reducer_tournamentlist }; const default_applicationstate = { userinfo : defaultstate_userinfo, - tournamentinfo: defaultstate_tournamentinfo + tournamentinfo: defaultstate_tournamentinfo, + tournamentlist: defaultstate_tournamentlist }; var __store; @@ -372,20 +411,24 @@ export function register(username, email, password) { }); } -export function login(email, password) { +export function login(email, password, successCallback) { __store.dispatch({ type: actiontypes_userinfo.LOGIN, parameters: { email: email, - password: password + password: password, + successCallback: successCallback }, state: __store.getState() }); } -export function logout() { +export function logout(successCallback) { __store.dispatch({ type : actiontypes_userinfo.LOGOUT, + parameters: { + successCallback: successCallback + }, state: __store.getState() }); } @@ -431,6 +474,18 @@ export function getState() { return __store.getState(); } +export function requestTournamentList(type, successCallback, errorCallback) { + __store.dispatch({ + type: actiontypes_tournamentlist.FETCH, + parameters: { + type: type, + successCallback: successCallback, + errorCallback: errorCallback + }, + state: __store.getState() + }); +} + function rehydrateApplicationState() { const persistedState = localStorage.getItem('reduxState') ? JSON.parse(localStorage.getItem('reduxState')) : @@ -445,6 +500,10 @@ function rehydrateApplicationState() { type : actiontypes_tournamentinfo.REHYDRATE, parameters : Object.assign({}, persistedState.tournamentinfo) }); + __store.dispatch({ + type : actiontypes_tournamentlist.REHYDRATE, + parameters : Object.assign({}, persistedState.tournamentlist) + }); applicationHydrated = true; } } diff --git a/js/components/Login.js b/js/components/Login.js index d92174c..9590154 100644 --- a/js/components/Login.js +++ b/js/components/Login.js @@ -5,6 +5,9 @@ import Router from 'next/router'; import { login } from '../api'; +import '../../static/css/errormessages.css'; +import {notify} from 'react-notify-toast'; + export function Login(props) { return ( @@ -28,7 +31,7 @@ class LoginErrorList extends React.Component { const { error, errorMessages } = this.props; if(error) { return ( -