Merge pull request #3 from thirdweb-dev/am/listing
Display all NFTs on marketplace listing
This commit is contained in:
@@ -1,10 +1,9 @@
|
||||
import { useActiveChainId, useWeb3 } from ".";
|
||||
import { useQueryWithNetwork } from "./query/useQueryWithNetwork";
|
||||
import { AlchemyWeb3, createAlchemyWeb3 } from "@alch/alchemy-web3";
|
||||
|
||||
import { alchemyUrlMap } from "components/app-layouts/providers";
|
||||
import { useEffect, useState } from "react";
|
||||
import { SUPPORTED_CHAIN_ID } from "utils/network";
|
||||
import { useActiveChainId, useWeb3 } from ".";
|
||||
import { useQueryWithNetwork } from "./query/useQueryWithNetwork";
|
||||
|
||||
export function useAlchemy() {
|
||||
const activeChainId = useActiveChainId();
|
||||
@@ -24,9 +23,11 @@ export function useAlchemy() {
|
||||
export type WalletNftData = {
|
||||
contractAddress: string;
|
||||
tokenId: number;
|
||||
tokenType: "ERC1155" | "ERC721";
|
||||
image: string;
|
||||
name?: string;
|
||||
tokenType: "erc1155" | "erc721";
|
||||
image?: string;
|
||||
metadata?: {
|
||||
[key: string]: any;
|
||||
};
|
||||
};
|
||||
|
||||
export function useWalletNFTs() {
|
||||
@@ -43,20 +44,35 @@ export function useWalletNFTs() {
|
||||
const data = await alchemy.getNfts({ owner: address });
|
||||
const nftData = data.ownedNfts
|
||||
.map((nft) => {
|
||||
if (!nft.contract.address) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if ((nft as any).metadata && (nft as any).metadata.image) {
|
||||
return {
|
||||
contractAddress: nft.contract.address,
|
||||
tokenId: parseInt(nft.id.tokenId, 16),
|
||||
...(nft as any).metadata,
|
||||
metadata: (nft as any).metadata,
|
||||
image: (nft as any).metadata?.image.replace(
|
||||
"ipfs://",
|
||||
`${process.env.NEXT_PUBLIC_IPFS_GATEWAY_URL}/`,
|
||||
),
|
||||
tokenType: nft.id.tokenMetadata?.tokenType,
|
||||
};
|
||||
} else if ((nft as any).metadata) {
|
||||
return {
|
||||
contractAddress: nft.contract.address,
|
||||
tokenId: parseInt(nft.id.tokenId, 16),
|
||||
metadata: (nft as any).metadata,
|
||||
tokenType: nft.id.tokenMetadata?.tokenType,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
contractAddress: nft.contract.address,
|
||||
tokenId: parseInt(nft.id.tokenId, 16),
|
||||
tokenType: nft.id.tokenMetadata?.tokenType,
|
||||
};
|
||||
}
|
||||
|
||||
return null;
|
||||
})
|
||||
.filter((nft) => !!nft);
|
||||
|
||||
|
||||
@@ -15,11 +15,13 @@ import {
|
||||
FormHelperText,
|
||||
FormLabel,
|
||||
Heading,
|
||||
Icon,
|
||||
Image,
|
||||
Input,
|
||||
Select,
|
||||
Spinner,
|
||||
Stack,
|
||||
Text,
|
||||
Tooltip,
|
||||
useModalContext,
|
||||
} from "@chakra-ui/react";
|
||||
@@ -30,6 +32,7 @@ import { CurrencySelector } from "components/shared/CurrencySelector";
|
||||
import { useTxNotifications } from "hooks/useTxNotifications";
|
||||
import React from "react";
|
||||
import { useForm } from "react-hook-form";
|
||||
import { FaImage } from "react-icons/fa";
|
||||
|
||||
const LIST_FORM_ID = "marketplace-list-form";
|
||||
interface IMarketplaceListForm {
|
||||
@@ -151,25 +154,102 @@ export const MarketplaceListForm: React.FC<IMarketplaceListForm> = ({
|
||||
</FormHelperText>
|
||||
{nfts?.length ? (
|
||||
<Flex gap={2} flexWrap="wrap">
|
||||
{nfts.map((nft, id) => (
|
||||
<Tooltip key={id} label={nft.name || ""}>
|
||||
<Image
|
||||
src={nft.image}
|
||||
width="140px"
|
||||
height="140px"
|
||||
alt={nft.name || ""}
|
||||
borderRadius="md"
|
||||
cursor="pointer"
|
||||
onClick={() =>
|
||||
isSelected(nft)
|
||||
? setValue("selected", undefined)
|
||||
: setValue("selected", nft)
|
||||
}
|
||||
border={isSelected(nft) ? "5px solid" : undefined}
|
||||
borderColor={isSelected(nft) ? "purple.500" : undefined}
|
||||
/>
|
||||
</Tooltip>
|
||||
))}
|
||||
{nfts.map((nft, id) => {
|
||||
if (nft.image) {
|
||||
return (
|
||||
<Tooltip
|
||||
key={id}
|
||||
label={`
|
||||
Name: ${nft.metadata?.name} |
|
||||
Contract: ${nft.contractAddress} |
|
||||
Token ID: ${nft.tokenId} |
|
||||
Token Type: ${nft.tokenType}
|
||||
`}
|
||||
>
|
||||
<Image
|
||||
src={nft.image}
|
||||
width="140px"
|
||||
height="140px"
|
||||
alt={nft.metadata?.name || ""}
|
||||
borderRadius="md"
|
||||
cursor="pointer"
|
||||
onClick={() =>
|
||||
isSelected(nft)
|
||||
? setValue("selected", undefined)
|
||||
: setValue("selected", nft)
|
||||
}
|
||||
border={isSelected(nft) ? "5px solid" : undefined}
|
||||
borderColor={
|
||||
isSelected(nft) ? "purple.500" : undefined
|
||||
}
|
||||
/>
|
||||
</Tooltip>
|
||||
);
|
||||
}
|
||||
|
||||
if (nft.metadata && nft.metadata.name) {
|
||||
return (
|
||||
<Tooltip
|
||||
key={id}
|
||||
label={`
|
||||
Name: ${nft.metadata?.name} |
|
||||
Contract: ${nft.contractAddress} |
|
||||
Token ID: ${nft.tokenId} |
|
||||
Token Type: ${nft.tokenType}
|
||||
`}
|
||||
>
|
||||
<Center
|
||||
flexDirection="column"
|
||||
width="140px"
|
||||
height="140px"
|
||||
borderRadius="md"
|
||||
cursor="pointer"
|
||||
onClick={() =>
|
||||
isSelected(nft)
|
||||
? setValue("selected", undefined)
|
||||
: setValue("selected", nft)
|
||||
}
|
||||
border={isSelected(nft) ? "5px solid" : undefined}
|
||||
borderColor={
|
||||
isSelected(nft) ? "purple.500" : undefined
|
||||
}
|
||||
bg="gray.200"
|
||||
>
|
||||
<Text>{nft.metadata?.name}</Text>
|
||||
</Center>
|
||||
</Tooltip>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Tooltip
|
||||
key={id}
|
||||
label={`
|
||||
Contract: ${nft.contractAddress} |
|
||||
Token ID: ${nft.tokenId} |
|
||||
Token Type: ${nft.tokenType}
|
||||
`}
|
||||
>
|
||||
<Center
|
||||
flexDirection="column"
|
||||
width="140px"
|
||||
height="140px"
|
||||
borderRadius="md"
|
||||
cursor="pointer"
|
||||
onClick={() =>
|
||||
isSelected(nft)
|
||||
? setValue("selected", undefined)
|
||||
: setValue("selected", nft)
|
||||
}
|
||||
border={isSelected(nft) ? "5px solid" : undefined}
|
||||
borderColor={isSelected(nft) ? "purple.500" : undefined}
|
||||
bg="gray.200"
|
||||
>
|
||||
<Icon as={FaImage} boxSize={3} />
|
||||
</Center>
|
||||
</Tooltip>
|
||||
);
|
||||
})}
|
||||
</Flex>
|
||||
) : (
|
||||
<Center height="60px">
|
||||
|
||||
Reference in New Issue
Block a user