import React, { useState, useEffect, useCallback } from 'react'; import { performanceService } from '../services/performanceService.ts'; const PerformanceDebug: React.FC = () => { const [isOpen, setIsOpen] = useState(false); const [metrics, setMetrics] = useState(() => performanceService.getMetrics()); const [apiTimings, setApiTimings] = useState(() => performanceService.getApiTimings()); const [componentTimings, setComponentTimings] = useState(() => performanceService.getComponentTimings() ); const refreshMetrics = useCallback(() => { setMetrics(performanceService.getMetrics()); setApiTimings(performanceService.getApiTimings()); setComponentTimings(performanceService.getComponentTimings()); }, []); useEffect(() => { if (!isOpen) return undefined; refreshMetrics(); // Refresh immediately on open const interval = setInterval(refreshMetrics, 2000); return () => clearInterval(interval); }, [isOpen, refreshMetrics]); const formatMs = (value: number | null) => (value === null ? 'N/A' : `${Math.round(value)} ms`); const formatCls = (value: number | null) => (value === null ? 'N/A' : value.toFixed(4)); if (!isOpen) { return ( ); } return (

Performance Debug

Core Web Vitals & Loading

  • Page Load Time:{' '} {formatMs(metrics.pageLoad)}
  • Time to First Byte (TTFB):{' '} {formatMs(metrics.ttfb)}
  • First Contentful Paint (FCP):{' '} {formatMs(metrics.fcp)}
  • Largest Contentful Paint (LCP):{' '} {formatMs(metrics.lcp)}
  • First Input Delay (FID):{' '} {formatMs(metrics.fid)}
  • Cumulative Layout Shift (CLS):{' '} {formatCls(metrics.cls)}

Component Mount Timings

    {componentTimings.length > 0 ? ( componentTimings.map((timing) => (
  • {timing.name}: {formatMs(timing.duration)}
  • )) ) : (
  • No components timed yet.
  • )}

API Timings (Last 10)

    {apiTimings.length > 0 ? ( apiTimings.map((timing) => (
  • {timing.name}: {formatMs(timing.duration)}
  • )) ) : (
  • No API calls recorded yet.
  • )}
); }; export default PerformanceDebug;