import type { LogRow, TraderDetail } from "./api"; import { getTrader, getTraderLogs } from "./api"; import { PortfolioChart } from "./chart"; import { LogView } from "./log"; import { TransactionsView } from "./transactions"; interface ChartPoint { t: number; value: number; } function toUnixSeconds(stamp: string): number { return new Date(stamp.replace(" ", "T")).getTime() / 1000; } const MODAL_LOG_LIMIT = 500; let currentModal: HTMLElement | null = null; function buildModalContent(name: string, detail: TraderDetail, logs: LogRow[]): HTMLElement { const card = document.createElement("div"); card.className = "modal-card"; card.innerHTML = ` `; const chartHost = card.querySelector(".modal-chart") as HTMLElement; const logHost = card.querySelector(".modal-log") as HTMLElement; const txnHost = card.querySelector(".modal-txns") as HTMLElement; const chart = new PortfolioChart(chartHost); const points: ChartPoint[] = detail.time_series.map((p) => ({ t: toUnixSeconds(p.datetime), value: p.value, })); chart.update(points); const logView = new LogView(logHost); logView.render(logs); const txnView = new TransactionsView(txnHost, 500); txnView.render(detail.transactions); card.querySelector(".modal-close")!.addEventListener("click", closeTraderModal); return card; } export function openTraderModal(name: string): void { const root = document.getElementById("modal-root"); if (!root) return; if (currentModal) { closeTraderModal(); } const backdrop = document.createElement("div"); backdrop.className = "modal-backdrop"; backdrop.addEventListener("click", (e) => { if (e.target === backdrop) closeTraderModal(); }); const loading = document.createElement("div"); loading.className = "modal-card modal-loading"; loading.textContent = "Loading..."; backdrop.append(loading); root.append(backdrop); root.classList.add("open"); Promise.all([getTrader(name), getTraderLogs(name, MODAL_LOG_LIMIT)]) .then(([detail, logs]) => { const card = buildModalContent(name, detail, logs); backdrop.innerHTML = ""; backdrop.append(card); }) .catch((err) => { backdrop.innerHTML = ``; }); currentModal = backdrop; } export function closeTraderModal(): void { const root = document.getElementById("modal-root"); if (root) { root.classList.remove("open"); root.innerHTML = ""; } currentModal = null; } document.addEventListener("keydown", (e) => { if (e.key === "Escape") closeTraderModal(); });