bitburner-src/src/DevMenu/ui/StockMarket.tsx

122 lines
3.4 KiB
TypeScript
Raw Normal View History

2021-09-14 02:37:35 +02:00
import React, { useState } from "react";
2021-09-17 01:23:03 +02:00
import Accordion from "@mui/material/Accordion";
import AccordionSummary from "@mui/material/AccordionSummary";
import AccordionDetails from "@mui/material/AccordionDetails";
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
2021-09-14 02:37:35 +02:00
2021-10-01 02:06:40 +02:00
import Typography from "@mui/material/Typography";
2021-09-17 01:23:03 +02:00
import Button from "@mui/material/Button";
import TextField from "@mui/material/TextField";
2021-09-14 02:37:35 +02:00
import { Money } from "../../ui/React/Money";
2021-09-25 20:42:57 +02:00
import { dialogBoxCreate } from "../../ui/React/DialogBox";
2021-09-14 02:37:35 +02:00
import { StockMarket as SM } from "../../StockMarket/StockMarket";
import { Stock } from "../../StockMarket/Stock";
2021-09-14 04:27:43 +02:00
export function StockMarket(): React.ReactElement {
2021-09-14 02:37:35 +02:00
const [stockPrice, setStockPrice] = useState(0);
const [stockSymbol, setStockSymbol] = useState("");
function setStockPriceField(event: React.ChangeEvent<HTMLInputElement>): void {
setStockPrice(parseFloat(event.target.value));
}
function setStockSymbolField(event: React.ChangeEvent<HTMLInputElement>): void {
setStockSymbol(event.target.value);
}
function processStocks(sub: (arg0: Stock) => void): void {
const inputSymbols = stockSymbol.replace(/\s/g, "");
let match: (symbol: string) => boolean = (): boolean => {
return true;
};
if (inputSymbols !== "" && inputSymbols !== "all") {
match = function (symbol: string): boolean {
return inputSymbols.split(",").includes(symbol);
};
}
2022-01-16 01:45:03 +01:00
for (const name of Object.keys(SM)) {
if (Object.hasOwn(SM, name)) {
2021-09-14 02:37:35 +02:00
const stock = SM[name];
if (stock instanceof Stock && match(stock.symbol)) {
sub(stock);
}
}
}
}
function doSetStockPrice(): void {
if (!isNaN(stockPrice)) {
processStocks((stock: Stock) => {
stock.price = stockPrice;
});
}
}
function viewStockCaps(): void {
const stocks: JSX.Element[] = [];
processStocks((stock: Stock) => {
stocks.push(
<tr key={stock.symbol}>
<td>{stock.symbol}</td>
<td style={{ textAlign: "right" }}>
<Money money={stock.cap} />
</td>
</tr>,
);
});
dialogBoxCreate(
<table>
<tbody>
<tr>
<th>Stock</th>
<th>Price cap</th>
</tr>
{stocks}
</tbody>
</table>,
);
}
return (
2021-09-18 03:30:02 +02:00
<Accordion TransitionProps={{ unmountOnExit: true }}>
2021-09-14 02:37:35 +02:00
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
2021-10-01 22:22:33 +02:00
<Typography>Stock Market</Typography>
2021-09-14 02:37:35 +02:00
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
2021-10-01 02:06:40 +02:00
<Typography>Symbol:</Typography>
2021-09-14 02:37:35 +02:00
</td>
<td>
<TextField placeholder="symbol/'all'" onChange={setStockSymbolField} />
</td>
</tr>
<tr>
<td>
2021-10-01 02:06:40 +02:00
<Typography>Price:</Typography>
2021-09-14 02:37:35 +02:00
</td>
<td>
<TextField placeholder="$$$" onChange={setStockPriceField} />
<Button onClick={doSetStockPrice}>Set</Button>
</td>
</tr>
<tr>
<td>
2021-10-01 02:06:40 +02:00
<Typography>Caps:</Typography>
2021-09-14 02:37:35 +02:00
</td>
<td>
<Button onClick={viewStockCaps}>View stock caps</Button>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}