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 (
Status
{automationStatus?.detailedStatus || 'Unknown'}
Next Action
{automationStatus?.nextAction || 'None'}
Total Cycles
{automationStatus?.totalCycles || 0}
Errors
{automationStatus?.consecutiveErrors || 0}
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}
Distance to SL
{positionData.stopLossProximity.distancePercent}%
Stop Loss Price
${positionData.stopLossProximity.stopLossPrice}
Current Price
${positionData.stopLossProximity.currentPrice}
{positionData.nextAction}
{positionData.recommendation}
Currently scanning for trading opportunities
Mode
Opportunity Scanning
Next Check
Every 10 minutes