From 63415668bb3ba7684acfbce02fc3a8cf3f87fc74 Mon Sep 17 00:00:00 2001 From: Alexandru Munteanu <alexandru.munteanu@thinslices.com> Date: Fri, 16 Feb 2018 10:46:19 +0200 Subject: [PATCH] add admin route --- .../src/components/Admin/AdminRoute.js | 51 +++++++++++++++++++ .../src/components/Admin/index.js | 1 + .../src/components/AppBar/AppBar.js | 18 +++++-- packages/xpub-faraday/app/routes.js | 9 ++-- 4 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 packages/components-faraday/src/components/Admin/AdminRoute.js diff --git a/packages/components-faraday/src/components/Admin/AdminRoute.js b/packages/components-faraday/src/components/Admin/AdminRoute.js new file mode 100644 index 000000000..e23544f0d --- /dev/null +++ b/packages/components-faraday/src/components/Admin/AdminRoute.js @@ -0,0 +1,51 @@ +import React from 'react' +import { get } from 'lodash' +import { compose } from 'recompose' +import { connect } from 'react-redux' +import { Route, Redirect, withRouter } from 'react-router-dom' +import { getCurrentUser } from 'pubsweet-component-xpub-authentication/src/redux/currentUser' + +const PrivateRoute = ({ + currentUser, + getCurrentUser, + redirectPath = '/', + component: Component, + ...rest +}) => ( + <Route + {...rest} + render={props => { + if (!currentUser.isFetched) { + if (!currentUser.isFetching) { + getCurrentUser() + } + + return <div>loading…</div> + } + if (!get(currentUser, 'user.admin') || !currentUser.isAuthenticated) { + return ( + <Redirect + to={{ + pathname: redirectPath, + state: { from: props.location }, + }} + /> + ) + } + + return <Component {...props} /> + }} + /> +) + +export default compose( + withRouter, + connect( + state => ({ + currentUser: state.currentUser, + }), + { + getCurrentUser, + }, + ), +)(PrivateRoute) diff --git a/packages/components-faraday/src/components/Admin/index.js b/packages/components-faraday/src/components/Admin/index.js index bdffbea23..d3453b2d5 100644 --- a/packages/components-faraday/src/components/Admin/index.js +++ b/packages/components-faraday/src/components/Admin/index.js @@ -1,3 +1,4 @@ export { default as AdminUsers } from './AdminUsers' export { default as Pagination } from './Pagination' +export { default as AdminRoute } from './AdminRoute' export { default as AdminDashboard } from './AdminDashboard' diff --git a/packages/components-faraday/src/components/AppBar/AppBar.js b/packages/components-faraday/src/components/AppBar/AppBar.js index ae81cda79..ca81c1ec1 100644 --- a/packages/components-faraday/src/components/AppBar/AppBar.js +++ b/packages/components-faraday/src/components/AppBar/AppBar.js @@ -1,11 +1,12 @@ import React from 'react' -import { Icon } from '@pubsweet/ui' import { get } from 'lodash' +import { Icon } from '@pubsweet/ui' +import { connect } from 'react-redux' import styled from 'styled-components' import { withRouter } from 'react-router-dom' import { withState, withHandlers, compose } from 'recompose' -const AppBar = ({ expanded, toggleMenu, brand, user, goTo }) => ( +const AppBar = ({ expanded, toggleMenu, brand, user, goTo, currentUser }) => ( <Root> {React.cloneElement(brand, { onClick: goTo('/'), @@ -22,9 +23,11 @@ const AppBar = ({ expanded, toggleMenu, brand, user, goTo }) => ( {expanded && ( <Dropdown> <DropdownOption>Settings</DropdownOption> - <DropdownOption onClick={goTo('admin')}> - Admin dashboard - </DropdownOption> + {currentUser.admin && ( + <DropdownOption onClick={goTo('admin')}> + Admin dashboard + </DropdownOption> + )} <DropdownOption onClick={goTo('/logout')}>Logout</DropdownOption> </Dropdown> )} @@ -34,6 +37,7 @@ const AppBar = ({ expanded, toggleMenu, brand, user, goTo }) => ( </Root> ) +// #region styled-components const Root = styled.div` align-items: center; box-shadow: 0 1px 0 0 #667080; @@ -99,9 +103,13 @@ const ToggleOverlay = styled.div` right: 0; opacity: 0; ` +// #endregion export default compose( withRouter, + connect(state => ({ + currentUser: get(state, 'currentUser.user'), + })), withState('expanded', 'setExpanded', false), withHandlers({ toggleMenu: ({ setExpanded }) => () => { diff --git a/packages/xpub-faraday/app/routes.js b/packages/xpub-faraday/app/routes.js index c4802e939..17ad28ba2 100644 --- a/packages/xpub-faraday/app/routes.js +++ b/packages/xpub-faraday/app/routes.js @@ -17,6 +17,7 @@ import NotFound from 'pubsweet-components-faraday/src/components/UIComponents/No import { AdminDashboard, AdminUsers, + AdminRoute, } from 'pubsweet-components-faraday/src/components/Admin' import AddEditUser from 'pubsweet-components-faraday/src/components/Admin/AddEditUser' import SignUpInvitationPage from 'pubsweet-components-faraday/src/components/SignUp/SignUpInvitationPage' @@ -34,10 +35,10 @@ const Routes = () => ( exact path="/confirmation-page" /> - <PrivateRoute component={AdminDashboard} exact path="/admin" /> - <PrivateRoute component={AdminUsers} exact path="/admin/users" /> - <PrivateRoute component={AddEditUser} exact path="/admin/users/add" /> - <PrivateRoute + <AdminRoute component={AdminDashboard} exact path="/admin" /> + <AdminRoute component={AdminUsers} exact path="/admin/users" /> + <AdminRoute component={AddEditUser} exact path="/admin/users/add" /> + <AdminRoute component={AddEditUser} exact path="/admin/users/edit/:userId" -- GitLab