private routes and redirecting
This commit is contained in:
parent
5d9bfa97af
commit
80fd112658
@ -12,7 +12,7 @@ import { ThemeProvider, createMuiTheme } from '@material-ui/core/styles';
|
|||||||
|
|
||||||
import Navbar from './components/Navbar';
|
import Navbar from './components/Navbar';
|
||||||
import Footer from './components/Footer';
|
import Footer from './components/Footer';
|
||||||
import Routes from './components/Routes';
|
import Routes from './components/Route/Routes';
|
||||||
import Cookies from './components/Cookies';
|
import Cookies from './components/Cookies';
|
||||||
|
|
||||||
const theme = createMuiTheme({
|
const theme = createMuiTheme({
|
||||||
|
@ -57,11 +57,11 @@ export const login = ({ email, password }) => (dispatch) => {
|
|||||||
timeToLogout
|
timeToLogout
|
||||||
);
|
);
|
||||||
logoutTimerId = logoutTimer();
|
logoutTimerId = logoutTimer();
|
||||||
dispatch(returnSuccess(res.data.message, res.status, 'LOGIN_SUCCESS'));
|
|
||||||
dispatch({
|
dispatch({
|
||||||
type: LOGIN_SUCCESS,
|
type: LOGIN_SUCCESS,
|
||||||
payload: res.data
|
payload: res.data
|
||||||
});
|
});
|
||||||
|
dispatch(returnSuccess(res.data.message, res.status, 'LOGIN_SUCCESS'));
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
console.log('hier');
|
console.log('hier');
|
||||||
|
@ -6,6 +6,7 @@ import { getProject, resetProject } from '../../actions/projectActions';
|
|||||||
import { clearMessages, returnErrors } from '../../actions/messageActions';
|
import { clearMessages, returnErrors } from '../../actions/messageActions';
|
||||||
|
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
import { withRouter } from 'react-router-dom';
|
||||||
import { createNameId } from 'mnemonic-id';
|
import { createNameId } from 'mnemonic-id';
|
||||||
|
|
||||||
import Home from '../Home';
|
import Home from '../Home';
|
||||||
@ -23,7 +24,8 @@ class Project extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate(props) {
|
componentDidUpdate(props) {
|
||||||
if(props.location.path !== this.props.location.path ||
|
console.log(this.props);
|
||||||
|
if(props.location.pathname !== this.props.location.pathname ||
|
||||||
props.match.params[`${this.props.type}Id`] !== this.props.match.params[`${this.props.type}Id`]){
|
props.match.params[`${this.props.type}Id`] !== this.props.match.params[`${this.props.type}Id`]){
|
||||||
if(this.props.message.msg){
|
if(this.props.message.msg){
|
||||||
this.props.clearMessages();
|
this.props.clearMessages();
|
||||||
@ -55,8 +57,10 @@ class Project extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getProject = () => {
|
getProject = () => {
|
||||||
var param = this.props.match.params.shareId ? 'share' : this.props.match.params.galleryId ? 'gallery' : 'project';
|
var id = this.props.location.pathname.replace(/\/[a-z]{1,}\//,'');
|
||||||
var id = this.props.match.params[`${param}Id`];
|
var param = this.props.location.pathname.replace(`/${id}`,'').replace('/','');
|
||||||
|
console.log('param', param);
|
||||||
|
console.log(id);
|
||||||
this.props.getProject(param, id);
|
this.props.getProject(param, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,7 +74,7 @@ class Project extends Component {
|
|||||||
: this.props.project ?
|
: this.props.project ?
|
||||||
<div>
|
<div>
|
||||||
{this.props.type !== 'share' ?
|
{this.props.type !== 'share' ?
|
||||||
<Breadcrumbs content={[{ link: `/${this.props.type}`, title: data },{ link: this.props.location.path, title: this.props.project.title }]} />
|
<Breadcrumbs content={[{ link: `/${this.props.type}`, title: data },{ link: this.props.location.pathname, title: this.props.project.title }]} />
|
||||||
: null}
|
: null}
|
||||||
<Home project={this.props.project.xml}/>
|
<Home project={this.props.project.xml}/>
|
||||||
</div> : null
|
</div> : null
|
||||||
@ -97,4 +101,4 @@ const mapStateToProps = state => ({
|
|||||||
message: state.message
|
message: state.message
|
||||||
});
|
});
|
||||||
|
|
||||||
export default connect(mapStateToProps, { workspaceName, getProject, resetProject, clearMessages, returnErrors })(Project);
|
export default connect(mapStateToProps, { workspaceName, getProject, resetProject, clearMessages, returnErrors })(withRouter(Project));
|
||||||
|
@ -5,7 +5,7 @@ import { getProjects, resetProject } from '../../actions/projectActions';
|
|||||||
import { clearMessages } from '../../actions/messageActions';
|
import { clearMessages } from '../../actions/messageActions';
|
||||||
|
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link, withRouter } from 'react-router-dom';
|
||||||
|
|
||||||
import Breadcrumbs from '../Breadcrumbs';
|
import Breadcrumbs from '../Breadcrumbs';
|
||||||
import BlocklyWindow from '../Blockly/BlocklyWindow';
|
import BlocklyWindow from '../Blockly/BlocklyWindow';
|
||||||
@ -41,7 +41,7 @@ class ProjectHome extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
var type = this.props.match.path.replace('/','');
|
var type = this.props.location.pathname.replace('/','');
|
||||||
this.props.getProjects(type);
|
this.props.getProjects(type);
|
||||||
if(this.props.message){
|
if(this.props.message){
|
||||||
if(this.props.message.id === 'PROJECT_DELETE_SUCCESS'){
|
if(this.props.message.id === 'PROJECT_DELETE_SUCCESS'){
|
||||||
@ -57,9 +57,9 @@ class ProjectHome extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate(props) {
|
componentDidUpdate(props) {
|
||||||
if(props.match.path !== this.props.match.path){
|
if(props.location.pathname !== this.props.location.pathname){
|
||||||
this.setState({snackbar: false});
|
this.setState({snackbar: false});
|
||||||
this.props.getProjects(this.props.match.path.replace('/',''));
|
this.props.getProjects(this.props.location.pathname.replace('/',''));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,10 +69,10 @@ class ProjectHome extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
var data = this.props.match.path === '/project' ? 'Projekte' : 'Galerie';
|
var data = this.props.location.pathname === '/project' ? 'Projekte' : 'Galerie';
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<Breadcrumbs content={[{ link: this.props.match.path, title: data }]} />
|
<Breadcrumbs content={[{ link: this.props.location.pathname, title: data }]} />
|
||||||
|
|
||||||
<h1>{data}</h1>
|
<h1>{data}</h1>
|
||||||
{this.props.progress ?
|
{this.props.progress ?
|
||||||
@ -104,7 +104,7 @@ class ProjectHome extends Component {
|
|||||||
</Grid>
|
</Grid>
|
||||||
: <div>
|
: <div>
|
||||||
<Typography style={{marginBottom: '10px'}}>Es sind aktuell keine Projekte vorhanden.</Typography>
|
<Typography style={{marginBottom: '10px'}}>Es sind aktuell keine Projekte vorhanden.</Typography>
|
||||||
{this.props.match.path.replace('/','') === 'project' ?
|
{this.props.location.pathname.replace('/','') === 'project' ?
|
||||||
<Typography>Erstelle jetzt dein <Link to={'/'} className={this.props.classes.link}>eigenes Projekt</Link> oder lasse dich von Projektbeispielen in der <Link to={'/gallery'} className={this.props.classes.link}>Galerie</Link> inspirieren.</Typography>
|
<Typography>Erstelle jetzt dein <Link to={'/'} className={this.props.classes.link}>eigenes Projekt</Link> oder lasse dich von Projektbeispielen in der <Link to={'/gallery'} className={this.props.classes.link}>Galerie</Link> inspirieren.</Typography>
|
||||||
: null}
|
: null}
|
||||||
</div>
|
</div>
|
||||||
@ -138,4 +138,4 @@ const mapStateToProps = state => ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
export default connect(mapStateToProps, { getProjects, resetProject, clearMessages })(withStyles(styles, { withTheme: true })(ProjectHome));
|
export default connect(mapStateToProps, { getProjects, resetProject, clearMessages })(withStyles(styles, { withTheme: true })(withRouter(ProjectHome)));
|
||||||
|
41
src/components/Route/PrivateRoute.js
Normal file
41
src/components/Route/PrivateRoute.js
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
|
import { Route, Redirect, withRouter } from 'react-router-dom';
|
||||||
|
|
||||||
|
|
||||||
|
class PrivateRoute extends Component {
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<Route
|
||||||
|
{...this.props.exact}
|
||||||
|
render={({ location }) =>
|
||||||
|
this.props.isAuthenticated ? (
|
||||||
|
this.props.children
|
||||||
|
) : (()=>{
|
||||||
|
return (
|
||||||
|
<Redirect
|
||||||
|
to={{
|
||||||
|
pathname: "/user/login",
|
||||||
|
state: { from: location }
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
})()
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PrivateRoute.propTypes = {
|
||||||
|
isAuthenticated: PropTypes.bool
|
||||||
|
};
|
||||||
|
|
||||||
|
const mapStateToProps = state => ({
|
||||||
|
isAuthenticated: state.auth.isAuthenticated
|
||||||
|
});
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, null)(withRouter(PrivateRoute));
|
@ -1,21 +1,22 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { visitPage } from '../actions/generalActions';
|
import { visitPage } from '../../actions/generalActions';
|
||||||
|
|
||||||
import { Route, Switch, withRouter } from 'react-router-dom';
|
import { Route, Switch, withRouter } from 'react-router-dom';
|
||||||
|
|
||||||
import Home from './Home';
|
import PrivateRoute from './PrivateRoute';
|
||||||
import Tutorial from './Tutorial/Tutorial';
|
import Home from '../Home';
|
||||||
import TutorialHome from './Tutorial/TutorialHome';
|
import Tutorial from '../Tutorial/Tutorial';
|
||||||
import Builder from './Tutorial/Builder/Builder';
|
import TutorialHome from '../Tutorial/TutorialHome';
|
||||||
import NotFound from './NotFound';
|
import Builder from '../Tutorial/Builder/Builder';
|
||||||
import ProjectHome from './Project/ProjectHome';
|
import NotFound from '../NotFound';
|
||||||
import Project from './Project/Project';
|
import ProjectHome from '../Project/ProjectHome';
|
||||||
import Settings from './Settings/Settings';
|
import Project from '../Project/Project';
|
||||||
import Impressum from './Impressum';
|
import Settings from '../Settings/Settings';
|
||||||
import Privacy from './Privacy';
|
import Impressum from '../Impressum';
|
||||||
import Login from './User/Login';
|
import Privacy from '../Privacy';
|
||||||
|
import Login from '../User/Login';
|
||||||
|
|
||||||
|
|
||||||
class Routes extends Component {
|
class Routes extends Component {
|
||||||
@ -31,7 +32,9 @@ class Routes extends Component {
|
|||||||
<Route path="/" exact component={Home} />
|
<Route path="/" exact component={Home} />
|
||||||
// Tutorials
|
// Tutorials
|
||||||
<Route path="/tutorial" exact component={TutorialHome} />
|
<Route path="/tutorial" exact component={TutorialHome} />
|
||||||
<Route path="/tutorial/builder" exact component={Builder} />
|
<PrivateRoute path="/tutorial/builder" exact>
|
||||||
|
<Builder/>
|
||||||
|
</PrivateRoute>
|
||||||
<Route path="/tutorial/:tutorialId" exact component={Tutorial} />
|
<Route path="/tutorial/:tutorialId" exact component={Tutorial} />
|
||||||
// Sharing
|
// Sharing
|
||||||
<Route path="/share/:shareId" exact component={Project} />
|
<Route path="/share/:shareId" exact component={Project} />
|
||||||
@ -39,8 +42,12 @@ class Routes extends Component {
|
|||||||
<Route path="/gallery" exact component={ProjectHome} />
|
<Route path="/gallery" exact component={ProjectHome} />
|
||||||
<Route path="/gallery/:galleryId" exact component={Project} />
|
<Route path="/gallery/:galleryId" exact component={Project} />
|
||||||
// User-Projects
|
// User-Projects
|
||||||
<Route path="/project" exact component={ProjectHome} />
|
<PrivateRoute path="/project" exact>
|
||||||
<Route path="/project/:projectId" exact component={Project} />
|
<ProjectHome/>
|
||||||
|
</PrivateRoute>
|
||||||
|
<PrivateRoute path="/project/:projectId" exact>
|
||||||
|
<Project/>
|
||||||
|
</PrivateRoute>
|
||||||
// User
|
// User
|
||||||
<Route path="/user/login" exact component={Login} />
|
<Route path="/user/login" exact component={Login} />
|
||||||
// settings
|
// settings
|
@ -25,6 +25,7 @@ export class Login extends Component {
|
|||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
|
redirect: props.location.state ? props.location.state.from.pathname : null,
|
||||||
email: '',
|
email: '',
|
||||||
password: '',
|
password: '',
|
||||||
snackbar: false,
|
snackbar: false,
|
||||||
@ -36,11 +37,17 @@ export class Login extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate(props){
|
componentDidUpdate(props){
|
||||||
|
console.log(this.state.redirect);
|
||||||
const { message } = this.props;
|
const { message } = this.props;
|
||||||
if (message !== props.message) {
|
if (message !== props.message) {
|
||||||
if(message.id === 'LOGIN_SUCCESS'){
|
if(message.id === 'LOGIN_SUCCESS'){
|
||||||
|
if(this.state.redirect){
|
||||||
|
this.props.history.push(this.state.redirect);
|
||||||
|
}
|
||||||
|
else{
|
||||||
this.props.history.goBack();
|
this.props.history.goBack();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Check for login error
|
// Check for login error
|
||||||
else if(message.id === 'LOGIN_FAIL'){
|
else if(message.id === 'LOGIN_FAIL'){
|
||||||
this.setState({ email: '', password: '', snackbar: true, key: Date.now(), message: 'Der Benutzername oder das Passwort ist nicht korrekt.', type: 'error' });
|
this.setState({ email: '', password: '', snackbar: true, key: Date.now(), message: 'Der Benutzername oder das Passwort ist nicht korrekt.', type: 'error' });
|
||||||
|
Loading…
x
Reference in New Issue
Block a user