import React, { useState, useEffect } from 'react'; import { motion } from 'framer-motion'; import { TrendingUp } from 'lucide-react'; interface LearningData { learningSystem: { enabled: boolean; learningActive?: boolean; activeDecisions?: number; message?: string; recommendation?: string; persistentStats?: { totalTrades: number; successRate: number; totalPnl: number; winRate: number; }; recentTrades?: Array<{ symbol: string; type: string; pnl: string; updatedAt: string; }>; systemHealth?: { totalDecisions: number; recentDecisions: number; lastActivity: string; }; report?: { summary?: { totalDecisions?: number; successRate?: number; systemConfidence?: number; }; insights?: { thresholds?: any; confidenceLevel?: number; }; recommendations?: Array<{ type: string; message: string; priority: string; } | string>; }; }; visibility?: { decisionTrackingActive?: boolean; learningDatabaseConnected?: boolean; aiEnhancementsActive?: boolean; lastUpdateTime?: string; }; automationStatus?: any; } const EnhancedAILearningPanel = () => { const [learningData, setLearningData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const fetchLearningStatus = async () => { try { setLoading(true); // Get both learning status and persistent data (regardless of automation status) const [learningResponse, statusResponse, persistentResponse] = await Promise.all([ fetch('/api/automation/learning-status'), fetch('/api/automation/status'), fetch('/api/learning/persistent-status') ]); const learningData = await learningResponse.json(); const statusData = await statusResponse.json(); const persistentData = await persistentResponse.json(); // Merge persistent data with current learning status const safeData = { learningSystem: { ...learningData.learningSystem, // Always include persistent statistics persistentStats: persistentData.success ? persistentData.statistics : null, recentTrades: persistentData.success ? persistentData.recentTrades : [], systemHealth: persistentData.success ? persistentData.systemHealth : null }, visibility: learningData.visibility || { decisionTrackingActive: false, learningDatabaseConnected: persistentData.success, aiEnhancementsActive: false, lastUpdateTime: new Date().toISOString() }, automationStatus: statusData }; setLearningData(safeData); setError(null); } catch (err) { console.error('Error fetching learning status:', err); setError(err instanceof Error ? err.message : 'Unknown error'); // Set default data structure on error setLearningData({ learningSystem: { enabled: false, message: 'Failed to fetch learning status', activeDecisions: 0 }, visibility: { decisionTrackingActive: false, learningDatabaseConnected: false, aiEnhancementsActive: false, lastUpdateTime: new Date().toISOString() }, automationStatus: null }); } finally { setLoading(false); } }; useEffect(() => { fetchLearningStatus(); // Refresh every 30 seconds const interval = setInterval(fetchLearningStatus, 30000); return () => clearInterval(interval); }, []); if (loading) { return (

🧠 AI Learning System

Loading learning status...
); } if (error) { return (

🧠 AI Learning System

Error: {error}
); } if (!learningData) { return null; } const { learningSystem, visibility } = learningData; // Safety check for learningSystem if (!learningSystem) { return (

🧠 AI Learning System

Loading learning system data...
); } const renderLearningStatus = () => { if (!learningSystem || !learningSystem.enabled) { return (
Learning System Not Active
{learningSystem?.message || 'The AI learning system is not currently integrated with the automation.'}
{learningSystem?.recommendation && (
💡 {learningSystem.recommendation}
)}
• Decision recording: Not active
• Learning database: Not connected
• AI enhancements: Not applied
); } return (
AI Learning Active
{learningSystem?.report && (
Total Decisions
{learningSystem.report.summary?.totalDecisions || 0}
Success Rate
{learningSystem.report.summary?.successRate || 0}%
Confidence
{learningSystem.report.summary?.systemConfidence || 0}%
)}
🔍 Learning Visibility
Decision Tracking
Database Connected
AI Enhancements
0 ? 'bg-blue-500' : 'bg-gray-500'}`}>
0 ? 'text-blue-400' : 'text-gray-400'}> Active Decisions ({learningSystem?.activeDecisions || 0})
{learningSystem?.report?.insights && (
🎯 Learning Insights
{learningSystem.report.insights.thresholds && (
Current Thresholds: {JSON.stringify(learningSystem.report.insights.thresholds)}
)} {learningSystem.report.insights.confidenceLevel && (
Confidence Level: {learningSystem.report.insights.confidenceLevel}%
)}
)} {learningSystem?.report?.recommendations && learningSystem.report.recommendations.length > 0 && (
💡 AI Recommendations
{learningSystem.report.recommendations.map((rec: any, index: number) => (
• {typeof rec === 'string' ? rec : rec.message || rec.type || 'No message'}
))}
)}
); }; return (

🧠 AI Learning System

{/* Trading Performance Section - Always show if we have persistent data */} {learningData?.learningSystem?.persistentStats && (

Trading Performance

{learningData.learningSystem.persistentStats.totalTrades}
Total Trades
{learningData.learningSystem.persistentStats.successRate?.toFixed(1)}%
Success Rate
= 0 ? 'text-green-400' : 'text-red-400' }`}> ${learningData.learningSystem.persistentStats.totalPnl?.toFixed(2)}
Total P&L
{learningData.learningSystem.persistentStats.winRate?.toFixed(0)}%
Win Rate
{/* Recent Trades */} {learningData.learningSystem.recentTrades && learningData.learningSystem.recentTrades.length > 0 && (
Recent Trades
{learningData.learningSystem.recentTrades.map((trade: any, index: number) => (
{trade.symbol} {trade.type?.toUpperCase()}
= 0 ? 'text-green-400' : 'text-red-400' }`}> ${parseFloat(trade.pnl).toFixed(2)}
{new Date(trade.updatedAt).toLocaleDateString()}
))}
)} {/* System Health */} {learningData.learningSystem.systemHealth && (
System Health
AI Decisions: {learningData.learningSystem.systemHealth.totalDecisions?.toLocaleString()}
Recent Activity: {learningData.learningSystem.systemHealth.recentDecisions} decisions
Last Updated: {new Date(learningData.learningSystem.systemHealth.lastActivity).toLocaleTimeString()}
)}
)} {renderLearningStatus()} {visibility?.lastUpdateTime && (
Last updated: {new Date(visibility.lastUpdateTime).toLocaleTimeString()}
)}
); }; export default EnhancedAILearningPanel;