{"version":3,"file":"useRenderMetrics.mjs","sources":["../../../../src/lib/performance/hooks/useRenderMetrics.ts"],"sourcesContent":["/**\n * @file useRenderMetrics Hook\n * @description React hook for component render performance tracking.\n *\n * Provides components with render time measurement capabilities,\n * re-render detection, and performance optimization insights.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const {\n *     renderCount,\n *     lastRenderTime,\n *     averageRenderTime,\n *     isSlowRender,\n *     trackRender\n *   } = useRenderMetrics('MyComponent');\n *\n *   // Track this render\n *   const endRender = trackRender();\n *   useEffect(() => endRender(), []);\n *\n *   if (isSlowRender) {\n *     console.warn('Slow render detected');\n *   }\n *\n *   return <div>Renders: {renderCount}</div>;\n * }\n * ```\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n  getRenderTracker,\n  type RenderTracker,\n  type RenderEntry,\n  type ComponentRenderStats,\n  type RenderPhase,\n  type RenderReason,\n} from '../render-tracker';\nimport { RENDER_CONFIG } from '../../../config/performance.config';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Render metrics for a component\n */\nexport interface RenderMetrics {\n  /** Total render count */\n  readonly renderCount: number;\n  /** Last render duration (ms) */\n  readonly lastRenderTime: number;\n  /** Average render time (ms) */\n  readonly averageRenderTime: number;\n  /** Minimum render time (ms) */\n  readonly minRenderTime: number;\n  /** Maximum render time (ms) */\n  readonly maxRenderTime: number;\n  /** 95th percentile render time */\n  readonly p95RenderTime: number;\n  /** Whether last render was slow */\n  readonly isSlowRender: boolean;\n  /** Number of wasted renders */\n  readonly wastedRenders: number;\n  /** Wasted render percentage */\n  readonly wastedRenderRate: number;\n  /** Render reasons breakdown */\n  readonly renderReasons: Record<RenderReason, number>;\n  /** Total render time (ms) */\n  readonly totalRenderTime: number;\n}\n\n/**\n * Hook options\n */\nexport interface UseRenderMetricsOptions {\n  /** Slow render threshold (ms) */\n  readonly slowThreshold?: number;\n  /** Enable automatic tracking */\n  readonly autoTrack?: boolean;\n  /** Track props changes */\n  readonly trackProps?: boolean;\n  /** Track state changes */\n  readonly trackState?: boolean;\n  /** Callback on slow render */\n  readonly onSlowRender?: (entry: RenderEntry) => void;\n  /** Callback on wasted render */\n  readonly onWastedRender?: (entry: RenderEntry) => void;\n  /** Enable debug logging */\n  readonly debug?: boolean;\n}\n\n/**\n * Hook return value\n */\nexport interface UseRenderMetricsReturn {\n  /** Current render metrics */\n  readonly metrics: RenderMetrics;\n  /** Total render count */\n  readonly renderCount: number;\n  /** Last render duration */\n  readonly lastRenderTime: number;\n  /** Average render time */\n  readonly averageRenderTime: number;\n  /** Whether currently slow */\n  readonly isSlowRender: boolean;\n  /** Start tracking a render (returns stop function) */\n  readonly trackRender: (phase?: RenderPhase) => () => void;\n  /** Start tracking an interaction */\n  readonly trackInteraction: (name: string) => () => void;\n  /** Get full component stats */\n  readonly getStats: () => ComponentRenderStats | null;\n  /** Mark render as wasted */\n  readonly markWastedRender: () => void;\n  /** Reset metrics */\n  readonly reset: () => void;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for component render metrics\n */\nexport function useRenderMetrics(\n  componentName: string,\n  options: UseRenderMetricsOptions = {}\n): UseRenderMetricsReturn {\n  const {\n    slowThreshold = RENDER_CONFIG.slowComponentThreshold,\n    autoTrack = false,\n    trackProps = false,\n    trackState = false,\n    onSlowRender,\n    onWastedRender,\n    debug = false,\n  } = options;\n\n  // Get tracker instance\n  const trackerRef = useRef<RenderTracker | null>(null);\n  trackerRef.current ??= getRenderTracker({\n    slowThreshold,\n    debug,\n    onSlowRender: (entry) => {\n      if (entry.componentName === componentName) {\n        onSlowRender?.(entry);\n      }\n    },\n    onWastedRender: (entry) => {\n      if (entry.componentName === componentName) {\n        onWastedRender?.(entry);\n      }\n    },\n  });\n\n  const tracker = trackerRef.current;\n\n  // Component instance ID (stable across renders)\n  const componentIdRef = useRef<string>('');\n  if (componentIdRef.current === '') {\n    componentIdRef.current = `${componentName}_${Math.random().toString(36).substr(2, 6)}`;\n  }\n\n  // Track render count\n  const renderCountRef = useRef(0);\n\n  // State for metrics\n  const [metrics, setMetrics] = useState<RenderMetrics>(() => ({\n    renderCount: 0,\n    lastRenderTime: 0,\n    averageRenderTime: 0,\n    minRenderTime: 0,\n    maxRenderTime: 0,\n    p95RenderTime: 0,\n    isSlowRender: false,\n    wastedRenders: 0,\n    wastedRenderRate: 0,\n    renderReasons: {\n      initial: 0,\n      'props-change': 0,\n      'state-change': 0,\n      'context-change': 0,\n      'parent-render': 0,\n      'hooks-change': 0,\n      'force-update': 0,\n      unknown: 0,\n    },\n    totalRenderTime: 0,\n  }));\n\n  // Track props for change detection\n  const prevPropsRef = useRef<Record<string, unknown> | undefined>(undefined);\n  const prevStateRef = useRef<Record<string, unknown> | undefined>(undefined);\n\n  // Update metrics from tracker\n  const updateMetrics = useCallback(() => {\n    const stats = tracker.getComponentStats(componentName);\n    if (stats) {\n      setMetrics({\n        renderCount: stats.totalRenders,\n        lastRenderTime: stats.lastRenderTime,\n        averageRenderTime: stats.averageRenderTime,\n        minRenderTime: stats.minRenderTime,\n        maxRenderTime: stats.maxRenderTime,\n        p95RenderTime: stats.p95RenderTime,\n        isSlowRender: stats.isSlowComponent,\n        wastedRenders: stats.wastedRenders,\n        wastedRenderRate: stats.wastedRenderRate,\n        renderReasons: stats.rendersByReason,\n        totalRenderTime: stats.totalRenderTime,\n      });\n    }\n  }, [tracker, componentName]);\n\n  // Auto-track renders\n  useEffect(() => {\n    renderCountRef.current++;\n\n    if (autoTrack) {\n      const stopTracking = tracker.startRender(componentName, {\n        componentId: componentIdRef.current,\n        isInitial: renderCountRef.current === 1,\n        props: trackProps ? prevPropsRef.current : undefined,\n        state: trackState ? prevStateRef.current : undefined,\n      });\n\n      // Stop tracking after render is complete\n      const timeoutId = setTimeout(() => {\n        stopTracking();\n        updateMetrics();\n      }, 0);\n\n      return () => {\n        clearTimeout(timeoutId);\n      };\n    }\n    \n    return undefined;\n  });\n\n  // Manual track render\n  const trackRender = useCallback(\n    (phase: RenderPhase = 'render') => {\n      const stopTracking = tracker.startRender(componentName, {\n        componentId: componentIdRef.current,\n        phase,\n        isInitial: renderCountRef.current === 1,\n        props: trackProps ? prevPropsRef.current : undefined,\n        state: trackState ? prevStateRef.current : undefined,\n      });\n\n      return () => {\n        stopTracking();\n        updateMetrics();\n      };\n    },\n    [tracker, componentName, trackProps, trackState, updateMetrics]\n  );\n\n  // Track interaction\n  const trackInteraction = useCallback(\n    (name: string) => {\n      return tracker.startInteraction(name);\n    },\n    [tracker]\n  );\n\n  // Get full stats\n  const getStats = useCallback((): ComponentRenderStats | null => {\n    return tracker.getComponentStats(componentName);\n  }, [tracker, componentName]);\n\n  // Mark wasted render (manual)\n  const markWastedRender = useCallback(() => {\n    // This is a placeholder - in a real implementation,\n    // we'd need to update the last render entry\n    if (debug) {\n      console.info(`[useRenderMetrics] Wasted render marked for ${componentName}`);\n    }\n  }, [componentName, debug]);\n\n  // Reset metrics\n  const reset = useCallback(() => {\n    setMetrics({\n      renderCount: 0,\n      lastRenderTime: 0,\n      averageRenderTime: 0,\n      minRenderTime: 0,\n      maxRenderTime: 0,\n      p95RenderTime: 0,\n      isSlowRender: false,\n      wastedRenders: 0,\n      wastedRenderRate: 0,\n      renderReasons: {\n        initial: 0,\n        'props-change': 0,\n        'state-change': 0,\n        'context-change': 0,\n        'parent-render': 0,\n        'hooks-change': 0,\n        'force-update': 0,\n        unknown: 0,\n      },\n      totalRenderTime: 0,\n    });\n    renderCountRef.current = 0;\n  }, []);\n\n  return {\n    metrics,\n    renderCount: metrics.renderCount,\n    lastRenderTime: metrics.lastRenderTime,\n    averageRenderTime: metrics.averageRenderTime,\n    isSlowRender: metrics.isSlowRender,\n    trackRender,\n    trackInteraction,\n    getStats,\n    markWastedRender,\n    reset,\n  };\n}\n\n// ============================================================================\n// Utility Hooks\n// ============================================================================\n\n/**\n * Hook to measure a specific render phase\n */\nexport function useRenderPhaseMetrics(\n  componentName: string,\n  phase: RenderPhase\n): {\n  duration: number;\n  measure: () => () => void;\n} {\n  const [duration, setDuration] = useState(0);\n  const tracker = getRenderTracker();\n\n  const measure = useCallback(() => {\n    const stop = tracker.startRender(componentName, { phase });\n    return () => {\n      const entry = stop();\n      if (entry) {\n        setDuration(entry.duration);\n      }\n    };\n  }, [tracker, componentName, phase]);\n\n  return { duration, measure };\n}\n\n/**\n * Hook for render profiling during development\n */\nexport function useRenderProfiler(\n  componentName: string\n): {\n  onRender: (\n    id: string,\n    phase: 'mount' | 'update',\n    actualDuration: number,\n    baseDuration: number,\n    startTime: number,\n    commitTime: number\n  ) => void;\n  getReport: () => string;\n} {\n  const tracker = getRenderTracker();\n  const durationsRef = useRef<number[]>([]);\n\n  const onRender = useCallback(\n    (\n      _id: string,\n      phase: 'mount' | 'update',\n      actualDuration: number,\n      _baseDuration: number,\n      _startTime: number,\n      _commitTime: number\n    ) => {\n      durationsRef.current.push(actualDuration);\n\n      // Track in our system\n      const stop = tracker.startRender(componentName, {\n        isInitial: phase === 'mount',\n      });\n      stop();\n    },\n    [tracker, componentName]\n  );\n\n  const getReport = useCallback(() => {\n    const durations = durationsRef.current;\n    if (durations.length === 0) return 'No renders recorded';\n\n    const sorted = [...durations].sort((a, b) => a - b);\n    const avg = durations.reduce((a, b) => a + b, 0) / durations.length;\n    const p50 = sorted[Math.floor(sorted.length * 0.5)];\n    const p95 = sorted[Math.floor(sorted.length * 0.95)];\n\n    return [\n      `Component: ${componentName}`,\n      `Renders: ${durations.length}`,\n      `Average: ${avg.toFixed(2)}ms`,\n      `P50: ${p50?.toFixed(2) ?? 'N/A'}ms`,\n      `P95: ${p95?.toFixed(2) ?? 'N/A'}ms`,\n      `Min: ${sorted[0]?.toFixed(2) ?? 'N/A'}ms`,\n      `Max: ${sorted[sorted.length - 1]?.toFixed(2) ?? 'N/A'}ms`,\n    ].join('\\n');\n  }, [componentName]);\n\n  return { onRender, getReport };\n}\n\n/**\n * Hook to detect unnecessary re-renders\n */\nexport function useWastedRenderDetector(\n  componentName: string,\n  deps: unknown[]\n): {\n  wasWasted: boolean;\n  reason: string | null;\n} {\n  const prevDepsRef = useRef<unknown[] | null>(null);\n  const [wasWasted, setWasWasted] = useState(false);\n  const [reason, setReason] = useState<string | null>(null);\n\n  useEffect(() => {\n    if (prevDepsRef.current === null) {\n      prevDepsRef.current = deps;\n      return;\n    }\n\n    // Check if any deps actually changed\n    const changed: number[] = [];\n    const prevDeps = prevDepsRef.current;\n    deps.forEach((dep, i) => {\n      if (prevDeps !== null && dep !== prevDeps[i]) {\n        changed.push(i);\n      }\n    });\n\n    queueMicrotask(() => {\n      if (changed.length === 0) {\n        setWasWasted(true);\n        setReason(`No dependencies changed for ${componentName}`);\n      } else {\n        setWasWasted(false);\n        setReason(null);\n      }\n    });\n\n    prevDepsRef.current = deps;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, deps);\n\n  return { wasWasted, reason };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n// Types are already exported at their declaration sites\n"],"names":["useRenderMetrics","componentName","options","slowThreshold","RENDER_CONFIG","autoTrack","trackProps","trackState","onSlowRender","onWastedRender","debug","trackerRef","useRef","getRenderTracker","entry","tracker","componentIdRef","renderCountRef","metrics","setMetrics","useState","prevPropsRef","prevStateRef","updateMetrics","useCallback","stats","useEffect","stopTracking","timeoutId","trackRender","phase","trackInteraction","name","getStats","markWastedRender","reset","useRenderPhaseMetrics","duration","setDuration","measure","stop","useRenderProfiler","durationsRef","onRender","_id","actualDuration","_baseDuration","_startTime","_commitTime","getReport","durations","sorted","a","b","avg","p50","p95","useWastedRenderDetector","deps","prevDepsRef","wasWasted","setWasWasted","reason","setReason","changed","prevDeps","dep","i"],"mappings":"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"}