bitburner-src/src/Faction/ui/DonateOption.tsx

97 lines
2.9 KiB
TypeScript
Raw Normal View History

2021-09-04 07:39:34 +02:00
import React, { useState } from "react";
2019-04-14 11:08:10 +02:00
import { CONSTANTS } from "../../Constants";
2022-03-06 05:05:55 +01:00
import { Faction } from "../Faction";
import { Player } from "@player";
2021-09-04 07:39:34 +02:00
import { repFromDonation } from "../formulas/donation";
2021-09-21 02:42:13 +02:00
import { Favor } from "../../ui/React/Favor";
2019-04-14 11:08:10 +02:00
import { Money } from "../../ui/React/Money";
import { Reputation } from "../../ui/React/Reputation";
2019-04-14 11:08:10 +02:00
2021-09-25 20:42:57 +02:00
import { dialogBoxCreate } from "../../ui/React/DialogBox";
import { MathJax } from "better-react-mathjax";
2019-04-14 11:08:10 +02:00
2021-09-21 02:42:13 +02:00
import Typography from "@mui/material/Typography";
import Paper from "@mui/material/Paper";
import Button from "@mui/material/Button";
import { NumberInput } from "../../ui/React/NumberInput";
2021-09-21 02:42:13 +02:00
2019-04-14 11:08:10 +02:00
type IProps = {
2021-09-05 01:09:30 +02:00
faction: Faction;
disabled: boolean;
favorToDonate: number;
rerender: () => void;
};
2019-04-14 11:08:10 +02:00
/** React component for a donate option on the Faction UI */
2021-09-04 07:39:34 +02:00
export function DonateOption(props: IProps): React.ReactElement {
const [donateAmt, setDonateAmt] = useState<number>(NaN);
2021-09-05 01:09:30 +02:00
const digits = (CONSTANTS.DonateMoneyToRepDivisor + "").length - 1;
function canDonate(): boolean {
if (isNaN(donateAmt)) return false;
2021-09-05 01:09:30 +02:00
if (isNaN(donateAmt) || donateAmt <= 0) return false;
2022-09-06 15:07:12 +02:00
if (Player.money < donateAmt) return false;
2021-09-05 01:09:30 +02:00
return true;
}
function donate(): void {
const fac = props.faction;
const amt = donateAmt;
if (isNaN(amt)) return;
2021-09-05 01:09:30 +02:00
if (!canDonate()) return;
2022-09-06 15:07:12 +02:00
Player.loseMoney(amt, "other");
const repGain = repFromDonation(amt, Player);
2021-09-05 01:09:30 +02:00
props.faction.playerReputation += repGain;
dialogBoxCreate(
<>
2021-10-01 19:08:37 +02:00
You just donated <Money money={amt} /> to {fac.name} to gain <Reputation reputation={repGain} /> reputation.
2021-09-05 01:09:30 +02:00
</>,
);
props.rerender();
}
function Status(): React.ReactElement {
if (isNaN(donateAmt)) return <></>;
2021-09-05 01:09:30 +02:00
if (!canDonate()) {
2022-09-06 15:07:12 +02:00
if (Player.money < donateAmt) return <Typography>Insufficient funds</Typography>;
2021-09-21 02:42:13 +02:00
return <Typography>Invalid donate amount entered!</Typography>;
2019-04-14 11:08:10 +02:00
}
2021-09-21 02:42:13 +02:00
return (
<Typography>
2022-09-06 15:07:12 +02:00
This donation will result in <Reputation reputation={repFromDonation(donateAmt, Player)} /> reputation gain
2021-09-21 02:42:13 +02:00
</Typography>
);
2021-09-05 01:09:30 +02:00
}
return (
<Paper sx={{ my: 1, p: 1 }}>
2021-09-21 02:42:13 +02:00
<Status />
{props.disabled ? (
<Typography>
2021-10-01 19:08:37 +02:00
Unlock donations at <Favor favor={props.favorToDonate} /> favor with {props.faction.name}
2021-09-21 02:42:13 +02:00
</Typography>
) : (
<>
<NumberInput
onChange={setDonateAmt}
2021-09-21 02:42:13 +02:00
placeholder={"Donation amount"}
disabled={props.disabled}
InputProps={{
endAdornment: (
<Button onClick={donate} disabled={props.disabled || !canDonate()}>
donate
</Button>
),
}}
/>
<Typography>
<MathJax>{`\\(reputation = \\frac{\\text{donation amount} \\cdot \\text{reputation multiplier}}{10^{${digits}}}\\)`}</MathJax>
2021-09-21 02:42:13 +02:00
</Typography>
</>
)}
</Paper>
2021-09-05 01:09:30 +02:00
);
2019-04-14 11:08:10 +02:00
}