// import { useTranslation } from 'next-i18next' import { useEffect, useState } from 'react' import { useAuctionHouse, useBids, useListings, useLoadBids, } from 'hooks/market/useAuctionHouse' import { toUiDecimals } from '@blockworks-foundation/mango-v4' import { MANGO_MINT_DECIMALS } from 'utils/governance/constants' import { useWallet } from '@solana/wallet-adapter-react' import metaplexStore from '@store/metaplexStore' import { Bid, Listing, PublicBid, PublicKey } from '@metaplex-foundation/js' import BidNftModal from './BidNftModal' import mangoStore from '@store/mangoStore' import { Table, TableDateDisplay, Td, Th, TrBody, TrHead, } from '@components/shared/TableElements' import { ImgWithLoader } from '@components/ImgWithLoader' import NftMarketButton from './NftMarketButton' import { abbreviateAddress } from 'utils/formatting' import EmptyState from './EmptyState' import { formatNumericValue } from 'utils/numbers' import Loading from '@components/shared/Loading' import { notify } from 'utils/notifications' import SheenLoader from '@components/shared/SheenLoader' const AllBidsView = () => { const { publicKey } = useWallet() const { data: auctionHouse } = useAuctionHouse() const metaplex = metaplexStore((s) => s.metaplex) // const { t } = useTranslation(['nft-market']) const [showBidModal, setShowBidModal] = useState(false) const [bidListing, setBidListing] = useState(null) const [buying, setBuying] = useState('') const [cancellingBid, setCancellingBid] = useState('') const [accepting, setAccepting] = useState('') const { data: bids, refetch } = useBids() const bidsToLoad = bids ? bids : [] const { data: loadedBids, isLoading: loadingBids, isFetching: fetchingBids, } = useLoadBids(bidsToLoad) const connection = mangoStore((s) => s.connection) const fetchNfts = mangoStore((s) => s.actions.fetchNfts) const nfts = mangoStore((s) => s.wallet.nfts.data) const { data: listings } = useListings() useEffect(() => { if (publicKey) { fetchNfts(connection, publicKey!) } }, [publicKey]) const cancelBid = async (bid: Bid) => { setCancellingBid(bid.asset.mint.address.toString()) try { const { response } = await metaplex!.auctionHouse().cancelBid({ auctionHouse: auctionHouse!, bid, }) refetch() if (response) { notify({ title: 'Transaction confirmed', type: 'success', txid: response.signature, }) } } catch (e) { console.log('error cancelling bid', e) } finally { setCancellingBid('') } } const sellAsset = async (bid: Bid, tokenAccountPk: string) => { setAccepting(bid.asset.mint.address.toString()) try { const tokenAccount = await metaplex ?.tokens() .findTokenByAddress({ address: new PublicKey(tokenAccountPk) }) const { response } = await metaplex!.auctionHouse().sell({ auctionHouse: auctionHouse!, bid: bid as PublicBid, sellerToken: tokenAccount!, }) refetch() if (response) { notify({ title: 'Transaction confirmed', type: 'success', txid: response.signature, }) } } catch (e) { console.log('error accepting offer', e) } finally { setAccepting('') } } const buyAsset = async (listing: Listing) => { setBuying(listing.asset.mint.address.toString()) try { const { response } = await metaplex!.auctionHouse().buy({ auctionHouse: auctionHouse!, listing, }) refetch() if (response) { notify({ title: 'Transaction confirmed', type: 'success', txid: response.signature, }) } } catch (e) { console.log('error buying nft', e) } finally { setBuying('') } } const openBidModal = (listing: Listing) => { setBidListing(listing) setShowBidModal(true) } const loading = loadingBids || fetchingBids return ( <>
{loadedBids && loadedBids?.length ? ( {loadedBids .sort((a, b) => b.createdAt.toNumber() - a.createdAt.toNumber()) .map((x, idx) => { const listing = listings?.results?.find( (nft: Listing) => nft.asset.mint.address.toString() === x.asset.mint.address.toString(), ) return ( ) })}
Date NFT Offer Buy Now Price Buyer Actions

{x.asset.json?.name || 'Unknown'}

{x.asset.json?.collection?.family || 'Unknown'}

{formatNumericValue( toUiDecimals( x.price.basisPoints.toNumber(), MANGO_MINT_DECIMALS, ), )} {' MNGO'}

{listing ? ( <> {formatNumericValue( toUiDecimals( listing.price.basisPoints.toNumber(), MANGO_MINT_DECIMALS, ), )} {' MNGO'} ) : ( '–' )}

{abbreviateAddress(x.buyerAddress)}

{publicKey && !x.buyerAddress.equals(publicKey) && nfts.find( (ownNft) => ownNft.mint === x.asset.address.toBase58(), ) ? ( sellAsset( x, nfts.find( (ownNft) => ownNft.mint === x.asset.address.toBase58(), )!.tokenAccount, ) } colorClass="fgd-3" text={ accepting === x.asset.mint.address.toString() ? ( ) : ( 'Accept Offer' ) } /> ) : ( <> {publicKey && x.buyerAddress.equals(publicKey) ? ( ) : ( 'Cancel Offer' ) } onClick={() => cancelBid(x)} /> ) : listing ? ( openBidModal(listing)} /> ) : null} {listing ? ( ) : ( 'Buy Now' ) } onClick={() => buyAsset(listing)} /> ) : null} )}
) : loading ? (
{[...Array(4)].map((x, i) => (
))}
) : ( )}
{showBidModal ? ( setShowBidModal(false)} /> ) : null} ) } export default AllBidsView