diff --git a/js/api.js b/js/api.js index d90ea5d..934cc55 100644 --- a/js/api.js +++ b/js/api.js @@ -7,7 +7,7 @@ import {errorMessages} from './constants'; import {actionTypesUserinfo, defaultStateUserinfo} from './redux/userInfo'; import {actionTypesTournamentinfo, defaultStateTournamentinfo} from './redux/tournamentInfo'; import {actionTypesTournamentlist, defaultStateTournamentlist} from './redux/tournamentList'; -import {deleteRequest, getRequest, patchRequest, postRequest} from './redux/backendApi'; +import {deleteRequest, getRequest, patchRequest, postRequest, putRequest} from './redux/backendApi'; function storeOptionalToken(response) { @@ -149,6 +149,16 @@ const reducerUserinfo = (state = defaultStateUserinfo, action) => { __store.dispatch({type: actionTypesUserinfo.CLEAR}); }); return Object.assign({}, state, {}); + case actionTypesUserinfo.CHANGE_MAIL: + putRequest(action.state, '/users', { + email: action.parameters.newMail + }).then(resp => { + storeOptionalToken(resp); + action.parameters.successCallback(); + }).catch(() => { + action.parameters.errorCallback(); + }); + return Object.assign({}, state, {}); case actionTypesUserinfo.REHYDRATE: return Object.assign({}, state, action.parameters, {error: false, errorMessages: []}); case actionTypesUserinfo.CLEAR: @@ -353,6 +363,18 @@ export function logout(successCallback) { }); } +export function changeMail(newMail, successCallback, errorCallback) { + __store.dispatch({ + type: actionTypesUserinfo.CHANGE_MAIL, + parameters: { + newMail: newMail, + successCallback: successCallback, + errorCallback: errorCallback + }, + state: __store.getState() + }); +} + export function createTournament(data, successCallback, errorCallback) { __store.dispatch({ type: actionTypesTournamentinfo.CREATE_TOURNAMENT, diff --git a/js/redux/backendApi.js b/js/redux/backendApi.js index 2653edd..f052388 100644 --- a/js/redux/backendApi.js +++ b/js/redux/backendApi.js @@ -29,6 +29,12 @@ export function patchRequest(state, url, data) { }); } +export function putRequest(state, url, data) { + return axios.put(apiUrl + url, data, { + headers: generateHeaders(state) + }); +} + function generateHeaders(state) { if (state.userinfo.isSignedIn) { return { diff --git a/js/redux/userInfo.js b/js/redux/userInfo.js index a8172b4..d3c87ed 100644 --- a/js/redux/userInfo.js +++ b/js/redux/userInfo.js @@ -13,6 +13,8 @@ export const actionTypesUserinfo = { 'VERIFY_CREDENTIALS_SUCCESS': 'VERIFY_CREDENTIALS_SUCCESS', 'VERIFY_CREDENTIALS_ERROR': 'VERIFY_CREDENTIALS_ERROR', + 'CHANGE_MAIL': 'CHANGE_MAIL', + 'STORE_AUTH_HEADERS': 'STORE_AUTH_HEADERS', 'REHYDRATE': 'USERINFO_REHYDRATE', diff --git a/pages/profile.js b/pages/profile.js index ac6b6ff..1c288f0 100644 --- a/pages/profile.js +++ b/pages/profile.js @@ -1,6 +1,6 @@ import Head from 'next/head'; -import React from 'react'; -import {Container, Table} from 'reactstrap'; +import React, {Component} from 'react'; +import {Button, Container, Form, Input, InputGroup, InputGroupAddon, Table} from 'reactstrap'; import {TurniereNavigation} from '../js/components/Navigation'; import {BigImage} from '../js/components/BigImage'; @@ -11,13 +11,15 @@ import 'bootstrap/dist/css/bootstrap.min.css'; import '../static/css/everypage.css'; import '../static/css/profile.css'; import {connect} from 'react-redux'; +import {changeMail} from '../js/api'; +import {notify} from 'react-notify-toast'; -function Main() { - return (