import { Fragment, h, render } from 'preact' import { useCallback, useState } from 'preact/hooks' import useConnection from './hooks/useConnection' import PaneHeader from './layout/PaneHeader' import SplitPane from './layout/SplitPane' import ListPanel from './layout/ListPanel' import AuthOverlay from './components/AuthOverlay' import BlocksView from './components/BlocksView' import Profiler from './components/Profiler' import ReachabilityView from './components/ReachabilityView' import StateView from './components/StateView' import TraceDetail from './components/TraceDetail' import TraceEntry from './components/TraceEntry' const DETAIL_TABS = ['Details', 'Profiler', 'State', 'Blocks', 'Reachability'] as const function Panel() { const connection = useConnection() const selectedTrace = connection.traces[connection.selectedIndex] const [activeTab, setActiveTab] = useState(0) const handleDetailKeyDown = useCallback((event: KeyboardEvent) => { if (event.key === 'ArrowRight') { event.preventDefault() setActiveTab(prev => Math.min(prev + 1, DETAIL_TABS.length - 1)) } if (event.key === 'ArrowLeft') { event.preventDefault() setActiveTab(prev => Math.max(prev - 1, 0)) } }, []) return (
} /> {connection.traces.map((trace, index) => ( connection.selectTrace(index)} /> ))}
} second={
({ label, active: index === activeTab, onClick: () => setActiveTab(index), }))} right={{connection.statusText}} /> {activeTab === 0 && } {activeTab === 1 && } {activeTab === 2 && } {activeTab === 3 && } {activeTab === 4 && }
} />
{connection.auth && } ) } const applyTheme = (dark: boolean) => document.documentElement.classList.toggle('dark', dark) applyTheme(chrome.devtools.panels.themeName === 'dark') window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => applyTheme(e.matches)) render(, document.getElementById('root')!)