Pantry Management Frontend
React + Vite frontend for the ASP.NET Core pantry manager API.
This app is no longer a static demo. It now uses the backend API for authentication, profile data, inventory items, locations, search, and barcode-based item lookup.
What Changed
- Replaced local demo inventory data with live API calls.
- Added a shared API client with JWT handling, refresh-token retry, and normalized error messages.
- Added shared auth/session state with
localStoragepersistence. - Updated the dashboard to support login and live inventory summary data.
- Added a dedicated inventory management page for CRUD operations.
- Updated search to call the backend search endpoints.
- Updated barcode scanning so scans look up matching inventory items through the API.
- Removed the register panel and the old
Connected APIsection from the login view.
Routes
| Route | Purpose |
|---|---|
/ |
Dashboard. Shows login when signed out, or inventory summary, chart, and nearest expiry data when signed in. |
/admin |
Household administration page for listing, creating, editing, inviting, and leaving households. |
/inventory |
Manage locations and inventory items. |
/search |
Search items and locations, then filter results further in the UI. |
/barcode |
Scan a barcode and search the inventory API for matches. |
/users |
Site-admin users page scaffold for loading all users once the backend endpoint is available. |
Routing is defined in src/App.jsx.
API Endpoint Map
Dashboard (src/pages/HomePage/HomePage.jsx)
When signed out:
POST /api/auth/login
When signed in:
GET /api/locationsGET /api/inventoryitems
Inventory (src/pages/InventoryPage/InventoryPage.jsx)
Locations:
GET /api/locationsPOST /api/locationsPUT /api/locations/{id}DELETE /api/locations/{id}
Inventory items:
GET /api/inventoryitemsGET /api/inventoryitems/{id}POST /api/inventoryitemsPUT /api/inventoryitems/{id}DELETE /api/inventoryitems/{id}
Admin (src/pages/AdminPage/AdminPage.jsx)
Households:
GET /api/householdsPOST /api/householdsPUT /api/households/{id}POST /api/households/{id}/inviteDELETE /api/households/{id}/leave
Notes:
- Household creation is limited to users with the backend
Adminrole. - Household editing and member invites are available when the current user is a household admin or site admin.
Search (src/pages/SearchPage/SearchPage.jsx)
Initial page data:
GET /api/locationsGET /api/inventoryitems
Search actions:
GET /api/search/items?q={query}GET /api/search/locations?q={query}
Note:
- The backend search API only supports the
qquery parameter. - Location, amount, expiry-date filtering, and pagination are applied client-side after the API search returns.
Barcode (src/pages/BarcodePage/BarcodePage.jsx)
GET /api/search/items?q={barcode}
The barcode page scans via Quagga2, then searches the backend for inventory items whose barcode or other searchable fields match the scanned value.
Users (src/pages/UsersPage/UsersPage.jsx)
GET /api/users
Notes:
- The users page is intentionally minimal and is ready to consume a future users endpoint.
- The current C# repo does not expose
GET /api/usersyet, so the page shows a placeholder when that endpoint returns404.
Shared Auth Support (src/api/client.js)
The shared API client also supports:
POST /api/auth/registerPOST /api/auth/refresh-token
Notes:
registeris still implemented in the client helper, but there is currently no registration form in the UI.- If you need to create a user, use the backend Swagger UI or another client to call
POST /api/auth/register.
API Configuration
The API base URL is configured in src/api/client.js.
Current setup:
const API_BASE_URL = (import.meta.env.VITE_API_BASE_URL ?? 'http://localhost:5000').trim().replace(/\/$/, '')
That means:
- If
VITE_API_BASE_URLis set, the frontend uses that value. - Otherwise it defaults to
http://localhost:5000to match the C# API repo'sappsettings.json.
Recommended Override
Create a .env.local file in the project root:
VITE_API_BASE_URL=http://localhost:5000
Example for a different backend host:
VITE_API_BASE_URL=https://your-api-host.example.com
After changing the env file, restart the Vite dev server.
Auth and Session Behavior
Auth/session logic lives in:
src/api/client.jssrc/context/AuthContext.jsx
Behavior:
- Access token and refresh token are stored in
localStorage. - Storage key:
pantry-management-session - Authenticated requests automatically send
Authorization: Bearer <token>. - If a request returns
401, the client attemptsPOST /api/auth/refresh-tokenonce and retries the original request. - Logout clears local session state even if the API logout request fails.
Local Development
1. Install dependencies
npm install
2. Make sure the backend API is running
Default expected API URL:
http://localhost:5000
If you use a different URL, set VITE_API_BASE_URL in .env.local.
3. Start the frontend
npm run dev
4. Build for production
npm run build
5. Preview the production build
npm run preview
Using the App
Login
- Open
/ - Enter an existing user email and password
- Sign in to unlock the protected routes and API-backed data
There is no registration form in the UI at the moment.
Inventory Page
Use /inventory to:
- Create, edit, and delete locations
- Create, edit, and delete inventory items
- Load a single inventory item before editing
Important update behavior:
- Blank text fields on item update are sent as empty strings.
- Blank amount, date, and location fields are omitted from the update payload because the backend only updates fields that are provided.
Admin Page
Use /admin to:
- Review all households returned for the current user
- Create a new household when the signed-in user has the site admin role
- Edit households the signed-in user administers
- Invite members by email to the selected household
- Leave a household from the same page
Search Page
Use /search to:
- Search items with the backend
itemssearch endpoint - Search locations with the backend
locationssearch endpoint - Narrow item results further by location, amount, and expiry date in the frontend
- Page through large result sets
Barcode Page
Use /barcode to:
- Scan via keyboard input
- Scan via device camera
- Automatically search inventory after a scan
- Re-run search for the last scanned barcode
Camera scanning works best on HTTPS or localhost with a trusted dev certificate.
Users Page
Use /users to:
- Refresh the users dataset from the backend once
GET /api/usersexists - Verify a future users endpoint without adding UI complexity first
Key Files
| File | Purpose |
|---|---|
src/api/client.js |
API base URL, fetch wrapper, auth headers, token refresh, endpoint helpers |
src/context/AuthContext.jsx |
Shared auth/session state for the React app |
src/App.jsx |
Route definitions |
src/pages/AdminPage/AdminPage.jsx |
Household administration UI |
src/pages/HomePage/HomePage.jsx |
Dashboard and login UI |
src/pages/InventoryPage/InventoryPage.jsx |
Location and inventory CRUD UI |
src/pages/SearchPage/SearchPage.jsx |
API-backed search UI |
src/pages/BarcodePage/BarcodePage.jsx |
Barcode scanning and API lookup UI |
src/pages/UsersPage/UsersPage.jsx |
Users endpoint scaffold and list view |
Troubleshooting
The frontend cannot reach the API
Check:
- The backend is running
VITE_API_BASE_URLis correct- The backend HTTPS certificate is trusted
- CORS is enabled on the API
Login works but protected pages fail later
Check:
- The backend refresh token flow is working
- The stored session in browser
localStorageis valid - The API still matches the endpoint shapes described in the backend README
The users page shows a placeholder instead of data
This is expected until the backend adds a users endpoint.
- The page assumes
GET /api/users - The current C# repo does not expose that route yet
- Once the backend endpoint exists, the page will start rendering results without additional routing work
Search filters do not match backend behavior exactly
This is expected for some filters.
- The backend only exposes
qsearch for items and locations. - Additional amount, location, and expiry filters are applied in the frontend after the API returns results.
Notes
- The barcode page uses
@ericblade/quagga2for camera scanning. - The frontend was verified with
npm run buildafter these API integration changes.