@@ -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