import React from 'react';
import PropTypes from 'prop-types';
import { Meteor } from 'meteor/meteor';
import 'semantic-ui-css/semantic.css';
import { Roles } from 'meteor/alanning:roles';
import { HashRouter as Router, Route, Switch, Redirect } from 'react-router-dom';
import NavBar from '../components/NavBar';
import Footer from '../components/Footer';
import Landing from '../pages/Landing';
import ListStuff from '../pages/ListStuff';
import ListStuffAdmin from '../pages/ListStuffAdmin';
import AddStuff from '../pages/AddStuff';
import EditStuff from '../pages/EditStuff';
import NotFound from '../pages/NotFound';
import Signin from '../pages/Signin';
import Signout from '../pages/Signout';
import withAllSubscriptions from './AllSubscriptionsHOC';
/**
* Top-level layout component for this application. Called in imports/startup/client/startup.jsx.
* @memberOf ui/layouts
*/
class App extends React.Component {
render() {
return (
<Router>
<div>
<NavBar/>
<Switch>
<Route exact path="/" component={Landing}/>
<Route path="/signin" component={Signin}/>
<ProtectedRoute path="/list" component={ListStuff}/>
<ProtectedRoute path="/add" component={AddStuff}/>
<ProtectedRoute path="/edit/:_id" component={EditStuff}/>
<AdminProtectedRoute path="/admin" component={ListStuffAdmin}/>
<ProtectedRoute path="/signout" component={Signout}/>
<Route component={NotFound}/>
</Switch>
<Footer/>
</div>
</Router>
);
}
}
/**
* ProtectedRoute (see React Router v4 sample)
* Checks for Meteor login before routing to the requested page, otherwise goes to signin page.
* @param {any} { component: Component, ...rest }
* @memberOf ui/layouts
*/
const ProtectedRoute = ({ component: Component, ...rest }) => {
const WrappedComponent = withAllSubscriptions(Component);
return (
<Route
{...rest}
render={(props) => {
const isLogged = Meteor.userId() !== null;
return isLogged ?
(<WrappedComponent {...props} />) :
(<Redirect to={{ pathname: '/signin', state: { from: props.location } }}/>
);
}}
/>
);
};
/**
* AdminProtectedRoute (see React Router v4 sample)
* Checks for Meteor login and admin role before routing to the requested page, otherwise goes to signin page.
* @param {any} { component: Component, ...rest }
* @memberOf ui/layouts
*/
const AdminProtectedRoute = ({ component: Component, ...rest }) => {
const WrappedComponent = withAllSubscriptions(Component);
return (
<Route
{...rest}
render={(props) => {
const isLogged = Meteor.userId() !== null;
const isAdmin = Roles.userIsInRole(Meteor.userId(), 'admin');
return (isLogged && isAdmin) ?
(<WrappedComponent {...props} />) :
(<Redirect to={{ pathname: '/signin', state: { from: props.location } }}/>
);
}}
/>
);
};
// Require a component and location to be passed to each ProtectedRoute.
ProtectedRoute.propTypes = {
component: PropTypes.oneOfType([
PropTypes.func.isRequired,
PropTypes.object.isRequired,
]),
location: PropTypes.object,
};
// Require a component and location to be passed to each AdminProtectedRoute.
AdminProtectedRoute.propTypes = {
component: PropTypes.oneOfType([
PropTypes.func.isRequired,
PropTypes.object.isRequired,
]),
location: PropTypes.object,
};
export default App;
Source