diff --git a/js/api.js b/js/api.js index 7d5c8d6..7d81418 100644 --- a/js/api.js +++ b/js/api.js @@ -40,6 +40,28 @@ const defaultstate_userinfo = { uid : null }; +const actiontypes_tournamentinfo = { + 'REQUEST_TOURNAMENT' : 'REQUEST_TOURNAMENT', + 'REQUEST_TOURNAMENT_SUCCESS' : 'REQUEST_TOURNAMENT_SUCCESS', + + 'MODIFY_TOURNAMENT' : 'MODIFY_TOURNAMENT', + 'MODIFY_TOURNAMENT_SUCCESS' : 'MODIFY_TOURNAMENT_SUCCESS', + 'MODIFY_TOURNAMENT_ERROR' : 'MODIFY_TOURNAMENT_ERROR', + + 'REHYDRATE' : 'TOURNAMENTINFO_REHYDRATE', + 'CLEAR' : 'TOURNAMENTINFO_CLEAR', +}; + +const defaultstate_tournamentinfo = { + code : '', + description : '', + id : -1, + name : '', + isPublic : '', + stages: [], + teams : [] +} + export function postRequest(state, url, data) { return axios.post(api_url + url, data, { headers : generateHeaders(state) @@ -58,6 +80,9 @@ export function deleteRequest(state, url) { }); } +// PATCH /teams/{ id } +// { 'name' : ... } + function generateHeaders(state) { if(state.userinfo.isSignedIn) { return { @@ -224,12 +249,59 @@ const reducer_userinfo = (state = defaultstate_userinfo, action) => { } }; +const reducer_tournamentinfo = (state = defaultstate_tournamentinfo, action) => { + switch(action.type) { + case actiontypes_tournamentinfo.REQUEST_TOURNAMENT: + getRequest(action.state, '/tournaments/' + action.parameters.code).then((resp) => { + __store.dispatch({ + type: actiontypes_tournamentinfo.REQUEST_TOURNAMENT_SUCCESS, + parameters: resp.data + }); + storeOptionalToken(resp); + action.parameters.successCallback(); + }).catch((error) => { + console.log(error); + action.parameters.errorCallback(); + }); + return Object.assign({}, state, {}); + case actiontypes_tournamentinfo.REQUEST_TOURNAMENT_SUCCESS: + return Object.assign({}, state, { + code : action.parameters.code, + description : action.parameters.description, + id : action.parameters.id, + name : action.parameters.name, + isPublic : action.parameters.public, + stages: action.parameters.stages, + teams : action.parameters.teams + }); + case actiontypes_tournamentinfo.MODIFY_TOURNAMENT: + + return Object.assign({}, state, {}); + case actiontypes_tournamentinfo.MODIFY_TOURNAMENT_SUCCESS: + + return Object.assign({}, state, {}); + case actiontypes_tournamentinfo.MODIFY_TOURNAMENT_ERROR: + + return Object.assign({}, state, {}); + + case actiontypes_tournamentinfo.REHYDRATE: + + return Object.assign({}, state, {}); + case actiontypes_tournamentinfo.CLEAR: + + return Object.assign({}, state, {}); + default: return state; + } +} + const reducers = { - userinfo: reducer_userinfo + userinfo: reducer_userinfo, + tournamentinfo: reducer_tournamentinfo }; const default_applicationstate = { - userinfo : defaultstate_userinfo + userinfo : defaultstate_userinfo, + tournamentinfo: defaultstate_tournamentinfo }; var __store; @@ -287,6 +359,18 @@ export function logout() { }); } +export function requestTournament(code, successCallback, errorCallback) { + __store.dispatch({ + type: actiontypes_tournamentinfo.REQUEST_TOURNAMENT, + parameters: { + code: code, + successCallback: successCallback, + errorCallback: errorCallback + }, + state: __store.getState() + }); +} + function rehydrateApplicationState() { const persistedState = localStorage.getItem('reduxState') ? JSON.parse(localStorage.getItem('reduxState')) : @@ -297,6 +381,10 @@ function rehydrateApplicationState() { type : actiontypes_userinfo.REHYDRATE, parameters : Object.assign({}, persistedState.userinfo, {}) }); + __store.dispatch({ + type : actiontypes_tournamentinfo.REHYDRATE, + parameters : Object.assign({}, persistedState.tournamentinfo, {}) + }); } } diff --git a/js/components/ErrorComponents.js b/js/components/ErrorComponents.js new file mode 100644 index 0000000..d33190b --- /dev/null +++ b/js/components/ErrorComponents.js @@ -0,0 +1,86 @@ +import Head from 'next/head'; +import React from 'react'; +import {Footer, TurniereNavigation} from '../CommonComponents'; +import 'bootstrap/dist/css/bootstrap.min.css'; +import {Container} from 'reactstrap'; +import '../../static/everypage.css'; +import '../../static/css/error.css'; + +export class ErrorPageComponent extends React.Component { + + static getInitialProps({ statusCode }) { + return { statusCode }; + } + + render() { + return ( +
+ + Wir empfehlen, die eingegebene Seite über die Startseite zu suchen. +
++ Bitte stelle sicher, dass Du angemeldet bist und auf dieses Turnier oder dieses Match zugreifen darfst. +
++ Wir empfehlen, die eingegebene Seite über die Startseite zu suchen. +
++ Entweder hast Du dich vertippt, oder die gesuchte Seite gibt es nicht. +
++ Wir empfehlen, die eingegebene Seite über die Startseite zu suchen. +
++ turnie.re kann Deine Anfrage im Moment nicht verarbeiten. Bitte versuche es später erneut. +
+
- - Wir empfehlen, die eingegebene Seite über die Startseite zu suchen. -
-- Bitte stelle sicher, dass Du angemeldet bist und auf dieses Turnier oder dieses Match zugreifen darfst. -
-- Wir empfehlen, die eingegebene Seite über die Startseite zu suchen. -
-- Entweder hast Du dich vertippt, oder die gesuchte Seite gibt es nicht. -
-- Wir empfehlen, die eingegebene Seite über die Startseite zu suchen. -
-- turnie.re kann Deine Anfrage im Moment nicht verarbeiten. Bitte versuche es später erneut. -
-Gib hier einen Turnier Code ein, um direkt zum entsprechenden Turnier zu gelangen.
diff --git a/pages/tournament-edit.js b/pages/tournament-edit.js new file mode 100644 index 0000000..5545c22 --- /dev/null +++ b/pages/tournament-edit.js @@ -0,0 +1,273 @@ +import Head from 'next/head'; +import React from 'react'; + +import { requestTournament } from '../js/api'; +import { BigImage, Footer, TurniereNavigation } from '../js/CommonComponents.js'; +import { ErrorPageComponent } from '../js/components/ErrorComponents.js'; + +import { + Container, + Button, + Card, + CardBody, + CardTitle, + Table +} from 'reactstrap'; + +import { connect } from 'react-redux'; + +import '../static/everypage.css'; +import '../static/css/index.css'; + +class EditTournamentPage extends React.Component { + + static async getInitialProps({query}) { + return {query}; + } + + constructor(props) { + super(props); + + this.state = { + validCode: true + }; + } + + componentDidMount() { + requestTournament(this.props.query.code, () => { + this.setState({ validCode: true }); + this._edittournamentcontent.notifyOfContentUpdate(); + }, () => { + this.setState({ validCode: false }); + }); + } + + render() { + const { validCode } = this.state; + const { name } = this.props; + + if(validCode) { + return ( +