@@ -43,7 +43,11 @@ export const useAvailableTokenBalances = (params: {
4343 paymentChains ?: ChainPaymentInfo [ ] ;
4444 price ?: ProductPrice ;
4545 productType : ProductType ;
46- } ) : TokenWithApprovalAmount [ ] => {
46+ } ) : {
47+ availableTokenBalances : TokenWithApprovalAmount [ ] ;
48+ pending : boolean ;
49+ error : Error | undefined ;
50+ } => {
4751 const { paymentChains, price, productType } = params ;
4852
4953 const paymentChainIds = useMemo (
@@ -70,10 +74,6 @@ export const useAvailableTokenBalances = (params: {
7074 // Poll and update evm balances for payment chains
7175 pollAndUpdateEvmBalances ( { chainIds : paymentChainIds } ) ;
7276
73- const [ availableTokenBalances , setAvailableTokenBalances ] = useState <
74- TokenWithApprovalAmount [ ]
75- > ( [ ] ) ;
76-
7777 const validTokenBalances = useMemo ( ( ) => {
7878 return evmBalances . filter ( ( token ) => {
7979 const supportedTokensForChain =
@@ -96,72 +96,74 @@ export const useAvailableTokenBalances = (params: {
9696 } ) ;
9797 } , [ evmBalances , paymentChainTokenMap ] ) ;
9898
99- useEffect ( ( ) => {
99+ const {
100+ value : availableTokenBalances ,
101+ pending,
102+ error,
103+ } = useAsyncResult ( async ( ) : Promise < TokenWithApprovalAmount [ ] > => {
100104 if ( ! price || ! paymentChainTokenMap ) {
101- return ;
105+ return [ ] ;
102106 }
103107
104- const getAvailableTokenBalances = async ( ) => {
105- const availableTokens : TokenWithApprovalAmount [ ] = [ ] ;
106-
107- const cryptoApprovalAmounts = await Promise . all (
108- validTokenBalances . map ( ( token ) => {
109- const tokenPaymentInfo = paymentChainTokenMap ?. [
110- token . chainId as Hex
111- ] ?. find (
112- ( t ) => t . address . toLowerCase ( ) === token . address . toLowerCase ( ) ,
108+ const availableTokens : TokenWithApprovalAmount [ ] = [ ] ;
109+
110+ const cryptoApprovalAmounts = await Promise . all (
111+ validTokenBalances . map ( ( token ) => {
112+ const tokenPaymentInfo = paymentChainTokenMap ?. [
113+ token . chainId as Hex
114+ ] ?. find ( ( t ) => t . address . toLowerCase ( ) === token . address . toLowerCase ( ) ) ;
115+ if ( ! tokenPaymentInfo ) {
116+ log . error (
117+ '[useAvailableTokenBalances] tokenPaymentInfo not found' ,
118+ token ,
113119 ) ;
114- if ( ! tokenPaymentInfo ) {
115- log . error (
116- '[useAvailableTokenBalances] tokenPaymentInfo not found' ,
117- token ,
118- ) ;
119- return null ;
120- }
121- return getSubscriptionCryptoApprovalAmount ( {
122- chainId : token . chainId as Hex ,
123- paymentTokenAddress : token . address as Hex ,
124- productType,
125- interval : price . interval ,
126- } ) ;
127- } ) ,
128- ) ;
129-
130- cryptoApprovalAmounts . forEach ( ( amount , index ) => {
131- const token = validTokenBalances [ index ] ;
132- if ( ! token . balance ) {
133- return ;
134- }
135- // NOTE: we are using stable coin for subscription atm, so we need to scale the balance by the decimals
136- const scaledFactor = 10n ** 6n ;
137- const scaledBalance =
138- BigInt ( Math . round ( Number ( token . balance ) * Number ( scaledFactor ) ) ) /
139- scaledFactor ;
140- const tokenHasEnoughBalance =
141- amount &&
142- scaledBalance * BigInt ( 10 ** token . decimals ) >=
143- BigInt ( amount . approveAmount ) ;
144- if ( tokenHasEnoughBalance ) {
145- availableTokens . push ( {
146- ...token ,
147- approvalAmount : {
148- approveAmount : amount . approveAmount ,
149- chainId : token . chainId as Hex ,
150- paymentAddress : amount . paymentAddress ,
151- paymentTokenAddress : amount . paymentTokenAddress ,
152- } ,
153- type : token . isNative ? AssetType . native : AssetType . token ,
154- } as TokenWithApprovalAmount ) ;
120+ return null ;
155121 }
156- } ) ;
157-
158- setAvailableTokenBalances ( availableTokens ) ;
159- } ;
122+ return getSubscriptionCryptoApprovalAmount ( {
123+ chainId : token . chainId as Hex ,
124+ paymentTokenAddress : token . address as Hex ,
125+ productType,
126+ interval : price . interval ,
127+ } ) ;
128+ } ) ,
129+ ) ;
130+
131+ cryptoApprovalAmounts . forEach ( ( amount , index ) => {
132+ const token = validTokenBalances [ index ] ;
133+ if ( ! token . balance ) {
134+ return ;
135+ }
136+ // NOTE: we are using stable coin for subscription atm, so we need to scale the balance by the decimals
137+ const scaledFactor = 10n ** 6n ;
138+ const scaledBalance =
139+ BigInt ( Math . round ( Number ( token . balance ) * Number ( scaledFactor ) ) ) /
140+ scaledFactor ;
141+ const tokenHasEnoughBalance =
142+ amount &&
143+ scaledBalance * BigInt ( 10 ** token . decimals ) >=
144+ BigInt ( amount . approveAmount ) ;
145+ if ( tokenHasEnoughBalance ) {
146+ availableTokens . push ( {
147+ ...token ,
148+ approvalAmount : {
149+ approveAmount : amount . approveAmount ,
150+ chainId : token . chainId as Hex ,
151+ paymentAddress : amount . paymentAddress ,
152+ paymentTokenAddress : amount . paymentTokenAddress ,
153+ } ,
154+ type : token . isNative ? AssetType . native : AssetType . token ,
155+ } as TokenWithApprovalAmount ) ;
156+ }
157+ } ) ;
160158
161- getAvailableTokenBalances ( ) ;
162- } , [ price , productType , paymentChainTokenMap , validTokenBalances ] ) ;
159+ return availableTokens ;
160+ } , [ price , paymentChainTokenMap , validTokenBalances ] ) ;
163161
164- return availableTokenBalances ;
162+ return {
163+ availableTokenBalances : availableTokenBalances ?? [ ] ,
164+ pending,
165+ error,
166+ } ;
165167} ;
166168
167169/**
0 commit comments