From ae6c516ad9b434e4dfb9cc2e7ba95d198a398330 Mon Sep 17 00:00:00 2001 From: Geolffrey Mena Date: Wed, 1 Jan 2025 08:39:04 -0600 Subject: [PATCH] refactor: added extra comments a some fixes --- .../finance/components/finance-deposit.tsx | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 src/sections/finance/components/finance-deposit.tsx diff --git a/src/sections/finance/components/finance-deposit.tsx b/src/sections/finance/components/finance-deposit.tsx new file mode 100644 index 00000000..a60bcb22 --- /dev/null +++ b/src/sections/finance/components/finance-deposit.tsx @@ -0,0 +1,131 @@ +// TODO Please keep ordered the dependencies +import { useSnackbar } from "notistack"; +import { useSelector } from "react-redux"; +import { FC, useEffect, useState, useCallback } from 'react'; + +import Box from "@mui/material/Box"; +import Stack from "@mui/material/Stack"; +import Divider from "@mui/material/Divider"; +import TextMaxLine from "@src/components/text-max-line"; +import NeonPaper from "@src/sections/publication/NeonPaperContainer.tsx"; +import FinanceDialogsActions from "@src/sections/finance/components/finance-dialogs-actions.tsx"; + +import { formatBalanceNumber } from "@src/utils/format-number.ts"; +import { InputAmount } from "@src/components/input-amount.tsx"; +import { BoxRow } from "@src/sections/finance/components/finance-deposit-from-metamask.tsx"; +import { useGetMmcContractBalance } from "@src/hooks/use-get-mmc-contract-balance.ts"; +import { useResponsive } from "@src/hooks/use-responsive.ts"; +import { UseDepositHook } from "@src/hooks/use-deposit.ts"; +import { truncateAddress } from '@src/utils/wallet.ts'; + +interface FinanceDepositFromSmartAccountProps { + useDeposit:() => UseDepositHook; + onClose: () => void; +} + +const FinanceDepositFromSmartAccount: FC = ({ onClose, useDeposit }) => { + // TODO Use this component as generic finance deposit and create new sub components for metamask & smart account + // TODO Please keep declaration on top + const [amount, setAmount] = useState(0); + const [loading, setLoading] = useState(false); + const { enqueueSnackbar } = useSnackbar(); + + const sessionData = useSelector((state: any) => state.auth.session); + const { deposit, loading: depositLoading, error } = useDeposit(); + const { balance } = useGetMmcContractBalance(sessionData?.address); + + // TODO we can have a list of errors centralized in a library to throw, in favor of reutilization + const errorDueInvalidAmount = () => enqueueSnackbar("Invalid deposit amount.", { variant: "warning" }); + const errorDuringDeposit = () => enqueueSnackbar(`Oops! Something went wrong with your deposit. Please try again.`, { variant: "error" }); + + const RainbowEffect = loading || depositLoading ? NeonPaper : Box; + const mdUp = useResponsive('up', 'md'); + // TODO any extra connection like: + // useEffect(() => { + // handleConnectMetamask(); + // }, []); + // could be handled in the specific component + + useEffect(() => { + if (error) errorDuringDeposit() + }, [error]); + + const handleConfirmDeposit = useCallback(async () => { + // fail fast + // TODO validation formatUint(amount) > balance + if (amount == 0 || amount >= (balance ?? 0)) + return errorDueInvalidAmount(); + + try { + setLoading(true); + // TODO deposit can return a OK? + await deposit({ recipient: sessionData?.address, amount }); + enqueueSnackbar(`The deposit was successful`, { variant: "success" }); + onClose(); + } catch (err: any) { + errorDuringDeposit(); + } finally { + setLoading(false); + } + + }, [sessionData?.address, amount, balance]); + + + return ( + <> + + + Connected Wallet + + {truncateAddress(sessionData?.address)} + + + + + + + Balance + + {formatBalanceNumber(balance ?? 0)} MMC + + + + + + + Amount to deposit + setAmount(Number(e.target.value))} + /> + + + + + + ); +}; + +export default FinanceDepositFromSmartAccount;