import { Checkbox } from '../ui/checkbox'; import { PACKET_LEGEND_ITEMS } from '../../utils/visualizerUtils'; import { NODE_LEGEND_ITEMS } from './shared'; interface VisualizerControlsProps { showControls: boolean; setShowControls: (value: boolean) => void; fullScreen?: boolean; onFullScreenChange?: (fullScreen: boolean) => void; showAmbiguousPaths: boolean; setShowAmbiguousPaths: (value: boolean) => void; showAmbiguousNodes: boolean; setShowAmbiguousNodes: (value: boolean) => void; useAdvertPathHints: boolean; setUseAdvertPathHints: (value: boolean) => void; splitAmbiguousByTraffic: boolean; setSplitAmbiguousByTraffic: (value: boolean) => void; observationWindowSec: number; setObservationWindowSec: (value: number) => void; pruneStaleNodes: boolean; setPruneStaleNodes: (value: boolean) => void; pruneStaleMinutes: number; setPruneStaleMinutes: (value: number) => void; letEmDrift: boolean; setLetEmDrift: (value: boolean) => void; autoOrbit: boolean; setAutoOrbit: (value: boolean) => void; chargeStrength: number; setChargeStrength: (value: number) => void; particleSpeedMultiplier: number; setParticleSpeedMultiplier: (value: number) => void; nodeCount: number; linkCount: number; onExpandContract: () => void; onClearAndReset: () => void; } export function VisualizerControls({ showControls, setShowControls, fullScreen, onFullScreenChange, showAmbiguousPaths, setShowAmbiguousPaths, showAmbiguousNodes, setShowAmbiguousNodes, useAdvertPathHints, setUseAdvertPathHints, splitAmbiguousByTraffic, setSplitAmbiguousByTraffic, observationWindowSec, setObservationWindowSec, pruneStaleNodes, setPruneStaleNodes, pruneStaleMinutes, setPruneStaleMinutes, letEmDrift, setLetEmDrift, autoOrbit, setAutoOrbit, chargeStrength, setChargeStrength, particleSpeedMultiplier, setParticleSpeedMultiplier, nodeCount, linkCount, onExpandContract, onClearAndReset, }: VisualizerControlsProps) { return ( <> {showControls && (
Packets
{PACKET_LEGEND_ITEMS.map((item) => (
{item.label}
{item.description}
))}
Nodes
{NODE_LEGEND_ITEMS.map((item) => (
{item.label}
))}
)}
{onFullScreenChange && ( )}
{showControls && ( <>
setObservationWindowSec( Math.max(1, Math.min(60, parseInt(e.target.value, 10) || 1)) ) } className="w-12 px-1 py-0.5 bg-background border border-border rounded text-xs text-center" /> sec
{pruneStaleNodes && (
{ const v = parseInt(e.target.value, 10); if (!isNaN(v) && v >= 1 && v <= 60) setPruneStaleMinutes(v); }} className="w-14 rounded border border-border bg-background px-2 py-0.5 text-sm" />
)}
setChargeStrength(-parseInt(e.target.value, 10))} className="w-full h-2 bg-border rounded-lg appearance-none cursor-pointer accent-primary" />
setParticleSpeedMultiplier(parseFloat(e.target.value))} className="w-full h-2 bg-border rounded-lg appearance-none cursor-pointer accent-primary" />
Nodes: {nodeCount}
Links: {linkCount}
)}
); }