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;