import { useState, useEffect } from 'react';
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { analytics } from '@/components/analytics/analytics-service';
import {
Users,
Activity,
TrendingUp,
AlertTriangle,
Clock,
MousePointer,
} from 'lucide-react';
import {
XAxis,
YAxis,
CartesianGrid,
Tooltip,
ResponsiveContainer,
BarChart,
Bar,
AreaChart,
Area,
} from 'recharts';
export function AnalyticsDashboard() {
const [data, setData] = useState(() => analytics.getAnalyticsData());
const [refreshKey, setRefreshKey] = useState(0);
// Refresh data periodically
useEffect(() => {
const interval = setInterval(() => {
setData(analytics.getAnalyticsData());
}, 30000); // Refresh every 30 seconds
return () => clearInterval(interval);
}, [refreshKey]);
const handleRefresh = () => {
setData(analytics.getAnalyticsData());
setRefreshKey((k) => k + 1);
};
return (
{/* Header */}
Analytics Dashboard
Usage metrics and performance insights
{/* Key Metrics */}
m.metric === 'page_load')?.avg || 0
).toFixed(0)}ms`}
icon={Clock}
description="Page load performance"
/>
{/* Tabs for detailed views */}
User Activity
Feature Adoption
Performance
Cost Predictions
Daily Active Users
User activity over the last 7 days
new Date(date).toLocaleDateString()} />
new Date(date as string).toLocaleDateString()}
/>
Popular Pages
Most visited pages
{data.pageViews.slice(0, 5).map((page) => (
{page.path}
{page.count} views
))}
Feature Adoption
Most used features
Performance Metrics
Application performance over time
{data.performanceMetrics.map((metric) => (
{metric.metric.replace('_', ' ')}
{metric.avg.toFixed(2)}ms
{metric.count} samples
Min: {metric.min.toFixed(0)}ms | Max: {metric.max.toFixed(0)}ms
))}
);
}
interface MetricCardProps {
title: string;
value: string | number;
icon: React.ElementType;
description?: string;
}
function MetricCard({ title, value, icon: Icon, description }: MetricCardProps) {
return (
{title}
{value}
{description && (
{description}
)}
);
}
interface CostPredictionsProps {
predictions: Array<{
month: number;
predicted: number;
confidenceLow: number;
confidenceHigh: number;
}>;
}
function CostPredictions({ predictions }: CostPredictionsProps) {
const [anomalies, setAnomalies] = useState>([]);
// Simple anomaly detection simulation
useEffect(() => {
const mockHistoricalData = [950, 980, 1020, 990, 1010, 1050, 1000, 1100, 1300, 1020];
const detected = analytics.detectAnomalies(mockHistoricalData);
setAnomalies(
detected.map((a) => ({
index: a.index,
cost: a.cost,
type: a.type,
}))
);
}, []);
return (
Cost Forecast
ML-based cost predictions for the next 3 months
({
month: `+${p.month}M`,
value: p.predicted,
low: p.confidenceLow,
high: p.confidenceHigh,
})),
]}
>
`$${v}`} />
`$${Number(v).toFixed(2)}`} />
Predicted cost
Confidence interval
{anomalies.length > 0 && (
Detected Anomalies
Unusual cost patterns detected in historical data
{anomalies.map((anomaly, i) => (
Cost {anomaly.type === 'spike' ? 'Spike' : 'Drop'} Detected
Day {anomaly.index + 1}: ${anomaly.cost.toFixed(2)}
))}
)}
);
}