diff --git a/js/api.js b/js/api.js
index 281ee0d..a29021c 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:
@@ -378,6 +388,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
new file mode 100644
index 0000000..4b51c40
--- /dev/null
+++ b/pages/profile.js
@@ -0,0 +1,100 @@
+import Head from 'next/head';
+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';
+import {Footer} from '../js/components/Footer';
+
+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';
+import RequireLogin from '../js/components/RequireLogin';
+
+function ContentContainer(props) {
+ return (E-Mail-Adresse ändern
+
| Name | +{props.name} | +
|---|---|
| E-Mail-Adresse | +{props.email} | +