bitburner-src/src/Locations/ui/TechVendorLocation.tsx

85 lines
2.4 KiB
TypeScript
Raw Normal View History

/**
* React Subcomponent for displaying a location's UI, when that location is a tech vendor
*
* This subcomponent renders all of the buttons for purchasing things from tech vendors
*/
2021-09-11 07:54:19 +02:00
import React, { useState, useEffect } from "react";
2021-09-25 21:34:12 +02:00
import Typography from "@mui/material/Typography";
import Button from "@mui/material/Button";
2021-09-05 01:09:30 +02:00
import { Location } from "../Location";
import { RamButton } from "./RamButton";
import { TorButton } from "./TorButton";
import { CoresButton } from "./CoresButton";
2021-09-05 01:09:30 +02:00
import { getPurchaseServerCost } from "../../Server/ServerPurchases";
2021-09-05 01:09:30 +02:00
import { Money } from "../../ui/React/Money";
import { Player } from "@player";
2021-10-01 02:06:40 +02:00
import { PurchaseServerModal } from "./PurchaseServerModal";
2021-10-12 00:14:10 +02:00
import { numeralWrapper } from "../../ui/numeralFormat";
import { Box } from "@mui/material";
2021-10-01 02:06:40 +02:00
interface IServerProps {
ram: number;
rerender: () => void;
}
function ServerButton(props: IServerProps): React.ReactElement {
const [open, setOpen] = useState(false);
const cost = getPurchaseServerCost(props.ram);
return (
<>
2022-09-06 15:07:12 +02:00
<Button onClick={() => setOpen(true)} disabled={!Player.canAfford(cost)}>
2021-10-12 00:14:10 +02:00
Purchase {numeralWrapper.formatRAM(props.ram)} Server&nbsp;-&nbsp;
2022-09-06 15:07:12 +02:00
<Money money={cost} forPurchase={true} />
2021-10-01 02:06:40 +02:00
</Button>
<PurchaseServerModal
open={open}
onClose={() => setOpen(false)}
ram={props.ram}
cost={cost}
rerender={props.rerender}
/>
</>
);
}
type IProps = {
2021-09-05 01:09:30 +02:00
loc: Location;
};
export function TechVendorLocation(props: IProps): React.ReactElement {
2021-09-07 23:26:49 +02:00
const setRerender = useState(false)[1];
2021-09-09 09:17:01 +02:00
function rerender(): void {
2021-09-07 23:26:49 +02:00
setRerender((old) => !old);
}
2021-09-11 07:54:19 +02:00
useEffect(() => {
const id = setInterval(rerender, 1000);
return () => clearInterval(id);
}, []);
2021-09-05 01:09:30 +02:00
const purchaseServerButtons: React.ReactNode[] = [];
2021-09-09 05:47:34 +02:00
for (let i = props.loc.techVendorMinRam; i <= props.loc.techVendorMaxRam; i *= 2) {
2021-10-01 02:06:40 +02:00
purchaseServerButtons.push(<ServerButton key={i} ram={i} rerender={rerender} />);
2021-09-05 01:09:30 +02:00
}
2021-09-05 01:09:30 +02:00
return (
2021-10-01 19:08:37 +02:00
<>
<br />
2022-04-07 01:30:08 +02:00
<Box sx={{ display: "grid", width: "fit-content" }}>{purchaseServerButtons}</Box>
2021-09-05 01:09:30 +02:00
<br />
2021-10-01 07:00:50 +02:00
<Typography>
2021-12-20 22:39:33 +01:00
<i>"You can order bigger servers via scripts. We don't take custom orders in person."</i>
2021-09-25 21:34:12 +02:00
</Typography>
2021-09-05 01:09:30 +02:00
<br />
2022-09-06 15:07:12 +02:00
<TorButton rerender={rerender} />
2021-09-25 21:34:12 +02:00
<br />
2022-09-06 15:07:12 +02:00
<RamButton rerender={rerender} />
2021-09-25 21:34:12 +02:00
<br />
2022-09-06 15:07:12 +02:00
<CoresButton rerender={rerender} />
2021-10-01 19:08:37 +02:00
</>
2021-09-05 01:09:30 +02:00
);
}