import { useGetTokenMetadata } from '@0xsequence/hooks'
// Example 1: Single NFT Details
function NFTDetails({ contractAddress, tokenId }) {
const {
data: tokensMetadata,
isLoading,
isError
} = useGetTokenMetadata({
chainID: "1", // Ethereum mainnet
contractAddress,
tokenIDs: [tokenId]
})
if (isLoading) return <div>Loading NFT details...</div>
if (isError) return <div>Error loading NFT</div>
const nft = tokensMetadata?.[0]
if (!nft) return <div>NFT not found</div>
return (
<div className="nft-details">
<img
src={nft.image}
alt={nft.name}
className="nft-image"
/>
<div className="nft-info">
<h1>{nft.name}</h1>
<p>{nft.description}</p>
<div className="attributes-grid">
{nft.attributes?.map(attr => (
<div key={attr.trait_type} className="attribute-card">
<span className="trait-type">{attr.trait_type}</span>
<span className="trait-value">{attr.value}</span>
{attr.rarity && (
<span className="trait-rarity">{attr.rarity}%</span>
)}
</div>
))}
</div>
</div>
</div>
)
}
// Example 2: Batch NFT Collection Display
function NFTCollectionGrid({ contractAddress, tokenIds }) {
const {
data: tokensMetadata,
isLoading,
isError
} = useGetTokenMetadata({
chainID: "1",
contractAddress,
tokenIDs: tokenIds // Will automatically chunk into batches of 50
})
if (isLoading) return <div>Loading collection...</div>
if (isError) return <div>Error loading collection</div>
return (
<div className="nft-grid">
{tokensMetadata?.map(token => (
<div key={token.tokenId} className="nft-tile">
<img
src={token.image}
alt={token.name}
loading="lazy"
/>
<div className="nft-tile-info">
<h3>{token.name}</h3>
{token.attributes && (
<div className="trait-pills">
{token.attributes.slice(0, 3).map(attr => (
<span key={attr.trait_type} className="trait-pill">
{attr.trait_type}: {attr.value}
</span>
))}
</div>
)}
</div>
</div>
))}
</div>
)
}