From 634a017b1ea18d550f461b27b751bcccbbb0ed39 Mon Sep 17 00:00:00 2001 From: saml33 Date: Sun, 10 Sep 2023 23:26:52 +1000 Subject: [PATCH] add token positions warning to trigger swap --- components/DepositForm.tsx | 35 +++++++-------- components/swap/MarketSwapForm.tsx | 2 +- components/swap/ReduceOutputTokenInput.tsx | 2 +- components/swap/SwapForm.tsx | 4 +- components/swap/SwapFormTokenList.tsx | 2 +- ...{LimitSwapForm.tsx => TriggerSwapForm.tsx} | 39 +++++++++++----- hooks/useRemainingBorrowsInPeriod.ts | 11 +++-- hooks/useTokenPositionsFull.ts | 44 +++++++++++-------- 8 files changed, 82 insertions(+), 57 deletions(-) rename components/swap/{LimitSwapForm.tsx => TriggerSwapForm.tsx} (96%) diff --git a/components/DepositForm.tsx b/components/DepositForm.tsx index 0901b466..a2c13e6e 100644 --- a/components/DepositForm.tsx +++ b/components/DepositForm.tsx @@ -36,9 +36,9 @@ import TokenListButton from './shared/TokenListButton' import { ACCOUNT_ACTIONS_NUMBER_FORMAT_CLASSES, BackButton } from './BorrowForm' import TokenLogo from './shared/TokenLogo' import SecondaryConnectButton from './shared/SecondaryConnectButton' -import useMangoAccountAccounts from 'hooks/useMangoAccountAccounts' import InlineNotification from './shared/InlineNotification' import Link from 'next/link' +import useTokenPositionsFull from 'hooks/useTokenPositionsFull' interface DepositFormProps { onSuccess: () => void @@ -78,20 +78,13 @@ function DepositForm({ onSuccess, token }: DepositFormProps) { const [refreshingWalletTokens, setRefreshingWalletTokens] = useState(false) const { maxSolDeposit } = useSolBalance() const banks = useBanksWithBalances('walletBalance') - const { usedTokens, totalTokens } = useMangoAccountAccounts() const bank = useMemo(() => { const group = mangoStore.getState().group return group?.banksMapByName.get(selectedToken)?.[0] }, [selectedToken]) - const tokenPositionsFull = useMemo(() => { - if (!bank || !usedTokens.length || !totalTokens.length) return false - const hasTokenPosition = usedTokens.find( - (token) => token.tokenIndex === bank.tokenIndex, - ) - return hasTokenPosition ? false : usedTokens.length >= totalTokens.length - }, [bank, usedTokens, totalTokens]) + const tokenPositionsFull = useTokenPositionsFull([bank]) const { connected, publicKey } = useWallet() const walletTokens = mangoStore((s) => s.wallet.tokens) @@ -331,17 +324,19 @@ function DepositForm({ onSuccess, token }: DepositFormProps) { /> )} {tokenPositionsFull ? ( - - {t('error-token-positions-full')}{' '} - onSuccess()} shallow> - {t('manage')} - - - } - /> +
+ + {t('error-token-positions-full')}{' '} + onSuccess()} shallow> + {t('manage')} + + + } + /> +
) : null} diff --git a/components/swap/MarketSwapForm.tsx b/components/swap/MarketSwapForm.tsx index 50255b8f..b7fb6599 100644 --- a/components/swap/MarketSwapForm.tsx +++ b/components/swap/MarketSwapForm.tsx @@ -342,7 +342,7 @@ const SwapFormSubmitButton = ({ const { inputBank, outputBank } = mangoStore((s) => s.swap) const { remainingBorrowsInPeriod, timeToNextPeriod } = useRemainingBorrowsInPeriod(true) - const tokenPositionsFull = useTokenPositionsFull(outputBank, inputBank) + const tokenPositionsFull = useTokenPositionsFull([outputBank, inputBank]) const freeCollateral = useMemo(() => { const group = mangoStore.getState().group diff --git a/components/swap/ReduceOutputTokenInput.tsx b/components/swap/ReduceOutputTokenInput.tsx index 5ead75e2..ef649067 100644 --- a/components/swap/ReduceOutputTokenInput.tsx +++ b/components/swap/ReduceOutputTokenInput.tsx @@ -14,7 +14,7 @@ import { NUMBER_FORMAT_CLASSNAMES } from './MarketSwapForm' import InlineNotification from '@components/shared/InlineNotification' import useMangoAccount from 'hooks/useMangoAccount' import { SwapFormTokenListType } from './SwapFormTokenList' -import { getInputTokenBalance } from './LimitSwapForm' +import { getInputTokenBalance } from './TriggerSwapForm' const ReduceOutputTokenInput = ({ error, diff --git a/components/swap/SwapForm.tsx b/components/swap/SwapForm.tsx index c4d65bd7..c42abebf 100644 --- a/components/swap/SwapForm.tsx +++ b/components/swap/SwapForm.tsx @@ -16,11 +16,11 @@ import InlineNotification from '@components/shared/InlineNotification' import Tooltip from '@components/shared/Tooltip' import TabUnderline from '@components/shared/TabUnderline' import MarketSwapForm from './MarketSwapForm' -import LimitSwapForm from './LimitSwapForm' import Switch from '@components/forms/Switch' import useLocalStorageState from 'hooks/useLocalStorageState' import { SwapFormTokenListType } from './SwapFormTokenList' import { TriggerOrderTypes } from 'types' +import TriggerSwapForm from './TriggerSwapForm' const set = mangoStore.getState().set @@ -175,7 +175,7 @@ const SwapForm = () => { {swapOrTrigger === 'swap' ? ( ) : ( - diff --git a/components/swap/SwapFormTokenList.tsx b/components/swap/SwapFormTokenList.tsx index b49ae237..db4e52f3 100644 --- a/components/swap/SwapFormTokenList.tsx +++ b/components/swap/SwapFormTokenList.tsx @@ -14,7 +14,7 @@ import FormatNumericValue from '@components/shared/FormatNumericValue' import { formatTokenSymbol } from 'utils/tokens' import TokenLogo from '@components/shared/TokenLogo' import Input from '@components/forms/Input' -import { getInputTokenBalance } from './LimitSwapForm' +import { getInputTokenBalance } from './TriggerSwapForm' export type SwapFormTokenListType = | 'input' diff --git a/components/swap/LimitSwapForm.tsx b/components/swap/TriggerSwapForm.tsx similarity index 96% rename from components/swap/LimitSwapForm.tsx rename to components/swap/TriggerSwapForm.tsx index ec1ce844..8cd6d097 100644 --- a/components/swap/LimitSwapForm.tsx +++ b/components/swap/TriggerSwapForm.tsx @@ -46,6 +46,8 @@ import relativeTime from 'dayjs/plugin/relativeTime' import { SwapFormTokenListType } from './SwapFormTokenList' import { formatTokenSymbol } from 'utils/tokens' import Tooltip from '@components/shared/Tooltip' +import Link from 'next/link' +import useTokenPositionsFull from 'hooks/useTokenPositionsFull' dayjs.extend(relativeTime) @@ -54,17 +56,17 @@ const priceToDisplayString = (price: number | Decimal | string): string => { return val.toFixed(val.dp()) } -type LimitSwapFormProps = { +type TriggerSwapFormProps = { showTokenSelect: SwapFormTokenListType setShowTokenSelect: Dispatch> } -type LimitSwapForm = { +type TriggerSwapForm = { amountIn: number triggerPrice: string } -type FormErrors = Partial> +type FormErrors = Partial> enum OrderTypes { STOP_LOSS = 'trade:stop-loss', @@ -103,10 +105,10 @@ const getOrderTypeMultiplier = ( } } -const LimitSwapForm = ({ +const TriggerSwapForm = ({ showTokenSelect, setShowTokenSelect, -}: LimitSwapFormProps) => { +}: TriggerSwapFormProps) => { const { t } = useTranslation(['common', 'swap', 'trade']) const { mangoAccountAddress } = useMangoAccount() const { ipAllowed, ipCountry } = useIpAddress() @@ -116,7 +118,7 @@ const LimitSwapForm = ({ const [swapFormSizeUi] = useLocalStorageState(SIZE_INPUT_UI_KEY, 'slider') const [formErrors, setFormErrors] = useState({}) const { remainingBorrowsInPeriod, timeToNextPeriod } = - useRemainingBorrowsInPeriod(true) + useRemainingBorrowsInPeriod(false, true) const { inputBank, @@ -127,6 +129,8 @@ const LimitSwapForm = ({ triggerPrice, } = mangoStore((s) => s.swap) + const tokenPositionsFull = useTokenPositionsFull([outputBank]) + const { connected, connect } = useWallet() const [inputBankName, outputBankName, inputBankDecimals, outputBankDecimals] = @@ -270,10 +274,10 @@ const LimitSwapForm = ({ ]) const isFormValid = useCallback( - (form: LimitSwapForm) => { + (form: TriggerSwapForm) => { const invalidFields: FormErrors = {} setFormErrors({}) - const requiredFields: (keyof LimitSwapForm)[] = [ + const requiredFields: (keyof TriggerSwapForm)[] = [ 'amountIn', 'triggerPrice', ] @@ -850,7 +854,7 @@ const LimitSwapForm = ({ ) : null} {ipAllowed ? (