From 17f13b6d7c6ad72e8944f5d251bb36343413c908 Mon Sep 17 00:00:00 2001 From: Linkie Link Date: Thu, 5 Oct 2023 09:15:32 +0200 Subject: [PATCH] Mp 3442 sage feedback pre mars v 2 trade page (#520) * MP-3442: set autolend to true by default * MP-3442: remember margin setting and toggle it on by default * MP-3442: add balances to AssetSelector * MP-3442: close assetOverlay on clickAway * fix: fixed TradeModule z-index * MP-3442: set priority of balance and cap * fix: overlayState * fix: adjusted to comments --- .env.example | 2 +- .../Account/AccountBalancesTable/index.tsx | 5 ++- .../TradeModule/AssetSelector/AssetItem.tsx | 33 ++++++++++++++- .../TradeModule/AssetSelector/AssetList.tsx | 12 +++++- .../AssetSelector/AssetOverlay.tsx | 7 +--- .../Trade/TradeModule/AssetSelector/index.tsx | 40 ++++++++++--------- .../Trade/TradeModule/SwapForm/index.tsx | 27 ++++++++++--- src/components/Trade/TradeModule/index.tsx | 2 +- src/constants/defaultSettings.ts | 2 +- src/pages/TradePage.tsx | 9 +++++ src/store/slices/common.ts | 1 + src/store/slices/modal.ts | 1 + .../interfaces/components/AssetOverlay.d.ts | 1 + src/types/interfaces/store/common.d.ts | 1 + src/types/interfaces/store/modals.d.ts | 1 + 15 files changed, 109 insertions(+), 35 deletions(-) create mode 100644 src/types/interfaces/components/AssetOverlay.d.ts diff --git a/.env.example b/.env.example index 903d552c..6bdf5290 100644 --- a/.env.example +++ b/.env.example @@ -11,7 +11,7 @@ NEXT_PUBLIC_RED_BANK=osmo1vxpdcw092n9rngvekve8g324c2yjx56496ck98ag4sdxr4p4zd4q0w NEXT_PUBLIC_CREDIT_MANAGER=osmo1m83kw2vehyt9urxf79qa9rxk8chgs4464e5h8s37yhnw3pwauuqq7lux8r NEXT_PUBLIC_INCENTIVES=osmo1r9w7k774vcxeuvq6ctq0z2j6wkkxpskucgjkqt0uu7u07l03s3js6ukge4 NEXT_PUBLIC_ZAPPER=osmo1q4kkvuy8wc9fs8sfm7zyeh4k25vssd0l68nrph8s7unvq5jdq67swrepj4 -NEXT_PUBLIC_SWAPPER=osmo1xmhhdxgk9e83n4kmtlluzx38mya8q9r4hku5nys8cr7jg7sgpx5s8zkkg2 +NEXT_PUBLIC_SWAPPER=osmo1wee0z8c7tcawyl647eapqs4a88q8jpa7ddy6nn2nrs7t47p2zhxswetwla NEXT_PUBLIC_PARAMS=osmo1pzszwkyy0x9cu6p2uknwa3wccr79xwmqn9gj66fnjnayr28tzp6qh2n4qg NEXT_PUBLIC_PYTH=osmo13ge29x4e2s63a8ytz2px8gurtyznmue4a69n5275692v3qn3ks8q7cwck7 NEXT_PUBLIC_API=http://localhost:3000/api diff --git a/src/components/Account/AccountBalancesTable/index.tsx b/src/components/Account/AccountBalancesTable/index.tsx index 60f06255..91e4a914 100644 --- a/src/components/Account/AccountBalancesTable/index.tsx +++ b/src/components/Account/AccountBalancesTable/index.tsx @@ -111,11 +111,12 @@ export default function Index(props: Props) { ) const formattedAmount = formatAmountToPrecision(amount, MAX_AMOUNT_DECIMALS) + const lowAmount = formattedAmount === 0 ? 0 : Math.max(formattedAmount, MIN_AMOUNT) return ( void depositCap?: DepositCap + balances: BNCoin[] } export default function AssetItem(props: Props) { @@ -19,6 +23,9 @@ export default function AssetItem(props: Props) { FAVORITE_ASSETS_KEY, [], ) + const amount = demagnify(props.balances.find(byDenom(asset.denom))?.amount ?? BN_ZERO, asset) + const formattedAmount = formatAmountToPrecision(amount, MAX_AMOUNT_DECIMALS) + const lowAmount = formattedAmount === 0 ? 0 : Math.max(formattedAmount, MIN_AMOUNT) function handleToggleFavorite(event: React.MouseEvent) { event.stopPropagation() @@ -50,6 +57,30 @@ export default function AssetItem(props: Props) { {asset.symbol} + {props.balances.length > 0 && ( +
+ Balance: + {amount >= 1 ? ( + + ) : ( + + )} +
+ )} {props.depositCap && (
Cap Left: diff --git a/src/components/Trade/TradeModule/AssetSelector/AssetList.tsx b/src/components/Trade/TradeModule/AssetSelector/AssetList.tsx index 9416f5e6..c89f544a 100644 --- a/src/components/Trade/TradeModule/AssetSelector/AssetList.tsx +++ b/src/components/Trade/TradeModule/AssetSelector/AssetList.tsx @@ -3,8 +3,12 @@ import classNames from 'classnames' import { ChevronDown } from 'components/Icons' import Text from 'components/Text' import AssetItem from 'components/Trade/TradeModule/AssetSelector/AssetItem' +import useCurrentAccount from 'hooks/useCurrentAccount' import useMarketAssets from 'hooks/useMarketAssets' +import { useMemo } from 'react' +import { getMergedBalancesForAsset } from 'utils/accounts' import { byDenom } from 'utils/array' +import { getEnabledMarketAssets } from 'utils/assets' interface Props { type: 'buy' | 'sell' @@ -15,12 +19,17 @@ interface Props { } export default function AssetList(props: Props) { + const account = useCurrentAccount() const { data: marketAssets } = useMarketAssets() + const balances = useMemo(() => { + if (!account) return [] + return getMergedBalancesForAsset(account, getEnabledMarketAssets()) + }, [account]) return (
- setOverlayState('sell')} asset={sellAsset} /> + useStore.setState({ assetOverlayState: 'sell' })} + asset={sellAsset} + /> s.useMargin) const account = useCurrentAccount() const swap = useStore((s) => s.swap) const [slippage] = useLocalStorage(SLIPPAGE_KEY, DEFAULT_SETTINGS.slippage) const { computeMaxSwapAmount } = useHealthComputer(account) const { data: borrowAssets } = useMarketBorrowings() const { data: marketAssets } = useMarketAssets() - - const [isMarginChecked, setMarginChecked] = useToggle() + const isBorrowEnabled = !!marketAssets.find(byDenom(sellAsset.denom))?.borrowEnabled + const [isMarginChecked, setMarginChecked] = useToggle(isBorrowEnabled ? useMargin : false) const [buyAssetAmount, setBuyAssetAmount] = useState(BN_ZERO) const [sellAssetAmount, setSellAssetAmount] = useState(BN_ZERO) const [maxBuyableAmountEstimation, setMaxBuyableAmountEstimation] = useState(BN_ZERO) @@ -173,17 +174,33 @@ export default function SwapForm(props: Props) { [simulateTrade, isAutoLendEnabled], ) + const handleMarginToggleChange = useCallback( + (isMargin: boolean) => { + if (isBorrowEnabled) useStore.setState({ useMargin: isMargin }) + setMarginChecked(isBorrowEnabled ? isMargin : false) + }, + [isBorrowEnabled, setMarginChecked], + ) + useEffect(() => { setBuyAssetAmount(BN_ZERO) setSellAssetAmount(BN_ZERO) - setMarginChecked(false) + setMarginChecked(isBorrowEnabled ? useMargin : false) simulateTrade( BNCoin.fromDenomAndBigNumber(buyAsset.denom, BN_ZERO), BNCoin.fromDenomAndBigNumber(sellAsset.denom, BN_ZERO), BNCoin.fromDenomAndBigNumber(sellAsset.denom, BN_ZERO), isAutoLendEnabled ? 'lend' : 'deposit', ) - }, [buyAsset.denom, sellAsset.denom, simulateTrade, isAutoLendEnabled, setMarginChecked]) + }, [ + isBorrowEnabled, + useMargin, + buyAsset.denom, + sellAsset.denom, + isAutoLendEnabled, + simulateTrade, + setMarginChecked, + ]) useEffect(() => { const removeDepositAmount = sellAssetAmount.isGreaterThanOrEqualTo(sellSideMarginThreshold) @@ -229,7 +246,7 @@ export default function SwapForm(props: Props) { diff --git a/src/components/Trade/TradeModule/index.tsx b/src/components/Trade/TradeModule/index.tsx index c54846ff..e1e18dd5 100644 --- a/src/components/Trade/TradeModule/index.tsx +++ b/src/components/Trade/TradeModule/index.tsx @@ -16,7 +16,7 @@ export default function TradeModule(props: Props) { return (
s.assetOverlayState) return (
@@ -25,6 +27,13 @@ export default function TradePage() {
+ {assetOverlayState !== 'closed' && ( +
useStore.setState({ assetOverlayState: 'closed' })} + role='button' + /> + )}
) } diff --git a/src/store/slices/common.ts b/src/store/slices/common.ts index 5591df32..f526bb57 100644 --- a/src/store/slices/common.ts +++ b/src/store/slices/common.ts @@ -11,5 +11,6 @@ export default function createCommonSlice(set: SetState, get: GetSt accountDetailsExpanded: false, migrationBanner: true, tutorial: true, + useMargin: true, } } diff --git a/src/store/slices/modal.ts b/src/store/slices/modal.ts index b6f88bb5..afb7e22a 100644 --- a/src/store/slices/modal.ts +++ b/src/store/slices/modal.ts @@ -15,5 +15,6 @@ export default function createModalSlice(set: SetState, get: GetStat vaultModal: null, walletAssetsModal: null, withdrawFromVaultsModal: null, + assetOverlayState: 'closed' as OverlayState, } } diff --git a/src/types/interfaces/components/AssetOverlay.d.ts b/src/types/interfaces/components/AssetOverlay.d.ts new file mode 100644 index 00000000..63877e9d --- /dev/null +++ b/src/types/interfaces/components/AssetOverlay.d.ts @@ -0,0 +1 @@ +type OverlayState = 'buy' | 'sell' | 'closed' diff --git a/src/types/interfaces/store/common.d.ts b/src/types/interfaces/store/common.d.ts index 116772bb..509e2d64 100644 --- a/src/types/interfaces/store/common.d.ts +++ b/src/types/interfaces/store/common.d.ts @@ -10,6 +10,7 @@ interface CommonSlice { accountDetailsExpanded: boolean migrationBanner: boolean tutorial: boolean + useMargin: boolean } interface FocusComponent { diff --git a/src/types/interfaces/store/modals.d.ts b/src/types/interfaces/store/modals.d.ts index 4ea8f07a..81174ad3 100644 --- a/src/types/interfaces/store/modals.d.ts +++ b/src/types/interfaces/store/modals.d.ts @@ -11,6 +11,7 @@ interface ModalSlice { vaultModal: VaultModal | null walletAssetsModal: WalletAssetModal | null withdrawFromVaultsModal: DepositedVault[] | null + assetOverlayState: OverlayState } interface AlertDialogButton {