Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 'use client' import { useCallback, useRef, useState } from 'react' export type LogLevel = 'info' | 'warn' | 'error' | 'success' export interface LogEntry { timestamp: number level: LogLevel message: string detail?: string } export interface UseTestLogReturn { entries: LogEntry[] log: (level: LogLevel, message: string, detail?: string) => void clear: () => void } export function useTestLog(maxEntries = 200): UseTestLogReturn { const [entries, setEntries] = useState<LogEntry[]>([]) const startRef = useRef(Date.now()) const log = useCallback( (level: LogLevel, message: string, detail?: string) => { setEntries((prev) => { const next = [...prev, { timestamp: Date.now() - startRef.current, level, message, detail }] return next.length > maxEntries ? next.slice(-maxEntries) : next }) }, [maxEntries] ) const clear = useCallback(() => { setEntries([]) startRef.current = Date.now() }, []) return { entries, log, clear } } |