'use client'; import { useState, useEffect } from 'react'; interface TokenPrice { symbol: string; price: number; change24h: number; volume24h: number; marketCap?: number; } interface TradingBalance { totalValue: number; availableBalance: number; positions: TokenPrice[]; } export default function BitqueryDashboard() { const [balance, setBalance] = useState(null); const [prices, setPrices] = useState([]); const [status, setStatus] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [tradingSymbol, setTradingSymbol] = useState('SOL'); const [tradeAmount, setTradeAmount] = useState('1'); const [tradeSide, setTradeSide] = useState<'BUY' | 'SELL'>('BUY'); const [tradeLoading, setTradeLoading] = useState(false); const [tradeResult, setTradeResult] = useState(null); useEffect(() => { fetchData(); const interval = setInterval(fetchData, 30000); // Refresh every 30 seconds return () => clearInterval(interval); }, []); const fetchData = async () => { try { setLoading(true); setError(null); // Fetch balance const balanceResponse = await fetch('/api/balance'); const balanceData = await balanceResponse.json(); if (balanceData.success) { setBalance(balanceData.data); } // Fetch prices const pricesResponse = await fetch('/api/prices'); const pricesData = await pricesResponse.json(); if (pricesData.success) { setPrices(pricesData.data); } // Fetch status const statusResponse = await fetch('/api/status'); const statusData = await statusResponse.json(); if (statusData.success) { setStatus(statusData.data); } } catch (err: any) { setError(err.message || 'Failed to fetch data'); } finally { setLoading(false); } }; if (loading && !balance) { return (

Bitquery Trading Dashboard

Loading...
); } if (error) { return (

Bitquery Trading Dashboard

Error: {error}
); } return (

Bitquery Trading Dashboard

{/* Service Status */} {status && (

Service Status

Bitquery: {status.bitquery?.connected ? 'Connected' : 'Disconnected'}
API Key: {status.bitquery?.apiKey ? 'Configured' : 'Missing'}
{status.bitquery?.error && (
Error: {status.bitquery.error}
)}
)} {/* Balance Overview */} {balance && (

Portfolio Balance

Total Value
${balance.totalValue.toFixed(2)}
Available Balance
${balance.availableBalance.toFixed(2)}
)} {/* Token Prices */}

Token Prices

{prices.map((token) => (
{token.symbol} = 0 ? 'text-green-400' : 'text-red-400'}`}> {token.change24h >= 0 ? '+' : ''}{token.change24h.toFixed(2)}%
${token.price.toFixed(2)}
Vol: ${token.volume24h.toLocaleString()}
{token.marketCap && (
Cap: ${(token.marketCap / 1e9).toFixed(2)}B
)}
))}
{/* Refresh Button */}
); }