UNPKG

@mysten/dapp-kit

Version:

A collection of React hooks and components for interacting with the Sui blockchain and wallets.

78 lines (69 loc) 2.05 kB
// Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 import type { SuiClient } from '@mysten/sui/client'; import type { InfiniteData, UseInfiniteQueryOptions, UseInfiniteQueryResult, } from '@tanstack/react-query'; import { useInfiniteQuery } from '@tanstack/react-query'; import type { PartialBy } from '../types/utilityTypes.js'; import { useSuiClientContext } from './useSuiClient.js'; interface PaginatedResult { data?: unknown; nextCursor?: unknown; hasNextPage: boolean; } export type SuiRpcPaginatedMethodName = { [K in keyof SuiClient]: SuiClient[K] extends (input: any) => Promise<PaginatedResult> ? K : never; }[keyof SuiClient]; export type SuiRpcPaginatedMethods = { [K in SuiRpcPaginatedMethodName]: SuiClient[K] extends ( input: infer Params, ) => Promise< infer Result extends { hasNextPage?: boolean | null; nextCursor?: infer Cursor | null } > ? { name: K; result: Result; params: Params; cursor: Cursor; } : never; }; export type UseSuiClientInfiniteQueryOptions< T extends keyof SuiRpcPaginatedMethods, TData, > = PartialBy< Omit< UseInfiniteQueryOptions<SuiRpcPaginatedMethods[T]['result'], Error, TData, unknown[]>, 'queryFn' | 'initialPageParam' | 'getNextPageParam' >, 'queryKey' >; export function useSuiClientInfiniteQuery< T extends keyof SuiRpcPaginatedMethods, TData = InfiniteData<SuiRpcPaginatedMethods[T]['result']>, >( method: T, params: SuiRpcPaginatedMethods[T]['params'], { queryKey = [], enabled = !!params, ...options }: UseSuiClientInfiniteQueryOptions<T, TData> = {}, ): UseInfiniteQueryResult<TData, Error> { const suiContext = useSuiClientContext(); return useInfiniteQuery({ ...options, initialPageParam: null, queryKey: [suiContext.network, method, params, ...queryKey], enabled, queryFn: ({ pageParam }) => suiContext.client[method]({ ...(params ?? {}), cursor: pageParam, } as never), getNextPageParam: (lastPage) => (lastPage.hasNextPage ? (lastPage.nextCursor ?? null) : null), }); }