Skip to content

Commit 5e7bc6a

Browse files
Fix undefined in URL in NFTCards (#2374)
Fix undefined in URL
1 parent 377b040 commit 5e7bc6a

File tree

1 file changed

+54
-39
lines changed

1 file changed

+54
-39
lines changed

contract-ui/tabs/overview/components/NFTCards.tsx

Lines changed: 54 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
Text,
2020
} from "tw-components";
2121
import { NFTMediaWithEmptyState } from "tw-components/nft-media";
22+
import { useChainSlug } from "hooks/chains/chainSlug";
2223

2324
const dummyMetadata: (idx: number) => NFT = (idx) => ({
2425
id: BigInt(idx || 0),
@@ -34,6 +35,10 @@ const dummyMetadata: (idx: number) => NFT = (idx) => ({
3435
supply: 1n,
3536
});
3637

38+
function isOnlyNumbers(str: string) {
39+
return /^\d+$/.test(str);
40+
}
41+
3742
interface NFTCardsProps {
3843
nfts: NFT[] | WalletNFT[];
3944
trackingCategory: TrackedLinkProps["category"];
@@ -58,50 +63,60 @@ export const NFTCards: React.FC<NFTCardsProps> = ({
5863
}).map((_, idx) => dummyMetadata(idx));
5964
}, [nfts.length, isMobile, allNfts]);
6065

66+
const chainSlug = useChainSlug(chainId || 1);
67+
6168
return (
6269
<SimpleGrid
6370
gap={{ base: 3, md: 6 }}
6471
columns={allNfts ? { base: 2, md: 4 } : { base: 2, md: 3 }}
6572
>
66-
{(isLoading ? dummyData : nfts).map((token) => (
67-
<GridItem
68-
key={`${chainId}-${(token as WalletNFT)?.contractAddress || contractAddress
69-
}-${(token as WalletNFT).tokenId || token.metadata.id}}`}
70-
as={TrackedLink}
71-
category={trackingCategory}
72-
href={`/${chainId}/${(token as WalletNFT)?.contractAddress || contractAddress
73-
}/nfts/${(token as WalletNFT).tokenId || token.metadata.id}`}
74-
_hover={{ opacity: 0.75, textDecoration: "none" }}
75-
>
76-
<Card p={0} h="full">
77-
<AspectRatio w="100%" ratio={1} overflow="hidden" rounded="xl">
78-
<Skeleton isLoaded={!isLoading}>
79-
<NFTMediaWithEmptyState
80-
// @ts-expect-error types are not up to date
81-
metadata={token.metadata}
82-
requireInteraction
83-
width="100%"
84-
height="100%"
85-
/>
86-
</Skeleton>
87-
</AspectRatio>
88-
<Flex p={4} pb={3} gap={3} direction="column">
89-
<Skeleton w={!isLoading ? "100%" : "50%"} isLoaded={!isLoading}>
90-
<Heading size="label.md">{token.metadata.name}</Heading>
91-
</Skeleton>
92-
<SkeletonText isLoaded={!isLoading}>
93-
<Text noOfLines={3}>
94-
{token.metadata.description ? (
95-
token.metadata.description
96-
) : (
97-
<i>No description</i>
98-
)}
99-
</Text>
100-
</SkeletonText>
101-
</Flex>
102-
</Card>
103-
</GridItem>
104-
))}
73+
{(isLoading ? dummyData : nfts).map((token) => {
74+
const tokenId = (token as WalletNFT)?.tokenId || (token as NFT).id;
75+
const ctrAddress =
76+
(token as WalletNFT)?.contractAddress || contractAddress;
77+
78+
if (!tokenId || !isOnlyNumbers(tokenId.toString())) {
79+
return null;
80+
}
81+
82+
return (
83+
<GridItem
84+
key={`${chainId}-${ctrAddress}-${tokenId}`}
85+
as={TrackedLink}
86+
category={trackingCategory}
87+
href={`/${chainSlug}/${ctrAddress}/nfts/${tokenId.toString()}`}
88+
_hover={{ opacity: 0.75, textDecoration: "none" }}
89+
>
90+
<Card p={0} h="full">
91+
<AspectRatio w="100%" ratio={1} overflow="hidden" rounded="xl">
92+
<Skeleton isLoaded={!isLoading}>
93+
<NFTMediaWithEmptyState
94+
// @ts-expect-error types are not up to date
95+
metadata={token.metadata}
96+
requireInteraction
97+
width="100%"
98+
height="100%"
99+
/>
100+
</Skeleton>
101+
</AspectRatio>
102+
<Flex p={4} pb={3} gap={3} direction="column">
103+
<Skeleton w={!isLoading ? "100%" : "50%"} isLoaded={!isLoading}>
104+
<Heading size="label.md">{token.metadata.name}</Heading>
105+
</Skeleton>
106+
<SkeletonText isLoaded={!isLoading}>
107+
<Text noOfLines={3}>
108+
{token.metadata.description ? (
109+
token.metadata.description
110+
) : (
111+
<i>No description</i>
112+
)}
113+
</Text>
114+
</SkeletonText>
115+
</Flex>
116+
</Card>
117+
</GridItem>
118+
);
119+
})}
105120
</SimpleGrid>
106121
);
107122
};

0 commit comments

Comments
 (0)