mars-v2-frontend/src/components/Trade/TradeModule/SwapForm/TradeSummary.tsx
Bob van der Helm b35c743286
MP-2912 Margin trading implementation (#342)
* fix(useSWR): request hooks revalidation on focus disabled

* [trade] add margin

* [trade] include borrow rate in receipt

* [trade] add tooltip margin and pr comments

* updated regardign comments

---------

Co-authored-by: Yusuf Seyrek <yusuf@delphilabs.io>
2023-08-07 13:51:52 +03:00

102 lines
3.1 KiB
TypeScript

import classNames from 'classnames'
import { useMemo } from 'react'
import ActionButton from 'components/Button/ActionButton'
import useSwapRoute from 'hooks/useSwapRoute'
import { getAssetByDenom } from 'utils/assets'
import { hardcodedFee } from 'utils/constants'
import { formatAmountWithSymbol, formatPercent } from 'utils/formatters'
interface Props {
buyAsset: Asset
sellAsset: Asset
borrowRate?: number | null
buyButtonDisabled: boolean
containerClassName?: string
showProgressIndicator: boolean
isMargin?: boolean
borrowAmount: BigNumber
buyAction: () => void
}
export default function TradeSummary(props: Props) {
const {
buyAsset,
sellAsset,
borrowRate,
buyAction,
buyButtonDisabled,
containerClassName,
isMargin,
borrowAmount,
showProgressIndicator,
} = props
const { data: routes, isLoading: isRouteLoading } = useSwapRoute(sellAsset.denom, buyAsset.denom)
const parsedRoutes = useMemo(() => {
if (!routes.length) return '-'
const routeSymbols = routes.map((r) => getAssetByDenom(r.token_out_denom)?.symbol)
routeSymbols.unshift(sellAsset.symbol)
return routeSymbols.join(' -> ')
}, [routes, sellAsset.symbol])
const buttonText = useMemo(
() => (routes.length ? `Buy ${buyAsset.symbol}` : 'No route found'),
[buyAsset.symbol, routes],
)
return (
<div className={classNames(containerClassName, className.container)}>
<div className={className.summaryWrapper}>
<span className={className.title}>Summary</span>
<div className={className.infoLine}>
<span className={className.infoLineLabel}>Fees</span>
<span>{formatAmountWithSymbol(hardcodedFee.amount[0])}</span>
</div>
{isMargin && (
<>
<div className={className.infoLine}>
<span className={className.infoLineLabel}>Borrowing</span>
<span>
{formatAmountWithSymbol({
denom: sellAsset.denom,
amount: borrowAmount.toString(),
})}
</span>
</div>
<div className={className.infoLine}>
<span className={className.infoLineLabel}>Borrow rate</span>
<span>{formatPercent(borrowRate || 0)}</span>
</div>
</>
)}
<div className={className.infoLine}>
<span className={className.infoLineLabel}>Route</span>
<span>{parsedRoutes}</span>
</div>
</div>
<ActionButton
disabled={routes.length === 0 || buyButtonDisabled}
showProgressIndicator={showProgressIndicator || isRouteLoading}
text={buttonText}
onClick={buyAction}
size='md'
color='primary'
className='w-full'
/>
</div>
)
}
const className = {
container:
'flex flex-1 flex-col bg-white bg-opacity-5 rounded border-[1px] border-white border-opacity-20 ',
title: 'text-xs font-bold mb-2',
summaryWrapper: 'flex flex-1 flex-col m-3',
infoLine: 'flex flex-1 flex-row text-xs text-white justify-between mb-1',
infoLineLabel: 'opacity-40',
}