feat: vault modal header (#323)
* feat: vault modal header * fix: displaying zero values * feat: code comments
This commit is contained in:
		
							parent
							
								
									184a27e987
								
							
						
					
					
						commit
						bd07c20e47
					
				| @ -20,7 +20,7 @@ function DetailsHeader({ data }: Props) { | ||||
|         <> | ||||
|           <TitleAndSubCell | ||||
|             title={ | ||||
|               <> | ||||
|               <div className='flex flex-row'> | ||||
|                 <FormattedNumber amount={assetApy.toNumber()} options={{ suffix: '%' }} animate /> | ||||
|                 <FormattedNumber | ||||
|                   className='ml-2 text-xs' | ||||
| @ -28,7 +28,7 @@ function DetailsHeader({ data }: Props) { | ||||
|                   options={{ suffix: '%/day' }} | ||||
|                   animate | ||||
|                 /> | ||||
|               </> | ||||
|               </div> | ||||
|             } | ||||
|             sub={'APY'} | ||||
|           /> | ||||
|  | ||||
							
								
								
									
										73
									
								
								src/components/Modals/Vault/VaultModalContentHeader.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/components/Modals/Vault/VaultModalContentHeader.tsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,73 @@ | ||||
| import { useMemo } from 'react' | ||||
| 
 | ||||
| import DisplayCurrency from 'components/DisplayCurrency' | ||||
| import { FormattedNumber } from 'components/FormattedNumber' | ||||
| import TitleAndSubCell from 'components/TitleAndSubCell' | ||||
| import { BN_ZERO } from 'constants/math' | ||||
| import { BNCoin } from 'types/classes/BNCoin' | ||||
| import { PRICE_ORACLE_DECIMALS } from 'constants/query' | ||||
| import { BN } from 'utils/helpers' | ||||
| 
 | ||||
| interface Props { | ||||
|   vault: Vault | DepositedVault | ||||
| } | ||||
| 
 | ||||
| export default function VaultModalContentHeader({ vault }: Props) { | ||||
|   const depositedValue = useMemo(() => { | ||||
|     if ('values' in vault) { | ||||
|       const value = vault.values.primary | ||||
|         .plus(vault.values.secondary) | ||||
|         .shiftedBy(-PRICE_ORACLE_DECIMALS) | ||||
| 
 | ||||
|       // To eliminate super small leftover amounts
 | ||||
|       // If USD value is smaller than 0.001 returns 0
 | ||||
|       return BN(value.toFixed(PRICE_ORACLE_DECIMALS / 2)) | ||||
|     } else { | ||||
|       return BN_ZERO | ||||
|     } | ||||
|   }, [vault]) | ||||
| 
 | ||||
|   return ( | ||||
|     <div className='flex gap-6 border-b border-white/5 px-6 py-4 gradient-header'> | ||||
|       {vault.apy && ( | ||||
|         <> | ||||
|           <TitleAndSubCell | ||||
|             title={ | ||||
|               <div className='flex flex-row'> | ||||
|                 <FormattedNumber | ||||
|                   amount={vault.apy} | ||||
|                   options={{ suffix: '%', decimals: -2 }} | ||||
|                   animate | ||||
|                 /> | ||||
|                 <FormattedNumber | ||||
|                   className='ml-2 text-xs' | ||||
|                   amount={vault.apy / 365} | ||||
|                   options={{ suffix: '%/day', decimals: -2 }} | ||||
|                   animate | ||||
|                 /> | ||||
|               </div> | ||||
|             } | ||||
|             sub={'Deposit APY'} | ||||
|           /> | ||||
|           <div className='h-100 w-[1px] bg-white/10'></div> | ||||
|         </> | ||||
|       )} | ||||
|       {!depositedValue.isZero() && ( | ||||
|         <> | ||||
|           <TitleAndSubCell | ||||
|             title={<DisplayCurrency coin={BNCoin.fromDenomAndBigNumber('usd', depositedValue)} />} | ||||
|             sub={'Deposited'} | ||||
|           /> | ||||
|           <div className='h-100 w-[1px] bg-white/10'></div> | ||||
|         </> | ||||
|       )} | ||||
| 
 | ||||
|       <TitleAndSubCell | ||||
|         title={ | ||||
|           <DisplayCurrency coin={BNCoin.fromDenomAndBigNumber(vault.cap.denom, vault.cap.max)} /> | ||||
|         } | ||||
|         sub={'Deposit Cap'} | ||||
|       /> | ||||
|     </div> | ||||
|   ) | ||||
| } | ||||
| @ -1,3 +1,6 @@ | ||||
| import { useCallback, useMemo } from 'react' | ||||
| import moment from 'moment' | ||||
| 
 | ||||
| import VaultLogo from 'components/Earn/Farm/VaultLogo' | ||||
| import Modal from 'components/Modal' | ||||
| import VaultModalContent from 'components/Modals/Vault/VaultModalContent' | ||||
| @ -5,6 +8,9 @@ import Text from 'components/Text' | ||||
| import { ASSETS } from 'constants/assets' | ||||
| import useCurrentAccount from 'hooks/useCurrentAccount' | ||||
| import useStore from 'store' | ||||
| import VaultModalContentHeader from 'components/Modals/Vault/VaultModalContentHeader' | ||||
| import { InfoCircle } from 'components/Icons' | ||||
| import { Tooltip } from 'components/Tooltip' | ||||
| 
 | ||||
| export default function VaultModalController() { | ||||
|   const currentAccount = useCurrentAccount() | ||||
| @ -32,28 +38,50 @@ interface Props { | ||||
| } | ||||
| 
 | ||||
| function VaultModal(props: Props) { | ||||
|   function onClose() { | ||||
|   const { | ||||
|     modal: { vault, isDeposited }, | ||||
|     primaryAsset, | ||||
|     secondaryAsset, | ||||
|     currentAccount, | ||||
|   } = props | ||||
| 
 | ||||
|   const onClose = useCallback(() => { | ||||
|     useStore.setState({ vaultModal: null }) | ||||
|   } | ||||
|   }, []) | ||||
| 
 | ||||
|   const unlockTime = useMemo(() => { | ||||
|     if ('unlocksAt' in vault && vault.unlocksAt) { | ||||
|       return moment(vault.unlocksAt) | ||||
|     } | ||||
|   }, [vault]) | ||||
| 
 | ||||
|   return ( | ||||
|     <Modal | ||||
|       onClose={onClose} | ||||
|       header={ | ||||
|         <span className='flex items-center gap-4 px-4'> | ||||
|           <VaultLogo vault={props.modal.vault} /> | ||||
|           <Text>{props.modal.vault.name}</Text> | ||||
|         <span className='flex items-center px-4'> | ||||
|           <VaultLogo vault={vault} /> | ||||
|           <Text className='pl-3 pr-2'>{vault.name}</Text> | ||||
|           {unlockTime && ( | ||||
|             <Tooltip | ||||
|               content={`Account position for this vault unlocks at ${unlockTime}`} | ||||
|               type={'info'} | ||||
|             > | ||||
|               <InfoCircle width={16} height={16} /> | ||||
|             </Tooltip> | ||||
|           )} | ||||
|         </span> | ||||
|       } | ||||
|       headerClassName='gradient-header pl-2 pr-2.5 py-2.5 border-b-white/5 border-b' | ||||
|       contentClassName='flex flex-col' | ||||
|     > | ||||
|       <VaultModalContentHeader vault={vault} /> | ||||
|       <VaultModalContent | ||||
|         vault={props.modal.vault} | ||||
|         primaryAsset={props.primaryAsset} | ||||
|         secondaryAsset={props.secondaryAsset} | ||||
|         account={props.currentAccount} | ||||
|         isDeposited={props.modal.isDeposited} | ||||
|         vault={vault} | ||||
|         primaryAsset={primaryAsset} | ||||
|         secondaryAsset={secondaryAsset} | ||||
|         account={currentAccount} | ||||
|         isDeposited={isDeposited} | ||||
|       /> | ||||
|     </Modal> | ||||
|   ) | ||||
|  | ||||
							
								
								
									
										2
									
								
								src/types/interfaces/vaults.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/types/interfaces/vaults.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -45,7 +45,7 @@ interface VaultValuesAndAmounts { | ||||
|     secondary: BigNumber | ||||
|     locked: BigNumber | ||||
|     unlocked: BigNumber | ||||
|     unlocking: BigNumer | ||||
|     unlocking: BigNumber | ||||
|   } | ||||
|   values: { | ||||
|     primary: BigNumber | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user