mirror of
https://github.com/luxfi/market.git
synced 2026-09-24 00:25:57 +00:00
140 lines
4.4 KiB
TypeScript
140 lines
4.4 KiB
TypeScript
import { useTokens } from '@reservoir0x/reservoir-kit-ui'
|
|
import { Flex, FormatCryptoCurrency, Text } from 'components/primitives'
|
|
import { useMarketplaceChain } from 'hooks'
|
|
import { FC } from 'react'
|
|
import { formatDollar } from 'utils/numbers'
|
|
|
|
type Props = {
|
|
token: ReturnType<typeof useTokens>['data'][0] | null
|
|
}
|
|
|
|
export const PriceData: FC<Props> = ({ token }) => {
|
|
const { reservoirBaseUrl } = useMarketplaceChain()
|
|
const listSourceName = token?.market?.floorAsk?.source?.name as
|
|
| string
|
|
| undefined
|
|
const listSourceDomain = token?.market?.floorAsk?.source?.domain as
|
|
| string
|
|
| undefined
|
|
|
|
const offerSourceName = token?.market?.topBid?.source?.name as
|
|
| string
|
|
| undefined
|
|
const offerSourceDomain = token?.market?.topBid?.source?.domain as
|
|
| string
|
|
| undefined
|
|
|
|
const listSourceLogo = `${reservoirBaseUrl}/redirect/sources/${
|
|
listSourceDomain || listSourceName
|
|
}/logo/v2`
|
|
|
|
const offerSourceLogo = `${reservoirBaseUrl}/redirect/sources/${
|
|
offerSourceDomain || offerSourceName
|
|
}/logo/v2`
|
|
|
|
const listSourceRedirect = `${reservoirBaseUrl}/redirect/sources/${
|
|
listSourceDomain || listSourceName
|
|
}/tokens/${token?.token?.contract}:${token?.token?.tokenId}/link/v2`
|
|
|
|
const offerSourceRedirect = `${reservoirBaseUrl}/redirect/sources/${
|
|
offerSourceDomain || offerSourceName
|
|
}/tokens/${token?.token?.contract}:${token?.token?.tokenId}/link/v2`
|
|
|
|
return (
|
|
<Flex css={{ gap: '$6', pt: '$4', pb: '$5' }}>
|
|
<Flex direction="column" align="start" css={{ gap: '$1' }}>
|
|
<Text style="subtitle2">Price</Text>
|
|
<Flex
|
|
align="center"
|
|
css={{
|
|
flexDirection: 'column',
|
|
'@bp400': { flexDirection: 'row', gap: '$2' },
|
|
}}
|
|
>
|
|
<FormatCryptoCurrency
|
|
amount={token?.market?.floorAsk?.price?.amount?.decimal}
|
|
address={token?.market?.floorAsk?.price?.currency?.contract}
|
|
decimals={token?.market?.floorAsk?.price?.currency?.decimals}
|
|
textStyle="h4"
|
|
logoHeight={20}
|
|
maximumFractionDigits={4}
|
|
/>
|
|
{token?.market?.floorAsk?.price?.amount?.usd && (
|
|
<Text style="body2" css={{ color: '$gray11' }} ellipsify>
|
|
{formatDollar(
|
|
token?.market?.floorAsk?.price?.amount?.usd as number
|
|
)}
|
|
</Text>
|
|
)}
|
|
</Flex>
|
|
{listSourceName && (
|
|
<a
|
|
href={listSourceRedirect}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
<Flex
|
|
align="center"
|
|
css={{
|
|
borderRadius: 4,
|
|
gap: '$1',
|
|
width: 'max-content',
|
|
}}
|
|
>
|
|
<img width="20px" height="20px" src={listSourceLogo} />
|
|
<Text style="body2" css={{ color: '$gray11' }}>
|
|
{listSourceName}
|
|
</Text>
|
|
</Flex>
|
|
</a>
|
|
)}
|
|
</Flex>
|
|
<Flex direction="column" align="start" css={{ gap: '$1' }}>
|
|
<Text style="subtitle2">Top Offer</Text>
|
|
<Flex
|
|
align="center"
|
|
css={{
|
|
flexDirection: 'column',
|
|
'@bp400': { flexDirection: 'row', gap: '$2' },
|
|
}}
|
|
>
|
|
<FormatCryptoCurrency
|
|
amount={token?.market?.topBid?.price?.amount?.decimal}
|
|
address={token?.market?.topBid?.price?.currency?.contract}
|
|
decimals={token?.market?.topBid?.price?.currency?.decimals}
|
|
textStyle="h4"
|
|
logoHeight={20}
|
|
maximumFractionDigits={4}
|
|
/>
|
|
{token?.market?.topBid?.price?.amount?.usd && (
|
|
<Text style="body2" css={{ color: '$gray11' }} ellipsify>
|
|
{formatDollar(token?.market?.topBid?.price?.amount?.usd)}
|
|
</Text>
|
|
)}
|
|
</Flex>
|
|
{offerSourceName && (
|
|
<a
|
|
href={offerSourceRedirect}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
<Flex
|
|
align="center"
|
|
css={{
|
|
borderRadius: 4,
|
|
gap: '$1',
|
|
width: 'max-content',
|
|
}}
|
|
>
|
|
<img width="20px" height="20px" src={offerSourceLogo} />
|
|
<Text style="body2" css={{ color: '$gray11' }}>
|
|
{offerSourceName}
|
|
</Text>
|
|
</Flex>
|
|
</a>
|
|
)}
|
|
</Flex>
|
|
</Flex>
|
|
)
|
|
}
|