RepayModal.tsx
1 import { InterestRate } from '@aave/contract-helpers'; 2 import { Trans } from '@lingui/macro'; 3 import React, { useState } from 'react'; 4 import { UserAuthenticated } from 'src/components/UserAuthenticated'; 5 import { useAppDataContext } from 'src/hooks/app-data-provider/useAppDataProvider'; 6 import { ModalContextType, ModalType, useModalContext } from 'src/hooks/useModal'; 7 import { useRootStore } from 'src/store/root'; 8 import { isFeatureEnabled } from 'src/utils/marketsAndNetworksConfig'; 9 10 import { BasicModal } from '../../primitives/BasicModal'; 11 import { ModalWrapper } from '../FlowCommons/ModalWrapper'; 12 import { CollateralRepayModalContent } from './CollateralRepayModalContent'; 13 import { RepayModalContent } from './RepayModalContent'; 14 import { RepayType, RepayTypeSelector } from './RepayTypeSelector'; 15 16 export const RepayModal = () => { 17 const { type, close, args, mainTxState } = useModalContext() as ModalContextType<{ 18 underlyingAsset: string; 19 currentRateMode: InterestRate; 20 isFrozen: boolean; 21 }>; 22 const { userReserves } = useAppDataContext(); 23 const currentMarketData = useRootStore((store) => store.currentMarketData); 24 const [repayType, setRepayType] = useState(RepayType.BALANCE); 25 26 // repay with collateral is only possible: 27 // 1. on chains with paraswap deployed 28 // 2. when you have a different supplied(not necessarily collateral) asset then the one your debt is in 29 // For repaying your debt with the same assets aToken you can use repayWithAToken on aave protocol v3 30 const collateralRepayPossible = 31 isFeatureEnabled.collateralRepay(currentMarketData) && 32 userReserves.some( 33 (userReserve) => 34 userReserve.scaledATokenBalance !== '0' && 35 userReserve.underlyingAsset !== args.underlyingAsset 36 ); 37 38 const handleClose = () => { 39 setRepayType(RepayType.BALANCE); 40 close(); 41 }; 42 43 return ( 44 <BasicModal open={type === ModalType.Repay} setOpen={handleClose}> 45 <ModalWrapper title={<Trans>Repay</Trans>} underlyingAsset={args.underlyingAsset}> 46 {(params) => { 47 return ( 48 <UserAuthenticated> 49 {(user) => ( 50 <> 51 {collateralRepayPossible && !mainTxState.txHash && ( 52 <RepayTypeSelector repayType={repayType} setRepayType={setRepayType} /> 53 )} 54 {repayType === RepayType.BALANCE && <RepayModalContent {...params} user={user} />} 55 {repayType === RepayType.COLLATERAL && ( 56 <CollateralRepayModalContent 57 {...params} 58 debtType={args.currentRateMode} 59 user={user} 60 /> 61 )} 62 </> 63 )} 64 </UserAuthenticated> 65 ); 66 }} 67 </ModalWrapper> 68 </BasicModal> 69 ); 70 };