Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
ff8fc57
Debug: remove dessert pages
Pikalot Jun 18, 2025
f775731
Fixed bug: user should land homepage after loggin in
Pikalot Jun 18, 2025
916892d
Update: Prevent unnecessary API calls — user data is now fetched only…
Pikalot Jun 18, 2025
45b925c
chore: move routes array to its own file
Pikalot Jun 19, 2025
48ecede
Removed search UI
Pikalot Jun 19, 2025
2e810df
Re-commit for PR 1
Pikalot Jun 19, 2025
f34c797
Added search UI
Pikalot Jun 19, 2025
747b736
update: Only 5 search suggestions are shown at once. Scroll to see more.
Pikalot Jun 21, 2025
113ec6d
Merge branch 'devTA_shortcut_key' of https://github.com/SCE-Developme…
Pikalot Jun 21, 2025
de021b3
Merge branch 'dev' into devTA_shortcut_key
Pikalot Jun 21, 2025
634308f
Resolved conflict when merging with latest dev
Pikalot Jun 21, 2025
e217247
Resolved incoming conflict when merging with dev
Pikalot Jun 21, 2025
ad090a9
Resolved incoming conflict when merging with dev
Pikalot Jun 21, 2025
879518d
Removed search UI codes and improved permission check logic by implem…
Pikalot Jun 26, 2025
ffd7e3c
Fixed irrelevant permission check
Pikalot Jun 26, 2025
1d7812b
Merge branch 'devTA_shortcut_key' into devTA_search_ui
Pikalot Jun 26, 2025
b4e65e0
Fixed lookup table to prevent excessive fetching
Pikalot Jun 26, 2025
f82d85d
Merge branch 'devTA_shortcut_key' into devTA_search_ui
Pikalot Jun 26, 2025
3cd6a38
Fixed merge conflict with dev after PR #1726
Pikalot Jun 27, 2025
dbf556d
Improved routes caching in SearchModal using useMemo
Pikalot Jun 27, 2025
1900dfc
Resolved conflict when merge with devTA_shortcut_key
Pikalot Jun 27, 2025
8cd6513
Merge remote-tracking branch 'origin/dev' into devTA_shortcut_key
Pikalot Jun 29, 2025
c4d15f6
Merge branch 'devTA_shortcut_key' into devTA_search_ui
Pikalot Jun 29, 2025
03ab038
1. Removed scrollable dropdown codes. Just shows top 5 results.
Pikalot Jun 29, 2025
6da541d
removed e.key === 'K', only implement api fetch for users list when o…
Pikalot Jun 30, 2025
2474714
Fix: hide search suggestions when input is empty
Pikalot Jul 1, 2025
fb40204
Refactor: removed duplicate route filtering and improved keyboard sel…
Pikalot Jul 1, 2025
28db66d
Update src/Components/ShortcutKeyModal/SearchModal.js
Pikalot Jul 1, 2025
3f4f280
Update src/Components/ShortcutKeyModal/SearchModal.js
Pikalot Jul 1, 2025
eaf4153
Committed changes as suggestions
Pikalot Jul 1, 2025
57283fc
Undo the changes in Home.js
Pikalot Jul 1, 2025
e770ff9
Removed a space in line 1 of Home.js
Pikalot Jul 1, 2025
eab0ca0
Spitted PR and moved searching debounce logic to the new PR
Pikalot Jul 1, 2025
08f131d
Merge remote-tracking branch 'origin/dev' into devTA_shortcut_key
Pikalot Jul 1, 2025
01cc796
Merged with latest devTA_shortcut_key
Pikalot Jul 1, 2025
a7079fc
Merge remote-tracking branch 'origin/dev' into devTA_shortcut_key
Pikalot Jul 2, 2025
8dd6047
Updated PERMISSION_LOOKUP_TABLE in Private Route -> no more functions…
Pikalot Jul 2, 2025
6bb2fa1
Removed the commented out section - old SpeakerPage component
Pikalot Jul 2, 2025
129b8fd
Merge branch 'devTA_shortcut_key' into devTA_search_ui
Pikalot Jul 2, 2025
9cd8d54
Merge remote-tracking branch 'origin/dev' into devTA_shortcut_key
Pikalot Jul 3, 2025
180ac09
Removed unnecessary pageName prop
Pikalot Jul 3, 2025
3435a31
Resolved conflicts due to auto correction
Pikalot Jul 3, 2025
3cd5aa7
Fixed typo: signedInRoutes
Pikalot Jul 3, 2025
0d92c8d
Added more arrays to RouteConfig.js
aspies06 Jul 3, 2025
f683177
Changed RouteConfig.js to Routes.js and fixed linting errors
aspies06 Jul 3, 2025
93f19d9
Merge branch 'devTA_shortcut_key' into devTA_search_ui
Pikalot Jul 3, 2025
8cd5787
Merged with Aidan's routes.js code
Pikalot Jul 3, 2025
9743d29
Fixed casing: 'user manager' -> 'User Manager'.
Pikalot Jul 3, 2025
25fdbde
Merge branch 'devTA_shortcut_key' into devTA_search_ui
Pikalot Jul 3, 2025
b94ae33
Update src/index.js
Pikalot Jul 3, 2025
444f3b3
Update src/Components/ShortcutKeyModal/SearchModal.js
Pikalot Jul 3, 2025
4a72502
Used scoped CSS
Pikalot Jul 3, 2025
ed3f51b
Moved suggestions rendering to a separate function. Switched to scope…
Pikalot Jul 3, 2025
c4b2b98
Rerversed merging with PR2. Waiting for approval
Pikalot Jul 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion src/Components/Routing/PrivateRoute.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,31 @@
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import { membershipState } from '../../Enums';
import { allowedIf } from '../../Routes';
import { useUser } from '../../Components/context/UserContext';

export default function PrivateRoute({
component: Component,
appProps,
...params
}) {
const { user } = useUser();

// 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,
};

const isAllowed = PERMISSION_LOOKUP_TABLE[appProps.allowed] ?? false;

return (
<Route
{...params}
render={(props) => {
if (appProps.allowed) {
if (isAllowed) {
return <Component {...appProps} {...props} />;
} else if (appProps.authenticated) {
return (
Expand Down
184 changes: 184 additions & 0 deletions src/Routes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
import Overview from './Pages/Overview/Overview.js';
import Login from './Pages/Login/Login.js';
import ForgotPassword from './Pages/ForgotPassword/ForgotPassword.js';
import ResetPasswordPage from './Pages/ForgotPassword/ResetPassword.js';
import Profile from './Pages/Profile/MemberView/Profile.js';
import LedSign from './Pages/LedSign/LedSign.js';
import EditUserInfo from './Pages/UserManager/EditUserInfo.js';
import MembershipApplication from './Pages/MembershipApplication/MembershipApplication.js';
import VerifyEmailPage from './Pages/MembershipApplication/VerifyEmail.js';
import Printing from './Pages/2DPrinting/2DPrinting.js';
import AdvertisementAdmin from './Pages/Advertisement/AdvertisementAdmin.js';
import AboutPage from './Pages/About/About.js';
import ProjectsPage from './Pages/Projects/Projects.js';
import URLShortenerPage from './Pages/URLShortener/URLShortener.js';
import EmailPreferencesPage from './Pages/EmailPreferences/EmailPreferences.js';
import sendUnsubscribeEmail from './Pages/Profile/admin/SendUnsubscribeEmail.js';
import Messaging from './Pages/Messaging/Messaging.js';
import Home from './Pages/Home/Home.js';
import CardReader from './Pages/CardReader/CardReader.js';

// Declare an enum for permission check
export const allowedIf = {
UNAUTHENTICATED: 'UNAUTHENTICATED',
AUTHENTICATED: 'AUTHENTICATED',
MEMBER: 'MEMBER',
OFFICER_OR_ADMIN: 'OFFICER_OR_ADMIN',
};

export const notAuthenticatedRoutes = [
{
Component: Login,
path: '/login*',
pageName: 'Login',
allowedIf: allowedIf.UNAUTHENTICATED,
redirect: '/',
queryParams: {
redirect: 'redirect',
},
},
{
Component: ForgotPassword,
path: '/forgot',
pageName: 'Forgot Password',
allowedIf: allowedIf.UNAUTHENTICATED,
redirect: '/'
},
{
Component: MembershipApplication,
path: '/register',
pageName: 'Sign Up',
allowedIf: allowedIf.UNAUTHENTICATED,
redirect: '/'
},
];

const authenticatedRoutes = [
{
Component: Profile,
path: '/profile',
pageName: 'Profile',
allowedIf: allowedIf.AUTHENTICATED,
redirect: '/login'
},
];

export const memberRoutes = [
{
Component: Printing,
path: '/2DPrinting',
pageName: '2D Printing',
allowedIf: allowedIf.MEMBER,
redirect: '/login'
},
{
Component: Messaging,
path: '/messaging/:id?',
pageName: 'Messaging',
allowedIf: allowedIf.MEMBER,
redirect: '/login'
},
...authenticatedRoutes,
];

export const officerOrAdminRoutes = [
// new for Overview
{
Component: Overview,
path: '/user-manager',
pageName: 'User Manager',
allowedIf: allowedIf.OFFICER_OR_ADMIN,
redirect: '/',
inAdminNavbar: true
},
//
// {
// Component: EmailPage,
// path: '/email-list',
// allowedIf: userIsOfficerOrAdmin,
// redirect: '/',
// inAdminNavbar: true
// },
{
Component: LedSign,
path: '/led-sign',
pageName: 'Led Sign',
allowedIf: allowedIf.OFFICER_OR_ADMIN,
redirect: '/',
inAdminNavbar: true
},
{
Component: EditUserInfo,
path: '/user/edit/:id',
pageName: 'Edit User Info',
allowedIf: allowedIf.OFFICER_OR_ADMIN,
redirect: '/',
inAdminNavbar: true
},
{
Component: URLShortenerPage,
path: '/short',
pageName: 'URL Shortener Page',
allowedIf: allowedIf.OFFICER_OR_ADMIN,
inAdminNavbar: true,
redirect: '/',
},
{
Component: sendUnsubscribeEmail,
path: '/unsub',
pageName: 'Send Unsubscribe Email',
allowedIf: allowedIf.OFFICER_OR_ADMIN,
inAdminNavbar: true,
redirect: '/',
},
{
Component: AdvertisementAdmin,
path: '/advertisement-admin',
pageName: 'Advertisement Admin',
allowedIf: allowedIf.OFFICER_OR_ADMIN,
redirect: '/',
inAdminNavbar: true
},
{
Component: CardReader,
path: '/card-reader',
pageName: 'Card Reader',
allowedIf: allowedIf.OFFICER_OR_ADMIN,
redirect: '/',
inAdminNavbar: true
},
...memberRoutes,
];

export const signedOutRoutes = [
{
Component: Home,
path: '/',
pageName: 'Home Page'
},
{
Component: VerifyEmailPage,
path: '/verify',
pageName: 'Verify Email'
},
{
Component: ResetPasswordPage,
path: '/reset',
pageName: 'Reset Password'
},
{
Component: AboutPage,
path: '/about',
pageName: 'About Us'
},
{
Component: ProjectsPage,
path: '/projects',
pageName: 'Projects'
},
{
Component: EmailPreferencesPage,
path: '/emailPreferences',
pageName: 'Email Preferences'
},
];
146 changes: 5 additions & 141 deletions src/Routing.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,155 +3,19 @@ import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

import PrivateRoute from './Components/Routing/PrivateRoute';
import NavBarWrapper from './Components/Navbar/NavBarWrapper';
import Overview from './Pages/Overview/Overview';
import Login from './Pages/Login/Login';
import ForgotPassword from './Pages/ForgotPassword/ForgotPassword';
import ResetPasswordPage from './Pages/ForgotPassword/ResetPassword';
import Profile from './Pages/Profile/MemberView/Profile';
import LedSign from './Pages/LedSign/LedSign';
import EditUserInfo from './Pages/UserManager/EditUserInfo';

import Home from './Pages/Home/Home.js';
import NotFoundPage from './Pages/NotFoundPage/NotFoundPage';
import MembershipApplication from
'./Pages/MembershipApplication/MembershipApplication.js';
import VerifyEmailPage from './Pages/MembershipApplication/VerifyEmail.js';
import Printing from './Pages/2DPrinting/2DPrinting.js';
import AdvertisementAdmin from './Pages/Advertisement/AdvertisementAdmin.js';

import { membershipState } from './Enums';

import AboutPage from './Pages/About/About';
import ProjectsPage from './Pages/Projects/Projects';
import URLShortenerPage from './Pages/URLShortener/URLShortener';

import EmailPreferencesPage from './Pages/EmailPreferences/EmailPreferences';

import sendUnsubscribeEmail from './Pages/Profile/admin/SendUnsubscribeEmail';
import Messaging from './Pages/Messaging/Messaging.js';

import CardReader from './Pages/CardReader/CardReader.js';

import { useUser } from './Components/context/UserContext';

import { officerOrAdminRoutes, notAuthenticatedRoutes, signedOutRoutes } from './Routes.js';

export default function Routing({ appProps }) {
const { user, setUser } = useUser();
const userIsAuthenticated = appProps.authenticated;
const userIsMember =
userIsAuthenticated &&
user &&
user.accessLevel === membershipState.MEMBER;
const userIsOfficerOrAdmin =
userIsAuthenticated &&
user &&
user.accessLevel >= membershipState.OFFICER;
const signedInRoutes = [
// new for Overview
{
Component: Overview,
path: '/user-manager',
allowedIf: userIsOfficerOrAdmin,
redirect: '/',
inAdminNavbar: true
},
//
// {
// Component: EmailPage,
// path: '/email-list',
// allowedIf: userIsOfficerOrAdmin,
// redirect: '/',
// inAdminNavbar: true
// },
{
Component: LedSign,
path: '/led-sign',
allowedIf: userIsOfficerOrAdmin,
redirect: '/',
inAdminNavbar: true
},
{
Component: Printing,
path: '/2DPrinting',
allowedIf: userIsMember || userIsOfficerOrAdmin,
redirect: '/login'
},
{
Component: Login,
path: '/login*',
allowedIf: !userIsAuthenticated,
redirect: '/',
queryParams: {
redirect: 'redirect',
},
},
{
Component: ForgotPassword,
path: '/forgot',
allowedIf: !userIsAuthenticated,
redirect: '/'
},
{
Component: MembershipApplication,
path: '/register',
allowedIf: !userIsAuthenticated,
redirect: '/'
},
{
Component: Profile,
path: '/profile',
allowedIf: userIsAuthenticated,
redirect: '/login'
},
{
Component: EditUserInfo,
path: '/user/edit/:id',
allowedIf: userIsOfficerOrAdmin,
redirect: '/',
inAdminNavbar: true
},
{
Component: URLShortenerPage,
path: '/short',
allowedIf: userIsOfficerOrAdmin,
inAdminNavbar: true,
redirect: '/',
},
{
Component: sendUnsubscribeEmail,
path: '/unsub',
allowedIf: userIsOfficerOrAdmin,
inAdminNavbar: true,
redirect: '/',
},
{
Component: Messaging,
path: '/messaging/:id?',
allowedIf: userIsMember || userIsOfficerOrAdmin,
redirect: '/login'
},
{
Component: AdvertisementAdmin,
path: '/advertisement-admin',
allowedIf: userIsOfficerOrAdmin,
redirect: '/',
inAdminNavbar: true
},
{
Component: CardReader,
path: '/card-reader',
allowedIf: userIsOfficerOrAdmin,
redirect: '/',
inAdminNavbar: true
},
];
const signedOutRoutes = [
{ Component: Home, path: '/' },
{ Component: VerifyEmailPage, path: '/verify' },
{ Component: ResetPasswordPage, path: '/reset' },
{ Component: AboutPage, path: '/about'},
{ Component: ProjectsPage, path: '/projects'},
{ Component: EmailPreferencesPage, path: '/emailPreferences' },
];

const signedInRoutes = [...officerOrAdminRoutes, ...notAuthenticatedRoutes];

return (
<div>
<Switch>
Expand Down