- {props.authenticated && user ? (
+ {authenticated && user ? (
<>
Services
diff --git a/src/Components/Routing/PrivateRoute.js b/src/Components/Routing/PrivateRoute.js
index 598944001..a2672ac1d 100644
--- a/src/Components/Routing/PrivateRoute.js
+++ b/src/Components/Routing/PrivateRoute.js
@@ -3,6 +3,7 @@ import { Route, Redirect } from 'react-router-dom';
import { membershipState } from '../../Enums';
import { allowedIf } from '../../Routes';
import { useUser } from '../../Components/context/UserContext';
+import { useAuth } from '../../Components/context/AuthContext';
export default function PrivateRoute({
component: Component,
@@ -10,13 +11,14 @@ export default function PrivateRoute({
...params
}) {
const { user } = useUser();
+ const { authenticated } = useAuth();
// Check if the user's access level matches with route's access grant
const PERMISSION_LOOKUP_TABLE = {
[allowedIf.MEMBER]: user?.accessLevel >= membershipState.MEMBER,
[allowedIf.OFFICER_OR_ADMIN]: user?.accessLevel >= membershipState.OFFICER,
- [allowedIf.AUTHENTICATED]: !!appProps.authenticated,
- [allowedIf.UNAUTHENTICATED]: !appProps.authenticated,
+ [allowedIf.AUTHENTICATED]: !!authenticated,
+ [allowedIf.UNAUTHENTICATED]: !authenticated,
};
const isAllowed = PERMISSION_LOOKUP_TABLE[appProps.allowed] ?? false;
@@ -27,7 +29,7 @@ export default function PrivateRoute({
render={(props) => {
if (isAllowed) {
return
;
- } else if (appProps.authenticated) {
+ } else if (authenticated) {
return (
{
if (user.accessLevel === membershipState.MEMBER)
@@ -29,13 +31,13 @@ export default function SearchModal({ appProps }) {
...officerOrAdminRoutes.filter(r => r.pageName !== 'Edit User Info'),
...signedOutRoutes
];
- if (!appProps.authenticated)
+ if (!authenticated)
return [
...notAuthenticatedRoutes,
...signedOutRoutes
];
return [...signedOutRoutes];
- }, [user.accessLevel, appProps.authenticated]);
+ }, [user.accessLevel, authenticated]);
/**
* Helper function updates the keyword when the user types
diff --git a/src/Components/context/AuthContext.js b/src/Components/context/AuthContext.js
new file mode 100644
index 000000000..bd3f14220
--- /dev/null
+++ b/src/Components/context/AuthContext.js
@@ -0,0 +1,10 @@
+import React, { createContext, useContext } from 'react';
+
+export const AuthContext = createContext({
+ authenticated: false,
+ setAuthenticated: () => {}
+});
+
+export function useAuth() {
+ return useContext(AuthContext);
+}
diff --git a/src/Pages/Login/Login.js b/src/Pages/Login/Login.js
index 69be54319..f33e1252c 100644
--- a/src/Pages/Login/Login.js
+++ b/src/Pages/Login/Login.js
@@ -1,8 +1,10 @@
import React, { useState } from 'react';
import { loginUser } from '../../APIFunctions/Auth';
import Background from '../../Components/Background/background';
+import { useAuth } from '../../Components/context/AuthContext';
-export default function Login(props) {
+export default function Login() {
+ const { setAuthenticated } = useAuth();
const queryParams = new URLSearchParams(window.location.search);
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
@@ -24,7 +26,7 @@ export default function Login(props) {
e.preventDefault();
const loginStatus = await loginUser(email, password);
if (!loginStatus.error) {
- props.setAuthenticated(true);
+ setAuthenticated(true);
window.localStorage.setItem('jwtToken', loginStatus.token);
if (queryParams.get('redirect')) {
window.location.href = queryParams.get('redirect');
diff --git a/src/Routing.js b/src/Routing.js
index 7831eef64..f4590a4d5 100644
--- a/src/Routing.js
+++ b/src/Routing.js
@@ -7,12 +7,13 @@ import NavBarWrapper from './Components/Navbar/NavBarWrapper';
import NotFoundPage from './Pages/NotFoundPage/NotFoundPage';
import { useUser } from './Components/context/UserContext';
+import { useAuth } from './Components/context/AuthContext';
import { officerOrAdminRoutes, notAuthenticatedRoutes, signedOutRoutes } from './Routes.js';
export default function Routing({ appProps }) {
const { user, setUser } = useUser();
- const userIsAuthenticated = appProps.authenticated;
+ const { authenticated } = useAuth();
const signedInRoutes = [...officerOrAdminRoutes, ...notAuthenticatedRoutes];
@@ -46,7 +47,6 @@ export default function Routing({ appProps }) {
appProps={{
allowed: allowedIf,
redirect,
- authenticated:userIsAuthenticated,
...appProps
}}
component={props => getCorrectComponent(props)}
diff --git a/src/index.js b/src/index.js
index eca9233b2..8938b32e7 100755
--- a/src/index.js
+++ b/src/index.js
@@ -7,6 +7,7 @@ import Routing from './Routing';
import { checkIfUserIsSignedIn } from './APIFunctions/Auth';
import { UserContext } from './Components/context/UserContext';
import SearchModal from './Components/ShortcutKeyModal/SearchModal';
+import { AuthContext } from './Components/context/AuthContext';
function App(props) {
const [authenticated, setAuthenticated] = useState(false);
@@ -29,10 +30,12 @@ function App(props) {
return (
!isAuthenticating && (
-
-
-
-
+
+
+
+
+
+
)
);
diff --git a/test/frontend/Routing.test.js b/test/frontend/Routing.test.js
index 9e9ee71ff..da7e5fbac 100644
--- a/test/frontend/Routing.test.js
+++ b/test/frontend/Routing.test.js
@@ -4,6 +4,7 @@ import Enzyme, { mount } from 'enzyme';
import { expect } from 'chai';
import Adapter from '@cfaester/enzyme-adapter-react-18';
import { UserContext } from '../../src/Components/context/UserContext';
+import { AuthContext } from '../../src/Components/context/AuthContext';
import Routing from '../../src/Routing';
import Home from '../../src/Pages/Home/Home';
@@ -29,7 +30,6 @@ Object.defineProperty(window, 'localStorage', {
});
const adminAppProps = {
- authenticated: true
};
const mockUser = { accessLevel: membershipState.ADMIN };
@@ -46,11 +46,18 @@ function getComponentFromRoute(route, props = adminAppProps, user = mockUser) {
setUser: () => {}
};
+ const mockAuthContext = {
+ authenticated: true,
+ setAuthenticated: () => {}
+ };
+
return mount(
-
-
-
+
+
+
+
+
);
}