From 6a9f7b75b1d1c60106a2aa6c723fe1663e827a6a Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Wed, 25 Mar 2026 17:26:31 -0400 Subject: [PATCH 1/2] feat(hooks): expose full React Query options for all hooks Replace custom HooksOptions interface (disabled, retry only) with full UseQueryOptions and UseInfiniteQueryOptions types. Hook defaults are set first and can be fully overridden via the options spread. Update checkout package consumers from disabled to enabled. Co-Authored-By: Claude Opus 4.6 --- .../src/hooks/useCheckoutUI/index.tsx | 2 +- .../hooks/useCheckoutUI/useCryptoPayment.tsx | 2 +- .../OrderSummary/index.tsx | 2 +- .../PayWithCrypto/index.tsx | 4 +- .../PayWithCrypto/useInitialBalanceCheck.tsx | 4 +- packages/checkout/src/views/Swap/index.tsx | 2 +- .../src/views/TransactionStatus/index.tsx | 6 +-- packages/hooks/CHANGELOG.md | 6 --- packages/hooks/package.json | 2 +- .../hooks/src/hooks/API/useGetCoinPrices.ts | 33 ++++---------- .../src/hooks/API/useGetCollectiblePrices.ts | 44 +++++-------------- .../hooks/src/hooks/API/useGetExchangeRate.ts | 35 ++++----------- .../hooks/Builder/useDetectContractVersion.ts | 27 ++++-------- .../src/hooks/Combination/useGetSwapQuote.ts | 16 +++---- .../src/hooks/Combination/useGetSwapRoutes.ts | 13 +++--- .../hooks/Indexer/useGetTransactionHistory.ts | 14 +++--- .../useGetTransactionHistorySummary.ts | 14 +++--- .../useGetNativeTokenBalance.ts | 11 ++--- .../useGetSingleTokenBalance.ts | 13 +++--- .../useGetTokenBalancesByContract.ts | 14 +++--- .../useGetTokenBalancesDetails.ts | 14 +++--- .../useGetTokenBalancesSummary.ts | 14 +++--- .../src/hooks/Metadata/useGetContractInfo.ts | 13 +++--- .../Metadata/useGetMultipleContractsInfo.ts | 10 ++--- .../src/hooks/Metadata/useGetTokenMetadata.ts | 13 +++--- packages/hooks/src/index.ts | 3 ++ packages/hooks/src/types/hooks.ts | 13 ++++-- 27 files changed, 149 insertions(+), 195 deletions(-) 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/index.ts b/packages/hooks/src/index.ts index 855e5afba..7e657d933 100644 --- a/packages/hooks/src/index.ts +++ b/packages/hooks/src/index.ts @@ -1,3 +1,6 @@ +// Types +export type { InfiniteQueryHookOptions, QueryHookOptions } from './types/hooks.js' + // Constants export { DEFAULT_SLIPPAGE_BPS, QUERY_KEYS } from './constants.js' 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> +> From 3d786de499b376329fd1f97e583470d244667454 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Wed, 25 Mar 2026 17:33:03 -0400 Subject: [PATCH 2/2] refactor(hooks): remove custom type exports from index The internal QueryHookOptions/InfiniteQueryHookOptions types are just Partial wrappers around React Query types. Consumers can use the standard React Query types directly, so no need to export ours. Co-Authored-By: Claude Opus 4.6 --- packages/hooks/src/index.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/hooks/src/index.ts b/packages/hooks/src/index.ts index 7e657d933..855e5afba 100644 --- a/packages/hooks/src/index.ts +++ b/packages/hooks/src/index.ts @@ -1,6 +1,3 @@ -// Types -export type { InfiniteQueryHookOptions, QueryHookOptions } from './types/hooks.js' - // Constants export { DEFAULT_SLIPPAGE_BPS, QUERY_KEYS } from './constants.js'