import { toUiDecimals } from '@blockworks-foundation/mango-v4' import Select from '@components/forms/Select' import BidNftModal from '@components/nftMarket/BidNftModal' import AssetBidsModal from '@components/nftMarket/AssetBidsModal' import { Listing } from '@metaplex-foundation/js' import { useWallet } from '@solana/wallet-adapter-react' import metaplexStore from '@store/metaplexStore' import { ALL_FILTER, PRICE_LOW_HIGH, YOUR_LISTINGS, useAuctionHouse, useBids, useLazyListings, useListings, } from 'hooks/market/useAuctionHouse' import { useEffect, useState } from 'react' import { MANGO_MINT_DECIMALS } from 'utils/governance/constants' // import { useTranslation } from 'next-i18next' import { ImgWithLoader } from '@components/ImgWithLoader' import NftMarketButton from './NftMarketButton' import { formatNumericValue } from 'utils/numbers' import Loading from '@components/shared/Loading' import SheenLoader from '@components/shared/SheenLoader' import EmptyState from './EmptyState' import { notify } from 'utils/notifications' import ResponsivePagination from 'react-responsive-pagination' const PRICE_HIGH_LOW = 'Price: High to Low' const defaultFilters = [ ALL_FILTER, YOUR_LISTINGS, PRICE_LOW_HIGH, PRICE_HIGH_LOW, ] const ListingsView = () => { const { publicKey } = useWallet() const metaplex = metaplexStore((s) => s.metaplex) // const { t } = useTranslation(['nft-market']) const [currentFilter, setCurrentFilter] = useState(ALL_FILTER) const { data: bids } = useBids() const [bidListing, setBidListing] = useState(null) const [assetBidsListing, setAssetBidsListing] = useState(null) const { data: auctionHouse } = useAuctionHouse() const [asssetBidsModal, setAssetBidsModal] = useState(false) const [bidNftModal, setBidNftModal] = useState(false) const [cancellingListing, setCancellingListing] = useState('') const [buying, setBuying] = useState('') const [page, setPage] = useState(1) const { refetch } = useLazyListings() const { data: listings, isLoading: loadingListings, isFetching: fetchingListings, } = useListings(currentFilter, page) const [listingsToShow, setListingsToShow] = useState( undefined, ) useEffect(() => { if (!loadingListings && !fetchingListings) { setListingsToShow(listings ? listings.results : []) } }, [listings, loadingListings, fetchingListings]) const cancelListing = async (listing: Listing) => { setCancellingListing(listing.asset.mint.address.toString()) try { const { response } = await metaplex!.auctionHouse().cancelListing({ auctionHouse: auctionHouse!, listing: listing, }) refetch() if (response) { notify({ title: 'Transaction confirmed', type: 'success', txid: response.signature, }) } } catch (e) { console.log('error cancelling listing', e) } finally { setCancellingListing('') } } 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) setBidNftModal(true) } const closeBidModal = () => { setBidNftModal(false) setBidListing(null) } const openBidsModal = (listing: Listing) => { setAssetBidsModal(true) setAssetBidsListing(listing) } const closeBidsModal = () => { setAssetBidsModal(false) setAssetBidsListing(null) } const handlePageClick = (page: number) => { setPage(page) } const filters = defaultFilters const handleFilter = (filter: string) => { setCurrentFilter(filter) } const loading = loadingListings || fetchingListings return (

{`Filter Results`}

{listingsToShow && listingsToShow.length ? ( listingsToShow.map((x, idx) => { const imgSource = x.asset.json?.image const nftBids = bids?.filter((bid) => bid.metadataAddress.equals(x.asset.metadataAddress), ) const bestBid = nftBids ? nftBids.reduce((a, c) => { const price = toUiDecimals( c.price.basisPoints.toNumber(), MANGO_MINT_DECIMALS, ) if (price > a) { a = price } return a }, 0) : 0 return (
{imgSource ? (
) : null}

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

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

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

{bestBid ? `Best Offer: ${bestBid} MNGO` : 'No offers'}

{publicKey && !x.sellerAddress.equals(publicKey) && (
) : ( 'Buy Now' ) } colorClass="success" onClick={() => buyAsset(x)} /> openBidModal(x)} />
)} {publicKey && x.sellerAddress.equals(publicKey) && (
) : ( 'Delist' ) } colorClass="error" onClick={() => cancelListing(x)} /> openBidsModal(x)} />
)}
) }) ) : loading ? ( [...Array(4)].map((x, i) => (
)) ) : (
)}
{asssetBidsModal && assetBidsListing ? ( ) : null} {bidNftModal && bidListing ? ( ) : null}
) } export default ListingsView