diff --git a/packages/checkout/src/hooks/useCheckoutUI/index.tsx b/packages/checkout/src/hooks/useCheckoutUI/index.tsx index 464b4f806..1108b6b75 100644 --- a/packages/checkout/src/hooks/useCheckoutUI/index.tsx +++ b/packages/checkout/src/hooks/useCheckoutUI/index.tsx @@ -62,7 +62,7 @@ export const useCheckoutUI = ({ tokenIDs: [collectible.tokenId ?? ''] }, { - disabled: !collectible.tokenId + enabled: !!collectible.tokenId } ) diff --git a/packages/checkout/src/hooks/useCheckoutUI/useCryptoPayment.tsx b/packages/checkout/src/hooks/useCheckoutUI/useCryptoPayment.tsx index 36f222687..e67ac5160 100644 --- a/packages/checkout/src/hooks/useCheckoutUI/useCryptoPayment.tsx +++ b/packages/checkout/src/hooks/useCheckoutUI/useCryptoPayment.tsx @@ -152,7 +152,7 @@ export const useCryptoPayment = ({ } }, { - disabled: disableSwapQuote + enabled: !disableSwapQuote } ) diff --git a/packages/checkout/src/views/Checkout/PaymentMethodSelect/OrderSummary/index.tsx b/packages/checkout/src/views/Checkout/PaymentMethodSelect/OrderSummary/index.tsx index 1b9e06850..46819dbe8 100644 --- a/packages/checkout/src/views/Checkout/PaymentMethodSelect/OrderSummary/index.tsx +++ b/packages/checkout/src/views/Checkout/PaymentMethodSelect/OrderSummary/index.tsx @@ -21,7 +21,7 @@ export const OrderSummary = () => { tokenIDs: tokenIds.some(id => id === '') ? [] : tokenIds }, { - disabled: tokenIds.some(id => id === '') + enabled: tokenIds.every(id => id !== '') } ) const { data: dataCollectionInfo, isLoading: isLoadingCollectionInfo } = useGetContractInfo({ diff --git a/packages/checkout/src/views/Checkout/PaymentMethodSelect/PayWithCrypto/index.tsx b/packages/checkout/src/views/Checkout/PaymentMethodSelect/PayWithCrypto/index.tsx index 30860eebb..5b4b2705c 100644 --- a/packages/checkout/src/views/Checkout/PaymentMethodSelect/PayWithCrypto/index.tsx +++ b/packages/checkout/src/views/Checkout/PaymentMethodSelect/PayWithCrypto/index.tsx @@ -135,7 +135,7 @@ export const PayWithCryptoTab = ({ skipOnCloseCallback, isSwitchingChainRef }: P contractAddress: selectedCurrency.address }, { - disabled: !isSwapTransaction + enabled: isSwapTransaction } ) @@ -161,7 +161,7 @@ export const PayWithCryptoTab = ({ skipOnCloseCallback, isSwitchingChainRef }: P } }, { - disabled: !isSwapTransaction + enabled: isSwapTransaction } ) diff --git a/packages/checkout/src/views/Checkout/PaymentMethodSelect/PayWithCrypto/useInitialBalanceCheck.tsx b/packages/checkout/src/views/Checkout/PaymentMethodSelect/PayWithCrypto/useInitialBalanceCheck.tsx index 321635db2..0c3d67877 100644 --- a/packages/checkout/src/views/Checkout/PaymentMethodSelect/PayWithCrypto/useInitialBalanceCheck.tsx +++ b/packages/checkout/src/views/Checkout/PaymentMethodSelect/PayWithCrypto/useInitialBalanceCheck.tsx @@ -43,7 +43,7 @@ export const useInitialBalanceCheck = ({ chainId: chainId }, { - disabled: isInitialBalanceChecked || !isInsufficientBalance || isFree + enabled: !isInitialBalanceChecked && isInsufficientBalance && !isFree } ) @@ -66,7 +66,7 @@ export const useInitialBalanceCheck = ({ omitMetadata: true }, { - disabled: isInitialBalanceChecked || !isInsufficientBalance || swapRoutesIsLoading || isFree + enabled: !isInitialBalanceChecked && isInsufficientBalance && !swapRoutesIsLoading && !isFree } ) diff --git a/packages/checkout/src/views/Swap/index.tsx b/packages/checkout/src/views/Swap/index.tsx index 40c0cfd07..d9b4e6ff0 100644 --- a/packages/checkout/src/views/Swap/index.tsx +++ b/packages/checkout/src/views/Swap/index.tsx @@ -172,7 +172,7 @@ export const Swap = () => { } }, { - disabled: disableSwapQuote + enabled: !disableSwapQuote } ) diff --git a/packages/checkout/src/views/TransactionStatus/index.tsx b/packages/checkout/src/views/TransactionStatus/index.tsx index f01f26d5a..99c44e552 100644 --- a/packages/checkout/src/views/TransactionStatus/index.tsx +++ b/packages/checkout/src/views/TransactionStatus/index.tsx @@ -125,7 +125,7 @@ export const TransactionStatus = () => { tokenIDs: noItemsToDisplay ? [] : items?.map(i => i.tokenId || '') }, { - disabled: noItemsToDisplay + enabled: !noItemsToDisplay } ) @@ -172,7 +172,7 @@ export const TransactionStatus = () => { contractAddress: collectionAddress || '' }, { - disabled: noItemsToDisplay + enabled: !noItemsToDisplay } ) const { data: dataCurrencyInfo, isLoading: isLoadingCurrencyInfo } = useGetContractInfo( @@ -181,7 +181,7 @@ export const TransactionStatus = () => { contractAddress: currencyAddress || '' }, { - disabled: noItemsToDisplay + enabled: !noItemsToDisplay } ) diff --git a/packages/hooks/CHANGELOG.md b/packages/hooks/CHANGELOG.md index 2ddf4cba5..d45499bb1 100644 --- a/packages/hooks/CHANGELOG.md +++ b/packages/hooks/CHANGELOG.md @@ -1,11 +1,5 @@ # @0xsequence/hooks -## 6.0.2 - -### Patch Changes - -- Fix for chain switch - ## 6.0.1 ### Patch Changes diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 0a63dec45..a6bd1f735 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/hooks", - "version": "6.0.2", + "version": "6.0.1", "description": "React hooks for Sequence Web SDK", "repository": "https://github.com/0xsequence/web-sdk/tree/master/packages/hooks", "author": "Sequence Platforms ULC", diff --git a/packages/hooks/src/hooks/API/useGetCoinPrices.ts b/packages/hooks/src/hooks/API/useGetCoinPrices.ts index 4d6bd2567..60ba65d26 100644 --- a/packages/hooks/src/hooks/API/useGetCoinPrices.ts +++ b/packages/hooks/src/hooks/API/useGetCoinPrices.ts @@ -1,8 +1,8 @@ -import { SequenceAPIClient, type Token } from '@0xsequence/api' +import { SequenceAPIClient, type Token, type TokenPrice } from '@0xsequence/api' import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { useAPIClient } from './useAPIClient.js' @@ -36,16 +36,8 @@ const getCoinPrices = async (apiClient: SequenceAPIClient, tokens: Token[]) => { * - chainId: The chain ID where the token exists * - contractAddress: The token's contract address (use ZERO_ADDRESS for native tokens) * - * @param options - Optional configuration options: - * - retry: Whether to retry failed requests (defaults to false) - * - disabled: Whether to disable the query - * - * @returns React Query result object containing: - * - data: Array of token prices when available - * - isLoading: Whether the initial request is in progress - * - error: Any error that occurred - * - isError: Whether an error occurred - * - isSuccess: Whether the request was successful + * @param options - React Query options (except queryKey and queryFn which are managed by the hook). + * Defaults: retry: false, staleTime: 1 minute. * * @example * ```tsx @@ -59,24 +51,17 @@ const getCoinPrices = async (apiClient: SequenceAPIClient, tokens: Token[]) => { * contractAddress: '0x...' // USDC on Polygon * } * ]) - * - * if (isLoading) { - * return
Loading prices...
- * } - * - * if (prices) { - * console.log('ETH price:', prices[0].price.value) - * } * ``` */ -export const useGetCoinPrices = (tokens: Token[], options?: HooksOptions) => { +export const useGetCoinPrices = (tokens: Token[], options?: QueryHookOptions) => { const apiClient = useAPIClient() return useQuery({ - queryKey: [QUERY_KEYS.useGetCoinPrices, tokens, options], + queryKey: [QUERY_KEYS.useGetCoinPrices, tokens], queryFn: () => getCoinPrices(apiClient, tokens), - retry: options?.retry ?? false, + retry: false, staleTime: time.oneMinute, - enabled: tokens.length > 0 && !options?.disabled + enabled: tokens.length > 0, + ...options }) } diff --git a/packages/hooks/src/hooks/API/useGetCollectiblePrices.ts b/packages/hooks/src/hooks/API/useGetCollectiblePrices.ts index abf3f2f82..b6b2e4ce2 100644 --- a/packages/hooks/src/hooks/API/useGetCollectiblePrices.ts +++ b/packages/hooks/src/hooks/API/useGetCollectiblePrices.ts @@ -1,8 +1,8 @@ -import { SequenceAPIClient, type Token } from '@0xsequence/api' +import { SequenceAPIClient, type Token, type TokenPrice } from '@0xsequence/api' import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { useAPIClient } from './useAPIClient.js' @@ -29,8 +29,6 @@ const getCollectiblePrices = async (apiClient: SequenceAPIClient, tokens: Token[ * * This hook uses React Query to fetch and cache collectible prices from the Sequence API. * Prices are automatically refreshed every minute to ensure they stay current. - * Used in various UI components to display NFT valuations, particularly in collection views - * and transaction details. * * @see {@link https://docs.sequence.xyz/sdk/web/hooks-sdk/hooks/useGetCollectiblePrices} for more detailed documentation. * @@ -39,49 +37,29 @@ const getCollectiblePrices = async (apiClient: SequenceAPIClient, tokens: Token[ * - contractAddress: The NFT collection's contract address * - tokenId: The specific token ID within the collection * - * @param options - Optional configuration options: - * - retry: Whether to retry failed requests (defaults to false) - * - disabled: Whether to disable the query - * - * @returns React Query result object containing: - * - data: Array of token prices when available, each containing: - * - price: The price for the collection - * - price24hChange: The price change for the collection in the last 24 hours (if available) - * - floorPrice: The floor price for the collection (if available) - * - buyPrice: Current market buy price (if available) - * - sellPrice: Current market sell price (if available) - * - isLoading: Whether the initial request is in progress - * - error: Any error that occurred - * - isError: Whether an error occurred - * - isSuccess: Whether the request was successful + * @param options - React Query options (except queryKey and queryFn which are managed by the hook). + * Defaults: retry: false, staleTime: 1 minute. * * @example * ```tsx * const { data: prices, isLoading } = useGetCollectiblePrices([ * { * chainId: 1, - * contractAddress: '0x...', // NFT collection address - * tokenId: '123' // Specific NFT ID + * contractAddress: '0x...', + * tokenId: '123' * } * ]) - * - * if (isLoading) { - * return
Loading prices...
- * } - * - * if (prices?.[0]) { - * console.log('Price:', prices[0].price.value) - * } * ``` */ -export const useGetCollectiblePrices = (tokens: Token[], options?: HooksOptions) => { +export const useGetCollectiblePrices = (tokens: Token[], options?: QueryHookOptions) => { const apiClient = useAPIClient() return useQuery({ - queryKey: [QUERY_KEYS.useGetCollectiblePrices, tokens, options], + queryKey: [QUERY_KEYS.useGetCollectiblePrices, tokens], queryFn: () => getCollectiblePrices(apiClient, tokens), - retry: options?.retry ?? false, + retry: false, staleTime: time.oneMinute, - enabled: tokens.length > 0 && !options?.disabled + enabled: tokens.length > 0, + ...options }) } diff --git a/packages/hooks/src/hooks/API/useGetExchangeRate.ts b/packages/hooks/src/hooks/API/useGetExchangeRate.ts index 0fc42ea72..9953560cc 100644 --- a/packages/hooks/src/hooks/API/useGetExchangeRate.ts +++ b/packages/hooks/src/hooks/API/useGetExchangeRate.ts @@ -1,7 +1,7 @@ import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { useAPIClient } from './useAPIClient.js' @@ -10,45 +10,25 @@ import { useAPIClient } from './useAPIClient.js' * * This hook uses React Query to fetch and cache exchange rates from the Sequence API. * Rates are automatically refreshed every 10 minutes to ensure they stay current. - * Used throughout the wallet widget and checkout components to display fiat values - * for tokens and NFTs. * * @see {@link https://docs.sequence.xyz/sdk/web/hooks-sdk/hooks/useGetExchangeRate} for more detailed documentation. * * @param toCurrency - The target currency code (e.g., 'EUR', 'GBP', 'JPY'). * If 'USD' is provided, returns 1 as the conversion rate. * - * @param options - Optional configuration options: - * - retry: Whether to retry failed requests (defaults to false) - * - disabled: Whether to disable the query - * - * @returns React Query result object containing: - * - data: The exchange rate value from USD to the target currency - * - isLoading: Whether the initial request is in progress - * - error: Any error that occurred - * - isError: Whether an error occurred - * - isSuccess: Whether the request was successful + * @param options - React Query options (except queryKey and queryFn which are managed by the hook). + * Defaults: retry: false, staleTime: 10 minutes. * * @example * ```tsx * const { data: rate = 1, isLoading } = useGetExchangeRate('EUR') - * - * // Convert USD amount to EUR - * const usdAmount = 100 - * const eurAmount = usdAmount * rate - * - * if (isLoading) { - * return
Loading rates...
- * } - * - * console.log(`${usdAmount} USD = ${eurAmount} EUR`) * ``` */ -export const useGetExchangeRate = (toCurrency: string, options?: HooksOptions) => { +export const useGetExchangeRate = (toCurrency: string, options?: QueryHookOptions) => { const apiClient = useAPIClient() return useQuery({ - queryKey: [QUERY_KEYS.useGetExchangeRate, toCurrency, options], + queryKey: [QUERY_KEYS.useGetExchangeRate, toCurrency], queryFn: async () => { if (toCurrency === 'USD') { return 1 @@ -58,8 +38,9 @@ export const useGetExchangeRate = (toCurrency: string, options?: HooksOptions) = return res.exchangeRate.value }, - retry: options?.retry ?? false, + retry: false, staleTime: time.oneMinute * 10, - enabled: !!toCurrency && !options?.disabled + enabled: !!toCurrency, + ...options }) } diff --git a/packages/hooks/src/hooks/Builder/useDetectContractVersion.ts b/packages/hooks/src/hooks/Builder/useDetectContractVersion.ts index 1fa4fcf9a..2ad011de0 100644 --- a/packages/hooks/src/hooks/Builder/useDetectContractVersion.ts +++ b/packages/hooks/src/hooks/Builder/useDetectContractVersion.ts @@ -1,7 +1,7 @@ import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { useConfig } from '../useConfig.js' /** @@ -9,22 +9,12 @@ import { useConfig } from '../useConfig.js' * * This hook uses React Query to fetch and cache the version of a contract. * - * * @param args - The arguments for the hook: - * - address: The address of the contract + * - contractAddress: The address of the contract * - chainId: The chain id of the contract * - * @param options - Optional configuration options: - * - retry: Whether to retry failed requests (defaults to false) - * - disabled: Whether to disable the query - * - * @returns React Query result object containing: - * - data: The version of the contract - * - isLoading: Whether the initial request is in progress - * - error: Any error that occurred - * - isError: Whether an error occurred - * - isSuccess: Whether the request was successful - * + * @param options - React Query options (except queryKey and queryFn which are managed by the hook). + * Defaults: retry: false, staleTime: 60 minutes. */ interface DetectContractVersionArgs { @@ -32,11 +22,11 @@ interface DetectContractVersionArgs { chainId: number } -export const useDetectContractVersion = (args: DetectContractVersionArgs, options?: HooksOptions) => { +export const useDetectContractVersion = (args: DetectContractVersionArgs, options?: QueryHookOptions) => { const { projectAccessKey, env } = useConfig() return useQuery({ - queryKey: [QUERY_KEYS.useDetectContractVersion, args.contractAddress, args.chainId, options], + queryKey: [QUERY_KEYS.useDetectContractVersion, args.contractAddress, args.chainId], queryFn: async () => { const res = await fetch(`${env.builderUrl}/rpc/ContractLibrary/DetectContractVersion`, { method: 'POST', @@ -46,8 +36,9 @@ export const useDetectContractVersion = (args: DetectContractVersionArgs, option const data = await res.json() return data }, - retry: options?.retry ?? false, + retry: false, staleTime: time.oneMinute * 60, - enabled: !!args.contractAddress && !!args.chainId && !options?.disabled + enabled: !!args.contractAddress && !!args.chainId, + ...options }) } diff --git a/packages/hooks/src/hooks/Combination/useGetSwapQuote.ts b/packages/hooks/src/hooks/Combination/useGetSwapQuote.ts index 1e962ffc3..dcc1a88c6 100644 --- a/packages/hooks/src/hooks/Combination/useGetSwapQuote.ts +++ b/packages/hooks/src/hooks/Combination/useGetSwapQuote.ts @@ -1,8 +1,8 @@ -import type { GetLifiSwapQuoteRequest } from '@0xsequence/api' +import type { GetLifiSwapQuoteRequest, LifiSwapQuote } from '@0xsequence/api' import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time, ZERO_ADDRESS } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { compareAddress } from '../../utils/helpers.js' import { useAPIClient } from '../API/useAPIClient.js' @@ -88,11 +88,11 @@ import { useAPIClient } from '../API/useAPIClient.js' * } * ``` */ -export const useGetSwapQuote = (getSwapQuoteArgs: GetLifiSwapQuoteRequest, options?: HooksOptions) => { +export const useGetSwapQuote = (getSwapQuoteArgs: GetLifiSwapQuoteRequest, options?: QueryHookOptions) => { const apiClient = useAPIClient() return useQuery({ - queryKey: [QUERY_KEYS.useGetSwapQuote, getSwapQuoteArgs, options], + queryKey: [QUERY_KEYS.useGetSwapQuote, getSwapQuoteArgs], queryFn: async () => { const res = await apiClient.getLifiSwapQuote({ params: { @@ -111,15 +111,15 @@ export const useGetSwapQuote = (getSwapQuoteArgs: GetLifiSwapQuoteRequest, optio currencyAddress: compareAddress(res.quote.currencyAddress, ZERO_ADDRESS) ? ZERO_ADDRESS : res.quote.currencyAddress } }, - retry: options?.retry ?? false, - staleTime: time.oneMinute * 1, + retry: false, + staleTime: time.oneMinute, enabled: - !options?.disabled && !!getSwapQuoteArgs.params.walletAddress && !!getSwapQuoteArgs.params.fromTokenAddress && !!getSwapQuoteArgs.params.toTokenAddress && getSwapQuoteArgs.params.fromTokenAmount !== '0' && !!getSwapQuoteArgs.params.chainId && - !!getSwapQuoteArgs.params.includeApprove + !!getSwapQuoteArgs.params.includeApprove, + ...options }) } diff --git a/packages/hooks/src/hooks/Combination/useGetSwapRoutes.ts b/packages/hooks/src/hooks/Combination/useGetSwapRoutes.ts index b87663eac..0f07bbe6c 100644 --- a/packages/hooks/src/hooks/Combination/useGetSwapRoutes.ts +++ b/packages/hooks/src/hooks/Combination/useGetSwapRoutes.ts @@ -2,7 +2,7 @@ import { GetLifiSwapRouteDirection, SequenceAPIClient, type LifiSwapRoute } from import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { useAPIClient } from '../API/useAPIClient.js' /** @@ -92,18 +92,17 @@ const getSwapRoutes = async (apiClient: SequenceAPIClient, args: GetSwapRoutesAr * } * ``` */ -export const useGetSwapRoutes = (args: UseGetSwapRoutesArgs, options?: HooksOptions) => { +export const useGetSwapRoutes = (args: UseGetSwapRoutesArgs, options?: QueryHookOptions) => { const apiClient = useAPIClient() - const enabled = !!args.chainId && !!args.toTokenAddress && !options?.disabled - return useQuery({ - queryKey: [QUERY_KEYS.useGetSwapRoutes, args, options], + queryKey: [QUERY_KEYS.useGetSwapRoutes, args], queryFn: () => getSwapRoutes(apiClient, args), - retry: options?.retry ?? false, + retry: false, // We must keep a long staletime to avoid the list of quotes being refreshed while the user is doing the transactions // Instead, we will invalidate the query manually staleTime: time.oneHour, - enabled + enabled: !!args.chainId && !!args.toTokenAddress, + ...options }) } diff --git a/packages/hooks/src/hooks/Indexer/useGetTransactionHistory.ts b/packages/hooks/src/hooks/Indexer/useGetTransactionHistory.ts index bebf9ce7e..c91184e55 100644 --- a/packages/hooks/src/hooks/Indexer/useGetTransactionHistory.ts +++ b/packages/hooks/src/hooks/Indexer/useGetTransactionHistory.ts @@ -3,7 +3,7 @@ import { useInfiniteQuery } from '@tanstack/react-query' import { getAddress } from 'viem' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { InfiniteQueryHookOptions } from '../../types/hooks.js' import { useIndexerClient } from './useIndexerClient.js' @@ -128,11 +128,14 @@ const getTransactionHistory = async ( * } * ``` */ -export const useGetTransactionHistory = (args: UseGetTransactionHistoryArgs, options?: HooksOptions) => { +export const useGetTransactionHistory = ( + args: UseGetTransactionHistoryArgs, + options?: InfiniteQueryHookOptions>, Error, Page> +) => { const indexerClient = useIndexerClient(args.chainId) return useInfiniteQuery({ - queryKey: [QUERY_KEYS.useGetTransactionHistory, args, options], + queryKey: [QUERY_KEYS.useGetTransactionHistory, args], queryFn: ({ pageParam }) => { return getTransactionHistory(indexerClient, { ...args, @@ -143,8 +146,9 @@ export const useGetTransactionHistory = (args: UseGetTransactionHistoryArgs, opt return page?.more ? page : undefined }, initialPageParam: { ...args?.page } as Page, - retry: options?.retry ?? false, + retry: false, staleTime: time.oneSecond * 30, - enabled: !!args.chainId && args.accountAddresses.length > 0 && !options?.disabled + enabled: !!args.chainId && args.accountAddresses.length > 0, + ...options }) } diff --git a/packages/hooks/src/hooks/Indexer/useGetTransactionHistorySummary.ts b/packages/hooks/src/hooks/Indexer/useGetTransactionHistorySummary.ts index 0eedf5e55..539df0001 100644 --- a/packages/hooks/src/hooks/Indexer/useGetTransactionHistorySummary.ts +++ b/packages/hooks/src/hooks/Indexer/useGetTransactionHistorySummary.ts @@ -3,7 +3,7 @@ import { useQuery } from '@tanstack/react-query' import { getAddress } from 'viem' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { useIndexerClients } from './useIndexerClient.js' @@ -116,21 +116,19 @@ const getTransactionHistorySummary = async ( */ export const useGetTransactionHistorySummary = ( getTransactionHistorySummaryArgs: GetTransactionHistorySummaryArgs, - options?: HooksOptions + options?: QueryHookOptions ) => { const indexerClients = useIndexerClients(getTransactionHistorySummaryArgs.chainIds) return useQuery({ - queryKey: [QUERY_KEYS.useGetTransactionHistorySummary, getTransactionHistorySummaryArgs, options], + queryKey: [QUERY_KEYS.useGetTransactionHistorySummary, getTransactionHistorySummaryArgs], queryFn: async () => { return await getTransactionHistorySummary(indexerClients, getTransactionHistorySummaryArgs) }, - retry: options?.retry ?? false, + retry: false, staleTime: time.oneSecond * 30, refetchOnMount: true, - enabled: - getTransactionHistorySummaryArgs.chainIds.length > 0 && - getTransactionHistorySummaryArgs.accountAddresses.length > 0 && - !options?.disabled + enabled: getTransactionHistorySummaryArgs.chainIds.length > 0 && getTransactionHistorySummaryArgs.accountAddresses.length > 0, + ...options }) } diff --git a/packages/hooks/src/hooks/IndexerGateway/useGetNativeTokenBalance.ts b/packages/hooks/src/hooks/IndexerGateway/useGetNativeTokenBalance.ts index 4b77cc3bd..2586df92c 100644 --- a/packages/hooks/src/hooks/IndexerGateway/useGetNativeTokenBalance.ts +++ b/packages/hooks/src/hooks/IndexerGateway/useGetNativeTokenBalance.ts @@ -2,7 +2,7 @@ import { SequenceIndexerGateway, type IndexerGateway, type TokenBalance } from ' import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { createNativeTokenBalance } from '../../utils/helpers.js' import { useIndexerGatewayClient } from './useIndexerGatewayClient.js' @@ -53,14 +53,15 @@ const getNativeTokenBalance = async ( * } * ``` */ -export const useGetNativeTokenBalance = (args: GetNativeTokenBalanceArgs, options?: HooksOptions) => { +export const useGetNativeTokenBalance = (args: GetNativeTokenBalanceArgs, options?: QueryHookOptions) => { const indexerGatewayClient = useIndexerGatewayClient() return useQuery({ - queryKey: [QUERY_KEYS.useGetNativeTokenBalance, args, options], + queryKey: [QUERY_KEYS.useGetNativeTokenBalance, args], queryFn: async () => await getNativeTokenBalance(indexerGatewayClient, args), - retry: options?.retry ?? false, + retry: false, staleTime: time.oneSecond * 30, - enabled: !!args.accountAddress && !options?.disabled + enabled: !!args.accountAddress, + ...options }) } diff --git a/packages/hooks/src/hooks/IndexerGateway/useGetSingleTokenBalance.ts b/packages/hooks/src/hooks/IndexerGateway/useGetSingleTokenBalance.ts index 485931374..ed695f456 100644 --- a/packages/hooks/src/hooks/IndexerGateway/useGetSingleTokenBalance.ts +++ b/packages/hooks/src/hooks/IndexerGateway/useGetSingleTokenBalance.ts @@ -1,8 +1,8 @@ -import { ContractVerificationStatus, type SequenceIndexerGateway } from '@0xsequence/indexer' +import { ContractVerificationStatus, type SequenceIndexerGateway, type TokenBalance } from '@0xsequence/indexer' import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time, ZERO_ADDRESS } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { compareAddress, createNativeTokenBalance } from '../../utils/helpers.js' import { useIndexerGatewayClient } from './useIndexerGatewayClient.js' @@ -77,11 +77,11 @@ const getSingleTokenBalance = async (args: GetSingleTokenBalanceArgs, indexerGat * } * ``` */ -export const useGetSingleTokenBalance = (args: GetSingleTokenBalanceArgs, options?: HooksOptions) => { +export const useGetSingleTokenBalance = (args: GetSingleTokenBalanceArgs, options?: QueryHookOptions) => { const indexerGatewayClient = useIndexerGatewayClient() return useQuery({ - queryKey: [QUERY_KEYS.useGetSingleTokenBalance, args, options], + queryKey: [QUERY_KEYS.useGetSingleTokenBalance, args], queryFn: async () => { const tokenBalance = await getSingleTokenBalance(args, indexerGatewayClient) @@ -93,8 +93,9 @@ export const useGetSingleTokenBalance = (args: GetSingleTokenBalanceArgs, option return tokenBalance }, - retry: options?.retry ?? false, + retry: false, staleTime: time.oneSecond * 30, - enabled: !!args.chainId && !!args.accountAddress && !options?.disabled + enabled: !!args.chainId && !!args.accountAddress, + ...options }) } diff --git a/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesByContract.ts b/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesByContract.ts index dc0d90b2b..0bfe44502 100644 --- a/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesByContract.ts +++ b/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesByContract.ts @@ -2,7 +2,7 @@ import { SequenceIndexerGateway, type IndexerGateway, type Page } from '@0xseque import { useInfiniteQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { InfiniteQueryHookOptions } from '../../types/hooks.js' import { useIndexerGatewayClient } from './useIndexerGatewayClient.js' @@ -71,11 +71,14 @@ const getTokenBalancesByContract = async (indexerGatewayClient: SequenceIndexerG * } * ``` */ -export const useGetTokenBalancesByContract = (args: GetTokenBalancesByContractArgs, options?: HooksOptions) => { +export const useGetTokenBalancesByContract = ( + args: GetTokenBalancesByContractArgs, + options?: InfiniteQueryHookOptions>, Error, Page> +) => { const indexerGatewayClient = useIndexerGatewayClient() return useInfiniteQuery({ - queryKey: [QUERY_KEYS.useGetTokenBalancesByContract, args, options], + queryKey: [QUERY_KEYS.useGetTokenBalancesByContract, args], queryFn: ({ pageParam }) => { return getTokenBalancesByContract(indexerGatewayClient, { ...args, page: pageParam }) }, @@ -83,8 +86,9 @@ export const useGetTokenBalancesByContract = (args: GetTokenBalancesByContractAr return page?.more ? page : undefined }, initialPageParam: { ...args?.page } as Page, - retry: options?.retry ?? false, + retry: false, staleTime: time.oneSecond * 30, - enabled: args.filter.contractAddresses.length > 0 && !options?.disabled + enabled: args.filter.contractAddresses.length > 0, + ...options }) } diff --git a/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesDetails.ts b/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesDetails.ts index 1e62dd918..8234605e3 100644 --- a/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesDetails.ts +++ b/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesDetails.ts @@ -2,7 +2,7 @@ import { SequenceIndexerGateway, type IndexerGateway, type Page, type TokenBalan import { useInfiniteQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { InfiniteQueryHookOptions } from '../../types/hooks.js' import { createNativeTokenBalance, sortBalancesByType } from '../../utils/helpers.js' import { useIndexerGatewayClient } from './useIndexerGatewayClient.js' @@ -128,11 +128,14 @@ const getTokenBalancesDetails = async (indexerGatewayClient: SequenceIndexerGate * } * ``` */ -export const useGetTokenBalancesDetails = (args: GetTokenBalancesDetailsArgs, options?: HooksOptions) => { +export const useGetTokenBalancesDetails = ( + args: GetTokenBalancesDetailsArgs, + options?: InfiniteQueryHookOptions>, Error, Page> +) => { const indexerGatewayClient = useIndexerGatewayClient() return useInfiniteQuery({ - queryKey: [QUERY_KEYS.useGetTokenBalancesDetails, args, options], + queryKey: [QUERY_KEYS.useGetTokenBalancesDetails, args], queryFn: ({ pageParam }) => { return getTokenBalancesDetails(indexerGatewayClient, { ...args, page: pageParam }) }, @@ -140,8 +143,9 @@ export const useGetTokenBalancesDetails = (args: GetTokenBalancesDetailsArgs, op return page?.more ? page : undefined }, initialPageParam: { ...args?.page } as Page, - retry: options?.retry ?? true, + retry: true, staleTime: time.oneSecond * 30, - enabled: args.filter.accountAddresses.length > 0 && !options?.disabled + enabled: args.filter.accountAddresses.length > 0, + ...options }) } diff --git a/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesSummary.ts b/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesSummary.ts index b7cbd3373..5868a7e68 100644 --- a/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesSummary.ts +++ b/packages/hooks/src/hooks/IndexerGateway/useGetTokenBalancesSummary.ts @@ -2,7 +2,7 @@ import { SequenceIndexerGateway, type IndexerGateway, type Page, type TokenBalan import { useInfiniteQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { InfiniteQueryHookOptions } from '../../types/hooks.js' import { createNativeTokenBalance, sortBalancesByType } from '../../utils/helpers.js' import { useIndexerGatewayClient } from './useIndexerGatewayClient.js' @@ -103,11 +103,14 @@ const getTokenBalancesSummary = async (indexerGatewayClient: SequenceIndexerGate * } * ``` */ -export const useGetTokenBalancesSummary = (args: GetTokenBalancesSummaryArgs, options?: HooksOptions) => { +export const useGetTokenBalancesSummary = ( + args: GetTokenBalancesSummaryArgs, + options?: InfiniteQueryHookOptions>, Error, Page> +) => { const indexerGatewayClient = useIndexerGatewayClient() return useInfiniteQuery({ - queryKey: [QUERY_KEYS.useGetTokenBalancesSummary, args, options], + queryKey: [QUERY_KEYS.useGetTokenBalancesSummary, args], queryFn: ({ pageParam }) => { return getTokenBalancesSummary(indexerGatewayClient, { ...args, page: pageParam }) }, @@ -115,8 +118,9 @@ export const useGetTokenBalancesSummary = (args: GetTokenBalancesSummaryArgs, op return page?.more ? page : undefined }, initialPageParam: { ...args?.page } as Page, - retry: options?.retry ?? true, + retry: true, staleTime: time.oneSecond * 30, - enabled: args.filter.accountAddresses.length > 0 && !options?.disabled + enabled: args.filter.accountAddresses.length > 0, + ...options }) } diff --git a/packages/hooks/src/hooks/Metadata/useGetContractInfo.ts b/packages/hooks/src/hooks/Metadata/useGetContractInfo.ts index cb9b1cad9..a0b148a96 100644 --- a/packages/hooks/src/hooks/Metadata/useGetContractInfo.ts +++ b/packages/hooks/src/hooks/Metadata/useGetContractInfo.ts @@ -1,8 +1,8 @@ import type { ContractInfo, GetContractInfoArgs } from '@0xsequence/metadata' -import { useQuery, type UseQueryResult } from '@tanstack/react-query' +import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time, ZERO_ADDRESS } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { compareAddress } from '../../utils/helpers.js' import { findSupportedNetwork } from '../../utils/networks.js' @@ -71,11 +71,11 @@ import { useMetadataClient } from './useMetadataClient.js' * } * ``` */ -export const useGetContractInfo = (args: GetContractInfoArgs, options?: HooksOptions): UseQueryResult => { +export const useGetContractInfo = (args: GetContractInfoArgs, options?: QueryHookOptions) => { const metadataClient = useMetadataClient() return useQuery({ - queryKey: [QUERY_KEYS.useGetContractInfo, args, options], + queryKey: [QUERY_KEYS.useGetContractInfo, args], queryFn: async () => { const isNativeToken = compareAddress(ZERO_ADDRESS, args.contractAddress) @@ -92,8 +92,9 @@ export const useGetContractInfo = (args: GetContractInfoArgs, options?: HooksOpt : {}) } }, - retry: options?.retry ?? false, + retry: false, staleTime: time.oneMinute * 10, - enabled: !!args.chainID && !!args.contractAddress && !options?.disabled + enabled: !!args.chainID && !!args.contractAddress, + ...options }) } diff --git a/packages/hooks/src/hooks/Metadata/useGetMultipleContractsInfo.ts b/packages/hooks/src/hooks/Metadata/useGetMultipleContractsInfo.ts index af84c7678..bc5ccd33e 100644 --- a/packages/hooks/src/hooks/Metadata/useGetMultipleContractsInfo.ts +++ b/packages/hooks/src/hooks/Metadata/useGetMultipleContractsInfo.ts @@ -2,7 +2,7 @@ import { SequenceMetadata, type ContractInfo, type GetContractInfoArgs } from '@ import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { useMetadataClient } from './useMetadataClient.js' @@ -110,14 +110,14 @@ const getMultipleContractsInfo = async ( * } * ``` */ -export const useGetMultipleContractsInfo = (args: GetContractInfoArgs[], options?: HooksOptions) => { +export const useGetMultipleContractsInfo = (args: GetContractInfoArgs[], options?: QueryHookOptions) => { const metadataClient = useMetadataClient() return useQuery({ - queryKey: [QUERY_KEYS.useGetMultipleContractInfo, args, options], + queryKey: [QUERY_KEYS.useGetMultipleContractInfo, args], queryFn: async () => await getMultipleContractsInfo(metadataClient, args), - retry: options?.retry ?? false, + retry: false, staleTime: time.oneHour, - enabled: !options?.disabled + ...options }) } diff --git a/packages/hooks/src/hooks/Metadata/useGetTokenMetadata.ts b/packages/hooks/src/hooks/Metadata/useGetTokenMetadata.ts index 3309d6975..30bc398d7 100644 --- a/packages/hooks/src/hooks/Metadata/useGetTokenMetadata.ts +++ b/packages/hooks/src/hooks/Metadata/useGetTokenMetadata.ts @@ -1,8 +1,8 @@ -import { SequenceMetadata, type GetTokenMetadataArgs } from '@0xsequence/metadata' +import { SequenceMetadata, type GetTokenMetadataArgs, type TokenMetadata } from '@0xsequence/metadata' import { useQuery } from '@tanstack/react-query' import { QUERY_KEYS, time } from '../../constants.js' -import type { HooksOptions } from '../../types/hooks.js' +import type { QueryHookOptions } from '../../types/hooks.js' import { splitEvery } from '../../utils/helpers.js' import { useConfig } from '../useConfig.js' @@ -120,15 +120,16 @@ const getTokenMetadata = async (metadataClient: SequenceMetadata, args: GetToken * } * ``` */ -export const useGetTokenMetadata = (args: GetTokenMetadataArgs, options?: HooksOptions) => { +export const useGetTokenMetadata = (args: GetTokenMetadataArgs, options?: QueryHookOptions) => { const { env } = useConfig() const metadataClient = useMetadataClient() return useQuery({ - queryKey: [QUERY_KEYS.useGetTokenMetadata, args, options], + queryKey: [QUERY_KEYS.useGetTokenMetadata, args], queryFn: () => getTokenMetadata(metadataClient, args, env.imageProxyUrl), - retry: options?.retry ?? false, + retry: false, staleTime: time.oneHour, - enabled: !!args.chainID && !!args.contractAddress && !options?.disabled + enabled: !!args.chainID && !!args.contractAddress, + ...options }) } diff --git a/packages/hooks/src/types/hooks.ts b/packages/hooks/src/types/hooks.ts index cdc341bcc..63de2c2b0 100644 --- a/packages/hooks/src/types/hooks.ts +++ b/packages/hooks/src/types/hooks.ts @@ -1,4 +1,9 @@ -export interface HooksOptions { - disabled?: boolean - retry?: boolean | number -} +import type { InfiniteData, QueryKey, UseInfiniteQueryOptions, UseQueryOptions } from '@tanstack/react-query' + +export type QueryHookOptions = Partial< + UseQueryOptions +> + +export type InfiniteQueryHookOptions = Partial< + UseInfiniteQueryOptions, QueryKey, TPageParam> +>