// Logs stream — live tailing feed const { useState: useLogsState, useEffect: useLogsEffect, useRef: useLogsRef } = React; function Logs({ logs, live }) { const [levelFilter, setLevelFilter] = useLogsState('all'); const [follow, setFollow] = useLogsState(true); const containerRef = useLogsRef(null); const visible = logs.filter(l => levelFilter === 'all' || l.lvl === levelFilter); useLogsEffect(() => { if (follow && containerRef.current) { containerRef.current.scrollTop = containerRef.current.scrollHeight; } }, [visible.length, follow]); return (
Level
{['all','I','W','E','D'].map(l => ( ))}
{visible.length} lines · {live ? 'tailing' : 'paused'}
{visible.map((l, i) => (
{window.fmtTs(l.ts)} {l.lvl === 'I' ? 'INFO' : l.lvl === 'W' ? 'WARN' : l.lvl === 'E' ? 'ERROR' : 'DEBUG'} {l.src} {l.node} {l.msg}
))}
); } Object.assign(window, { Logs });