Skip to content

Commit

Permalink
fix react-query cache
Browse files Browse the repository at this point in the history
  • Loading branch information
Zetazzz committed Feb 7, 2025
1 parent 0649f73 commit 0f3f2a5
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 28 deletions.
49 changes: 35 additions & 14 deletions packages/telescope/src/helpers/react-query-hooks-icjs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,15 @@ export const useRpcClient = <TData = ProtobufRpcClient>({
}, options);
};
const getRpcClientFromCache = (
queryClient: ReturnType<typeof useQueryClient>,
key: string,
rpcEndpoint?: string | HttpEndpoint
): Rpc | undefined => {
const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key];
return queryClient.getQueryData<Rpc>(queryKey);
};
export interface UseQueryBuilderOptions<TReq, TRes> {
builderQueryFn: (clientResolver?: RpcResolver) => (request: TReq) => Promise<TRes>,
queryKeyPrefix: string,
Expand All @@ -132,16 +141,17 @@ export function buildUseQuery<TReq, TRes>(opts: UseQueryBuilderOptions<TReq, TRe
if(isRpc(clientResolver)) {
rpcResolver = clientResolver;
} else if(isCacheResolver(clientResolver)) {
const key = clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY;
const queryKey = clientResolver.rpcEndpoint ? [key, clientResolver.rpcEndpoint] : [key];
rpcResolver = queryClient.getQueryData<Rpc>(queryKey);
if(!rpcResolver && clientResolver.rpcEndpoint) {
rpcResolver = clientResolver.rpcEndpoint;
}
} else {
rpcResolver = clientResolver;
const key = isCacheResolver(clientResolver)
? clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY
: DEFAULT_RPC_CLIENT_QUERY_KEY;
const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined;
const cachedClient = getRpcClientFromCache(queryClient, key, endpoint);
// For CacheResolver with endpoint, use endpoint as fallback if no cached client
rpcResolver = cachedClient ||
(isCacheResolver(clientResolver) && clientResolver.rpcEndpoint ? clientResolver.rpcEndpoint :
(!isCacheResolver(clientResolver) ? clientResolver : undefined));
}
const queryFn = opts.builderQueryFn(rpcResolver);
Expand Down Expand Up @@ -170,6 +180,14 @@ export interface UseMutationBuilderOptions<TMsg> {
) => Promise<DeliverTxResponse>,
}
const getSigningClientFromCache = (
queryClient: ReturnType<typeof useQueryClient>,
key: string,
rpcEndpoint?: string | HttpEndpoint
): ISigningClient | undefined => {
const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key];
return queryClient.getQueryData<ISigningClient>(queryKey);
};
export function buildUseMutation<TMsg, TError>(opts: UseMutationBuilderOptions<TMsg>) {
return ({
Expand All @@ -184,12 +202,15 @@ export function buildUseMutation<TMsg, TError>(opts: UseMutationBuilderOptions<T
if(isISigningClient(clientResolver)) {
signingClientResolver = clientResolver;
} else if(isCacheResolver(clientResolver)) {
const key = clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY;
const queryKey = clientResolver.rpcEndpoint ? [key, clientResolver.rpcEndpoint] : [key];
signingClientResolver = queryClient.getQueryData<ISigningClient>(queryKey);
} else {
clientResolver = clientResolver;
// For both CacheResolver and other cases, try to get from cache first
const key = isCacheResolver(clientResolver)
? clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY
: DEFAULT_SIGNING_CLIENT_QUERY_KEY;
const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined;
const cachedClient = getSigningClientFromCache(queryClient, key, endpoint);
signingClientResolver = cachedClient || (!isCacheResolver(clientResolver) ? clientResolver : undefined);
}
const mutationFn = opts.builderMutationFn(signingClientResolver);
Expand Down
48 changes: 34 additions & 14 deletions packages/telescope/src/helpers/react-query-hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,14 @@ export interface UseQueryBuilderOptions<TReq, TRes> {
queryKeyPrefix: string,
}
const getRpcClientFromCache = (
queryClient: ReturnType<typeof useQueryClient>,
key: string,
rpcEndpoint?: string | HttpEndpoint
): Rpc | undefined => {
const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key];
return queryClient.getQueryData<Rpc>(queryKey);
};
export function buildUseQuery<TReq, TRes>(opts: UseQueryBuilderOptions<TReq, TRes>) {
return <TData = TRes>({
Expand All @@ -174,16 +182,17 @@ export function buildUseQuery<TReq, TRes>(opts: UseQueryBuilderOptions<TReq, TRe
if(isRpc(clientResolver)) {
rpcResolver = clientResolver;
} else if(isCacheResolver(clientResolver)) {
const key = clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY;
const queryKey = clientResolver.rpcEndpoint ? [key, clientResolver.rpcEndpoint] : [key];
rpcResolver = queryClient.getQueryData<Rpc>(queryKey);
if(!rpcResolver && clientResolver.rpcEndpoint) {
rpcResolver = clientResolver.rpcEndpoint;
}
} else {
rpcResolver = clientResolver;
const key = isCacheResolver(clientResolver)
? clientResolver.clientQueryKey || DEFAULT_RPC_CLIENT_QUERY_KEY
: DEFAULT_RPC_CLIENT_QUERY_KEY;
const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined;
const cachedClient = getRpcClientFromCache(queryClient, key, endpoint);
// For CacheResolver with endpoint, use endpoint as fallback if no cached client
rpcResolver = cachedClient ||
(isCacheResolver(clientResolver) && clientResolver.rpcEndpoint ? clientResolver.rpcEndpoint :
(!isCacheResolver(clientResolver) ? clientResolver : undefined));
}
const queryFn = opts.builderQueryFn(rpcResolver);
Expand Down Expand Up @@ -212,6 +221,14 @@ export interface UseMutationBuilderOptions<TMsg> {
) => Promise<DeliverTxResponse>,
}
const getSigningClientFromCache = (
queryClient: ReturnType<typeof useQueryClient>,
key: string,
rpcEndpoint?: string | HttpEndpoint
): ISigningClient | undefined => {
const queryKey = rpcEndpoint ? [key, rpcEndpoint] : [key];
return queryClient.getQueryData<ISigningClient>(queryKey);
};
export function buildUseMutation<TMsg, TError>(opts: UseMutationBuilderOptions<TMsg>) {
return ({
Expand All @@ -226,12 +243,15 @@ export function buildUseMutation<TMsg, TError>(opts: UseMutationBuilderOptions<T
if(isISigningClient(clientResolver)) {
signingClientResolver = clientResolver;
} else if(isCacheResolver(clientResolver)) {
const key = clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY;
const queryKey = clientResolver.rpcEndpoint ? [key, clientResolver.rpcEndpoint] : [key];
signingClientResolver = queryClient.getQueryData<ISigningClient>(queryKey);
} else {
clientResolver = clientResolver;
// For both CacheResolver and other cases, try to get from cache first
const key = isCacheResolver(clientResolver)
? clientResolver.clientQueryKey || DEFAULT_SIGNING_CLIENT_QUERY_KEY
: DEFAULT_SIGNING_CLIENT_QUERY_KEY;
const endpoint = isCacheResolver(clientResolver) ? clientResolver.rpcEndpoint : undefined;
const cachedClient = getSigningClientFromCache(queryClient, key, endpoint);
signingClientResolver = cachedClient || (!isCacheResolver(clientResolver) ? clientResolver : undefined);
}
const mutationFn = opts.builderMutationFn(signingClientResolver);
Expand Down

0 comments on commit 0f3f2a5

Please sign in to comment.