# Auburn Oil Customer Gateway - Frontend A modern, responsive customer portal for Auburn Oil's heating oil delivery service. Built with React and Ant Design for a professional, user-friendly experience. ``` ______ _ _ | ____| | | | | | |__ _ __ ___ _ __| |_ ___ _ __ ____ | | | __| '__/ _ \| '_ \ __/ _ \ '_ \ / _ || | | | | | | (_) | | | | || __/ | | | (_| ||_| |_| |_| \___/|_| |_|\__\___|_| |_|\__,_|(_) Auburn Oil Customer Portal ``` ## What This Does A self-service portal where Auburn Oil customers can: | Feature | Description | |---------|-------------| | **Place Orders** | Order heating oil delivery with real-time pricing | | **View Deliveries** | Track delivery history and status | | **Manage Payments** | Save, update, and remove credit cards securely | | **Tank Photos** | Upload annual tank inspection images | | **Account Management** | Update profile, change password | ## Screenshots ### Customer Dashboard - Current oil pricing at a glance - Recent delivery history with status indicators - Tank inspection photo preview - Quick access to place new orders ### New Customer Registration - 3-step wizard for easy onboarding - Tank photo upload with preview - Automatic account number generation ## Tech Stack - **Framework**: React 18.2 with Hooks - **UI Library**: Ant Design 5.12 (enterprise-grade components) - **Routing**: React Router DOM 6.21 - **HTTP Client**: Axios with interceptors - **Build Tool**: Vite 5.0 (lightning-fast HMR) - **Date Handling**: Day.js ## Quick Start ### Prerequisites - Node.js 18+ (or use Docker) - API server running (see `/api/README.md`) ### Option 1: Docker (Recommended) **Development** (with hot-reload): ```bash cd deploy docker compose -f docker-compose.dev.yml up frontend_dev --build ``` **Production**: ```bash cd deploy docker compose -f docker-compose.prod.yml up frontend_prod --build ``` ### Option 2: Local Development ```bash # Install dependencies npm install # Configure API endpoint cp .env.dev .env.local # Edit .env.local if needed # Start dev server npm run dev ``` ### Access the Portal | Environment | URL | Notes | |-------------|-----|-------| | Development | http://localhost:5173 | Vite dev server with HMR | | Local | http://localhost:80 | Docker nginx | | Production | https://portal.auburnoil.com | Production build | ## Project Structure ``` frontend/ ├── src/ │ ├── main.jsx # App entry point │ ├── App.jsx # Root component with routing │ ├── pages/ │ │ ├── Index.jsx # Dashboard (logged in) / Welcome (logged out) │ │ ├── Login.jsx # Login form │ │ ├── Register.jsx # Existing customer registration │ │ ├── New.jsx # New customer wizard (3 steps) │ │ ├── Order.jsx # Place delivery order │ │ ├── Tank.jsx # Tank photo upload │ │ ├── Payments.jsx # Payment method management │ │ ├── EditCustomer.jsx # Edit profile │ │ ├── ChangePassword.jsx # Change password │ │ ├── ForgotPassword.jsx # Request reset │ │ └── ResetPassword.jsx # Complete reset │ ├── components/ │ │ └── Navbar.jsx # Navigation with auth state │ └── utils/ │ └── api.js # Axios instance with auth interceptor ├── public/ # Static assets ├── .env.dev # Development config ├── .env.local # Local network config ├── .env.prod # Production config ├── Dockerfile.dev # Development container ├── Dockerfile.local # Local network container ├── Dockerfile.prod # Production container (nginx) ├── vite.config.js # Vite configuration └── package.json # Dependencies ``` ## Pages & Features ### Dashboard (`/`) **Logged Out:** - Welcome message - Links to login and registration **Logged In:** - Customer information card - Current oil price display - Tank inspection photos (latest 3 images) - Delivery history table with: - Date, gallons, price, status - Visual status indicators (green = waiting, gold glow = out for delivery) - Emergency delivery contact information ### Login (`/login`) - Email/password authentication - "Forgot password" link - Registration link for new users ### Registration (`/register`) - For existing Auburn Oil customers - Requires: Account number + House number (verification) - Creates portal login credentials ### New Customer (`/new`) - **Step 1**: Customer information (name, address, contact) - **Step 2**: Create account (email, password) - **Step 3**: Upload 3 tank inspection photos - Auto-generates account number (AO-XXXXXX format) ### Place Order (`/order`) - Select delivery date - Enter gallons (minimum 100) - Real-time price calculation - Payment method selection - Order confirmation ### Tank Photos (`/tank`) - Upload new inspection photos (3 required) - View photo history by date - Image preview before upload ### Payments (`/payments`) - View saved cards (masked numbers) - Add new payment method - Edit card details - Remove cards - Set default payment method ### Profile Management - **Edit Customer** (`/edit-customer`): Update address, phone - **Change Password** (`/change-password`): Update password - **Forgot Password** (`/forgot-password`): Request reset email - **Reset Password** (`/reset-password`): Complete reset with token ## Environment Configuration ### Environment Variables | Variable | Description | Example | |----------|-------------|---------| | `VITE_BASE_URL` | API server URL | `http://localhost:8000` | ### Environment Files ```bash # .env.dev - Development VITE_BASE_URL=http://localhost:8000 # .env.local - Local network testing VITE_BASE_URL=http://192.168.1.204:8000 # .env.prod - Production VITE_BASE_URL=https://api.portal.auburnoil.com ``` ## Development Guide ### Available Scripts ```bash # Start development server (hot-reload) npm run dev # Build for production npm run build # Preview production build npm run preview # Lint code npm run lint ``` ### API Integration The app uses a centralized Axios instance (`/utils/api.js`) that: 1. Sets the base URL from environment 2. Automatically attaches JWT token to requests 3. Handles authentication headers ```javascript // Example usage in components import api from '../utils/api'; // GET request const response = await api.get('/info/deliveries'); // POST request const response = await api.post('/order/', { gallons: 150, date: '2024-01-15' }); ``` ### Authentication Flow 1. User logs in via `/auth/login` 2. JWT token stored in `localStorage` 3. Axios interceptor adds `Authorization: Bearer ` to all requests 4. Protected routes check for token presence 5. Logout clears token and redirects to login ### Adding New Pages 1. Create component in `/src/pages/` 2. Add route in `App.jsx` 3. Update navbar if needed ```jsx // App.jsx } /> ``` ## Styling ### Ant Design Theme The app uses Ant Design's default theme with custom overrides: - Primary color: Auburn Oil brand colors - Responsive breakpoints for mobile/desktop - Card-based layout for information sections ### Responsive Design - Mobile-first approach - Breakpoint-aware layouts using Ant Design Grid - Tables convert to cards on mobile - Touch-friendly form inputs ## Deployment ### Docker Production Build The production Dockerfile: 1. Builds React app with Vite 2. Serves static files via nginx 3. Configures routing for SPA ```bash # Build and run production container docker build -f Dockerfile.prod -t customer-portal . docker run -p 80:80 customer-portal ``` ### Manual Production Build ```bash # Build static files npm run build # Output in /dist folder # Serve with any static file server (nginx, Apache, etc.) ``` ### nginx Configuration For SPA routing, ensure nginx redirects all routes to `index.html`: ```nginx location / { try_files $uri $uri/ /index.html; } ``` ## Troubleshooting ### Common Issues **API connection failed** ``` - Check VITE_BASE_URL in .env file - Ensure API server is running - Check for CORS errors in browser console - Verify network connectivity ``` **Login not working** ``` - Clear localStorage and try again - Check browser console for errors - Verify API is returning valid JWT ``` **Images not loading** ``` - Check API /images endpoint is accessible - Verify tank images exist in API volume - Check browser network tab for 404s ``` **Build fails** ``` - Delete node_modules and reinstall: rm -rf node_modules && npm install - Clear Vite cache: rm -rf .vite - Check Node.js version (18+ required) ``` ### Browser Support - Chrome 90+ - Firefox 88+ - Safari 14+ - Edge 90+ ## Security Notes - JWT tokens stored in localStorage (ensure HTTPS in production) - All API calls go through authenticated endpoints - Credit card data never stored locally (handled by Authorize.net) - Image uploads validated on server side --- **Auburn Oil Customer Gateway** - Empowering customers with self-service convenience. For API documentation, see `/api/README.md`