import React, { useEffect, useState } from "react"; import { Table, Typography, Spin, Message, Card, Empty, Badge, } from "@arco-design/web-react"; import { IconArrowRise, IconArrowFall } from "@arco-design/web-react/icon"; import "@arco-design/web-react/dist/css/arco.css"; import API_BASE_URL from "../config"; const columns = (bids) => [ { title: "Timestamp", dataIndex: "timestamp", sorter: (a, b) => new Date(a.timestamp) - new Date(b.timestamp), render: (val) => new Date(val).toLocaleString(), width: 180, }, { title: "Quantity (MW)", dataIndex: "quantity", sorter: (a, b) => a.quantity - b.quantity, render: (val) => val.toFixed(2), width: 180, }, { title: "Price ($/MWh)", dataIndex: "price", sorter: (a, b) => a.price - b.price, render: (val) => `$${val.toFixed(2)}`, width: 180, }, { title: "Status", dataIndex: "status", sorter: (a, b) => a.status.localeCompare(b.status), filters: [ { text: "Submitted", value: "Submitted" }, { text: "Success", value: "Success" }, { text: "Fail", value: "Fail" }, ], onFilter: (value, record) => record.status === value, render: (val) => ( ), width: 180, }, { title: "PnL", dataIndex: "pnl", sorter: (a, b) => (a.pnl || 0) - (b.pnl || 0), render: (val) => { if (val === null) return "N/A"; const isProfit = val >= 0; const color = isProfit ? "green" : "red"; return ( {isProfit ? : } {val.toFixed(2)} ); }, width: 180, }, { title: "Market", dataIndex: "market", sorter: (a, b) => a.market.localeCompare(b.market), filters: [ { text: "ISONE", value: "ISONE" }, { text: "NYISO", value: "NYISO" }, { text: "MISO", value: "MISO" }, ], onFilter: (value, record) => record.market === value, render: (val) => val, width: 180, }, ]; function BidsPage() { const [bids, setBids] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { fetch(`${API_BASE_URL}/bids/`) .then((res) => { if (!res.ok) throw new Error("Failed to fetch bids"); return res.json(); }) .then((json) => setBids(json)) .catch((err) => { console.error(err); Message.error("Failed to load bids."); }) .finally(() => setLoading(false)); }, []); return (
Your Submitted Bids {loading ? (
) : bids.length === 0 ? (
) : (
"table-row-hover"} /> )} ); } export default BidsPage;