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