Skip to content

Commit 61583da

Browse files
convert hooks to use pagination (#396)
* draft useGetTokenBalancesSummaryPagination * fix: change over necessary hooks to useInfiniteQuery * feat: reimplemented hooks calls to use new format * fix: readded fiat sign to home, fix: added full border radius to collections filter 'All' selection * feat: removed hideCollectibles setting, fix: changed get single token hook to use details * fix: specified tokenId in SendCollectible, feat: renamed useGetSingleTokenBalanceSummary to useGetSingleTokenBalance * fix: added check to return nativeBalance only on first page call for useGetTokenBalancesSummary/Details * replaced isPending with isLoading; fixed paginated query in custom checkout hook --------- Co-authored-by: samuelea <[email protected]>
1 parent df34433 commit 61583da

File tree

60 files changed

+535
-632
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+535
-632
lines changed

packages/checkout/src/hooks/useCheckoutUI/useCryptoPayment.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export const useCryptoPayment = ({
102102

103103
const isApproved: boolean = (allowanceData as bigint) >= BigInt(totalPriceRaw) || isNativeCurrency
104104

105-
const { data: currencyBalanceData, isLoading: currencyBalanceIsLoading } = useGetTokenBalancesSummary({
105+
const { data: currencyBalanceDataPaginated, isLoading: currencyBalanceIsLoading } = useGetTokenBalancesSummary({
106106
chainIds: [chainId],
107107
filter: {
108108
accountAddresses: userAddress ? [userAddress] : [],
@@ -113,6 +113,8 @@ export const useCryptoPayment = ({
113113
omitMetadata: true
114114
})
115115

116+
const currencyBalanceData = currencyBalanceDataPaginated?.pages?.flatMap(page => page.balances)
117+
116118
const buyCurrencyAddress = currencyAddress
117119
const sellCurrencyAddress = selectedCurrencyAddress || ''
118120

packages/checkout/src/views/CheckoutSelection/component/OrderSummaryItem.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@ interface OrderSummaryItem {
1111
}
1212

1313
export const OrderSummaryItem = ({ contractAddress, tokenId, quantityRaw, chainId }: OrderSummaryItem) => {
14-
const { data: tokenMetadata, isPending: isPendingTokenMetadata } = useGetTokenMetadata({
14+
const { data: tokenMetadata, isLoading: isLoadingTokenMetadata } = useGetTokenMetadata({
1515
chainID: String(chainId),
1616
contractAddress,
1717
tokenIDs: [tokenId]
1818
})
19-
const { data: contractInfo, isPending: isPendingContractInfo } = useGetContractInfo({
19+
const { data: contractInfo, isLoading: isLoadingContractInfo } = useGetContractInfo({
2020
chainID: String(chainId),
2121
contractAddress
2222
})
23-
const isPending = isPendingTokenMetadata || isPendingContractInfo
23+
const isLoading = isLoadingTokenMetadata || isLoadingContractInfo
2424

25-
if (isPending) {
25+
if (isLoading) {
2626
return <OrderSummarySkeleton />
2727
}
2828

packages/checkout/src/views/CheckoutSelection/index.tsx

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
TokenImage
1212
} from '@0xsequence/design-system'
1313
import { useGetTokenBalancesSummary, useGetContractInfo } from '@0xsequence/hooks'
14+
import { useEffect } from 'react'
1415
import { zeroAddress, formatUnits } from 'viem'
1516
import { useAccount, useConfig } from 'wagmi'
1617

@@ -30,31 +31,44 @@ export const CheckoutSelection = () => {
3031
const displayCreditCardCheckout = !!creditCardCheckoutSettings
3132
const displayCryptoCheckout = !!cryptoCheckoutSettings
3233

33-
const { data: contractInfoData, isLoading: isPendingContractInfo } = useGetContractInfo({
34+
const { data: contractInfoData, isLoading: isLoadingContractInfo } = useGetContractInfo({
3435
chainID: String(cryptoCheckoutSettings?.chainId || 1),
3536
contractAddress: cryptoCheckoutSettings?.coinQuantity?.contractAddress || ''
3637
})
3738

38-
const { data: balancesData, isPending: isPendingBalances } = useGetTokenBalancesSummary({
39+
const {
40+
data: balancesData,
41+
isLoading: isLoadingBalances,
42+
fetchNextPage: fetchNextBalances,
43+
hasNextPage: hasNextPageBalances,
44+
isFetchingNextPage: isFetchingNextPageBalances
45+
} = useGetTokenBalancesSummary({
3946
chainIds: [cryptoCheckoutSettings?.chainId || 1],
4047
filter: {
4148
accountAddresses: accountAddress ? [accountAddress] : [],
4249
contractStatus: ContractVerificationStatus.ALL,
4350
omitNativeBalances: false
44-
}
51+
},
52+
page: { pageSize: 40 }
4553
})
4654

47-
const isPending = (isPendingContractInfo || isPendingBalances) && cryptoCheckoutSettings
55+
useEffect(() => {
56+
if (hasNextPageBalances && !isFetchingNextPageBalances) {
57+
fetchNextBalances()
58+
}
59+
}, [hasNextPageBalances, isFetchingNextPageBalances])
60+
61+
const isLoading = (isLoadingContractInfo || isLoadingBalances || isFetchingNextPageBalances) && cryptoCheckoutSettings
4862

4963
const isNativeToken = compareAddress(cryptoCheckoutSettings?.coinQuantity?.contractAddress || '', zeroAddress)
5064
const nativeTokenInfo = getNativeTokenInfoByChainId(cryptoCheckoutSettings?.chainId || 1, chains)
5165

5266
const coinDecimals = isNativeToken ? nativeTokenInfo.decimals : contractInfoData?.decimals || 0
5367
const coinSymbol = isNativeToken ? nativeTokenInfo.symbol : contractInfoData?.symbol || 'COIN'
5468
const coinImageUrl = isNativeToken ? nativeTokenInfo.logoURI : contractInfoData?.logoURI || ''
55-
const coinBalance = balancesData?.find(balance =>
56-
compareAddress(balance.contractAddress, cryptoCheckoutSettings?.coinQuantity?.contractAddress || '')
57-
)
69+
const coinBalance = balancesData?.pages
70+
?.flatMap(page => page.balances)
71+
.find(balance => compareAddress(balance.contractAddress, cryptoCheckoutSettings?.coinQuantity?.contractAddress || ''))
5872
const userBalanceRaw = coinBalance ? coinBalance.balance : '0'
5973
const requestedAmountRaw = cryptoCheckoutSettings?.coinQuantity?.amountRequiredRaw || '0'
6074
const userBalance = formatUnits(BigInt(userBalanceRaw), coinDecimals)
@@ -142,7 +156,7 @@ export const CheckoutSelection = () => {
142156
<Text variant="normal" color="muted">
143157
Total
144158
</Text>
145-
{isPending ? (
159+
{isLoading ? (
146160
<Skeleton style={{ width: '100px', height: '17px' }} />
147161
) : (
148162
<div className="flex flex-row gap-1 items-center">
@@ -165,7 +179,7 @@ export const CheckoutSelection = () => {
165179
onClick={onClickPayWithCard}
166180
/>
167181
)}
168-
{displayCryptoCheckout && !isInsufficientBalance && !isPending && (
182+
{displayCryptoCheckout && !isInsufficientBalance && !isLoading && (
169183
<Button
170184
className="w-full h-14 rounded-xl"
171185
leftIcon={() => <TokenImage src={coinImageUrl} size="sm" />}
@@ -175,7 +189,7 @@ export const CheckoutSelection = () => {
175189
onClick={onClickPayWithCrypto}
176190
/>
177191
)}
178-
{displayCryptoCheckout && (isInsufficientBalance || isPending) && (
192+
{displayCryptoCheckout && (isInsufficientBalance || isLoading) && (
179193
<Button
180194
className="w-full"
181195
shape="square"
@@ -193,7 +207,7 @@ export const CheckoutSelection = () => {
193207
</div>
194208
{displayCryptoCheckout && (
195209
<div className="flex w-full justify-end">
196-
{isPending ? (
210+
{isLoading ? (
197211
<Skeleton style={{ width: '102px', height: '14px' }} />
198212
) : (
199213
<Text variant="small" fontWeight="bold" color="muted">

packages/checkout/src/views/PaymentSelection/PayWithCrypto/index.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,30 @@ export const PayWithCrypto = ({
3535
const network = findSupportedNetwork(chain)
3636
const chainId = network?.chainId || 137
3737

38-
const { data: currencyBalanceData, isLoading: currencyBalanceIsLoading } = useGetTokenBalancesSummary({
38+
const {
39+
data: currencyBalanceData,
40+
isLoading: currencyBalanceIsLoading,
41+
fetchNextPage: fetchNextCurrencyBalance,
42+
hasNextPage: hasNextCurrencyBalance,
43+
isFetchingNextPage: isFetchingNextCurrencyBalance
44+
} = useGetTokenBalancesSummary({
3945
chainIds: [chainId],
4046
filter: {
4147
accountAddresses: userAddress ? [userAddress] : [],
4248
contractStatus: ContractVerificationStatus.ALL,
4349
contractWhitelist: [currencyAddress],
4450
omitNativeBalances: skipNativeBalanceCheck ?? false
4551
},
46-
omitMetadata: true
52+
omitMetadata: true,
53+
page: { pageSize: 40 }
4754
})
4855

56+
useEffect(() => {
57+
if (hasNextCurrencyBalance && !isFetchingNextCurrencyBalance) {
58+
fetchNextCurrencyBalance()
59+
}
60+
}, [hasNextCurrencyBalance, isFetchingNextCurrencyBalance])
61+
4962
const { data: currencyInfoData, isLoading: isLoadingCurrencyInfo } = useGetContractInfo({
5063
chainID: String(chainId),
5164
contractAddress: currencyAddress
@@ -64,7 +77,7 @@ export const PayWithCrypto = ({
6477
{ disabled: !enableSwapPayments }
6578
)
6679

67-
const isLoadingOptions = currencyBalanceIsLoading || isLoadingCurrencyInfo || isLoading
80+
const isLoadingOptions = currencyBalanceIsLoading || isFetchingNextCurrencyBalance || isLoadingCurrencyInfo || isLoading
6881

6982
const swapsIsLoading = swapPricesIsLoading
7083

@@ -114,7 +127,9 @@ export const PayWithCrypto = ({
114127
significantDigits: 6
115128
})
116129

117-
const balanceInfo = currencyBalanceData?.find(balanceData => compareAddress(currencyAddress, balanceData.contractAddress))
130+
const balanceInfo = currencyBalanceData?.pages
131+
?.flatMap(page => page.balances)
132+
.find(balanceData => compareAddress(currencyAddress, balanceData.contractAddress))
118133

119134
const balance: bigint = BigInt(balanceInfo?.balance || '0')
120135
// let balanceFormatted = Number(formatUnits(balance, currencyInfoData?.decimals || 0))

packages/checkout/src/views/PaymentSelection/index.tsx

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
1-
import {
2-
useAnalyticsContext,
3-
compareAddress,
4-
TRANSACTION_CONFIRMATIONS_DEFAULT,
5-
sendTransactions,
6-
ContractVerificationStatus
7-
} from '@0xsequence/connect'
1+
import { useAnalyticsContext, compareAddress, TRANSACTION_CONFIRMATIONS_DEFAULT, sendTransactions } from '@0xsequence/connect'
82
import { Button, Divider, Text, Spinner } from '@0xsequence/design-system'
93
import {
104
useClearCachedBalances,
11-
useGetTokenBalancesSummary,
125
useGetContractInfo,
136
SwapPricesWithCurrencyInfo,
147
useGetSwapPrices,
@@ -72,8 +65,7 @@ export const PaymentSelectionContent = () => {
7265
onSuccess = () => {},
7366
onError = () => {},
7467
onClose = () => {},
75-
supplementaryAnalyticsInfo,
76-
skipNativeBalanceCheck
68+
supplementaryAnalyticsInfo
7769
} = selectPaymentSettings
7870

7971
const isNativeToken = compareAddress(currencyAddress, zeroAddress)
@@ -104,18 +96,6 @@ export const PaymentSelectionContent = () => {
10496
}
10597
})
10698

107-
const { data: _currencyBalanceData, isLoading: currencyBalanceIsLoading } = useGetTokenBalancesSummary({
108-
chainIds: [chainId],
109-
filter: {
110-
accountAddresses: userAddress ? [userAddress] : [],
111-
contractStatus: ContractVerificationStatus.ALL,
112-
contractWhitelist: [currencyAddress],
113-
omitNativeBalances: skipNativeBalanceCheck ?? false
114-
},
115-
// omitMetadata must be true to avoid a bug
116-
omitMetadata: true
117-
})
118-
11999
const { data: _currencyInfoData, isLoading: isLoadingCurrencyInfo } = useGetContractInfo({
120100
chainID: String(chainId),
121101
contractAddress: currencyAddress
@@ -151,15 +131,10 @@ export const PaymentSelectionContent = () => {
151131
}
152132
)
153133

154-
const isLoading = (allowanceIsLoading && !isNativeToken) || currencyBalanceIsLoading || isLoadingCurrencyInfo
134+
const isLoading = (allowanceIsLoading && !isNativeToken) || isLoadingCurrencyInfo
155135

156136
const isApproved: boolean = (allowanceData as bigint) >= BigInt(price) || isNativeToken
157137

158-
// const balanceInfo = currencyBalanceData?.find(balanceData => compareAddress(currencyAddress, balanceData.contractAddress))
159-
// const balance: bigint = BigInt(balanceInfo?.balance || '0')
160-
// let balanceFormatted = Number(formatUnits(balance, currencyInfoData?.decimals || 0))
161-
// balanceFormatted = Math.trunc(Number(balanceFormatted) * 10000) / 10000
162-
163138
useEffect(() => {
164139
clearCachedBalances()
165140
}, [])

packages/connect/src/components/TxnDetails/TxnDetails.tsx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { commons } from '@0xsequence/core'
22
import { Card, GradientAvatar, Skeleton, Text, TokenImage } from '@0xsequence/design-system'
3-
import { useAPIClient, useGetTokenBalancesSummary, useGetTokenMetadata } from '@0xsequence/hooks'
4-
import { ContractType, ContractVerificationStatus } from '@0xsequence/indexer'
3+
import { useAPIClient, useGetSingleTokenBalance, useGetTokenMetadata } from '@0xsequence/hooks'
4+
import { ContractType } from '@0xsequence/indexer'
55
import { useEffect, useState } from 'react'
66
import { formatUnits, zeroAddress } from 'viem'
77
import { useConfig } from 'wagmi'
@@ -93,14 +93,10 @@ const TransferItemInfo = ({ address, transferProps, chainId }: TransferItemInfoP
9393
const isNFT = transferProps.contractType === ContractType.ERC1155 || transferProps.contractType === ContractType.ERC721
9494
const nativeTokenInfo = getNativeTokenInfoByChainId(chainId, chains)
9595

96-
const { data: balances = [] } = useGetTokenBalancesSummary({
97-
chainIds: [chainId],
98-
filter: {
99-
accountAddresses: [address],
100-
contractStatus: ContractVerificationStatus.ALL,
101-
contractWhitelist: [contractAddress],
102-
omitNativeBalances: false
103-
}
96+
const { data: tokenBalance } = useGetSingleTokenBalance({
97+
chainId,
98+
contractAddress,
99+
accountAddress: address
104100
})
105101

106102
const { data: tokenMetadata } = useGetTokenMetadata({
@@ -109,7 +105,6 @@ const TransferItemInfo = ({ address, transferProps, chainId }: TransferItemInfoP
109105
tokenIDs: transferProps.tokenIds ?? []
110106
})
111107

112-
const tokenBalance = contractAddress ? balances.find(b => compareAddress(b.contractAddress, contractAddress)) : undefined
113108
const decimals = isNativeCoin ? nativeTokenInfo.decimals : tokenBalance?.contractInfo?.decimals || 18
114109

115110
const imageUrl = isNativeCoin

0 commit comments

Comments
 (0)