import React, { useState } from 'react'; import { AlertCircle, CheckCircle, Clock, Lock, Send } from 'lucide-react'; import axios from 'axios'; import './App.css'; interface AuthState { token: string | null; userId: string; isAuthenticated: boolean; } interface TransactionResponse { status: string; transaction_id: string; message: string; } interface Transaction { amount: number; merchant: string; description: string; timestamp: string; } interface Result { transaction_id: string; status: string; timestamp: string; } // Default to Docker API service name (will be overridden by environment variable if needed) const API_BASE_URL = 'http://api:8000'; const App: React.FC = () => { const [auth, setAuth] = useState({ token: null, userId: 'user_' + Math.random().toString(36).substr(2, 9), isAuthenticated: false, }); const [transaction, setTransaction] = useState({ amount: 100, merchant: 'Starbucks Coffee', description: 'Normal transaction', timestamp: new Date().toLocaleString(), }); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); // Generate JWT token const generateToken = async () => { try { setLoading(true); setError(null); const response = await axios.post(`${API_BASE_URL}/token`, null, { params: { user_id: auth.userId }, }); const newToken = response.data.access_token; setAuth({ ...auth, token: newToken, isAuthenticated: true, }); setSuccess(`Token generated for user: ${auth.userId}`); setTimeout(() => setSuccess(null), 3000); } catch (err) { setError('Failed to generate token. Is the API running on localhost:8000?'); console.error(err); } finally { setLoading(false); } }; // Submit transaction const submitTransaction = async () => { if (!auth.token) { setError('Please generate a token first'); return; } try { setLoading(true); setError(null); const response = await axios.post( `${API_BASE_URL}/transaction`, { amount: transaction.amount, merchant: transaction.merchant, description: transaction.description, }, { headers: { Authorization: `Bearer ${auth.token}`, 'Content-Type': 'application/json', }, } ); const result: Result = { transaction_id: response.data.transaction_id, status: response.data.status, timestamp: new Date().toLocaleString(), }; setResults([result, ...results]); setSuccess(`Transaction submitted: ${response.data.transaction_id.substring(0, 8)}...`); // Reset form setTransaction({ amount: 100, merchant: 'Starbucks Coffee', description: 'Normal transaction', timestamp: new Date().toLocaleString(), }); setTimeout(() => setSuccess(null), 5000); } catch (err: any) { const errorMsg = err.response?.data?.detail || 'Failed to submit transaction'; setError(errorMsg); console.error(err); } finally { setLoading(false); } }; // Preset scenarios const scenarios = [ { name: 'Normal Transaction', amount: 75.5, merchant: 'Starbucks Coffee', description: 'Regular coffee purchase', }, { name: 'Large Purchase', amount: 8500, merchant: 'unknown_offshore_merchant.biz', description: 'Suspicious large transaction', }, { name: 'Grocery Shopping', amount: 120, merchant: 'Target Retail', description: 'Weekly grocery shopping', }, { name: 'Online Shopping', amount: 299.99, merchant: 'Amazon.com', description: 'Online purchase', }, { name: 'Gas Station', amount: 45.2, merchant: 'Shell Gas Station', description: 'Fuel purchase', }, ]; const loadScenario = (scenario: typeof scenarios[0]) => { setTransaction({ amount: scenario.amount, merchant: scenario.merchant, description: scenario.description, timestamp: new Date().toLocaleString(), }); }; return (

🛡️ PayGuard Fraud Detection

Real-time transaction fraud analysis system

{/* Authentication Section */}

Authentication

setAuth({ ...auth, userId: e.target.value })} placeholder="user_id" disabled={auth.isAuthenticated} />
{auth.isAuthenticated && (

Token: {auth.token?.substring(0, 50)}...

✓ Authenticated

)}
{/* Transaction Section */}

Submit Transaction

{/* Preset Scenarios */}

Quick Scenarios:

{scenarios.map((scenario, idx) => ( ))}
{/* Transaction Form */}
setTransaction({ ...transaction, amount: parseFloat(e.target.value) }) } placeholder="Transaction amount" />
setTransaction({ ...transaction, merchant: e.target.value }) } placeholder="Merchant name" />
setTransaction({ ...transaction, description: e.target.value }) } placeholder="Transaction description" />
{/* Status Messages */} {error && (
{error}
)} {success && (
{success}
)} {/* Results Section */} {results.length > 0 && (

Transaction Results

{results.map((result, idx) => (

ID: {result.transaction_id.substring(0, 8)}...

Status: {result.status}

Submitted: {result.timestamp}

))}
)} {/* API Info */}

API Information

Base URL: {API_BASE_URL}

Status:{' '} {auth.isAuthenticated ? ( ✓ Connected ) : ( ✗ Not connected )}

Endpoints:

  • POST /token - Generate JWT token
  • POST /transaction - Submit transaction for fraud detection
  • GET /health - API health check
); }; export default App;