'use client'; import { useState, useEffect } from 'react'; import { trackEvent } from '@/lib/analytics'; interface PerformanceData { timestamp: string; url: string; metrics: { LCP?: number; FID?: number; CLS?: number; FCP?: number; TTFB?: number; }; } export const PerformanceDashboard: React.FC = () => { const [performanceData, setPerformanceData] = useState([]); const [isVisible, setIsVisible] = useState(false); useEffect(() => { // This would typically fetch from your Umami instance or database // For now, we'll show a placeholder const mockData: PerformanceData[] = [ { timestamp: new Date().toISOString(), url: '/', metrics: { LCP: 1200, FID: 45, CLS: 0.1, FCP: 800, TTFB: 200, }, }, ]; setPerformanceData(mockData); }, []); const getPerformanceGrade = (metric: string, value: number): string => { switch (metric) { case 'LCP': return value <= 2500 ? 'Good' : value <= 4000 ? 'Needs Improvement' : 'Poor'; case 'FID': return value <= 100 ? 'Good' : value <= 300 ? 'Needs Improvement' : 'Poor'; case 'CLS': return value <= 0.1 ? 'Good' : value <= 0.25 ? 'Needs Improvement' : 'Poor'; case 'FCP': return value <= 1800 ? 'Good' : value <= 3000 ? 'Needs Improvement' : 'Poor'; case 'TTFB': return value <= 800 ? 'Good' : value <= 1800 ? 'Needs Improvement' : 'Poor'; default: return 'Unknown'; } }; const getGradeColor = (grade: string): string => { switch (grade) { case 'Good': return 'text-green-600 bg-green-100'; case 'Needs Improvement': return 'text-yellow-600 bg-yellow-100'; case 'Poor': return 'text-red-600 bg-red-100'; default: return 'text-gray-600 bg-gray-100'; } }; if (!isVisible) { return ( ); } return (

Performance Dashboard

{performanceData.map((data, index) => (
{new Date(data.timestamp).toLocaleString()}
{data.url}
{Object.entries(data.metrics).map(([metric, value]) => { const grade = getPerformanceGrade(metric, value); return (
{metric}:
{value}ms {grade}
); })}
))}
🟢 Good: Meets recommended thresholds
🟡 Needs Improvement: Below recommended thresholds
🔴 Poor: Significantly below thresholds
); };