@mysten/dapp-kit
Version:
A collection of React hooks and components for interacting with the Sui blockchain and wallets.
69 lines (61 loc) • 1.83 kB
text/typescript
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0
import type { UseQueryResult } from '@tanstack/react-query';
import { useQueries } from '@tanstack/react-query';
import { useSuiClientContext } from './useSuiClient.js';
import type { SuiRpcMethods, UseSuiClientQueryOptions } from './useSuiClientQuery.js';
type SuiClientQueryOptions = SuiRpcMethods[keyof SuiRpcMethods] extends infer Method
? Method extends {
name: infer M extends keyof SuiRpcMethods;
params?: infer P;
}
? undefined extends P
? {
method: M;
params?: P;
options?: UseSuiClientQueryOptions<M, unknown>;
}
: {
method: M;
params: P;
options?: UseSuiClientQueryOptions<M, unknown>;
}
: never
: never;
export type UseSuiClientQueriesResults<Args extends readonly SuiClientQueryOptions[]> = {
-readonly [K in keyof Args]: Args[K] extends {
method: infer M extends keyof SuiRpcMethods;
readonly options?:
| {
select?: (...args: any[]) => infer R;
}
| object;
}
? UseQueryResult<unknown extends R ? SuiRpcMethods[M]['result'] : R>
: never;
};
export function useSuiClientQueries<
const Queries extends readonly SuiClientQueryOptions[],
Results = UseSuiClientQueriesResults<Queries>,
>({
queries,
combine,
}: {
queries: Queries;
combine?: (results: UseSuiClientQueriesResults<Queries>) => Results;
}): Results {
const suiContext = useSuiClientContext();
return useQueries({
combine: combine as never,
queries: queries.map((query) => {
const { method, params, options: { queryKey = [], ...restOptions } = {} } = query;
return {
...restOptions,
queryKey: [suiContext.network, method, params, ...queryKey],
queryFn: async () => {
return await suiContext.client[method](params as never);
},
};
}) as [],
});
}