ghost-dao-interface/src/containers/Stake/components/FarmPools.jsx
Uncle Fatso e153760532
change dai naming to reserve; flexible network representation
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
2025-11-04 14:40:21 +03:00

143 lines
4.9 KiB
JavaScript

import {
TableContainer,
TableHead,
TableBody,
TableRow,
TableCell,
Table,
Typography,
Box,
useMediaQuery,
} from "@mui/material";
import { useNavigate, createSearchParams } from "react-router-dom";
import Paper from "../../../components/Paper/Paper";
import { SecondaryButton } from "../../../components/Button";
import TokenStack from "../../../components/TokenStack/TokenStack";
import { DecimalBigNumber } from "../../../helpers/DecimalBigNumber";
import { formatCurrency } from "../../../helpers";
import { tokenNameConverter } from "../../../helpers/tokenConverter";
import { isNetworkLegacy } from "../../../constants";
import { useLpValuation } from "../../../hooks/treasury";
import { useTotalSupply, useTokenSymbol } from "../../../hooks/tokens";
import { RESERVE_ADDRESSES, FTSO_ADDRESSES } from "../../../constants/addresses";
const FarmPools = ({ chainId }) => {
const isSmallScreen = useMediaQuery("(max-width: 775px)");
const { totalSupply: reserveFtsoUniTotalSupply } = useTotalSupply(chainId, "RESERVE_FTSO");
const reserveFtsoUniValuation = useLpValuation(chainId, "RESERVE_FTSO", reserveFtsoUniTotalSupply._value);
const { symbol: reserveSymbol } = useTokenSymbol(chainId, "RESERVE");
const { symbol: ftsoSymbol } = useTokenSymbol(chainId, "FTSO");
const pools = [
{
icons: ["FTSO", isNetworkLegacy(chainId) ? "GDAI" : tokenNameConverter(chainId, reserveSymbol)],
name: `${ftsoSymbol}-${reserveSymbol}`,
dex: "Uniswap V2",
url: "/dex/uniswap",
tvl: reserveFtsoUniValuation,
params: createSearchParams({
pool: "true",
from: `${RESERVE_ADDRESSES[chainId]}`,
to: `${FTSO_ADDRESSES[chainId]}`,
})
},
];
if (isSmallScreen) {
return (
<>
{pools.map((pool, id) => {
return (
<FarmPoolCard key={id} id={id} pool={pool} />
)
})}
</>
)
}
return (
<Paper headerText="Farm Pools" fullWidth enableBackground>
<TableContainer>
<Table aria-label="Farm pools" style={{ tableLayout: "fixed" }}>
<TableHead>
<TableRow>
<TableCell style={{ padding: "8px 0", width: "30%" }}>Asset</TableCell>
<TableCell style={{ padding: "8px 0", width: "30%" }}>TVL</TableCell>
<TableCell style={{ padding: "8px 0", width: "40%" }}></TableCell>
</TableRow>
</TableHead>
<TableBody>
{pools.map((pool, id) => {
return (
<FarmPoolRow key={id} id={id} pool={pool} />
)
})}
</TableBody>
</Table>
</TableContainer>
</Paper>
)
}
const FarmPoolCard = ({ id, pool }) => {
return (
<Paper enableBackground fullWidth>
<Box id={id + `--bond`}>
<Box display="flex" alignItems="center" flexDirection="column" gap="20px">
<Box display="flex" alignItems="center" gap="20px">
<TokenStack tokens={pool.icons} />
<Typography>{pool.name}</Typography>
</Box>
<Typography>{formatCurrency(pool.tvl, 2)}</Typography>
<SecondaryButton
fullWidth
sx={{ maxWidth: "320px" }}
href={pool.url}
>
Get on {pool.dex}
</SecondaryButton>
</Box>
</Box>
</Paper>
)
}
const FarmPoolRow = ({ id, pool }) => {
const navigate = useNavigate();
return (
<TableRow key={id} id={id + `--pool`} data-testid={id + `--pool`}>
<TableCell style={{ padding: "8px 0" }}>
<Box display="flex" alignItems="center" gap="20px">
<TokenStack tokens={pool.icons} />
<Typography>{pool.name}</Typography>
</Box>
</TableCell>
<TableCell style={{ padding: "8px 0" }}>
<Typography>{formatCurrency(pool.tvl, 2)}</Typography>
</TableCell>
<TableCell style={{ display: "flex", justifyContent: "end", padding: "8px 0" }}>
<SecondaryButton
fullWidth
sx={{ maxWidth: "320px" }}
onClick={() => navigate({ pathname: pool.url, search: pool.params.toString() })}
>
Get on {pool.dex}
</SecondaryButton>
</TableCell>
</TableRow>
)
}
export default FarmPools;