mirror of
https://github.com/luxfi/market.git
synced 2026-09-24 00:25:57 +00:00
98 lines
2.6 KiB
TypeScript
98 lines
2.6 KiB
TypeScript
import { useCollections } from '@reservoir0x/reservoir-kit-ui'
|
|
import { Text, Box, FormatCryptoCurrency, Grid } from 'components/primitives'
|
|
import { useMounted } from 'hooks'
|
|
import { FC, ReactNode } from 'react'
|
|
import { useMediaQuery } from 'react-responsive'
|
|
import { formatNumber } from 'utils/numbers'
|
|
|
|
type Props = {
|
|
label: string
|
|
children: ReactNode
|
|
}
|
|
|
|
const StatBox: FC<Props> = ({ label, children }) => (
|
|
<Box
|
|
css={{
|
|
p: '$4',
|
|
minWidth: 120,
|
|
background: '$panelBg',
|
|
}}
|
|
>
|
|
<Text style="subtitle3" css={{ color: '$gray12' }} as="p">
|
|
{label}
|
|
</Text>
|
|
{children}
|
|
</Box>
|
|
)
|
|
|
|
type StatHeaderProps = {
|
|
collection: NonNullable<ReturnType<typeof useCollections>['data']>['0']
|
|
}
|
|
|
|
const StatHeader: FC<StatHeaderProps> = ({ collection }) => {
|
|
const isMounted = useMounted()
|
|
const isSmallDevice = useMediaQuery({ maxWidth: 600 }) && isMounted
|
|
const listedPercentage =
|
|
((collection?.onSaleCount ? +collection.onSaleCount : 0) /
|
|
(collection?.tokenCount ? +collection.tokenCount : 0)) *
|
|
100
|
|
|
|
return (
|
|
<Grid
|
|
css={{
|
|
borderRadius: 8,
|
|
overflow: 'hidden',
|
|
gap: 1,
|
|
gridTemplateColumns: '1fr 1fr',
|
|
'@sm': {
|
|
gridTemplateColumns: '1fr 1fr 1fr 1fr 1fr',
|
|
marginRight: 'auto',
|
|
},
|
|
}}
|
|
>
|
|
<StatBox label="Floor">
|
|
<FormatCryptoCurrency
|
|
amount={collection?.floorAsk?.price?.amount?.decimal}
|
|
address={collection?.floorAsk?.price?.currency?.contract}
|
|
decimals={collection?.floorAsk?.price?.currency?.decimals}
|
|
logoHeight={18}
|
|
textStyle={'h6'}
|
|
maximumFractionDigits={4}
|
|
/>
|
|
</StatBox>
|
|
|
|
<StatBox label="Top Offer">
|
|
<FormatCryptoCurrency
|
|
amount={collection?.topBid?.price?.amount?.decimal}
|
|
address={collection?.topBid?.price?.currency?.contract}
|
|
decimals={collection?.topBid?.price?.currency?.decimals}
|
|
logoHeight={18}
|
|
textStyle={'h6'}
|
|
maximumFractionDigits={4}
|
|
/>
|
|
</StatBox>
|
|
|
|
{!isSmallDevice && (
|
|
<StatBox label="Listed">
|
|
<Text style="h6">{formatNumber(listedPercentage)}%</Text>
|
|
</StatBox>
|
|
)}
|
|
|
|
<StatBox label="Total Volume">
|
|
<FormatCryptoCurrency
|
|
amount={collection.volume?.allTime}
|
|
logoHeight={18}
|
|
textStyle={'h6'}
|
|
maximumFractionDigits={4}
|
|
/>
|
|
</StatBox>
|
|
|
|
<StatBox label="Count">
|
|
<Text style="h6">{formatNumber(collection?.tokenCount)}</Text>
|
|
</StatBox>
|
|
</Grid>
|
|
)
|
|
}
|
|
|
|
export default StatHeader
|