diff --git a/app/paper/page.js b/app/paper/page.js new file mode 100644 index 0000000..18cddda --- /dev/null +++ b/app/paper/page.js @@ -0,0 +1,381 @@ +'use client'; +import { useState, useEffect } from 'react'; + +const GREEN = '#28CC95'; +const RED = '#FF6B6B'; +const BLUE = '#4A90D9'; + +export default function PaperDashboard() { + const [data, setData] = useState(null); + const [trades, setTrades] = useState({}); + const [loading, setLoading] = useState(true); + const [activeStrat, setActiveStrat] = useState(null); + + useEffect(() => { + const fetchState = async () => { + try { + const res = await fetch('/api/state'); + const json = await res.json(); + setData(json); + if (!activeStrat && json.strategies?.length) { + setActiveStrat(json.strategies[0].name); + } + setLoading(false); + } catch (e) { + console.error('State fetch error:', e); + } + }; + + fetchState(); + const interval = setInterval(fetchState, 2000); + return () => clearInterval(interval); + }, [activeStrat]); + + // Fetch trades for active strategy + useEffect(() => { + if (!activeStrat) return; + + const fetchTrades = async () => { + try { + const res = await fetch(`/api/trades?strategy=${encodeURIComponent(activeStrat)}`); + const json = await res.json(); + setTrades(prev => ({ ...prev, [activeStrat]: json.trades || [] })); + } catch (e) { + console.error('Trades fetch error:', e); + } + }; + + fetchTrades(); + const interval = setInterval(fetchTrades, 10000); + return () => clearInterval(interval); + }, [activeStrat]); + + if (loading) { + return ( +
No active market — waiting...
+15 min
+No trades yet. Strategy is watching...
+ ) : ( + trades.map((t, i) =>{label}
+{value}
+