import { faCheck, faCircleExclamation } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { extractMediaType, TokenMedia, useDynamicTokens, } from '@reservoir0x/reservoir-kit-ui' import AddToCart from 'components/buttons/AddToCart' import BuyNow from 'components/buttons/BuyNow' import { Box, Flex, FormatCryptoCurrency, Text, Tooltip, } from 'components/primitives' import { ToastContext } from 'context/ToastContextProvider' import { useMarketplaceChain } from 'hooks' import Link from 'next/link' import { SyntheticEvent, useContext } from 'react' import { MutatorCallback } from 'swr' import { formatNumber } from 'utils/numbers' import { Address } from 'wagmi' type TokenCardProps = { token: ReturnType['data'][0] address?: Address rarityEnabled: boolean addToCartEnabled?: boolean showSource?: boolean showAsk?: boolean mutate?: MutatorCallback onMediaPlayed?: ( e: SyntheticEvent ) => void tokenCount?: string } export default ({ token, address, rarityEnabled = true, addToCartEnabled = true, showAsk = true, mutate, onMediaPlayed, tokenCount, showSource = true, }: TokenCardProps) => { const { addToast } = useContext(ToastContext) const mediaType = extractMediaType(token?.token) const showMedia = mediaType === 'mp4' || mediaType === 'mp3' || mediaType === 'm4a' || mediaType === 'wav' || mediaType === 'mov' const { routePrefix, proxyApi } = useMarketplaceChain() const tokenIsInCart = token && token?.isInCart const isOwner = token?.token?.owner?.toLowerCase() !== address?.toLowerCase() const is1155 = token?.token?.kind === 'erc1155' return ( a > div > img': { transform: 'scale(1.1)', }, '@sm': { '&:hover .token-button-container': { bottom: 0, }, }, }} > {tokenCount && ( x{tokenCount} )} {is1155 && token?.token?.supply && ( x{formatNumber(token?.token?.supply, 0, true)} )} { onMediaPlayed?.(e) }, }} videoOptions={{ onPlay: (e) => { onMediaPlayed?.(e) }, }} onRefreshToken={() => { mutate?.() addToast?.({ title: 'Refresh token', description: 'Request to refresh this token was accepted.', }) }} /> {token?.token?.name || '#' + token?.token?.tokenId}{' '} {rarityEnabled && !is1155 && token?.token?.rarityRank && ( {formatNumber(token?.token?.rarityRank)} )} {showAsk && ( {token?.market?.floorAsk?.price && ( )} {is1155 && token?.market?.floorAsk?.quantityRemaining ? ( x {formatNumber( token?.market?.floorAsk?.quantityRemaining, 0, true )} ) : null} {showSource && token?.market?.floorAsk?.source?.name ? ( { e.preventDefault() e.stopPropagation() const url = `${proxyApi}/redirect/sources/${token?.market?.floorAsk?.source?.domain}/tokens/${token?.token?.contract}:${token?.token?.tokenId}/link/v2` window.open(url, '_blank') }} src={`${proxyApi}/redirect/sources/${token?.market?.floorAsk?.source?.domain}/logo/v2`} /> ) : null} )} {token?.token?.lastSale?.price?.amount?.decimal ? ( Last Sale ) : null} {showAsk && isOwner && token?.market?.floorAsk?.price?.amount ? ( {addToCartEnabled ? ( ) : null} ) : null} ) }