Skip to content

Commit 88c5d7b

Browse files
committed
Allow cards to display partial data when one API fails
Cards now load independently showing token balances even if NFT data fails to load, and vice versa, preventing the entire interface from being stuck in a loading state when one API endpoint is down.
1 parent 9637978 commit 88c5d7b

File tree

1 file changed

+53
-5
lines changed

1 file changed

+53
-5
lines changed

packages/nextjs/components/address-vision/NetworkCard.tsx

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const NetworkCard = ({ chain }: { chain: Chain }) => {
2323

2424
const shouldFetch = address && isAddress(address);
2525

26-
const { data: tokenBalancesData } = useSWR(
26+
const { data: tokenBalancesData, error: tokenError } = useSWR(
2727
shouldFetch
2828
? `https://deep-index.moralis.io/api/v2.2/wallets/${address}/tokens?chain=${getChainNameForMoralis(
2929
chain.id,
@@ -37,7 +37,7 @@ export const NetworkCard = ({ chain }: { chain: Chain }) => {
3737
},
3838
);
3939

40-
const { data: nftData } = useSWR(
40+
const { data: nftData, error: nftError } = useSWR(
4141
shouldFetch
4242
? `https://api.opensea.io/api/v2/chain/${getChainNameForOpensea(chain.id)}/account/${address}/nfts?limit=5`
4343
: null,
@@ -65,7 +65,11 @@ export const NetworkCard = ({ chain }: { chain: Chain }) => {
6565
}
6666
}, [address, tokenBalancesData]);
6767

68-
if (nftData === undefined || tokenBalancesData === undefined || !shouldFetch) {
68+
// Show loading state only if both APIs are still loading AND no errors
69+
const isTokensLoading = tokenBalancesData === undefined && !tokenError;
70+
const isNftsLoading = nftData === undefined && !nftError;
71+
72+
if (!shouldFetch || (isTokensLoading && isNftsLoading)) {
6973
return (
7074
<div className="card w-[370px] md:w-[425px] bg-base-100 shadow-xl flex-grow animate-pulse">
7175
<div className="card-body">
@@ -136,9 +140,53 @@ export const NetworkCard = ({ chain }: { chain: Chain }) => {
136140
</Link>
137141
</h2>
138142
<h3 className="font-bold">NFTs</h3>
139-
<NftsCarousel nfts={nftData.nfts} chain={chain} address={address} />
143+
{isNftsLoading ? (
144+
<div className="carousel-center carousel rounded-box max-w-md space-x-4 bg-secondary p-4 animate-pulse">
145+
<div className="carousel-item">
146+
<div className="rounded-md bg-slate-300 h-32 w-32"></div>
147+
</div>
148+
<div className="carousel-item">
149+
<div className="rounded-md bg-slate-300 h-32 w-32"></div>
150+
</div>
151+
<div className="carousel-item">
152+
<div className="rounded-md bg-slate-300 h-32 w-32"></div>
153+
</div>
154+
</div>
155+
) : nftError ? (
156+
<div className="text-sm text-error">Unable to load NFTs</div>
157+
) : (
158+
<NftsCarousel nfts={nftData?.nfts || []} chain={chain} address={address} />
159+
)}
140160
<h3 className="mt-4 font-bold">Tokens</h3>
141-
<TokensTable tokens={tokenBalancesData.result} />
161+
{isTokensLoading ? (
162+
<div className="max-h-48 overflow-x-auto animate-pulse">
163+
<table className="table table-zebra">
164+
<thead>
165+
<tr>
166+
<th>Token</th>
167+
<th>Balance</th>
168+
<th>Balance in USD</th>
169+
</tr>
170+
</thead>
171+
<tbody>
172+
<tr>
173+
<td className="h-2 w-28 bg-slate-300"></td>
174+
<td className="h-2 w-16 bg-slate-300"></td>
175+
<td className="h-2 w-20 bg-slate-300"></td>
176+
</tr>
177+
<tr>
178+
<td className="h-2 w-28 bg-slate-300"></td>
179+
<td className="h-2 w-16 bg-slate-300"></td>
180+
<td className="h-2 w-20 bg-slate-300"></td>
181+
</tr>
182+
</tbody>
183+
</table>
184+
</div>
185+
) : tokenError ? (
186+
<div className="text-sm text-error">Unable to load tokens</div>
187+
) : (
188+
<TokensTable tokens={tokenBalancesData?.result || []} />
189+
)}
142190
</div>
143191
</div>
144192
);

0 commit comments

Comments
 (0)