import { useState } from "react"; import type { EngineStats, PublicConfig } from "../types"; import { Card } from "./Card"; import { control } from "../api"; import { clsx, pct } from "../format"; interface Props { stats: EngineStats; config: PublicConfig; } function Toggle({ label, on, onChange }: { label: string; on: boolean; onChange: (v: boolean) => void }): JSX.Element { return ( onChange(!on)} className="flex items-center justify-between gap-3 rounded-xl border border-ink-600/50 bg-ink-700/30 px-3 py-2 text-left text-sm transition hover:border-ink-500" > {label} ); } export function Controls({ stats, config }: Props): JSX.Element { const [threshold, setThreshold] = useState(config.minNetProfitPct); const paused = stats.circuit === "paused"; return ( {paused ? ( control.resume()} className="rounded-xl border border-profit/40 bg-profit/10 px-3 py-2 text-sm font-semibold text-profit transition hover:bg-profit/20" > Resume ) : ( control.pause()} className="rounded-xl border border-warn/40 bg-warn/10 px-3 py-2 text-sm font-semibold text-warn transition hover:bg-warn/20" > Pause )} control.reset()} className="rounded-xl border border-loss/40 bg-loss/10 px-3 py-2 text-sm font-semibold text-loss transition hover:bg-loss/20" > Reset control.setDemo(v)} /> Min net edge {pct(threshold)} { const v = Number(e.target.value); setThreshold(v); control.setThreshold(v); }} className="w-full accent-accent" /> Taker fees K {pct(config.takerFees.kraken, 2)} · By {pct(config.takerFees.bybit, 2)} · O {pct(config.takerFees.okx, 2)} · Bn {pct(config.takerFees.binance, 2)} Stale / confirm {config.staleMs}ms / {config.flickerConfirmMs}ms ); }