import React, { useState, useEffect } from 'react'; import { Box, Grid, Paper, Typography, Card, CardContent, Chip, Divider, Alert, CircularProgress, LinearProgress, Tabs, Tab, Button } from '@mui/material'; import { TrendingUp as TrendingUpIcon, Analytics as AnalyticsIcon, ShowChart as ShowChartIcon, Assessment as AssessmentIcon, Visibility as VisibilityIcon, Timeline as TimelineIcon, AutoAwesome as AutoAwesomeIcon, Refresh as RefreshIcon } from '@mui/icons-material'; import { useContentPlanningStore } from '../../../stores/contentPlanningStore'; import { contentPlanningApi } from '../../../services/contentPlanningApi'; import EnhancedPerformanceVisualization from '../components/StrategyIntelligence/components/EnhancedPerformanceVisualization'; import TrendAnalysis from '../components/StrategyIntelligence/components/TrendAnalysis'; import DataTransparencyPanel from '../components/StrategyIntelligence/components/DataTransparencyPanel'; interface TabPanelProps { children?: React.ReactNode; index: number; value: number; } function TabPanel(props: TabPanelProps) { const { children, value, index, ...other } = props; return ( ); } const AnalyticsTab: React.FC = () => { const { currentStrategy, error: storeError } = useContentPlanningStore(); const [analyticsData, setAnalyticsData] = useState(null); const [dataLoading, setDataLoading] = useState(false); const [error, setError] = useState(null); const [activeTab, setActiveTab] = useState(0); // Cache for analytics data to prevent redundant calls const [lastLoadTime, setLastLoadTime] = useState(0); const CACHE_DURATION = 5 * 60 * 1000; // 5 minutes useEffect(() => { loadAnalyticsData(); }, []); const loadAnalyticsData = async () => { try { // Check if we have recent cached data to avoid redundant calls const now = Date.now(); if (analyticsData && (now - lastLoadTime) < CACHE_DURATION) { console.log('🎯 Using cached analytics data (cache valid for', Math.round((CACHE_DURATION - (now - lastLoadTime)) / 1000), 'seconds)'); return; } setDataLoading(true); setError(null); console.log('🎯 Loading analytics data...'); // Get strategy ID const strategyId = Number(currentStrategy?.id) || currentStrategy?.user_id || 1; // First, try to load from database (monitoring data) try { console.log('🎯 Fetching analytics data from database...'); const response = await fetch(`/api/content-planning/strategy/${strategyId}/analytics-data`); if (response.ok) { const result = await response.json(); const dbAnalyticsData = result.data; console.log('✅ Analytics data from database:', dbAnalyticsData); setAnalyticsData(dbAnalyticsData); setLastLoadTime(Date.now()); return; } else { console.warn('⚠️ Database fetch failed, trying cache...'); } } catch (dbError) { console.warn('⚠️ Database fetch error, trying cache:', dbError); } // Fallback to cached monitoring data const strategyAnalyticsData = localStorage.getItem('strategy_analytics_data'); const monitoringTasks = localStorage.getItem('strategy_monitoring_tasks'); console.log('🎯 Checking cached monitoring data...'); if (strategyAnalyticsData && monitoringTasks) { console.log('✅ Found cached monitoring data'); const cachedData = JSON.parse(strategyAnalyticsData); const tasks = JSON.parse(monitoringTasks); const analyticsData = { performance_trends: cachedData.monitoring_plan?.performance_metrics || {}, content_evolution: cachedData.monitoring_plan?.content_evolution || {}, engagement_patterns: cachedData.monitoring_plan?.engagement_patterns || {}, recommendations: cachedData.monitoring_plan?.recommendations || [], insights: cachedData.monitoring_plan?.insights || [], monitoring_data: cachedData, monitoring_tasks: tasks, _source: 'cached_monitoring' }; console.log('✅ Analytics Data from cache:', analyticsData); setAnalyticsData(analyticsData); setLastLoadTime(Date.now()); } else { // No data available console.log('⚠️ No monitoring data found in database or cache'); const emptyData = { performance_trends: {}, content_evolution: {}, engagement_patterns: {}, recommendations: [], insights: [], monitoring_data: null, monitoring_tasks: [], _source: 'empty' }; setAnalyticsData(emptyData); setLastLoadTime(Date.now()); setError('No monitoring data available. Please activate a strategy first.'); } } catch (error) { console.error('❌ Error loading analytics data:', error); setError('Failed to load analytics data. Please try again.'); } finally { setDataLoading(false); } }; const handleTabChange = (event: React.SyntheticEvent, newValue: number) => { setActiveTab(newValue); }; const handleRefresh = () => { console.log('🔄 Manual refresh requested'); setLastLoadTime(0); // Reset cache loadAnalyticsData(); }; const getPerformanceColor = (value: number) => { if (value >= 80) return 'success'; if (value >= 60) return 'warning'; return 'error'; }; // Get strategy ID for performance components const strategyId = Number(currentStrategy?.id) || currentStrategy?.user_id || 1; return ( Analytics Dashboard {(error || storeError) && ( {error || storeError} )} {/* Data Source Indicator */} {analyticsData && ( } > Data source: {analyticsData._source === 'database_monitoring' ? 'Monitoring database' : analyticsData._source === 'cached_monitoring' ? 'Local cache' : analyticsData._source === 'empty' ? 'No monitoring data available' : 'Unknown source'} )} {/* Tabs Navigation */} } iconPosition="start" /> } iconPosition="start" /> } iconPosition="start" /> {/* Performance Analytics Tab */} {/* Content Analytics Tab */} {dataLoading ? ( ) : ( {/* Performance Overview */} Performance Overview {analyticsData && analyticsData.performance_trends ? ( Engagement Rate {analyticsData.performance_trends.engagement_rate || 0}% Traffic Growth {analyticsData.performance_trends.traffic_growth || 0}% Conversion Rate {analyticsData.performance_trends.conversion_rate || 0}% Content Quality {analyticsData.performance_trends.content_quality_score || 0}/100 ) : ( No performance data available )} {/* AI Insights */} AI Insights {analyticsData && analyticsData.insights && analyticsData.insights.length > 0 ? ( {analyticsData.insights.slice(0, 3).map((insight: any, index: number) => ( {insight.title || `Insight ${index + 1}`} {insight.description || insight} ))} ) : ( No insights available )} {/* Content Evolution */} {analyticsData && analyticsData.content_evolution && ( Content Evolution {analyticsData.content_evolution.content_types ? ( {analyticsData.content_evolution.content_types.map((contentType: string, index: number) => { const performance = analyticsData.content_evolution.performance_by_type?.[contentType]; return ( {contentType.replace('_', ' ')} {performance && ( Growth +{performance.growth}% Engagement {performance.engagement}% )} ); })} ) : ( No content evolution data available )} )} {/* Performance Trends */} {analyticsData && analyticsData.performance_trends && ( Performance Trends {analyticsData.performance_trends.engagement_trend ? ( Engagement Trend (Last 5 periods) {analyticsData.performance_trends.engagement_trend.map((value: number, index: number) => ( {value}% Period {index + 1} ))} ) : ( No trend data available )} )} {/* Engagement Patterns */} {analyticsData && analyticsData.engagement_patterns && ( Engagement Patterns {analyticsData.engagement_patterns.peak_times && ( Peak Engagement Times {analyticsData.engagement_patterns.peak_times.map((time: string, index: number) => ( ))} )} {analyticsData.engagement_patterns.best_days && ( Best Performing Days {analyticsData.engagement_patterns.best_days.map((day: string, index: number) => ( ))} )} {analyticsData.engagement_patterns.audience_segments && ( Top Audience Segments {analyticsData.engagement_patterns.audience_segments.map((segment: string, index: number) => ( ))} )} )} {/* Recommendations */} {analyticsData && analyticsData.recommendations && analyticsData.recommendations.length > 0 && ( AI Recommendations {analyticsData.recommendations.map((recommendation: any, index: number) => ( {recommendation.title} {recommendation.description} ))} )} )} {/* Data Transparency Tab */} ); }; export default AnalyticsTab;