diff --git a/frontend/package.json b/frontend/package.json index c41455c..448b7a5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,6 +20,7 @@ "cors": "^2.8.5", "date-fns": "^2.30.0", "express": "^4.18.2", + "http-proxy-middleware": "^2.0.6", "lucide-react": "^0.294.0", "react": "^18.2.0", "react-chartjs-2": "^5.2.0", @@ -41,6 +42,6 @@ "vite": "^7.1.5" }, "overrides": { - "esbuild": "^0.24.4" + "esbuild": "^0.25.10" } } diff --git a/frontend/server.js b/frontend/server.js index 106d9aa..be0a539 100644 --- a/frontend/server.js +++ b/frontend/server.js @@ -2,12 +2,14 @@ import express from 'express'; import path from 'path'; import cors from 'cors'; import { fileURLToPath } from 'url'; +import { createProxyMiddleware } from 'http-proxy-middleware'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const app = express(); const PORT = process.env.PORT || 3000; +const BACKEND_URL = process.env.BACKEND_URL || 'http://backend:3001'; // Enable CORS for API calls app.use(cors({ @@ -15,6 +17,20 @@ app.use(cors({ credentials: true })); +// Proxy API requests to backend +app.use('/api', createProxyMiddleware({ + target: BACKEND_URL, + changeOrigin: true, + logLevel: 'info', + onError: (err, req, res) => { + console.error('Proxy error:', err.message); + res.status(500).json({ error: 'Backend service unavailable' }); + }, + onProxyReq: (proxyReq, req, res) => { + console.log(`Proxying ${req.method} ${req.path} to ${BACKEND_URL}`); + } +})); + // Serve static files from dist directory app.use(express.static(path.join(__dirname, 'dist'))); diff --git a/frontend/src/pages/Login.jsx b/frontend/src/pages/Login.jsx index 0413bc6..ebffa4a 100644 --- a/frontend/src/pages/Login.jsx +++ b/frontend/src/pages/Login.jsx @@ -1,12 +1,14 @@ import React, { useState } from 'react' import { useNavigate } from 'react-router-dom' -import { Eye, EyeOff, Lock, User, AlertCircle, Smartphone, ArrowLeft } from 'lucide-react' +import { Eye, EyeOff, Lock, User, AlertCircle, Smartphone, ArrowLeft, Mail } from 'lucide-react' import { useAuth } from '../contexts/AuthContext' import { authAPI } from '../utils/api' const Login = () => { + const [isSignupMode, setIsSignupMode] = useState(false) const [formData, setFormData] = useState({ username: '', + email: '', password: '' }) const [tfaData, setTfaData] = useState({ @@ -49,6 +51,36 @@ const Login = () => { } } + const handleSignupSubmit = async (e) => { + e.preventDefault() + setIsLoading(true) + setError('') + + try { + const response = await authAPI.signup(formData.username, formData.email, formData.password) + + if (response.data && response.data.token) { + // Store token and user data + localStorage.setItem('token', response.data.token) + localStorage.setItem('user', JSON.stringify(response.data.user)) + + // Redirect to dashboard + navigate('/') + } else { + setError('Signup failed - invalid response') + } + } catch (err) { + console.error('Signup error:', err) + const errorMessage = err.response?.data?.error || + (err.response?.data?.errors && err.response.data.errors.length > 0 + ? err.response.data.errors.map(e => e.msg).join(', ') + : err.message || 'Signup failed') + setError(errorMessage) + } finally { + setIsLoading(false) + } + } + const handleTfaSubmit = async (e) => { e.preventDefault() setIsLoading(true) @@ -102,6 +134,16 @@ const Login = () => { setError('') } + const toggleMode = () => { + setIsSignupMode(!isSignupMode) + setFormData({ + username: '', + email: '', + password: '' + }) + setError('') + } + return (
Monitor and manage your Linux package updates @@ -118,11 +160,11 @@ const Login = () => {