Skip to content

Commit ddb2525

Browse files
authored
Merge pull request #96 from BuidlGuidl/fix/graceful-api-failure
Allow cards to display partial data when one API fails
2 parents 9637978 + 88c5d7b commit ddb2525

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)