mango-v4-ui/components/modals/SpotMarketDetailsModal.tsx

122 lines
4.2 KiB
TypeScript
Raw Normal View History

2023-04-26 20:39:49 -07:00
import { ModalProps } from '../../types/modal'
import Modal from '../shared/Modal'
import { useTranslation } from 'next-i18next'
import useSelectedMarket from 'hooks/useSelectedMarket'
import { Serum3Market } from '@blockworks-foundation/mango-v4'
import Button from '@components/shared/Button'
import useOracleProvider from 'hooks/useOracleProvider'
import { ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid'
2023-05-02 10:47:26 -07:00
import useMangoGroup from 'hooks/useMangoGroup'
import { useMemo } from 'react'
import Tooltip from '@components/shared/Tooltip'
2023-04-26 20:39:49 -07:00
interface SpotMarketDetailsModalProps {
market: Serum3Market | undefined
}
type ModalCombinedProps = SpotMarketDetailsModalProps & ModalProps
const SpotMarketDetailsModal = ({
isOpen,
onClose,
market,
}: ModalCombinedProps) => {
const { t } = useTranslation(['common', 'trade'])
const { serumOrPerpMarket } = useSelectedMarket()
const { oracleProvider, oracleLinkPath } = useOracleProvider()
2023-05-02 10:47:26 -07:00
const { group } = useMangoGroup()
2023-04-26 20:39:49 -07:00
2023-05-02 10:47:26 -07:00
const [baseBank, quoteBank] = useMemo(() => {
if (!group || !market) return [undefined, undefined]
const base = group.getFirstBankByTokenIndex(market.baseTokenIndex)
const quote = group.getFirstBankByTokenIndex(market.quoteTokenIndex)
return [base, quote]
}, [group, market])
2023-04-26 20:39:49 -07:00
2023-05-02 10:47:26 -07:00
const [baseMintInfo, quoteMintInfo] = useMemo(() => {
if (!baseBank || !quoteBank) return [undefined, undefined]
const base = group!.mintInfosMapByMint.get(baseBank.mint.toString())
const quote = group!.mintInfosMapByMint.get(quoteBank.mint.toString())
return [base, quote]
}, [baseBank, quoteBank])
2023-04-26 20:39:49 -07:00
return market && serumOrPerpMarket ? (
<Modal isOpen={isOpen} onClose={onClose}>
<h2 className="text-center text-lg">
{t('trade:market-details', { market: market.name })}
</h2>
<div className="mt-4 space-y-2.5">
<div className="flex justify-between">
<p>{t('trade:min-order-size')}</p>
<p className="font-mono text-th-fgd-2">
{serumOrPerpMarket.minOrderSize}
</p>
</div>
<div className="flex justify-between">
<p>{t('trade:tick-size')}</p>
<p className="font-mono text-th-fgd-2">
{serumOrPerpMarket.tickSize}
</p>
</div>
<div className="flex justify-between">
<p>{t('trade:max-leverage')}</p>
<p className="font-mono text-th-fgd-2">5x</p>
</div>
<div className="flex justify-between">
<p>{t('trade:oracle')}</p>
{oracleLinkPath ? (
<a
className="flex items-center"
href={oracleLinkPath}
target="_blank"
rel="noopener noreferrer"
>
<span className="mr-1.5">{oracleProvider}</span>
<ArrowTopRightOnSquareIcon className="h-4 w-4" />
</a>
) : (
<p className="text-th-fgd-2">{oracleProvider}</p>
)}
</div>
2023-05-02 10:47:26 -07:00
{baseMintInfo ? (
2023-04-26 20:39:49 -07:00
<div className="flex justify-between">
<Tooltip
content={t('trade:tooltip-insured', {
tokenOrMarket: baseBank!.name,
})}
>
<p className="tooltip-underline">
{t('trade:insured', { token: baseBank!.name })}
</p>
</Tooltip>
<p className="font-mono text-th-fgd-2">
{baseMintInfo.groupInsuranceFund ? t('yes') : t('no')}
</p>
</div>
) : null}
{quoteMintInfo ? (
<div className="flex justify-between">
<Tooltip
content={t('trade:tooltip-insured', {
tokenOrMarket: quoteBank!.name,
})}
>
<p className="tooltip-underline">
{t('trade:insured', { token: quoteBank!.name })}
</p>
</Tooltip>
<p className="font-mono text-th-fgd-2">
{quoteMintInfo.groupInsuranceFund ? t('yes') : t('no')}
</p>
</div>
2023-05-02 10:47:26 -07:00
) : null}
2023-04-26 20:39:49 -07:00
</div>
<Button className="mt-6 w-full" onClick={onClose}>
{t('close')}
</Button>
</Modal>
) : null
}
export default SpotMarketDetailsModal