From 98321b83c70bc0680a0c84e299d05c8a31d35671 Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Sun, 12 Apr 2026 19:53:59 -0400 Subject: [PATCH 01/14] final commit --- .claude/settings.local.json | 8 + apps/frontend/src/app.tsx | 45 --- apps/frontend/src/components/Navbar.tsx | 369 ++++++++++++++++++ apps/frontend/src/containers/homepage.tsx | 22 -- apps/frontend/src/containers/orders.tsx | 5 - .../src/containers/pantryPastOrders.tsx | 5 - apps/frontend/src/containers/root.tsx | 13 +- 7 files changed, 385 insertions(+), 82 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 apps/frontend/src/components/Navbar.tsx delete mode 100644 apps/frontend/src/containers/orders.tsx delete mode 100644 apps/frontend/src/containers/pantryPastOrders.tsx diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 000000000..d5276fad5 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,8 @@ +{ + "permissions": { + "allow": [ + "mcp__plugin_figma_figma__get_design_context", + "mcp__plugin_figma_figma__get_screenshot" + ] + } +} diff --git a/apps/frontend/src/app.tsx b/apps/frontend/src/app.tsx index b4cc95a41..2afc4abb4 100644 --- a/apps/frontend/src/app.tsx +++ b/apps/frontend/src/app.tsx @@ -1,10 +1,7 @@ import { createBrowserRouter, RouterProvider } from 'react-router-dom'; import Root from '@containers/root'; import NotFound from '@containers/404'; -import PantryPastOrders from '@containers/pantryPastOrders'; import Pantries from '@containers/pantries'; -import Orders from '@containers/orders'; -import PantryDashboard from '@containers/pantryDashboard'; import FormRequests from '@containers/formRequests'; import PantryApplication from '@containers/pantryApplication'; import ApplicationSubmitted from '@containers/applicationSubmitted'; @@ -12,7 +9,6 @@ import { submitPantryApplicationForm } from '@components/forms/pantryApplication import ApprovePantries from '@containers/approvePantries'; import PantryApplicationDetails from '@containers/pantryApplicationDetails'; import VolunteerManagement from '@containers/volunteerManagement'; -import FoodManufacturerOrderDashboard from '@containers/foodManufacturerOrderDashboard'; import AdminDonation from '@containers/adminDonation'; import Homepage from '@containers/homepage'; import AdminOrderManagement from '@containers/adminOrderManagement'; @@ -77,15 +73,6 @@ const router = createBrowserRouter([ path: '/unauthorized', element: , }, - // Private routes (protected by auth) - { - path: '/pantry-past-orders', - element: ( - - - - ), - }, { path: '/pantries', element: ( @@ -94,22 +81,6 @@ const router = createBrowserRouter([ ), }, - { - path: '/pantry-dashboard', - element: ( - - - - ), - }, - { - path: '/pantry-past-orders', - element: ( - - - - ), - }, { path: '/pantries', element: ( @@ -118,22 +89,6 @@ const router = createBrowserRouter([ ), }, - { - path: '/food-manufacturer-order-dashboard', - element: ( - - - - ), - }, - { - path: '/orders', - element: ( - - - - ), - }, { path: '/request-form', element: ( diff --git a/apps/frontend/src/components/Navbar.tsx b/apps/frontend/src/components/Navbar.tsx new file mode 100644 index 000000000..eb34e62a9 --- /dev/null +++ b/apps/frontend/src/components/Navbar.tsx @@ -0,0 +1,369 @@ +import React, { useEffect, useState } from 'react'; +import { Link as RouterLink, useLocation, useNavigate } from 'react-router-dom'; +import { Box, Flex, Text, VStack } from '@chakra-ui/react'; +import { useAuthenticator } from '@aws-amplify/ui-react'; +import { signOut } from 'aws-amplify/auth'; +import { ChevronDown, ChevronRight, LogOut } from 'lucide-react'; +import ApiClient from '@api/apiClient'; +import { Role, User } from '../types/types'; + +const ROLE_MAP: Record = { + [Role.ADMIN]: { label: 'Admin' }, + [Role.VOLUNTEER]: { label: 'Volunteer' }, + [Role.PANTRY]: { label: 'Pantry' }, + [Role.FOODMANUFACTURER]: { label: 'Food Manufacturer' }, +}; + +// Nav Structure Types +type FlatNav = { type: 'flat'; label: string; to: string }; +type GroupNav = { + type: 'group'; + label: string; + children: Array<{ label: string; to: string }>; +}; +type NavSection = FlatNav | GroupNav; + +// Role Nav Definitions +const ROLE_NAV_SECTIONS: Record = { + [Role.ADMIN]: [ + { + type: 'group', + label: 'Volunteers', + children: [ + { label: 'Volunteer Management', to: '/volunteer-management' }, + ], + }, + { + type: 'group', + label: 'Pantries', + children: [ + { label: 'Pantry Management', to: '/pantries' }, + { label: 'Application Review', to: '/approve-pantries' }, + ], + }, + { + type: 'group', + label: 'Orders', + children: [{ label: 'Order Management', to: '/admin-order-management' }], + }, + { + type: 'group', + label: 'Manufacturers', + children: [ + { label: 'Donation Management', to: '/admin-donation' }, + { label: 'Application Review', to: '/approve-food-manufacturers' }, + ], + }, + ], + [Role.VOLUNTEER]: [ + { + type: 'flat', + label: 'Assigned Pantries', + to: '/volunteer-assigned-pantries', + }, + { + type: 'group', + label: 'Orders', + children: [ + { + label: 'Food Request Management', + to: '/volunteer-request-management', + }, + ], + }, + ], + [Role.FOODMANUFACTURER]: [ + { + type: 'group', + label: 'Donations', + children: [ + { label: 'Donation Management', to: '/fm-donation-management' }, + ], + }, + ], + [Role.PANTRY]: [ + { + type: 'group', + label: 'Orders', + children: [ + { label: 'Order Management', to: '/pantry-order-management' }, + { label: 'Food Requests', to: '/request-form' }, + ], + }, + ], +}; + +// Subcomponents +const NavLink: React.FC<{ + to: string; + label: string; + isActive: boolean; + fontWeight?: string | number; +}> = ({ to, label, isActive, fontWeight }) => ( + + + + {label} + + + +); + +interface NavGroupProps { + label: string; + children: Array<{ label: string; to: string }>; + isOpen: boolean; + onToggle: () => void; + activePath: string; +} + +const NavGroup: React.FC = ({ + label, + children, + isOpen, + onToggle, + activePath, +}) => ( + + + + {label} + + {isOpen ? ( + + ) : ( + + )} + + + {isOpen && + children.map((child) => { + const isActive = activePath === child.to; + return ( + + + + + + + + + {child.label} + + + + + ); + })} + +); + +const Navbar: React.FC = () => { + const { user: cognitoUser } = useAuthenticator((context) => [context.user]); + const [currentUser, setCurrentUser] = useState(null); + const [openGroups, setOpenGroups] = useState>(new Set()); + const location = useLocation(); + const navigate = useNavigate(); + + useEffect(() => { + // Only fetch the current user if they are logged in + if (cognitoUser) { + ApiClient.getMe() + .then(setCurrentUser) + .catch(() => setCurrentUser(null)); + } else { + setCurrentUser(null); + } + }, [cognitoUser]); + + // On reload or navigation, make sure the currently opened groups stays open + useEffect(() => { + if (!currentUser) return; + const sections = ROLE_NAV_SECTIONS[currentUser.role]; + setOpenGroups((prev) => { + const next = new Set(prev); + sections.forEach((s) => { + if ( + s.type === 'group' && + s.children.some((c) => c.to === location.pathname) + ) { + next.add(s.label); + } + }); + return next; + }); + }, [location.pathname, currentUser]); + + if (!cognitoUser) return null; + + const roleLabel = currentUser ? ROLE_MAP[currentUser.role].label : null; + const sections: NavSection[] = currentUser + ? ROLE_NAV_SECTIONS[currentUser.role] + : []; + const email = currentUser?.email ?? ''; + + const toggleGroup = (label: string) => { + setOpenGroups((prev) => { + const next = new Set(prev); + if (next.has(label)) next.delete(label); + else next.add(label); + return next; + }); + }; + + const handleSignOut = async () => { + await signOut(); + navigate('/'); + }; + + return ( + + + + + SSF logo + + + + {`${roleLabel} Dashboard`} + + + {email} + + + + + + + + + {sections.map((section) => + section.type === 'flat' ? ( + + ) : ( + toggleGroup(section.label)} + activePath={location.pathname} + /> + ), + )} + + + + + + Sign Out + + + + ); +}; + +export default Navbar; diff --git a/apps/frontend/src/containers/homepage.tsx b/apps/frontend/src/containers/homepage.tsx index 580a3a743..b7ce34d55 100644 --- a/apps/frontend/src/containers/homepage.tsx +++ b/apps/frontend/src/containers/homepage.tsx @@ -33,16 +33,6 @@ const Homepage: React.FC = () => { Pantry View - - - Pantry Dashboard - - - - - Past Orders - - Request Form @@ -70,18 +60,6 @@ const Homepage: React.FC = () => { Food Manufacturer View - - - - Order Dashboard - - - - - - Orders - - diff --git a/apps/frontend/src/containers/orders.tsx b/apps/frontend/src/containers/orders.tsx deleted file mode 100644 index b4aa4db9b..000000000 --- a/apps/frontend/src/containers/orders.tsx +++ /dev/null @@ -1,5 +0,0 @@ -const Orders: React.FC = () => { - return <>Orders; -}; - -export default Orders; diff --git a/apps/frontend/src/containers/pantryPastOrders.tsx b/apps/frontend/src/containers/pantryPastOrders.tsx deleted file mode 100644 index 260a492f9..000000000 --- a/apps/frontend/src/containers/pantryPastOrders.tsx +++ /dev/null @@ -1,5 +0,0 @@ -const PantryPastOrders: React.FC = () => { - return <>Pantry past orders; -}; - -export default PantryPastOrders; diff --git a/apps/frontend/src/containers/root.tsx b/apps/frontend/src/containers/root.tsx index 214d09b74..9e216caaf 100644 --- a/apps/frontend/src/containers/root.tsx +++ b/apps/frontend/src/containers/root.tsx @@ -1,7 +1,8 @@ import { Outlet, useNavigate } from 'react-router-dom'; -import Header from '../components/Header'; +import { Box, Flex } from '@chakra-ui/react'; import { useEffect } from 'react'; import apiClient from '@api/apiClient'; +import Navbar from '../components/Navbar'; const Root: React.FC = () => { const navigate = useNavigate(); @@ -11,10 +12,12 @@ const Root: React.FC = () => { }, [navigate]); return ( -
-
- -
+ + + + + + ); }; From 02a741406f80234c0403eed4268c593144f1d626 Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Sun, 12 Apr 2026 20:02:28 -0400 Subject: [PATCH 02/14] added icon in login page --- .claude/settings.local.json | 8 - apps/frontend/src/components/AuthHeader.tsx | 25 ++ .../src/containers/forgotPasswordPage.tsx | 25 +- apps/frontend/src/containers/loginPage.tsx | 346 +++++++++--------- apps/frontend/src/containers/signupPage.tsx | 121 +++--- 5 files changed, 279 insertions(+), 246 deletions(-) delete mode 100644 .claude/settings.local.json create mode 100644 apps/frontend/src/components/AuthHeader.tsx diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index d5276fad5..000000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "permissions": { - "allow": [ - "mcp__plugin_figma_figma__get_design_context", - "mcp__plugin_figma_figma__get_screenshot" - ] - } -} diff --git a/apps/frontend/src/components/AuthHeader.tsx b/apps/frontend/src/components/AuthHeader.tsx new file mode 100644 index 000000000..7e3d94437 --- /dev/null +++ b/apps/frontend/src/components/AuthHeader.tsx @@ -0,0 +1,25 @@ +import { Box } from '@chakra-ui/react'; + +const AuthHeader: React.FC = () => ( + + + SSF + + +); + +export default AuthHeader; diff --git a/apps/frontend/src/containers/forgotPasswordPage.tsx b/apps/frontend/src/containers/forgotPasswordPage.tsx index e2d4405fb..7e9c0d5f6 100644 --- a/apps/frontend/src/containers/forgotPasswordPage.tsx +++ b/apps/frontend/src/containers/forgotPasswordPage.tsx @@ -1,20 +1,23 @@ import { Box } from '@chakra-ui/react'; import loginBackground from '../assets/login_background.png'; import ResetPasswordModal from '@components/forms/resetPasswordModal'; +import AuthHeader from '@components/AuthHeader'; const ForgotPasswordPage: React.FC = () => { return ( - - + + + + + ); }; diff --git a/apps/frontend/src/containers/loginPage.tsx b/apps/frontend/src/containers/loginPage.tsx index e3fc46909..48f8ce6ba 100644 --- a/apps/frontend/src/containers/loginPage.tsx +++ b/apps/frontend/src/containers/loginPage.tsx @@ -16,6 +16,7 @@ import loginBackground from '../assets/login_background.png'; import { Eye, EyeOff } from 'lucide-react'; import { FloatingAlert } from '@components/floatingAlert'; import { useAlert } from '../hooks/alert'; +import AuthHeader from '@components/AuthHeader'; type Step = 'login' | 'new-password'; @@ -87,192 +88,201 @@ const LoginPage: React.FC = () => { }; return ( - - {alertState && ( - - )} + + - {step === 'login' ? ( - - - Log In - - Welcome to the Securing Safe Food (SSF) Portal. Please log in - with your account credentials. - - - - - Email - setEmail(e.target.value)} - /> - + {alertState && ( + + )} + + {step === 'login' ? ( + + + Log In + + Welcome to the Securing Safe Food (SSF) Portal. Please log in + with your account credentials. + + - - Password - + + Email setPassword(e.target.value)} + onChange={(e) => setEmail(e.target.value)} /> - setShowPassword((prev) => !prev)} - > - - {showPassword && } - {!showPassword && } - - - - + - - - ) : ( - - - Set New Password - - Your account requires a new password before continuing. Your - password should be at least 8 characters. - - + + Password + + setPassword(e.target.value)} + /> + setShowPassword((prev) => !prev)} + > + + {showPassword && } + {!showPassword && } + + + + - - New Password - - setNewPassword(e.target.value)} - /> - setShowNewPassword((prev) => !prev)} - > - - {showNewPassword && } - {!showNewPassword && } - - - - + + + ) : ( + + + Set New Password + + Your account requires a new password before continuing. Your + password should be at least 8 characters. + + - - Confirm Password - - setConfirmNewPassword(e.target.value)} - /> - setShowConfirmNewPassword((prev) => !prev)} - > - - {showConfirmNewPassword && } - {!showConfirmNewPassword && } - - - - + + New Password + + setNewPassword(e.target.value)} + /> + setShowNewPassword((prev) => !prev)} + > + + {showNewPassword && } + {!showNewPassword && } + + + + - - - )} + + + Confirm Password + + + setConfirmNewPassword(e.target.value)} + /> + setShowConfirmNewPassword((prev) => !prev)} + > + + {showConfirmNewPassword && } + {!showConfirmNewPassword && } + + + + - {step === 'login' && ( - <> - - Don't have an account?{' '} - + Set Password + + + )} + + {step === 'login' && ( + <> + navigate('/signup')} - variant="underline" - textDecorationColor="neutral.300" + textAlign="center" + mt={6} > - Sign up - - + Don't have an account?{' '} + navigate('/signup')} + variant="underline" + textDecorationColor="neutral.300" + > + Sign up + + - - navigate('/forgot-password')}> - Reset Password - - - - )} + + navigate('/forgot-password')}> + Reset Password + + + + )} + ); diff --git a/apps/frontend/src/containers/signupPage.tsx b/apps/frontend/src/containers/signupPage.tsx index ca831b9a1..ad6b6f1a8 100644 --- a/apps/frontend/src/containers/signupPage.tsx +++ b/apps/frontend/src/containers/signupPage.tsx @@ -1,74 +1,77 @@ import { useNavigate } from 'react-router-dom'; import { Box, Text, VStack, Button, Link } from '@chakra-ui/react'; import loginBackground from '../assets/login_background.png'; +import AuthHeader from '@components/AuthHeader'; const SignupPage: React.FC = () => { const navigate = useNavigate(); return ( - + + - - - Sign Up - - Please select your specified user type to begin your account - creation. - - + + + + Sign Up + + Please select your specified user type to begin your account + creation. + + - + - - - - Already have an account?{' '} - navigate('/login')} - variant="underline" - textDecorationColor="neutral.300" - > - Log in - - + + + + Already have an account?{' '} + navigate('/login')} + variant="underline" + textDecorationColor="neutral.300" + > + Log in + + + ); From 4bc3615fa0e9544de34e47b4af591467d7443509 Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Sun, 12 Apr 2026 20:07:09 -0400 Subject: [PATCH 03/14] final commit --- apps/frontend/src/app.tsx | 16 -- apps/frontend/src/components/Navbar.tsx | 5 +- .../foodManufacturerOrderDashboard.tsx | 113 -------------- .../src/containers/pantryDashboard.tsx | 147 ------------------ 4 files changed, 1 insertion(+), 280 deletions(-) delete mode 100644 apps/frontend/src/containers/foodManufacturerOrderDashboard.tsx delete mode 100644 apps/frontend/src/containers/pantryDashboard.tsx diff --git a/apps/frontend/src/app.tsx b/apps/frontend/src/app.tsx index 2afc4abb4..e5aafd54a 100644 --- a/apps/frontend/src/app.tsx +++ b/apps/frontend/src/app.tsx @@ -73,22 +73,6 @@ const router = createBrowserRouter([ path: '/unauthorized', element: , }, - { - path: '/pantries', - element: ( - - - - ), - }, - { - path: '/pantries', - element: ( - - - - ), - }, { path: '/request-form', element: ( diff --git a/apps/frontend/src/components/Navbar.tsx b/apps/frontend/src/components/Navbar.tsx index eb34e62a9..7ca421951 100644 --- a/apps/frontend/src/components/Navbar.tsx +++ b/apps/frontend/src/components/Navbar.tsx @@ -36,10 +36,7 @@ const ROLE_NAV_SECTIONS: Record = { { type: 'group', label: 'Pantries', - children: [ - { label: 'Pantry Management', to: '/pantries' }, - { label: 'Application Review', to: '/approve-pantries' }, - ], + children: [{ label: 'Application Review', to: '/approve-pantries' }], }, { type: 'group', diff --git a/apps/frontend/src/containers/foodManufacturerOrderDashboard.tsx b/apps/frontend/src/containers/foodManufacturerOrderDashboard.tsx deleted file mode 100644 index b118f0a78..000000000 --- a/apps/frontend/src/containers/foodManufacturerOrderDashboard.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { Center, Table, Button, ButtonGroup, VStack } from '@chakra-ui/react'; -import ApiClient from '@api/apiClient'; -import { Order } from 'types/types'; -import OrderInformationModal from '@components/forms/orderInformationModal'; -import { formatDate } from '@utils/utils'; - -const FoodManufacturerOrderDashboard: React.FC = () => { - const [orders, setOrders] = useState([]); - const [orderType, setOrderType] = useState<'current' | 'past'>('current'); - const [openOrderId, setOpenOrderId] = useState(null); - - useEffect(() => { - fetchOrders(); - }, [orderType]); - - const fetchOrders = async () => { - try { - const data = - orderType === 'current' - ? await ApiClient.getCurrentOrders() - : await ApiClient.getPastOrders(); - setOrders(data); - } catch (error) { - alert('Error fetching orders: ' + error); - } - }; - - const updateOrderStatus = async ( - orderId: number, - newStatus: 'shipped' | 'delivered', - ) => { - try { - await ApiClient.updateOrderStatus(orderId, newStatus); - fetchOrders(); - } catch (error) { - alert(`Error updating order status: ` + error); - } - }; - - return ( -
- - - - - - - - - - Order ID - Date Placed - Status - Actions - - - - {orders.map((order) => ( - - - - - {formatDate(order.createdAt)} - {order.status} - - - {order.status === 'pending' && ( - - )} - - - - ))} - {openOrderId && ( - setOpenOrderId(null)} - /> - )} - - - -
- ); -}; - -export default FoodManufacturerOrderDashboard; diff --git a/apps/frontend/src/containers/pantryDashboard.tsx b/apps/frontend/src/containers/pantryDashboard.tsx deleted file mode 100644 index 37aa458dc..000000000 --- a/apps/frontend/src/containers/pantryDashboard.tsx +++ /dev/null @@ -1,147 +0,0 @@ -import { - Menu, - Portal, - Button, - HStack, - Text, - VStack, - Card, - CardBody, - Box, - Link, -} from '@chakra-ui/react'; -import { MenuIcon } from 'lucide-react'; -import React, { useEffect, useState } from 'react'; -import { PantryWithUser } from 'types/types'; -import ApiClient from '@api/apiClient'; - -const PantryDashboard: React.FC = () => { - const [pantryId, setPantryId] = useState(null); - const [pantry, setPantry] = useState(null); - - useEffect(() => { - const fetchPantryId = async () => { - try { - const pantryId = await ApiClient.getCurrentUserPantryId(); - setPantryId(pantryId); - } catch (error) { - console.error('Error fetching pantry ID', error); - } - }; - - fetchPantryId(); - }, []); - - useEffect(() => { - const fetchPantryData = async () => { - if (!pantryId) return; - - try { - const pantryData = await ApiClient.getPantry(pantryId); - setPantry(pantryData); - } catch (error) { - console.error('Error fetching pantry data/SSFRep data', error); - } - }; - - fetchPantryData(); - }, [pantryId]); - - return ( - - - - Welcome {pantry?.pantryName}! - - - - - - - - - - - Profile - - - Request Form - - - Sign out - - - - - - - - - - - - Need help? Contact your SSF representative - - - Name: {pantry?.pantryUser?.firstName} {pantry?.pantryUser?.lastName} - - Email: {pantry?.pantryUser?.email} - Phone: {pantry?.pantryUser?.phone} - - - - - - ); -}; - -export default PantryDashboard; From 50ead8bfcc59701043d309e4702e56ed134db0b5 Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Sat, 18 Apr 2026 04:07:27 -0400 Subject: [PATCH 04/14] fixed navigation bugs and comments --- apps/frontend/src/app.tsx | 44 ++++++++-------- apps/frontend/src/components/Navbar.tsx | 51 ++++++++++--------- .../forms/manufacturerApplicationForm.tsx | 5 +- .../forms/pantryApplicationForm.tsx | 5 +- .../frontend/src/components/signOutButton.tsx | 3 +- .../foodManufacturerApplicationDetails.tsx | 9 ++-- apps/frontend/src/containers/loginPage.tsx | 8 ++- apps/frontend/src/containers/pantries.tsx | 5 -- .../containers/pantryApplicationDetails.tsx | 11 ++-- apps/frontend/src/containers/signupPage.tsx | 7 +-- .../containers/volunteerAssignedPantries.tsx | 5 +- apps/frontend/src/routes.ts | 32 ++++++++++++ 12 files changed, 117 insertions(+), 68 deletions(-) delete mode 100644 apps/frontend/src/containers/pantries.tsx create mode 100644 apps/frontend/src/routes.ts diff --git a/apps/frontend/src/app.tsx b/apps/frontend/src/app.tsx index e5aafd54a..36148615b 100644 --- a/apps/frontend/src/app.tsx +++ b/apps/frontend/src/app.tsx @@ -1,7 +1,6 @@ import { createBrowserRouter, RouterProvider } from 'react-router-dom'; import Root from '@containers/root'; import NotFound from '@containers/404'; -import Pantries from '@containers/pantries'; import FormRequests from '@containers/formRequests'; import PantryApplication from '@containers/pantryApplication'; import ApplicationSubmitted from '@containers/applicationSubmitted'; @@ -14,6 +13,7 @@ import Homepage from '@containers/homepage'; import AdminOrderManagement from '@containers/adminOrderManagement'; import { Amplify } from 'aws-amplify'; import CognitoAuthConfig from './aws-exports'; +import { ROUTES } from './routes'; import FoodManufacturerDonationManagement from '@containers/foodManufacturerDonationManagement'; import LoginPage from '@containers/loginPage'; import SignupPage from '@containers/signupPage'; @@ -34,7 +34,7 @@ Amplify.configure(CognitoAuthConfig); const router = createBrowserRouter([ { - path: '/', + path: ROUTES.HOME, element: , errorElement: , children: [ @@ -44,37 +44,37 @@ const router = createBrowserRouter([ element: , }, { - path: '/login', + path: ROUTES.LOGIN, element: , }, { - path: '/signup', + path: ROUTES.SIGNUP, element: , }, { - path: '/forgot-password', + path: ROUTES.FORGOT_PASSWORD, element: , }, { - path: '/pantry-application', + path: ROUTES.PANTRY_APPLICATION, element: , action: submitPantryApplicationForm, }, { - path: '/food-manufacturer-application', + path: ROUTES.FOOD_MANUFACTURER_APPLICATION, element: , action: submitManufacturerApplicationForm, }, { - path: '/application-submitted', + path: ROUTES.APPLICATION_SUBMITTED, element: , }, { - path: '/unauthorized', + path: ROUTES.UNAUTHORIZED, element: , }, { - path: '/request-form', + path: ROUTES.REQUEST_FORM, element: ( @@ -82,7 +82,7 @@ const router = createBrowserRouter([ ), }, { - path: '/fm-donation-management', + path: ROUTES.FM_DONATION_MANAGEMENT, element: ( @@ -90,7 +90,7 @@ const router = createBrowserRouter([ ), }, { - path: '/approve-pantries', + path: ROUTES.APPROVE_PANTRIES, element: ( @@ -98,7 +98,7 @@ const router = createBrowserRouter([ ), }, { - path: '/approve-food-manufacturers', + path: ROUTES.APPROVE_FOOD_MANUFACTURERS, element: ( @@ -106,7 +106,7 @@ const router = createBrowserRouter([ ), }, { - path: '/pantry-application-details/:applicationId', + path: ROUTES.PANTRY_APPLICATION_DETAILS, element: ( @@ -114,7 +114,7 @@ const router = createBrowserRouter([ ), }, { - path: '/food-manufacturer-application-details/:applicationId', + path: ROUTES.FOOD_MANUFACTURER_APPLICATION_DETAILS, element: ( @@ -122,7 +122,7 @@ const router = createBrowserRouter([ ), }, { - path: '/admin-donation', + path: ROUTES.ADMIN_DONATION, element: ( @@ -130,7 +130,7 @@ const router = createBrowserRouter([ ), }, { - path: '/volunteer-management', + path: ROUTES.VOLUNTEER_MANAGEMENT, element: ( @@ -138,7 +138,7 @@ const router = createBrowserRouter([ ), }, { - path: '/admin-order-management', + path: ROUTES.ADMIN_ORDER_MANAGEMENT, element: ( @@ -146,7 +146,7 @@ const router = createBrowserRouter([ ), }, { - path: '/pantry-order-management', + path: ROUTES.PANTRY_ORDER_MANAGEMENT, element: ( @@ -154,7 +154,7 @@ const router = createBrowserRouter([ ), }, { - path: '/profile', + path: ROUTES.PROFILE, element: ( @@ -162,7 +162,7 @@ const router = createBrowserRouter([ ), }, { - path: '/volunteer-assigned-pantries', + path: ROUTES.VOLUNTEER_ASSIGNED_PANTRIES, element: ( @@ -170,7 +170,7 @@ const router = createBrowserRouter([ ), }, { - path: '/volunteer-request-management', + path: ROUTES.VOLUNTEER_REQUEST_MANAGEMENT, element: ( diff --git a/apps/frontend/src/components/Navbar.tsx b/apps/frontend/src/components/Navbar.tsx index 7ca421951..3553eca1e 100644 --- a/apps/frontend/src/components/Navbar.tsx +++ b/apps/frontend/src/components/Navbar.tsx @@ -6,6 +6,7 @@ import { signOut } from 'aws-amplify/auth'; import { ChevronDown, ChevronRight, LogOut } from 'lucide-react'; import ApiClient from '@api/apiClient'; import { Role, User } from '../types/types'; +import { ROUTES } from '../routes'; const ROLE_MAP: Record = { [Role.ADMIN]: { label: 'Admin' }, @@ -30,25 +31,27 @@ const ROLE_NAV_SECTIONS: Record = { type: 'group', label: 'Volunteers', children: [ - { label: 'Volunteer Management', to: '/volunteer-management' }, + { label: 'Volunteer Management', to: ROUTES.VOLUNTEER_MANAGEMENT }, ], }, { type: 'group', label: 'Pantries', - children: [{ label: 'Application Review', to: '/approve-pantries' }], + children: [{ label: 'Application Review', to: ROUTES.APPROVE_PANTRIES }], }, { type: 'group', label: 'Orders', - children: [{ label: 'Order Management', to: '/admin-order-management' }], + children: [ + { label: 'Order Management', to: ROUTES.ADMIN_ORDER_MANAGEMENT }, + ], }, { type: 'group', label: 'Manufacturers', children: [ - { label: 'Donation Management', to: '/admin-donation' }, - { label: 'Application Review', to: '/approve-food-manufacturers' }, + { label: 'Donation Management', to: ROUTES.ADMIN_DONATION }, + { label: 'Application Review', to: ROUTES.APPROVE_FOOD_MANUFACTURERS }, ], }, ], @@ -56,7 +59,7 @@ const ROLE_NAV_SECTIONS: Record = { { type: 'flat', label: 'Assigned Pantries', - to: '/volunteer-assigned-pantries', + to: ROUTES.VOLUNTEER_ASSIGNED_PANTRIES, }, { type: 'group', @@ -64,7 +67,7 @@ const ROLE_NAV_SECTIONS: Record = { children: [ { label: 'Food Request Management', - to: '/volunteer-request-management', + to: ROUTES.VOLUNTEER_REQUEST_MANAGEMENT, }, ], }, @@ -74,7 +77,7 @@ const ROLE_NAV_SECTIONS: Record = { type: 'group', label: 'Donations', children: [ - { label: 'Donation Management', to: '/fm-donation-management' }, + { label: 'Donation Management', to: ROUTES.FM_DONATION_MANAGEMENT }, ], }, ], @@ -83,8 +86,8 @@ const ROLE_NAV_SECTIONS: Record = { type: 'group', label: 'Orders', children: [ - { label: 'Order Management', to: '/pantry-order-management' }, - { label: 'Food Requests', to: '/request-form' }, + { label: 'Order Management', to: ROUTES.PANTRY_ORDER_MANAGEMENT }, + { label: 'Food Requests', to: ROUTES.REQUEST_FORM }, ], }, ], @@ -199,22 +202,21 @@ const NavGroup: React.FC = ({ ); const Navbar: React.FC = () => { - const { user: cognitoUser } = useAuthenticator((context) => [context.user]); + const { authStatus } = useAuthenticator((context) => [context.authStatus]); const [currentUser, setCurrentUser] = useState(null); const [openGroups, setOpenGroups] = useState>(new Set()); const location = useLocation(); const navigate = useNavigate(); useEffect(() => { - // Only fetch the current user if they are logged in - if (cognitoUser) { + if (authStatus === 'authenticated') { ApiClient.getMe() .then(setCurrentUser) .catch(() => setCurrentUser(null)); } else { setCurrentUser(null); } - }, [cognitoUser]); + }, [authStatus]); // On reload or navigation, make sure the currently opened groups stays open useEffect(() => { @@ -234,13 +236,11 @@ const Navbar: React.FC = () => { }); }, [location.pathname, currentUser]); - if (!cognitoUser) return null; + if (authStatus !== 'authenticated' || !currentUser) return null; - const roleLabel = currentUser ? ROLE_MAP[currentUser.role].label : null; - const sections: NavSection[] = currentUser - ? ROLE_NAV_SECTIONS[currentUser.role] - : []; - const email = currentUser?.email ?? ''; + const roleLabel = ROLE_MAP[currentUser.role].label; + const sections: NavSection[] = ROLE_NAV_SECTIONS[currentUser.role]; + const email = currentUser.email; const toggleGroup = (label: string) => { setOpenGroups((prev) => { @@ -253,7 +253,7 @@ const Navbar: React.FC = () => { const handleSignOut = async () => { await signOut(); - navigate('/'); + navigate(ROUTES.LOGIN, { replace: true }); }; return ( @@ -269,7 +269,10 @@ const Navbar: React.FC = () => { pb={4} flexShrink={0} > - + { {sections.map((section) => diff --git a/apps/frontend/src/components/forms/manufacturerApplicationForm.tsx b/apps/frontend/src/components/forms/manufacturerApplicationForm.tsx index 3350edfb7..a029e9dd0 100644 --- a/apps/frontend/src/components/forms/manufacturerApplicationForm.tsx +++ b/apps/frontend/src/components/forms/manufacturerApplicationForm.tsx @@ -36,6 +36,7 @@ import { } from '../../types/manufacturerEnums'; import { FloatingAlert } from '@components/floatingAlert'; import { useAlert } from '../../hooks/alert'; +import { ROUTES } from '../../routes'; const ManufacturerApplicationForm: React.FC = () => { const [contactPhone, setContactPhone] = useState(''); @@ -107,7 +108,7 @@ const ManufacturerApplicationForm: React.FC = () => { borderColor="neutral.200" rounded="sm" > -
+ Food Manufacturer Application Form @@ -721,7 +722,7 @@ export const submitManufacturerApplicationForm: ActionFunction = async ({ try { await ApiClient.postManufacturer(data as ManufacturerApplicationDto); - return redirect('/application-submitted'); + return redirect(ROUTES.APPLICATION_SUBMITTED); } catch (error) { if (axios.isAxiosError(error) && error.response?.status === 400) { return { diff --git a/apps/frontend/src/components/forms/pantryApplicationForm.tsx b/apps/frontend/src/components/forms/pantryApplicationForm.tsx index bf133a87b..601bfc266 100644 --- a/apps/frontend/src/components/forms/pantryApplicationForm.tsx +++ b/apps/frontend/src/components/forms/pantryApplicationForm.tsx @@ -32,6 +32,7 @@ import { ChevronDownIcon } from 'lucide-react'; import { TagGroup } from './tagGroup'; import { FloatingAlert } from '@components/floatingAlert'; import { useAlert } from '../../hooks/alert'; +import { ROUTES } from '../../routes'; const otherRestrictionsOptions: string[] = [ 'Other allergy (e.g., yeast, sunflower, etc.)', @@ -142,7 +143,7 @@ const PantryApplicationForm: React.FC = () => { borderColor="neutral.200" rounded="sm" > - + Pantry Application Form @@ -1210,7 +1211,7 @@ export const submitPantryApplicationForm: ActionFunction = async ({ try { await ApiClient.postPantry(data as PantryApplicationDto); - return redirect('/application-submitted'); + return redirect(ROUTES.APPLICATION_SUBMITTED); } catch (error) { if (axios.isAxiosError(error) && error.response?.status === 400) { return { diff --git a/apps/frontend/src/components/signOutButton.tsx b/apps/frontend/src/components/signOutButton.tsx index 5b7abec01..2de170fe2 100644 --- a/apps/frontend/src/components/signOutButton.tsx +++ b/apps/frontend/src/components/signOutButton.tsx @@ -2,6 +2,7 @@ import apiClient from '@api/apiClient'; import { Button, ButtonProps } from '@chakra-ui/react'; import { signOut } from 'aws-amplify/auth'; import { useNavigate } from 'react-router-dom'; +import { ROUTES } from '../routes'; type SignOutButtonProps = ButtonProps; @@ -10,7 +11,7 @@ const SignOutButton: React.FC = (props) => { const handleSignOut = async () => { await signOut(); - navigate('/'); + navigate(ROUTES.LOGIN, { replace: true }); }; return ( diff --git a/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx b/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx index 5147e3e35..bcae561bb 100644 --- a/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx +++ b/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx @@ -20,6 +20,7 @@ import { AxiosError } from 'axios'; import { FloatingAlert } from '@components/floatingAlert'; import { useAlert } from '../hooks/alert'; import ConfirmFoodManufacturerDecisionModal from '@components/forms/confirmFoodManufacturerDecisionModal'; +import { ROUTES } from '../routes'; interface EmptyStateProps { icon: React.ReactNode; @@ -73,7 +74,7 @@ const EmptyState: React.FC = ({ textStyle="p2" fontWeight={600} > - + Return to applications @@ -170,7 +171,8 @@ const FoodManufacturerApplicationDetails: React.FC = () => { 'approve', ); navigate( - '/approve-food-manufacturers?action=approved&name=' + + ROUTES.APPROVE_FOOD_MANUFACTURERS + + '?action=approved&name=' + application.foodManufacturerName, ); } catch { @@ -187,7 +189,8 @@ const FoodManufacturerApplicationDetails: React.FC = () => { 'deny', ); navigate( - '/approve-food-manufacturers?action=denied&name=' + + ROUTES.APPROVE_FOOD_MANUFACTURERS + + '?action=denied&name=' + application.foodManufacturerName, ); } catch { diff --git a/apps/frontend/src/containers/loginPage.tsx b/apps/frontend/src/containers/loginPage.tsx index 48f8ce6ba..16a18150e 100644 --- a/apps/frontend/src/containers/loginPage.tsx +++ b/apps/frontend/src/containers/loginPage.tsx @@ -17,6 +17,7 @@ import { Eye, EyeOff } from 'lucide-react'; import { FloatingAlert } from '@components/floatingAlert'; import { useAlert } from '../hooks/alert'; import AuthHeader from '@components/AuthHeader'; +import { ROUTES } from '../routes'; type Step = 'login' | 'new-password'; @@ -267,7 +268,7 @@ const LoginPage: React.FC = () => { navigate('/signup')} + onClick={() => navigate(ROUTES.SIGNUP)} variant="underline" textDecorationColor="neutral.300" > @@ -276,7 +277,10 @@ const LoginPage: React.FC = () => { - navigate('/forgot-password')}> + navigate(ROUTES.FORGOT_PASSWORD)} + > Reset Password diff --git a/apps/frontend/src/containers/pantries.tsx b/apps/frontend/src/containers/pantries.tsx deleted file mode 100644 index 91e9e22df..000000000 --- a/apps/frontend/src/containers/pantries.tsx +++ /dev/null @@ -1,5 +0,0 @@ -const Pantries: React.FC = () => { - return <>Pantries; -}; - -export default Pantries; diff --git a/apps/frontend/src/containers/pantryApplicationDetails.tsx b/apps/frontend/src/containers/pantryApplicationDetails.tsx index 978140065..06f0f0c7a 100644 --- a/apps/frontend/src/containers/pantryApplicationDetails.tsx +++ b/apps/frontend/src/containers/pantryApplicationDetails.tsx @@ -20,6 +20,7 @@ import { AxiosError } from 'axios'; import { FloatingAlert } from '@components/floatingAlert'; import ConfirmPantryDecisionModal from '@components/forms/confirmPantryDecisionModal'; import { useAlert } from '../hooks/alert'; +import { ROUTES } from '../routes'; interface EmptyStateProps { icon: React.ReactNode; @@ -73,7 +74,7 @@ const EmptyState: React.FC = ({ textStyle="p2" fontWeight={600} > - Return to applications + Return to applications )} @@ -163,7 +164,9 @@ const PantryApplicationDetails: React.FC = () => { try { await ApiClient.updatePantry(application.pantryId, 'approve'); navigate( - '/approve-pantries?action=approved&name=' + application.pantryName, + ROUTES.APPROVE_PANTRIES + + '?action=approved&name=' + + application.pantryName, ); } catch { setAlertMessage('Error approving application'); @@ -176,7 +179,9 @@ const PantryApplicationDetails: React.FC = () => { try { await ApiClient.updatePantry(application.pantryId, 'deny'); navigate( - '/approve-pantries?action=denied&name=' + application.pantryName, + ROUTES.APPROVE_PANTRIES + + '?action=denied&name=' + + application.pantryName, ); } catch { setAlertMessage('Error denying application'); diff --git a/apps/frontend/src/containers/signupPage.tsx b/apps/frontend/src/containers/signupPage.tsx index ad6b6f1a8..7793ba528 100644 --- a/apps/frontend/src/containers/signupPage.tsx +++ b/apps/frontend/src/containers/signupPage.tsx @@ -2,6 +2,7 @@ import { useNavigate } from 'react-router-dom'; import { Box, Text, VStack, Button, Link } from '@chakra-ui/react'; import loginBackground from '../assets/login_background.png'; import AuthHeader from '@components/AuthHeader'; +import { ROUTES } from '../routes'; const SignupPage: React.FC = () => { const navigate = useNavigate(); @@ -42,7 +43,7 @@ const SignupPage: React.FC = () => { color="white" textStyle="p2" fontWeight={600} - onClick={() => navigate('/pantry-application')} + onClick={() => navigate(ROUTES.PANTRY_APPLICATION)} > Food Pantry Partner @@ -54,7 +55,7 @@ const SignupPage: React.FC = () => { color="white" textStyle="p2" fontWeight={600} - onClick={() => navigate('/food-manufacturer-application')} + onClick={() => navigate(ROUTES.FOOD_MANUFACTURER_APPLICATION)} > Food Manufacturer (Donor) Partner @@ -64,7 +65,7 @@ const SignupPage: React.FC = () => { navigate('/login')} + onClick={() => navigate(ROUTES.LOGIN)} variant="underline" textDecorationColor="neutral.300" > diff --git a/apps/frontend/src/containers/volunteerAssignedPantries.tsx b/apps/frontend/src/containers/volunteerAssignedPantries.tsx index 433fc838b..a89164a04 100644 --- a/apps/frontend/src/containers/volunteerAssignedPantries.tsx +++ b/apps/frontend/src/containers/volunteerAssignedPantries.tsx @@ -17,6 +17,7 @@ import { RefrigeratedDonation } from '../types/pantryEnums'; import { FloatingAlert } from '@components/floatingAlert'; import { useNavigate } from 'react-router-dom'; import { useAlert } from '../hooks/alert'; +import { ROUTES } from '../routes'; const AssignedPantries: React.FC = () => { const navigate = useNavigate(); @@ -379,7 +380,9 @@ const AssignedPantries: React.FC = () => { textDecoration="underline" color="neutral.700" textStyle="p2" - onClick={() => navigate('/landing-page')} + onClick={() => + navigate(ROUTES.VOLUNTEER_REQUEST_MANAGEMENT) + } p={0} height="auto" minW="auto" diff --git a/apps/frontend/src/routes.ts b/apps/frontend/src/routes.ts new file mode 100644 index 000000000..020b32a1e --- /dev/null +++ b/apps/frontend/src/routes.ts @@ -0,0 +1,32 @@ +export const ROUTES = { + HOME: '/', + + LOGIN: '/login', + SIGNUP: '/signup', + FORGOT_PASSWORD: '/forgot-password', + UNAUTHORIZED: '/unauthorized', + + PROFILE: '/profile', + + PANTRY_APPLICATION: '/pantry-application', + FOOD_MANUFACTURER_APPLICATION: '/food-manufacturer-application', + APPLICATION_SUBMITTED: '/application-submitted', + + PANTRY_APPLICATION_DETAILS: '/pantry-application-details/:applicationId', + FOOD_MANUFACTURER_APPLICATION_DETAILS: + '/food-manufacturer-application-details/:applicationId', + + APPROVE_PANTRIES: '/approve-pantries', + APPROVE_FOOD_MANUFACTURERS: '/approve-food-manufacturers', + VOLUNTEER_MANAGEMENT: '/volunteer-management', + ADMIN_ORDER_MANAGEMENT: '/admin-order-management', + ADMIN_DONATION: '/admin-donation', + + VOLUNTEER_ASSIGNED_PANTRIES: '/volunteer-assigned-pantries', + VOLUNTEER_REQUEST_MANAGEMENT: '/volunteer-request-management', + + PANTRY_ORDER_MANAGEMENT: '/pantry-order-management', + REQUEST_FORM: '/request-form', + + FM_DONATION_MANAGEMENT: '/fm-donation-management', +}; From 7cc5aa08e078eab1596fb42af406974a2a136fc7 Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Sat, 18 Apr 2026 04:09:47 -0400 Subject: [PATCH 05/14] fixed null dashboard bug --- apps/frontend/src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/src/components/Navbar.tsx b/apps/frontend/src/components/Navbar.tsx index 3553eca1e..037b52051 100644 --- a/apps/frontend/src/components/Navbar.tsx +++ b/apps/frontend/src/components/Navbar.tsx @@ -301,7 +301,7 @@ const Navbar: React.FC = () => { overflow="hidden" style={{ whiteSpace: 'nowrap', textOverflow: 'ellipsis' }} > - {`${roleLabel} Dashboard`} + {roleLabel ? `${roleLabel} Dashboard` : 'Dashboard'} Date: Sat, 18 Apr 2026 11:16:36 -0400 Subject: [PATCH 06/14] Use route constants --- apps/frontend/src/app.tsx | 4 ++-- apps/frontend/src/routes.ts | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/app.tsx b/apps/frontend/src/app.tsx index 638995a18..740e049c2 100644 --- a/apps/frontend/src/app.tsx +++ b/apps/frontend/src/app.tsx @@ -132,7 +132,7 @@ const router = createBrowserRouter([ ), }, { - path: '/admin-donation-stats', + path: ROUTES.ADMIN_DONATION_STATS, element: ( @@ -188,7 +188,7 @@ const router = createBrowserRouter([ ), }, { - path: '/volunteer-order-management', + path: ROUTES.VOLUNTEER_ORDER_MANAGEMENT, element: ( diff --git a/apps/frontend/src/routes.ts b/apps/frontend/src/routes.ts index 020b32a1e..81a59bc0f 100644 --- a/apps/frontend/src/routes.ts +++ b/apps/frontend/src/routes.ts @@ -21,9 +21,11 @@ export const ROUTES = { VOLUNTEER_MANAGEMENT: '/volunteer-management', ADMIN_ORDER_MANAGEMENT: '/admin-order-management', ADMIN_DONATION: '/admin-donation', + ADMIN_DONATION_STATS: '/admin-donation-stats', VOLUNTEER_ASSIGNED_PANTRIES: '/volunteer-assigned-pantries', VOLUNTEER_REQUEST_MANAGEMENT: '/volunteer-request-management', + VOLUNTEER_ORDER_MANAGEMENT: '/volunteer-order-management', PANTRY_ORDER_MANAGEMENT: '/pantry-order-management', REQUEST_FORM: '/request-form', From 695f72cb51ac94022d165491361ff3ea06a71e43 Mon Sep 17 00:00:00 2001 From: Sam Schumacher <42777208+sam-schu@users.noreply.github.com> Date: Sat, 18 Apr 2026 11:22:37 -0400 Subject: [PATCH 07/14] Add new pages to navbar --- apps/frontend/src/components/Navbar.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/frontend/src/components/Navbar.tsx b/apps/frontend/src/components/Navbar.tsx index 037b52051..1e825a88b 100644 --- a/apps/frontend/src/components/Navbar.tsx +++ b/apps/frontend/src/components/Navbar.tsx @@ -52,6 +52,7 @@ const ROLE_NAV_SECTIONS: Record = { children: [ { label: 'Donation Management', to: ROUTES.ADMIN_DONATION }, { label: 'Application Review', to: ROUTES.APPROVE_FOOD_MANUFACTURERS }, + { label: 'Donation Statistics', to: ROUTES.ADMIN_DONATION_STATS }, ], }, ], @@ -65,6 +66,10 @@ const ROLE_NAV_SECTIONS: Record = { type: 'group', label: 'Orders', children: [ + { + label: 'Order Management', + to: ROUTES.VOLUNTEER_ORDER_MANAGEMENT, + }, { label: 'Food Request Management', to: ROUTES.VOLUNTEER_REQUEST_MANAGEMENT, From 6f60068fda809aa14405fdcf46c9ba1560ac537c Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Tue, 21 Apr 2026 02:12:57 -0400 Subject: [PATCH 08/14] comments --- apps/frontend/src/components/Navbar.tsx | 41 ++++++++++++++-------- apps/frontend/src/containers/loginPage.tsx | 2 +- apps/frontend/src/routes.ts | 2 ++ 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/apps/frontend/src/components/Navbar.tsx b/apps/frontend/src/components/Navbar.tsx index 1e825a88b..a27ee3d3e 100644 --- a/apps/frontend/src/components/Navbar.tsx +++ b/apps/frontend/src/components/Navbar.tsx @@ -12,7 +12,7 @@ const ROLE_MAP: Record = { [Role.ADMIN]: { label: 'Admin' }, [Role.VOLUNTEER]: { label: 'Volunteer' }, [Role.PANTRY]: { label: 'Pantry' }, - [Role.FOODMANUFACTURER]: { label: 'Food Manufacturer' }, + [Role.FOODMANUFACTURER]: { label: 'Manufacturer' }, }; // Nav Structure Types @@ -37,13 +37,17 @@ const ROLE_NAV_SECTIONS: Record = { { type: 'group', label: 'Pantries', - children: [{ label: 'Application Review', to: ROUTES.APPROVE_PANTRIES }], + children: [ + { label: 'Pantry Management', to: ROUTES.PANTRY_MANAGEMENT }, + { label: 'Application Review', to: ROUTES.APPROVE_PANTRIES }, + ], }, { type: 'group', label: 'Orders', children: [ { label: 'Order Management', to: ROUTES.ADMIN_ORDER_MANAGEMENT }, + { label: 'Food Requests', to: ROUTES.FOOD_REQUESTS }, ], }, { @@ -71,7 +75,7 @@ const ROLE_NAV_SECTIONS: Record = { to: ROUTES.VOLUNTEER_ORDER_MANAGEMENT, }, { - label: 'Food Request Management', + label: 'Food Requests', to: ROUTES.VOLUNTEER_REQUEST_MANAGEMENT, }, ], @@ -150,14 +154,21 @@ const NavGroup: React.FC = ({ _hover={{ bg: 'neutral.100' }} onClick={onToggle} w="full" + mb="4px" + mt="4px" > - + {label} {isOpen ? ( - + ) : ( - + )} @@ -174,7 +185,7 @@ const NavGroup: React.FC = ({ pr="8px" w="full" > - + { style={{ width: '100%', height: '100%', objectFit: 'contain' }} /> - + @@ -310,8 +320,7 @@ const Navbar: React.FC = () => { @@ -360,10 +369,14 @@ const Navbar: React.FC = () => { cursor="pointer" _hover={{ bg: 'neutral.100' }} onClick={handleSignOut} - mt={4} + mb={8} > - - + + Sign Out diff --git a/apps/frontend/src/containers/loginPage.tsx b/apps/frontend/src/containers/loginPage.tsx index 16a18150e..1cc951dfd 100644 --- a/apps/frontend/src/containers/loginPage.tsx +++ b/apps/frontend/src/containers/loginPage.tsx @@ -281,7 +281,7 @@ const LoginPage: React.FC = () => { color="red" onClick={() => navigate(ROUTES.FORGOT_PASSWORD)} > - Reset Password + Forgot Password? diff --git a/apps/frontend/src/routes.ts b/apps/frontend/src/routes.ts index 81a59bc0f..cf6ae021c 100644 --- a/apps/frontend/src/routes.ts +++ b/apps/frontend/src/routes.ts @@ -19,6 +19,8 @@ export const ROUTES = { APPROVE_PANTRIES: '/approve-pantries', APPROVE_FOOD_MANUFACTURERS: '/approve-food-manufacturers', VOLUNTEER_MANAGEMENT: '/volunteer-management', + PANTRY_MANAGEMENT: '/pantry-management', + FOOD_REQUESTS: '/food-reqeusts', ADMIN_ORDER_MANAGEMENT: '/admin-order-management', ADMIN_DONATION: '/admin-donation', ADMIN_DONATION_STATS: '/admin-donation-stats', From d949fc6682b884f1aa4ee8f585352457d35152b0 Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Tue, 21 Apr 2026 10:28:50 -0400 Subject: [PATCH 09/14] fixed enum usage --- .../containers/foodManufacturerApplicationDetails.tsx | 10 +++++++--- .../src/containers/pantryApplicationDetails.tsx | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx b/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx index bcae561bb..7c2e96475 100644 --- a/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx +++ b/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx @@ -12,7 +12,7 @@ import { Spinner, } from '@chakra-ui/react'; import ApiClient from '@api/apiClient'; -import { FoodManufacturer } from 'types/types'; +import { ApplicationStatus, FoodManufacturer } from 'types/types'; import { formatDate, formatPhone } from '@utils/utils'; import { TagGroup } from '@components/forms/tagGroup'; import { FileX, TriangleAlert, WifiOff } from 'lucide-react'; @@ -172,7 +172,9 @@ const FoodManufacturerApplicationDetails: React.FC = () => { ); navigate( ROUTES.APPROVE_FOOD_MANUFACTURERS + - '?action=approved&name=' + + '?action=' + + ApplicationStatus.APPROVED + + '&name=' + application.foodManufacturerName, ); } catch { @@ -190,7 +192,9 @@ const FoodManufacturerApplicationDetails: React.FC = () => { ); navigate( ROUTES.APPROVE_FOOD_MANUFACTURERS + - '?action=denied&name=' + + '?action=' + + ApplicationStatus.DENIED + + '&name=' + application.foodManufacturerName, ); } catch { diff --git a/apps/frontend/src/containers/pantryApplicationDetails.tsx b/apps/frontend/src/containers/pantryApplicationDetails.tsx index 06f0f0c7a..65fa68f67 100644 --- a/apps/frontend/src/containers/pantryApplicationDetails.tsx +++ b/apps/frontend/src/containers/pantryApplicationDetails.tsx @@ -12,7 +12,7 @@ import { Spinner, } from '@chakra-ui/react'; import ApiClient from '@api/apiClient'; -import { PantryWithUser } from 'types/types'; +import { ApplicationStatus, PantryWithUser } from 'types/types'; import { formatDate, formatPhone } from '@utils/utils'; import { TagGroup } from '@components/forms/tagGroup'; import { FileX, TriangleAlert, WifiOff } from 'lucide-react'; @@ -165,7 +165,9 @@ const PantryApplicationDetails: React.FC = () => { await ApiClient.updatePantry(application.pantryId, 'approve'); navigate( ROUTES.APPROVE_PANTRIES + - '?action=approved&name=' + + '?action=' + + ApplicationStatus.APPROVED + + '&name=' + application.pantryName, ); } catch { @@ -180,7 +182,9 @@ const PantryApplicationDetails: React.FC = () => { await ApiClient.updatePantry(application.pantryId, 'deny'); navigate( ROUTES.APPROVE_PANTRIES + - '?action=denied&name=' + + '?action=' + + ApplicationStatus.DENIED + + '&name=' + application.pantryName, ); } catch { From f38ad06958fd594afc0fd0f91e130b4f12b3d586 Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Tue, 21 Apr 2026 10:31:37 -0400 Subject: [PATCH 10/14] fixed enum usage --- .../src/containers/foodManufacturerApplicationDetails.tsx | 2 +- apps/frontend/src/containers/pantryApplicationDetails.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx b/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx index 7c2e96475..f60646c8b 100644 --- a/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx +++ b/apps/frontend/src/containers/foodManufacturerApplicationDetails.tsx @@ -12,7 +12,7 @@ import { Spinner, } from '@chakra-ui/react'; import ApiClient from '@api/apiClient'; -import { ApplicationStatus, FoodManufacturer } from 'types/types'; +import { ApplicationStatus, FoodManufacturer } from '../types/types'; import { formatDate, formatPhone } from '@utils/utils'; import { TagGroup } from '@components/forms/tagGroup'; import { FileX, TriangleAlert, WifiOff } from 'lucide-react'; diff --git a/apps/frontend/src/containers/pantryApplicationDetails.tsx b/apps/frontend/src/containers/pantryApplicationDetails.tsx index 65fa68f67..e9766eeba 100644 --- a/apps/frontend/src/containers/pantryApplicationDetails.tsx +++ b/apps/frontend/src/containers/pantryApplicationDetails.tsx @@ -12,7 +12,7 @@ import { Spinner, } from '@chakra-ui/react'; import ApiClient from '@api/apiClient'; -import { ApplicationStatus, PantryWithUser } from 'types/types'; +import { ApplicationStatus, PantryWithUser } from '../types/types'; import { formatDate, formatPhone } from '@utils/utils'; import { TagGroup } from '@components/forms/tagGroup'; import { FileX, TriangleAlert, WifiOff } from 'lucide-react'; From 3f16b7a8b5a70a27454d68a42d74e6bc0009b0ec Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Wed, 22 Apr 2026 18:22:41 -0400 Subject: [PATCH 11/14] surely amy approves now!! --- apps/frontend/src/components/Navbar.tsx | 34 ++++++++++++++++--------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/apps/frontend/src/components/Navbar.tsx b/apps/frontend/src/components/Navbar.tsx index a27ee3d3e..a518f7cf8 100644 --- a/apps/frontend/src/components/Navbar.tsx +++ b/apps/frontend/src/components/Navbar.tsx @@ -107,8 +107,7 @@ const NavLink: React.FC<{ to: string; label: string; isActive: boolean; - fontWeight?: string | number; -}> = ({ to, label, isActive, fontWeight }) => ( +}> = ({ to, label, isActive }) => ( - + {label} @@ -159,8 +158,8 @@ const NavGroup: React.FC = ({ > {label} @@ -206,7 +205,7 @@ const NavGroup: React.FC = ({ _hover={{ bg: 'neutral.100' }} cursor="pointer" > - + {child.label} @@ -276,7 +275,9 @@ const Navbar: React.FC = () => { { style={{ width: '100%', height: '100%', objectFit: 'contain' }} /> - + {roleLabel ? `${roleLabel} Dashboard` : 'Dashboard'} @@ -330,9 +336,8 @@ const Navbar: React.FC = () => { - + { color="var(--chakra-colors-neutral-700)" style={{ transform: 'scaleX(-1)' }} /> - + Sign Out From 008f2f16a7b11503e3796c055c0f55e63426f48b Mon Sep 17 00:00:00 2001 From: Dalton Burkhart Date: Wed, 22 Apr 2026 20:54:41 -0400 Subject: [PATCH 12/14] added gap from dashboard --- apps/frontend/src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/src/components/Navbar.tsx b/apps/frontend/src/components/Navbar.tsx index a518f7cf8..cd3f0f916 100644 --- a/apps/frontend/src/components/Navbar.tsx +++ b/apps/frontend/src/components/Navbar.tsx @@ -336,7 +336,7 @@ const Navbar: React.FC = () => { - + Date: Wed, 22 Apr 2026 21:44:19 -0400 Subject: [PATCH 13/14] amy's frontend pr reviews scare me --- apps/frontend/src/components/Navbar.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/frontend/src/components/Navbar.tsx b/apps/frontend/src/components/Navbar.tsx index cd3f0f916..8875fa34a 100644 --- a/apps/frontend/src/components/Navbar.tsx +++ b/apps/frontend/src/components/Navbar.tsx @@ -153,8 +153,6 @@ const NavGroup: React.FC = ({ _hover={{ bg: 'neutral.100' }} onClick={onToggle} w="full" - mb="4px" - mt="4px" > { - + Date: Fri, 24 Apr 2026 16:51:18 -0400 Subject: [PATCH 14/14] removed fuzzy navbar --- apps/frontend/src/components/AuthHeader.tsx | 2 -- apps/frontend/src/containers/homepage.tsx | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/frontend/src/components/AuthHeader.tsx b/apps/frontend/src/components/AuthHeader.tsx index 7e3d94437..bb76e46c1 100644 --- a/apps/frontend/src/components/AuthHeader.tsx +++ b/apps/frontend/src/components/AuthHeader.tsx @@ -5,8 +5,6 @@ const AuthHeader: React.FC = () => ( h="74px" w="full" bg="white.core" - borderBottomWidth="1px" - borderBottomColor="neutral.100" display="flex" alignItems="center" pl="26px" diff --git a/apps/frontend/src/containers/homepage.tsx b/apps/frontend/src/containers/homepage.tsx index 6915952d2..26750cb02 100644 --- a/apps/frontend/src/containers/homepage.tsx +++ b/apps/frontend/src/containers/homepage.tsx @@ -24,7 +24,7 @@ const Homepage: React.FC = () => { - + Profile View