import React, { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { AlertCircle, Eye, TrendingUp, TrendingDown, Activity, Clock } from 'lucide-react'; const PositionMonitoringDashboard = () => { const [positionData, setPositionData] = useState(null); const [automationStatus, setAutomationStatus] = useState(null); const [loading, setLoading] = useState(true); const [lastUpdate, setLastUpdate] = useState(null); const fetchPositionData = async () => { try { const response = await fetch('/api/automation/position-monitor'); const data = await response.json(); if (data.success) { setPositionData(data.monitor); setLastUpdate(new Date().toLocaleTimeString()); } } catch (error) { console.error('Failed to fetch position data:', error); } }; const fetchAutomationStatus = async () => { try { const response = await fetch('/api/automation/status'); const data = await response.json(); setAutomationStatus(data); setLoading(false); } catch (error) { console.error('Failed to fetch automation status:', error); setLoading(false); } }; useEffect(() => { fetchPositionData(); fetchAutomationStatus(); // Update every 10 seconds const interval = setInterval(() => { fetchPositionData(); fetchAutomationStatus(); }, 10000); return () => clearInterval(interval); }, []); const getRiskColor = (riskLevel) => { switch (riskLevel) { case 'CRITICAL': return 'bg-red-500 text-white'; case 'HIGH': return 'bg-orange-500 text-white'; case 'MEDIUM': return 'bg-yellow-500 text-black'; case 'LOW': return 'bg-green-500 text-white'; default: return 'bg-gray-500 text-white'; } }; const getAutomationModeColor = (mode) => { if (!automationStatus?.isActive) return 'bg-gray-500 text-white'; if (automationStatus?.positionMonitoringActive) return 'bg-blue-500 text-white'; return 'bg-green-500 text-white'; }; if (loading) { return (
Loading monitoring data...
); } return (
{/* Automation Status Header */} Position-Aware Automation
{automationStatus?.isActive ? ( automationStatus?.positionMonitoringActive ? 'MONITORING POSITION' : 'SCANNING OPPORTUNITIES' ) : 'STOPPED'} {lastUpdate && ( {lastUpdate} )}

Status

{automationStatus?.detailedStatus || 'Unknown'}

Next Action

{automationStatus?.nextAction || 'None'}

Total Cycles

{automationStatus?.totalCycles || 0}

Errors

{automationStatus?.consecutiveErrors || 0}

{/* Position Status */} {positionData?.hasPosition ? ( {positionData.position.side === 'LONG' ? : } Active Position: {positionData.position.symbol} {positionData.riskLevel} RISK

Side

{positionData.position.side}

Size

{positionData.position.size}

Entry Price

${positionData.position.entryPrice}

Unrealized PnL

= 0 ? 'text-green-600' : 'text-red-600'}`}> ${positionData.position.unrealizedPnl}

{/* Stop Loss Proximity Alert */} {positionData.stopLossProximity && (

Stop Loss Proximity Alert

Distance to SL

{positionData.stopLossProximity.distancePercent}%

Stop Loss Price

${positionData.stopLossProximity.stopLossPrice}

Current Price

${positionData.stopLossProximity.currentPrice}

)} {/* Next Action */}

What Will Happen Next?

{positionData.nextAction}

{positionData.recommendation}

) : ( No Active Positions

Currently scanning for trading opportunities

Mode

Opportunity Scanning

Next Check

Every 10 minutes

)} {/* Automation Controls */} Controls
); }; export default PositionMonitoringDashboard;