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

+ +
); +} + +export default class ProfilePage extends React.Component { + render() { + return ( + + Profil: turnie.re + + + +
+ +
+