import type { ReactNode } from 'react'; import type { DlobStats } from './useDlobStats'; import type { DlobDepthBandRow } from './useDlobDepthBands'; import type { DlobSlippageRow } from './useDlobSlippage'; import DlobDepthBandsPanel from './DlobDepthBandsPanel'; import DlobSlippageChart from './DlobSlippageChart'; import Button from '../../ui/Button'; function formatUsd(v: number | null | undefined): string { if (v == null || !Number.isFinite(v)) return '—'; if (v >= 1_000_000) return `$${(v / 1_000_000).toFixed(2)}M`; if (v >= 1000) return `$${(v / 1000).toFixed(0)}K`; if (v >= 1) return `$${v.toFixed(2)}`; return `$${v.toPrecision(4)}`; } function formatBps(v: number | null | undefined): string { if (v == null || !Number.isFinite(v)) return '—'; return `${v.toFixed(1)} bps`; } function formatPct(v: number | null | undefined): string { if (v == null || !Number.isFinite(v)) return '—'; return `${(v * 100).toFixed(0)}%`; } function statusLabel(connected: boolean, error: string | null): ReactNode { if (error) return {error}; return connected ? live : offline; } export default function DlobDashboard({ market, stats, statsConnected, statsError, depthBands, depthBandsConnected, depthBandsError, slippageRows, slippageConnected, slippageError, isFullscreen, onToggleFullscreen, }: { market: string; stats: DlobStats | null; statsConnected: boolean; statsError: string | null; depthBands: DlobDepthBandRow[]; depthBandsConnected: boolean; depthBandsError: string | null; slippageRows: DlobSlippageRow[]; slippageConnected: boolean; slippageError: string | null; isFullscreen?: boolean; onToggleFullscreen?: () => void; }) { const updatedAt = stats?.updatedAt || depthBands[0]?.updatedAt || slippageRows[0]?.updatedAt || null; return (
DLOB
{market} {updatedAt ? `updated ${updatedAt}` : '—'} {onToggleFullscreen ? ( ) : null}
stats {statusLabel(statsConnected, statsError)}
depth bands {statusLabel(depthBandsConnected, depthBandsError)}
slippage {statusLabel(slippageConnected, slippageError)}
Bid
{formatUsd(stats?.bestBid ?? null)}
Ask
{formatUsd(stats?.bestAsk ?? null)}
Mid
{formatUsd(stats?.mid ?? null)}
Spread
{formatBps(stats?.spreadBps ?? null)}
{formatUsd(stats?.spreadAbs ?? null)}
Depth (bid/ask)
{formatUsd(stats?.depthBidUsd ?? null)}{' '} / {formatUsd(stats?.depthAskUsd ?? null)}
Imbalance
{formatPct(stats?.imbalance ?? null)}
[-1..1]
Slippage (impact bps)
by size (USD)
{slippageRows.length ? (
) : (
No slippage rows yet.
)}
); }