@@ -98,6 +98,8 @@ public static event BalanceChange OnBalanceChange
9898 }
9999
100100 private static List < Nft . Nft > _nfts = new ( ) ;
101+ private static bool _isLoadingNfts ;
102+
101103 public delegate void NFTsUpdate ( List < Nft . Nft > nfts , int total ) ;
102104 private static event NFTsUpdate OnNFTsUpdateInternal ;
103105 public static event NFTsUpdate OnNFTsUpdate
@@ -292,19 +294,37 @@ public static async UniTask UpdateBalance(Commitment commitment = Commitment.Con
292294 _solAmount = balance ;
293295 OnBalanceChangeInternal ? . Invoke ( balance ) ;
294296 }
295-
297+
296298 /// <summary>
297299 /// Update the list of NFTs owned by the current wallet
298300 /// Notify all registered listeners
299301 /// </summary>
300302 /// <param name="commitment"></param>
301303 public static async UniTask UpdateNFTs ( Commitment commitment = Commitment . Confirmed )
302304 {
303- if ( Wallet == null ) return ;
305+ if ( _isLoadingNfts ) return ;
306+ _isLoadingNfts = true ;
307+ await LoadNFTs ( notifyRegisteredListeners : true , commitment : commitment ) ;
308+ _isLoadingNfts = false ;
309+ }
310+
311+ /// <summary>
312+ /// Update the list of NFTs owned by the current wallet
313+ /// Notify all registered listeners
314+ /// </summary>
315+ /// <param name="loadTexture"></param>
316+ /// <param name="notifyRegisteredListeners">If true, notify the register listeners</param>
317+ /// <param name="commitment"></param>
318+ public static async UniTask < List < Nft . Nft > > LoadNFTs (
319+ bool loadTexture = true ,
320+ bool notifyRegisteredListeners = false ,
321+ Commitment commitment = Commitment . Confirmed )
322+ {
323+ if ( Wallet == null ) return null ;
304324 var tokens = ( await Wallet . GetTokenAccounts ( commitment ) ) ?
305325 . ToList ( )
306326 . FindAll ( m => m . Account . Data . Parsed . Info . TokenAmount . AmountUlong == 1 ) ;
307- if ( tokens == null ) return ;
327+ if ( tokens == null ) return null ;
308328
309329 // Remove tokens not owned anymore
310330 var tkToRemove = new List < Nft . Nft > ( ) ;
@@ -327,23 +347,30 @@ public static async UniTask UpdateNFTs(Commitment commitment = Commitment.Confir
327347 . FindAll ( x => x . metaplexData . data . offchainData != null ) ;
328348
329349 // Fetch nfts
350+ List < UniTask > loadingTasks = new List < UniTask > ( ) ;
351+ List < Nft . Nft > nfts = new List < Nft . Nft > ( _nfts ) ;
330352 if ( tokens is { Count : > 0 } )
331353 {
332354 var toFetch = tokens
333355 . Where ( item => item . Account . Data . Parsed . Info . TokenAmount . AmountUlong == 1 )
334- . Where ( item => _nfts
335- . All ( t => t . metaplexData . data . mint != item . Account . Data . Parsed . Info . Mint ) ) ;
356+ . Where ( item => nfts
357+ . All ( t => t . metaplexData . data . mint != item . Account . Data . Parsed . Info . Mint ) ) . ToArray ( ) ;
336358 foreach ( var item in toFetch )
337359 {
338- Nft . Nft . TryGetNftData ( item . Account . Data . Parsed . Info . Mint , Rpc ) . AsUniTask ( )
339- . ContinueWith ( nft =>
360+ var tNft = Nft . Nft . TryGetNftData ( item . Account . Data . Parsed . Info . Mint , Rpc , loadTexture : loadTexture ) . AsUniTask ( ) ;
361+ loadingTasks . Add ( tNft ) ;
362+ tNft . ContinueWith ( nft =>
340363 {
341364 if ( nft == null ) return ;
342- _nfts . Add ( nft ) ;
343- OnNFTsUpdateInternal ? . Invoke ( _nfts , _nfts . Count + toFetch . Count ( ) ) ;
365+ nfts . Add ( nft ) ;
366+ if ( notifyRegisteredListeners )
367+ OnNFTsUpdateInternal ? . Invoke ( nfts , nfts . Count + toFetch . Length ) ;
344368 } ) . Forget ( ) ;
345369 }
346370 }
371+ await UniTask . WhenAll ( loadingTasks ) ;
372+ _nfts = nfts ;
373+ return nfts ;
347374 }
348375
349376 private static async UniTask SubscribeToWalletEvents ( Commitment commitment = Commitment . Confirmed )
@@ -357,7 +384,7 @@ await WsRpc.SubscribeAccountInfoAsync(
357384 Debug . Log ( "Account changed!, updated lamport: " + accountInfo . Value . Lamports ) ;
358385 _solAmount = accountInfo . Value . Lamports / 1000000000d ;
359386 OnBalanceChangeInternal ? . Invoke ( _solAmount ) ;
360- UpdateNFTs ( commitment ) . Forget ( ) ;
387+ UpdateNFTs ( commitment : commitment ) . Forget ( ) ;
361388 } ,
362389 commitment
363390 ) ;
0 commit comments